深度学习+面经Transformer 网络学习笔记

Posted Better Bench

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习+面经Transformer 网络学习笔记相关的知识,希望对你有一定的参考价值。

1 引言

Transformer中抛弃了传统的CNN和RNN,整个网络结构完全是由Attention机制组成。更准确地讲,Transformer主要由多头self-Attenion和Feed Forward Neural Network组成。一个基于Transformer的可训练的神经网络可以通过堆叠Transformer的形式进行搭建,作者的实验是通过搭建编码器和解码器各6层,总共12层的Encoder-Decoder,并在机器翻译中取得了BLEU值得新高。是一个典型的 encoder-decoder 模型。
作者采用Attention机制的原因是考虑到RNN(或者LSTM,GRU等)的计算限制为是顺序的,也就是说RNN相关算法只能从左向右依次计算或者从右向左依次计算,这种机制带来了两个问题:

  1. 时间片t 的计算依赖t-1 时刻的计算结果,这样限制了模型的并行能力;
  2. 顺序计算的过程中信息会丢失,尽管LSTM等门机制的结构一定程度上缓解了长期依赖的问题,但是对于特别长期的依赖现象,LSTM依旧无能为力。

Transformer的提出解决了上面两个问题,首先它使用了Attention机制,将序列中的任意两个位置之间的距离是缩小为一个常量;其次它不是类似RNN的顺序结构,因此具有更好的并行性,符合现有的GPU框架。

2 详解

参考详解Transformer (Attention Is All You Need)

3 优缺点

3.1 优点

(1)虽然Transformer最终也没有逃脱传统学习的套路,Transformer也只是一个全连接(或者是一维卷积)加Attention的结合体。但是其设计已经足够有创新,因为其抛弃了在NLP中最根本的RNN或者CNN并且取得了非常不错的效果,算法的设计非常精彩,值得每个深度学习的相关人员仔细研究和品位。
(2)Transformer的设计最大的带来性能提升的关键是将任意两个单词的距离是1,这对解决NLP中棘手的长期依赖问题是非常有效的。
(3)Transformer不仅仅可以应用在NLP的机器翻译领域,甚至可以不局限于NLP领域,是非常有科研潜力的一个方向。(4)算法的并行性非常好,符合目前的硬件(主要指GPU)环境。

3.2 缺点

(1)粗暴的抛弃RNN和CNN虽然非常炫技,但是它也使模型丧失了捕捉局部特征的能力,RNN + CNN + Transformer的结合可能会带来更好的效果。
(2)Transformer失去的位置信息其实在NLP中非常重要,而论文中在特征向量中加入Position Embedding也只是一个权宜之计,并没有改变Transformer结构上的固有缺陷。
(3)有些rnn轻易可以解决的问题transformer没做到,比如复制string,或者推理时碰到的sequence长度比训练时更长(因为碰到了没见过的position embedding)

4 应用领域

  • 自然语言处理NLP
  • 图像识别

An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale

  • 图像合成

Taming Transformers for High-Resolution Image Synthesis

  • 多目标追踪

TransTrack: Multiple-Object Tracking with Transformer

  • 音乐生成

Compound Word Transformer: Learning to Compose Full-Song Music over Dynamic Directed Hypergraphs

  • 舞蹈生成

Dance Revolution: Long-Term Dance Generation with Music via Curriculum Learning

  • 3D目标检测

Self-Attention Based Context-Aware 3D Object Detection

  • 点云处理

PCT: Point Cloud Transformer

  • 时序预测

Temporal Fusion Transformers for Interpretable Multi-horizon Time Series Forecasting

  • 视觉-语言建模

VinVL: Making Visual Representations Matter in Vision-Language Models

  • 车道形状预测

End-to-end Lane Shape Prediction with Transformers

  • 端到端目标检测

Deformable DETR: Deformable Transformers for End-to-End Object Detection

5 面经

5.1 第一部分

