在学习 transformer 之前,我们应该先学习 LLM 中的 Attention 机制。
Attention
Attention 的核心就是让每个 token 去看句子里的其他 token,并判断哪些 token 对自己更重要,然后把重要信息融合进自己的新表示里。
在 Attention 机制下,输入的句子首先被分为 n 个 token,接下来这 n 个词语被 embedding 层向量化为 n 个向量,然后使用 Wq,Wk,Wv 三个矩阵与每一个词向量进行矩阵乘法运算,得到 n 组 Query、Key、Value。可以类比地理解为:Q 包含了“我要找什么信息”,K 包含了 “我有什么信息”,V 包含了 “我能提供的具体内容”。值得注意的是,Wq、Wk、Wv 这三个矩阵不是一开始定好的,而是通过学习得到的。
接下来 Attention 会将每个 token 的 Q 和每个 token 的 K 做相似度计算,也就是
$$
\text{score} = QK^T
$$
接下来我们还需要除以 Key 向量维度的平方根,防止向量维度过大导致 softmax 结果极端。
$$
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V
$$
有了注意力权重后,模型会对所有 token 的 Value 向量加权求和,结果就是某个 token 融合上下文之后的新向量。所以 Attention 的输出不是一个普通词向量,而是:融合了上下文信息的新 token 表示。
其中,Attention 又有 Self-Attention 和 Multi-Head Attention。
在 Self-Attention 中,所有的 Q、K、V 都来自同一个输入句子,也就是句子自己内部的 token 互相看,所以 Self-Attention 可以建模句子内部 token 之间的关系。
Multi-Head Attention 的想法是用多个 Attention Head 并行学习不同的关注模式。一个 head 本质上就是一套独立的 Wq、Wk、Wv,每个 head 都会独立生成自己的 Q、K、V,然后独立做一次 Attention。最终将多个 head 的输出拼接后再乘一个输出矩阵 Wo,其作用是把多个 head 得到的信息重新融合,变成最终输出。
Transformer
在 Transformer 之前,主流序列转导模型的结构大多数基于 RNN/CNN,使用编码器-解码器结构,使用注意力机制来增强。Transformer 完全摒弃 RNN/CNN,完全基于注意力机制。

这张图中,左边是编码器 Encoder,右边是解码器 Decoder。左边 Encoder 负责理解输入句子;右边 Decoder 负责根据已生成内容和 Encoder 的理解结果,逐步生成输出句子。
1、Encoder 编码器
第一步,Input Embedding,输入的句子被分解为 token 后通过 Embedding 层变成向量。
第二步,Positional Encoding。因为 Attention 本身不知道词的顺序,因此要加上位置编码,也就是 词向量 + 位置向量。否则模型只知道有这些词,而不知道它们的先后顺序。
第三步,Multi-Head Attention。我们先类比为 Self-Attention,这一步给每一个词都编码上其上下文的信息。这个方框下的三个箭头分别代表 Wq、Wk、Wv 三类矩阵。Multi-Head Attention 中会有多个注意力头。假设有 8 个 head,那么每个 head 都有自己的一组 Wq、Wk、Wv。每个 head 只负责把向量投影到较低维度的子空间中,例如原始维度是 512,8 个 head 时,每个 head 常用 64 维。每个 head 单独计算一次 Attention,最后把 8 个 head 的结果拼接起来,再经过一个线性变换得到最终输出。
第四步,再经过一个残差连接、归一化,再做一次简单的前馈神经网络,再跑一次残差、归一化。接着就会送到解码器。
2、Decoder 解码器
首先从图中右侧底部可以看到,答案先经过 embedding,然后位置化编码,然后经过掩码多头注意力机制,接着进行残差网络和归一化。带掩码的多头注意力机制是什么呢?
假设我们的目标输出是 I love easy course,训练时,Decoder 会一次性看到完整的答案,但是实际生成时,模型是一个词一个词向外生成的,所以在模型训练时,必须模拟真实的生成过程,也就是当预测 easy 的时候,只能看到 I love。那么具体是怎么实现的呢?和普通的 Multi-Head Attention 一样,但是在 注意力分数 (即 $\text{score} = QK^T$)计算完毕后,会加入一个 mask 矩阵,将未来位置屏蔽。例如原本的注意力分数为
1 | 看1 看2 看3 看4 |
加入 mask 后
1 | 看1 看2 看3 看4 |
再经过 softmax 转换为概率后负无穷的值就会接近于 0。
和 Encoder 中的 Self-Attention 不同,Decoder 中的第二个 Multi-Head Attention 是 Encoder-Decoder Attention,也叫 Cross-Attention。它的 Q 来自 Decoder 下方 Masked Multi-Head Attention 的输出,K 和 V 来自 Encoder 的最终输出。
也就是说,Decoder 使用当前已经生成内容形成的 Q,去查询 Encoder 对输入句子的理解结果 K 和 V,从而决定在生成当前 token 时应该关注输入句子的哪些部分。
解码器的输出会经过一个线性层,线性层会将 512 维的向量映射到词表大小维度的向量上,某个维度值越大则表示模型越倾向于选择该维度对应的 token,最后经过 Softmax 转化为概率。
结语
本次学习只研究了 transformer 的基本架构,在接下来的学习中会做更深的研究。