LLM 学习系列(4 / 5)

分词 → 架构 → 推理 → 训练 → 开放权重
前面几篇都在讲一个「已经练好」的模型如何工作,本篇回头看它是怎么被训练出来的:先理解一次参数更新,再看预训练、监督微调和偏好优化如何使用这个循环。

1. 概念总览:训练改变的是什么

训练 是根据数据和训练目标调整模型参数的过程。 对下一 Token 预测而言,目标是提高模型对训练文本中实际下一项的预测概率。

这里的「目标答案」是数据里出现的续写,未必是唯一合理的续写,也不保证它符合事实。比如 小猫跑了一天,它很 后接 累 很自然,接 饿 也可能合理。

一步训练由四个环节构成,循环往复:

下一批数据 训练数据输入 + 目标答案 ① 前向传播逐层计算得到输出 ② 损失函数量化输出与答案的差距 ③ 反向传播逐层求出各参数梯度 ④ 优化器按梯度和学习率更新参数
环节英文一句话
前向传播Forward Propagation输入逐层计算,得到输出
损失函数Loss Function用一个数字衡量输出与训练目标的差距
反向传播Backpropagation从损失反向逐层求出每个参数的梯度
优化器Optimizer按梯度和学习率把参数改一点

本文把一次优化器更新称为一步(Optimizer Step)。最简单的情况下,一批数据走完四个环节就是一步;若使用梯度累积,会先对多个小批次执行前向和反向、累加梯度,再统一更新一次参数。

Note

本篇的梯度训练会计算梯度并更新参数;普通生成推理固定参数。训练信号也可以是奖励或偏好,不一定有唯一标准答案。评估时同样可以计算损失,但不反向传播、不更新参数。

贯穿全篇的例子

本篇继续追踪 小猫跑了一天,它很 → 累:教学输入 ID 为 [10, 11, 12, 13, 14, 15, 16],目标 累 为 17,需要时添加 BOS。

  • 训练数据:完整文本 小猫跑了一天,它很累。,我们只放大观察预测 累 的那个位置。
  • 追踪对象:某个可训练参数 ,假设当前值是 0.010。它没有预设的「疲劳」语义。
  • 本步假设:当前模型给 累 的概率为 0.02,稍后算出的梯度为 -0.8。这些是用于说明机制的假设数值,不是某个真实模型的测量,也不表示随机初始化时的典型概率。

架构篇展示的是训练后的示意分布,本篇观察训练中的某一步;两者不是同一次前向计算。

2. 模型参数:训练修改的那批数字

模型参数是神经网络用于计算的可学习数值。 架构篇 里 FFN 的 、,Attention 的 、、,Embedding 表以及归一化中的缩放参数等,合起来就是 Parameters。

本文用 泛指参数或其中一个数值,用 追踪一个具体数值。权重文件保存的是这些数值,不是把训练文本作为文件直接塞进网络。不过,训练数据的信息会通过更新进入参数,模型也可能记住甚至复现具体片段,不能把「学习统计规律」理解为「绝不会记忆原文」。

对比项训练阶段推理阶段
的状态可变,每步都在改固定,只读不改
数据的角色输入与训练信号输入上下文
得到的结果更新后的参数,可保存检查点输出内容与本次计算的中间结果

Note

参数可以在训练中途或结束时存盘。决定向外发布后,才涉及 开放权重篇 中的开放范围和许可证;「存成文件」本身不等于「公开」。

2.1 参数、激活值与超参数

单个参数通常不能被直接解释成「一个知识」。例如某个矩阵元素为 0.017,它规定一个输入分量在某次线性组合中占多大系数;它不是存着 猫 或 疲劳 的独立格子。

需要区分长期保存的计算规则和本次输入产生的表示:

  • 参数(Parameter):保存训练学到的统计结构,决定「怎么算」;通常跨请求保留。
  • 激活值(Activation):输入经过参数计算得到的中间数值,表示「这次输入正在被怎样处理」;随输入与计算位置改变。

贯穿例子中,很 的上下文向量是激活值;生成它所用的矩阵是参数。新输入会改变前者,普通推理不会改变后者。

所以语义与参数是多对多关系:一个语义(如「疲劳」)由成千上万个参数协同表达;反过来,一个参数也同时参与无数个语义的计算。、 这些名字描述的是参数的功能角色(投影、升维/降维),而非它的语义。

最后把三个最易混的概念划清边界:

概念是什么谁来定训练中变不变
参数(Parameter)权重数字,如 梯度指导优化器更新选定的可训练参数会被更新
激活值(Activation)参数算出的中间向量由输入 + 参数算出随输入而变
超参数(Hyperparameter)学习率、层数等配置或搜索过程决定可按调度变化,不是本循环中的模型权重

例子推进 ① · 选定本步开始的状态

我们追踪的参数目前是 。从头训练时,许多矩阵使用随机初始化,也有偏置初始化为 0、归一化缩放初始化为 1 等规则;微调则从已有权重开始。下面观察的是一次更新,不要求模型正处于初始化时刻。

3. Forward Propagation(前向传播):用当前参数预测

前向传播是把输入数据逐层送入网络、最终得到输出的过程。 它和推理使用同一套网络结构。训练通常还会保留或按需重算反向传播所需的中间结果;Dropout 等组件在训练和推理模式下也可能采用不同规则。

每一层 接收上一层的输出,做自己的变换(如 Attention、FFN),再传给下一层。走完所有层得到模型输出 ,交给损失函数评判。

例子推进 ② · 前向:用当前的 做一次预测

用当前参数(含 )计算 很 所在位置的 Logits,再看词表 Softmax 对应的概率。假设目标 累 的概率为 0.02,这个值就是下一节损失要评判的对象。

实际下一 Token 训练通常一次处理整段序列,各位置同时预测下一项。输入与目标错开一位,Causal Mask 阻止偷看未来,详见 Teacher Forcing 与 Causal Mask。这里只放大一个位置,避免把并行训练误解成「必须逐词生成后再学习」。

4. Loss Function(损失函数):把预测变成可优化的数值

损失函数把模型表现量化为一个标量,即单个数值。 训练尝试减小设定的损失;损失是否体现我们真正想要的能力,取决于数据和目标设计。更低的训练损失不自动等于更高的事实正确率或更好的泛化。

LLM 预测下一个 Token,本质是一个分类问题——在整个词表上给出概率分布。因此最常用的是交叉熵损失(Cross-Entropy Loss):

其中 是模型给第 个 Token 的预测概率,目标标记 在实际下一 Token 处为 1、其余为 0,这叫 One-hot(独热)表示; 取自然对数。求和后只剩目标 Token 的一项,所以等价于 。

以训练样本 小猫跑了一天,它很 → 累 为例,下表展示目标概率与损失的关系:

模型给 累 的概率损失 含义
0.90.11目标概率高,损失小
0.50.69目标概率较低,损失增加
0.12.30目标概率更低,损失更大

例子推进 ③ · 损失:给这次预测打个分

上一节概率是 0.02,代入得 。这表示当前模型对本条数据的目标分配了较低概率。损失有了,但还不知道每个参数的微小变化会如何影响它——下一节求梯度。

4.1 从一个位置到一批数据

实际通常对一批数据里参与训练的位置求平均:

是参与损失计算的位置集合, 是这些位置的数量;每一项使用其所在序列自己的前缀。填充位置通常忽略;对话微调常只计算助手回答部分。梯度由所有这些位置共同贡献,一次更新不保证让每个样本的概率都改善。

5. Backpropagation(反向传播):计算局部敏感度

反向传播是高效计算损失对可训练参数梯度的算法。 单个参数的梯度 表示:其他参数暂时固定时, 的微小变化会让损失怎样变化。

Note

是「 对 的偏导数」的整体记号,并非 除以 。 表示变化量;对于足够小的变化,可近似写成 。

例子推进 ④ · 算出参数变化会怎样影响损失

继续放大观察预测 累 的这一项损失。假设反向传播得到:

参数梯度其他参数固定、变化足够小时
稍微增大它,损失倾向于下降
稍微减小它,损失倾向于下降
对同样大小的变化,本点损失较不敏感

例如仅把 增加 0.001,局部近似给出 。

梯度绝对值表示当前坐标尺度下的局部敏感度,不能当成参数的「责任」或全局重要性。反向传播得到梯度后,还没有改动参数;更新量由优化器决定。

5.1 核心:链式法则

深层网络是函数套函数。为了说明链式法则,先看只有一条路径的标量计算:底层参数对最终损失的影响,可以通过中间各步导数连乘得到。

真实网络中间值多为向量,且存在残差等分支:对应计算需要矩阵形式的导数,并把不同路径的贡献相加。反向传播从后往前计算并复用中间结果,不用对数十亿个参数逐一扰动试验。这就是「反向」「传播」名字的来源。

∂L/∂yₙ 逐层传递 得到 ∂L/∂w₁ 损失 L 第 n 层 第 2 层 第 1 层 各层参数梯度

5.2 梯度消失与梯度爆炸

沿着标量链,如果局部导数的绝对值持续小于 1,连乘可能使梯度快速衰减;持续大于 1 则可能放大。这分别是梯度消失和梯度爆炸的直观来源。真实深层网络还受分支、矩阵方向和数值尺度影响,不能只逐层看一个数字。

残差 的标量导数为 。直连项帮助梯度传播,但不保证总梯度始终不衰减。归一化有助于稳定中间数值;Gradient Clipping(梯度裁剪) 则在梯度整体过大时限制其大小,降低异常大更新的风险。