参考:https://zhuanlan.zhihu.com/p/363466672
1. Transformer为何使用多头注意力机制?(为什么不使用一个头)

答:多头可以使参数矩阵形成多个子空间,矩阵整体的size不变,只是改变了每个head对应的维度大小,这样做使矩阵对多方面信息进行学习,但是计算量和单个head差不多。

2. Transformer为什么Q和K使用不同的权重矩阵生成,为何不能使用同一个值进行自身的点乘?

答:请求和键值初始为不同的权重是为了解决可能输入句长与输出句长不一致的问题。并且假如QK维度一致,如果不用Q,直接拿K和K点乘的话,你会发现attention score 矩阵是一个对称矩阵。因为是同样一个矩阵,都投影到了同样一个空间,所以泛化能力很差。

3. Transformer计算attention的时候为何选择点乘而不是加法?两者计算复杂度和效果上有什么区别?

答:K和Q的点乘是为了得到一个attention score 矩阵,用来对V进行提纯。K和Q使用了不同的W_k, W_Q来计算,可以理解为是在不同空间上的投影。正因为 有了这种不同空间的投影,增加了表达能力,这样计算得到的attention score矩阵的泛化能力更高。

4. 为什么在进行softmax之前需要对attention进行scaled(为什么除以dk的平方根),并使用公式推导进行讲解

答:假设 Q 和 K 的均值为0,方差为1。它们的矩阵乘积将有均值为0,方差为dk,因此使用dk的平方根被用于缩放,因为,Q 和 K 的矩阵乘积的均值本应该为 0,方差本应该为1,这样可以获得更平缓的softmax。当维度很大时,点积结果会很大,会导致softmax的梯度很小。为了减轻这个影响,对点积进行缩放。

5. 在计算attention score的时候如何对padding做mask操作?

答:对需要mask的位置设为负无穷,再对attention score进行相加

6. 为什么在进行多头注意力的时候需要对每个head进行降维?

答:将原有的高维空间转化为多个低维空间并再最后进行拼接,形成同样维度的输出,借此丰富特性信息,降低了计算量

7. 大概讲一下Transformer的Encoder模块?

答:输入嵌入-加上位置编码-多个编码器层(每个编码器层包含全连接层,多头注意力层和点式前馈网络层(包含激活函数层))

8. 为何在获取输入词向量之后需要对矩阵乘以embedding size的开方?

embedding matrix的初始化方式是xavier init,这种方式的方差是1/embedding size,因此乘以embedding size的开方使得embedding matrix的方差是1,在这个scale下可能更有利于embedding matrix的收敛。

9. 简单介绍一下Transformer的位置编码?有什么意义和优缺点?

答:因为self-attention是位置无关的,无论句子的顺序是什么样的,通过self-attention计算的token的hidden embedding都是一样的,这显然不符合人类的思维。因此要有一个办法能够在模型中表达出一个token的位置信息,transformer使用了固定的positional encoding来表示token在句子中的绝对位置信息。

10. 你还了解哪些关于位置编码的技术,各自的优缺点是什么?

答:相对位置编码(RPE)1.在计算attention score和weighted value时各加入一个可训练的表示相对位置的参数。2.在生成多头注意力时,把对key来说将绝对位置转换为相对query的位置3.复数域函数,已知一个词在某个位置的词向量表示,可以计算出它在任何位置的词向量表示。前两个方法是词向量+位置编码,属于亡羊补牢,复数域是生成词向量的时候即生成对应的位置信息。

11. 简单讲一下Transformer中的残差结构以及意义。

答:encoder和decoder的self-attention层和ffn层都有残差连接。反向传播的时候不会造成梯度消失。

12. 为什么transformer块使用LayerNorm而不是BatchNorm?LayerNorm 在Transformer的位置是哪里?

答:多头注意力层和激活函数层之间。CV使用BN是认为channel维度的信息对cv方面有重要意义,如果对channel维度也归一化会造成不同通道信息一定的损失。而同理nlp领域认为句子长度不一致,并且各个batch的信息没什么关系,因此只考虑句子内信息的归一化,也就是LN。

