Loss & 优化:模型为什么会“学会”?(从误差到能力的塑形)
真正让模型开始“学会”的地方,是预测结果与训练目标之间的差距。
Loss 不是简单的扣分表,而是训练系统给模型施加的方向。
模型不是突然理解了语言,也不是把所有文本原样记住了。更准确的说法是:模型在一次次误差反馈中,被目标函数塑造成更容易给出正确预测的参数状态。
📌 本篇聚焦的问题
- Loss 到底衡量的是什么
- 为什么语言模型训练常用 Cross Entropy
- 误差如何从输出层一路传回 Embedding 和 Attention
- 梯度下降为什么能让模型能力逐步形成
- AdamW、学习率、warmup、scheduler 分别解决什么问题
- 为什么 Loss 下降不等于模型真的变好
- 小模型微调中,哪些 Loss 曲线值得警惕
这一篇不是“训练技巧清单”,而是把训练中最容易被跳过的一层拆开:误差如何变成方向,方向如何变成参数更新,参数更新如何累积成能力。
🧭 Loss 在训练链路中的位置
flowchart TB
A[文本样本] --> B[Tokenizer]
B --> C[Embedding]
C --> D[Transformer]
D --> E[Logits]
E --> F[Loss]
F --> G[Backward / 梯度]
G --> H[Optimizer Step]
H --> I[参数更新]
I --> D
从工程角度看,Loss 位于 forward 和 backward 的交界处:
- forward:模型给出预测
- loss:预测和目标之间产生误差
- backward:误差被拆成每个参数的责任
- optimizer:按照责任大小更新参数
所以 Loss 的本质不是“训练日志里的一行数字”,而是整个训练系统的控制信号。
🔍 1. 从 Logits 到 Loss:模型先犯错,训练才有方向
语言模型每一步输出的不是文字,而是一组 logits。
假设词表里只有 5 个 token,模型在某个位置输出:
logits = [2.1, -0.3, 0.7, 4.2, 1.0]
这些数字还不是概率。经过 softmax 后,它们变成对下一个 token 的概率分布:
prob = softmax(logits)
如果真实答案是第 3 个 token,但模型把最高概率给了第 4 个 token,Loss 就会升高。
在下一词预测里,训练目标可以写成:
给定 token_1 ... token_i
预测 token_{i+1}
每个位置都会产生一次预测,也都会产生一次误差。长文本训练时,模型不是只在句尾学习,而是在所有可预测位置上同时被约束。
🧠 2. Cross Entropy:为什么常用交叉熵
语言模型训练里最常见的 Loss 是 Cross Entropy。它衡量的是:
模型给真实答案分配的概率有多低。
简化公式:
Loss = -log P(正确 token)
这个公式很朴素,但非常关键:
- 正确 token 概率越高,Loss 越低
- 正确 token 概率越低,Loss 越高
- 模型越自信地错,惩罚越大
举个直观例子:
| 正确 token 概率 | Loss 直觉 |
|---|---|
| 0.90 | 很低,模型基本判断对了 |
| 0.50 | 中等,模型还在摇摆 |
| 0.10 | 很高,模型几乎没抓住规律 |
| 0.01 | 极高,模型非常自信地错了 |
Cross Entropy 的妙处在于,它不只是告诉模型“错了”,还会给出连续的惩罚强度。训练因此不是黑白判断,而是可微分的方向调整。
🧩 3. Loss 定义了“什么叫变好”
不同 Loss 会塑造不同能力。
这点非常重要:模型不会自动追求“人类觉得好”的答案,它只会追求目标函数定义的方向。
flowchart LR
A[训练目标] --> B[Loss 设计]
B --> C[梯度方向]
C --> D[参数更新]
D --> E[模型行为]
几个常见例子:
| 训练目标 | Loss/反馈形态 | 容易塑造出的能力 |
|---|---|---|
| 下一词预测 | Cross Entropy | 语言建模、续写、模式复现 |
| 指令微调 | 监督式答案 Loss | 按格式回答、遵循任务描述 |
| 偏好对齐 | Pairwise / DPO 类目标 | 更接近人类偏好的回答风格 |
| 检索向量训练 | Contrastive Loss | 相似文本靠近,不相关文本拉远 |
| 分类任务 | Cross Entropy | 类别边界与判别能力 |
所以训练不是把“智能”灌进模型,而是设计一个目标,让模型在不断降低误差的过程中形成某种行为倾向。
这也是很多微调失败的根源:数据看起来对,但目标函数没有真正约束想要的能力。
🔧 4. 反向传播:误差如何分配责任
Loss 出现在输出端,但参数分布在整个模型中:
- Embedding 矩阵
- Attention 的 Q/K/V/O 投影
- FFN / MLP 权重
- LayerNorm 参数
- 输出层权重
反向传播做的事情,就是用链式法则把一个总误差拆回每一层、每一个参数。
flowchart RL
L[Loss] --> O[Output Head]
O --> F[FFN / MLP]
F --> A[Attention]
A --> E[Embedding]
每个参数都会得到一个梯度:
gradient = 参数变化会让 Loss 上升/下降多少
梯度的含义不是“这个参数好不好”,而是:
如果沿某个方向轻微移动这个参数,Loss 会如何变化。
这就是训练能发生的根本原因:神经网络虽然巨大,但它仍然是一个可微分函数。只要 Loss 能被计算,误差就能沿计算图传回去。
⚙️ 5. 梯度下降:学习不是跳跃,而是小步更新
最基础的参数更新可以写成:
参数 = 参数 - 学习率 × 梯度
直觉上看:
- 梯度告诉方向
- 学习率决定步子有多大
- 优化器决定这一步怎么走得更稳
这件事看似简单,但模型训练的大部分稳定性问题都藏在这里。
如果学习率太大,参数更新会跨过低点,Loss 来回震荡甚至爆炸。
如果学习率太小,训练会非常慢,甚至卡在低效区域。
flowchart TB
A[学习率太大] --> B[震荡 / 发散 / Loss 爆炸]
C[学习率合适] --> D[稳定下降 / 逐步收敛]
E[学习率太小] --> F[下降缓慢 / 训练成本浪费]
学习率不是一个“越大越快”的旋钮,而是训练稳定性的核心控制器。
🧮 6. Optimizer:为什么不只用普通梯度下降
真实训练里很少直接使用最朴素的 SGD。大模型训练更常见的是 AdamW。
AdamW 主要解决三类问题:
-
不同参数的梯度尺度差异很大
有些参数梯度一直很大,有些一直很小。统一步长容易让训练不稳定。 -
梯度方向有噪声
mini-batch 训练看到的只是数据的一部分,梯度并不总是完美方向。 -
权重需要被适度约束
weight decay 可以防止参数无限膨胀,AdamW 把它和梯度更新解耦得更干净。
可以把 AdamW 理解成一个带记忆的更新器:
- 记住梯度的一阶趋势:最近大致往哪里走
- 记住梯度的二阶尺度:不同参数的步子该如何自适应
- 额外做权重衰减:避免参数规模失控
SGD:只看当前坡度
AdamW:看当前坡度 + 历史趋势 + 参数尺度约束
这也是小模型微调常用 AdamW 的原因:它不是最神秘的选择,但通常是稳定、好用、可控的起点。
📈 7. Scheduler 与 Warmup:训练前期为什么要慢慢加速
训练刚开始时,模型参数还很乱,梯度也可能很不稳定。如果一上来就使用较大学习率,模型可能在还没建立基本结构前就被大步更新带偏。
Warmup 的作用是让学习率从很小逐步升高:
初期:小学习率,避免模型被冲坏
中期:达到峰值,快速学习主要模式
后期:逐步下降,细化参数并稳定收敛
常见学习率形态:
flowchart LR
A[Warmup] --> B[Peak LR]
B --> C[Decay]
C --> D[Converge]
一个训练系统是否稳定,很多时候不只取决于模型结构,也取决于学习率曲线是否合理。
🧪 8. Loss 曲线应该怎么看
Loss 曲线不是越低越好,也不是只看最后一个数字。
更重要的是看形态。
| 曲线形态 | 可能含义 | 常见处理方向 |
|---|---|---|
| 平稳下降 | 训练正常,模型在吸收模式 | 继续观察验证集 |
| 快速下降后停滞 | 学到浅层模式,但能力上限受限 | 检查数据质量、模型容量、学习率 |
| 剧烈震荡 | 更新步子不稳 | 降低学习率、检查 batch、梯度裁剪 |
| 训练 Loss 降,验证 Loss 升 | 过拟合 | 增加数据、正则化、早停 |
| Loss 很低但效果差 | 目标与评估不一致 | 重看数据格式、label、评估集 |
| Loss 不下降 | 学习信号弱或链路错误 | 检查 label shift、mask、冻结参数 |
在小模型训练和 LoRA 微调里,最容易出现的是两种情况:
- Loss 看起来在下降,但模型只是学会了数据格式
- 训练集效果变好,但真实问题上的回答没有改善
这说明 Loss 是必要信号,但不是完整评估。
🧨 9. “Loss 下降”为什么不等于“能力提升”
Loss 只是目标函数上的数值。能力则发生在真实任务中。
两者相关,但不是同一件事。
常见错位包括:
-
数据分布错位
训练数据里的问题太单一,Loss 降低只说明模型适应了这批样本。 -
答案格式错位
模型学会了固定模板,但没有学到真实判断逻辑。 -
评估目标错位
Cross Entropy 优化的是 token 概率,不直接等于事实正确、推理严谨或工具调用可靠。 -
过拟合
模型记住训练样本,泛化能力反而下降。 -
奖励投机
对齐训练中,模型可能学会迎合偏好信号,而不是形成更可靠的能力。
所以训练报告里至少需要同时看三件事:
- training loss:模型是否能吸收训练信号
- validation loss:是否具备基本泛化
- task eval:真实任务是否变好
只看 training loss,很容易把“记住样本”误判成“学会能力”。
🛠️ 10. 小模型微调中的工程检查点
Loss 与优化相关的问题,通常可以沿下面这条链路排查:
flowchart TB
A[数据样本] --> B[Tokenizer / Label]
B --> C[Mask / Label Shift]
C --> D[Forward / Loss]
D --> E[Backward / Grad]
E --> F[Optimizer]
F --> G[Scheduler]
G --> H[Eval]
关键检查点:
| 检查项 | 观察重点 |
|---|---|
| label shift | 预测位置和目标 token 是否错位 |
| attention mask | padding 是否被错误计入 Loss |
| loss mask | prompt 部分是否应该参与训练 |
| trainable params | LoRA / 冻结参数是否真的可训练 |
| grad norm | 是否出现梯度爆炸或过小 |
| learning rate | 是否过大、过小或 warmup 不合理 |
| eval set | 是否覆盖真实任务,而不只是训练格式 |
很多微调事故不是模型不行,而是训练链路里某个细节把学习信号扭曲了。
📌 核心结论
- Loss 定义了训练方向,不只是一个误差数字
- Cross Entropy 惩罚的是模型没有给正确 token 足够高的概率
- 反向传播负责把输出端误差分配到每一层参数
- 梯度下降通过小步参数更新,让模型逐步接近低 Loss 区域
- AdamW 用历史趋势、尺度自适应和权重衰减提高训练稳定性
- 学习率与 scheduler 决定训练能否稳定收敛
- Loss 下降不等于能力提升,需要结合验证集与真实任务评估
🧭 实践建议:最小观察清单
- 记录 training loss、validation loss、learning rate、grad norm 四条曲线
- 抽样对比训练前后的同一批问题,观察是否只是格式变好
- 检查 prompt 部分是否被错误纳入 Loss
- 用一组真实任务样例做固定评估集,避免只看训练日志
- 对同一数据跑两组学习率,比较收敛速度与稳定性
📌 下一篇预告
《数据工程:为什么训练数据决定了模型上限?(从清洗到样本配比)》
下一篇会把视角从优化过程切到数据本身:
- 为什么“脏数据”会污染梯度方向
- 样本配比如何影响模型行为
- 指令数据、领域数据、负样本分别塑造什么能力
核心观点是:优化器只负责沿着信号走,而训练数据决定信号通向哪里。
🗺️ 后续章节路线
这个系列后面不会变成零散技巧清单,而是继续沿着“训练系统如何真实工作”这条线往下拆:
| 顺序 | 章节方向 | 要解决的问题 |
|---|---|---|
| 第 5 篇 | 数据工程:为什么训练数据决定了模型上限? | 数据清洗、样本配比、领域数据、负样本与梯度方向 |
| 第 6 篇 | Tokenizer & 样本构造:模型到底读到了什么? | token 切分、上下文窗口、label shift、loss mask 与训练样本格式 |
| 第 7 篇 | LoRA / QLoRA:为什么低成本微调可行? | 全参训练、参数高效微调、rank、adapter 与显存账本 |
| 第 8 篇 | 评估体系:模型到底有没有真的变好? | training loss、validation loss、任务评估、回归集与人工验收 |
| 第 9 篇 | RAG vs 微调:知识应该放进检索,还是写进参数? | 知识更新频率、事实性、成本、召回边界与能力边界 |
| 第 10 篇 | 推理与部署:模型能力如何稳定跑起来? | 量化、KV Cache、吞吐、并发、延迟与部署成本 |
| 第 11 篇 | Agent 与行业模型:训练如何进入真实业务闭环? | 工具调用、流程数据、行为约束、反馈数据与持续改进 |
这条路线的核心逻辑是:
flowchart LR
A[Loss / 优化] --> B[数据工程]
B --> C[样本构造]
C --> D[微调方法]
D --> E[评估体系]
E --> F[RAG 与微调边界]
F --> G[推理部署]
G --> H[业务闭环]
从这里开始,系列会逐步从“模型内部如何学习”,走向“如何把训练能力放进真实系统”。