【NLP】Transformer详解

  Transformer在Google的一篇论文Attention is All You Need被提出,为了方便实现调用Transformer Google还开源了一个第三方库,基于TensorFlow的Tensor2Tensor,一个NLP的社区研究者贡献了一个Torch版本的支持:guide annotating the paper with PyTorch implementation。Transformer模型最早是用于机器翻译任务,当时达到了SOTA效果。Transformer改进了RNN最被人诟病的训练慢的缺点,利用self-attention机制实现快速并行。并且Transformer可以增加到非常深的深度,充分发掘DNN模型的特性,提升模型准确率。

编码器

一、Transformer

1、结构图
(1)首先将这个模型看成是一个黑箱操作。在机器翻译中,就是输入一种语言,输出另一种语言。
【NLP】Transformer详解_第1张图片
(2)黑箱由编码组件、解码组件和它们之间的连接组成。
【NLP】Transformer详解_第2张图片
(3)编码组件部分由一堆编码器(encoder)构成(论文中是将6个编码器叠在一起——数字6没有什么神奇之处,你也可以尝试其他数字)。解码组件部分也是由相同数量(与编码器对应)的解码器(decoder)组成的。
【NLP】Transformer详解_第3张图片
(4)进一步对编码器进行分解。所有的编码器在结构上都是相同的,但它们没有共享参数。每个解码器都可以分解成两个子层。从编码器输入的句子首先会经过一个自注意力(self-attention)层,这层帮助编码器在对每个单词编码时关注输入句子的其他单词。
自注意力层的输出会传递到前馈(feed forward neural network)神经网络中。每个位置的单词对应的前馈神经网络都完全一样(译注:另一种解读就是一层窗口为一个单词的一维卷积神经网络)。
【NLP】Transformer详解_第4张图片
(5)进一步对解码器进行分解。解码器中也有编码器的自注意力(self-attention)层和前馈(feed-forward)层。除此之外,这两个层之间还有一个注意力层,用来关注输入句子的相关部分(和seq2seq模型的注意力作用相似)。
【NLP】Transformer详解_第5张图片
2、将张量引入模型结构
我们已经了解了模型的主要部分,接下来我们看一下各种向量或张量(译注:张量概念是矢量概念的推广,可以简单理解矢量是一阶张量、矩阵是二阶张量。)是怎样在模型的不同部分中,将输入转化为输出的。
(1)首先将每个输入单词通过词嵌入算法转换为词向量。每个单词都被嵌入为512维的向量,我们用这些简单的方框来表示这些向量。
在这里插入图片描述
词嵌入过程只发生在最底层的编码器中。所有的编码器都有一个相同的特点,即它们接收一个向量列表,列表中的每个向量大小为512维。在底层(最开始)编码器中它就是词向量,但是在其他编码器中,它就是下一层编码器的输出(也是一个向量列表)。向量列表大小是我们可以设置的超参数——一般是我们训练集中最长句子的长度。
(2)将输入序列进行词嵌入之后,每个单词都会流经编码器中的两个子层。在这里输入序列中每个位置的单词都有自己独特的路径流入编码器。在自注意力层中,这些路径之间存在依赖关系。而前馈(feed-forward)层没有这些依赖关系。因此在前馈(feed-forward)层时可以并行执行各种路径。
【NLP】Transformer详解_第6张图片3、多个编码器结构
如上述已经提到的,一个编码器接收向量列表作为输入,接着将向量列表中的向量传递到自注意力层进行处理,然后传递到前馈神经网络层中,将输出结果传递到下一个编码器中。输入序列的每个单词都经过自编码过程。然后,他们各自通过前向传播神经网络(这个过程可以并行)——完全相同的网络,而每个向量都分别通过它。
【NLP】Transformer详解_第7张图片

二、自注意力机制(seft-attention)

1、从宏观视角看自注意力机制
例如,下列句子是我们想要翻译的输入句子:The animal didn’t cross the street because it was too tired.

  • 当模型处理这个单词“it”的时候,自注意力机制会允许“it”与“animal”建立联系。
  • 随着模型处理输入序列的每个单词,自注意力会关注整个输入序列的所有单词,帮助模型对本单词更好地进行编码。
  • RNN维持隐藏层的处理方法,是将它已经处理过的前面的所有单词/向量的表示与它正在处理的当前单词/向量结合起来。而自注意力机制会将所有相关单词的理解融入到正在处理的单词中。
    【NLP】Transformer详解_第8张图片