6. Optimizer(优化器):真正更新参数

优化器根据梯度、学习率及可能保存的历史状态,决定参数如何更新。 先看最基础的梯度下降,再看带动量和自适应缩放的版本。

6.1 Gradient Descent(梯度下降)

梯度下降沿当前梯度的反方向小步调整参数。 在局部线性近似、采用通常的欧氏距离度量时,这对应最陡的下降方向;步长过大则可能跨过下降区域,甚至让损失上升。

其中 是学习率(Learning Rate),控制步长。把损失想象成山地,参数是位置,梯度提供当前位置的坡度信息;沿局部下坡走,并不保证到达整片山地的最低点。

例子推进 ⑤ · 更新:把 真正挪一下

万事俱备:、梯度 。取学习率 ,代入更新公式:

从 0.010 变为 0.090,到这里参数才真正改变。学习率 0.1 只是为了演示算术,不是推荐的 LLM 训练配置。

更新后 累 的概率是多少,要用新参数再做一次前向才能知道。 仅凭这个参数的新值无法推出概率一定上涨多少,也不能保证本次有限步长会降低损失。

6.2 Batch、Mini-batch 与梯度累积

按每步用多少数据计算梯度,分三种。三者的本质区别就是 batch size(每步计算梯度所用的样本数) 取不同的值:

方式batch size每步用的数据特点
批量梯度下降(Batch GD)(全部样本)全部数据方向准,但每步极慢
随机梯度下降(SGD)单个样本每步快,但方向抖动大
小批量梯度下降(Mini-batch)介于两者之间一小批(如 32、256)兼顾速度与稳定,实际训练的标准做法

Note

表中的 SGD 用的是教科书里的单样本定义;工程中 SGD 优化器也常接收 Mini-batch 梯度。LLM 训练通常采用小批量,并常按 Token 数描述训练规模,因为同样的序列条数可能包含不同数量的 Token。

例如每张卡每次处理 4 条序列,在 8 张卡间汇总梯度,再累积 4 次才更新,等长且采用通常的数据并行平均时,有效批量为 条序列。Epoch(训练轮数) 则表示整个训练集被遍历一遍,与一次参数更新不同。

6.3 Learning Rate(学习率)

学习率决定每一步参数更新的幅度,是最关键的超参数之一。

学习率过小 收敛极慢,训练成本高 学习率过大 在谷底反复横跳甚至发散 学习率合适 稳定且高效地逼近最小值

实践中常用学习率调度(Learning Rate Schedule):训练初期用较小学习率「热身」(Warmup)避免震荡,中期用较大学习率快速下降,后期逐渐衰减以精细收敛。

6.4 SGD、Momentum、Adam 与 AdamW

现代优化器会组合当前梯度和历史信息,更新方向不一定等于当前梯度的严格反方向:

优化器核心思想
SGD直接用当前梯度更新
Momentum累积历史梯度形成「惯性」,加速收敛、减少抖动
Adam用梯度及梯度平方的滑动平均,为各参数自适应缩放更新量
AdamW在 Adam 基础上把权重衰减与梯度更新解耦,是 LLM 训练的常见选择

权重衰减(Weight Decay) 会按一定比例缩小选定参数,是约束参数规模的正则化方式。Adam 的历史平均等数据叫优化器状态;它们不是模型用来直接生成文本的权重,却会影响继续训练的轨迹。

7. 超参数:设定训练规则

Note

超参数(Hyperparameter) 指常规训练循环之外配置或选择的设置,如学习率、批量大小、层数。它们也可以由搜索程序选择,或按预定规则变化;不应把「不作为模型权重学习」误解为「训练全程不变」。

以训练一个 LLM 为例,开始训练前需要在配置里写下这些数字,它们就是超参数:

超参数一个具体取值作用
学习率 lr3e-4每步参数更新的幅度
批量大小 batch256每步用多少样本算梯度
训练轮数 epochs3整个数据集过几遍
层数 num_layers32堆叠多少个 Transformer Block
隐藏维度 hidden4096每个 Token 向量多少维
Dropout dropout0.1训练时以该概率把指定激活元素置零

这些数值各自用于示意,不是一套推荐配置。3e-4 表示 。普通反向传播计算的是权重梯度,优化器再更新权重;学习率若从 3e-4 变成 2e-4,通常是调度器在执行预设规则。

8. LLM 的训练阶段:同一循环,不同数据与目标

通用训练循环之上,现代 LLM 的训练通常分为几个阶段,逐步把一个「会预测文字」的模型调教成「听得懂指令、符合人类偏好」的助手。

前面的「前向 → 损失 → 反向 → 更新」是参数优化的基本操作;下面讲的是更宏观的训练流程。常见路线先预训练,再做监督微调和偏好优化,但不是每个模型都必须严格走完固定三阶段,实际可以省略、重复或交替某些后训练步骤。

