三.多头自注意力
"此外,Transformer 采用了多头自注意力(Multi-head Attention)机制,即输入序列被线性映射多次得到不同的投影矩阵。多个尺度化后点积注意力可以并行计算,并产生多个自注意力输出."
将输入分为多个不同的部分,对其不同的部分分别进行不同的线性运算来使用自注意力机制得到输出,然后再将其根据不同的权重拼接起来得到最终输出矩阵H:
原先的单自注意力机制是一次处理整个段落,而多头自注意力是分别处理,这就具有了并行处理的优势.
四.为什么在解码器中要分别有两个自注意力子层,一个是关注目标序列本身,一个是关注编码器的输出?
首先阐述编码器和解码器的功能
编码器:将任务序列转换成为既包含语义信息,又包含位置信息的向量
解码器:生成目标序列
因此关注解码器的功能时,我们既需要考虑输入序列的信息也要考虑输出的部分目标序列在语义上的连贯性(因为语言在生成时要考虑上下文语境). 所以就需要两个不同的自注意力层来处理这两个不同的任务,这就是为什么会有目标序列自注意力子层(关注输出语义的连贯性)和编码器-解码器自注意力子层(关注输入语义的翻译)的原因.
五.目标序列自注意力是如何做到维持上下文连贯的?什么是掩码操作?
掩码操作是作用于注意力分数上的,在进行softmax操作之前,对注意力分数乘以一个相同大小的掩码矩阵(由0和1组成). 0代表可读取,1代表不可读取.
在第一次进行掩码操作时,掩码矩阵的所有元素值均为0,从而可以在第一次自注意力操作时关注最先输入的原本的序列. 之后对每个位置i都进行相关性检测,从而找出最相关的位置j,然后认为i>j的位置均为上文,i<=j的位置均为下文.
所以在i>j的位置将被0,开放读取,i<j的位置被置为1,暂时不准读取.
举个例子,在注意力分数运算之后,虽然经过线性变换,但是Q,K都饱含着"I have a dream"的语义,因此会得到一个4*4的矩阵(假设),然后得出上下文的位置.
五.交叉注意力层?
"此外,在自注意层之后还有一个额外的“交叉注意力”层,其中查询矩阵 Q 是从解码器中前一层的输出中派生出来的,而键矩阵 K 和值矩阵 V 是从编码器的最后一层的输出中转换而来的。这种设计的主要目的是为了让 Transformer 在解码时避免看到真实标签,并且同时处理来自编码器的信息."
在每次自注意力操作结束后会进行一次交叉注意力操作. 在这种注意力操作中,查询矩阵Q来自于前一层的解码器进行变换得来,而键值矩阵k和值矩阵v由上一层的输出进行变换得来(分别进行权重矩阵的线性变换,每个权重矩阵来自于每个注意力头,是通过神经网络来学习的).
这种交叉注意力操作的目的是为了减少原本标签的影响,因为完全用词序列来进行自注意力操作会导致Q矩阵一直使用的是原本词序列中的标签,从而过度依赖标签,导致训练结果完全是围绕样本数据来生成的(这种问题也被称为"过拟合"问题).
所以在交叉注意力层中,Q矩阵不包含真实标签信息,而是来自于编码层,这样就最大限度的减轻了原始标签对于结果的影响.所以说"避免看到真实标签",有助于平衡模型的性能和鲁棒性.