Positional Encoding-Transformer

news/2024/12/24 3:16:23 标签: transformer, pytorch, 深度学习, python, 矩阵, 线性代数

文章目录

  • 1. 创建一个位置编码类
  • 2. Python代码

1. 创建一个位置编码类

P E ( p o s , 2 i ) = sin ⁡ ( p o s / 1000 0 2 i / d m o d e l ) \begin{equation} PE_{(pos,2i)}=\sin(pos/10000^{2i/d_{model}}) \end{equation} PE(pos,2i)=sin(pos/100002i/dmodel)
P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s / 1000 0 2 i / d m o d e l ) \begin{equation} PE_{(pos,2i+1)}=\cos(pos/10000^{2i/d_{model}}) \end{equation} PE(pos,2i+1)=cos(pos/100002i/dmodel)

2. Python代码

python">#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @FileName  :PositionEmbedding.py
# @Time      :2024/12/22 12:05
# @Author    :Jason Zhang
import torch
from torch import nn
import torch.nn.functional as F

torch.set_printoptions(precision=3, sci_mode=False)


# PE(pos,2i) = sin(pos/10000**(2i/d_model))
# PE(pos,2i+1) = sin(pos/10000**(2i/d_model))

class PositionEmbedding(object):
    def __init__(self, max_pos: int = 7, power_x: int = 10000, d_model: int = 8):
        self.max_pos = max_pos
        self.d_model = d_model
        self.power_x = power_x
        # self._result = torch.zeros((self.max_pos, self.d_model))
        self._result = nn.Embedding(self.max_pos, self.d_model)

    @property
    def result(self):
        # step1: pos/10000^i/dmodel
        pos_arrange = torch.arange(self.max_pos).reshape((-1, 1)).to(torch.float32)
        pos_ones = torch.ones(self.max_pos).reshape((-1, 1)).to(torch.float32)
        dim_arrange = torch.arange(self.d_model).reshape((1, -1)).to(torch.float32)
        dim_ones = torch.ones(self.d_model).reshape((1, -1)).to(torch.float32)
        pos_mat = pos_arrange @ dim_ones
        dim_mat = pos_ones @ dim_arrange
        dim_mat = torch.pow(self.power_x, dim_mat / self.d_model)
        print(f"pos_mat=\n{pos_mat}")
        print(f"dim_mat=\n{dim_mat}")
        pos_dim_mat = pos_mat / dim_mat
        print(f"pos_dim_mat=\n{pos_dim_mat}")
        even_mat = torch.eye(self.d_model)
        even_mat[:, 1::2] = 0
        even_pos_dim = pos_dim_mat @ even_mat
        even_pos_dim = torch.sin(even_pos_dim)
        print(f"even_pos_dim=\n{even_pos_dim}")

        odd_mat = torch.eye(self.d_model)
        odd_mat[:, 0::2] = 0
        odd_pos_dim = pos_dim_mat @ odd_mat
        cos_ones = torch.ones_like(odd_pos_dim)
        cos_ones[:, 1::2] = 0
        print(f"cos_ones=\n{cos_ones}")
        odd_pos_dim = torch.cos(odd_pos_dim) - cos_ones
        print(f"odd_pos_dim=\n{odd_pos_dim}")
        #  print(f"even_mat=\n{even_mat}")
        #  print(f"odd_mat=\n{odd_mat}")
        my_result = even_pos_dim + odd_pos_dim
        print(f"my_result=\n{my_result}")
        self._result.weight = nn.Parameter(my_result, requires_grad=False)
        print(f"self._result.weight=\n{self._result.weight}")
        return self._result


if __name__ == "__main__":
    run_code = 0
    test_position = PositionEmbedding()
    test_position_result = test_position.result
    print(f"test_position_result=\n{test_position_result}")
  • 结果:
python">pos_mat=
tensor([[0., 0., 0., 0., 0., 0., 0., 0.],
        [1., 1., 1., 1., 1., 1., 1., 1.],
        [2., 2., 2., 2., 2., 2., 2., 2.],
        [3., 3., 3., 3., 3., 3., 3., 3.],
        [4., 4., 4., 4., 4., 4., 4., 4.],
        [5., 5., 5., 5., 5., 5., 5., 5.],
        [6., 6., 6., 6., 6., 6., 6., 6.]])
