Attention is all your need -- Positional Encoding


Attention is all your need – Positional Encoding

[TOC]

本篇文章主要是针对为何Transformer论文中,也就是这篇元祖型论文"attention is all your need"中为何使用三角函数作为positional encoding。

Transformer

当然,在学习transformer的过程中,笔者首先是看的2021李宏毅老师的课程,其次在知乎和网站上找了很多这个方向的文章,比较推荐的一篇链接如下:Transformer【虽然是全英文,但是真的蛮好理解的,我这个英语渣渣都可以慢慢读懂,有时间可以慢慢品一品】

接下来,再直入主题之前,我们先简单回顾一下Transformer。

简单来说,Transformer中抛弃了传统的CNN和RNN,整个网络结构完全是由Attention机制组成。或许我们可以从RNN的缺陷中去进一步理解attention机制的巧妙性:

  1. 我们先欣赏一下原文:

    Transformer is the first transduction model relying entirely on self-attention to compute representations of its input and output without using sequence aligned RNNs or convolution.
    % 习惯性多说一句,虽然我之前很讨厌英文,但是不知道为什么,最近开始学习machine learning之后,越来越能接受英文了,甚至觉得有些英文描述简直可以让人茅塞顿开。

  2. 接下来我们挑重点:它与RNN的区别在于,RNN的计算是顺序执行的,存在限制并行与信息丢失的问题。【我在这里只简单挑这个点描述,更感兴趣或者想要深入了解的可以看我上面放的链接,问就是因为我自己的学习笔记记了好长好长,暂时缺乏简单总结能力。】

Positional Encoding

在有了对transformer的大概了解之后(当然你目前不懂也没关系,只要记住上面原文的那句话以及我指出的transformer与RNN的区别就好)。熟话说:鱼和熊掌不可兼得,transformer在改进RNN无法并行的时候,也给自身挖了一个小坑:那就是少了对位置信息的刻画,Transformer模型并没有捕捉顺序序列的能力,也就是说无论句子的结构怎么打乱【看了李宏毅老师的课程,会下意识写出这句话,当然删掉这一小句话,不影响阅读】,Transformer都会得到类似的结果。

正所谓车到山前必有路,为了解决上面的问题,引入了Position Encoding or Embedding。具体地说,位置编码会在词向量中加入了单词的位置信息,这样Transformer就能区分不同位置的单词了。

其实encoding与embedding的区别和联系也蛮有趣的,这里简单说一下我的理解:“Postional Embedding更像是“learned and fixed”,它只能表征有限长度内的位置,无法对任意位置进行建模。而"Positional Encoding"更偏向于想要多长就有多长。在论文中提到:实验结果表明,两种形式的模型没有效果差别

论文给出公式

​ 论文简洁明了的给出了位置编码的公式:

\begin{equation}\begin{aligned} P E_{(\text {pos }, 2 i)} &=\sin \left(\text { pos } / 10000^{2 i / d_{\text {model }}}\right) \\ P E_{(\text {pos }, 2 i+1)} &=\cos \left(\text { pos } / 10000^{2 i / d_{\text {modil }}}\right) \end{aligned}\end{equation}

公式疑惑整理

那么看到这个公式的第一眼,我是两眼迷惑,当然也引起了很大的兴趣,主要有以下问题:

  1. 为何使用正余弦
  2. 为何要分组
  3. 为什么加上了维度

解决过程-位置编码的几种方法

传统位置编码方法

想要解决上面三个问题,我们可以从最原始的思路出发,不断优化。这个想法提出的原因是想要有一种位置编码的方式能够解决transformer中使用attention所带来的缺少位置信息的问题。这时候我脑子里能反应出来的就是:

  1. 根据位置依次取整数:0,1 … L-1

这种想法简单直接,但缺点暴露的也很明显。首先,当序列长度过长时,首尾取值差别太大。其次太大的编码对于性能来说也是一个不好的情况。这时候就会想,那做个归一化嘛,这样就能把值都缩小到【0,1】里面,这就是我们会想到的第二种方法:

  1. PE=pos/(L-1)