13. 简答讲一下BatchNorm技术,以及它的优缺点。

答:批归一化是对每一批的数据在进入激活函数前进行归一化,可以提高收敛速度,防止过拟合,防止梯度消失,增加网络对数据的敏感度。

14. 简单描述一下Transformer中的前馈神经网络?使用了什么激活函数?相关优缺点?

答:输入嵌入-加上位置编码-多个编码器层(每个编码器层包含全连接层,多头注意力层和点式前馈网络层(包含激活函数层))-多个解码器层(每个编码器层包含全连接层,多头注意力层和点式前馈网络层)-全连接层,使用了relu激活函数

15. Encoder端和Decoder端是如何进行交互的?

答:通过转置encoder_ouput的seq_len维与depth维,进行矩阵两次乘法,即qkTv输出即可得到target_len维度的输出

16. Decoder阶段的多头自注意力和encoder的多头自注意力有什么区别?

答:Decoder有两层mha,encoder有一层mha,Decoder的第二层mha是为了转化输入与输出句长,Decoder的请求q与键k和数值v的倒数第二个维度可以不一样,但是encoder的qkv维度一样。

17. Transformer的并行化提现在哪个地方?

答:Transformer的并行化主要体现在self-attention模块,在Encoder端Transformer可以并行处理整个序列,并得到整个输入序列经过Encoder端的输出,但是rnn只能从前到后的执行

18. Decoder端可以做并行化吗?

训练的时候可以,但是交互的时候不可以

19. 简单描述一下wordpiece model 和 byte pair encoding,有实际应用过吗?

答“传统词表示方法无法很好的处理未知或罕见的词汇(OOV问题)
传统词tokenization方法不利于模型学习词缀之间的关系”
BPE(字节对编码)或二元编码是一种简单的数据压缩形式,其中最常见的一对连续字节数据被替换为该数据中不存在的字节。后期使用时需要一个替换表来重建原始数据。
优点:可以有效地平衡词汇表大小和步数(编码句子所需的token次数)。
缺点:基于贪婪和确定的符号替换,不能提供带概率的多个分片结果。

20. Transformer训练的时候学习率是如何设定的?Dropout是如何设定的,位置在哪里?Dropout 在测试的需要有什么需要注意的吗?

LN是为了解决梯度消失的问题,dropout是为了解决过拟合的问题。在embedding后面加LN有利于embedding matrix的收敛。

21. bert的mask为何不学习transformer在attention处进行屏蔽score的技巧?

答:BERT和transformer的目标不一致,bert是语言的预训练模型,需要充分考虑上下文的关系,而transformer主要考虑句子中第i个元素与前i-1个元素的关系。

5.2 第二部分

参考:https://cloud.tencent.com/developer/article/1597910
1. Transformer 的结构是什么样的?

答:Transformer 本身还是一个典型的 encoder-decoder 模型,如果从模型层面来看,Transformer 实际上就像一个 seq2seq with attention 的模型,下面大概说明一下 Transformer 的结构以及各个模块的组成。
(1)Encoder 端 & Decoder 端总览

  • Encoder 端由 N(原论文中「N=6」)个相同的大模块堆叠而成,其中每个大模块又由「两个子模块」构成,这两个子模块分别为多头 self-attention 模块,以及一个前馈神经网络模块;
  • Decoder 端同样由 N(原论文中「N=6」)个相同的大模块堆叠而成,其中每个大模块则由「三个子模块」构成,这三个子模块分别为多头 self-attention 模块,「多头 Encoder-Decoder attention 交互模块」,以及一个前馈神经网络模块
    (2)Encoder 端各个子模块之多头 self-attention 模块
    在介绍 self-attention 模块之前,先介绍 self-attention 模块,图示如下:

上述 attention 可以被描述为「将 query 和 key-value 键值对的一组集合映射到输出」,其中 query,keys,values 和输出都是向量,其中 query 和 keys 的维度均为,values 的维度为(论文中),输出被计算为 values 的加权和,其中分配给每个 value 的权重由 query 与对应 key 的相似性函数计算得来。这种 attention 的形式被称为“Scaled Dot-Product Attention”。
而多头 self-attention 模块,则是将通过参数矩阵映射后(给分别接一个全连接层),然后再做 self-attention,将这个过程重复(原论文中)次,最后再将所有的结果拼接起来,再送入一个全连接层即可,图示如下:

(3)Encoder 端各个子模块之前馈神经网络模块

前馈神经网络模块(即图示中的 Feed Forward)由两个线性变换组成,中间有一个 ReLU 激活函数,对应到公式的形式为:
论文中前馈神经网络模块输入和输出的维度均为,其内层的维度.
(4)Decoder 端各个子模块之多头 self-attention 模块
Decoder 端多头 self-attention 模块与 Encoder 端的一致,但是「需要注意的是 Decoder 端的多头 self-attention 需要做 mask,因为它在预测时,是“看不到未来的序列的”,所以要将当前预测的单词(token)及其之后的单词(token)全部 mask 掉。
(5)Decoder 端各个子模块之多头 Encoder-Decoder attention 交互模块
多头 Encoder-Decoder attention 交互模块的形式与多头 self-attention 模块一致,唯一不同的是其矩阵的来源,其矩阵来源于下面子模块的输出(对应到图中即为 masked 多头 self-attention 模块经过 Add & Norm 后的输出),而矩阵则来源于整个 Encoder 端的输出,仔细想想其实可以发现,这里的交互模块就跟 seq2seq with attention 中的机制一样,目的就在于让 Decoder 端的单词(token)给予 Encoder 端对应的单词(token)“更多的关注(attention weight)”
(6)Decoder 端各个子模块之多头前馈神经网络模块
该部分与 Encoder 端的一致
(7)Add & Norm 模块
Add & Norm 模块接在 Encoder 端和 Decoder 端每个子模块的后面,其中 Add 表示残差连接,Norm 表示 LayerNorm,残差连接来源于论文Deep Residual Learning for Image Recognition[1],LayerNorm 来源于论文Layer Normalization[2],因此 Encoder 端和 Decoder 端每个子模块实际的输出为:LayerNorm ,其中Sublayer 为子模块的输出。
(8)Positional Encoding
Positional Encoding 添加到 Encoder 端和 Decoder 端最底部的输入 embedding。Positional Encoding 具有与 embedding 相同的维度,因此可以对两者进行求和。需要注意的是,Transformer 中的 Positional Encoding 不是通过网络学习得来的,而是直接通过公式计算而来的,论文中也实验了利用网络学习 Positional Encoding,发现结果与上述基本一致,但是论文中选择了正弦和余弦函数版本,「因为三角公式不受序列长度的限制,也就是可以对 比所遇到序列的更长的序列 进行表示。

2. Transformer Decoder 端的输入具体是什么?

答:见上述 Encoder 端 & Decoder 端总览中,对 Decoder 端的输入有详细的分析

3. self-attention是什么?

答:self-attention,也叫 「intra-attention」,是一种通过自身和自身相关联的 attention 机制,从而得到一个更好的 representation 来表达自身,self-attention 可以看成一般 attention 的一种特殊情况。在 self-attention 中,,序列中的每个单词(token)和该序列中其余单词(token)进行 attention 计算。self-attention 的特点在于「无视词(token)之间的距离直接计算依赖关系,从而能够学习到序列的内部结构」,实现起来也比较简单,值得注意的是,在后续一些论文中,self-attention 可以当成一个层和 RNN,CNN 等配合使用,并且成功应用到其他 NLP 任务。

4. 关于 self-attention 的计算过程?

答:问题 1 中有详细的解答

5. 关于 self-attention 为什么它能发挥如此大的作用