2、seft-attention原理
(1)从每个编码器的输入向量(每个单词的词向量)中生成三个向量。
也就是说对于每个单词,我们创造一个查询向量、一个键向量和一个值向量。这三个向量是通过词嵌入与三个权重矩阵后相乘创建的。
可以发现这些新向量在维度上比词嵌入向量更低。他们的维度是64,而词嵌入和编码器的输入/输出向量的维度是512。但实际上不强求维度更小,这只是一种基于架构上的选择,它可以使多头注意力(multiheaded attention)的大部分计算保持不变。
【NLP】Transformer详解_第9张图片
(2)计算每个词与Thinking得分
假设计算第一个词“Thinking”的自注意力向量,需要拿输入句子中的每个单词对“Thinking”打分。这些分数决定了在编码单词“Thinking”的过程中有多重视句子的其它部分。
这些分数是通过打分单词(所有输入句子的单词)的键向量与“Thinking”的查询向量相点积来计算的。所以如果我们是处理位置最靠前的词的自注意力的话,第一个分数是q1和k1的点积,第二个分数是q1和k2的点积。
【NLP】Transformer详解_第10张图片
(3)将分数除以8
8是论文中使用的键向量的维数64的平方根,这会让梯度更稳定。这里也可以使用其它值,8只是默认值
(4)softmax归一化
然后通过softmax传递结果。softmax的作用是使所有单词的分数归一化,得到的分数都是正值且和为1。
【NLP】Transformer详解_第11张图片
(5)值向量与softmax分数相乘
将每个值向量乘以softmax分数(这是为了准备之后将它们求和)。得到每个词的甲醛值向量。这里的直觉是希望关注语义上相关的单词,并弱化不相关的单词(例如,让它们乘以0.001这样的小数)。
(6)对加权值向量求和
自注意力的另一种解释就是在编码某个单词时,就是将所有单词的表示(值向量)进行加权求和,而权重是通过该词的表示(键向量)与被编码词表示(查询向量)的点积并通过softmax得到。然后即得到自注意力层在该位置的输出(Thinking).【NLP】Transformer详解_第12张图片
自注意力的矩阵表示
【NLP】Transformer详解_第13张图片
【NLP】Transformer详解_第14张图片
3、“多头”注意力机制
“多头”注意机制下,我们为每个头保持独立的查询/键/值权重矩阵,从而产生不同的查询/键/值矩阵。和之前一样,我们拿X乘以WQ/WK/WV矩阵来产生查询/键/值矩阵。经过八次不同的权重矩阵运算,会得到八个不同的Z矩阵。自注意力的输出只有一个Z。所以引入权重矩阵W。
(1)将多个注意力头进行矩阵拼接
(2)拼接后乘以权重矩阵W。得到与输入矩阵X相同维度的输出矩阵Z
(3)Z融合所有注意力头信息,作为注意力的输出,传入到前馈神经网络

【NLP】Transformer详解_第15张图片
【NLP】Transformer详解_第16张图片
【NLP】Transformer详解_第17张图片
多个注意力头的矩阵形式:
【NLP】Transformer详解_第18张图片

三、输入词向量引入位置编码

为了让模型理解单词的顺序。除了词嵌入向量,Transformer为每个词嵌入增加了位置向量,位置向量采用余弦、正弦函数对句子进行编码得到。
【NLP】Transformer详解_第19张图片
如果假设词嵌入的维数为4,则实际的位置编码如下:
【NLP】Transformer详解_第20张图片
如,20字(行)的位置编码,词嵌入大小为512(列),位置编码的颜色表示如下图。每行包含512个值,每个值介于-1到1之间。他们从中间分裂成凉拌,第一行有250个0,256个1。这是因为左半部分的值有正弦函数生产,右半部分由余弦函数生产,将他们拼接在一起得到每一个位置向量编码。
【NLP】Transformer详解_第21张图片

四、残差

编码器架构中的细节:在每个编码器中的每个子层(自注意力、前馈网络)的周围都有一个残差连接,并且都跟随着一个“层-归一化”步骤。
【NLP】Transformer详解_第22张图片
进一步展开求和与归一化层:
【NLP】Transformer详解_第23张图片

解码器

顶端编码器的输出之后会变转化为一个包含向量K(键向量)和V(值向量)的注意力向量集 。这些向量将被每个解码器用于自身的“编码-解码注意力层”,而这些层可以帮助解码器关注输入序列哪些位置合适:
【NLP】Transformer详解_第24张图片

模型训练

1、解码器输入
模型的输出词表在训练治安的预处理流程中就被设定了。使用一个相同狂赌的向量表示词表中的每一个单词(one-hot编码)。
【NLP】Transformer详解_第25张图片
2、模型输出
这个模型一次只产生一个输出,假设模型只选择概率最高的单词,并把剩下的词抛弃(贪婪编码)。在一个足够大的训练集上充分训练后,模型输出的概率分布:
【NLP】Transformer详解_第26张图片

损失函数

一个简单的例子——把“merci”翻译为“thanks”。
1、模型的参数(权重)随机初始化生成
2、(未经训练的)模型产生的概率分布在每个单词的词向量单元格里都赋予了随机的数值。
3、用真实的输出与预测数据进行交叉熵损失计算。
4、用反向传播算法调整所以模型参数权重
5、参数不断迭代,生产更接近结果的输出。
【NLP】Transformer详解_第27张图片

参考文献:
1、The Illustrated Transformer:https://jalammar.github.io/illustrated-transformer/
2、图解Transformer(完整版):https://blog.csdn.net/longxinchen_ml/article/details/86533005

你可能感兴趣的:(NLP)