这种方式的缺点,我这里直接引用一位大佬的话:

不同长度文本的位置编码步长是不同的,在较短的文本中紧紧相邻的两个字的位置编码差异,会和长文本中相邻数个字的两个字的位置编码差异一致。这显然是不合适的,我们关注的位置信息,最核心的就是相对次序关系,尤其是上下文中的次序关系,如果使用这种方法,那么在长文本中相对次序关系会被「稀释」。

停下来欣赏一下旅途的风景

走不动了,我们就停下来看看在摈弃了两种方法后,我们应该更能明确我们想要何种位置编码,它需要具备的重要特性是什么?

  1. 每个位置的编码要唯一
  2. 不同长度的序列中不同位置之间的差异应该一致(保证编码与sequence长度无关)
  3. 能够轻易的拓展到无限大长度(与维度挂钩)并且有边界(值域落入一定数值区间内的编码)

之所以我们上面会卡住,其实很大程度上是因为我们过于追求绝对位置的影响,使用了一个单调的函数,使得任意后续的字符的位置编码都大于前面的字。如果我们削弱绝对位置,要求位置编码仅仅关注一定范围内的相对次序关系,那么使用一个sin/cos函数就是很好的选择【注意这里我们解决的最开始提出的疑惑一】,因为sin/cos函数的周期变化规律非常稳定,所以编码具有一定的不变性。

三角函数应用于位置编码

三角函数:

\begin{equation}P E(\text { pos })=\sin \left(\text { pos }\right)\end{equation}

但是只是简单的使用如上的函数,又会存在说上面的第二个问题,所以进一步改进:

\begin{equation}P E(\text { pos })=\sin \left(\frac{\text { pos }}{\alpha}\right)\end{equation}

利用α\alpha来对波长进行控制,当α\alpha比较大时,波长比较长,相邻字的位置编码之间的差异比较小。但是换汤不换药,存在说如果α\alpha 比较大,相邻字符之间的位置差异体现得不明显;如果α\alpha 比较小,在长文本中还是可能会有一些不同位置的字符的编码一样。归根结底还是因为范围限定在[-1,1]之间,那么想要不同的维度有着不同的函数去控制位置编码,最简单的方法就是,把维度加到函数中,这样就可以对其进行控制。

其实上述思想我们可以不用感到疑惑,毕竟字嵌入的维度是dmodel d_{\text {model }} ,那么将其再加入位置编码种也不是一件不能接受的事情。毕竟上升到 [1,1]dmodel [-1,1]^{d_{\text {model }}} ,其表示范围要远大于[1,1][-1,1]。【这里我们就解决了最开始提出的疑惑三

论文公式解读

至少到目前为止,我们可以对论文的公式有一个大概的理解,这时我们再来欣赏论文公式:

\begin{equation}\begin{aligned} P E_{(p o s, 2 i)} &=\sin \left(p o s / 10000^{2 i / d_{\text {modd }}}\right) \\ P E_{(p o s, 2 i+1)} &=\cos \left(p o s / 10000^{2 i / d_{\text {modd }}}\right) \end{aligned}\end{equation}

首先,采用了三角函数形式,满足我们解决【疑惑一】推导;其次,周期范围从范围从 2 \pi --- 10000*2 \pi,满足了我们解决**【疑惑三】**的推导,也就是说实现了不同的维度有着不同的函数去控制位置编码。

至于【疑惑二】,我们从论文种给出的公式出发理解,首先欣赏原论文对这个公式的评价:

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+k can be represented as a linear function of
PEpos.

我第一次读就觉得里面的relative position很奇妙,也很不理解,这也是为什么我会写这篇文章的原因。你可能会问,我现在知道它为啥用三角函数,知道为啥引入维度,但是我是真看不懂为啥分组,怎么就体现相对位置了呀。这就要感慨一下和差公式的魅力了。

为了排版好看,我把paper公式在这里在打一遍:

