参考链接:
https://github.com/DA-southampton/NLP_ability/blob/master/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/Transformer/%E7%AD%94%E6%A1%88%E8%A7%A3%E6%9E%90(1)%E2%80%94%E5%8F%B2%E4%B8%8A%E6%9C%80%E5%85%A8Transformer%E9%9D%A2%E8%AF%95%E9%A2%98%EF%BC%9A%E7%81%B5%E9%AD%8220%E9%97%AE%E5%B8%AE%E4%BD%A0%E5%BD%BB%E5%BA%95%E6%90%9E%E5%AE%9ATransformer.md
transformer详解:https://zhuanlan.zhihu.com/p/85221503
transformer原文章+代码:https://blog.csdn.net/qq_43079023/article/details/103301846
1、Transformer为何使用多头注意力机制?
多头保证了transformer可以注意到不同子空间的信息,捕捉到更加丰富的特征信息,详细参考:https://www.zhihu.com/question/341222779
2、Transformer为什么Q和K使用不同的权重矩阵生成,为何不能使用同一个值进行自身的点乘?
使用Q/K/V不相同可以保证在不同空间进行投影,增强了表达能力,提高了泛化能力。详细参考:https://www.zhihu.com/question/319339652
3、为什么在进行softmax之前需要对attention进行scaled(为什么除以dk的平方根),并使用公式推导进行讲解?
两个点,一,由于使用的是softmax进行分类,所以较大的值通常梯度较小,且softmax有放大作用,会把大部分概率分布分配给最大的元素,造成大部分others输入的梯度为0,结果就没法更新了。二、为什么是除以dk,这是因为向量q,k是独立的分布,他们的期望是0,方差是1,但是这俩货是点乘之后累加计算权重,所以累加之后,期望还是0,但是方差是dk,就是维度,所以需要除以这个scale。
详细参考:https://www.zhihu.com/question/339723385/answer/782509914
4、在计算attention score的时候如何对padding做mask操作?
负无穷即可,因为这个时候softmax是0,不影响其他维度的attention,跟input最长长度补负无穷的逻辑一致。
5、为什么input embedding那里要乘以embedding size的开方?
论文并没有讲为什么这么做,我看了代码,猜测是因为embedding matrix的初始化方式是xavier init,这种方式的方差是1/embedding size,因此乘以embedding size的开方使得embedding matrix的方差是1,在这个scale下可能更有利于embedding matrix的收敛。
6、为什么inputs embedding要加入positional encoding?
因为self-attention是位置无关的,无论句子的顺序是什么样的,通过self-attention计算的token的hidden embedding都是一样的,这显然不符合人类的思维。因此要有一个办法能够在模型中表达出一个token的位置信息,transformer使用了固定的positional encoding来表示token在句子中的绝对位置信息。positional encoding的公式如下,简单来说,就是奇数位置上市cos,偶数是sin,原理就是积化和差,pos+k位置的表示可以通过pos和k的位置的和差计算得到。
具体的说,为什么使用三角函数去做这个事情。
但是实际上,我们可以通过其他方式验证,其实transformer并没有获取到相对位置向量。其原因就是在位置向量与词向量进行累加且计算self-attention的逻辑的时候,实际上只有两边都有pos的向量乘积才有可能是相对位置的体现,这个W^T*W的结果,经实验可以验证,随机替换成其他值的时候,相对位置信息基本上是不存在的。所以后面的bert直接采用的pos向量直接学习得来。
具体相对位置实验参考:https://zhuanlan.zhihu.com/p/105001610?utm_source=wechat_session、https://zhuanlan.zhihu.com/p/152013563
其他参考文献:https://www.zhihu.com/question/347678607/answer/835053468
7、为什么attention需要multi-head,一个大head行不行?
multi-head相当于把一个大空间划分成多个互斥的小空间,然后在小空间内分别计算attention,虽然单个小空间的attention计算结果没有大空间计算得精确,但是多个小空间并行然后concat有助于网络捕捉到更丰富的信息,类比cnn网络中的channel。
8、为什么multi-head attention后面要加一个ffn?
类比cnn网络中,cnn block和fc交替连接,效果更好。相比于单独的multi-head attention,在后面加一个ffn,可以提高整个block的非线性变换的能力。
9、为什么加入skip-connect结构?
类似于resnet中的残差学习单元,有ensemble的思想在里面,解决网络退化问题。
10、为什么bert需要额外的segment embedding?
因为bert预训练的其中一个任务是判断segment A和segment B之间的关系,这就需要embedding中能包含当前token属于哪个segment的信息,然而无论是token embedding,还是position embedding都无法表示出这种信息,因此额外创建一个segment embedding matrix用来表示当前token属于哪个segment的信息,segment vocab size就是2,其中index=0表示token属于segment A,index=1表示token属于segment B。
11、为什么transformer的embedding后面接了一个dropout,而bert是先接了一个layer normalization,再接dropout?
LN是为了解决梯度消失的问题,dropout是为了解决过拟合的问题。在embedding后面加LN有利于embedding matrix的收敛。
12、bert和transformer在loss上的差异
<1> transformer的loss是在decoder阶段计算的,loss的计算方式是transformer的<19>。bert预训练的loss由2部分构成,一部分是NSP的loss,就是token“[cls]”经过1层Dense,然后接一个二分类的loss,其中0表示segment B是segment A的下一句,1表示segment A和segment B来自2篇不同的文本;另一部分是MLM的loss,segment中每个token都有15%的概率被mask,而被mask的token有80%的概率用“<mask>”表示,有10%的概率随机替换成某一个token,有10%的概率保留原来的token,被mask的token经过encoder后乘以embedding matrix的转置会生成在vocab上的分布,然后计算分布和真实的token的one-hot形式的cross entropy,最后sum起来当作loss。这两部分loss相加起来当作total loss,利用adam进行训练。bert fine-tune的loss会根据任务性质来设计,例如分类任务中就是token“[cls]”经过1层Dense,然后接了一个二分类的loss;例如问题回答任务中会在paragraph上的token中预测一个起始位置,一个终止位置,然后以起始位置和终止位置的预测分布和真实分布为基础设计loss;例如序列标注,预测每一个token的词性,然后以每一个token在词性的预测分布和真实分布为基础设计loss。
<2> bert在encoder之后,在计算NSP和MLM的loss之前,分别对NSP和MLM的输入加了一个Dense操作,这部分参数只对预训练有用,对fine-tune没用。而transformer在decoder之后就直接计算loss了,中间没有Dense操作。
网友评论