答:在上述 self-attention 的介绍中实际上也有所提及,self-attention 是一种自身和自身相关联的 attention 机制,这样能够得到一个更好的 representation 来表达自身,在多数情况下,自然会对下游任务有一定的促进作用,但是 Transformer 效果显著及其强大的特征抽取能力是否完全归功于其 self-attention 模块,还是存在一定争议的,参见论文:How Much Attention Do You Need?A Granular Analysis of Neural Machine Translation Architectures[3],如下例子可以大概探知 self-attention 的效果:

图 1 可视化 self-attention 实例

图 2 可视化 self-attention 实例

从两张图(图 1、图 2)可以看出,self-attention 可以捕获同一个句子中单词之间的一些句法特征(比如图 1 展示的有一定距离的短语结构)或者语义特征(比如图 1 展示的 its 的指代对象 Law)。
很明显,引入 Self Attention 后会更容易捕获句子中长距离的相互依赖的特征,因为如果是 RNN 或者 LSTM,需要依次序序列计算,对于远距离的相互依赖的特征,要经过若干时间步步骤的信息累积才能将两者联系起来,而距离越远,有效捕获的可能性越小。
但是 Self Attention 在计算过程中会直接将句子中任意两个单词的联系通过一个计算步骤直接联系起来,所以远距离依赖特征之间的距离被极大缩短,有利于有效地利用这些特征。除此外,Self Attention 对于增加计算的并行性也有直接帮助作用。这是为何 Self Attention 逐渐被广泛使用的主要原因。

6. 关于 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 显然合理一些。

7. Why Multi-head Attention?

答:原论文中说到进行 Multi-head Attention 的原因是将模型分为多个头,形成多个子空间,可以让模型去关注不同方面的信息,最后再将各个方面的信息综合起来。其实直观上也可以想到,如果自己设计这样的一个模型,必然也不会只做一次 attention,多次 attention 综合的结果至少能够起到增强模型的作用,也可以类比 CNN 中同时使用「多个卷积核」的作用,直观上讲,多头的注意力「有助于网络捕捉到更丰富的特征/信息」。

8. 关于 Multi-head Attention 的计算过程

答:在 1 中也有详细的介绍,但是需要注意的是,论文中并没有对 Multi-head Attention 有很强的理论说明,因此后续有不少论文对 Multi-head Attention 机制都有一定的讨论,一些相关工作的论文如下(还没看,先攒着)

9. Multi-head Attention 机制相关的论文:

答:A Structured Self-attentive Sentence Embedding[4]
Analyzing Multi-Head Self-Attention: Specialized Heads Do the Heavy Lifting, the Rest Can Be Pruned[5]
Are Sixteen Heads Really Better than One?[6]
What Does BERT Look At? An Analysis of BERT’s Attention[7]
A Multiscale Visualization of Attention in the Transformer Model[8]
Improving Deep Transformer with Depth-Scaled Initialization and Merged Attention[9]

10. RNN 系列的模型,并行计算能力很差

答:RNN 系列的模型时刻隐层状态的计算,依赖两个输入,一个是时刻的句子输入单词,另一个是时刻的隐层状态的输出,这是最能体现 RNN 本质特征的一点,RNN 的历史信息是通过这个信息传输渠道往后传输的。而 RNN 并行计算的问题就出在这里,因为时刻的计算依赖时刻的隐层计算结果,而时刻的计算依赖时刻的隐层计算结果,如此下去就形成了所谓的序列依赖关系。

11. Transformer 的特征抽取能力比 RNN 系列的模型要好

答:上述结论是通过一些主流的实验来说明的,并不是严格的理论证明,具体实验对比可以参见:
放弃幻想,全面拥抱 Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较[10]
但是值得注意的是,并不是说 Transformer 就能够完全替代 RNN 系列的模型了,任何模型都有其适用范围,同样的,RNN 系列模型在很多任务上还是首选,熟悉各种模型的内部原理,知其然且知其所以然,才能遇到新任务时,快速分析这时候该用什么样的模型,该怎么做好。