\begin{equation}\begin{aligned} P E_{(p o s, 2 i)} &=\sin \left(p o s / 10000^{2 i / d_{\text {modd }}}\right) \\ P E_{(p o s, 2 i+1)} &=\cos \left(p o s / 10000^{2 i / d_{\text {modd }}}\right) \end{aligned}\end{equation}

和差公式:

\begin{equation}\begin{array}{l} \sin (\alpha+\beta)=\sin \alpha \cdot \cos \beta+\cos \alpha \cdot \sin \beta \\ \cos (\alpha+\beta)=\cos \alpha \cdot \cos \beta-\sin \alpha \cdot \sin \beta \end{array}\end{equation}

代入本题公式:

\begin{equation}\begin{array}{l} P E_{(p o s+k, 2 i)}=\sin \left(w_{i} \cdot(p o s + k)\right)=\sin \left(w_{i} p o s\right) \cos \left(w_{i} k\right)-\operatorname{\operatorname{cos}}\left(w_{i} p o s\right) \sin \left(w_{i} k\right) \\ P E_{(p o s+k, 2 i+1)}=\cos \left(w_{i} \cdot(p o s + k)\right)=\cos \left(w_{i} p o s\right) \cos \left(w_{i} k\right)-\sin \left(w_{i} p o s\right) \sin \left(w_{i} k\right) \\ P E_{(p o s, 2 i)}=\sin \left(w_{i} \cdot(p o s)\right) \\ P E_{(p o s, 2 i+1)}=\cos \left(w_{i} \cdot(p o s)\right) \\ P E_{(p o s+k, 2 i)}=\cos \left(w_{i} k\right) P E_{(p o s, 2 i)}+\sin \left(w_{i} k\right) P E_{(p o s, 2 i+1)} \\ P E_{(p o s+k, 2 i+1)}=\cos \left(w_{i} k\right) P E_{(p o s, 2 i+1)}-\sin \left(w_{i} k\right) P E_{(p o s, 2 i)} \\ w_{i}=\frac{1}{10000^{2 i / d_{\text {nodel }}}} \end{array}\end{equation}

好家伙,太久没用latex写公式了,麻烦请两两为一组看,方便理解。当然啦,在写到这时,突然想到了矩阵(这样看这次的整理还是有超乎想象的收获的),所以简单来说最后的结果可以表示为:

\begin{equation}\left[\begin{array}{c} P E_{(p o s+k, 2 i)} \\ P E_{(p o s+k, 2 i+1)} \end{array}\right]=\left[\begin{array}{cc} \cos \left(w_{i} \cdot k\right) & -\sin \left(w_{i} \cdot k\right) \\ -\sin \left(w_{i} \cdot k\right) & \cos \left(w_{i} \cdot k\right) \end{array}\right]\left[\begin{array}{l} P E_{(p o s, 2 i)} \\ P E_{(p c s, 2 i)} \end{array}\right]\end{equation}

惊不惊喜,意不意外,我们竟然推导出了为什么paper里面的公式可以体现相对位置!!!!【同时到此为止我们就解决了疑惑三

实在是还想感慨一下数学的魅力,此时吹爆三角函数。此刻,我们已经解决了所有我们在最开始提出的问题,但是不得不说,如果你读到这里,觉得好神奇啊,怎么怎么样,那或许可能需要再锻炼一下自我思考能力,因为在一开始你就陷入了我给你画的三个问题的圈,但其实还有很多问题,比如:为何公式里用的是10000,不是其他数字。

虽然但是,写到这里,我激动的心情已经慢慢平淡了。其实我觉得并没有很大的必要去深究为何公式如此,毕竟很大程度上经验累积占上风,就像为何是10000一样。但是往往一个问题的提出就会牵引着人们去解决,而在解决的过程中,或许最初的问题已经变得不那么重要了,但或许你会遇到让你眼前一亮的解决方案或者思想,而这也是我一直很想把握住的【灵光一现 落地生根】的感觉。


Author: Superior Leo
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Superior Leo !
评论
  TOC