transformer模型_一文读懂Transformer模型的位置编码

本文深入探讨Transformer模型中的位置编码,解释为何需要位置编码以保留词序信息,以及如何通过正弦和余弦函数实现位置编码。位置编码是一种将词在句子中的位置信息融入词向量的方法,使得模型能处理不同长度的句子并学习到序列结构。Transformer通过将位置编码加到词向量上,使模型具备捕捉相对位置的能力。
摘要由CSDN通过智能技术生成

f8a94aa6-7b13-eb11-8da9-e4434bdf6706.png

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的作者们提出了一个简单但非常创新的位置编码方法,能够满足上述所有的要求。首先,这种编码不是单一的一个数值,而是包含句子中特定位置信息的

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

给定一个长度为

的输入序列,让
表示词在序列中的位置,
表示
位置对应的向量,
是向量的维度。
是生成位置向量
的函数,定义如下:

其中,频率

定义如下:

从函数定义中可以得出,频率沿向量维度减小。因此,它在波长上形成从

几何级数。你也可以认为,位置编码
是一个包含每个频率的正弦和余弦对(注意
是能被2整除的)。

f9a94aa6-7b13-eb11-8da9-e4434bdf6706.png

上图是长度为200、维度为150的序列转置后的位置矩阵PE,下图是

所在的位置向量中的第
个分量位置的sin/cosine函数图像。图片来自
书籍[2]

位置编码方法已经有了,那如何让每个词具有它们的位置信息?原始论文将位置编码加到模型输入之上。也就是,对于句子里的每个词

,计算其对应的词嵌入
,然后按照下面的方法喂给模型:

为了保证这种相加操作正确,让位置向量(PE)的维度等于词向量(WE)的维度,即

下面举一个简单的例子。给定一个长度为

的输入序列
,词
及其对应的词向量
,其中,
。假设
,那么
。根据公式(1)计算
对应的位置向量:

最终被表示为:

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))我们得到:

所以

。我们将这个结果和公式(4)中的
应用到公式(7),我们能得到:

其中,

。这样,
完全由
以及
指定,而且只依赖于它们。序列内的位置
不是一个参数。

参考资料

[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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值