1.Transformer为何使用多头注意力机制,不使用一个头?
多头可以使参数矩阵形成多个子空间,矩阵整体的size不变,只是改变了每个head对应的维度大小。这样做使矩阵对多方面信息进行学习,但计算量和使用单个head差不多。
2.Transformer为什么Q和K使用不同的权重矩阵生成,为何不能使用一个值进行自身的点乘?
Q和K初始为不同的权重是为了解决可能输入句与输出句长不一致的问题。并且如果Q,K的一致,不用Q而是直接拿K和K点乘的话,attention score矩阵是一个对称矩阵。因为是同一个矩阵都投影到同样的一个空间,所以会导致泛化能力会很差。
3.Transformer计算attention的时候为何选择点乘而不是加法?
K和Q点乘是为了得到一个attention score矩阵,用来对V进行提纯。K和Q使用了不同的和来计算,可以理解为是在不同空间上的投影。
点乘操作可以利用高效的矩阵运算实现,尤其在现代GPU上是非常高效的,并且减少了复杂性。
加法注意力机制需要进行额外的前馈网络计算,复杂度较高。
4.为什么在进行softmax之前需要对attention进行scaled?
如果较大,那么softmax的指数函数的值将会增长非常快,导致其中一个元素可能会占据绝大多数的权重,而其他元素贡献非常小。这种情况会让注意力机制不稳定,且容易出现梯度消失和梯度爆炸问题。
Q和K是独立的随机变量,就是随机变量的点积,对于均值为0,方差为1的独立随机变量来说,点积结果的方差与向量的维度成正比:
当Q和K的维度变大,点积的方差也会增大,从而使增大。因此,随着增大,softmax的输出会越来越倾向于赋予某些位置极高的权重,削弱其他位置的贡献,造成训练不稳定。为了防止这个问题,就要引入缩放项。
5.计算attention score时如何对padding做mask操作?
对需要mask的位置设置负无穷,在对attention score进行相加。
6.为什么在进行多头注意力的时候要对每个head进行降维?
将原有的高维空间转化为多个低维空间并在最后进行拼接,形成同样维度的输出,借此丰富特性信息,降低计算量。
7.Transformer的Encoder模块
- 输入嵌入(Input Embedding)+位置编码
- 多头自注意力机制
- 前馈神经网络
- 残差连接和层归一化
- 多层堆叠
输入嵌入(Inuput Embedding)+位置编码
输入序列中的每个词语通过embedding层映射为一个固定维度的向量表示。同时,为捕捉输入序列中词的位置信息,Transformer使用了位置编码,将位置信息与词embedding相加。(因为Transformer没有RNN那样的顺序信息机制,所以需要显示注入位置信息)
多头自注意力机制
自注意力:给定书UR向量序列,计算每个词和其他词之间的相似性,生成一个权重矩阵。然后用这个权重矩阵对序列进行加权求和,使得每个词的表示不仅包含自己的信息,还包含上下文中其他词的相关信息。
多头自注意力:不是单一的进行一次自注意力,而是将输入向量分为多个部分,分别计算不同的子空间上的注意力。这可以让模型从多个角度学习不同的特征,然后将这些head的输出拼接起来。
前馈神经网络(两个线性层+一个非线性激活层)
对注意力机制的输出进行进一步非线性变换,增加模型表达能力,能在局部区域上进行共复杂特征处理。
残差连接(Residual Connection)和层归一化(Layer Normalization)
每个子层(包括多头自注意力和FFN)都通过残差连接加上原始输入,然后在经过层归一化。残差连接的作用是防止深层网络中的梯度消失问题。层归一化则有助于加速训练并提高模型的稳定性。
残差连接:将子层的输入与子层的输出相加,确保梯度可以更好的反传。
层归一化:使模型训练更加平稳。
堆叠多个Encoder层
Transformer的Encoder模块由多个Enocoder层堆叠而成。
8.为何在获得输入词向量后需要对矩阵乘以embedding size的开方()?
主要是为了数值平衡,保证:词embedding的值与自注意力机制中的点积操作结果保持适当的幅度;避免在softmax中梯度消失;保证词embedding和位置编码在数值上处于同一水平。
*位置编码的幅度通常是经过设计的,且不依赖于词语的特定语义。如果词嵌入的数值非常小,加上位置编码后,位置信息可能在数值上主导了词语的语义信息,乘以可以放大词embedding的幅度,使他与位置编码的数值处于同一量级,从而保证位置编码不会压制embedding的语义信息。
9.简单介绍下Transformer的位置编码,有什么意义和优缺点?
自注意力是位置无关的,无论句子的顺序是什么样的,通过自注意力计算的token的hidden embedding都是一样的,这不符合人类的思维。因此要有一个办法能够在模型中表达出一个token的位置信息。Transformer使用了固定的位置编码来表示token在句子中的绝对位置信息。
Transformer使用正弦函数和余弦函数来生成不同维度的位置信息。给定位置pos和embedding维度i,位置编码:
意义:引入顺序信息
相对距离信息
易于计算
优点:无需额外学习
保持相对位置信息
轻量化
缺点:固定编码:位置编码是静态的,即生成后不会随着训练动态调整,可能不能在复杂句子结构中灵活捕捉长依赖
对长序列处理优先:对于非常长的句子,固定的正、余弦编码可能不能很好的捕捉远距离词语信息
10.Transformer中残差结构及意义?
Encoder和decoder的自注意力层及FFN层都有残差连接。残差结构的核心思想是将输入信息直接传递到输出,而不是完全通过网络进行变换。这种方式允许网络在训练过程中更容易学习到残差,即输入和输出之间的差异,而不是直接学习复杂的变换。
意义:反向传播时不会造成梯度消失,使得算法收敛速度更快。
11.为什么transformer使用LayerNorm而不是BatchNorm?
Transformer处理的是变长的序列数据,而BN在处理变长序列时会面临挑战。因为它依赖于整个batch的统计信息。当序列长度变化时,BN的统计信息可能会变得不稳定。而LN是对每个序列样本进行独立归一化,不依赖于batch。
12.简述下BN技术,以及它的优缺点?
BN是对每一批的数据在进入激活函数前进行归一化,可以提高收敛速度,防止过拟合、梯度消失,增加网络对数据的敏感度。
缺点:依赖于batch的大小;
时间和计算成本:BN需要在每个mini-batch上计算均值和方差,并执行归一化操作,增加计算开销;
不适合序列和变长输入。
13.简单描述下transformer中的FFN,使用了什么激活函数?
全连接层——非线性激活层——全连接层
第一个全连接层:,其中是输出维度,是输入维度
非线性激活函数:ReLU
第二个全连接层:将维度还原回
FFN作用:提升模型表达能力;增强非线性性
14.Encoder端和decoder端是如何进行交互的?
Encoder输出:K和V
Decoder的自注意力层输出:Q
Decoder的每个位置会通过计算Q和K之间的相似性分数来确定该位置应该关注输入序列中的哪些部分,然后将这些attention score与对应的V加权求和,生成新的表示。
15.Decoder阶段的多头自注意力和encoder阶段的自注意力有什么区别?
Decoder有两层多头自注意力,encoder有一层多头自注意力。
Decoder第一层多头自注意力(自注意力层):与encoder类似,但有掩码机制
Decoder第二层多头自注意力(跨注意力层,encoder-decoder attention):decoder的自注意力层输出Q,encoder输出K,V。Decoder可以在生成每个目标序列中的元素时,参考输入序列的全局信息,从而生成与输入序列匹配的输出。
Encoder的多头自注意力:所有输入序列的元素都可以相互“看到”,它们可以关注到整个输入序列。
16.Transformer的并行化体现在哪里?
Transformer的并行化主要体现在自注意力模块,在encoder端Transformer可以并行处理整个序列,并得到整个输入序列经过encoder端的输出。
17.Decoder端可以做并行化处理吗?
训练时可以,但交互时不可以。