【深度学习】NLP之Transformer (3) QA

首先transformer不是encoder+decoder,是self-attention结构,楼主说的encoder-decoder,是transformer应用到seq2seq任务(例如机器翻译任务)上的一种体现,例如Bert就是只有encoder的self-attention结构。

大自然的搬运工:transformer面试题的简单回答 - Necther的文章 - 知乎

大部分内容来自上面,以及自己遇到的一些问题,做了下归纳。

原理:

【深度学习】NLP之Transformer (1)  encoder部分

【深度学习】NLP之Transformer (2)  decoder部分

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维,进行矩阵两次乘法,即q*kT*v输出即可得到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个元素的关系。

transformer的细节到底是怎么样的? - 知乎

22. transformer模型中decoder的输出到底是一个单词一个单词蹦出来的,还是每个batch解码器的所有单词一起生成?文章,包括很多人的博客里老是提到时刻i,不是说这个模型是并行化的吗,为什么还是要说时刻i呢?难道还是和RNN一样i时刻的单词必须在i时刻之前的单词全部生成完之后才能生成,这样不就“不是并行”了吗?

所谓并行是training 并行,inference是无法并行的,只能一个一个词输出。之所以training可以并行是因为training的时候每个timestep的词你都是知道的 + transformer本身结构支持。

23. 原文“This masking, combined with fact that the output embeddings are offset by one position, ensures that the predictions for position i can depend only on the known outputs at positions less than i.”中的“output embeddings are offset by one position”以及shifted right到底如何理解,具体如何操作?为什么要shifed right?

训练过程中,decoder的输出是batch做解析,实现是通过一个上三角矩阵掩码实现的,上三角的值全为0,把这个矩阵作用在每一个序列上,就可以实现batch解析整个序列。

output embeddings are offset by one position,对输出的位置偏移,以上所说的加入上三角矩阵进行掩码实现的。比如“我是中国人”这五个字,当预测“中”字的时候,其实我们希望它只能看到“我”和“是”两个字,那么必须要对输出进行偏移,以防止“中”字对后续位置字产生注意力。

24. 关于mask,请帮忙分析一下我的理解对不对。transformer是不是有两种类型的mask,一种是针对padding的,一种是针对position的。前者是为了解决输入batch句子不等长的问题,前者出现在所有的缩放点积中,后者只出现在decoder的multi-head attention中。后者是为了在decoder的时候防止注意到还未产生的单词,所以要构造一个方阵,这个方阵是N*N,N为句子长度,是个上三角,上面为-inf,下面是1。然后让这个方阵和Q和K的转置相乘得到的方阵element-wise乘,再进行softmax。关于mask我的问题如下,(1)请问前者,即“padding mask”到底长啥样?是在哪里进行操作的,怎么操作?(2)我上面的理解对不对?(3)decoder中包括两个mask那么既有padding mask 又有position mask,是如何同时处理这两个mask呢?是直接加起来吗?

mask的目的就是让你不想要的地方变成0。至于是不是加起来,这跟实现有关。如果你的实现中mask是0,1值,即类似于[1, 1, 1, 0 0 0],那当然是乘起来,才能保证该保留的地方都是原样保留,该丢掉的地方都变成0。

之所以有些实现是加起来,是因为后续还会有exp操作,这时候就要把想保留的位置的mask设置成0,不想要的地方设置成-inf(注意,不是-inf和1),这样 0 + 0 == 0, -inf + -inf == - inf , 取exp之后就又变成了1和0。

decoder中包括两个mask是直接加起来。

25. 解码器和编码器的input和output必须要求句子一样长吗?

不要求。解码器和编码器的句子可以不一样。举例,编码器input的句子是“我是中国人”,长度为5而解码器output的句子是“I am chinese“,长度为3。

26. 在训练阶段,decoder每个batch的output embedding的输入是不是都不变?(我的理解是,虽然很多网站画的动图是解码器输出的单词又变成解码器的输入,但是我感觉这只是为了方便我们理解mask的具体含义,实质上解码器每轮batch的输入是不变的,不知道这样理解对不对。

参数的更新是在Batch 维度计算完loss和gradient之后进行的,所以在计算一个batch的loss的时候,当然embedding无法改变。如果是不同batch之间,即便是训练数据相同,由于参数已经被更新过了,那么word embedding自然也是改变了的,否则训练个什么劲儿?

实质上解码器每轮batch的输入是不变的,是通过mask来控制自回归的每一次输入。

27. 测试阶段,解码器应该就没有输入了,因为没有标签了,那么这个时候该如何传播呢?因为训练阶段的K、V来自编码器,Q是来自解码器的输入,测试的时候解码器的输入没了,那么Q如何产生?

 在训练阶段,解码器的一开始的输入会有一个”start“标记和”end“标记。在测试过程中,第一个输入其实是”start“。举例,对”我是中国人“进行机器翻译,第一次decode输入是”start“,然后预测出”I“;接下来”start“+”I“作为输入,预测出”am“,以此类推,如果预测出”end“标记,那么结束。

28.  为什么使用 layer normalization,而不是其他的归一化方法?

 1、选择什么样的归一化方式,取决于你关注数据的哪部分信息。如果某个维度信息的差异性很重要,需要被拟合,那就别在那个维度进行归一化。

  1. 图像数据是自然界客观存在的,像素的组织形式已经包含了“信息”;
  2. 而NLP数据不一样,网络对NLP数据学习的真正开端是从'embedding'开始的,而这个‘embedding’并不是客观存在,它也是通过网络学习出来的。

如果你的特征依赖于不同样本间的统计大小进行比较,那么batchnorm是有效的(譬如CV任务);如果你的特征依赖于样本内部不同特征维度的比较,那么layernorm更有效(譬如NLP,不同batch样本的信息关联性不大)

2、layer normalization 有助于得到一个球体空间中符合0均值1方差高斯分布的 embedding, batch normalization不具备这个功能。

3、layer normalization可以对transformer学习过程中由于多词条embedding累加可能带来的“尺度”问题施加约束,相当于对表达每个词一词多义的空间施加了约束,有效降低模型方差。batch normalization也不具备这个功能。

以上其实都看不懂,

4、

BN是对batch的维度去做归一化,也就是针对不同样本的同一特征做操作。

LN是对hidden的维度去做归一化,也就是针对单个样本的不同特征做操作。

那为啥NLP里为啥不用BN做归一化呢?我觉得有两个原因:

  1. 也就是很多人提到的NLP里面,每个样本(比如句子)序列的长度是不一样的,所以不好搞成batch的形式。
  2. 就算强行把每个序列的长度弄成一样,那么就有batch这个维度了。如果我对两个句子(我爱吃炸鸡,今天很开心)每一个词去做归一化,那么比如我和今,爱和天是分别对应同一个特征维度,这样明显是不make sense的。

transformer 为什么使用 layer normalization,而不是其他的归一化方法? - Shuffle的回答 - 知乎

29. 为什么要 加入 Layer normalization 模块?

动机:因为 transformer 堆叠了 很多层,容易 梯度消失或者梯度爆炸;

原因:数据经过该网络层的作用后,不再是归一化,偏差会越来越大,所以需要将 数据 重新 做归一化处理;

目的:在数据送入激活函数之前进行normalization(归一化)之前,需要将输入的信息利用 normalization 转化成均值为0方差为1的数据,避免因输入数据落在激活函数的饱和区而出现 梯度消失 问题。

transformer 为什么使用 layer normalization,而不是其他的归一化方法? - 杨夕的回答 - 知乎

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值