赞
踩
transformer和LSTM最大的区别就是LSTM的训练是迭代的,无法并行训练,LSTM单元计算完T时刻信息后,才会处理T+1时刻的信息,T +1时刻的计算依赖 T-时刻的隐层计算结果。而transformer的训练是并行了,就是所有字是全部同时训练的,这样就大大加快了计算效率,transformer使用了位置嵌入(positional encoding)来理解语言的顺序,使用自注意力机制和全连接层进行计算。
相较于CNN依靠step的卷积,Transformer其能直接获取全局信息。
从直观讲,多头的注意力有助于网络捕捉到更丰富的特征/信息。论文原文如下:
Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions.
举例说明different representation subspaces。如图所示,在颜色方面更加关注鲜艳亮丽的文字,而在字体方面会去注意大的、粗体的文字。
这里的颜色和字体就是两个不同的表示子空间。同时关注颜色和字体,可以有效定位强调的内容。使用多头注意力,也就是综合利用各方面的信息/特征。
Transformer在训练时就是不断的在优化自己的多头注意力层,不断调整输入与输出之间的隐层特征,调整Q、K、V的权重矩阵,使其能够学习到复杂映射关系。
当 √dk 特别小的时候,其实除不除无所谓。无论编码器还是解码器Q、K矩阵其实本质是一个相同的矩阵。Q、K相乘其实相等于Q乘以Q的转置,这样造成结果会很大或者很小。小了还好说,大的话会使得后续做softmax继续被放大造成梯度消失,不利于梯度反向传播。
Transformer之所以能支持Decoder部分并行化训练,是基于以下两个关键点:
①teacher force
对于teacher force,是指在每一轮预测时,不使用上一轮预测的输出,而强制使用正确的单词,过这样的方法可以有效的避免因中间预测错误而对后续序列的预测,从而加快训练速度,而Transformer采用这个方法,为并行化训练提供了可能,因为每个时刻的输入不再依赖上一时刻的输出,而是依赖正确的样本,而正确的样本在训练集中已经全量提供了。值得注意的一点是:Decoder的并行化仅在训练阶段,在测试阶段,因为我们没有正确的目标语句,t时刻的输入必然依赖t-1时刻的输出,这时跟之前的seq2seq就没什么区别了。
②masked self attention
多头注意力意味着多组KQV进行self-attention运算,不同于LSTM中的一步步的按部就班的运算,而是KQV的运算可以是同时计算的(这是因为每QKV的线性变换不同,计算互不影响)
注意transformer的运算复杂度,乘法运算不一定比LSTM少,但因为可以进行同步运算,因而可以依靠硬件加速。
GPT 中训练的是单向语言模型,其实就是直接应用 Transformer Decoder; Bert 中训练的是双向语言模型,应用了 Transformer Encoder 部分,不过在 Encoder 基础上还做了 Masked 操作。
BERT Transformer 使用双向 self-attention,双向 self-attention的意思就是计算的att是针对整个句子。而 GPT Transformer 使用受限制的 self-attention,其中每个 token 只能处理其左侧的上下文。
BatchNorm是对一个batch-size样本内的每个特征做归一化,LayerNorm是对每个样本的所有特征做归一化。
形象点来说,假设有一个二维矩阵。列为batch-size,行为样本特征。那么BN就是竖着归一化,LN就是横着归一化。
它们的出发点都是让该层参数稳定下来,避免梯度消失或者梯度爆炸,方便后续的学习。但是也有侧重点。如果特征依赖于不同样本间的统计参数,那BN更有效。因为它抹杀了不同特征之间的大小关系,但是保留了不同样本间的大小关系。(CV领域)而在NLP领域,LN就更加合适。因为它抹杀了不同样本间的大小关系,但是保留了一个样本内不同特征之间的大小关系。对于NLP或者序列任务来说,一条样本的不同特征,其实就是时序上字符取值的变化,样本内的特征关系是非常紧密的。
自回归模型。
所谓自回归,即使用当前自己预测的字符再去预测接下来的信息。Transformer在预测阶段(机器翻译任务)会先预测第一个字,然后在第一个预测的字的基础上接下来再去预测后面的字,是典型的自回归模型。Bert中的Mask任务是典型的自编码模型,即根据上下文字符来预测当前信息。
Multi-Head Attention
单元的差异Transformer中有三个多头自注意力层,编码器中有一个,解码器中有两个。
A: 编码器中的多头自注意力层的作用是将原始文本序列信息做整合,转换后的文本序列中每个字符都与整个文本序列的信息相关。Encoder 的 Multi-Head Attention 中K=V=Q,都是输入序列的 embedding 矩阵。
B: 解码器的第一个多头自注意力层比较特殊,原论文给其起名叫Masked Multi-Head-Attention。其一方面也有上图介绍的作用,即对输入文本做整合(对与翻译任务来说,编码器的输入是翻译前的文本,解码器的输入是翻译后的文本)。另一个任务是做掩码,防止信息泄露。拓展解释一下就是在做信息整合的时候,第一个字符其实不应该看到后面的字符,第二个字符也只能看到第一个、第二个字符的信息,以此类推。Decoder 中提取 Outputs 序列 Multi-Head Attention。他的Q、K、V都是相同的。但是相比于 A 的 Attention,他多了 Mask 单元来防止 Outputs 序列发生泄漏。
C :解码器的第二个多头自注意力层与编码器的第一个多头自注意力层功能是完全一样的。不过输入需要额外强调下,我们都知道多头自注意力层是通过计算QKV三个矩阵最后完成信息整合的。在这里,Q是解码器整合后的信息,KV两个矩阵是编码器整合后的信息,是两个完全相同的矩阵。QKV矩阵相乘后,翻译前与翻译后的文本也做了充分的交互整合。至此最终得到的向量矩阵用来做后续下游工作。Decoder 中将输入序列与 Outputs 序列交叉的部分,所以他的上下文矩阵Q来自上一个 Decoder 的 Multi-Head Attention 单元的输出,K,V来自 encoder 的输出矩阵。
seq2seq最大的问题在于将Encoder端的所有信息压缩到一个固定长度的向量中,并将其作为Decoder端首个隐藏状态的输入,来预测Decoder端第一个单词(token)的隐藏状态。在输入序列比较长的时候,这样做显然会损失Encoder端的很多信息,而且这样一股脑的把该固定向量送入Decoder端,Decoder端不能够关注到其想要关注的信息。
Transformer不但对seq2seq模型这两点缺点有了实质性的改进(多头交互式attention模块),而且还引入了self-attention模块,让源序列和目标序列首先“自关联”起来,这样的话,源序列和目标序列自身的embedding表示所蕴含的信息更加丰富,而且后续的FFN层也增强了模型的表达能力,并且Transformer并行计算的能力远远超过了seq2seq系列模型。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。