Transformer模型抛弃了RNN、CNN作为序列学习的基本模型。循环神经网络本身就是一种顺序结构,天生就包含了词在序列中的位置信息。当抛弃循环神经网络结构,完全采用Attention取而代之,这些词序信息就会丢失,模型就没有办法知道每个词在句子中的相对和绝对的位置信息。因此,有必要把词序信号加到词向量上帮助模型学习这些信息,位置编码(Positional Encoding)就是用来解决这种问题的方法。
关于位置编码更多介绍参考bev感知专栏的博客
import torch
import matplotlib.pyplot as plt
def posemb_sincos_2d(h, w, dim, temperature: int = 10000, dtype=torch.float32):
y, x = torch.meshgrid(torch.arange(h), torch.arange(w), indexing="ij")
assert (dim % 4) == 0, "feature dimension must be multiple of 4 for sincos emb"
omega = torch.arange(dim // 4) / (dim // 4 - 1)
omega = 1.0 / (temperature ** omega)
y = y.flatten()[:, None] * omega[None, :]
x = x.flatten()[:, None] * omega[None, :]
pe = torch.cat((x.sin(), x.cos(), y.sin(), y.cos()), dim=1)
return pe.type(dtype)
def posemb_sincos_1d(len, dim, temperature: int = 10000, dtype=torch.float32):
x = torch.arange(len)
assert (dim % 2) == 0, "feature dimension must be multiple of 2 for sincos emb"
omega = torch.arange(dim // 2) / (dim // 2 - 1)
omega = 1.0 / (temperature ** omega)
x = x.flatten()[:, None] * omega[None, :]
pe = torch.cat((x.sin(), x.cos()), dim=1) # 这里不用担心,不交叉无所谓,
return pe.type(dtype)
if __name__ == '__main__':
pos = posemb_sincos_1d(200, 256)
# pos = posemb_sincos_2d(20,20,256)
# 创建一个热力图
plt.imshow(pos, cmap='hot', interpolation='nearest')
# 添加颜色条
plt.colorbar()
# 显示图形
plt.show()
pass
可视化结果如下: