Transformer架构
在深度学习驱动自然语言处理,计算机视觉等领域飞速发展的今天,模型对数据结构的适配能力和语义关联的捕捉能力始终是推动技术突破的核心动力,总体而言,模型的结构改变经历了从早期的处理网格结构数据的经典模型到聚焦序列依赖的迭代架构,再到以注意力为核心的革命性设计的过程。
首先,**卷积神经网络(CNN)**凭借着局部感受视野和参数共享特性,在图像等网格数据的特征提取上展现了强大的能力,但是固有的局部特性限制了其对于距离依赖的长序列数据特征的捕捉能力,难以适配文本等序列数据。为了解决这一难题,**循环神经网络(RNN)**应运而生,通过时序循环结构解决数据的距离依赖问题,但是其“逐次运算”的特性导致并行能力很差,而且随着序列长度的增加模型的处理能力也会衰减。
RNN的局限催生出了对更优序列建模方式的探索。Word2Vec等嵌词技术突破了one-hot的局限,首次将离散的词汇映射为低维的连续向量,为模型提供基础的语义表示能力。但真正突破序列建模瓶颈的是Attention机制的提出,Attention机制通过计算各个序列元素的关联权重实现了对全局信息的动态捕捉,解决了RNN等架构对长距离序列特性捕捉不足的问题。
随着大数据时代带来的浩如烟海的数据和对模型训练效率的要求提高,预训练逐渐成为主流范式。通过在大规模无标注数据上预训练通用模型,再针对下游任务进行微调,大幅提高了模型的泛化能力和性能上限。在此背景下,2017年谷歌团队发表的《Attention Is All You Need》论文摒弃了CNN/RNN,完全基于Attention机制提出了Transformer架构,该架构不仅凭借自注意力机制实现了全局依赖的高效捕捉和并行运算,更整合了词嵌入和预训练等技术优势,彻底重塑了自然语言处理的技术格局,成为当今时代大语言模型等前沿技术的核心基础架构。
下文将沿着 “CNN-RNN 的序列建模探索→Word2Vec 的语义表示→Attention 机制的核心突破→预训练技术→《Attention Is All You Need》与 Transformer 架构详解” 的逻辑脉络,系统剖析 Transformer 架构的发展背景、核心原理与技术价值。
CNN-RNN的序列建模探索
CNN
首先我们都知道,图像在计算机中是一堆按顺序排列的数字,数值从0-255,一张简单的RGB图像实际上在计算机中是一个三维张量,那么如何使得神经网络去学习得到图像张量的特征呢,CNN在卷积层中引入了卷积操作,可以捕捉到图像的局部特征而不受其位置的影响,具体来说,卷积的计算过程如下图所示:

CNN的架构由以下几部分组成:
- 输入层
接收原始数据,如图像的像素矩阵。需将数据格式标准化(如调整尺寸、归一化像素值),为后续特征提取做准备。
- 卷积层(核心层)
通过卷积核(过滤器) 对输入数据进行滑动卷积运算,提取局部特征(如边缘、纹理、形状)。核心优势是局部感受野和参数共享,大幅减少计算量的同时,保留特征的空间位置信息。
- 激活函数层
通常紧跟卷积层,引入非线性特征。常用ReLU函数,解决线性模型无法拟合复杂数据分布的问题,增强模型表达能力。
- 池化层(下采样层)
对卷积层输出的特征图进行降维(如最大值池化、平均值池化),减少参数数量和计算量,同时保留关键特征,提升模型对输入微小变化的鲁棒性。
- 全连接层
将多次卷积、池化后的高维特征图“ flatten ”(拉平)为一维向量,通过全连接权重矩阵映射到特定维度,为最终任务(如分类、回归)输出预测结果。
- 输出层
根据任务需求输出结果,如分类任务用Softmax函数输出各类别概率,回归任务直接输出连续值。
如下图所示:

但是CNN的设计初衷是高效处理图像等网格结构数据,CNN 依赖 “局部感受野 + 固定滑动窗口” 提取特征,更适合捕捉空间上的局部关联(如图像中相邻像素的关系)。但序列数据(如句子 “我喜欢编程,因为____有趣”)的核心是时序 / 顺序依赖(前半句决定后半句的语义),这种依赖是动态且长距离的,CNN 的固定窗口无法灵活捕捉。而且CNN 的计算是 “无状态” 的:每一层的输出仅由当前输入的局部区域决定,不保留历史信息。而序列建模需要 “记忆” 前序信息(如理解 “他” 指代前文的 “小明”),CNN 无法实现这种对历史信息的累积与调用。,这直接推动了RNN的出现。
RNN
我们先来看一个很常见的示例:
第一句话:妈妈煮的粉丝爽滑劲道,特别好吃。
第二句话:这位歌手的粉丝遍布全国各地,十分热情。现在的任务是给“粉丝”打Label——我们很清楚,第一句里的“粉丝”是一种食材(食物类别),第二句里的“粉丝”是指明星的追随者(人物群体类别)。
假设我们有大量标注好的数据用于训练模型,若使用全连接神经网络,做法是直接将“粉丝”这个词的特征向量输入模型,训练时让正确Label的输出概率最大。但问题在于,语料库中“粉丝”的Label一半是“食材”、一半是“人物群体”,全连接网络只会孤立地学习“粉丝”这个词本身的向量,完全忽略上下文信息。
这会导致模型训练陷入困境:预测“粉丝”的Label时, accuracy 完全取决于训练集中哪种Label占比更高(比如食材Label多,就大概率预测成食材),根本无法根据实际语境区分含义——这样的模型完全无法满足命名实体识别的需求。
问题的核心就在于:全连接神经网络无法结合上下文,只能单独学习单个词的Label。为了解决这个“忽略语境依赖”的痛点,循环神经网络(RNN)才应运而生。
与传统的前馈神经网络不同,RNN 具有"记忆"能力,能够保存之前步骤的信息。
RNN之所以可以做到这一点是因为RNN能够利用前一步的隐藏状态(Hidden State)来影响当前步骤的输出,从而捕捉序列中的时序依赖关系。
所以RNN的核心在于循环连接,即网络的输出不仅取决于当前输入,还取决于之前所有时间步的输入。这种结构使 RNN 能够处理任意长度的序列数据。下图是n-to-n的RNN网络结构

