包括正弦运算在内的位置编码如何针对任何偏移进行线性变换?

数据挖掘 机器学习 数学 线性代数
2022-01-23 13:38:00

在论文“Attention is all you need”中,作者为序列中的每个标记添加了位置编码(第​​ 3.5 节)。选择以下编码:

PE(pos,2dim)=sin(pos/100002dim/dmodel)

PE(pos,2dim+1)=cos(pos/100002dim/dmodel)

文本指出“对于任何固定偏移k,PE(pos+k)可以表示为一个线性函数PE(pos)”。由于正弦函数的非线性,这对我来说似乎并不明显。其他资源,如Attention 就是你需要的全部解释提到这个属性,但不要更深入地研究它。

我决定通过尝试映射来自PE(pos)具有给定偏移量的输出功能k.

import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression

def PE_even(pos, dim):
    """ This corresponds to the 2dim state. """
    size = 10000
    d_Model = 512
    return np.sin(pos / (size ** (2 * dim / d_Model)))

positions = pd.Series(np.arange(0, 1000))

k = 10
a = positions.apply(lambda p: PE_even(p, 64))
b = positions.apply(lambda p: PE_even(p + k, 64))

X = a.values.reshape(-1, 1)
y = b.values
r = LinearRegression()
r.fit(X, y)
r.score(X, y)

但是,这些尺寸中的任何偏移量或任何数字范围都不会产生合适的拟合。作为k增加和从产生的正弦波PE(pos)函数不同步,变换与真值的相关性降低。即使使用具有或不具有线性的简单神经网络也不会产生良好的拟合。

我是否误解了论文中的陈述,或者我的代码或对这里基础数学的理解有问题?

1个回答

我选择在数学堆栈交换上问这个问题,我认为在这里添加答案是谨慎的:

https://math.stackexchange.com/q/3119882

根据我从@Servaes那里学到的知识,他很友好地回答了这个问题,有一个功能

PE(pos+k,2d)=PE(pos,2d)cos(k/cd)+PE(pos,2d+1)sin(k/cd)

允许将任何位置编码转换为具有给定偏移量的属性。然而,由于需要使用 sin() 和 cos() 函数,这不是线性变换。