参考:https://spaces.ac.cn/archives/8130
绝对位置编码是在计算 QKV 之前,把位置编码跟 embedding 加起来。也就是在输入的第 k 个向量 x_k 中加入位置向量p_k,变为x_k+p_k,其中p_k只依赖于位置编号k。
将位置编码作为可训练参数。
这样的好处是不需要设计,坏处是不好外推。比如设计时的 context len 长度是 512,那你就总共训练了 512 个位置编码,肯定不好轻易外推,不然额外的位置编码的权重从哪来的呢?
这里是提出问题,为什么位置编码普遍用加法,为什么不用乘法或者别的什么方式呢?很奇怪。
相对位置并没有完整建模每个输入的位置信息,而是在算Attention的时候考虑当前位置与被Attention的位置的相对距离,由于自然语言一般更依赖于相对位置,所以相对位置编码通常也有着优秀的表现。对于相对位置编码来说,它的灵活性更大,更加体现出了研究人员的“天马行空”。
google 提出的,还是用的加性位置编码。做了很多近似,感觉不靠谱。
似乎从这个工作开始,后面的相对位置编码都只加到Attention矩阵上去,而不加到 v_j 上去了。