admin管理员组

文章数量:1611969

因为没有循环神经网络做迭代,所以我们加上位置编码,以避免计算机无法区分“我是你爸”和“你是我爸”等等。

对于一个维度762的字向量
我们需要一个762维度的位置编码
之后相加操作喂入Transformer
位置嵌入的公式如下:

我对其纹理进行可视化:

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(15, 10))
sns.set()
np.random.seed(0)
max_sequence_lenth = 500
embeding_dim=762
jishu=10000
i_max=int((embeding_dim-1)/2)
datas=[]
for pos in range(max_sequence_lenth):
    posithon_embeding = []
    for i in range(i_max+1):
        posithon_embeding.append(np.sin(pos/(pow(jishu,(2*i)/embeding_dim))))
        posithon_embeding.append(np.cos(pos/(pow(jishu,(2*i)/embeding_dim))))
    datas.append(posithon_embeding)
uniform_data = np.array(datas)
ax = sns.heatmap(uniform_data)
plt.show()

对于0-1之间的线性维度标注法(那种按照位置1,2,3,4……500……这样不在0-1的编码可以完全pass了)

还有啊如果用i/sequence_length的也不行。
在短文本中字与字相差0.1可能代表相邻的两个字,而在长文本中0.1可能中间还间隔了几个字。

而同一采用上述的sin cos的纹理能很好得将训练完的模型适用于喂入各种长度的文本,不论文本长短,其位置编码按上图从上往下固定不变,(要采用该模型,就不变其维度762)

本文标签: BertPositionEmbedding