芥末
发布于 2025-12-29 / 0 阅读
0
0

大语言模型训练为什么像玄学:梯度下降、Loss 曲线与 RLHF

大语言模型(Large Language Model,LLM)训练并不是把知识一条条写进数据库,也不是让模型真正“理解”每一句话。更准确地说,它是在海量文本上不断调整一组巨大的参数,让模型在给定上下文时,更倾向于生成合理的下一个 token。

所谓“玄学”,不是说没有数学原理,而是工程上很难完全看清内部发生了什么。一个千亿参数模型在高维空间里更新权重,人类通常只能盯着 Loss、验证集指标、梯度范数、吞吐量等少数监控信号判断训练是否正常。

LLM 的训练可以拆成三个主要阶段:

flowchart LR
    A[海量无标注文本] --> B[预训练 Pre-training]
    B --> C[基础模型 Base Model]
    C --> D[监督微调 SFT]
    D --> E[指令模型 Instruction Model]
    E --> F[RLHF / 偏好优化]
    F --> G[对话模型 Chat Model]

这三个阶段解决的问题不同,训练目标也不同。

阶段数据来源训练目标主要产物
预训练网页、书籍、代码、论文、多语言文本等预测下一个 token具备语言、常识、代码、推理雏形的基础模型
监督微调(SFT)指令问答、任务样例、领域数据学会按指令回答更像助手、更会按格式完成任务的模型
RLHF(人类反馈强化学习)人类偏好排序、反馈数据生成更符合人类偏好的回答更安全、更礼貌、更像聊天产品的模型

数据量一般是递减的:预训练需要万亿级 token,监督微调可能是百万级样本,RLHF 的人工偏好数据规模更小,但标注成本更高、信号更精细。


1. 预训练、微调、RLHF 分别在教模型什么

1.1 预训练:让模型学会“语言世界的统计规律”

预训练的任务看起来非常朴素:给模型一段文本,让它预测下一个 token。

例如:

输入:法国的首都是
目标:巴黎

模型不会直接输出一个确定答案,而是输出整个词表上的概率分布:

巴黎: 0.72
伦敦: 0.05
法国: 0.03
城市: 0.02
...

如果正确 token 的概率越高,Loss 越低;如果正确 token 的概率很低,Loss 就高。模型通过不断降低 Loss,逐渐学到语言结构、事实关联、语法模式、代码语义和部分推理能力。

预训练学到的不是“回答问题的礼貌格式”,而是更底层的能力:什么词经常一起出现,什么概念之间有关联,代码块应该如何闭合,数学表达式通常怎么展开。

1.2 监督微调:让模型学会“按指令做事”

预训练出来的基础模型擅长续写,但不一定会像助手一样回答问题。监督微调(Supervised Fine-Tuning,SFT)会使用成对的指令和答案训练模型。

例如:

{
  "instruction": "用一句话解释什么是梯度下降",
  "answer": "梯度下降是一种通过沿着 Loss 下降最快的方向更新参数,从而逐步降低错误的优化方法。"
}

SFT 仍然常用交叉熵 Loss,但数据变成了任务样例。它教模型学会问答、摘要、翻译、代码生成、结构化输出等能力,也让模型更习惯“用户提问—助手回答”的形式。

1.3 RLHF:让模型学会“什么回答更符合人类偏好”

RLHF(Reinforcement Learning from Human Feedback,人类反馈强化学习)处理的是另一个问题:两个回答都可能语法正确,但人类更喜欢哪一个?

典型流程如下:

sequenceDiagram
    participant P as Prompt
    participant M as 当前模型
    participant H as 人类标注
    participant R as 奖励模型
    participant O as 优化算法

    P->>M: 输入问题
    M-->>P: 生成多个候选回答
    H->>R: 标注回答偏好排序
    R-->>O: 学到奖励信号
    O->>M: 更新模型,使高奖励回答概率上升

