本文是对transformer的细节进行整理,主要有以下问题:
- Transformer为什么Q和K使用不同的权重矩阵生成,为何不能使用同一个值进行自身的点乘?
- 关于 self-attention 为什么要使用 Q、K、V,仅仅使用 Q、V/K、V 或者 V 为什么不行?
- transformer中的attention为什么scaled?
- Transformer计算attention的时候为何选择点乘而不是加法?两者计算复杂度和效果上有什么区别?
- 在计算attention score的时候如何对padding做mask操作?
- 为什么Transformer 需要进行 Multi-head Attention?
- self-attention 为什么它能发挥如此大的作用?
- 残差结构意义
- Transformer中的Mask矩阵已经有顺序了,能去掉position embedding吗?
- 为什么说 Transformer 可以代替 seq2seq?
- Transformer 相比于 RNN/LSTM,有什么优势?为什么?
Transformer为什么Q和K使用不同的权重矩阵生成,为何不能使用同一个值进行自身的点乘?
transformer中为什么使用不同的K 和 Q, 为什么不能使用同一个值? - TniL的回答 - 知乎
注解:简单回答就是,使用Q/K/V不相同可以保证在不同空间进行投影,增强了表达能力,提高了泛化能力。
关于 self-attention 为什么要使用 Q、K、V,仅仅使用 Q、V/K、V 或者 V 为什么不行?
这个问题我觉得并不重要,self-attention 使用 Q、K、V,这样三个参数独立,模型的表达能力和灵活性显然会比只用 Q、V 或者只用 V 要好些,当然主流 attention 的做法还有很多种,比如说 seq2seq with attention 也就只有 hidden state 来做相似性的计算,处理不同的任务,attention 的做法有细微的不同,但是主体思想还是一致的,不知道有没有论文对这个问题有过细究,有空去查查~
「其实还有个小细节,因为 self-attention 的范围是包括自身的(masked self-attention 也是一样),因此至少是要采用 Q、V 或者 K、V 的形式,而这样“询问式”的 attention 方式,个人感觉 Q、K、V 显然合理一些。」
transformer中的attention为什么scaled?
transformer中的attention为什么scaled? - TniL的回答 - 知乎
Transformer计算attention的时候为何选择点乘而不是加法?两者计算复杂度和效果上有什么区别?
最基础的 attention 有两种形式,一种是 Add(加性),一种是 Mul(点乘)
为了计算更快。矩阵加法在加法这一块的计算量确实简单,但是作为一个整体计算attention的时候相当于一个隐层,整体计算量和点积相似。在效果上来说,从实验分析,两者的效果和dk相关,dk越大,加法的效果越显著。论文中的实验图如下:
在计算attention score的时候如何对padding做mask操作?
为什么Transformer 需要进行 Multi-head Attention?
结合文章和论文看,主要回答以下问题:
- 不同头之间的差距有多少?是否随着层数的变化而变化?
有大量的paper表明,Transformer,或Bert的特定层是有独特的功能的,底层更偏向于关注语法,顶层更偏向于关注语义。那么我们假定:在同一层Transformer关注的方面是相同的,那么对该方面而言,不同的头关注点应该也是一样的。不过,在下图中也表明:同一层中,总有那么一两个头独一无二,和其他头的关注pattern不同。(从某个角度看,至少一个头的效果不如多几个头好,至于具体是几个head又是另一个问题了。)
论文《What Does BERT Look At? An Analysis of BERT’s Attention》中可视化表示:头之间的方差随着所在层数的增大而减小。但是这种差距有什么作用至今还没有得到解释。
- 同一层中,不同的头数量是否对有影响?
论文《Analyzing Multi-Head Self-Attention:
Specialized Heads Do the Heavy Lifting, the Rest Can Be Pruned》给出的结论是:只有一小部分头对翻译而言是重要的,其他的头都是次要的;重要的头有一种或多种专有的关注模式。
Transformer原论文中的结果,我们主要看base那一行和(A)组。对于PPL和BLEU,确是8个头/16个头最好,1个头最差,4个和32个头稍微差一点,但是差的不多。从这里来看,head也不是越多越好或者越少越好。
- 初始化如何影响?能否通过控制初始化去控制?
论文《Improving Deep Transformer with Depth-Scaled Initialization and Merged Attention》讨论了初始化对Transformer各层方差的影响,最终缓解梯度消失的问题。从这个角度讲,Transformer底层的头方差大是因为Transformer存在的梯度消失问题,也就是说,并不是模型自己觉得底层的方差大是好的,而是自己没有办法让它变好。所以,合理的初始化应该可以减少底层头的方差,提高效果。
从 为什么Transformer 需要进行 Multi-head Attention?整体来看:
Multi-Head其实不是必须的,去掉一些头效果依然有不错的效果(而且效果下降可能是因为参数量下降),这是因为在头足够的情况下,这些头已经能够有关注位置信息、关注语法信息、关注罕见词的能力了,再多一些头,无非是一种enhance或noise而已。
self-attention 为什么它能发挥如此大的作用
- self-attention 是一种自身和自身相关联的 attention 机制,这样能够得到一个更好的 representation 来表达自身;self-attention 可以捕获同一个句子中单词之间的一些句法特征(比如图 1 展示的有一定距离的短语结构)或者语义特征。
- 引入 Self Attention 后会更容易捕获句子中长距离的相互依赖的特征,因为如果是 RNN 或者 LSTM,需要依次序序列计算,对于远距离的相互依赖的特征,要经过若干时间步步骤的信息累积才能将两者联系起来,而距离越远,有效捕获的可能性越小。
- Self Attention 对于增加计算的并行性也有直接帮助作用。
残差结构意义
防止梯度消失,帮助深层网络训练
具体理论推导可以看看残差网络解决了什么,为什么有效?
Transformer中的Mask矩阵已经有顺序了,能去掉position embedding吗?
Transformer中的Mask矩阵已经有顺序了,能去掉position embedding吗?
总结一下,需要根据具体任务看position embedding,如果是序列任务,可能最好还是保留,如果对位置不敏感,去掉也是可以的。
另外,也有论文证明去掉position embedding在语言建模上提升性能
为什么说 Transformer 可以代替 seq2seq?
出处: 关于Transformer,面试官们都怎么问
简单点说,一方面是想想seq2seq有什么缺点,另一方面是transformer有什么优点?
- seq2seq缺少attention,不能关注重点。encoder的输出是所有信息都压缩到一个向量中,在序列比较长的时候,会损失encoder的一些信息,decoder不能够关注到其想要关注的信息。(后来有带attention+seq2seq的改进)
- transformer表达能力更强,通过自身和自身的关联,增强自身的表达度
- transformer有并行能力
这里用代替这个词略显不妥当,seq2seq 虽已老,但始终还是有其用武之地,seq2seq 最大的问题在于「将 Encoder 端的所有信息压缩到一个固定长度的向量中」,并将其作为 Decoder 端首个隐藏状态的输入,来预测 Decoder 端第一个单词(token)的隐藏状态。在输入序列比较长的时候,这样做显然会损失 Encoder 端的很多信息,而且这样一股脑的把该固定向量送入 Decoder 端,Decoder 端不能够关注到其想要关注的信息。
上述两点都是 seq2seq 模型的缺点,后续论文对这两点有所改进,如著名的Neural Machine Translation by Jointly Learning to Align and Translate,虽然确确实实对 seq2seq 模型有了实质性的改进,但是由于主体模型仍然为 RNN(LSTM)系列的模型,因此模型的并行能力还是受限,而 transformer 不但对 seq2seq 模型这两点缺点有了实质性的改进(多头交互式 attention 模块),而且还引入了 self-attention 模块,让源序列和目标序列首先“自关联”起来,这样的话,源序列和目标序列自身的 embedding 表示所蕴含的信息更加丰富,而且后续的 FFN 层也增强了模型的表达能力(ACL 2018 会议上有论文对 Self-Attention 和 FFN 等模块都有实验分析,见论文:How Much Attention Do You Need?A Granular Analysis of Neural Machine Translation Architectures),并且 Transformer 并行计算的能力是远远超过 seq2seq 系列的模型,因此我认为这是 transformer 优于 seq2seq 模型的地方。
Transformer 相比于 RNN/LSTM,有什么优势?为什么?
- RNN 系列的模型,并行计算能力很差
RNN 系列的模型时刻隐层状态的计算,依赖两个输入,一个是时刻的句子输入单词,另一个是时刻的隐层状态的输出,这是最能体现 RNN 本质特征的一点,RNN 的历史信息是通过这个信息传输渠道往后传输的。而 RNN 并行计算的问题就出在这里,因为时刻的计算依赖时刻的隐层计算结果,而时刻的计算依赖时刻的隐层计算结果,如此下去就形成了所谓的序列依赖关系。 - Transformer 的特征抽取能力比 RNN 系列的模型要好
上述结论是通过一些主流的实验来说明的,并不是严格的理论证明,具体实验对比可以参见:
放弃幻想,全面拥抱 Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较
但是值得注意的是,并不是说 Transformer 就能够完全替代 RNN 系列的模型了,任何模型都有其适用范围,同样的,RNN 系列模型在很多任务上还是首选,熟悉各种模型的内部原理,知其然且知其所以然,才能遇到新任务时,快速分析这时候该用什么样的模型,该怎么做好。