1、Attention is all you need 中的位置编码

1.1 部分论文解释截图

中文翻译为位置编码(后面用PE代替)。这个操作,直观上非常容易理解,就是对序列中的词的位置进行编码。但是,原文并没有对这种新颖的位置编码方式作细致的讲解。对很多人来说,依然一头雾水。因此,本博客旨在让大家真正理解位置编码的原理。

YaRN 位置编码_像素点

1.2 在公式形成中的考量

1.2.1 引入PE的意义

对于任何一门语言,单词在句子中的位置以及排列顺序是非常重要的,它们不仅是一个句子的语法结构的组成部分,更是表达语义的重要概念。一个单词在句子的位置或排列顺序不同,可能整个句子的意思就发生了偏差。

I do not like the story of the movie, but I do like the cast.
I do like the story of the movie, but I do not like the cast.

上面两句话所使用的的单词完全一样,但是所表达的句意却截然相反。那么,引入词序信息有助于区别这两句话的意思。

针对现在广泛应用的图像处理也是一样,可能针对全图而言像素点的绝对坐标不那么重要(其实位置对全图也有一定的影响),但是临近像素点序列的排布顺序,临近像素块(像素点集)序列的排布顺序也很重要。

Transformer模型抛弃了RNNCNN作为序列学习的基本模型。我们知道,循环神经网络本身就是一种顺序结构,天生就包含了词在序列中的位置信息。当抛弃循环神经网络结构,完全采用Attention取而代之,这些词序信息就会丢失,模型就没有办法知道每个词在句子中的相对和绝对的位置信息。因此,有必要把词序信号加到词向量上帮助模型学习这些信息,PE就是用来解决这种问题的方法。

1.2.2 PE的作用

PE是一种用位置信息对序列中的每个序列信息进行二次表示的方法。正如1.2.1所述,Transformer模型本身不具备像RNN那样的学习词序信息的能力,RNN在模型定义时就已经包含了逐个输入的信息的顺序等价于信息出现的次序。Transformer需要主动将序列的顺序信息喂给模型。

那么,以这篇论文为例,模型原先的输入是不含词序信息的词向量,位置编码需要将词序信息和词向量结合起来形成一种新的表示输入给模型,达到增强输入的目的,这样模型就具备了按照编码适应序列信息的能力。

1.2.3 PE需要满足的要求

  • 举例一:

分配一个0到1之间的数值给每个时间步,其中,0表示第一个词,1表示最后一个词。

这种方法虽然简单,但会带来很多问题。其中一个就是你无法知道在一个特定区间范围内到底存在多少个单词。也就是说,按照这种操作,不同句子,有不一样的长度,时间步长也会被分配成不同的精度,时间步差值就没有任何的意义了。

  • 举例二:

线性分配一个数值给每个时间步。也就是,1分配给第一个词,2分配给第二个词,以此类推。

这种方法带来的问题一:特殊情况下PE数值信息会变得非常大,淹没有其他价值信息。

这种方法带来的问题二:模型会遇到一些比训练中的所有句子都要长的句子,无法适应没有见到过的更大PE信息。

这种方法带来的问题三:数据集中不一定在所有数值上都会包含相对应长度的句子,也就是模型很有可能没有看到过任何一个这样的长度的样本句子,这会严重影响模型的泛化能力。

  • 一种好的位置编码方案需要满足以下几条要求:
  • 为每个时间步输出一个独一无二的编码
  • 不同长度的句子之间,任何两个时间步之间的距离应该保持一致
  • 模型应该能毫不费力地泛化到更长的句子
  • 它的值应该是有界的
  • 它必须是确定性的

1.3 公式说明

本文内容中提出了一个简单但非常创新的位置编码方法,能够满足上述所有的要求。

首先,这种编码不是单一的一个数值,而是包含句子中特定位置信息的向量计算方式(非常像词向量)。

第二,这种编码没有整合进模型,而是用这个向量让每个词具有它在句子中的位置的信息。换句话说,通过注入词的顺序信息来增强模型输入。

具体公式如下
YaRN 位置编码_YaRN 位置编码_02

  • YaRN 位置编码_词向量_03:表示注入的顺序,也就是所想表述的空间或者时间上的顺序
  • YaRN 位置编码_循环神经网络_04
  • YaRN 位置编码_循环神经网络_05:表示维度的序号,每一个输入可能对应若干深层隐藏的变量
  • YaRN 位置编码_循环神经网络_06
  • YaRN 位置编码_词向量_07

换一个更形象的好看的形式
YaRN 位置编码_词向量_08
向量YaRN 位置编码_像素点_09,对应每个位置都有一个对应位置的向量YaRN 位置编码_循环神经网络_10,共有输入长度YaRN 位置编码_词向量_11YaRN 位置编码_循环神经网络_10组成。每一个位置的向量都有YaRN 位置编码_循环神经网络_13维度,表示为YaRN 位置编码_YaRN 位置编码_14
YaRN 位置编码_循环神经网络_15
每一个元素的定义