dim_mat=
tensor([[    1.000,     3.162,    10.000,    31.623,   100.000,   316.228,
          1000.000,  3162.278],
        [    1.000,     3.162,    10.000,    31.623,   100.000,   316.228,
          1000.000,  3162.278],
        [    1.000,     3.162,    10.000,    31.623,   100.000,   316.228,
          1000.000,  3162.278],
        [    1.000,     3.162,    10.000,    31.623,   100.000,   316.228,
          1000.000,  3162.278],
        [    1.000,     3.162,    10.000,    31.623,   100.000,   316.228,
          1000.000,  3162.278],
        [    1.000,     3.162,    10.000,    31.623,   100.000,   316.228,
          1000.000,  3162.278],
        [    1.000,     3.162,    10.000,    31.623,   100.000,   316.228,
          1000.000,  3162.278]])
pos_dim_mat=
tensor([[    0.000,     0.000,     0.000,     0.000,     0.000,     0.000,
             0.000,     0.000],
        [    1.000,     0.316,     0.100,     0.032,     0.010,     0.003,
             0.001,     0.000],
        [    2.000,     0.632,     0.200,     0.063,     0.020,     0.006,
             0.002,     0.001],
        [    3.000,     0.949,     0.300,     0.095,     0.030,     0.009,
             0.003,     0.001],
        [    4.000,     1.265,     0.400,     0.126,     0.040,     0.013,
             0.004,     0.001],
        [    5.000,     1.581,     0.500,     0.158,     0.050,     0.016,
             0.005,     0.002],
        [    6.000,     1.897,     0.600,     0.190,     0.060,     0.019,
             0.006,     0.002]])
even_pos_dim=
tensor([[ 0.000,  0.000,  0.000,  0.000,  0.000,  0.000,  0.000,  0.000],
        [ 0.841,  0.000,  0.100,  0.000,  0.010,  0.000,  0.001,  0.000],
        [ 0.909,  0.000,  0.199,  0.000,  0.020,  0.000,  0.002,  0.000],
        [ 0.141,  0.000,  0.296,  0.000,  0.030,  0.000,  0.003,  0.000],
        [-0.757,  0.000,  0.389,  0.000,  0.040,  0.000,  0.004,  0.000],
        [-0.959,  0.000,  0.479,  0.000,  0.050,  0.000,  0.005,  0.000],
        [-0.279,  0.000,  0.565,  0.000,  0.060,  0.000,  0.006,  0.000]])
cos_ones=
tensor([[1., 0., 1., 0., 1., 0., 1., 0.],
        [1., 0., 1., 0., 1., 0., 1., 0.],
        [1., 0., 1., 0., 1., 0., 1., 0.],
        [1., 0., 1., 0., 1., 0., 1., 0.],
        [1., 0., 1., 0., 1., 0., 1., 0.],
        [1., 0., 1., 0., 1., 0., 1., 0.],
        [1., 0., 1., 0., 1., 0., 1., 0.]])
odd_pos_dim=
tensor([[ 0.000,  1.000,  0.000,  1.000,  0.000,  1.000,  0.000,  1.000],
        [ 0.000,  0.950,  0.000,  1.000,  0.000,  1.000,  0.000,  1.000],
        [ 0.000,  0.807,  0.000,  0.998,  0.000,  1.000,  0.000,  1.000],
        [ 0.000,  0.583,  0.000,  0.996,  0.000,  1.000,  0.000,  1.000],
        [ 0.000,  0.301,  0.000,  0.992,  0.000,  1.000,  0.000,  1.000],
        [ 0.000, -0.010,  0.000,  0.988,  0.000,  1.000,  0.000,  1.000],
        [ 0.000, -0.321,  0.000,  0.982,  0.000,  1.000,  0.000,  1.000]])
my_result=
tensor([[     0.000,      1.000,      0.000,      1.000,      0.000,      1.000,
              0.000,      1.000],
        [     0.841,      0.950,      0.100,      1.000,      0.010,      1.000,
              0.001,      1.000],
        [     0.909,      0.807,      0.199,      0.998,      0.020,      1.000,
              0.002,      1.000],
        [     0.141,      0.583,      0.296,      0.996,      0.030,      1.000,
              0.003,      1.000],
        [    -0.757,      0.301,      0.389,      0.992,      0.040,      1.000,
              0.004,      1.000],
        [    -0.959,     -0.010,      0.479,      0.988,      0.050,      1.000,
              0.005,      1.000],
        [    -0.279,     -0.321,      0.565,      0.982,      0.060,      1.000,
              0.006,      1.000]])
