自留意力机制也可以被看作是一个序列表示模子。
比如,对于每个目标位置 j,都生成一个与之对应的源语言句子表示,它的情势如下:
Cj = Sum(αi,jhi) 。此中,hi 为源语言句子每个位置的表示效果, αi,j 是目标位置 j 对 hi 的留意力权重。
以源语言句子为例,自留意力机制将序列中每个位置的表示 hi 看作 query(查询),并且将全部位置的表示看作 key(键)和 value (值)。自留意力模子通过计算当前位置与全部位置的匹配程度,也就是在留意力机制中提到的留意力权重,来对各个位置的 value 举行加权求和。得到的效果可以被看作是在这个句子中当前位置的抽象表示。
自留意力机制中至关重要的是获取相关性系数,也就是在融合不同位置的表示向量时各位置的权重。 Transformer 模子采用了一种基于点乘的方法来计算相关性系数。这种方法也称为缩放的点乘留意力(Scaled Dot-product Attention)机制。
在留意力机制的计算过程中,包罗三个重要的参数,分别是 query,key 和 value。将目标语言每个位置的表示视为编码-解码留意力机制的 Q,源语言句子的表示视为 K 和V。在得到 Q, K 和 V 后,便可以举行留意力的运算,这个过程可以被情势化为:
通过对 Q 和 K 的转置举行矩阵乘法操纵,计算得到一个维度大小为 L × L 的相关性矩阵,即 QK_T,它表示一个序列上任意两个位置的相关性。再通过系数 1/√dk举行放缩操纵,放缩可以减少相关性矩阵的方差,具体体现在运算过程中实数矩阵中的数值不会过大,有利于模子训练。在此基础上,通过对相关性矩阵累加一个掩码矩阵 Mask,来屏蔽掉矩阵中的无用信息。
然后使用 Softmax 函数对相关性矩阵在行的维度上举行归一化操纵,这可以明白为对第 i 行举行归一化,效果对应了 V 中不同位置上向量的留意力权重。对于 value的加权求和,可以直接用相关性系数和 V 举行矩阵乘法得到,即 Softmax(√QKdkT +Mask)和 V 举行矩阵乘。终极得到自留意力的输出,它和输入的 V 的大小是千篇一律的。
2.4.2 多头留意力机制 (Multi-head Attention)
“多头”可以明白成将原来的 Q、 K、 V 按照隐层维度均匀切分成多份。假设切分 h份,那么终极会得到 Q = {Q1,...,Qh}, K = {K1,...,Kh}, V = {V1,...,Vh}。多头留意力就是用每一个切分得到的 Q, K, V 独立的举行留意力计算,即第 i 个头的留意力计算效果 headi = Attention(Qi,Ki,Vi)。
多头留意力的计算过程:
对于解码器来说,由于在预测的时候是自左向右举行的,即第 t 时刻解码器的输出只能依赖于 t 时刻之前的输出。且为了保证训练解码一致,避免在训练过程中观测到目标语言端每个位置未来的信息,因此需要对未来信息举行屏蔽。
具体的做法是:构造一个上三角值全为-inf 的 Mask矩阵。即在解码器计算中,在当前位置,通过未来信息掩码把序列之后的信息屏蔽掉了,避免了 t 时刻之后的位置对当前的计算产生影响。
2.5 残差网络和层标准化