游乐游手机版
首页/AI热点日报/热点详情

Transformer内部运作原理核心机制与模型架构深度研究

类型:热点整理2026-07-22
Transformer通过嵌入层与位置编码层将序列映射为矩阵,经编码器与解码器堆叠处理。编码器含自注意力与前馈层,解码器增加编码器-解码器注意力,三者均使用多头注意力机制。注意力计算依赖查询、键、值并应用掩码防止信息泄露。输出经线性层与Softmax生成概率分布,通过交叉熵损失训练。

在第一篇文章中,我们初步了解了Transformer的核心功能、应用场景、高级架构以及它相较于RNN的显著优势。那篇文章如同一张概览地图,帮助我们看清这片“技术大陆”的全貌。现在,是时候深入腹地,真正拆解Transformer的内部运作机制了。我们将详细追踪数据在系统中的流动轨迹,分析每一个步骤的实际计算过程,看看那些矩阵究竟长什么样、维度如何变化。本系列的目标始终如一:不仅要弄明白“它做了什么”,更要理解“它为什么这么做”。

以下是本系列文章的完整路线图,方便你定位:
1、功能概述——Transformer怎么用,为什么比RNN强,架构包含哪些组件,以及训练和推理时的行为。
2、工作原理(本文)——端到端的内部运行,数据流动和每一步的计算过程,包括矩阵表示。
3、多头注意力——Transformer中注意力模块的内部工作方式。
4、为什么注意力能提升性能——不只是“做什么”,更是“为什么这么有效”,注意力如何捕捉句子中词语之间的关系。

1、架构概述

正如我们在第一部分所见,Transformer的主干架构由以下几大组件构成:

作者提供的图像

编码器和解码器的数据输入部分:嵌入层(Embedding layer)和位置编码层(Position Encoding layer)。
解码器堆叠了多个解码器单元,每个单元包含:两个多头注意力层(Multi-Head Attention layer)和一个前馈层(Feed-forward layer)。
输出端(右上方)负责生成最终结果:线性层(Linear layer)和Softmax层。

为了真正理解每个组件各司何职,让我们以训练Transformer完成翻译任务为例,一步步走通整个流程。我们将使用训练样本中的一组数据:输入序列是英文“You are welcome”,目标序列是西班牙语“De nada”。

2、嵌入和位置编码

和任何自然语言处理模型一样,Transformer需要了解每个单词的两个重要属性:单词本身的含义,以及它在句子中的位置。嵌入层负责编码含义,位置编码层则负责标注位置。Transformer将这两种编码向量叠加,得到最终的单词表示。

2.1 嵌入

Transformer有两个嵌入层。输入序列被送入第一个,称为“输入嵌入”。

作者提供的图像

目标序列则被送入第二个,称为“输出嵌入”。不过在输入之前,需要先将目标序列整体向右移动一个位置,并在开头插入一个起始标记。在推理阶段,我们手头并没有目标序列,而是像第一部分介绍的那样,把输出序列循环式地喂给这一层。文本序列首先通过词表被映射成数字形式的单词ID,嵌入层则将每个单词ID转换成对应的嵌入向量,这也是对该单词语义更丰富的表征。

作者提供的图像

2.2 位置编码

RNN由于是循环结构,每个单词依次输入,天然就能感知到位置信息。但Transformer不走这个路子,它是把序列中所有的单词并行输入的——这也是它比RNN架构更高效的核心优势。代价就是位置信息完全丢失了,必须人为补上。

和嵌入层一样,位置编码层也有两个。位置编码是独立于输入序列计算出来的,它只取决于序列的最大长度,是一组固定值。举个例子:第一项用于标记第一个位置,是一个常数;第二项标记第二个位置,是另一个常数,以此类推。这些常数值由以下公式计算得出,其中pos表示单词在序列中的位置,d_model是编码向量的长度(与嵌入向量一致),i则是该向量中的索引值。

作者提供的图像

