赞
踩
目录
transformer模型来自与2017年谷歌发表的《attention is all you need》这一篇论文上,感兴趣的朋友可以看看这篇论文。接下来根据数据流的走向来解释transformer模型的工作流程。
首先来看一下transformer的模型结构,该模型主要继承了编码器(encoder)、解码器(decoder)的结构,输入进行了位置编码,为了能提取到输入的位置前后信息,输出通过softmax层获取输出信息的概率,取概率最大作为对应信息的输出。
位置编码的作用是获取文字之间的顺序关系,因为文字是有上下文关系的,所以位置信息很重要,但transformer用到的attention机制是没有考虑语序关系的,因此要通过位置编码将位置信息嵌入到词向量里。
编码器输入的位置编码和解码器输入的位置编码方法是一样的,不一样的可能是最大句子长度不一样。位置编码千千万万种,而且是可以训练的,个人认为没必要深入研究。这里transformer的正余弦位置编码,公式如下:
PE(pos,2i)=sin(pos/100002i/dmodel)
PE(pos,2i+1)=cos(pos/100002i/dmodel)
其中:
PE是正余弦位置编码的结果,矩阵形状一般是(最大句子长度,词向量维度);
pos是绝对位置编码(就是根据文字排列顺序编码为0, 1, 2, ....,一直到最大句子长度),是在句子长度的维度上计算;
2i和2i+1是为了分出奇数位和偶数位,i的取值范围是dmodel/2
dmodel
sin和cos是在词向量的维度是进行计算,偶数位用sin,奇数位用cos,交替使用是为了PE值的周期更长。
正余弦位置编码的优点:
1、可以使PE分布在区间;
2、不同语句相同位置的字符PE值一样(如:当pos都为0时,PE都为0);
3、数值比词向量的数值小很多,对模型的干扰较小;
multi-head-attention的作用是提取词与词之间的注意力信息(也就是提取输入句子的信息),用其代替RNN(LSTM)的原因是解决了RNN(LSTM)长序列信息提取受限的问题和不能并行运算,速度慢的问题。
multi-head-attention是transformer的核心,其原理并不难,公式如下:
Attention(Q,K,V)=softmax(QKT√dk)V
其中:
Q,K,V是三个形状相同的矩阵,分别由输入词向量X乘上一个权重矩阵WQ
dk
softmax()的作用是归一化,形成注意力的权重。
接下来分析数据的注意力计算过程:
1、首先将输入向量(数据张量形状一般为[批数,最大序列长度,词向量维度])分别乘以三个权重矩阵得到Q,K,V(其形状的最后一个维度可能发生改变,因为多头注意力会把这个维度分成多个并行计算提高数度,无法整除的话会舍弃余数部分,所以可能会改变。)。过程中的三个权重矩阵作用是存储当前提取到的信息,而且Q,K,V的值是不同的,这样可以提高模型泛化能力。至于为什么将一个输入变成三个输入Q,K,V下面会解释。
2、接着将Q与K进行矩阵相乘便得到每个词对于自己和上下文的一个注意力关系(数据张量应该为[批数,最大序列长度,最大序列长度]),选取其中一个数据举例(张量形状为[最大序列长度,词向量维度])如下图所示:
图中第一行表示“大”对自己的注意力数值为12、对“家”的注意力数值为14,以此类推。再经过softmax函数后得到注意力权重。最后一维也就是每一行的权重值之和为1,表示每个字对自己和上下文的注意力程度。除以√dk
3、得到注意力权重后需要加入掩码,作用是将填充符(句子长度小于最大序列长度时需要填充符填充,通常用0值表示填充符)部分的注意力设置为0。
4、既然上一步只用Q和K就能得到注意力权重了,那么V用来干嘛呢?V的作用是将得到的注意力权重用在输入信息上,通过加权求和的方式提取相应的信息,同时使此时的数据形状变回原来Q,K,V的数据形状。
在得到含注意力信息的向量表示后,还需要加一层全连接层调整最后一层的维度使其与词向量维度相同,避免出现在步骤1中提到的最后一个维度发生改变的情况。接着还要设置学习率,为了模型能更好的拟合。到此便完成了注意力计算过程。
5、步骤1提到的多头注意力就是将整个数据分成多分(张量形状为[批数,分的份数,最大序列长度,分开后最后一维整除得的维数])。这么做得目的是将词向量的维度拆成多份,提高计算速度,因为矩阵的运算是并行的。改成多头注意力需要对注意力机制的整个数据流形状进行调整,大体上不发生改变。咱们看看李宏毅老师的图解,图中分成了4个头。
多头注意力机制的优点:
1、可以批量一次性输入,全程采用矩阵计算,大大的提高了运算速度。
2、相比与RNN(LSTM),不再受到序列长度的限制,可以提取整条序列的上下文信息。
多头注意力机制的缺点:
1、无法获取位置信息,所以需要加入位置编码弥补。
2、无法进行非线性运算提取对应的信息,所以要经过前馈神经网络弥补。
Add很简单,就是将当前这一步骤得到的结果与输入相加,这么做的原因是利用残差结果解决梯度消失的问题。如果每层的输出都加上一个x的时候,就变成了F(x)+x,对x求导结果为1,所以就相当于每一层求导时都加上了一个常数项‘1’。
Nrom用的是LayerNrom,而不用BatchNorm的原因是只需要对词向量维度进行归一化,不需要对序列长度进行归一化,最长序列维度和词向量维度的分布不属于同一分布。(通俗来理解就是对于一句话来说,里面的每一个字或词是一个整体,一个字词的词向量就属于一个分布,而序列中字词之间是整体意义有关系,但词向量的某个维度间并没有直接的关系,比如每个字词的词向量第一个维度的数值组成的数据不属于同一个分布。每个词向量就是一个词向量层,所以选择用LayerNorm。)
前馈神经网络是最基础的神经网络,非常简单,这里用的是一个输入层和输出层的神经网络,激活函数是relu函数,该神经网络的作用是进行非线性运算,提取非线性信息。
编码器中的N在原论文中是6,意思就是六个编码器直接串联后再连接解码器。
由于在整个编码器过程中数据的张量形状不会发生改变,只需将前面搭建好的小模块拼接起来就行,有时候改改模块之间的顺序可能会有更好的效果。 编码器里用到的掩码机制只遮住了填充符部分,为了提高计算机的计算速度。
、
解码器与编码器的不同之处在于加了一层用于连接编码器信息的注意力机制模块,如上图中间模块的注意力机制,并且,该模块与其他注意力机制模块的不同之处是掩码机制不同,目的是为了防止解码器偷看到后面的序列信息,如下图所示,(右)遮掩后就不能获取到该时刻后面的序列注意力信息,达到防偷看的目的。不理解可以将掩码后的注意力矩阵带入到前文注意力机制第四步的计算原理图。
最后的全连接层是为了将维度拉回与词表相同长度的维度,为了接下来经过softmax层后得到的最大概率对应着词表中的某个词,多个时刻预测出多个词连起来便实现了文本生成功能。
实战代码:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。