· 预计阅读 8 分钟

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 位于 forwardbackward 的交界处:

  • 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 主要解决三类问题:

  1. 不同参数的梯度尺度差异很大
    有些参数梯度一直很大,有些一直很小。统一步长容易让训练不稳定。

  2. 梯度方向有噪声
    mini-batch 训练看到的只是数据的一部分,梯度并不总是完美方向。

  3. 权重需要被适度约束
    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 只是目标函数上的数值。能力则发生在真实任务中。

两者相关,但不是同一件事。

常见错位包括:

  1. 数据分布错位
    训练数据里的问题太单一,Loss 降低只说明模型适应了这批样本。

  2. 答案格式错位
    模型学会了固定模板,但没有学到真实判断逻辑。

  3. 评估目标错位
    Cross Entropy 优化的是 token 概率,不直接等于事实正确、推理严谨或工具调用可靠。

  4. 过拟合
    模型记住训练样本,泛化能力反而下降。

  5. 奖励投机
    对齐训练中,模型可能学会迎合偏好信号,而不是形成更可靠的能力。

所以训练报告里至少需要同时看三件事:

  • 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 maskpadding 是否被错误计入 Loss
loss maskprompt 部分是否应该参与训练
trainable paramsLoRA / 冻结参数是否真的可训练
grad norm是否出现梯度爆炸或过小
learning rate是否过大、过小或 warmup 不合理
eval set是否覆盖真实任务,而不只是训练格式

很多微调事故不是模型不行,而是训练链路里某个细节把学习信号扭曲了。


📌 核心结论

  1. Loss 定义了训练方向,不只是一个误差数字
  2. Cross Entropy 惩罚的是模型没有给正确 token 足够高的概率
  3. 反向传播负责把输出端误差分配到每一层参数
  4. 梯度下降通过小步参数更新,让模型逐步接近低 Loss 区域
  5. AdamW 用历史趋势、尺度自适应和权重衰减提高训练稳定性
  6. 学习率与 scheduler 决定训练能否稳定收敛
  7. 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[业务闭环]

从这里开始,系列会逐步从“模型内部如何学习”,走向“如何把训练能力放进真实系统”。