这里的目标已经不只是“下一个 token 是否正确”,而是“整个回答是否让人满意”。奖励模型会把人类偏好压缩成一个分数,PPO(Proximal Policy Optimization,近端策略优化)或其他偏好优化方法再根据这个分数更新模型。

这也带来一个重要后果:RLHF 优化的是偏好,不等于直接优化事实正确性。一个回答可能语气自然、结构清楚、看起来可信,但事实仍然是错的。幻觉问题很大程度上来自这里:模型是在生成高概率、高奖励的文本,而不是从数据库里取出经过验证的事实。


2. 梯度下降:模型到底怎么“学会”

深度学习训练的核心循环可以压缩成四步:

flowchart TD
    A[取一批训练数据 Batch] --> B[前向传播:模型给出预测]
    B --> C[计算 Loss:预测和答案差多少]
    C --> D[反向传播:计算每个参数该怎么改]
    D --> E[优化器更新参数]
    E --> A

用公式表示就是:

θ_new = θ_old - η × ∇L

符号含义:

符号含义
θ模型参数,可以理解为神经网络里的大量权重数字
LLoss,衡量当前预测错了多少
∇L梯度,表示参数朝哪个方向改能让 Loss 下降
η学习率,控制每次更新的步长

一个极简训练循环大致长这样:

for batch in dataloader:
    x, y = batch

    logits = model(x)                 # 前向传播
    loss = cross_entropy(logits, y)    # 计算 Loss

    loss.backward()                    # 反向传播,计算梯度
    optimizer.step()                   # 更新参数
    optimizer.zero_grad()              # 清空梯度,准备下一步

真实的 LLM 训练会复杂得多:分布式并行、混合精度、梯度累积、检查点保存、数据调度、通信优化都要一起处理。但核心逻辑仍然是:预测、算错、回传、改参数。


3. 学习率:一步迈多大决定训练稳不稳

学习率是最关键的超参数之一。它控制参数每次更新的幅度。

学习率状态表现常见后果
太大Loss 大幅震荡,甚至突然飙升参数跨过最优区域,训练发散
太小Loss 下降很慢训练成本高,可能长时间没有明显进展
合适Loss 整体下降,局部有小幅波动模型稳定收敛

实际训练中不会从头到尾使用一个固定学习率,而是会设计学习率调度策略:

策略作用
Warmup(预热)训练初期从较小学习率开始,逐步升高,避免模型刚开始就被大梯度冲坏
Decay(衰减)训练后期逐渐降低学习率,让参数更新更细致
Cosine Annealing(余弦退火)学习率按余弦曲线变化,常用于平滑地从高学习率过渡到低学习率

训练像在高维地形里找低谷。学习率太大,容易在谷底附近来回跳;学习率太小,又可能走得过慢。


4. 反向传播:误差怎样传回每一层

神经网络前向传播时,输入从底层进入,一层层变换,最后输出预测结果。反向传播(Backpropagation)则反过来,从输出层开始,把误差信号传回前面的每一层。

它依赖链式法则。简化表达如下:

∂L/∂θ₁ = ∂L/∂h₃ × ∂h₃/∂h₂ × ∂h₂/∂θ₁

含义是:如果某个早期参数 θ₁ 影响了中间状态 h₂,h₂ 又影响 h₃,h₃ 再影响最终 Loss,那么 θ₁ 对 Loss 的影响可以通过一层层偏导数相乘算出来。

这也是 LLM 训练需要大量 GPU(Graphics Processing Unit,图形处理器)的原因。模型里可能有数百亿甚至千亿级参数,每个参数都要参与前向计算和梯度计算,单机很难承受这样的计算量和显存需求。


5. 知识不是存在某个参数里,而是分布在权重组合中

LLM 不像关系型数据库那样保存事实:

key = "法国首都"
value = "巴黎"