公式如下:
O
t
=
g
(
V
⋅
S
t
)
O_t = g(V \cdot S_t) \\
Ot=g(V⋅St)
S
t
=
f
(
U
⋅
X
t
+
W
⋅
S
t
−
1
)
S_t = f(U \cdot X_t + W \cdot S_{t-1})
St=f(U⋅Xt+W⋅St−1)
RNN虽然解决了传统神经网络不能处理序列数据的痛点,但是RNN虽然理论上可以记住任意长度的历史信息,但是存在梯度爆炸/消失的问题:
假设整个序列的损失为各时间步损失之和:
L
=
∑
t
=
1
T
L
t
L = \sum_{t=1}^T L_t
L=t=1∑TLt
其中
L
t
L_t
Lt是第
t
t
t时间步的损失(如输出
O
t
O_t
Ot与真实标签的误差)。
RNN中隐藏层状态
S
t
S_t
St依赖前一时间步的
S
t
−
1
S_{t-1}
St−1,而
W
W
W是隐藏层到自身的权重,因此损失对
W
W
W的梯度需要通过“时间反向传播(BPTT)”计算:
∂
L
∂
W
=
∑
t
=
1
T
∂
L
t
∂
W
\frac{\partial L}{\partial W} = \sum_{t=1}^T \frac{\partial L_t}{\partial W}
∂W∂L=t=1∑T∂W∂Lt
对某一时刻
t
t
t,由链式法则拆解:
∂
L
t
∂
W
=
∑
k
=
1
t
∂
L
t
∂
O
t
⋅
∂
O
t
∂
S
t
⋅
∂
S
t
∂
S
k
⋅
∂
S
k
∂
W
\frac{\partial L_t}{\partial W} = \sum_{k=1}^t \frac{\partial L_t}{\partial O_t} \cdot \frac{\partial O_t}{\partial S_t} \cdot \frac{\partial S_t}{\partial S_k} \cdot \frac{\partial S_k}{\partial W}
∂W∂Lt=k=1∑t∂Ot∂Lt⋅∂St∂Ot⋅∂Sk∂St⋅∂W∂Sk
其中,关键项是 隐藏状态对前序状态的导数
∂
S
t
∂
S
k
\frac{\partial S_t}{\partial S_k}
∂Sk∂St(
k
<
t
k < t
k<t),结合前向公式
S
t
=
f
(
U
⋅
X
t
+
W
⋅
S
t
−
1
)
S_t = f(U \cdot X_t + W \cdot S_{t-1})
St=f(U⋅Xt+W⋅St−1),其导数为:
∂
S
t
∂
S
t
−
1
=
f
′
(
U
⋅
X
t
+
W
⋅
S
t
−
1
)
⋅
W
\frac{\partial S_t}{\partial S_{t-1}} = f'(U \cdot X_t + W \cdot S_{t-1}) \cdot W
∂St−1∂St=f′(U⋅Xt+W⋅St−1)⋅W
(
f
′
f'
f′是激活函数的导数,如tanh导数范围为
[
0
,
1
]
[0,1]
[0,1],sigmoid为
[
0
,
0.25
]
[0,0.25]
[0,0.25])
当
t
≫
k
t \gg k
t≫k时,
∂
S
t
∂
S
k
\frac{\partial S_t}{\partial S_k}
∂Sk∂St是多个时间步导数的乘积:
∂
S
t
∂
S
k
=
∏
i
=
k
+
1
t
[
f
′
(
U
⋅
X
i
+
W
⋅
S
i
−
1
)
⋅
W
]
\frac{\partial S_t}{\partial S_k} = \prod_{i=k+1}^t \left[ f'(U \cdot X_i + W \cdot S_{i-1}) \cdot W \right]
∂Sk∂St=i=k+1∏t[f′(U⋅Xi+W⋅Si−1)⋅W]
- 若 ∣ f ′ ⋅ W ∣ > 1 |f' \cdot W| > 1 ∣f′⋅W∣>1:多次乘积后,梯度会随时间步增加呈指数级增大 → 梯度爆炸;
- 若 ∣ f ′ ⋅ W ∣ < 1 |f' \cdot W| < 1 ∣f′⋅W∣<1:多次乘积后,梯度会随时间步增加呈指数级衰减 → 梯度消失。
- 需要注意的是,RNN和DNN梯度消失和梯度爆炸含义并不相同。RNN所谓梯度消失的真正含义是,梯度被近距离( t + 1 趋向于 T t+1 趋向于 T t+1趋向于T)梯度主导,远距离( t + 1 远离 T t+1 远离 T t+1远离T)梯度很小,导致模型难以学到远距离的信息。
所以RNN理论上能记住长序列信息,却因梯度问题难以学习长距离依赖数据。于是就产生了LSTM(长短时记忆网络)。
LSTM
LSTM(长短时记忆网络)是一种常用于处理序列数据的深度学习模型,与传统的 RNN(循环神经网络)相比,LSTM引入了三个门( 输入门、遗忘门、输出门)和一个细胞状态(cell state),这些机制使得LSTM能够更好地处理序列中的长期依赖关系。

如上图所示,为 LSTM 的 RNN 门控结构(LSTM 的 timestep),LSTM 前向传播过程包括:
- 遗忘门:决定了丢弃哪些信息,遗忘门接收
t
−
1
t-1
t−1时刻的状态
h
t
−
1
h_{t-1}
ht−1,以及当前的输入
x
t
x_t
xt,经过 Sigmoid 函数后输出一个 0 到 1 之间的值
f
t
f_t
ft
- 输出: f t = σ ( W f h t − 1 + U f x t + b f ) f_{t} = \sigma(W_fh_{t-1} + U_fx_{t} + b_f) ft=σ(Wfht−1+Ufxt+bf)
- 输入门:决定了哪些新信息被保留,并更新细胞状态,输入们的取值由
h
t
−
1
h_{t-1}
ht−1和
x
t
x_t
xt决定,通过 Sigmoid 函数得到一个 0 到 1 之间的值
i
t
i_t
it,而
tanh
\tanh
tanh函数则创造了一个当前细胞状态的候选
a
t
a_t
at
- 输出: i t = σ ( W i h t − 1 + U i x t + b i ) i_{t} = \sigma(W_ih_{t-1} + U_ix_{t} + b_i) it=σ(Wiht−1+Uixt+bi), C t ~ = t a n h W a h t − 1 + U a x t + b a \tilde{C_{t} }= tanhW_ah_{t-1} + U_ax_{t} + b_a Ct~=tanhWaht−1+Uaxt+ba
- 细胞状态:旧细胞状态
C
t
−
1
C_{t-1}
Ct−1被更新到新的细胞状态
C
t
C_t
Ct上,
- 输出: C t = C t − 1 ⊙ f t + i t ⊙ C t ~ C_{t} = C_{t-1}\odot f_{t} + i_{t}\odot \tilde{C_{t} } Ct=Ct−1⊙ft+it⊙Ct~
- 输出门:决定了最后输出的信息,输出门取值由
h
t
−
1
h_{t-1}
ht−1和
x
t
x_t
xt决定,通过 Sigmoid 函数得到一个 0 到 1 之间的值
o
t
o_t
ot,最后通过
tanh
\tanh
tanh函数决定最后输出的信息
- 输出: o t = σ ( W o h t − 1 + U o x t + b o ) o_{t} = \sigma(W_oh_{t-1} + U_ox_{t} + b_o) ot=σ(Woht−1+Uoxt+bo), h t = o t ⊙ t a n h C t h_{t} = o_{t}\odot tanhC_{t} ht=ot⊙tanhCt
- 预测输出: y ^ t = σ ( V h t + c ) \hat{y}_{t} = \sigma(Vh_{t}+c) y^t=σ(Vht+c)
LSTM之所以能破解RNN的梯度困境,核心在于其反向传播的梯度不再是固定值,而是可自主调节在[0,1]区间甚至大于1——这直接避免了梯度持续衰减的问题,让远距离信息的梯度得以保留,从根本上缓解了梯度消失。
这一特性的关键载体是遗忘门的输出值 f t f_t ft:它的取值被约束在[0,1]之间,既能在接近1时让梯度流“畅通无阻”,使远距离信息的梯度不被磨灭;也能在接近0时主动“阻断”梯度,让模型选择性遗忘冗余的历史信息。这种灵活的梯度控制机制,正是LSTM突破RNN局限的核心。
此外,LSTM的复杂结构(包含遗忘门、输入门、输出门等多个控制单元)带来了另一重优势:参数量达到RNN的四倍。更多的参数赋予模型更精细的调节能力,能更精准地捕捉时间序列中的细微变化,这也是其在复杂时序预测任务中表现更优的重要原因。
尽管比 RNN 更擅长处理长依赖,但当序列长度极长(如超过数百个时间步)时,LSTM 的门机制对信息的 “筛选 - 保留” 能力会逐渐衰减,无法完美记住超远距离的依赖关系(例如文本中相隔上千词的语义关联)。而且LSTM 依赖 “前一时刻状态” 的循环结构,导致无法进行大规模并行计算。
Word2Vec 的语义表示
在看Attention机制之前,我们先来了解几个重要的技术突破,而Word2Vec 的语义表示正是其中关键一环—— 它的核心价值,在于彻底解决了传统自然语言处理中 “词表示” 的核心瓶颈,为后续深度学习模型(包括 Attention 机制)处理文本奠定了语义基础。
之所以要专门进行 Word2Vec 式的语义表示,本质是为了弥补传统词表示方法的缺陷,满足模型对 “语义关联性” 的需求。
在 Word2Vec 出现前,NLP 中主流的词表示方法是one-hot 编码(独热编码)
one-hot编码
One-Hot编码(一位有效编码)是一种离散特征的编码方式:对于包含 N N N个不同类别的特征,用一个 N N N维向量表示每个类别,其中仅对应该类别的位置为1,其余位置均为0,任意时刻只有一位“有效”(值为1)。
机器学习中,回归、分类、聚类等任务依赖特征间的距离(如欧氏距离)或相似度(如余弦相似度)计算,而这些计算均基于欧式空间。One-Hot编码的核心价值,就是将“离散符号化”的特征(如类别、标签)转化为“欧式空间向量”,让特征间的距离计算更合理。
举例:以“水果类型”特征为例
假设特征“水果类型”包含3个类别:苹果、香蕉、橙子。
- 若用数字编码(直接赋值1、2、3):苹果=1,香蕉=2,橙子=3。
此时计算距离会出现逻辑错误——苹果与香蕉的距离(1)、香蕉与橙子的距离(1),远小于苹果与橙子的距离(2),但从语义上三者是平等的类别,这种距离关系毫无意义。 - 用One-Hot编码:
苹果 = [1, 0, 0],香蕉 = [0, 1, 0],橙子 = [0, 0, 1]。
三者在欧式空间中两两距离相等(均为 2 \sqrt{2} 2),余弦相似度均为0,完美契合“类别间相互独立、地位平等”的语义逻辑,让后续距离计算更合理。
尽管One-Hot编码在简单离散特征处理中有效,但在自然语言处理等复杂场景下,存在两大致命缺陷:
-
维度灾难
若特征的类别数量极多(如语料库包含10万个词汇),One-Hot编码后每个词需用10万维向量表示,向量维度随类别数线性增长,会导致特征矩阵过于稀疏,模型计算量剧增、训练效率骤降。 -
语义孤立
One-Hot向量间是“正交关系”(相似度为0),无法体现类别间的语义关联。例如:- 编码后“苹果”=[1,0,0,0]、“香蕉”=[0,1,0,0]、“电脑”=[0,0,1,0],三者相似度均为0。
但从语义上,“苹果”和“香蕉”同属水果,关联性远高于与“电脑”的关联,One-Hot编码完全无法捕捉这种潜在语义,导致模型难以学习到有价值的关联信息。
- 编码后“苹果”=[1,0,0,0]、“香蕉”=[0,1,0,0]、“电脑”=[0,0,1,0],三者相似度均为0。
正是这些缺陷,推动了Word2Vec等词嵌入技术的出现——通过低维稠密向量,同时解决维度灾难与语义关联捕捉问题。
Word2Vec
首先明确Word2Vec的核心目标:将词汇表中的每个词 w w w映射为一个低维稠密向量 v ⃗ w ∈ R d \vec{v}_w \in \mathbb{R}^d vw∈Rd( d ≪ 词汇表大小 V d \ll \text{词汇表大小} V d≪词汇表大小V),使向量能体现词的语义关联。
Word2Vec包含两种对称模型,核心是通过“上下文-目标词”的共现关系训练词向量,区别在于“输入”与“输出”的定义相反。

1. Skip-gram模型:由目标词预测上下文词
(1)任务定义
给定目标词 w t w_t wt,最大化其生成上下文词 { w t − C , . . . , w t − 1 , w t + 1 , . . . , w t + C } \{w_{t-C}, ..., w_{t-1}, w_{t+1}, ..., w_{t+C}\} {wt−C,...,wt−1,wt+1,...,wt+C}的联合概率。
(2)条件概率建模
假设上下文词之间相互独立(简化假设),联合概率可分解为多个条件概率的乘积:
P
(
{
w
t
−
k
}
k
=
1
C
,
{
w
t
+
k
}
k
=
1
C
∣
w
t
)
=
∏
k
=
1
C
P
(
w
t
−
k
∣
w
t
)
⋅
P
(
w
t
+
k
∣
w
t
)
P(\{w_{t-k}\}_{k=1}^C, \{w_{t+k}\}_{k=1}^C \mid w_t) = \prod_{k=1}^C P(w_{t-k} \mid w_t) \cdot P(w_{t+k} \mid w_t)
P({wt−k}k=1C,{wt+k}k=1C∣wt)=k=1∏CP(wt−k∣wt)⋅P(wt+k∣wt)
单个条件概率
P
(
w
o
∣
w
i
)
P(w_o \mid w_i)
P(wo∣wi)(
w
i
w_i
wi为输入目标词,
w
o
w_o
wo为输出上下文词)用Softmax函数建模,本质是通过输入向量与输出向量的内积衡量语义相关性:
P
(
w
o
∣
w
i
)
=
exp
(
u
⃗
w
o
T
⋅
v
⃗
w
i
)
∑
w
′
=
1
V
exp
(
u
⃗
w
′
T
⋅
v
⃗
w
i
)
P(w_o \mid w_i) = \frac{\exp(\vec{u}_{w_o}^T \cdot \vec{v}_{w_i})}{\sum_{w'=1}^V \exp(\vec{u}_{w'}^T \cdot \vec{v}_{w_i})}
P(wo∣wi)=∑w′=1Vexp(uw′T⋅vwi)exp(uwoT⋅vwi)
(3)目标函数(对数似然最大化)
为简化计算,将“最大化联合概率”转化为“最大化对数联合似然”(对数函数单调递增,不改变极值点)。设语料总长度为
T
T
T,则整体目标函数为:
J
=
∑
t
=
1
T
∑
k
=
1
C
[
log
P
(
w
t
−
k
∣
w
t
)
+
log
P
(
w
t
+
k
∣
w
t
)
]
\mathcal{J} = \sum_{t=1}^T \sum_{k=1}^C \left[ \log P(w_{t-k} \mid w_t) + \log P(w_{t+k} \mid w_t) \right]
J=t=1∑Tk=1∑C[logP(wt−k∣wt)+logP(wt+k∣wt)]
代入Softmax概率公式,展开得:
J
=
∑
t
=
1
T
∑
k
=
1
C
[
u
⃗
w
t
±
k
T
⋅
v
⃗
w
t
−
log
(
∑
w
′
=
1
V
exp
(
u
⃗
w
′
T
⋅
v
⃗
w
t
)
)
]
\mathcal{J} = \sum_{t=1}^T \sum_{k=1}^C \left[ \vec{u}_{w_{t\pm k}}^T \cdot \vec{v}_{w_t} - \log\left( \sum_{w'=1}^V \exp(\vec{u}_{w'}^T \cdot \vec{v}_{w_t}) \right) \right]
J=t=1∑Tk=1∑C[uwt±kT⋅vwt−log(w′=1∑Vexp(uw′T⋅vwt))]
2. CBOW模型:由上下文词预测目标词
(1)任务定义
与Skip-gram相反:给定上下文词集合 { w t − C , . . . , w t − 1 , w t + 1 , . . . , w t + C } \{w_{t-C}, ..., w_{t-1}, w_{t+1}, ..., w_{t+C}\} {wt−C,...,wt−1,wt+1,...,wt+C},最大化其生成目标词 w t w_t wt的概率。
(2)条件概率建模
首先对所有上下文词的输入向量取平均,得到上下文向量
v
⃗
a
v
g
\vec{v}_{avg}
vavg:
v
⃗
a
v
g
=
1
2
C
∑
k
=
1
C
(
v
⃗
w
t
−
k
+
v
⃗
w
t
+
k
)
\vec{v}_{avg} = \frac{1}{2C} \sum_{k=1}^C \left( \vec{v}_{w_{t-k}} + \vec{v}_{w_{t+k}} \right)
vavg=2C1k=1∑C(vwt−k+vwt+k)
再用Softmax函数建模“上下文→目标词”的条件概率:
P
(
w
t
∣
{
w
t
−
k
,
w
t
+
k
}
k
=
1
C
)
=
exp
(
u
⃗
w
t
T
⋅
v
⃗
a
v
g
)
∑
w
′
=
1
V
exp
(
u
⃗
w
′
T
⋅
v
⃗
a
v
g
)
P(w_t \mid \{w_{t-k}, w_{t+k}\}_{k=1}^C) = \frac{\exp(\vec{u}_{w_t}^T \cdot \vec{v}_{avg})}{\sum_{w'=1}^V \exp(\vec{u}_{w'}^T \cdot \vec{v}_{avg})}
P(wt∣{wt−k,wt+k}k=1C)=∑w′=1Vexp(uw′T⋅vavg)exp(uwtT⋅vavg)
(3)目标函数
同理,整体对数似然目标函数为:
J
=
∑
t
=
1
T
log
P
(
w
t
∣
{
w
t
−
k
,
w
t
+
k
}
k
=
1
C
)
=
∑
t
=
1
T
[
u
⃗
w
t
T
⋅
v
⃗
a
v
g
−
log
(
∑
w
′
=
1
V
exp
(
u
⃗
w
′
T
⋅
v
⃗
a
v
g
)
)
]
\mathcal{J} = \sum_{t=1}^T \log P(w_t \mid \{w_{t-k}, w_{t+k}\}_{k=1}^C) = \sum_{t=1}^T \left[ \vec{u}_{w_t}^T \cdot \vec{v}_{avg} - \log\left( \sum_{w'=1}^V \exp(\vec{u}_{w'}^T \cdot \vec{v}_{avg}) \right) \right]
J=t=1∑TlogP(wt∣{wt−k,wt+k}k=1C)=t=1∑T[uwtT⋅vavg−log(w′=1∑Vexp(uw′T⋅vavg))]
模型训练的本质是通过随机梯度上升(SGD) 优化上述目标函数,更新所有 v ⃗ w \vec{v}_w vw(输入向量)和 u ⃗ w \vec{u}_w uw(输出向量)。
训练结束后,取输入向量 v ⃗ w \vec{v}_w vw作为最终的词向量(或取 v ⃗ w \vec{v}_w vw与 u ⃗ w \vec{u}_w uw的平均,实践中输入向量效果更优)。此时的 v ⃗ w \vec{v}_w vw已通过“共现关系”编码了词的语义——共现频率高的词,其向量在空间中的距离更近。
Word2Vec的本质是**“基于上下文-目标词共现的概率模型”**:通过定义Skip-gram/CBOW的条件概率分布,以对数似然最大化为目标,用SGD+负采样/层次Softmax优化参数,最终得到能体现语义关联的低维词向量。
Attention 机制
在 Attention 出现前,RNN/LSTM 是序列建模的主流,但存在两大核心局限:长距离依赖衰减和并行性差。
Attention 机制的本质是 “直接计算序列中任意两个位置的关联强度”,无需顺序传递状态,既实现了长距离依赖的精准捕捉,又支持并行计算。
先定义如下数学符号:
| 符号 | 含义 | 维度说明 |
|---|---|---|
| X ∈ R L × d m o d e l X \in \mathbb{R}^{L \times d_{model}} X∈RL×dmodel | 输入序列(如词嵌入序列) | L L L:序列长度, d m o d e l d_{model} dmodel:输入维度 |
| Q ∈ R L × d k Q \in \mathbb{R}^{L \times d_k} Q∈RL×dk | 查询向量(Query):代表“当前位置需要什么信息” | d k d_k dk:Q/K的维度(超参数) |
| K ∈ R L × d k K \in \mathbb{R}^{L \times d_k} K∈RL×dk | 键向量(Key):代表“其他位置提供什么信息” | 与Q维度一致(保证内积可计算) |
| V ∈ R L × d v V \in \mathbb{R}^{L \times d_v} V∈RL×dv | 值向量(Value):代表“其他位置的具体信息内容” | d v d_v dv:V的维度(超参数) |
| W Q ∈ R d m o d e l × d k W_Q \in \mathbb{R}^{d_{model} \times d_k} WQ∈Rdmodel×dk | Q的线性变换权重矩阵 | 可学习参数 |
| W K ∈ R d m o d e l × d k W_K \in \mathbb{R}^{d_{model} \times d_k} WK∈Rdmodel×dk | K的线性变换权重矩阵 | 可学习参数 |
| W V ∈ R d m o d e l × d v W_V \in \mathbb{R}^{d_{model} \times d_v} WV∈Rdmodel×dv | V的线性变换权重矩阵 | 可学习参数 |
| Attn ( Q , K , V ) ∈ R L × d v \text{Attn}(Q,K,V) \in \mathbb{R}^{L \times d_v} Attn(Q,K,V)∈RL×dv | Attention机制的输出 | 序列长度不变,维度为 d v d_v dv |
Attention 机制
为了解决RNN/LSTM 处理长序列时,信息要靠 “前一时刻状态→当前状态” 的顺序传递的问题,我们需要对全序列进行一个分配“权重”的处理。
输入序列
X
X
X本身无法直接用于关联计算,需通过线性变换生成Q、K、V(引入可学习参数,让模型学习“如何定义查询、键、值”):
{
Q
=
X
⋅
W
Q
K
=
X
⋅
W
K
V
=
X
⋅
W
V
\begin{cases} Q = X \cdot W_Q \\ K = X \cdot W_K \\ V = X \cdot W_V \end{cases}
⎩
⎨
⎧Q=X⋅WQK=X⋅WKV=X⋅WV
- 作用:将输入 X X X投影到不同的子空间(Q/K/V空间),使后续的关联计算更具表达能力,而非直接使用原始输入向量。
后续需要计算序列之间的相似度,相似度得分衡量“当前查询Q与每个键K的关联强度”,得分越高,对应V的权重越大。常见的得分函数有3种,Transformer中采用缩放点积得分(Scaled Dot-Product),数学定义如下:
Score
(
Q
,
K
)
=
Q
⋅
K
T
d
k
\text{Score}(Q, K) = \frac{Q \cdot K^T}{\sqrt{d_k}}
Score(Q,K)=dkQ⋅KT
- 基础点积: Q ⋅ K T Q \cdot K^T Q⋅KT直接计算Q与K的内积,内积越大,向量相似度越高(假设向量已归一化)。
- 缩放因子 d k \sqrt{d_k} dk:当 d k d_k dk较大时,点积结果的数值会过大,导致Softmax函数输出趋近于0或1,梯度消失。除以 d k \sqrt{d_k} dk可将得分的方差归一化为1,保证Softmax的梯度稳定。
通过Softmax函数将相似度得分转化为概率分布权重,确保权重非负且和为1,数学定义:
W
=
Softmax
(
Q
⋅
K
T
d
k
)
∈
R
L
×
L
W = \text{Softmax}\left( \frac{Q \cdot K^T}{\sqrt{d_k}} \right) \in \mathbb{R}^{L \times L}
W=Softmax(dkQ⋅KT)∈RL×L
- 物理意义:矩阵 W W W中第 i i i行第 j j j列的元素 W i , j W_{i,j} Wi,j,代表“第 i i i个位置的查询,对第 j j j个位置的值的注意力权重”——权重越大,说明第 j j j个位置的信息对第 i i i个位置越重要。
将注意力权重与值向量
V
V
V进行加权求和,得到每个位置的最终Attention输出,数学定义:
Attention
(
Q
,
K
,
V
)
=
W
⋅
V
=
Softmax
(
Q
⋅
K
T
d
k
)
⋅
V
\text{Attention}(Q,K,V) = W \cdot V = \text{Softmax}\left( \frac{Q \cdot K^T}{\sqrt{d_k}} \right) \cdot V
Attention(Q,K,V)=W⋅V=Softmax(dkQ⋅KT)⋅V
- 维度验证: W ∈ R L × L W \in \mathbb{R}^{L \times L} W∈RL×L与 V ∈ R L × d v V \in \mathbb{R}^{L \times d_v} V∈RL×dv相乘,输出维度为 R L × d v \mathbb{R}^{L \times d_v} RL×dv,保持序列长度 L L L不变,仅维度由 d m o d e l d_{model} dmodel转化为 d v d_v dv。

假设你在看一段话,要理解其中“他”指的是谁。
你的大脑在干的事,其实就是一次 Attention:
- Q(Query):当前的问题,比如“他是谁?”
- K(Key):句子中每个词的“身份标签”,比如 “小明”、“买了”、“一个”、“苹果”、“他”、“吃了”、“它”。
- V(Value):每个词携带的语义内容,比如小明=男生概念、苹果=食物概念、他=代词信息。
你的大脑做的运算就是:
对每个词 K i K_i Ki,计算当前问题 Q Q Q(“他是谁”)与 K i K_i Ki(“小明”“苹果”等)的相似度:结果可能是:
词 相似度 Softmax 权重 小明 高 0.8 苹果 低 0.1 它 一般 0.1 于是注意力权重告诉你:“他”最可能指的是“小明”。
接着,用这些权重加权每个词的语义信息 (V_i):
Output = 0.8 V 小明 + 0.1 V 苹果 + 0.1 V 它 \text{Output} = 0.8V_{\text{小明}} + 0.1V_{\text{苹果}} + 0.1V_{\text{它}} Output=0.8V小明+0.1V苹果+0.1V它
得到的结果就成了“他”在语义上的最合理解释。
Q 是问题,K 是候选答案,QK 计算问题与答案的匹配度,Softmax 把它变成概率,然后这些概率再去加权每个答案(V)中携带的信息。
输出结果,就是“综合考虑所有候选答案后最合适的解释”。对于序列来说,就是找到与我当前序列关系最密切的序列。
Self-Attention
Self-Attention(自注意力)是Attention的特殊场景,核心区别在于Q、K、V均来自同一输入序列,用于捕捉序列内部任意位置之间的依赖关系
当输入序列为
X
∈
R
L
×
d
m
o
d
e
l
X \in \mathbb{R}^{L \times d_{model}}
X∈RL×dmodel时,Self-Attention满足:
Q
=
K
=
V
=
X
⋅
W
Q
=
X
⋅
W
K
=
X
⋅
W
V
Q = K = V = X \cdot W_Q = X \cdot W_K = X \cdot W_V \quad
Q=K=V=X⋅WQ=X⋅WK=X⋅WV
(
仅当
W
Q
=
W
K
=
W
V
时,实际中三者为独立可学习矩阵
)
(\text{仅当} \ W_Q=W_K=W_V \text{时,实际中三者为独立可学习矩阵})
(仅当 WQ=WK=WV时,实际中三者为独立可学习矩阵)
序列中的每个位置都作为“查询者”,向序列中所有位置(包括自身)“查询”关联信息,实现全局依赖的并行捕捉。
Q K T QK^T QKT其实就会组成一个 word2word 的 attention map!(加了 softmax 之后就是一个合为 1 的权重了)。比如说你的输入是一句 4 个token的话,这里就会形成一张 4x4 的注意力机制的图
这样一来,每一个token对应每一个单词都会有一个权重,这也是 Self Attention 名字的来源,即 Attention 的计算来源于 Source(源句) 和 Source 本身,通俗点讲就是 Q、K、V 都来源于输入 X 本身。

无论句子序列多长,都可以充分捕获近距离上往下问中的任何依赖关系,进而可以很好的提取句法特征还可以提取语义特征;而且对于一个句子而言,每个单词的计算是可以并行处理的。
Masked Self-Attention
将掩码矩阵
M
M
M与原始得分矩阵
Score
\text{Score}
Score逐元素相加,对“禁止关注”的位置进行屏蔽,这是Masked机制的核心公式:
Score
masked
=
Score
+
M
\text{Score}_{\text{masked}} = \text{Score} + M
Scoremasked=Score+M
- 数学逻辑:
- 允许关注的位置: M i , j = 0 M_{i,j} = 0 Mi,j=0, Score masked , i , j = Score i , j \text{Score}_{\text{masked},i,j} = \text{Score}_{i,j} Scoremasked,i,j=Scorei,j,原始得分不变;
- 禁止关注的位置: M i , j = − ∞ M_{i,j} = -\infty Mi,j=−∞, Score masked , i , j = − ∞ \text{Score}_{\text{masked},i,j} = -\infty Scoremasked,i,j=−∞,后续Softmax后权重归零。
基于掩码后的得分矩阵,通过Softmax得到权重,再与V加权求和,公式如下:
W
=
Softmax
(
Score
masked
)
=
Softmax
(
Q
⋅
K
T
d
k
+
M
)
W = \text{Softmax}(\text{Score}_{\text{masked}}) = \text{Softmax}\left( \frac{Q \cdot K^T}{\sqrt{d_k}} + M \right)
W=Softmax(Scoremasked)=Softmax(dkQ⋅KT+M)
Masked Self-Attention ( X ) = W ⋅ V \text{Masked Self-Attention}(X) = W \cdot V Masked Self-Attention(X)=W⋅V
- 核心意义:掩码通过将无效位置得分设为 − ∞ -\infty −∞,使Softmax后对应权重为0,确保输出仅由“允许关注的位置信息”融合生成。
在文本生成等自回归任务等任务中,常使用因果掩码(Causal Mask)以实现“单向注意力”
,强制每个位置仅能关注“自身及之前的位置”,避免“未来信息泄露”。
M
causal
,
i
,
j
=
{
0
(
j
≤
i
,
允许关注历史/当前位置
)
−
∞
(
j
>
i
,
屏蔽未来位置
)
M_{\text{causal},i,j} = \begin{cases} 0 & (j \leq i, \text{允许关注历史/当前位置}) \\ -\infty & (j > i, \text{屏蔽未来位置}) \end{cases}
Mcausal,i,j={0−∞(j≤i,允许关注历史/当前位置)(j>i,屏蔽未来位置)
- 矩阵形式(以 L = 3 L=3 L=3为例):
M causal = [ 0 − ∞ − ∞ 0 0 − ∞ 0 0 0 ] M_{\text{causal}} = \begin{bmatrix} 0 & -\infty & -\infty \\ 0 & 0 & -\infty \\ 0 & 0 & 0 \end{bmatrix} Mcausal= 000−∞00−∞−∞0
确保生成文本时,模型只能基于已生成的前文预测下一个词,符合人类语言的“时序生成逻辑”,避免直接利用后续未生成的信息作弊。
Multi-Head Attention

对输入特征矩阵
X
∈
R
L
×
d
model
X \in \mathbb{R}^{L \times d_{\text{model}}}
X∈RL×dmodel(可为词嵌入+位置嵌入的融合结果),通过
h
h
h组独立的线性变换,生成
h
h
h组Q、K、V,实现特征向不同子空间的投射:
{
Q
i
=
X
⋅
W
Q
i
K
i
=
X
⋅
W
K
i
V
i
=
X
⋅
W
V
i
(
i
=
1
,
2
,
.
.
.
,
h
)
\begin{cases} Q^i = X \cdot W_Q^i \\ K^i = X \cdot W_K^i \\ V^i = X \cdot W_V^i \end{cases} \quad (i=1,2,...,h)
⎩
⎨
⎧Qi=X⋅WQiKi=X⋅WKiVi=X⋅WVi(i=1,2,...,h)
- X ∈ R L × d model X \in \mathbb{R}^{L \times d_{\text{model}}} X∈RL×dmodel与 W Q i ∈ R d model × d k W_Q^i \in \mathbb{R}^{d_{\text{model}} \times d_k} WQi∈Rdmodel×dk相乘,得到 Q i ∈ R L × d k Q^i \in \mathbb{R}^{L \times d_k} Qi∈RL×dk,K、V维度相同。
- 每个头的线性变换矩阵不同,意味着将输入特征投射到不同的语义子空间(如有的头关注语法结构,有的头关注语义关联),为捕捉多样化依赖关系奠定基础。
第
i
i
i个头的Attention计算完全复用基础Attention公式,基于自身的
Q
i
,
K
i
,
V
i
Q^i, K^i, V^i
Qi,Ki,Vi得到输出
Head
i
\text{Head}_i
Headi:
Head
i
=
Attention
(
Q
i
,
K
i
,
V
i
)
=
Softmax
(
Q
i
⋅
(
K
i
)
T
d
k
)
⋅
V
i
\text{Head}_i = \text{Attention}(Q^i, K^i, V^i) = \text{Softmax}\left( \frac{Q^i \cdot (K^i)^T}{\sqrt{d_k}} \right) \cdot V^i
Headi=Attention(Qi,Ki,Vi)=Softmax(dkQi⋅(Ki)T)⋅Vi
将
h
h
h个头部的输出沿特征维度拼接,得到高维特征矩阵,再通过线性变换
W
O
W_O
WO压缩回模型原始维度
d
model
d_{\text{model}}
dmodel:
MultiHead
(
X
)
=
(
Concat
(
Head
1
,
Head
2
,
.
.
.
,
Head
h
)
)
⋅
W
O
\text{MultiHead}(X) = \left( \text{Concat}(\text{Head}_1, \text{Head}_2, ..., \text{Head}_h) \right) \cdot W_O
MultiHead(X)=(Concat(Head1,Head2,...,Headh))⋅WO
- Concat ( Head 1 , . . . , Head h ) ∈ R L × ( h ⋅ d v ) \text{Concat}(\text{Head}_1, ..., \text{Head}_h) \in \mathbb{R}^{L \times (h \cdot d_v)} Concat(Head1,...,Headh)∈RL×(h⋅dv),因 h ⋅ d v = d model h \cdot d_v = d_{\text{model}} h⋅dv=dmodel(由 d v = d k = d model / h d_v = d_k = d_{\text{model}}/h dv=dk=dmodel/h推导),故拼接后维度为 R L × d model \mathbb{R}^{L \times d_{\text{model}}} RL×dmodel。
- 通过 W O ∈ R d model × d model W_O \in \mathbb{R}^{d_{\text{model}} \times d_{\text{model}}} WO∈Rdmodel×dmodel对拼接后的特征进行线性变换,融合多头信息,最终输出维度仍为 R L × d model \mathbb{R}^{L \times d_{\text{model}}} RL×dmodel。
每个头的子空间维度 d k = d model / h d_k = d_{\text{model}}/h dk=dmodel/h远小于原始维度,降低了单个头的计算复杂度(注意力得分矩阵维度从 L × L × d model L \times L \times d_{\text{model}} L×L×dmodel降为 L × L × d k L \times L \times d_k L×L×dk)。
h h h组独立的线性变换矩阵( W Q i , W K i , W V i W_Q^i, W_K^i, W_V^i WQi,WKi,WVi)对应 h h h个不同的“关联度量标准”,拼接后相当于整合了多视角的注意力权重,模型表达能力显著优于单头Attention(实验证明, h = 8 h=8 h=8时性能最优)
Position Embedding
在 Attention 和 RNN、LSTM 的对比中,我们说到 Attention 解决了长距离依赖问题,并且可以支持并行化,但是它就真的百利而无一害了吗?
其实不然,我们往前回顾,Self Attention 的 Q、K、V 三个矩阵是由同一个输入 X 1 = ( x 1 , x 2 , ⋯ , x n ) X_1=(x_1,x_2,\cdots,x_n) X1=(x1,x2,⋯,xn)线性转换而来。由于 Attention 权重的计算仅依赖于 token 间的相似度(Q-K 内积),最终通过加权 V 得到输出——这意味着,对于打乱顺序的序列 X 2 = ( x 2 , x 1 , ⋯ , x n ) X_2=(x_2,x_1,\cdots,x_n) X2=(x2,x1,⋯,xn),其 Q、K、V 矩阵的计算逻辑完全不变,Attention 权重与输出结果也会完全相同。这表明 Self-Attention 本质上是“顺序无关”的,天然丢失了序列的位置信息,而位置信息对 NLP 任务至关重要(如“我打他”与“他打我”语义完全相反,仅依赖位置区分)。
为解决这一核心缺陷,必须引入 Position Embedding(位置嵌入):通过为序列中每个位置分配一个唯一的向量,将位置信息与词嵌入融合,让模型能够感知 token 的顺序差异。
Position Embedding 的本质是为序列的第 p o s pos pos个位置( p o s ∈ [ 0 , L − 1 ] pos \in [0, L-1] pos∈[0,L−1], L L L为序列长度)生成一个位置向量 PE ( p o s ) \text{PE}(pos) PE(pos),满足两个关键条件:
- 唯一性:不同位置的 PE ( p o s ) \text{PE}(pos) PE(pos)互不相同,确保模型区分位置;
- 关联性:位置相近的 PE ( p o s ) \text{PE}(pos) PE(pos)在向量空间中距离更近,或能通过计算体现相对位置关系。
对于第
p
o
s
pos
pos个位置的位置向量
PE
(
p
o
s
)
\text{PE}(pos)
PE(pos),其第
i
i
i个维度(
i
i
i为维度索引)的取值由以下公式定义:
PE
(
p
o
s
,
2
i
)
=
sin
(
p
o
s
1000
0
2
i
/
d
model
)
\text{PE}(pos, 2i) = \sin\left( \frac{pos}{10000^{2i / d_{\text{model}}}} \right)
PE(pos,2i)=sin(100002i/dmodelpos)
PE ( p o s , 2 i + 1 ) = cos ( p o s 1000 0 2 i / d model ) \text{PE}(pos, 2i+1) = \cos\left( \frac{pos}{10000^{2i / d_{\text{model}}}} \right) PE(pos,2i+1)=cos(100002i/dmodelpos)
-
公式拆解:
- 2 i 2i 2i:表示位置向量的偶数维度(如 i = 0 i=0 i=0对应第 0 维, i = 1 i=1 i=1对应第 2 维);
- 2 i + 1 2i+1 2i+1:表示位置向量的奇数维度(如 i = 0 i=0 i=0对应第 1 维, i = 1 i=1 i=1对应第 3 维);
- 周期因子 1000 0 2 i / d model 10000^{2i / d_{\text{model}}} 100002i/dmodel:维度 i i i越大,周期越长(从 2 π 2\pi 2π到 2 π × 10000 2\pi \times 10000 2π×10000),不同维度捕捉不同尺度的位置信息。
-
唯一性:对任意两个不同位置 p o s 1 ≠ p o s 2 pos_1 \neq pos_2 pos1=pos2,其位置向量 PE ( p o s 1 ) ≠ PE ( p o s 2 ) \text{PE}(pos_1) \neq \text{PE}(pos_2) PE(pos1)=PE(pos2)。因为不同位置在各维度的正弦/余弦值组合唯一,可通过向量区分位置。
-
相对位置可计算性:设两个位置的偏移量为 k = p o s 2 − p o s 1 k = pos_2 - pos_1 k=pos2−pos1,则 PE ( p o s 2 ) \text{PE}(pos_2) PE(pos2)可表示为 PE ( p o s 1 ) \text{PE}(pos_1) PE(pos1)与一个固定矩阵的乘积(利用三角函数和角公式推导):
[ sin ( p o s 1 + k ) cos ( p o s 1 + k ) ] = [ cos k sin k − sin k cos k ] ⋅ [ sin p o s 1 cos p o s 1 ] \begin{bmatrix} \sin(pos_1 + k) \\ \cos(pos_1 + k) \end{bmatrix} = \begin{bmatrix} \cos k & \sin k \\ -\sin k & \cos k \end{bmatrix} \cdot \begin{bmatrix} \sin pos_1 \\ \cos pos_1 \end{bmatrix} [sin(pos1+k)cos(pos1+k)]=[cosk−sinksinkcosk]⋅[sinpos1cospos1]
这意味着模型能通过位置向量学习到“相对位置关系”(如“前一个词”“后三个词”),而非仅依赖绝对位置。 -
无参数、泛化性强:无需训练,可直接用于任意长度的序列(即使超出训练时的序列长度),避免过拟合。
Position Embedding 本身不直接参与 Attention 计算,需先与词嵌入融合,将位置信息注入输入表示中。最主流的融合方式是“逐元素相加”,数学定义如下:
设词嵌入矩阵为
E
∈
R
L
×
d
model
E \in \mathbb{R}^{L \times d_{\text{model}}}
E∈RL×dmodel(第
p
o
s
pos
pos行
E
(
p
o
s
,
:
)
E(pos, :)
E(pos,:)为第
p
o
s
pos
pos个 token 的词向量),融合后的输入矩阵
X
∈
R
L
×
d
model
X \in \mathbb{R}^{L \times d_{\text{model}}}
X∈RL×dmodel为:
X
(
p
o
s
,
:
)
=
E
(
p
o
s
,
:
)
+
PE
(
p
o
s
)
X(pos, :) = E(pos, :) + \text{PE}(pos)
X(pos,:)=E(pos,:)+PE(pos)
预训练
在讲Transformer之前,先来看一个很简单的概念:预训练
假设现在的任务是:区分三类动物,但每类只有50张图片,总共 150 张。
自己从零训练一个深度神经网络几乎不可能,因为深度学习极度依赖大规模数据。
那么能否借助网络上已有的大型标注数据集?
答案是可以——这正是“预训练(Pre-training)”的思想。
例如,ImageNet 含有约 1400 万张带标签的图片。我们可以先在 ImageNet 上训练出一个模型 A,
再把它迁移到我们的小数据任务中,得到模型 B。具体有两种方式:
- 冻结(Freeze):
模型 B 的浅层参数直接继承模型 A,在训练过程中保持不变,只训练高层参数。
(利用了浅层特征的通用性。) - 微调(Fine-tune):
模型 B 的浅层参数初始化为模型 A 的参数,但在训练过程中允许微调。
(使特征在通用性和任务特异性之间自适应。)

Transformer架构
Transformer 架构是首个完全基于自注意力机制、摒弃循环结构的序列建模框架。该架构通过整合 “多头自注意力”“位置嵌入”“残差连接” 与 “层归一化” 等核心组件,在保持长距离依赖捕捉能力的同时,实现了序列处理的全并行计算,彻底革新了序列建模的技术范式。
本节将系统阐述 Transformer 架构的完整设计,从 encoder-decoder 双端结构出发,逐层解析核心组件的数学建模与功能定位,揭示其并行化优势与长依赖捕捉能力的实现逻辑
整体架构
Transformer 架构的示意图如下:

Transformer 采用这一整体架构设计,在编码器与解码器部分分别堆叠自注意力层与逐点全连接层,其结构分别对应上图的左半部分(编码器)与右半部分(解码器)。
编码器
输入序列的处理流程如下:首先,原始输入经词嵌入方法(如Word2Vec等)转化为低维稠密的词向量;为注入序列的位置信息,词向量与位置嵌入(Position Embedding)逐元素相加,形成模型的初始输入特征矩阵 X ∈ R L × d model X \in \mathbb{R}^{L \times d_{\text{model}}} X∈RL×dmodel(其中 L L L为序列长度, d model d_{\text{model}} dmodel为特征维度)。
初始输入特征矩阵 X X X分两路流动:其一,送入多头自注意力层(Multi-Head Self-Attention),通过多子空间的关联计算得到注意力特征输出 Attn ( X ) \text{Attn}(X) Attn(X);其二,该注意力输出与初始输入 X X X通过残差连接(Residual Connection)相加,即 X + Attn ( X ) X + \text{Attn}(X) X+Attn(X),随后输入层归一化(Layer Normalization,简称Norm层)。
层归一化的核心功能是将特征沿最后一维(特征维度)进行标准化,消除不同特征尺度差异对训练的影响,同时通过可学习参数保留特征的表达能力。其数学定义为:
y
=
γ
⊙
(
x
−
μ
σ
2
+
ϵ
)
+
β
y = \gamma \odot \left( \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} \right) + \beta
y=γ⊙(σ2+ϵx−μ)+β
其中:
- μ = mean ( x , dim = − 1 , keepdim=True ) \mu = \text{mean}(x, \text{dim}=-1, \text{keepdim=True}) μ=mean(x,dim=−1,keepdim=True)表示沿特征维度计算的均值;
- σ 2 = mean ( ( x − μ ) 2 , dim = − 1 , keepdim=True ) \sigma^2 = \text{mean}((x - \mu)^2, \text{dim}=-1, \text{keepdim=True}) σ2=mean((x−μ)2,dim=−1,keepdim=True)表示沿特征维度计算的方差;
- ϵ \epsilon ϵ为极小值(如 1 0 − 5 10^{-5} 10−5),用于避免分母为0;
- γ ∈ R d model \gamma \in \mathbb{R}^{d_{\text{model}}} γ∈Rdmodel和 β ∈ R d model \beta \in \mathbb{R}^{d_{\text{model}}} β∈Rdmodel为可学习参数,分别用于尺度调整和偏移;
- ⊙ \odot ⊙表示元素级乘法,通过广播机制作用于整个张量。
层归一化的输出再次分两路:其一,送入前馈神经网络(Feed-Forward Network)。该网络由两层线性变换与中间激活函数(如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
虽然线性变换在不同位置上是相同的,但它们在层与层之间使用不同的参数。另一种描述方式是将其视为两个核大小为1的卷积。
对每个位置的特征进行独立的非线性变换(输出维度保持 d model d_{\text{model}} dmodel),记为 FFN ( Norm ( X + Attn ( X ) ) ) \text{FFN}(\text{Norm}(X + \text{Attn}(X))) FFN(Norm(X+Attn(X)));其二,前馈网络的输出与层归一化的输出通过残差连接相加,即 Norm ( X + Attn ( X ) ) + FFN ( Norm ( X + Attn ( X ) ) ) \text{Norm}(X + \text{Attn}(X)) + \text{FFN}(\text{Norm}(X + \text{Attn}(X))) Norm(X+Attn(X))+FFN(Norm(X+Attn(X))),并再次经过层归一化处理,最终得到该模块的输出特征。
解码器
目标输出序列的处理流程如下:首先,对预定的输出序列(目标序列)进行向量化操作:通过词嵌入技术(如Word2Vec等)将序列中的每个词转换为低维稠密的词向量;为注入序列的位置信息,词向量与位置嵌入(Position Embedding)逐元素相加,构建解码器的初始输入特征矩阵 Y ∈ R L ′ × d model Y \in \mathbb{R}^{L' \times d_{\text{model}}} Y∈RL′×dmodel(其中 L ′ L' L′为目标序列长度, d model d_{\text{model}} dmodel为特征维度)。
该特征矩阵随即输入掩码多头自注意力模块(Masked Multi-Head Self-Attention)。此模块通过掩码机制强制模型仅关注目标序列的已生成前缀(避免未来信息泄露),其输出与初始输入矩阵 Y Y Y进行残差连接(即 Y + MaskedAttn ( Y ) Y + \text{MaskedAttn}(Y) Y+MaskedAttn(Y)),并经层归一化(Layer Normalization,Norm层)处理以标准化特征分布。
层归一化的输出分为两路:其一,作为查询向量(Q),与编码器输出的特征矩阵(作为键K和值V)进行交叉多头注意力计算(Cross Multi-Head Attention),以建立目标序列与源序列的全局语义关联;其二,交叉注意力的输出与层归一化的输出进行残差连接后,再次通过层归一化操作。
此后,层归一化的输出被送入前馈神经网络(Feed-Forward Network),经独立的非线性变换后,与层归一化的输出进行残差连接并再次通过层归一化。
最终,层归一化的输出被输入线性层(Linear Layer),通过Softmax函数将特征映射为词汇表维度的概率分布,输出目标序列中每个位置的预测词概率。
预训练在Transformer中的应用
预训练的核心是通过设计通用任务(如掩码语言模型 MLM、自回归语言建模 LM、句子预测等),让 Transformer 模型从大规模数据中学习到通用的特征提取能力(如语义、语法、逻辑关系等)。这些预训练好的参数会作为后续下游任务(如分类、翻译、问答等)的初始值,通过微调(Fine-tuning)适配具体任务,从而大幅提升小数据场景下的性能。
简单来说:Transformer 的所有核心计算模块(注意力、FFN、嵌入等)都会在预训练中被训练,预训练是模型 “学会通用知识” 的过程。
对于不同的模型,有不一致的预训练要求:
对于以编码器为核心的模型(如BERT、RoBERTa等),预训练会完整训练编码器的所有模块:
- 多头自注意力层:学习文本中不同位置token的依赖关系(如上下文语义关联);
- 前馈神经网络(FFN):对注意力输出的特征进行非线性变换和维度映射;
- 层归一化(Layer Norm) 和 残差连接:稳定训练过程,增强特征流动;
- 词嵌入层(Token Embedding):将离散token映射为初始向量,预训练会优化这部分嵌入以捕捉基础语义。
对于以解码器为核心的模型(如GPT系列),预训练会针对解码器的特有结构进行训练:
- 掩码多头自注意力层(仅关注前文token,防止信息泄露):学习自回归式的语言生成规律(如预测下一个token);
- 与编码器类似的FFN、层归一化、残差连接:同样参与特征变换和训练稳定性保障;
- 词嵌入层也会在预训练中被优化,以适配生成式任务的语义需求。
对于同时使用编码器和解码器的模型(如T5、BART等),预训练会联合训练两者:
- 编码器负责理解输入文本(如“源语言句子”或“任务指令”),其训练逻辑类似BERT;
- 解码器负责生成输出文本(如“目标语言句子”或“回答”),其训练逻辑类似GPT,但会额外学习与编码器输出的交叉注意力(Cross-Attention),即如何利用编码器的输入特征进行生成;
- 整个模型的参数(包括编码器、解码器的所有组件)会通过统一的预训练任务(如T5的“文本到文本转换”)共同优化。
🌐 任务设定
输入:
I love machine learning.
目标输出:我 喜欢 机器 学习 。Transformer 由两部分组成:
- 编码器(Encoder):理解输入句子。
- 解码器(Decoder):生成输出句子。
一、编码器阶段
输入嵌入 (Input Embedding)
每个英文单词 → 向量:I → e1 love → e2 machine → e3 learning → e4 . → e5加上位置编码 (Positional Encoding):
x i = e i + p i x_i = e_i + p_i xi=ei+pi自注意力 (Self-Attention)
编码器的每一层计算:
Q = X W Q , K = X W K , V = X W V Q = XW_Q,\quad K = XW_K,\quad V = XW_V Q=XWQ,K=XWK,V=XWV
然后得到注意力输出:
Attention ( Q , K , V ) = softmax ( Q K ⊤ d k ) V \text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dkQK⊤)V
所有词彼此可见(无 mask)。
结果:每个词的表示融合了上下文信息。
例如,“love”会关注“I”和“machine learning”。前馈层 (Feed-Forward Network)
对每个位置独立做非线性变换:
z i = ReLU ( x i W 1 + b 1 ) W 2 + b 2 z_i = \text{ReLU}(x_i W_1 + b_1)W_2 + b_2 zi=ReLU(xiW1+b1)W2+b2经过多层堆叠后得到最终编码器输出:
H e n c = [ h 1 , h 2 , h 3 , h 4 , h 5 ] H_{enc} = [h_1, h_2, h_3, h_4, h_5] Henc=[h1,h2,h3,h4,h5]
这一矩阵代表源句中每个词的上下文语义。二、解码器阶段
假设我们在生成第 3 个中文词(即“机器”),已经生成:
我 喜欢
目标嵌入 + Masked Self-Attention
输入当前解码器词序列的嵌入(我,喜欢)。
Mask 确保当前位置只能看到之前的词:
Q = K = V = Decoder input embeddings (masked) Q = K = V = \text{Decoder input embeddings (masked)} Q=K=V=Decoder input embeddings (masked)
得到局部上下文表示。交叉注意力 (Cross-Attention)
Q Q Q:来自上一步 Masked Self-Attention 的输出。
K , V K, V K,V:来自编码器输出 H e n c H_{enc} Henc。
Attention ( Q , H e n c , H e n c ) = softmax ( Q H e n c ⊤ d k ) H e n c \text{Attention}(Q, H_{enc}, H_{enc}) = \text{softmax}\left(\frac{Q H_{enc}^\top}{\sqrt{d_k}}\right)H_{enc} Attention(Q,Henc,Henc)=softmax(dkQHenc⊤)Henc
解码器通过这个操作“关注”源句中与当前翻译相关的词。例如在生成“机器”时,注意力权重集中在“machine”。前馈层
对交叉注意力的输出再做一次非线性映射。输出层 (Linear + Softmax)
把当前解码器输出映射到词表空间,得到概率分布:
P ( token ∣ 前文 ) = softmax ( W o u t h t ) P(\text{token}|\text{前文}) = \text{softmax}(W_{out}h_t) P(token∣前文)=softmax(Woutht)
选出概率最高的词“机器”。三、循环生成
解码器每生成一个词,就把它作为输入继续下一步:
我 → 喜欢 → 机器 → 学习 → 。直到生成结束符
<EOS>。
参考文献
[1] https://blog.csdn.net/AI_dataloads/article/details/133250229,【深度学习】一文搞懂卷积神经网络(CNN)的原理(超详细)
[3] LSTM从入门到精通(形象的图解,详细的代码和注释,完美的数学推导过程)_lstm模型-CSDN博客
[4] (9 封私信 / 62 条消息) 深入浅出Word2Vec原理解析 - 知乎
[5] https://www.cnblogs.com/nickchen121/p/15105048.html
[6] [1] Vaswani A , Shazeer N , Parmar N ,et al.Attention Is All You Need[J].arXiv, 2017.DOI:10.48550/arXiv.1706.03762.



3164

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



