当我们说“把一个大模型微调成会完成某项任务”时,物理上到底发生了什么?
模型文件里没有一段新写进去的 Python:
if user_asks_for_summary:
produce_a_good_summary()
也没有一张叫作“总结能力”的表。训练前后真正变化的,主要还是一大组数字。
最常见的回答是:计算 loss,反向传播,再用梯度下降更新权重。
这句话没有错,但它跳过了最有意思的部分:
一个样本怎样推动某个数字变化?
海量样本产生的许多次微小更新,怎样叠成一项能力?
SFT、RLHF、DPO、LoRA 分别改变了哪一环?
模型在 prompt 里现学一个模式时,权重真的又变了吗?
任务能力最后究竟“存”在哪里?
这篇从一次可以亲手复算的权重更新开始,一直走到预训练、后训练和机制可解释性。最后会发现,“任务进入权重”这个说法只对了一半:训练可以把表示方式、行为倾向和可复用算法写进权重;真正执行任务时,当前上下文还要在激活值中把它们实例化出来。
1. 权重不是数据库里的存储格
先拆掉一个很自然的心智模型:“巴黎”通常不是存进某个独立参数,“总结能力”也没有一组可以整齐拆下的专用权重。
一个权重首先只是乘法里的系数。它会在许多 token、许多输入和许多计算路径中被反复使用。单独把一个参数拿出来,往往无法给它贴上“巴黎”“翻译”或“礼貌”这样的稳定标签。
更准确的说法是:
权重共同定义了一个计算系统。训练改变的是这个系统面对不同输入时的计算倾向,而不是向某个地址写入一条可直接读取的规则。
例如,一个指令模型“更会总结”,可观察到的是一整片行为变化:面对许多不同文章、长度要求和表达方式,它都更可能生成抓住重点、满足格式的 token 序列。训练需要同时改变这些条件概率,而不是只记住一句标准答案。
2. 先分清 weights、context 和 activations
这三个概念经常被混在一起。
| 概念 | 它是什么 | 一次普通 API 请求结束后是否保留 |
|---|---|---|
| Weights | 训练形成的数值参数与长期计算倾向 | 保留 |
| Context | 当前 prompt、示例、检索材料和历史消息 | 通常不作为模型参数保留 |
| Activations | 这次前向计算中各层产生的中间状态 | 通常消失 |
可以把模型想成一座自动化工厂:
- architecture 是工厂布局;
- weights 是可调设备的参数;
- context 是今天的订单与原材料;
- activations 是本次运行中的信号与半成品。
真正训练时,会修改工厂设备:
训练数据
→ 前向计算
→ loss
→ 反向传播
→ optimizer
→ 新 weights
普通推理时,设备不变:
固定 weights + 当前 context
→ 本次 activations
→ 输出 token
因此,prompt 可以显著改变模型这一次的行为,却通常不会修改模型文件。所谓 in-context learning 是行为意义上的“从上下文适应”,不能直接等同于参数训练。
3. 公式之前,先补四块最小数学地基
3.1 矩阵乘法的核心只是乘法再相加
先不想大矩阵。两个小向量:
x = [2, 1]
w = [0.3, -0.2]
x · w = 2×0.3 + 1×(-0.2) = 0.4
这个 0.4 可以理解成模型对某个候选答案给出的分数。真实 LLM 只是把向量维度扩大到几千,同时为词表中数万或更多候选 token 计算分数,并把这种乘加重复很多层。
3.2 分数还不是概率
模型最后会得到一组 logits,也就是尚未归一化的分数。Softmax 做三步:指数化、求和、再分别除以总和。
例如:
logits = [2, 1]
exp(logits) ≈ [7.39, 2.72]
sum ≈ 10.11
probabilities ≈ [0.731, 0.269]
指数会放大分数差异,除以总和后得到模型自己的归一化概率分布。这里的“概率”描述模型当前的预测分布,不保证等于现实世界的客观可信度。
二分类时常用 sigmoid:
sigmoid(z) = 1 / (1 + exp(-z))
它把一个分数压到 0 和 1 之间。
3.3 Loss 把“错多少”压成一个数
如果正确答案的预测概率是 p,常见损失为:
L = -log(p)
这里 log 是自然对数;这个简式对应正确类别已经确定,或后面二分类例子中的 y=1。一般二分类交叉熵还会包含负类项:
L = -[y log(p) + (1-y)log(1-p)]
当 p=0.9:
L ≈ 0.105
当 p=0.1:
L ≈ 2.303
模型越自信地把正确答案判成低概率,损失越大。对数还会把整段序列中多个 token 的概率乘积,转换成更容易计算的加和形式。
3.4 梯度是局部斜率,不是语义上的“责任人”
梯度回答的问题是:
如果某个参数只移动一点点,loss 会朝哪个方向、以多快的速度变化?
写成:
dL/dw
它是数学敏感度。把它叫作“每个参数为错误负了多少责任”有助于入门,但不要把这个类比当真:梯度不知道什么是事实、语法或用户意图,它只描述当前位置附近的数值变化。
4. 亲手走完一次权重更新
现在用一个只有一个输入、一个权重的二分类模型。
已知:
x = 2
w = 0.3
y = 1
y=1 表示正确答案属于正类。
第一步:前向计算
z = xw
= 2 × 0.3
= 0.6
p = sigmoid(0.6)
≈ 0.645656
模型给正确类别约 64.6% 的概率。
第二步:计算损失
L = -log(p)
≈ 0.437488
第三步:计算梯度
这个简单模型的导数可以沿链式法则拆开:
dL/dw = dL/dz × dz/dw
dL/dz = p-y
dz/dw = x
代入这两段导数,得到:
dL/dw = (p-y)x
= (0.645656-1)×2
≈ -0.708687
梯度是负数,说明在当前位置增大 w 会让 loss 下降。
第四步:更新权重
先使用最朴素的 SGD,学习率取 0.1:
w' = w - learning_rate × gradient
= 0.3 - 0.1×(-0.708687)
≈ 0.370869
重新预测:
z' = 2×0.370869 ≈ 0.741737
p' = sigmoid(z') ≈ 0.677376
L' = -log(p') ≈ 0.389529
结果很朴素:
正确类别概率:0.646 → 0.677
损失: 0.437 → 0.390
这就是一次参数更新,也是训练的一小步。没有规则被写入数据库,只是一个系数移动后,同样输入经过同样计算,输出分布向正确答案偏了一点。
这个学习率恰好让本步损失下降,不能由此推出任意学习率、任意非凸网络的每一步都会下降。
5. 从一个权重放大到 LLM
Transformer 的规模大得多,原理却没有突然换一套。
在输出层,可以用行向量记法写成:
h: 1 × d 当前 token 的 hidden state
W_vocab: d × V 投影到整个词表的权重
logits: 1 × V
logits = hW_vocab
V 是词表大小。Softmax 把 logits 变成下一个 token 的预测分布,交叉熵读取正确 token 的概率。
在“单个正确 token、标准 softmax + cross-entropy、没有 label smoothing”这些条件下,对 logits 的梯度有一个很漂亮的形式:
dL/dlogits = predicted_probabilities - one_hot(correct_token)
前面二分类例子中的 p-y,就是它的特例。
随后,链式法则把梯度从输出层传回 hidden state,再逐层传回 MLP、attention projections 和 embedding。Transformer 里的这些主要计算模块可以回到原始的 Attention Is All You Need 查看。
真实训练不会每看一个 token 就立刻单独修改一次权重。一段序列中各个目标 token 的 loss 会求和或平均,mini-batch 再汇总多条序列。因此,一次反向传播得到的,是许多 token 对同一组共享参数的合成梯度。
要注意,反向传播不等于“每个参数都改一样多”:
- 有些参数的梯度很大,有些很小或为零;
- 一个 mini-batch 通常会汇总许多 token 的信号;
- 不同样本可能把同一个参数推向相反方向;
- 某些层可以被冻结,根本不参与更新;
- 优化器还会结合历史梯度决定实际步长。
Adam 为什么不只是 SGD
Adam 为每个参数维护两类移动平均:
m:梯度值的一阶指数移动平均
v:梯度平方的指数移动平均
m 保留近期梯度值的动量信息,v 描述这个位置的典型梯度尺度。Adam 还会修正它们从零开始带来的早期偏差。直觉上,同一个全局学习率经过 m 和 v 调整后,每个参数得到不同的有效步长。
现代训练里还经常看到 AdamW。它来自 Decoupled Weight Decay Regularization,关键是把权重衰减从自适应梯度更新里分开:
w ← (1-ηλ)w - η × m_hat/(sqrt(v_hat)+ε)
等号右侧第一项 (1-ηλ)w 是衰减后的旧权重,第二项是 loss 梯度形成的自适应更新。原论文主要在图像分类上验证这种解耦,放在这里是解释常见更新机制,而不是声称所有 LLM 都必须使用同一个优化器。
6. 为什么一次更新不会自动变成能力
如果拿一条样本反复训练,模型当然可能记住它。但“会完成任务”要求模型面对没有见过的新输入仍能工作。一次 loss 下降只证明这一小步在当前 batch 上有效,不能单独证明泛化。
从局部更新到可复用能力,中间的桥梁是“共享参数上的反复汇总”。当同一种语言结构、事实关系或任务模式出现在许多不同样本中时,它们的梯度不会完全相同,但与共享规律有关的分量可能部分同向,在 batch 和多次更新中留下来。样本特有或互相冲突的信号则可能抵消,也可能在容量足够时变成记忆。
训练过程因此不是把一条条规则相加,而是反复寻找能降低数据分布上平均损失的统计折中。稳定能力通常来自覆盖目标分布的训练信号与模型已有表示共同作用,不是由“样本足够多”单独保证。
规模论文提供的是这个过程的宏观约束,不是能力形成的微观机制。Scaling Laws for Neural Language Models 在其实验范围内发现,测试损失与非 embedding 参数量、数据量和训练计算量呈平滑经验幂律关系;只扩大其中一项,其他项就可能成为瓶颈。Chinchilla 进一步报告,在它的拟合与训练设置下,计算最优的参数量 N 和 token 数 D 近似同速增长,各自约随算力 C 的 C^0.5 增长;在 C ∝ ND 的粗略估算下,算力翻倍对应两者各增长约 sqrt(2)。这些都是有实验区间和幂律外推边界的经验结论,不是永恒比例。它们共同提醒我们:
容量不等于已经学会。一个再大的参数空间,如果没有看到足够数据、没有接受足够优化,也可能处于 undertrained 状态。
7. 预训练模型怎样变成任务模型
预训练主要让模型学习广泛文本分布。它可能已经拥有总结、翻译、问答和代码模式,却不一定稳定地按照用户指令调用它们。
后训练直接塑造的,是“给定这种请求,什么输出更值得生成”。它既可能教入新模式,也可能主要在重新路由、稳定或暴露预训练已有能力;仅凭行为改善,无法判定一项能力最早在哪个阶段形成。
7.1 SFT:把理想回答继续写成 token 目标
Supervised Fine-Tuning 并不需要一套神秘的新数学。给模型 prompt 和理想 response,然后仍然用 token 级交叉熵训练:
prompt: 请把下面内容总结成三点……
response: 1. …… 2. …… 3. ……
这个目标函数推动模型提高理想 response 中 token 序列的条件概率。大量不同指令共同训练后,模型逐渐形成更稳定的“识别指令—组织答案—满足约束”行为模式。
7.2 经典 RLHF:示范之外,再学习相对偏好
InstructGPT 给出了一条经典三步链路:
标注员 demonstrations
→ SFT policy
同一 prompt 下的回答排序
→ reward model
reward model 的标量分数
→ PPO 优化 SFT policy
第三步不是一味追求奖励模型的高分;它同时惩罚当前策略偏离冻结的 reference model 太远。这能限制为迎合奖励而过度改变语言模型的倾向,却不会自动消除 reward model 本身的偏差。
在论文的 API prompt 测试分布中,175B InstructGPT 相对 175B GPT-3 被标注员偏好 85 ± 3%,相对精心 few-shot prompting 的 GPT-3 被偏好 71 ± 4%。摘要还报告,1.3B InstructGPT 的回答也比 175B GPT-3 更受偏好。
这组结果很容易被误读。它证明的是后训练可以强烈重塑“是否按用户意图回答”这一行为维度,不是说 1.3B 模型在知识、推理和所有 benchmark 上全面超过 175B 模型。
偏好也不是客观真理。该论文的标注团队约 40 人、主要使用英语,许多比较只由一人判断。模型仍会虚构、产生偏见和毒性内容,也可能更忠实地执行有害指令。
7.3 DPO:直接让 preferred response 赢过 rejected response
经典 RLHF 需要显式奖励模型和 PPO 训练环。Direct Preference Optimization 重新参数化这类“奖励偏好回答,同时限制策略偏离 reference model”的目标,把它改写成直接作用于 language model policy 的分类式损失。
记 πθ(y|x) 为当前策略在 prompt x 下生成整段回答 y 的条件概率;它的 log probability 是回答中各 token 条件 log probability 的和。πref 是冻结的参考策略。先定义当前策略相对 reference policy 的偏好 margin:
mθ = [log πθ(y_w|x) - log πref(y_w|x)]
- [log πθ(y_l|x) - log πref(y_l|x)]
其中 y_w 是 preferred response,y_l 是 rejected response。然后:
L_DPO = -log sigmoid(βmθ)
如果 mθ<0,它表示当前策略的 chosen/rejected log 概率比低于 reference 的对应比值,不等于说当前策略在绝对概率上一定更偏向 rejected。Loss 会推动 mθ 增大;mθ 越小,这对样本在 DPO 梯度中的标量系数 β sigmoid(-βmθ) 越大,但真实参数步长仍由 policy 梯度和优化器共同决定。
这里 β 不是学习率,它控制相对参考策略的约束尺度。DPO 没有独立 reward network,但 policy 与 reference 的 log probability ratio 定义了隐式奖励。它也不是“不需要偏好数据或采样”:离线回答仍要先生成并获得比较标签。
原始 DPO 论文实验最大到 6B;更大规模、分布外行为、reward over-optimization 和自动评审敏感性等方面,仍需要额外验证。所以更准确的说法是:DPO 为偏好优化提供了一条更直接的路径,而不是已经普遍取代所有 RLHF 实现。
8. LoRA 没有换掉学习原理,它重参数化了权重增量
SFT 和 DPO 主要给出训练数据与损失目标;PPO 是经典偏好强化学习中的 policy 优化过程;AdamW 是把梯度变成参数步长的底层优化器;LoRA 则选择要适配的权重矩阵,并重新参数化它们的增量。
LoRA 冻结原始权重 W0,不直接学习完整的 ΔW,而是:
W_effective = W0 + (α/r)BA
rank(BA) ≤ r
训练时,loss 和反向传播仍然照常工作,只是梯度最终更新小矩阵 A 与 B。对一个 d×k 矩阵,这个增量的可训练参数量是 r(d+k);A 和 B 的方向也在训练中学习,并不是事先选定一组固定方向。
LoRA 原论文在 GPT-3 175B 的特定对比中,报告最高约 10,000 倍更少的可训练参数和约 3 倍更低的训练 GPU memory。这不表示基础模型缩小了 10,000 倍,也不表示推理计算自动少了 10,000 倍。
原论文在某些任务中观察到极小 rank 已有竞争力,同时明确说这不会对所有任务和数据成立。它关于 LoRA 可能放大预训练已学到、但没有被强调方向的分析很有启发性,不过仍是特定实验支持的机制假说。
关于 rank、矩阵方向和 PEFT 实操,站内已有更细的三篇:
放回本文主线,LoRA 的位置可以压缩成一句:
同一份任务误差信号仍然通过 loss 和梯度学习,只是在被选中的矩阵上,以秩不超过
r的矩阵增量留下持久痕迹。
9. 任务能力最后到底藏在哪里
到这里,我们知道权重怎样被改,却还不知道改变后的能力怎样编码。
目前研究能给出一些局部答案,但还没有一张覆盖现代 LLM 全部能力的“权重地图”。四类证据尤其值得放在一起看。
9.1 Superposition:特征和神经元不必一一对应
Toy Models of Superposition 研究的是用合成稀疏特征训练的小型 ReLU 网络。作者在这个可控环境中直接观察到:当特征很少同时激活时,模型可以让多个特征共享有限维度,以一定 interference 换取更大表示容量。
可以把它想成共享车道:如果不同车辆很少同时出现,多条路线可以共用有限道路;代价是偶尔互相干扰,非线性负责过滤部分小噪声。
这个结果能说明:
一个神经元可能参与多个特征
一个特征也可能分布在多个神经元上
特征可能更接近激活空间中的方向,而不是单个坐标
但它不能证明真实 LLM 的所有语义都按同一种几何方式存储。作者明确把真实网络中的推广程度留作开放问题。Toy setting 内的强机制证据,不能悄悄升级成对前沿模型的完整解释。
9.2 ROME:局部因果杠杆不等于知识存储格
ROME 研究事实关联。它先破坏输入中的主体信息,再恢复某层、某 token 位置的干净激活,观察正确答案概率能否恢复。这类 causal tracing 在 GPT-2 XL 等所研究模型里发现:主体最后一个 token 位置的中间层 MLP 计算,对事实输出非常关键。
接着,ROME 对目标 MLP 权重施加 rank-one 更新,能够定向改变一条事实关联。
这里很容易出现两个误读:
rank-one ≠ 只改一个标量权重
找到关键层 ≠ 事实只存放在这一层
Rank-one 是矩阵增量的秩为一,仍可能协调改变许多矩阵元素。Causal tracing 找到的是高杠杆因果位置,可能像供水系统里的关键阀门:调它能改变供水,不能因此说水储存在阀门里。
原始实验聚焦单条方向性事实编辑,因此不能据此推出可扩展的批量编辑或大规模训练能力;它也没有证明逻辑、空间、数值知识和程序性技能都能用相同方法修改。
因此,“分布式表示”和“局部可干预”并不矛盾:一项能力可以由许多参数共同表达,同时在计算过程中经过相对集中的中继或变换。
9.3 Induction heads:权重可以存一段可复用算法
In-context Learning and Induction Heads 研究一种模式延续电路:
[A][B] ... [A] → [B]
模型再次看到 A 时,回看前面相同模式,把上一次紧随其后的 B 带到当前预测。典型的两层小模型中,previous-token head 与后续 induction head 配合完成这条电路。
这里长期存在于权重中的,不是这一次具体的 A 和 B,而是“查找相同前缀,再复制后续项”的规则。具体查找哪个位置、复制什么内容,由当前 context 和 activations 决定。
论文在小型 attention-only 模型中有较强机制分析和消融证据:测试时移除这些 heads,会显著降低所测量的 in-context learning。带 MLP 的模型更难归因;对大模型,证据主要依赖相关性和从小模型外推,作者并没有声称所有 ICL 都已被 induction heads 解释。
9.4 激活值甚至可以运行一个“类梯度下降”学习器
Transformers Learn In-context by Gradient Descent 给出一个更激进但边界清晰的例子:在特定线性回归、输入编码和 linear self-attention 设置下,可以构造一个注意力层,使其前向计算等价于一步梯度下降;作者还在简单回归任务上发现,训练所得小型 Transformer 的前向行为或部分权重结构接近这种基于梯度的算法。
这里必须区分两类参数:
Transformer 自身 weights:推理时固定
回归任务的临时估计:由 activations 承载,随层更新
变化的是第二项。模型没有在 API 请求中调用反向传播,也没有重写自己的参数文件。
最有价值的结论不是“所有 LLM 都偷偷做 SGD”,而是一个存在性证明:
固定权重可以编码一套学习算法;上下文提供这次任务的样本,激活值保存算法运行时的临时状态。
该论文明确限制在小模型和简单回归任务,对自然语言大模型的推广仍是假说。Induction heads、类梯度下降和其他机制也可能同时存在。
10. 把四类机制合成一个更准确的答案
四类证据并不是四个互斥答案。Superposition 说明表示可以分布式共享维度;ROME 说明分布式系统仍可以有局部高杠杆节点;induction heads 显示权重可以编码可复用回路;类梯度下降的 ICL 例子则显示,固定权重的前向计算可以把本次任务状态放在 activations 中更新。
在 architecture 固定时,权重长期塑造模型能执行的计算;训练主要改变 weights,普通推理则以 context 为输入,产生并逐层更新本次 activations。
11. 工程上到底该训练,还是该写 Prompt、RAG、工具
理解训练机制的现实价值,是不要把所有问题都交给微调。
| 手段 | 是否持久改权重 | 最适合解决什么 | 主要代价或风险 |
|---|---|---|---|
| Prompt / context | 否 | 一次性指令、格式、少量示例 | 稳定性与 token 成本 |
| RAG | 否 | 新鲜、可更新、可溯源知识 | 检索质量与系统复杂度 |
| 工具 | 否 | 实时状态、确定性计算、外部动作 | 权限、失败恢复与审计 |
| SFT / LoRA | 是(LoRA 可只改 adapter,冻结 W0) | 稳定高频的任务模式、领域语言、格式与风格 | 数据偏差、遗忘、adapter 管理 |
| 偏好优化 | 是 | 回答排序、风格、安全边界 | 偏好偏差、过优化、评测敏感性 |
| 继续预训练 | 是 | 大规模领域分布与基础能力 | 数据、算力、污染与遗忘 |
一个实用判断法:
新鲜事实 → 通常优先 RAG,不要硬烙进权重
确定性计算 → 通常优先工具,不要让模型猜
一次性约束 → 通常优先 Prompt / context
稳定高频行为模式 → 有足够优质数据时再考虑 SFT / LoRA
相对回答偏好 → 可考虑偏好优化,并审查偏好数据代表谁
12. 我们已经知道什么,还不知道什么
已经知道得很清楚的部分:
- 前向计算、loss、反向传播和优化器怎样在数学上更新参数;
- SFT、经典 RLHF、DPO 和 LoRA 分别改变训练链的哪一环;
- 某些小模型回路和特定事实任务可以做因果干预;
- 普通推理通常不修改权重。
仍然没有完整答案的部分:
- 一个真实大模型里的抽象能力究竟由哪些特征和回路共同实现;
- 一项能力有多少来自预训练,有多少由后训练新学或重新路由;
- 小模型和合成任务中的机制能多大程度推广到前沿模型;
- 怎样在不损伤其他能力的情况下,可靠地定位和修改复杂技能。
所以更诚实的结论是:
我们非常懂“训练算法怎样改数字”,开始懂“一些数字怎样组成局部机制”,但还远没有完全懂“所有能力怎样组织成整台机器”。
论文索引
- Attention Is All You Need
- Adam: A Method for Stochastic Optimization
- Decoupled Weight Decay Regularization
- Scaling Laws for Neural Language Models
- Training Compute-Optimal Large Language Models
- Training Language Models to Follow Instructions with Human Feedback
- Direct Preference Optimization
- LoRA
- Toy Models of Superposition
- Locating and Editing Factual Associations in GPT
- In-context Learning and Induction Heads
- Transformers Learn In-context by Gradient Descent