self._result.weight=
Parameter containing:
tensor([[     0.000,      1.000,      0.000,      1.000,      0.000,      1.000,
              0.000,      1.000],
        [     0.841,      0.950,      0.100,      1.000,      0.010,      1.000,
              0.001,      1.000],
        [     0.909,      0.807,      0.199,      0.998,      0.020,      1.000,
              0.002,      1.000],
        [     0.141,      0.583,      0.296,      0.996,      0.030,      1.000,
              0.003,      1.000],
        [    -0.757,      0.301,      0.389,      0.992,      0.040,      1.000,
              0.004,      1.000],
        [    -0.959,     -0.010,      0.479,      0.988,      0.050,      1.000,
              0.005,      1.000],
        [    -0.279,     -0.321,      0.565,      0.982,      0.060,      1.000,
              0.006,      1.000]])
test_position_result=
Embedding(7, 8)

http://www.niftyadmin.cn/n/5797258.html

相关文章

【时间之外】IT人求职和创业应知【74】-运维机器人

目录 OpenAI最强推理模型o3发布,AGI测试能力暴涨 英伟达宣布收购以色列AI初创企业Runai 汤姆猫首款AI机器人产品明日发售 心勿贪,贵知足。 感谢所有打开这个页面的朋友。人生不如意,开越野车去撒野,会害了自己,不如…

小型 Vue 项目,该不该用 Pinia 、Vuex呢?

说到 Vue3 的状态管理,我们会第一时间想到 Pinia、Vuex,但是经过很长一段时间的 Vue3 项目开发,我逐渐发现,我们真的有必要用 Pinia、Vuex 这类的状态管理工具吗? 带着这样的疑惑,我首先是想知道一下 Pini…

在 Sanic 应用中使用内存缓存管理 IP 黑名单

[外链图片转存中…(img-Pm0K9mzd-1734859380698)] 在现代 web 应用中,保护 API 接口免受恶意请求的攻击至关重要。IP 黑名单是一种常见的安全措施,可以有效阻止某些 IP 地址的访问。本文将介绍如何在 Python 的 Sanic 框架中实现 IP 黑名单功能&#xf…

【HarmonyOs学习日志(14)】计算机网络之域名系统DNS

域名系统DNS 域名系统DNS——从域名解析出IP地址 文章目录 域名系统DNS概述域名到IP地址的解析 互联网的域名结构命名标准 域名服务器域名的解析过程 概述 域名系统DNS(Domain Name System)是互联网使用的命名系统,用来把便于人们使用的机器…

Qt中的QProcess与Boost.Interprocess:实现多进程编程

目录 QProcess简介 启动进程的不同方式 例子1:打开记事本程序 例子2:执行带有管道(|)的Linux命令 同步进程API Boost.Interprocess简介 (一)共享内存: (二)命名信…

kubernates实战

使用k8s来部署tomcat 1、创建一个部署,并指定镜像地址 kubectl create deployment tomcat6 --imagetomcat:6.0.53-jre82、查看部署pod状态 kubectl get pods # 获取default名称空间下的pods kubectl get pods --all-namespaces # 获取所有名称空间下的pods kubect…

【网络】超以太网联盟 UEC|下一代 “RoCE” 协议--编辑中

术语 UEC: 超级以太联盟 UET: 超级以太传输协议 Tail latency: 尾部延迟,(以通信阶段最后一条消息的到达时间为衡量标准)是系统性能的关键指标。 未来 AI 和 HPC 网络的关键需求 为了实现低尾延迟,UEC 规范通过满足下一代应用…

HarmonyOS 实践 - 设计模式在代码中的作用

文章目录 前言设计模式概述单例模式:全局状态管理代码分析 策略模式:界面主题切换代码分析 示例测试单例模式测试策略模式测试 体验评价总结 前言 在软件开发中,设计模式是公认的最佳实践,它能帮助开发者通过模块化和规范化的代码…