更接近的理解是:大量训练样本反复推动模型调整权重,使得“法国的首都是”这个上下文经过网络计算后,更容易激活“巴黎”对应的输出方向。

流程可以这样看:

flowchart LR
    A[输入文本] --> B[Tokenizer 切成 token]
    B --> C[Embedding 映射为向量]
    C --> D[Transformer 多层计算]
    D --> E[Hidden State 语义表示]
    E --> F[投影到词表]
    F --> G[输出 token 概率分布]

token 是离散的,隐藏状态是高维向量。以一些大模型配置为例,词表可能有十几万个 token,隐藏维度可能有几千到上万维。词表负责入口和出口,高维隐藏空间负责中间的语义计算。

部分特点作用
Token离散编号,数量有限把文本变成模型能处理的符号
Embedding向量表示把离散 token 映射到连续空间
Hidden State高维连续表示承载上下文语义和中间计算
Logits每个 token 的分数决定下一个 token 的概率

所以,模型会“背书”的本质不是把句子原封不动存起来,而是训练数据改变了权重分布,使某些上下文更倾向于走向某些输出。

这也解释了幻觉:模型不是查事实表,而是在当前上下文下生成最可能的文本。如果训练数据里错误信息足够多,或者上下文诱导了错误模式,模型也可能生成看起来很自然的错误答案。


6. Loss 曲线:训练过程最常看的仪表盘

训练 LLM 时,人类不可能逐个检查千亿参数的变化。工程上最常看的信号之一,就是 Loss 随训练步数变化的曲线。

典型 Loss 曲线通常会经历几个阶段:

  1. 初始阶段:Loss 很高,模型接近随机猜测。
  2. 快速下降:模型学到高频模式、基本语法和常见结构。
  3. 缓慢下降:模型开始吸收更细的知识和更复杂的模式。
  4. 收敛平台:继续训练的收益变小,Loss 下降趋缓。

典型的 Loss 曲线

这条曲线的重点不是每一个点,而是整体趋势。训练数据按 batch 分批进入模型,每个 batch 的难度不同,Loss 出现抖动很正常。更可靠的看法是观察滑动平均、验证集 Loss 和周期性评测结果。

几个基础概念需要分清:

概念含义
Batch一次送入模型的一批样本
Batch Size每个 batch 包含多少样本或 token
Step完成一次参数更新
Epoch整个训练集被完整遍历一遍

如果有 100 万条样本,Batch Size 是 1000,那么 1 个 Epoch 包含 1000 个 Step。LLM 预训练更常按 token 数和 step 统计,因为数据规模太大,完整 epoch 的概念不一定像小数据集训练那样直观。


7. Loss 曲线的常见异常

Loss 曲线不是越平滑越好,也不是短时间上升就一定有问题。关键是把训练 Loss、验证 Loss、学习率、梯度范数放在一起看。

Loss 曲线的常见异常模式

常见模式可以归纳成下面几类:

曲线表现可能原因处理方向
训练 Loss 长时间不降学习率太小、数据管道错误、标签错位、模型结构有 bug检查数据和标签,做小批量过拟合测试,调整学习率
Loss 突然飙升后无法恢复学习率过大、梯度爆炸、数值溢出降低学习率,启用梯度裁剪,检查混合精度配置
Loss 大幅震荡学习率偏大、batch 太小、数据分布波动大增大有效 batch,调低学习率,平滑数据采样
训练 Loss 降,验证 Loss 升过拟合、数据重复、训练集泄漏增强数据清洗,增加正则化,提前停止
训练和验证 Loss 都很高欠拟合、模型太小、训练不足、数据质量差延长训练,增大模型或改进数据

过拟合和欠拟合尤其常见:

状态训练集表现验证集表现含义
过拟合Loss 很低Loss 变高或不降模型记住训练样本,但泛化差
欠拟合Loss 也降不下去Loss 同样很高模型能力不足或训练没有学起来
正常学习Loss 稳定下降Loss 也同步下降模型学到可泛化规律