YaRN 位置编码_词向量_16
最后的展示即为
YaRN 位置编码_YaRN 位置编码_17
从函数定义中可以得出,频率沿向量维度减小。因此,它在波长上形成从YaRN 位置编码_YaRN 位置编码_18YaRN 位置编码_像素点_19几何级数。你也可以认为,位置编码YaRN 位置编码_像素点_09是一个包含每个频率的正弦和余弦对(注意YaRN 位置编码_词向量_21是能被2整除的)。

150维200输入YaRN 位置编码_像素点_09举例

YaRN 位置编码_词向量_23

128维50输入YaRN 位置编码_像素点_09举例

YaRN 位置编码_YaRN 位置编码_25

1.4 编码的融合

YaRN 位置编码_像素点_26

原始论文将位置编码加到模型输入之上的方式为加法。

对于句子里的每个输入YaRN 位置编码_YaRN 位置编码_27,计算其对应的嵌入YaRN 位置编码_循环神经网络_28得到一个向量,然后按照下面的方法喂给模型:
YaRN 位置编码_YaRN 位置编码_29
为了保证这种相加操作正确,让位置向量YaRN 位置编码_像素点_30的维度等于词向量YaRN 位置编码_像素点_31的维度,即都让他们等于YaRN 位置编码_循环神经网络_13

下面举一个简单的例子。给定一个长度为YaRN 位置编码_YaRN 位置编码_33的输入序列YaRN 位置编码_YaRN 位置编码_34,其对应位置的信息编码向量为:
YaRN 位置编码_循环神经网络_35
其中,YaRN 位置编码_像素点_36。假设YaRN 位置编码_YaRN 位置编码_37,那么$k = 0,1 YaRN 位置编码_循环神经网络_38\overrightarrow{PE_{\text(pos)}}$对应的位置向量:
YaRN 位置编码_YaRN 位置编码_39
最终被表示为:
YaRN 位置编码_词向量_40

1.5 相对位置的线性关系

正弦曲线函数的位置编码的另一个特点是,它能让模型毫不费力地关注相对位置信息。这里引用原文的一段话:

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 YaRN 位置编码_词向量_41, YaRN 位置编码_YaRN 位置编码_42 can be represented as a linear function of YaRN 位置编码_词向量_43.

我们选择正弦曲线函数,因为我们假设它能让模型很容易地学习关注相对位置,因为对于任何固定的偏移量YaRN 位置编码_词向量_41YaRN 位置编码_YaRN 位置编码_42可以表示成 YaRN 位置编码_词向量_43的线性函数。

接下来,让我们证明位置编码中相对位置之间的线性关系。

问题描述

YaRN 位置编码_循环神经网络_47 表示包含YaRN 位置编码_YaRN 位置编码_33YaRN 位置编码_词向量_49维的列向量YaRN 位置编码_YaRN 位置编码_50的矩阵,其中, YaRN 位置编码_YaRN 位置编码_33 表示输入序列长度,其中的YaRN 位置编码_像素点_52表示输入的位置。
YaRN 位置编码_YaRN 位置编码_53
频率可以由之前的公式计算得到:

论文认为,存在一个线性转置
YaRN 位置编码_词向量_54

因为YaRN 位置编码_循环神经网络_55在上面我们已经用来标表示过了不同维度处的编码频率,这里我们换一个符号来表示偏移量YaRN 位置编码_YaRN 位置编码_56,使得对于序列中的任意有效位置YaRN 位置编码_YaRN 位置编码_57的任意的位置偏移量YaRN 位置编码_YaRN 位置编码_58,下式都成立:

YaRN 位置编码_YaRN 位置编码_59

推导证明

如果说我们能够找到一个不依赖变量YaRN 位置编码_循环神经网络_60的一个转换矩阵YaRN 位置编码_词向量_61,那么上面公式就是成立。

首先我们假设如下

YaRN 位置编码_YaRN 位置编码_62

其中,YaRN 位置编码_词向量_63表示YaRN 位置编码_YaRN 位置编码_64的全零矩阵,主对角线上的YaRN 位置编码_循环神经网络_65个转置后的旋转矩阵YaRN 位置编码_循环神经网络_66,单独拿出第YaRN 位置编码_循环神经网络_67个定义如下:(需要证明YaRN 位置编码_循环神经网络_67YaRN 位置编码_循环神经网络_60无关)

YaRN 位置编码_循环神经网络_70

这里YaRN 位置编码_像素点_71是个系数,表示转换矩阵在不同的位置的编码频率。

现在,我们将上面的公式重新整理为需要证明的形式:
YaRN 位置编码_像素点_72
因为转换矩阵中有很多YaRN 位置编码_YaRN 位置编码_64的全零矩阵,在矩阵相乘的时候会有如下的对位关系。