12. Transformer 是如何训练的?测试阶段如何进行测试呢?

答:Transformer 训练过程与 seq2seq 类似,首先 Encoder 端得到输入的 encoding 表示,并将其输入到 Decoder 端做交互式 attention,之后在 Decoder 端接收其相应的输入(见 1 中有详细分析),经过多头 self-attention 模块之后,结合 Encoder 端的输出,再经过 FFN,得到 Decoder 端的输出之后,最后经过一个线性全连接层,就可以通过 softmax 来预测下一个单词(token),然后根据 softmax 多分类的损失函数,将 loss 反向传播即可,所以从整体上来说,Transformer 训练过程就相当于一个有监督的多分类问题。
【需要注意的是,「Encoder 端可以并行计算,一次性将输入序列全部 encoding 出来,但 Decoder 端不是一次性把所有单词(token)预测出来的,而是像 seq2seq 一样一个接着一个预测出来的。】
而对于测试阶段,其与训练阶段唯一不同的是 Decoder 端最底层的输入,详细分析见问题 1。

13. Transformer 中的 Add & Norm 模块,具体是怎么做的?

答:见 1 其他模块的叙述,对 Add & Norm 模块有详细的分析

14. 为什么说 Transformer 可以代替 seq2seq?

答:这里用代替这个词略显不妥当,seq2seq 虽已老,但始终还是有其用武之地,seq2seq 最大的问题在于「将 Encoder 端的所有信息压缩到一个固定长度的向量中」,并将其作为 Decoder 端首个隐藏状态的输入,来预测 Decoder 端第一个单词(token)的隐藏状态。在输入序列比较长的时候,这样做显然会损失 Encoder 端的很多信息,而且这样一股脑的把该固定向量送入 Decoder 端,Decoder 端不能够关注到其想要关注的信息。
上述两点都是 seq2seq 模型的缺点,后续论文对这两点有所改进,如著名的Neural Machine Translation by Jointly Learning to Align and Translate[11],虽然确确实实对 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[12]),并且 Transformer 并行计算的能力是远远超过 seq2seq 系列的模型,因此我认为这是 transformer 优于 seq2seq 模型的地方。

15. Transformer 中句子的 encoder 表示是什么?如何加入词序信息的?

答:Transformer Encoder 端得到的是整个输入序列的 encoding 表示,其中最重要的是经过了 self-attention 模块,让输入序列的表达更加丰富,而加入词序信息是使用不同频率的正弦和余弦函数,具体见 1 中叙述。

16. Transformer 如何并行化的?

答:Transformer 的并行化我认为主要体现在 self-attention 模块,在 Encoder 端 Transformer 可以并行处理整个序列,并得到整个输入序列经过 Encoder 端的输出,在 self-attention 模块,对于某个序列,self-attention 模块可以直接计算的点乘结果,而 RNN 系列的模型就必须按照顺序从计算到。

17. self-attention 公式中的归一化有什么作用?

答:首先说明做归一化的原因,随着的增大,点积后的结果也随之增大,这样会将 softmax 函数推入梯度非常小的区域,使得收敛困难(可能出现梯度消失的情况)
为了说明点积变大的原因,假设和的分量是具有均值 0 和方差 1 的独立随机变量,那么它们的点积均值为 0,方差为,因此为了抵消这种影响,我们将点积缩放,对于更详细的分析,参见(有空再来总结,哈哈~):transformer 中的 attention 为什么 scaled?[13]

以上是关于深度学习+面经Transformer 网络学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

深度学习中Transformer的原理和方法(李宏毅视频课笔记)

深度学习Transformer相关知识学习

深度学习Transformer相关知识学习

BERT大火却不懂Transformer?读这一篇就够了 原版 可视化机器学习 可视化神经网络 可视化深度学习

计算机视觉算法——Transformer学习笔记

Transformer入门篇-深度万字长文带你轻松入门深度学习框架