# 背景

给定一个翻译任务:将 I love you baby 翻译为中文。

先把每一个词转换成对应的 词向量,考虑按照下面方式处理:

  1. 直接丢到 MLP 中,那么:
    • 每个词都会失去上下文信息,且长度只能一一对应

  1. 用 RNN,那么:
    • 会面临串行计算
    • 句子太长会导致记不住长距离的信息


# 注意力机制 Attention

上面两个方法都有缺陷,可以考虑按照下面的方法处理:

  1. 首先,给每个 词向量加上各自的 位置编码(表示该词出现在整个句子中的位置),现在这个词向量就具备了位置信息

  1. 但现在每个词都还没有其他词的上下文信息(注意不到其他词的存在)。用权重矩阵 W_qW\_q 与第一个词向量相乘(MatMul),得到维度不变的 q_1q\_1 矩阵。同理,用 W_k,W_vW\_k, W\_v 矩阵处理得到 k_1,v_1k\_1, v\_1。同理,得到 q_1,2,3,4,k_1,2,3,4,v_1,2,3,4q\_{1,2,3,4}, k\_{1,2,3,4}, v\_{1,2,3,4}
    • 其中 W_q,W_k,W_vW\_q, W\_k, W\_v 矩阵都是可以经过训练学习到的一组权重值
    • 实际在 GPU 中运算时,是把词向量拼接成一个矩阵,再与 W 矩阵相乘。

  1. 现在,原来的词向量已经通过线性变换映射成了维度相同的 q,k,vq, k, v 。将 q_1q\_1k_2k\_2内积 得到 a_12a\_{12},表示在第一个词的视角下,与第二个词的 相似度系数。同理,得到 a_11,a_12,a_13,a_14a\_{11}, a\_{12}, a\_{13}, a\_{14}

  1. 得到相似度系数后,分别和 v 向量相乘,再相加,得到 a_1a\_1,表示在第一个词的视角下的全部上下文信息。同理,得到 a_1,a_2,a_3,a_4a\_1, a\_2, a\_3, a\_4

  1. 从全局的视角看,就是把最初的词向量,处理得到新的词向量(包含了位置信息其他词上下文信息),这就是 注意力机制 Attention 的原理


# 多头注意力机制 Multi-Head Attention

对于注意力机制而言,通过一种方式计算一次相关性,那么灵活性会大大降低。

  1. 之前是每个词向量计算一组 q_i,k_i,v_iq\_{i}, k\_{i}, v\_{i} ,现在基于原来的 q_i,k_i,v_iq\_{i}, k\_{i}, v\_{i},再经过两个权重矩阵 W 变成两组 q_i,k_i,v_iq\_{i}, k\_{i}, v\_{i},相当于给每个词向量两次学习机会,学习到不同的待计算相似度的 $q_{ij}, k_{ij}, v_{ij} $(头部 head)来增加语言的灵活性。

  1. 两个 head 经过注意力层的计算,得到 a_ija\_{ij} 向量,再把两个 a_ija\_{ij} 向量拼接起来,得到和原词向量相同维度的新词向量。这种方式也即 多头注意力机制机制 Multi-Head Attention


# Transformer 论文架构图

# 整体架构

  1. 把输入的内容通过 词嵌入 Word Embedding 的方式转换为向量矩阵

  1. 加入位置信息

  1. 经过多头注意力的处理,输入、输出的矩阵在维度上没有变化,输出的矩阵的每个词向量都增加了上下文信息
    • 后面的 Add & Norm 是优化步骤。表示 残差网络归一化,是为了解决梯度消失问题、让分布更加稳定


# 多头注意力架构

  1. 单头注意力:先让 q, k 内积,得到一个 相似度系数 的矩阵,再和 v 相乘,得到包含上下文信息的词向量矩阵
    • Scale:缩放
    • Mask:掩码
    • SoftMax:将输出映射到(0, 1)区间

Attention(Q,K,V)=softmax(QKTdk)VAttention(Q,K,V)=softmax(\fracQK(T){\sqrt{d_k}})V

  1. 多头注意力机制
    q,k,v 分别经过 线性变换 Linear矩阵乘法)拆分成多组(相当于给了多次机会学习到不同的相似度关系),依次经过 单头注意力机制 运算后,把运算结果拼接 Concat 起来。最后再用权重矩阵 WOW^O 进行线性变换

MultiHead(Q,K,V)=Concat(head1,…,headh)WOheadi=Attention(QWiQ,KWiK,VWiV)\beginalign\*} \\text{MultiHead}(Q, K, V) &= \\text{Concat}(\\text{head}\_1, \\dots, \\text{head}\_h) W(O \\\\ \\text{head)_i &= \textAttention}(Q W\_i(Q, K W\_i^K, V W\_i^V) \\\\ \\end{align\*)


# 编码器与解码器

用原来的翻译任务为例:

编码器

  • 输入要翻译的文本
  • 经过 词嵌入 Embedding,引入位置编码 Positional Encoding
  • 经过多头注意力、残差和归一化
  • 送入一个全连接神经网络 Feed Forward,再残差和归一化
  • 结果送入解码器的一个多头注意力机制的两个输入中(作为 K, V

解码器

  • 输入要翻译的文本
  • 经过 词嵌入 Embedding,引入位置编码 Positional Encoding
  • 经过 掩码后的多头注意力、残差和归一化,送入多头注意力的一个输入中(作为 Q
  • K,V,Q 进行多头注意力,再残差和归一化
  • 最后结果一层线性变换的神经网络,把向量投射到词表向量中
  • Softmax 转化为概率

Masked Attention

  • 作用:屏蔽未来位置信息,保证解码器只能基于已生成的前缀序列预测下一个词
  • Transformer 解码器是自回归生成模型:每一步的输出都依赖于之前所有的输出
  • 掩码是一个上三角矩阵,未来位置的注意力权重置为 −∞(或极小值)

参考链接:Transformer 其实是个简单到令人困惑的模型【AI入门06】_哔哩哔哩_bilibili