只看训练 Loss 很危险,因为模型可能只是在“背题”。验证集和独立评测才更能反映真实能力。


8. 三个阶段的 Loss 到底差在哪

三个训练阶段都可能用梯度下降,但“什么算对”完全不同。

8.1 预训练 Loss:预测下一个 token

预训练常用交叉熵(Cross-Entropy)作为 Loss。交叉熵衡量真实分布和模型预测分布之间的差距。

假设输入是:

今天天气真

正确下一个 token 是:

模型给“好”的概率是 0.3,那么 Loss 是:

Loss = -ln(0.3) ≈ 1.20

如果模型给“好”的概率提升到 0.9:

Loss = -ln(0.9) ≈ 0.105

对比很直观:

正确 token 概率Cross-Entropy Loss含义
0.90.105模型很有把握地预测对了
0.31.204模型有些犹豫
0.014.605模型几乎没猜到正确答案

交叉熵有一个重要特性:正确答案概率越低,惩罚越大。这会推动模型把概率质量更多分配给真实 token。

8.2 SFT Loss:还是预测 token,但数据变成任务答案

监督微调也常用交叉熵,只不过训练数据从普通文本变成了指令和答案。

例如:

用户:法国的首都是哪里?
助手:巴黎。

训练时,通常会让模型在“助手回答”部分计算 Loss,推动它学会在类似问题下生成合适答案。SFT 不只是教事实,也教格式、语气、步骤和任务边界。

但 SFT 数据太窄会有副作用。如果只拿某个小领域数据反复训练,模型可能损失一部分通用能力,这就是灾难性遗忘(Catastrophic Forgetting)的一种表现。

LoRA(Low-Rank Adaptation,低秩适配)等参数高效微调方法之所以流行,一个重要原因是它们冻结大部分原始权重,只训练少量新增参数,从而降低破坏基础能力的风险。

8.3 RLHF Loss:从“预测正确”变成“偏好更高”

RLHF 的优化信号来自奖励模型,而奖励模型来自人类偏好标注。它不再直接问“下一个 token 是不是训练集里的答案”,而是问“这个完整回答在人类排序里是否更好”。

阶段优化目标“对”的定义风险
预训练下一个 token 概率更像训练语料中的语言模式可能学到错误或偏见
SFT指令答案匹配更符合任务样例数据太窄会损伤通用能力
RLHF奖励分数更高更符合人类偏好可能迎合偏好而不保证真实

这就是为什么一个模型可以同时“很会说话”和“会胡说”。RLHF 会让回答更礼貌、更完整、更像助手,但事实校验仍然需要检索、工具调用、外部数据库或更强的训练数据支持。


9. 训练难点:公式简单,工程变量太多

梯度下降公式只有一行,但真正训练一个大模型时,要同时处理超参数、数据配方、分布式系统、数值稳定性和评测体系。

9.1 超参数会互相影响

超参数不是模型自动学出来的,而是训练前或训练中由工程师设定的“学习规则”。

超参数控制什么常见影响
学习率每次参数更新幅度太大易发散,太小训练慢
Batch Size每次用于估计梯度的数据量大 batch 更稳定,但显存和通信压力更高
Warmup Steps学习率预热时长预热不足可能早期不稳定
Weight Decay权重衰减强度抑制过拟合,过大可能限制表达能力
Dropout随机关停部分神经元小模型常用,大模型预训练中不一定常用
Gradient Clipping梯度裁剪阈值防止梯度爆炸
Sequence Length输入上下文长度越长越耗显存和算力
Optimizer参数更新算法AdamW 等优化器常用于 Transformer 训练

难点在于这些变量不是独立的。Batch Size 变了,学习率可能也要变;数据配方变了,Loss 曲线形态也会变;上下文长度增加,显存占用和训练吞吐都会变化。

9.2 数据质量经常比模型大小更关键