换句话说,公式在偶数和奇数索引上交替使用正弦曲线和余弦曲线——所有偶数索引用正弦值,所有奇数索引用余弦值。假设我们要对包含40个单词的序列进行编码,下面展示了一些(位置,编码索引)组合对应的数值:

作者提供的图像

蓝色曲线显示的是所有40个单词位置上第0个索引的编码值,橙色曲线则是第1个索引的编码值。其他索引值的曲线形状也类似。

3、矩阵维度

深度学习模型都是一次处理一批训练样本的。嵌入层和位置编码层操作的对象,是一个承载了一个批次序列样本的矩阵。嵌入层接收形状为(样本数,序列长度)的单词ID矩阵,将每个单词ID编码成长度为“嵌入大小”的单词向量,输出矩阵的形状就变成了(样本数,序列长度,嵌入大小)。位置编码的编码大小与嵌入大小一致,所以它产生的矩阵形状相同,可以直接加到嵌入矩阵上。

作者提供的图像

由嵌入层和位置编码层产出的这个(样本数,序列长度,嵌入大小)矩阵,其维度会贯穿整个Transformer,在数据流过编码器和解码器堆栈时保持不变,直到被最后的输出层重新整形。这给出了Transformer中3D矩阵维度的概念。为了便于可视化,从这一步开始,我们先丢掉第一个维度(样本数),用单个样本的2D表示来展示。

作者提供的图像

输入嵌入把它的输出送入编码器。同样地,输出嵌入则把数据送入解码器。

4、编码器

编码器和解码器堆叠,通常由6个相同的编码器和解码器单元串联而成。

作者提供的图像

堆叠中的第一个编码器接收来自嵌入层和位置编码层的输入,而后续的编码器则从前一个编码器接收输入。编码器先将数据传给多头自注意力层,自注意力的输出再进入前馈层,然后将结果向上传递给下一个编码器。

作者提供的图像

要注意,自注意力和前馈这两个子层都带有跨接自身的残差连接,并且每个子层后都跟着一层归一化。最后一个编码器的输出,会像我们接下来要讲的那样,被送入解码器堆叠中的每一个解码器单元。

5、解码器

解码器的结构与编码器非常相似,但也存在几个关键区别。和编码器一样,堆叠中的第一个解码器接收来自输出嵌入和位置编码的输入,后续的解码器则从前一个解码器接收输入。解码器同样先把输入传给它自己的多头自注意力层。不过,这个自注意力层的工作方式与编码器里的略有不同——它只允许关注序列中较早的位置,这是通过屏蔽未来位置来实现的,我们稍后就会谈到。

作者提供的图像

与编码器不同的是,解码器拥有第二个多头注意力层,称为“编码器-解码器注意力层”。它的工作方式与自注意力类似,但融合了两个输入来源:一个来自它下方的自注意力层,另一个来自编码器堆叠的输出。自注意力的输出随后进入前馈层,再向上传递给下一个解码器。

这些子层——自注意力、编码器-解码器注意力、前馈层——同样都带有残差连接和层归一化。

6、注意力机制

在第一部分我们讨论过,在处理序列数据时,注意力机制为何至关重要。在Transformer中,注意力在三个地方发挥作用:

  • 编码器的自注意力:输入序列关注自身
  • 解码器的自注意力:目标序列关注自身
  • 解码器的编码器-解码器注意力:目标序列关注输入序列

注意力层接收三个参数作为输入,分别称为查询(Query)、键(Key)和值(Value)。

在编码器的自注意力中,编码器的输入同时传递给这三个参数。

作者提供的图像

在解码器的自注意力中,解码器的输入同时传递给Query、Key和Value。在解码器的编码器-解码器注意力中,堆叠中最后一个编码器的输出传给Value和Key,而下面那个自注意力(并经过层归一化)模块的输出传给Query。

作者提供的图像

7、多头注意力

Transformer把每一个注意力计算单元称为一个“注意力头”,并且会并行地重复多次计算,这就是多头注意力。它通过组合多个类似但独立的注意力计算,使模型具备了更强的判别能力。

