Transformer解析#1

谷歌的Transformer模型最早是用于机器翻译任务,当时达到了SOTA效果。Transformer中抛弃了传统的CNN和RNN,整个网络结构完全是由Attention机制组成。更准确地讲,Transformer由且仅由self-Attenion和Feed Forward Neural Network组成。一个基于Transformer的可训练的神经网络可以通过堆叠Transformer的形式进行搭建,作者的实验是通过搭建编码器和解码器各6层,总共12层的Encoder-Decoder,并在机器翻译中取得了BLEU值得新高。

1、Transform结构

将Transform模型看成是一个黑箱操作。在机器翻译中,就是输入一种语言,输出另一种语言。

transformer模型python transformer模型原理详解_transformer


其本质是Encoder-Decoder的结构。

Encoder-Decoder框架:
顾名思义也就是编码-解码框架,目前大部分attention模型都是依附于Encoder-Decoder框架进行实现,在NLP中Encoder-Decoder框架主要被用来处理序列-序列问题。也就是输入一个序列,生成一个序列的问题。这两个序列可以分别是任意长度。

Encoder-Decoder结构原理:

其由编码组件、解码组件和它们之间的连接组成:

transformer模型python transformer模型原理详解_transformer模型python_02


论文中所设置的,编码器由6个(无固定)编码block组成,同样解码器是6个解码block组成。与所有的生成模型相同的是,编码器的输出会作为解码器的输入。

所有的编码器在结构上都是相同的,但它们没有共享参数。每个解码器都可以分解成两个子层:自注意力(self-attention)层—>前馈(feed-forward)层。

transformer模型python transformer模型原理详解_transformer_03


Encoder如何编码:

编码方式有很多种,在文本处理领域主要有RNN/LSTM/GRU/BiRNN/BiLSTM/BiGRU,可按需选择。

以RNN为例,输入<x1,x2,x3,x4>,通过RNN生成隐藏层的状态值<h1,h2,h3,h4>,如何确定语义编码C呢?最简单的办法直接用最后时刻输出的ht作为C的状态值,这里也就是可以用h4直接作为语义编码C的值,也可以将所有时刻的隐藏层的值进行汇总,然后生成语义编码C的值,这里就是C=q(h1,h2,h3,h4),q是非线性激活函数。得到了语义编码C之后,就要在Decoder中对语义编码C进行解码。

Decoder:解码器,根据输入的语义编码C,然后将其解码成序列数据,解码方式也可以采用RNN/LSTM/GRU/BiRNN/BiLSTM/BiGRU。Decoder和Encoder的编码解码方式可以任意组合,并不是说我Encoder使用了RNN,Decoder就一定也需要使用RNN才能解码,Decoder可以使用LSTM,BiRNN等。

Decoder如何解码:
普通的Encoder-Decoder结构存在很多问题:
语义编码C是由输入序列X的每个单词经过Encoder 编码产生的,这意味着不论是生成哪个单词,y1,y2还是y3,其实输入序列X中任意单词对生成某个目标单词yi来说影响力都是相同的,没有任何区别(其实如果Encoder是RNN的话,理论上越是后输入的单词影响越大,并非等权的,估计这也是为何Google提出Sequence to Sequence模型时发现把输入句子逆序输入做翻译效果会更好的小Trick的原因)

将整个序列的信息压缩在了一个语义编码C中来记录整个序列的信息,如果是长序列,那么只是用一个语义编码C来表示整个序列的信息肯定会损失很多信息,而且序列一长,就可能出现梯度消失问题。
由此,基于Encoder-Decoder的attention model就出现了。

Attention Model 注意力机制

transformer模型python transformer模型原理详解_transformer_04


此时再预测Y1时,可能Y1的注意力是放在C1上,就用C1作为语义编码,当预测Y2时,Y2的注意力集中在C2上,就用C2作为语义编码,以此类推。

如何确定使用C1C2C3,此时转换为一个概率问题,目标句子中的每个单词都应该学会其对应的源语句子中单词的注意力分配概率信息。这意味着在生成每个单词Yi的时候,原先都是相同的中间语义表示C会替换成根据当前生成单词而不断变化的Ci。理解AM模型的关键就是这里,即由固定的中间语义表示C换成了根据当前输出单词来调整成加入注意力模型的变化的Ci。可表示为对应的隐藏层的值h乘以注意力分配概率分布值累积加权求和。

decoder上一时刻的输出值Yi-1与上一时刻传入的隐藏层的值Si-1通过RNN生成Hi,然后计算Hi与h1,h2,h3…hm的相关性,得到相关性评分[f1,f2,f3…fm],然后对Fi进行softmax就得到注意力分配αij。然后将encoder的输出值h与对应的概率分布进行点乘求和,就能得到注意力attention值了。

Attention解析
Attention就是一种权重参数的分配机制,目标是协助模型捕捉重要信息。即给定一组<key,value>,以及一个目标(查询)向量query,attention机制就是通过计算query与每一组key的相似性,得到每个key的权重系数,再通过对value加权求和,得到最终attention数值。

Attention计算三阶段

1、计算Query和Key的相似性得分

3种方法:

点积:Query和Keyi进行点积(Transformer中就是用的这种方法)

Cosine相似性-余弦相似度:

分子为两个向量Query与Key的点积

分母为两个向量的L2范数,(L2范数:指向量各元素的平方和然后求平方根)

transformer模型python transformer模型原理详解_权重_05


2、相似性得分进行数值转换

引入类似SoftMax的计算方式对第一阶段的相似性得分进行数值转换,进行归一化,将原始计算分值整理成所有元素权重之和为1的概率分布;并突出重要元素的权重。ai 即为 Valuei对应的权重系数:

transformer模型python transformer模型原理详解_深度学习_06


3、加权求和

将权重系数 ai进行加权求和即可得到Attention数值:

transformer模型python transformer模型原理详解_深度学习_07


总结

transformer模型python transformer模型原理详解_权重_08