位置编码(大学生自学)

158 阅读2分钟

第一步,在python中导入我们需要使用用到的库

import math  
> import torch  
> import torch.nn as nn  
> import torch.nn.functional as F  
> import torch.optim as optim

其中math库是python中包含数学运算的库,而torch是python中深度学习框架

今天的目标是将我们输入的序列转化为位置编码

class PositionalEncoding(nn.Module):  
def __init__(self, d_model, max_len=5000):  
super(PositionalEncoding, self).__init__()  
#计算位置编码  
pe=torch.zeros(max_len,d_model)  
#生成了一个输入特征维度和最大序列长度的张量  
position=torch.arange(0,max_len,dtype=torch.float).unsqueeze(1)  
#生成了一个二维张量,第一维度是从0到max_len-1,第二维度是1  
# 第三步,实现positional Ecoding数学代码公式的编码,具体公式看看主页文章  
div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-torch.log(  
torch.tensor(10000.0)) / d_model))  
pe[:, 0::2] = torch.sin(position * div_term)  
pe[:, 1::2] = torch.cos(position * div_term)  
pe = pe.unsqueeze(0)  
#也就是以现在的pe最外围包了一层,变成一个batch_size为1的张量  
self.register_buffer('pe', pe)  
def forward(self,x):  
x=x+self.pe[:,:x.size(1)]  
print("x.size(1)",x.size(1))  
return x  
d_model = 512  
max_len = 100  
num_heads = 8  
pos_encoder = PositionalEncoding(d_model, max_len)  
# 示例输入序列  
input_sequence = torch.randn(5, max_len, d_model)  
# print("输入序列:" + str(input_sequence))  
# 应用位置编码  
input_sequence = pos_encoder(input_sequence)  
print("输入序列的位置编码:")  
print(input_sequence.shape)

知识点:

  • 知识点一:nn.Module,是 PyTorch 中用于构建神经网络的基类。
  • 知识点二:d_model: 这个参数表示输入特征的维度。通常在变换器(Transformer)模型中,这个维度是固定- 的,用于定义输入和输出的向量大小。
  • 知识点三:max_len: 这个参数表示最大序列长度。在变换器(Transformer)模型中,这个参数用于计算位置编码
  • 知识点四:具体来说,unsqueeze(0) 会在 pe 张量的第一个维度(索引为 0 的维度)插入一个新的维度,通常用于在数据处理时增加一个批次维度。
  • 知识点五:unsqueeze(1) 会在张量的第二个维度插入一个新的维度。
  • 知识点六:register_buffer('pe', pe) 会将 pe 注册为模型的缓冲区,这样它就会被保存到模型的 state_dict 中,但不会被优化器优化
  • 知识点七:x.size(1) 返回张量 x 在第 1 维的大小(通常是序列的长度或特征数)。这个大小决定了你从位置编码 self.pe 中提取的部分。
  • 知识点八:5:表示批次大小(batch size),即生成 5 个样本。
  • max_len:表示每个样本的序列长度,即每个样本包含 max_len 个时间步(或元素)。
    d_model:表示每个时间步的特征维度,通常是模型中输入特征的维度大小。