总览本章按照图中层级从下往上实现了层归一化、GELU、前馈网络、残差连接、Transformer 块最终组装成完整的 GPT 模型并实现了自回归文本生成。预归一化Pre-LN每个子层前做 LayerNorm梯度流动更顺畅残差连接每个子层输出加回输入保证深度网络可训练多头因果注意力只能看到前面的 token遮罩未来前馈网络升维扩大至 4 倍维度用 GELU 激活再降维可配置 dropout嵌入层、注意力、残差后均可独立设置 4.2 层归一化Layer Normalization 归一化是什么在机器学习中归一化也叫标准化是一种将数据“拉”到某个标准范围的操作。最常见的做法是让数据均值为0、方差为1x^x−μσ \hat{x} \frac{x - \mu}{\sigma}x^σx−μ​其中μ\muμ是均值σ\sigmaσ是标准差。为什么需要归一化深度神经网络中每层输入分布会随着前面参数的更新而变化内部协变量偏移导致训练不稳定、收敛慢。归一化能让每层的输入分布保持稳定从而加速训练、提高稳定性。 层归一化的动机在自然语言处理中输入是变长的句子且训练时往往使用小批量batch size 较小。如果使用批归一化Batch Normalization它会依赖批次中的统计量在小批量或变长序列上表现不稳定。层归一化则不同它对每个样本的每个 token在特征维度上独立进行归一化。不依赖 batch 大小对变长序列友好成为 Transformer 的标准组件 层归一化公式对于输入向量x∈Rd\mathbf{x} \in \mathbb{R}^{d}x∈Rd一个 token 的嵌入均值μ1d∑i1dxi\mu \frac{1}{d} \sum_{i1}^{d} x_iμd1​∑i1d​xi​方差σ21d∑i1d(xi−μ)2\sigma^2 \frac{1}{d} \sum_{i1}^{d} (x_i - \mu)^2σ2d1​∑i1d​(xi​−μ)2标准化x^ixi−μσ2ϵ\hat{x}_i \frac{x_i - \mu}{\sqrt{\sigma^2 \epsilon}}x^i​σ2ϵ​xi​−μ​ϵ\epsilonϵ为小常数防除零缩放和平移可学习yiγix^iβiy_i \gamma_i \hat{x}_i \beta_iyi​γi​x^i​βi​γ\gammaγscale和β\betaβshift是可训练参数初始值分别为 1 和 0让模型可以选择性地“恢复”某些维度的重要性。 代码实现pythonclassLayerNorm(nn.Module):def__init__(self,emb_dim,eps1e-5):super().__init__()self.epseps self.scalenn.Parameter(torch.ones(emb_dim))# γself.shiftnn.Parameter(torch.zeros(emb_dim))# βdefforward(self,x):# x shape: (batch, seq_len, emb_dim)meanx.mean(dim-1,keepdimTrue)# (batch, seq_len, 1)varx.var(dim-1,keepdimTrue,unbiasedFalse)# 有偏估计norm_x(x-mean)/torch.sqrt(varself.eps)returnself.scale*norm_xself.shift关键点dim-1在特征维度上操作keepdimTrue保留维度便于广播unbiasedFalse使用有偏估计除以 n与 GPT 原始实现一致nn.Parameter使 scale 和 shift 可被优化器更新 与批归一化对比以下是整理后的对比表格### 对比维度层归一化 (Layer Normalization)批归一化 (Batch Normalization)归一化方向对每个样本的特征维度进行归一化对同一特征在不同样本间的统计量进行归一化统计依赖仅依赖当前样本的数据依赖整个 batch 的统计量变长序列支持✅ 天然支持变长序列如 NLP 任务❌ 需要固定长度或特殊处理如 padding/masking小批量稳定性✅ 对小批量数据表现稳定❌ 小批量时统计量估计不准确易波动典型应用领域NLP、Transformer 等序列模型CV如 CNN等固定输入结构的模型 在 Transformer 中的位置GPT 采用 预归一化Pre-LN 结构输入 → LayerNorm → 多头注意力 → 残差 → LayerNorm → 前馈 → 残差每个 Transformer 块内注意力之前和前馈之前都先做层归一化最终输出之前再做一个层归一化然后送进输出线性层 直观理解层归一化就像给每个 token 的嵌入向量重新校准不管原来各个维度的数值相差多大都先标准化为“0 中心、1 方差”的分布然后通过可学习的γ\gammaγ和β\betaβ让模型选择性地“放大”某些维度如果它们重要或“缩小”某些维度如果它们不重要这使得模型更关注特征之间的相对关系而不是绝对数值大小。✅ 总结归一化是让数据分布稳定的技术层归一化是其中一种专为序列模型设计。它通过计算每个 token 特征维的均值和方差进行标准化再应用可学习的缩放和平移。在 Transformer 中扮演稳定训练、加速收敛的关键角色。 4.3 GELU激活函数与前馈网络 前置概念归一化让数据均值0、方差1稳定训练。层归一化LayerNorm是其一。激活函数引入非线性让神经网络能拟合复杂模式。❌ ReLU的局限负值直接归零 → 神经元可能“死亡”梯度永远为0在0处不可导优化困难无法区分不同大小的负输入 GELU核心思想概率加权用高斯分布的累积分布函数Φ(x)\Phi(x)Φ(x)决定保留多少信息。以下是格式化的数学公式GELU(x)x⋅Φ(x)正值 → 权重接近1完全保留负值 → 权重平滑衰减不直接归零 类比ReLU是“硬开关”GELU是“渐变调光器”。✨ 优势处处可导梯度平稳负区仍有微弱梯度 → 无神经元死亡非单调表达能力更强 在GPT中的应用前馈网络FFN输入(768) → 线性层(升维到3072) → GELU → 线性层(降维回768) → 输出先升维4倍让模型探索更丰富组合GELU激活再降维保持维度一致 总结GELU ReLU的平滑升级版大模型标配GPT、BERT、LLaMA等。核心是用概率权重替代硬阈值让负值也能贡献微弱学习信号。 4.4 残差连接 解决的问题深度网络如12层Transformer训练时梯度消失梯度从输出层反向传播每经过一层都会衰减导致靠近输入层的参数几乎不更新。 核心思想让输入跳过中间层直接与输出相加为梯度提供一条“高速公路”。 数学形式输出 层(输入) 输入层(输入) 可以是多头注意力或前馈网络加法是逐元素相加要求形状相同️ 在GPT中的位置预归一化结构每个Transformer块内部顺序x → LayerNorm → 注意力 → y1 → x y1 → LayerNorm → 前馈 → y2 → (x y1) y2↑_______________| ↑______________________|先做层归一化再经过注意力/前馈最后加回原始输入每个子层注意力、前馈都有独立的残差连接✅ 主要好处缓解梯度消失 梯度可以直接从输出传到输入不经过非线性层压缩训练更深网络 没有残差12层以上的Transformer几乎无法收敛保留原始信息 即使中间层学歪了原始输入仍能直达输出加速收敛 模型可以更早学习微小调整而非从头构建表示 通俗类比无残差快递每层都要被经理处理可能损坏或丢失有残差手里始终保留原始包裹副本即使某层出问题也不影响送达 一句话总结残差连接 给梯度和信息修一条“直达高速”让深度网络真正可训练。它是ResNet、Transformer、GPT等成功堆叠上百层的核心设计。 4.5 组装Transformer块 一个Transformer块包含两个子层子层组件作用子层1 层归一化 → 多头因果注意力 → 残差连接 让每个token关注它之前的所有token捕捉上下文依赖子层2 层归一化 → 前馈网络(FFN) → 残差连接 对每个token独立做非线性变换增强表达能力 每个子层的统一模式预归一化输出 核心处理( 层归一化(输入) ) 输入先归一化再处理最后加回原始输入残差连接 完整前向流程代码形式defforward(x):# 子层1注意力shortcutx xln1(x)# 归一化xmulti_head_attn(x)# 注意力xshortcutx# 残差# 子层2前馈shortcutx xln2(x)# 归一化xfeed_forward(x)# 升维→GELU→降维xshortcutx# 残差returnx✅ 关键设计预归一化Pre-LN归一化放在子层之前梯度流动更顺畅训练更稳定残差连接让信息直达解决梯度消失支持深层网络前馈网络先升维4倍如768→3072GELU激活再降维回原维度 输入输出形状输入(batch, seq_len, emb_dim)输出与输入形状完全相同每个Transformer块都是“形状不变”的模块可以任意堆叠 一句话总结每个Transformer块由两个子层串行组成子层1归一化→多头注意力→残差子层2归一化→前馈网络→残差。这个模块是GPT的基本积木堆叠N层就构成完整模型。总结 层归一化可以确保每个层的输出具有一致的均值和方差从而稳定训练过程。 残差连接是通过将一层的输出直接传递到更深层来跳过一个或多个层的连接它能帮助缓解在训练深度神经网络如大语言模型时遇到的梯度消失问题。 作为 GPT 模型的核心模块组件Transformer 块融合了掩码多头注意力模块和使用 GELU激活函数的全连接前馈神经网络。 GPT 模型是具有许多重复 Transformer 块的大语言模型这些 Transformer 块有数百万到数十亿个参数。 GPT 模型具有多种规模比如参数量分别为 1.24 亿、3.45 亿、7.62 亿和 15.4 亿的模型我们可以使用相同的 GPTModel Python 类来实现它们。 类 GPT 大语言模型的文本生成能力涉及根据给定的输入上下文来逐个预测词元然后将输出张量解码为人类可读的文本。 在没有训练的情况下GPT 模型生成的文本是不连贯的这显示了模型训练对于生成连贯文本的重要性