Transformer 基础原理与数学模型深度解析

B站影视 韩国电影 2025-10-28 06:53 1

摘要:Transformer 作为当前自然语言处理(NLP)、计算机视觉(CV)等领域的核心架构,其设计围绕自注意力机制展开,通过并行化计算大幅提升了模型效率与性能。本文将以 PyTorch 实现逻辑和原始论文(《Attention Is All You Need》

Transformer 作为当前自然语言处理(NLP)、计算机视觉(CV)等领域的核心架构,其设计围绕自注意力机制展开,通过并行化计算大幅提升了模型效率与性能。本文将以 PyTorch 实现逻辑和原始论文(《Attention Is All You Need》)为基准,按层拆解 Transformer 的核心模块,结合数学公式剖析其设计原理。

嵌入层的核心作用是将离散的文本符号(Token)转化为连续的向量表示,并注入位置信息(Transformer 无循环结构,需显式编码位置),最终输出维度为 [batch_size, seq_len, d_model](d_model为模型隐藏层维度,论文中默认 512)。

将每个 Token 通过可学习的嵌入矩阵映射为向量,解决 “离散符号无法计算” 的问题。

问题:若词嵌入向量的模长过大,会导致后续 Softmax 计算时梯度消失(概率分布过于陡峭)。 解决方案:将词嵌入结果乘以 ,使嵌入向量的方差归一化到 1 附近。

数学公式: 设嵌入矩阵为 ,Token 的 one-hot 编码为 x ∈ ℝ[vocab_size],则词嵌入为:其中,vocab_size为词汇表大小, 是 one-hot 向量与嵌入矩阵的矩阵乘法,输出维度为 。

Transformer 无循环 / 卷积结构,无法隐式捕捉 Token 的顺序关系,需通过位置编码显式注入 “Token 在序列中的位置信息”。

采用周期性函数生成位置编码,优点是无额外参数、可泛化到训练时未见过的长序列(如训练序列长 512,可处理长 1024 的序列)。

数学公式: 设序列长度为 seq_len,位置编码矩阵 PE ∈ ℝ[seq_len × d_model],对于位置 pos(0 ≤ pos 其中 (每两个维度共享一个周期参数)。设计逻辑:低频周期(如 )捕捉长距离位置关系,高频周期(如 )捕捉短距离关系;正弦和余弦的互补性(sin(a+b) = sin a cos b + cos a sin b)使模型能计算 Token 间的相对位置。可学习位置编码(Learned Positional Embedding):将位置编码设为可学习参数(PE ∈ ℝ[seq_len × d_model]),随模型训练更新,灵活性更高,但泛化性弱于 Sin-Cos 编码;旋转位置编码(RoPE):通过旋转矩阵将位置信息融入 Query/Key 向量,解决长序列注意力计算效率问题(如 LLaMA 系列采用);ALiBi:不额外添加位置向量,而是在注意力分数中加入 “位置偏置”(如位置差越大,偏置越小),简化计算并提升长序列性能。

词嵌入与位置编码直接相加(维度相同,均为 [seq_len, d_model]),得到最终嵌入向量:

Encoder 由 N 个相同的层堆叠而成(论文中 N=6),每个层包含 “多头自注意力”“残差 + LayerNorm”“位置式前馈网络” 三个核心模块,输入输出维度均为 [batch_size, seq_len, d_model]。

2.1 多头自注意力层(Multi-Head Self-Attention)

自注意力(Self-Attention)的核心是 “让每个 Token 关注序列中其他所有 Token 的信息”,而 “多头” 则是将注意力拆分为多个子空间,捕捉不同类型的依赖关系(如语法依赖、语义依赖)。

生成 Query、Key、Value

将 Encoder 输入 X ∈ ℝ[batch_size, seq_len, d_model] 通过三个可学习的权重矩阵 ( 为头维度,论文中 ,h 为头数),生成三个向量:

其中 Q, K, V ∈ ℝ[batch_size, seq_len, d_k],Q(查询)代表 “当前 Token 需要什么信息”,K(键)代表 “其他 Token 提供什么信息”,V(值)代表 “其他 Token 的具体信息”。

计算注意力分数(Scaled Dot-Product Attention)

通过 Q 与 K 的点乘计算 Token 间的相似度,再除以 √d_k 进行缩放,最后通过 Softmax 归一化得到注意力权重:

其中 (每个元素代表两个 Token 的相似度),Softmax 后权重和为 1。

Padding Mask(填充掩码)

序列中存在的 Padding Token(如 )无实际语义,需通过掩码将其注意力分数设为 -∞,确保 Softmax 后权重为 0。

实现逻辑:生成与 同维度的掩码矩阵 mask ∈ ℝ[batch_size, seq_len, seq_len],Padding 位置设为 -∞,其他位置设为 0,计算时:

拆分多头

将 Q, K, V 按头数 h 拆分为 h 个小头,维度变为 [batch_size, h, seq_len, d_k](先拆分 d_model 为 h × d_k,再调整维度顺序):

并行计算多头注意力

对每个小头分别计算单头自注意力:

合并多头

将 h 个小头的结果拼接(维度变回 ),再通过权重矩阵 W_O ∈ ℝ[d_model × d_model] 投影到 d_model 维度:

为何用多头而非单头:单头注意力只能在一个子空间捕捉依赖,多头可并行捕捉不同子空间的关系(如一个头关注 “主谓”,另一个关注 “动宾”),提升模型表达能力。为何 Q 和 K 用不同权重矩阵:若 Q=K,则注意力分数为,是对称矩阵(Token A 对 B 的关注 = B 对 A 的关注),但实际语言中依赖关系可能不对称(如 “猫抓老鼠” 中 “猫” 对 “老鼠” 的关注远大于 “老鼠” 对 “猫”),不同权重矩阵可打破对称性。为何用点乘而非加法:点乘的计算复杂度为 ,加法为 ,但点乘可通过 GPU 矩阵乘法并行加速;效果上,点乘对高维向量更敏感(能放大相似度差异),加法则需额外参数(如 W·[Q;K]),参数效率更低。为何对注意力分数缩放(除以):当 较大时, 的方差会随 d_k 增大而增大(假设 Q,K 元素均值为 0、方差为 1,则 Q·K^T 方差为 ),导致分数过大,Softmax 后梯度消失(概率接近 0 或 1)。除以 可使方差归一化为 1,避免梯度问题。2.2 残差 + LayerNorm(Residual Connection + Layer Normalization)

Transformer 中所有模块(注意力、前馈网络)后均会添加残差连接和 LayerNorm,核心作用是缓解梯度消失稳定训练

残差连接:将模块输入直接加到输出,形成 “shortcut path”,确保梯度能直接回传(避免深层模型梯度衰减):

其中 X 是多头注意力层的输入, 是残差连接后的输出。

LayerNorm:对每个样本的每个 Token 的 d_model 维向量做归一化(均值为 0、方差为 1),再通过可学习参数缩放和平移,避免 “内部协变量偏移”(Internal Covariate Shift):

其中 γ, β ∈ ℝ[d_model] 是可学习参数,ε 避免分母为 0。

顺序问题:Transformer 采用 “预归一化”(Pre-LN)或 “后归一化”(Post-LN),论文中为 后归一化(模块输出 + 残差 → LayerNorm),PyTorch 实现中常用预归一化(LayerNorm → 模块 → 残差),两者均能稳定训练。2.3 位置式前馈层(Position-wise Feed-Forward Network, FFN)

FFN 的核心是对每个 Token 的向量进行非线性变换(注意力层捕捉全局依赖,FFN 捕捉局部非线性特征),且对所有 Token 的变换参数共享(“位置式” 即不依赖 Token 位置)。

FFN 由两个线性层和一个激活函数组成,维度变化为 d_model → d_ff → d_model(d_ff 为前馈层隐藏维度,论文中默认 2048):

其中:

线性层 1:,将输入从 d_model 升维到 d_ff;激活函数:论文中用 ReLU(max(0, x)),后续模型(如 BERT)常用 GELU(x·Φ(x),Φ 是高斯累积分布函数),GELU 的优点是光滑(梯度更稳定)、对负输入有微小响应(避免信息丢失);线性层 2:W_2 ∈ ℝ[d_ff × d_model],b_2 ∈ ℝ[d_model],将输出降维回 d_model。激活函数公式优点缺点ReLUmax(0, x)计算快、无梯度消失(正区间)负区间梯度为 0(神经元死亡)GELUx·Φ(x)光滑、负区间有响应、适合 Transformer计算稍复杂(需近似高斯分布)SwiGLU(x·σ(x)) · Wx结合 Swish 和 GELU,性能更优参数略多

与 2.2 节逻辑完全一致,将 FFN 的输出与 FFN 的输入(即 2.2 节 LayerNorm 的输出)进行残差连接,再做 LayerNorm:

其中 是单个 Encoder Layer 的最终输出, 是 2.2 节 LayerNorm 的输出。

Decoder 同样由 N 个相同的层堆叠而成(论文中 N=6),相比 Encoder,多了 “掩码多头自注意力” 和 “编码 - 解码注意力” 两个模块,核心作用是生成序列(如翻译任务中从 Encoder 输出生成目标语言序列)。

在解码器(Decoder)生成序列的过程中,需遵循 “自回归” 逻辑。具体而言,当生成第 t 个令牌(Token)时,仅能获取前 t - 1 个令牌的信息,而无法预知未来的令牌。基于此,有必要在多头自注意力机制中引入 “未来掩码”(Future Mask)。

其计算逻辑与 2.1 节所阐述的多头自注意力大体一致,唯一的差异在于额外添加了未来掩码。其中,未来掩码(future_mask)属于实数空间 ℝ 中的一个 [seq_len, seq_len] 矩阵,它呈现为下三角矩阵的形式,即下三角部分及对角线元素取值为 0,上三角部分元素取值为负无穷(-∞)。如此设置,可确保第 t 个令牌仅能关注第 1 至第 t 个令牌的信息。

与 Encoder 2.2 节逻辑完全一致,对掩码多头自注意力的输出做残差连接和 LayerNorm,输出维度为 [batch_size, seq_len, d_model]。

Cross-Attention 的核心是 “让 Decoder 的每个 Token 关注 Encoder 输出的所有 Token 信息”(如翻译任务中,Decoder 的 “猫” 关注 Encoder 的 “cat”),实现 Encoder 与 Decoder 的交互。

计算逻辑:与多头自注意力类似,但 Q 来自 Decoder(3.2 节 LayerNorm 的输出),K 和 V 来自 Encoder 的最终输出(所有 Encoder Layer 堆叠后的结果):,其中 Q_dec ∈ ℝ[batch_size, seq_len_dec, d_model](seq_len_dec 为目标序列长度),K_enc, V_enc ∈ ℝ[batch_size, seq_len_enc, d_model](seq_len_enc 为源序列长度)。交互逻辑:Cross-Attention 是 Seq2Seq 模型中 Encoder 与 Decoder 的唯一交互通道,Decoder 通过 Q 主动 “查询” Encoder 的 K/V,获取源序列的语义信息,确保生成的序列与源序列语义一致。

与 2.2 节逻辑一致,对 Cross-Attention 的输出做残差连接和 LayerNorm。

与 Encoder 的 FFN 结构完全相同(d_model → d_ff → d_model),激活函数常用 ReLU 或 GELU,作用是对 Cross-Attention 的输出做非线性变换,捕捉目标序列的局部特征。

与 2.2 节逻辑一致,对 FFN 的输出做残差连接和 LayerNorm,得到单个 Decoder Layer 的最终输出。

Decoder 的最终输出([batch_size, seq_len_dec, d_model])需通过输出头转化为 “每个 Token 在词汇表上的概率分布”,用于训练(计算交叉熵损失)和推理(选择概率最大的 Token)。

通过线性层将 d_model 维向量映射到 vocab_size 维(与词汇表大小一致),得到 “logits”(未归一化的概率): ,其中 X_dec_final 是所有 Decoder Layer 堆叠后的输出,W_out ∈ ℝ[d_model × vocab_size],b_out ∈ ℝ[vocab_size],logits ∈ ℝ[batch_size, seq_len_dec, vocab_size]。

4.2 Softmax 与交叉熵(Softmax & Cross-Entropy)训练阶段:通常将 Softmax 与交叉熵损失合并(F.cross_entropy,PyTorch 中默认包含 Softmax),避免数值不稳定:, 其中 y 是目标序列的 one-hot 编码,N 是样本总数。推理阶段:对 logits 做 Softmax,得到每个 Token 的概率,选择概率最大的 Token 作为预测结果(贪心搜索),或采用 beam search 提升生成质量。

Transformer 中 Dropout 用于防止过拟合,主要位置包括:

嵌入层:对 emb_final 应用 Dropout(论文中概率 p=0.1);多头注意力层:对注意力权重(Softmax 后)应用 Dropout;前馈网络:对线性层 1 的输出(激活函数前)应用 Dropout;测试阶段:需关闭 Dropout(设置 model.eval),避免随机丢弃信息导致预测不稳定。

论文中采用 “带 warmup 的线性衰减学习率”,避免训练初期学习率过大导致模型震荡,后期学习率过小导致收敛缓慢:

公式: ,其中 step 是训练步数,warmup_steps 是热身步数(论文中设为 4000),factor 是学习率系数(默认 1.0)。逻辑:热身阶段(step

Transformer 采用 LayerNorm 而非 BatchNorm,核心原因是两者的归一化维度不同:

BatchNorm:对每个 batch 的同一维度(d_model 中的某一维)做归一化(依赖 batch 大小),公式为:,

优点:计算快(依赖 batch 并行);

缺点:对 batch 大小敏感(小 batch 时均值 / 方差估计不准)、无法处理变长序列(Padding 会影响统计量)。

LayerNorm:对每个样本的每个 Token 的 d_model 维做归一化(不依赖 batch),优点是对 batch 大小不敏感、适合变长序列,因此更适合 Transformer。通过多头自注意力捕捉全局依赖通过残差连接和 LayerNorm 稳定深层训练通过位置编码注入顺序信息

最终实现了比循环神经网络(RNN)更快的训练速度和更强的表达能力。本文按层拆解了 Transformer 的数学模型与设计逻辑,后续可进一步深入其变体(如 BERT、GPT)的改进思路,或实际动手用 PyTorch 实现简易 Transformer,加深理解。

来源:AI机器人扫地僧

相关推荐