在 ChatGPT、GPT-4、BERT 等大模型背后,有一个共同的架构基础:Transformer。它由 Google Brain 团队在 2017 年的论文《Attention Is All You Need》中提出,并迅速成为自然语言处理的主流架构。

为什么需要了解 Transformer?
Transformer 解决了传统序列模型的瓶颈:
- 训练效率低:RNN/LSTM 的串行处理难以并行化
- 长距离依赖弱:难以捕获序列中远距离的关系
- 计算成本高:处理长序列时计算复杂度高
Transformer 通过自注意力机制,让模型能并行处理序列,直接建模任意位置间的关系,显著提升了训练效率和模型性能。
本文的目标
本文面向初学者,用通俗语言解释:
- Transformer 的核心原理
- 自注意力机制的工作原理
- 编码器-解码器架构的设计
- 位置编码的作用
- 为什么它成为大模型的基础
一、编码器-解码器架构
Transformer采用编码器-解码器(Encoder-Decoder)架构, 这是序列到序列(Seq2Seq)任务的标准架构。整个模型由两个主要部分组成:

完整的编码器由 N 个相同的层堆叠而成(论文中 N=6), 每一层包含两个核心子层;解码器也由 N 个相同的层堆叠而成, 但每一层包含三个子层(比编码器多一个)。

二、Encoder结构详解

1. 输入层
Transfomer的输入有两种情况:在文章最开始的地方讲过,完整的编码器由N个(论文中N=6)Encoder构成,第一个Encoder的输入是待处理的文本序列,而后续的Encoder的输入则是来自上一个Encoder的输出:
- 如果输入为文本序列,需要将待处理的文本序列转为一个输入词嵌入向量矩阵,并为这些词嵌入向量添加位置编码(直接与嵌入向量相加)。
关于Transformer的位置编码原理可以看我写的另一篇:跳转

2. 核心子层①:多头自注意力、Add & Norm

(1)多头自注意力
关于多头注意力机制及注意力机制的基础知识可以看我的另一篇:跳转
在每一个编码器中都包含了一个多头自注意力层,其计算公式如下:

相比单头自注意力,多头自注意力可以类比为一个小团队: 每个成员都在关注输入序列的不同方面。通过将注意力分为多个头,可以将自注意力机制复制多次,通常设定为8次或者更多。每个头使用不同的权重参数进行自注意力计算。因此模型可以学会从不同的角度关注输入序列,从而捕捉更丰富的信息。多头注意力的输出会被拼接起来,然后通过一个线性层进行整合,最终得到多头自注意力的输入。
(2)注意力掩码:填充注意力掩码
Transformer中应用了两种注意力掩码: 填充注意力掩码、因果注意力掩码,关于注意力掩码的知识可以参考我的另一篇:跳转
在Transformer的编码器中,我们只需要使用填充注意力掩码,对较短的序列进行填充,使所有序列具有相同的长度,以便进行批量处理。
(3)残差连接与归一化层(Add & Norm)
Transformer中的残差连接(Add)与LayerNorm(Norm)是保障深层网络稳定训练、高效传递信息的关键组件:残差连接解决深度网络的梯度消失/退化问题并保留原始信息,LayerNorm稳定特征分布以加速收敛,二者结合支撑了Transformer的深层架构与高性能学习。
- 残差连接(Add)的具体作用:
残差连接的本质是“捷径连接(Skip Connection)”,将子层的输入直接与输出相加(Output = SubLayer(Input) + Input),核心价值体现在能:
解决梯度消失与网络退化问题:
Transformer的编码器/解码器通常包含6~12层,深层网络训练时易出现:
- 梯度消失:梯度反向传播时,经过多层矩阵乘法后数值趋近于0,浅层参数无法有效更新;
- 网络退化:层数增加到一定程度后,模型性能不再提升甚至下降(深层模型难以拟合恒等映射)。
残差连接让梯度可以通过“捷径”直接回流到浅层(无需经过子层的复杂变换),避免梯度消失;同时让模型学习残差映射(H(x) = F(x) + x,F(x)是子层要学习的变换),相比直接学习H(x),残差映射的优化目标更简单,大幅缓解网络退化。
保障信息的完整传递:
子层(如多头注意力)对输入的变换可能丢失部分关键特征(如词的原始语义、位置信息),残差连接让原始输入信息直接传递到后续层,确保底层特征(如词嵌入+位置编码)不会被深层变换“覆盖”。
例如:编码器输入的词嵌入通过残差连接,能持续传递到最后一层,为语义表征保留基础信息。
- 归一化LayerNorm(Norm)的具体作用:
LayerNorm是对每个样本的所有特征维度做归一化(计算均值μ和方差σ,输出(x - μ)/√(σ² + ε))。
稳定训练过程,加速收敛
Transformer的子层输出(如多头注意力的结果)可能因矩阵乘法、激活函数(GELU/ReLU)出现内部协变量偏移(Internal Covariate Shift) ——每层输入的数值分布随训练不断变化,导致模型需要反复适应新分布,收敛缓慢。
LayerNorm将每层输入归一化为“均值0、方差1”的分布,消除数值偏移,让梯度更新更稳定(避免梯度爆炸/消失),允许设置更大的学习率,大幅加速训练。
提升泛化能力,适配NLP场景
- 轻量级正则化:归一化操作可减少过拟合(限制参数的数值波动);
- 不依赖批次:LayerNorm针对单个样本计算,不受批次大小影响(即使小批次/单样本训练也稳定),完美适配NLP中句子长度不一的特点(BatchNorm对变长序列处理困难);
- 激活函数友好:归一化后的输入落在激活函数的“梯度活跃区”(如GELU的非饱和区间),进一步缓解梯度消失。
3. 核心子层②:前馈神经网络、Add & Norm