YaRN 位置编码_词向量_74

所以只需要考虑对角线位置的矩阵乘法即可。

YaRN 位置编码_词向量_75

所以YaRN 位置编码_YaRN 位置编码_76。我们通过这个这个结论和YaRN 位置编码_YaRN 位置编码_77的定义,重新写一遍转换矩阵,我们能得到:

YaRN 位置编码_像素点_78

因为YaRN 位置编码_YaRN 位置编码_77这个编码频率只和编码矩阵的维度序号有关(不同维度的编码有着不同的波长,与输入的位置无关YaRN 位置编码_循环神经网络_80),所以我们可以得到结论:这样,YaRN 位置编码_像素点_81 完全由YaRN 位置编码_循环神经网络_67YaRN 位置编码_词向量_49以及YaRN 位置编码_YaRN 位置编码_56指定,而且只依赖于它们。序列内的位置YaRN 位置编码_循环神经网络_60不是一个针对于变换矩阵的变量。

1.6 一些备注说明

也可以采用训练的YaRN 位置编码_YaRN 位置编码_86,但是试验结果表明相差不大,因此论文选择了sin position embedding,因为

  • 这样可以直接计算YaRN 位置编码_YaRN 位置编码_87而不需要训练,减少了训练参数
  • 这样允许模型将YaRN 位置编码_YaRN 位置编码_87扩展到超过了training set中最长position的position,例如测试集中出现了更大的position,sin/cos YaRN 位置编码_YaRN 位置编码_87依然可以给出结果,但不存在训练到的embedding。

2 一些个人理解

大家也可以看到关于position embedding通常是一个训练的输入信息强化向量,但是其只是extra features,有该信息会更好,但是没有性能也不会产生极大下降,因为RNN、CNN本身就能够捕捉到位置信息

因为模型不包括recurrence/convolution。在Transformer模型中,Position Embedding是位置信息的唯一来源,因此是该模型的核心成分,并非是辅助性质的特征。

ZZQ…

这也就代表了没有归纳偏置的融入,有好处也会有一些坏处

  • 好处:大部分论文中 都会有如下一个意思的表达,因为没有这些内容(归纳偏置)的融入,所以超越在有归纳偏置融入情况下的表现
  • 坏处:无约束的肆意妄为导致不容易训练和需要一定体量的数据才可能达到与没有归纳偏置融入情况下的表现

因此是无法捕捉到序列中顺序信息的,例如将YaRN 位置编码_YaRN 位置编码_90按行进行打乱,那么Attention之后的结果是一样的。

这里的一样指的是输出的元素一样,只是元素的位置发生了改变,在这里我举一个例子

YaRN 位置编码_词向量_91

没有位置编码的情况下,输入的顺序可以随意变换,结果没有影响的结论证明

公式1
YaRN 位置编码_YaRN 位置编码_92

公式2
YaRN 位置编码_词向量_93
总体来说,元素的位置改变了,但是值没有变,通过全连接是可以得到跟之前完全一样的结果,只需要改变对应的全连接的链接就可以了

这带来的结果就是,任意的输入顺序交换都可以带给网络最后的输出,且这个输出在理论上来说是没有区别的,只需要你去训练即可,全连接的连接点顺序发生变化罢了。

为了想要固定输入的有序性,融入位置编码,其实这个时候就已经将先验知识融入进去了(其实这里几有一个小问题,融入这个序列相邻的相关性是否也算是一种网络结构上的归纳偏置),也就是认为输入的顺序是不应该变化的。前文也已经看到了位置编码是怎么样子让输入固定的。

序列信息非常重要,代表着全局的结构,因此必须将序列的token相对或者绝对position信息利用起来。

总的来说

  • 加入YaRN 位置编码_YaRN 位置编码_94是否也意味着加入了衡量临近顺序的考量
  • 加入YaRN 位置编码_YaRN 位置编码_94在高纬度的时候是否有效(仅仅指图像此种对纵向维度有顺序考量的信号,高纬度后的频率编码较低几乎为单一常数)
  • 加入YaRN 位置编码_YaRN 位置编码_94在低纬度的时候不同YaRN 位置编码_循环神经网络_97是否实际的编码意义(编码频率非常低信息量基本被淹没在高频位置编码中)
  • 加入YaRN 位置编码_YaRN 位置编码_94在不同维度的内容是否会因为YaRN 位置编码_YaRN 位置编码_94向量所代表的的不同能量价值而出现不同的侧重性
  • 其所述的相对地址偏移的意义是否有实际的价值

Last、参考文献

一文读懂Transformer模型的位置编码 - 知乎Attention is all you needHands-on Machine Learning with Scikit Learn, Keras, TensorFlow: Concepts, Tools and Techniques to Build Intelligent Systems 2nd EditionLinear Relationships in the Transformer’s Positional EncodingTransformer Architecture: The Positional Encoding - Amirhossein Kazemnejad’s Blog