该篇文章是Transformer系列文章的第一篇,为什么要讲这个系列呢,因为一方面我们组最近正在组织分享,近期分享的宗旨就是让大家能够最终理解Bert是如何运作的,那起初会由浅入深的从seq2seq、Attention等方面逐步的介绍;另一方面结合最近看的一些论文和参加的线下技术沙龙来看,Attention机制目前已经逐渐成为了搜索、推荐、广告领域模型的标配,目前我们组也在进行相关的调研,结合上述这些原因,想对transformer的相关内容进行学习整理,话不多说接下来进入正题。本文内容主要参考博文:Visualizing A Neural Machine Translation Model (Mechanics of Seq2seq Models With Attention)jalammar.github.io
Attention详解
1、seq2seq模型
seq2seq模型主要完成如下任务:输入一个item(如单词、字母、图片特征等)序列,在此基础上输出另外一个item序列,例如在机器翻译领域,一个seq2seq模型可能如下所示:seq2seq模型https://www.zhihu.com/video/1182069993642033152
具体的一个seq2seq模型主要包含两个部分:encoder和decoder。encoder首先处理输入序列中的每一个item(需要做embeeding处理),并且将其转换成一个向量(context向量),然后encoder将context向量传递给decoder,decoder根据context向量一个接一个的生成输出序列中的每个item。
2、RNN
这里的encoder和decoder都可以是RNN,RNN结构存在两个输入,一个是来自原始序列的输入,另外一个是hidden state,具体可以参考如下:RNN模型https://www.zhihu.com/video/1182070201495023616
更具体的可以参考如下机器翻译的例子encoder-decoder结构https://www.zhihu.com/video/1182070287331479552encoder-decoder结构https://www.zhihu.com/video/1182070329857507328
整个过程其实是非常清晰的,大致了解了seq2seq模型之后,接下来正式介绍Attention机制
3、Attention
从上面的encoder和decoder结构seq2seq模型可以发现,encoder只把最后一个hidden state作为context向量喂给decoder,所以这种结构在处理长句子翻译问题的时候表现并不好。为解决这个问题,Attention应运而生,Attention使得模型能够关注输入序列中与目标相关的部分。Attention模型与传统的seq2seq模型主要有以下两点的不同:
a)encoder传递给decoder的信息更加丰富,如上所述传统的seq2seq模型中encoder只将最后一个hidden state传递给decoder,而在Attention机制中,encoder将所有的hidden state传递给decoder
b)attention decoder在输出结果之前会做如下的一些操作,为了关注输入序列中与decoder此刻状态有关的部分,decoder具体做如下的操作:
1)对于每一个encoder的hidden state(每一个hidden state都和输入序列中一个具体的单词相关联)计算一个相关性得分(可以是内积、加权内积、加和等形式)
2)对上述各个hidden state的得分做softmax操作
3)将每一个hidden state与其对应的softmax操作后的分数相乘并相加(加权求和),得到context向量
具体上述过程如下所示:Attention操作https://www.zhihu.com/video/1182070495331184640
具体Attention的数学表述可以参考如下专栏文章:川陀学者:Attention机制详解(一)——Seq2Seq中的Attentionzhuanlan.zhihu.com
Decoder部分总体的流程如下:
a)第一个decoder RNN的输入为,并且初始化其输入所需的hidden state
b)RNN对输入进行处理得到对应的输出(舍弃)和新的hidden state(如h4)
c)Attention操作:利用encoder阶段的hidden state和h4按照上文提到的步骤计算得到context向量
d)将新的hidden state(h4)和context向量做concatenate
e)将拼接后的向量输入一个NN网络(该网络和整个模型是联合训练的)
f)NN的输出就是这一时刻对应的输出
g)将NN的输出输入下一个decoder,并循环进行上述步骤
上述内容就是Attention的具体操作,下一篇文章会具体介绍transformer模型中提出的self-attention机制。