(1)前馈神经网络(FFNN)
前馈神经网络(Feed-Forward Neural Network,FFNN)是一个包含两个线性层和一个激活函数(ReLu)的简单网络,它可以将上一步得到的输出进行非线性变换。 其公式如下:
FFN
(
x
)
=
max
(
0
,
x
W
1
+
b
1
)
W
2
+
b
2
\text{FFN}(x) = \max(0, xW_1 + b_1) W_2 + b_2
FFN(x)=max(0,xW1+b1)W2+b2
(2)残差连接与归一化层(Add & Norm)
Add & Norm的结构说明见上一节
4. Encoder的输出
从前面的计算步骤中能够得出8个(对应8头自注意力)矩阵Z1~Z8,在这一层中对其进行矩阵Concat,经过线性变换(实际上就是一种矩阵运算),从而得出最终计算的结果,也就是矩阵Z。

三、Decoder结构详解

1. 输入层
Transformer的解码器也由N个(论文中N=6)Decoder组成,
第一个Decoder的输入包含以下两部分:
- 一部分是来自编码器的输出:
- 解码器的核心任务是生成与源序列语义匹配的目标序列(如机器翻译中 “英文→中文”、文本摘要中 “长文本→短摘要”),而非凭空生成。编码器的输出是源序列的全局语义编码(包含源序列所有位置的语义信息和长距离依赖),解码器必须获取这份 “语义参考”,才能保证生成的内容不偏离源序列的核心含义。

- 另一部分则是输入目标序列:
- 在训练阶段,我们会使用目标序列的真值作为输入,这种方法可称为“教师强制”训练。
- 在推理阶段,则是使用模型已经生成的目标序列作为这部分的输入。
shifted right的含义和作用: 通俗地说,Transformer 解码器训练时,把要生成的目标文本(比如翻译后的句子、摘要等)整体“往右挪一格”—— 开头补个 “开始” 标记,结尾删掉最后一个字 / 词;这样模型输入的就只有“到当前位置为止的前面所有内容”,只能凭这些猜下一个该生成啥,就像教孩子接话只说前半句让他补后半句,而不是直接把整句话给他看,保证模型训练时学的“看前面猜下一个”,和实际用的时候(一个字一个字慢慢生成)思路完全一样,不会 “作弊”。

位置编码: 将输入的文本序列转为一个输入词嵌入向量矩阵,并为这些词嵌入向量添加位置编码(直接与嵌入向量相加)。
第2至N个Decoder的输入则包含: 编码器的输出、上一个Decoder的输出。
2. 核心子层①:多头自注意力、Add & Norm
解码器的第一个核心子层与编码器的第一个核心子层结构几乎完全相同,唯一不同的是多头自注意力所使用的掩码机制: 除了使用填充掩码,还需要使用因果掩码,保证生成任务的“自回归逻辑”——生成第 i 个词时,只能关注第 1 至 i 个词(已生成的内容),绝对不能看第 i + 1个及以后的词(未来内容)。

3. 核心子层②:多头自注意力、Add & Norm
这一核心子层同样的由多头自注意力和Add & Norm构成。

多头自注意力的输入包含两部分,一部分来自上一核心子层的输出,另一部分则是来自编码器的输出,并经过多头注意力以及连接计算得到输出。

对多头自注意力的输出和来自上一核心子层的输出进行残差连接和归一化,则得到了这一核心子层的最终输出。
4. 核心子层③:前馈神经网络、Add & Norm
这一子层的结构与编码器的核心子层②完全相同。
5. Decoder的输出
Decoder的输出包含两部分:线性层(Linear)、softmax层。

Linear层负责“维度转换”,把模型内部的语义特征向量转换成对应所有候选词的原始得分;Softmax层负责“分数归一化”,把这些得分变成0~1之间的概率(所有词概率加起来=1),最终能明确“哪个词最该生成”。
- Linear层(线性层):
Transformer解码器最后输出的是一个固定维度的语义向量(比如512维),这个向量只代表“当前位置该生成内容的语义”,但没法直接对应到具体的词。
Linear层就像一个“翻译官”:一边接模型内部的512维语义向量,另一边连着整个词汇表(比如有1万个词),通过简单的线性计算,把512维的语义向量转换成1万维的“原始得分向量”——每个维度对应一个词的“匹配度得分”(得分可正可负,无范围限制)。
- Softmax层:
Linear层输出的原始得分没有统一范围(比如有的词得分10,有的-5),没法直接判断“哪个词更该选”。
Softmax层就像一个“公平裁判”:把所有词的原始得分做归一化处理,让每个词的得分变成0~1之间的概率,且所有词的概率加起来等于1。比如“我”的概率0.9,“你”的概率0.05,“他”的概率0.05,一眼就能看出该选“我”。
Softmax的作用是“量化可能性”,让模型能基于概率选词(训练时算损失,推理时选概率最高的词)。
28

被折叠的 条评论
为什么被折叠?