Post-training(后训练) 通常统称预训练之后、为任务能力与行为做的进一步训练,SFT 和偏好优化都可以属于后训练。下面画的是一种常见路线,不是唯一顺序。

产出基座模型 常见后续步骤 ① 预训练Pre-training ② 监督微调SFT ③ 偏好优化等后训练例如 RLHF、DPO 最终对话模型
阶段英文目标数据
预训练Pre-training从海量文本中学习语言与世界知识大规模无标注语料
监督微调Supervised Fine-Tuning(SFT)学习期望的任务与回答方式人工、整理或合成的指令与回答
偏好优化等后训练如 RLHF、DPO提高符合偏好或任务奖励的输出概率偏好比较、评分或可验证的奖励

8.1 Pre-training(预训练):从文本自身获得目标

预训练通常使用大量文本,让模型学习语言结构和世界相关的统计信息。在本系列讨论的自回归模型里,训练目标是预测下一 Token。

这叫 Self-Supervised Learning(自监督学习):小猫跑了一天,它很累。 已经包含监督信号,前缀对应的下一 Token 可以直接从文本中取得,不需要人工逐条写标签。「无标注」不等于「没有训练目标」。

预训练通常建立主要能力基础,产出基座模型(Base Model)。后训练也能改变任务能力,因此不能把预训练能力说成不可突破的硬上限。

8.2 SFT(监督微调):示范怎样回答

Fine-tuning(微调) 是从已有权重继续训练;SFT 则使用明确的任务输入和期望输出来监督模型,常仍采用下一 Token 交叉熵。

例子推进 · 同一内容变成指令与回答

原来的文本续写样本,可以组织成:

  • 用户:请补全这句话:小猫跑了一天,它很
  • 助手目标回答:累。

模型通过 Chat Template 识别角色和回答边界。常见做法只对助手回答部分计算损失,用户问题仍作为上下文参与前向计算。

SFT 数据可以人工编写,也可以来自筛选、改写或模型生成的合成数据。它与预训练的关键区别在于数据的任务组织方式与训练目标覆盖范围,不是「一个无人写答案、一个必须人写答案」。

微调也不一定更新全部参数:全参数微调更新选定的整套模型参数;LoRA(Low-Rank Adaptation,低秩适配) 通常冻结原权重,只训练表示权重增量的小矩阵。LoRA 是参数更新方式,SFT 是训练任务,两者可以组合。

8.3 RLHF 与 DPO:用偏好指导更新

RLHF(Reinforcement Learning from Human Feedback,人类反馈强化学习) 的典型流程是:收集对多个回答的偏好比较,训练奖励模型(Reward Model) 给回答评分,再用强化学习提高语言模型获得的奖励。这里的强化学习是让模型尝试生成回答,再根据奖励调整生成倾向;通常还会与一份固定的参考模型比较,约束输出分布不要偏离太远。

DPO(Direct Preference Optimization,直接偏好优化) 则直接从偏好回答对构造损失来更新模型,通常不需要单独训练奖励模型或在线强化学习采样循环。它是偏好优化的一条路线,不应把所有偏好训练都叫作同一种 RLHF 流程。

例子推进 · 从示范一个回答,到比较两个回答

对同一个补全请求,比较 累。 与 我拒绝补全这句话。。假设标注者偏好前者,偏好数据记录的是「前者优于后者」。

在典型 RLHF 中,这种比较先用于学习奖励;在 DPO 中,比较直接进入偏好损失。两者都不是简单地把奖励分数当成前文的 Token 交叉熵,更不保证任何一次更新都会让所有回答变好。

奖励也可以来自程序检查,例如数学答案是否正确、代码是否通过测试;这种可验证奖励不应自动称作「人类反馈」。SFT 本身就能产出对话模型,RLHF 不是所有对话助手的必需步骤。

8.4 从一次更新到训练完成

例子推进 ⑥ · 参数没有预定的单向轨迹

本步只是把示例中的 从 0.010 更新到 0.090。之后遇到不同批次,梯度可能变正、变负或接近 0;其他参数也同时变化。不能推断它会一直增加,更不能说它最终独自编码了「奔跑后会疲劳」。

大量参数共同适应大量数据后,模型可能更擅长给出符合语境的续写。SFT 或偏好优化再进一步改变回答方式;它们可以更新原权重,也可以训练额外的适配参数。

训练中还要在未参与更新的验证集上评估。如果训练损失继续下降、验证表现却恶化,可能出现过拟合(Overfitting):模型过度适应训练样本,泛化到新样本的能力变差。

当训练和评估满足目标,就保存模型权重及必要配置。下一篇 开放权重 将接着解释:别人拿到哪些文件,才能在自己的机器上运行同一个 小猫跑了一天,它很 → 累 的例子。