2017年来自谷歌的Vaswani等人提出了Transformer模型[1],一种新颖的纯粹采用注意力机制实现的Seq2Seq架构,它具备并行化训练的能力,拥有非凡的性能表现,这些特点使它深受NLP研究人员们的喜欢,成为NLP领域的标志性模型之一。因此,当人们提到Transformer模型时,多头注意力机制(Multi-Head Attention)成为人们讨论最多的创新点,正如前面所说,这种机制让Transformer变得非常强大。
其实,原文使用到了一种非常有意思的技巧——Positional Encoding,中文翻译为位置编码。这个技巧,直观上非常容易理解,就是对序列中的词的位置进行编码。但是,原文并没有对这种新颖的位置编码方式作细致的讲解。对很多人来说,依然一头雾水。因此,本文旨在让大家真正理解位置编码的原理。
Why: 为什么需要位置编码?
为什么需要位置编码?引入位置编码主要归因于两方面:
(1)对于任何一门语言,单词在句子中的位置以及排列顺序是非常重要的,它们不仅是一个句子的语法结构的组成部分,更是表达语义的重要概念。一个单词在句子的位置或排列顺序不同,可能整个句子的意思就发生了偏差。
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.
上面两句话所使用的的单词完全一样,但是所表达的句意却截然相反。那么,引入词序信息有助于区别这两句话的意思。
(2)Transformer模型抛弃了RNN、CNN作为序列学习的基本模型。我们知道,循环神经网络本身就是一种顺序结构,天生就包含了词在序列中的位置信息。当抛弃循环神经网络结构,完全采用Attention取而代之,这些词序信息就会丢失,模型就没有办法知道每个词在句子中的相对和绝对的位置信息。因此,有必要把词序信号加到词向量上帮助模型学习这些信息,位置编码(Positional Encoding)就是用来解决这种问题的方法。
What: 位置编码是什么?
说了那么多,那它到底是什么?按照我个人的理解,位置编码(Positional Encoding)是一种用词的位置信息对序列中的每个词进行二次表示的方法。正如前文所述,Transformer模型本身不具备像RNN那样的学习词序信息的能力,需要主动将词序信息喂给模型。那么,模型原先的输入是不含词序信息的词向量,位置编码需要将词序信息和词向量结合起来形成一种新的表示输入给模型,这样模型就具备了学习词序信息的能力。
How: 怎么实现位置编码?
一种做法就是分配一个0到1之间的数值给每个时间步,其中,0表示第一个词,1表示最后一个词。这种方法虽然简单,但会带来很多问题。其中一个就是你无法知道在一个特定区间范围内到底存在多少个单词。换句话说,不同句子之间的时间步差值没有任何的意义。
另一种做法就是线性分配一个数值给每个时间步。也就是,1分配给第一个词,2分配给第二个词,以此类推。这种方法带来的问题是,不仅这些数值会变得非常大,而且模型也会遇到一些比训练中的所有句子都要长的句子。此外,数据集中不一定在所有数值上都会包含相对应长度的句子,也就是模型很有可能没有看到过任何一个这样的长度的样本句子,这会严重影响模型的泛化能力。
因此,一种好的位置编码方案需要满足以下几条要求:
- 它能为每个时间步输出一个独一无二的编码;
- 不同长度的句子之间,任何两个时间步之间的距离应该保持一致;
- 模型应该能毫不费力地泛化到更长的句子。它的值应该是有界的;
- 它必须是确定性的。
Transformer的作者们提出了一个简单但非常创新的位置编码方法,能够满足上述所有的要求。首先,这种编码不是单一的一个数值,而是包含句子中特定位置信息的
给定一个长度为
其中,频率
从函数定义中可以得出,频率沿向量维度减小。因此,它在波长上形成从
上图是长度为200、维度为150的序列转置后的位置矩阵PE,下图是
位置编码方法已经有了,那如何让每个词具有它们的位置信息?原始论文将位置编码加到模型输入之上。也就是,对于句子里的每个词
为了保证这种相加操作正确,让位置向量(PE)的维度等于词向量(WE)的维度,即
下面举一个简单的例子。给定一个长度为
词
More: 相对位置的线性关系
正弦曲线函数的位置编码的另一个特点是,它能让模型毫不费力地关注相对位置信息。这里引用原文的一段话:
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,can be represented as a linear function of.
我们选择正弦曲线函数,因为我们假设它能让模型很容易地学习关注相对位置,因为对于任何固定的偏移量,可以表示成的线性函数。
但是,为什么这句话能够成立呢?接下来,让我们证明位置编码中相对位置之间的线性关系[3]。
问题描述
让
其中,频率由下式计算得到:
论文认为,存在一个线性转置
推导证明
公式(5)是成立的,因为能够找到不依赖
其中,
矩阵
现在,我们将公式(5)重新整理为需要证明的形式:
展开(忽略
我们需要根据
将加法定理运用在展开式(即公式(8a)(8b))我们得到:
所以
其中,
参考资料
[1] Attention is all you need: https://arxiv.org/pdf/1706.03762.pdf
[2] Hands-on Machine Learning with Scikit Learn, Keras, TensorFlow: Concepts, Tools and Techniques to Build Intelligent Systems 2nd Edition: https://www.oreilly.com/library/view/hands-on-machine-learning/9781492032632/
[3] Linear Relationships in the Transformer’s Positional Encoding: https://timodenk.com/blog/linear-relationships-in-the-transformers-positional-encoding/