【Transformer深入学习】之一:Sinusoidal位置编码的精妙
看苏神的文章提到:Transformer原论文使用Sinusoidal位置编码,作为位置编码的一个显式解,Google 在原论文中对它的描述寥寥无几,只是简单提及了它可以表达相对位置信息,并未提及这个编码的合理性。
看了几篇文章,做一个笔记。
Sinusoidal位置编码
公式和在模型中的位置
为什么需要位置编码
单词的位置和顺序是任何语言的重要组成部分。它们定义了句子的语法,从而定义了句子的实际语义。递归神经网络 (RNN) 本质上会考虑单词的顺序;他们按顺序逐字解析句子。这会将单词的顺序集成到 RNN 的主干中。
但是 Transformer 架构放弃了递归机制,转而采用多头自注意力机制。避免 RNN 的递归方法将导致训练时间的大幅加快。从理论上讲,它可以在句子中捕获更长的依赖项。
由于句子中的每个单词同时流经 Transformer 的编码器/解码器堆栈,因此模型本身对每个单词没有任何位置/顺序感。因此,仍然需要一种方法将单词的顺序合并到模型中。
为模型提供一些顺序感的一种可能解决方案是向每个单词添加一条有关其在句子中的位置的信息。我们称此 “信息片段”为位置编码。
可能想到的第一个想法是为 [0, 1] 范围内的每个时间步长分配一个数字,其中 0 表示第一个单词,1 是最后一个时间步长。您能弄清楚它会导致什么样的问题吗?它将引入的问题之一是您无法弄清楚特定范围内存在多少个单词。换句话说,时间步长 delta 在不同的句子中没有一致的含义。
另一个想法是为每个时间步线性分配一个数字。也就是说,第一个单词被赋予 “1”,第二个单词被赋予 “2”,依此类推。这种方法的问题在于,不仅值可能会变得相当大,而且我们的模型可能会面对比训练中的句子更长的句子。此外,我们的模型可能看不到任何具有特定长度的样本,这会损害我们模型的泛化。
理想情况下,应满足以下条件:
- 它应该为每个时间步(单词在句子中的位置)输出唯一的编码
- 任意两个时间步长之间的距离在不同长度的句子中应该是一致的
- 我们的模型应该可以毫不费力地推广到更长的句子。它的值应该是有界的。
- 它必须是确定性的。
Sinusoidal位置编码
论文提出的编码是一种简单而天才的技术,可以满足所有这些标准。首先,它不是一个单一的数字。相反,它是一个d-维度向量,其中包含有关句子中特定位置的信息。其次,这种编码没有集成到模型本身中。相反,这个向量用于为每个单词提供有关其在句子中的位置的信息。换句话说,我们增强了模型的输入以注入单词的顺序。
让t是输入句子中所需的位置,d是编码维度,编码定义如下:
由于可以从函数定义中得出,频率沿着向量维度递减。因此,它在波长上形成了从2π到10000⋅2π的几何级数。
还可以想象位置位置嵌入作为包含每个频率的正弦和余弦对的向量:
直觉
你可能想知道 sines 和 cosines 的这种组合怎么能代表一个位置/顺序?其实很简单,假设你想用二进制格式表示一个数字,那会怎么样?
您可以发现不同位之间的变化率。LSB 位在每个数字上交替,第二低位在每两个数字上旋转,依此类推。
但是在浮点数的世界中使用二进制值会浪费空间。因此,我们可以改用它们的 float 连续对应物 - Sinusoidal 函数。事实上,它们相当于交替的位。此外,通过降低它们的频率,我们可以从红色位变为橙色位。
图: 最大长度为 50 的句子的 128 维正序编码。每行表示嵌入向量
相对位置
正弦位置编码的另一个特点是它允许模型毫不费力地处理相对位置。以下是原始论文中的一段引述:
“我们选择这个函数是因为我们假设它允许模型轻松学习通过相对位置来关注,因为对于任何固定偏移量 k, PEpos+K可以表示为 PE 的线性函数PEpos”(原文:We chose this function because we hypothesized it would allow the model to easily learn to attend by relative positions, since for any fixed offset k, PEpos+kcan be represented as a linear function of PEpos.)
但为什么这种说法成立呢?
简单版本的证明:
对于对应于频率的每个正弦-余弦对ωk,则存在线性变换M:
证明:
M是2×2的矩阵,我们想要找到u1,v1,u2和v2,因此
通过应用加法定理,我们可以按如下方式展开右侧:
这会产生以下两个方程:
通过求解上述方程,我们得到:
所以最终的变换矩阵M是:
如您所见,最终转换矩阵M不依赖于t。
请注意,可以找到矩阵M与 Rotation Matrix 非常相似。
同样,我们可以找到对于其他正弦-余弦对的M矩阵,这最终允许我们表示pt+φ作为pt对于任何固定偏移量φ。此属性使模型很容易按相对位置进行学习。
正弦位置编码的另一个特性是相邻时间步长之间的距离是对称的,并且会随时间很好地衰减。
图 所有时间步长的位置嵌入的点积
远程衰减
苏神的文章 ,评估了Sinusoidal位置编码的远程衰减:
除了θt=t比较异常之外(与横轴有交点),其他很难断定孰优孰劣。
其他总结
这是一个如何破坏轮换对称性,同时给长距离的 token 关联做自动衰减的有效方法。
参考文献
《Transformer Architecture: The Positional Encoding
Let’s use sinusoidal functions to inject the order of words in our model》
(https://kazemnejad.com/blog/transformer_architecture_positional_encoding/)
《Transformer升级之路:Sinusoidal位置编码追根溯源》
(https://mp.weixin.qq.com/s/57iu8rPTXXG0jb2xxEVnTw)
《BERT为何使用学习的position embedding而非正弦position encoding?》
(https://www.zhihu.com/question/307293465/answer/1039311514)