目录
1. 简介
2. 整体架构
3. 自注意力机制
3.1 自注意力的向量计算
3.2 自注意力的矩阵计算
4. 多头注意力
5. Add & Norm
6. Feed Forward层
7. 机器翻译
8. 总结
1. 简介
Transformer 是 Vaswani 等人于 2017 年提出的一种基于编码器—解码器结构的序列到序列(Seq2Seq)模型。与 RNN 和 CNN 不同,Transformer 不使用循环结构或卷积操作,而是利用注意力机制建模序列中的依赖关系,并通过位置编码保留词元(token)的顺序信息。
由于具有良好的并行计算能力和较强的长距离依赖建模能力,Transformer 在机器翻译、文本生成和预训练语言模型等自然语言处理任务中取得了突破性成果,随后也被广泛应用于计算机视觉和多模态学习领域。
2. 整体架构

Transformer 由编码器(Encoder)和解码器(Decoder)堆叠而成。编码器将输入序列映射为一组连续的表示,解码器根据编码器输出和已生成的输出序列,逐步生成目标序列。
- 输入:词元(token)经过 Embedding 后得到向量序列 X ∈ R^(n×d_model)。
- 主干:多层 Encoder 或 Decoder Block 堆叠,每层都包含注意力、前馈网络、残差连接和归一化。
- 输出:分类任务取特定位置表示;语言模型用输出投影得到词表上的概率分布。
3. 自注意力机制
自注意力(Self-Attention)让序列中的每个位置都能直接关注所有其他位置,从而捕获长距离依赖。
3.1 自注意力的向量计算

第一步是从编码器的每个输入向量(此处为词嵌入)创建三个向量。所以每个词我们创建一个查询向量q、键向量k和值向量v。这些向量是通过将词嵌入乘以我们在训练过程中学习得到的三个矩阵生成的。 x1 与 W^Q 相乘,得到 q1;x2 与 W^Q 相乘,得到 q2,以此类推。
注意这些新向量q、k、v的维度比词嵌入x小。它们的维数为64,而词嵌入和编码器输入/输出向量的维数为512。

第二步是计算得分。假设我们正在计算这个例子中第一个词“Thinking”的自我注意力。我们需要对输入句中的每个单词进行评分。评分决定了在编码单词时,输入句子其他部分应给予多少关注。
得分是通过查询向量q与我们评分的相应单词的键向量k的点积计算得出的。所以如果我们处理位置1(也就是Thinking的位置)的自注意力,第一个分数就是q1和k1的点积。第二个分数是q1和k2的点积。

第三和第四步是将分数除以8(论文中使用的键向量k维数的平方根,64的平方根是8)。这导致梯度更稳定。这里可能还有其他可能的值,但这是默认的),然后将结果传递给Softmax操作。Softmax会将分数归一化,使其全部为正,加起来为1。
该 Softmax 分数决定每个单词在该位置(这里处理的是位置1)的表达量。显然,这个位置的单词会有最高的 Softmax 分数,但有时关注与当前单词相关的另一个单词也很有用。

第五步是将每个值v向量乘以对应的 Softmax 分数,为后续求和做准备。
这里的直观理解是:保留我们希望重点关注的词语对应的 Value 向量,同时削弱不相关词语的影响。例如,将它们乘以 0.001 这样很小的数。
第六步是将加权后的值v向量相加。这样就得到了自注意力层在当前位置的输出,也就是第一个词对应位置的输出向量。
自注意力的计算到此结束,由此产生的向量z可以发送到前馈神经网络。
3.2 自注意力的矩阵计算

第一步是计算查询矩阵Q、键矩阵K和值矩阵V。我们通过将词嵌入打包到矩阵 X 中,并乘以我们训练的权重矩阵WQ、WK、WV来实现这一点。
X矩阵中的每一行对应输入句子中的一个词,每一行就是一个词嵌入(Embedding)。我们再次看到词嵌入向量大小的差异(512个,图中横着的4个方格),与q、k、v向量(64个,或图中横着的3个方格)的大小差异

最后,由于我们处理的是矩阵,我们可以将第二到第六步压缩到一个公式中,来计算自注意力层的输出。
Attention(Q, K, V) = softmax(Q * K^T / sqrt(d_k)) * V
4. 多头注意力
多头注意力(Multi-Head Attention)并行计算多组注意力,让模型关注不同子空间的信息。

在多头注意力下,有多个查询Q、键K、值V权重矩阵(Transformer使用8个注意力头,所以编码器/解码器中都有8组权重矩阵)。这些权重矩阵都是随机初始化的,经过训练之后,每一组权重矩阵都会将输入嵌入(或来自较低层编码器/解码器的向量)投影到不同的表示子空间中。
在多头注意力中,我们为每个注意力头分别维护独立的 Q、K、V 权重矩阵,因此每个注意力头都会生成不同的 Q、K、V 矩阵。和之前一样,我们用X乘以WQ、WK、WV矩阵,得到Q、K、V矩阵。

如果使用不同的权重矩阵,将前面介绍的自注意力计算过程独立执行 8 次,那么最终会得到 8 个不同的 Z矩阵。
Z_i = Attention(Q*W_i^Q, K*W_i^K, V*W_i^V)

前馈层并不需要接收 8 个矩阵,而是只接收一个矩阵,也就是每个词对应一个向量。因此,我们需要将这 8 个矩阵压缩或整合为一个矩阵。
具体做法是:先将这 8 个矩阵进行拼接,然后再与一个额外的权重矩阵 WO 相乘:
MultiHead(Q,K,V) = Concat(Z0,Z1, …, Z7) *WO
这样就可以将多个注意力头的输出重新映射为一个矩阵,并将其传递给后续的前馈层。


多头自注意力的基本原理大致就是这些。
5. Add & Norm
Add(残差连接):将子层(例如自注意力或前馈网络)的输出与其输入相加。目的是缓解梯度消失问题。
Norm(归一化):将Add的结果进行归一化处理
6. Feed Forward层
FFN包含两个线性变换(全连接层),第一层将输入维度映射到一个更高的维度,第二层将高维向量映射回原来的维度。
FFN(x)=ReLU(xW_1+b_1)W_2+b_2
其中:
- x:某个位置的输入向量;
- W_1,b_1:第一层线性变换的参数;
- W_2,b_2:第二层线性变换的参数;
- ReLU:非线性激活函数。
7. 机器翻译

下面介绍将句子“好久不见”翻译成“long time no see”的过程。
在推理阶段,Transformer 首先将输入句子“好久不见”转换为词嵌入并加入位置编码,然后送入编码器,通过多头注意力和前馈网络得到输入序列的上下文表示。接着,解码器从起始标记 <BOS> 开始生成目标句子:首先根据 <BOS> 和编码器输出预测第一个词 long;然后将 <BOS> long 作为新的输入,预测 time;再将 <BOS> long time 输入解码器,预测 no;之后根据 <BOS> long time no 预测 see。在每一步中,解码器都会通过多头注意力关注已经生成的词,并通过编码器—解码器注意力读取源句子的语义信息。当模型最终预测出结束标记 <EOS> 时,生成过程停止,去除 <BOS> 和 <EOS> 后,得到最终翻译结果 “long time no see”。
8. 总结
Transformer 通过自注意力机制实现了高效的并行计算和长距离依赖建模,已成为 NLP 乃至多模态领域的基石。理解其注意力计算、多头设计等,是深入掌握现代深度学习模型的关键一步。
网硕互联帮助中心


评论前必须登录!
注册