在transformers架构当中,对于词向量的输入需要加上原本词对应的位置信息,作为输入到模型中训练的input,那具体的位置编码如何实现呢?本篇博客就跟大家一起分享一下对应的步骤
对于词向量的位置编码的方式有多种,这里就介绍用三角函数进行位置编码的公式
PE是position embeding位置编码的意思,pos表示词的位置,表示词向量的维度,i表示词向量的第i维度
那接下来我们就根据公式进行位置编码的代码实现
环境依赖的库
import torch
import math
import numpy as np
import matplotlib.pyplot as plt
定义一个函数获取位置编码的信息
def generate_word_embeding(max_len,d_model):
# 初始化位置信息
pos = torch.arange(max_len).unsqueeze(1)
# 初始化位置编码矩阵
result = torch.zeros(max_len,d_model)
# 获得公式对应的值
coding = torch.exp(torch.arange(0,d_model,2)*(-math.log(10000.0))/d_model)
result[:,0::2] = torch.sin(pos*coding)
result[:,1::2] = torch.cos(pos*coding)
# 为了与原编码直接相加,格式为[B,seq_len,d_model],需要再增加一个维度
return result.unsqueeze(0)
假设我们的max_len是100,d_model为20,那么pos的维度为[100,1],result的维度为[100,20],coding的维度为[1,d_model/2],result[:,0::2]是指对result的每列从第0列开始每隔一列赋值,对应公式中的PE(pos,2i);同理,result[:,1::2]对应公式中的PE(pos,2i+1)
我们把得位置编码信息进行可视化从而得到更直观的感受
d = 6
pos_code = generate_word_embeding(100,d)
print(pos_code.shape)
plt.plot(np.arange(100),pos_code[0,:,0:d])
plt.legend(['dim=%d'%p for p in range(d)])
plt.show()
把词的时序长度设置为6,显示对应时序上每一个维度的位置编码信息
可以看到每一个时序位置上对应每一个维度都对应一个三角函数的变换规律,在放进model中训练的后就能够通过学习获得位置对应的知识
欢迎大家讨论交流~