出现背景
自注意力机制处理数据,并不是采用类似RNN或者LSTM那种递归的结构,这使得模型虽然能够同时查看输入序列中的所有元素(即并行运算),但是也导致了没办法获取当前word在序列种的位置信息,使模型对顺序信息捕捉很差。
PE
位置编码公式
思路
采用sin和cos函数对word的每一维上进行唯一编码,这样每个word都得到了自己的位置编码信息,并且由于sin和cos都是连续函数,所以针对pos相近的word,他们的位置编码信息也是比较相近的,这样序列的顺序信息就能够获取到了。
TODO遗留问题:sin和cos都是周期函数,会存在位置编码信息重叠吗?
code
import torch
import torch.nn as nn
import math
class PositionalEncoding(nn.Module):
def __init__(self, d_model, max_len=5000