学习资料来源于字母站大学
1 Transformer架构
- 基于编码器-解码器的架构来处理序列对。
- 跟使用注意力的seq2seq不同,Transformer是基于纯注意力。
2 注意力
2.1 自注意力机制
使用注意力:需要根据整个序列进行预测,对于同一input,不同的上下文输出不同,序列长度也不同,无法用固定窗口。
首先要得到一个能表示输入向量本身及其与序列其他向量的关联性(α\alphaα)的向量,α\alphaα即注意力分数。
根据α\alphaα可以得知,哪些向量和aaa关联性最高,就可以根据α\alphaα抽取信息
将所有的aaa,qqq拼起来成矩阵,就一次性计算得到了所有的qqq,同理,kkk,vvv也通过矩阵运算一次性得到。
注意力分数的计算同样将qqq,kkk的点乘过程拼接成矩阵,然后对每一列做softmax
总过程:
2.2 多头注意力
由于所谓的“相关性”不是一个固定的定义,可以有多种表现形式,所以在用qqq寻找不同的kkk时,需要不同的qqq负责得到不同种类的相关性,同时,由于有多个qqq,所以也有多个kkk和多个vvv,相同类别的qqq,kkk,vvv一起计算
3 Add&LayerNorm
Transformer在自注意力块的输出部分又加上了输入,然后一起输入Norm层。
Transformer的LayerNorm计算公式:
y=x−E(x)Var(x)+ϵ∗α+βy=\frac{x-E(x)}{\sqrt{Var(x)+\epsilon}}*\alpha+\betay=Var(x)+ϵx−E(x)∗α+β
其中α\alphaα,β\betaβ是可学习参数,用来防止输出数据落在后续的激活函数近似线性的范围内,失去激活函数非线性特性。ϵ\epsilonϵ用来防止分母为0。
LayerNorm用来稳定神经网络的训练,将输入归一化到均值为0方差为1的分布中,避免训练中产生梯度消失或梯度爆炸。LayerNorm是在最后一个特征维度做归一化(一个单词内部),可以保证稳定性。
4 解码器——交叉注意力
对于Transformer架构解码器中间部分,有来自Encoder的输入,也有来自Decoder的输入,这部分架构叫做交叉注意力。总的来说,交叉注意力的qqq来自于Decoder,kkk,vvv来自于Encoder,也就是用Decoder的qqq来抽取Encoder信息作为下一步的输入。
面试题篇
1 Transformer/RNN/CNN对比
各个模型对于NLP任务需要抽取的特征的性能:
- 上下文语义(方向、长度):Transformer > RNN > CNN
- 序列特征:RNN > Transformer > CNN
- 速度:CNN > Transformer > RNN
Transformer擅长抽取上下文语义特征的原因:RNN只能对句子进行单向的编码,CNN只能对短句进行编码,而transformer既可以同时编码双向的语义,又可以抽取长距离特征,在NLP特征抽取方面能力更强。
CNN其实是self-attention的特例。单向RNN未考虑右边序列的input且顺序执行,self-attention是并行的。
2 Transformer为什么将特征维度拆分成多个头
- 从不同角度捕捉信息,防止每个输入对自身注意力分数过高,增强模型表达能力
- 实现并行计算,提高计算效率
- 缓解梯度消失:当维度ddd很大时,点积结果的方差也会很大,做softmax后会变成近似one-hot编码,导致梯度消失。
3 为什么使用乘性注意力而不用加性注意力
在GPU场景下,矩阵乘法的计算效率更高
4 Attention(Q,K,V)=softmaxQKTdkV\mathrm{Attention}(Q,K,V)=\mathrm{softmax}\frac{QK^T}{\sqrt{d_k}}VAttention(Q,K,V)=softmaxdkQKTV为什么要除以dk\sqrt{d_k}dk
如果两个矩阵都是服从正态分布的,矩阵相乘后由于元素是相乘再相加,那么结果就变成均值为0,方差为ddd的分布了,方差如果很大,和问题1的原因相同,可能会产生很分散的数值,使得softmax后导致梯度消失,所以要除以标准差恢复到正态分布。
梯度消失举例:对于z=[1000,1,−1000]z=[1000,1,-1000]z=[1000,1,−1000],计算softmax:
softmax(z)=[d1000e1000+e1+e−1000,e1e1000+e1+e−1000,e−1000e1000+e1+e−1000]≈[1,0,0]\mathrm{softmax}(z)=[\frac{d^{1000}}{e^{1000}+e^1+e^{-1000}},\frac{e^1}{e^{1000}+e^1+e^{-1000}},\frac{e^{-1000}}{e^{1000}+e^1+e^{-1000}}]\approx[1,0,0]softmax(z)=[e1000+e1+e−1000d1000,e1000+e1+e−1000e1,e1000+e1+e−1000e−1000]≈[1,0,0]
对softmax求梯度
softmax(zi)=ezi∑k=1Cezk,i∈{1,2,...,C}\mathrm{softmax}(z_i)=\frac{e^{z_i}}{\sum_{k=1}^{C}e^{z_k}},i\in \{1,2,...,C\}softmax(zi)=∑k=1Cezkezi,i∈{1,2,...,C}
∂softmax(zi)∂zj={softmax(zi),if i=j−softmax(zi)⋅softmax(zj),if i≠j\frac{\partial \mathrm{softmax}(z_i)}{\partial z_j}=\begin{cases}
\mathrm{softmax}(z_i),\mathrm{if}\ i=j
\\-\mathrm{softmax}(z_i)·\mathrm{softmax}(z_j),\mathrm{if}\ i\neq j
\end{cases}∂zj∂softmax(zi)={softmax(zi),if i=j−softmax(zi)⋅softmax(zj),if i=j
带入数值,对于softmax(zi)≈1\mathrm{softmax}(z_i)\approx 1softmax(zi)≈1,梯度为0,对于其他位置jjjsoftmax(zi)≈0\mathrm{softmax}(z_i)\approx 0softmax(zi)≈0,梯度同样为0,导致梯度消失。
5 为什么源码实现中mask被丢弃的token值置为-10000而不是置0
如果被丢弃的token值为0,做softmax时分子为1而不是趋近于0的值,也能得到概率值,无法满足正常token的概率和为1。