作者提供的图像

Query、Key和Value各自通过独立的线性层(每个都有自己的权重),分别产生三个结果:Q、K和V。然后,它们通过下面这个注意力公式结合起来,计算出注意力分数。

作者提供的图像

这里必须理解的重点是,Q、K、V这三个向量携带的是序列中每个单词的编码表示。注意力计算的核心就是将每个单词与序列中每一个其他单词进行关联,最终得到的注意力分数对序列中的每个单词都编码了一个权重分数。在前面聊到解码器时,我们简单提过“掩码”这个东西,上面的注意力图中也出现了它。现在我们来具体看看它的工作原理。

8、注意力掩码

在计算注意力分数时,注意力模块会执行一个掩码步骤,这有两个目的:
在编码器自注意力和编码器-解码器注意力中: 掩码用于把输入句子中填充位置的注意力输出置零,确保填充操作不会污染自注意力的计算结果。(注意:由于输入序列长度可能参差不齐,就像大多数NLP应用一样,它们会被通过填充标记扩展到统一的向量长度。)

作者提供的图像

编码器-解码器注意力同理。

作者提供的图像

在解码器的自注意力中: 掩码的另一个关键作用是防止解码器在预测下一个单词时,提前“偷看”目标句子还未处理到的部分。解码器利用源序列中的单词来预测目标序列中的单词。训练时,由于采用了教师强制(teacher forcing)策略,完整的目标序列会作为解码器的输入。这样一来,解码器在预测某个位置的单词时,可能无意中用到该单词之前和之后的所有目标单词——这就相当于利用未来时间步中的信息“作弊”。举个例子,当预测第三个单词时,解码器理应只参考目标序列里的前三个输入单词,而不应接触到第四个单词。

作者提供的图像

因此,解码器会把序列中排在当前位置之后的单词屏蔽掉。

作者提供的图像

在计算注意力分数时(参考前面那张展示计算过程的图片),掩码会应用在Softmax之前的分子部分。被屏蔽的元素(图中白色方块)会被设置为负无穷大,这样Softmax函数就会将这些位置的值转换为0。

9、生成输出

堆叠中的最后一个解码器把它的输出传给输出组件,最终转换成完整的输出句子。线性层先将解码器向量投影成单词分数——对于句子中的每个位置,目标词表中每一个独一无二的单词都会对应一个分数。比如,假设最终输出句子有7个单词,目标西班牙语词表包含10000个不重复的单词,那么针对这7个位置,每个位置都会生成10000个分数值。这些分数反映了在该句子位置上,每个单词可能出现的概率。

紧接着,Softmax层把这些分数转换成概率(加起来总和为1.0)。在每个位置上,我们找到概率最高的那个单词的索引,再将这个索引映射回词表中对应的实际单词。这些单词最终组合起来,就是Transformer的输出序列。

作者提供的图像

10、训练与损失函数

在训练阶段,我们使用像交叉熵这样的损失函数,来比较模型生成的输出概率分布与目标序列之间的差异。概率分布告诉我们,每个单词在各自位置出现的可能性。

作者提供的图像

假设我们的目标词表只有四个单词。训练的目标就是生成一个概率分布,让它尽可能匹配我们期望的目标序列“De nada END”。这意味着对于第一个单词位置,概率分布应该给“De”分配接近1的概率,给词表中其他所有单词分配接近0的概率;同理,第二个位置“nada”的概率应是1,第三个位置“END”的概率也是1。和所有深度学习训练一样,这个损失被用来计算梯度,再通过反向传播来更新Transformer的参数。

11、结语

希望通过本文的梳理,能让你对Transformer在训练过程中的内部运作有一个比较透彻的了解。正如上一篇文章讲到的,推理时它是在一个循环中运行的,但大部分处理逻辑保持不变。说到头,多头注意力模块才是赋予Transformer惊人能力的那个关键所在。

来源:https://m.elecfans.com/article/2391658.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。