训练数据不是越多越好。重复、低质、乱码、广告、自动生成垃圾文本、错误代码、污染评测集的数据都会影响模型。

一个典型数据管道可能是这样:

flowchart LR
    A[原始数据采集] --> B[格式解析]
    B --> C[去重]
    C --> D[质量过滤]
    D --> E[安全与隐私过滤]
    E --> F[按领域配比混合]
    F --> G[Tokenizer 编码]
    G --> H[进入训练]

数据配方也很重要。通用文本提供常识和语言能力,数学数据提供推理训练,代码数据提供严密结构,多语言数据扩展语言覆盖范围。某一类数据比例过高,模型可能在对应领域变强,但也可能牺牲其他能力。

这也是微调容易“调傻”的原因:如果微调数据单一、重复、风格强烈,模型会被新的梯度牵引到狭窄分布里,原来的通用能力被覆盖。

9.3 分布式训练会放大每一个小问题

大模型训练通常需要很多 GPU 同时工作。模型可能被切分到不同设备上,数据也会被分发到不同节点上。任何一个环节出问题,都会影响整体训练。

常见工程问题包括:

问题表现
通信瓶颈GPU 等待同步,算力利用率低
显存不足batch 或序列长度上不去
数值溢出Loss 变成 NaN,训练中断
节点故障长时间训练被迫恢复检查点
数据加载慢GPU 空转,吞吐下降

训练不是单纯的算法问题,也是一套大规模系统工程。

9.4 涌现能力难以精确预测

模型变大、数据变多、训练更充分后,一些能力会突然显得明显增强,例如多步推理、代码生成、数学解题、上下文学习等。这类现象常被称为涌现(Emergence)。

需要谨慎理解“突然出现”。有些能力看起来是跳变,可能是评测指标太粗导致的;模型真实能力也许是渐进增长,只是超过某个阈值后才在测试中表现出来。

可以确定的是:模型规模、数据质量、训练 token 数和评测方式共同决定能力边界,没有一个简单公式能保证“多少参数一定会出现某能力”。


10. 训练看板应该盯哪些指标

只看训练 Loss 不够。一个更可靠的训练看板至少应该包含这些指标:

指标作用
Training Loss判断模型是否在训练集上学习
Validation Loss判断泛化能力和过拟合风险
Perplexity(困惑度)语言模型常用指标,可由 Loss 转换得到
Learning Rate确认调度策略是否按预期执行
Gradient Norm监控梯度爆炸或梯度异常
Throughput每秒处理 token 数,衡量训练效率
GPU Utilization判断算力是否被充分使用
Evaluation Benchmarks观察数学、代码、问答、推理等能力变化
Data Mix Ratio确认不同数据源比例是否符合配方

训练稳定不代表模型一定好,Loss 下降也不代表真实能力全面提升。最终还需要在独立评测、人工检查和实际任务中验证模型表现。


11. 符号和概念速查

符号 / 概念含义
θ模型参数
η学习率
LLoss,损失函数
梯度,表示 Loss 增长最快的方向
偏导数,表示某个变量变化对结果的影响
Batch一次训练使用的一批数据
Step一次参数更新
Epoch训练集完整遍历一遍
Cross-Entropy衡量真实分布和预测分布差距的 Loss
Backpropagation反向传播,用链式法则计算梯度
RLHF基于人类反馈的强化学习
PPO一种常用于 RLHF 的策略优化算法

核心公式仍然是:

θ_new = θ_old - η × ∇L

翻成工程语言就是:

新参数 = 旧参数 - 学习率 × 梯度

大语言模型训练的底层逻辑并不神秘:用数据产生预测,用 Loss 衡量错误,用梯度更新参数。真正困难的是参数太多、空间太高、数据太复杂、训练信号太有限。工程师能观察到的只是少数曲线和指标,而模型内部的表示如何形成、能力何时出现、某次训练为什么更好,仍然需要大量实验才能判断。


评论