NLP入门(4)— Self-attention & Transformer

前言

上一期介绍了Seq2Seq Model,这样一个思想可以说是经久不衰。不过即便如此,以RNN为基础结构的Model也有存在的一些问题,这也促使急需有新的模型能够对它的地位发起挑战。本篇博客就来介绍近几年大火的NLP模型Transformer

Self-attention

要想认识Transformer,那么先得从它内部最核心的结构说起,也就是这个Self-attention结构。

RNN存在的问题

前面的博客有说到RNN存在的一些问题,不过对于Seq2Seq Model来说,主要的遗憾是在 只有等待上一个输入运算结束才能进行下一轮运算,不能进行并行计算。这样导致的结果就是如果序列比较长,那么运算时间将会非常长,同时由于整个过程相当于是串行进行的,所以不能使用并行计算进行加速。

一种被提出的解决方案是用CNN来代替RNN,这样相邻输入序列之间可以进行运算,实现能够并行计算的特点。但是在低层中每个卷积神经元无法考虑到所有输入序列,这种情况在高层可以看作是一定程度上能够消除的问题。
在这里插入图片描述

Attention is all you need

谷歌提出的基于attention机制提出的Self-attention机制解决了上面提到的问题。用提出的Self-attention Layer来代替原来的RNN,能够实现并行计算输出序列。
在这里插入图片描述
具体的运算机制如下:

  1. 输入的序列x首先经过embedding处理得到向量a;
  2. 得到的向量再分别进行不同的变换(即乘上不同的矩阵)产生三个不同的向量(q,k,v);
    在这里插入图片描述
  3. q对k进行attention操作:q对每一个k计算匹配度(论文采用向量内积即计算余弦相似度),然后通过softmax计算出权重α,最后权重与对应的v相乘再求和得到q对应的输出b。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

不同的b是由不同的α和相同的v计算得到,而不同的α是由相同的k和不同的q得到的。总的来看可以化为矩阵乘法,可以用GPU进行加速
在这里插入图片描述

其他细节

Multi-head的思想:不同的head可以有不同的关注点,将单个q分为多部分分别计算不同的权重。
在这里插入图片描述
另外可以注意到的是,我们的每一个输入都会参与到Self-attention的计算当中,因此在这个结构当中,所有输入都是“天涯若比邻”的关系,这样的好处就是可以学习尽可能长的上下文信息

但是这种关系也存在一个问题:在上面的运算过程中,没有考虑到输入序列的顺序,这样的话就不能称作一个序列,只是一堆词语丢进去罢了。因此需要在输入端再添加一个Positional Encoding操作,论文当中是手动进行标注的,也可以是通过数据进行学习的。关于位置编码,其实作者对于奇偶数位是有所区别的,偶数位置用sin,奇数位置用cos计算,得到-1到1之间的值
在这里插入图片描述
对于attention-based model,只要将encoder和decoder部分全部替换为Self-attention Layer即可
在这里插入图片描述

Transformer

介绍完核心结构,那么Transformer就很好理解了。基于上面提到的思路,谷歌提出了Transformer结构,本质上也是一个Seq2Seq Model。

以机器翻译为例,在训练过程中先在encoder端输入需要翻译的文本,之后在decoder端依次输入最终结果进行训练,即采用Teacher Forcing。

下面放上详细结构来作讨论。
在这里插入图片描述

Encoder结构

  1. 首先输入会经过一层embedding操作,转换为词向量;然后再进行位置编码,之后进入网络。
  2. 进入一层Multi-Head Attention,之后的输出会经过Add&Norm处理。这里首先是进行残差连接,将网络输入与输出加上,再通过Layer Norm运算输出到下一层。Layer Norm即对矩阵纵向的各个维度进行归一化处理
  3. 之后经过一个全连接前向神经网络,包括两个线性变换和一个ReLU激活输出。然后再进行一次Add&Norm处理。最后的输出连向decoder部分。
    在这里插入图片描述

Decoder部分

  1. 与encoder部分一样,输入先得到词向量,再进行位置编码进入网络。
  2. 经过一层Maked Multi-Head Attention,也是计算输入的self-attention,但是因为是正在生成的过程,因此对于时刻 i ,大于 i 的时刻都还没有生成结果,只有小于 i 的时刻有结果,因此需要做Mask操作:只对时刻i之前的时刻输入进行attention计算
  3. 经过残差和归一化处理后,和encoder的输出一同经过Multi-Head Attention,encoder输出作为k和v,而decoder上一层输出作为q
  4. 之后处理和encoder一样。decoder最终的输出再经过一个线性层投影到one-hot的维度,最后经过softmax层计算最后的概率
    在这里插入图片描述

这样,Transformer结构就全部介绍完毕,虽然刚开始看着比较复杂,但实际上内部组成还是很好理解的。

总结

本篇博客介绍了近年来大火的Transformer结构,下一篇将会介绍以此结构为基础产生的预训练模型们,它们现在已经成为了NLP领域的主流模型了。

参考资料

李宏毅 深度学习19(完整版)国语