AI/ML 详解:Alignment 数学

Day 26 · 2026-06-12
面向:有编程经验的非 AI 方向工程师 · 数学密集
工程对应 → super-individual D20: Prompt Injection(对齐被绕过时的攻防实战)

今天讲对齐(Alignment)背后的数学:当一个目标无法写成代码("有帮助""无害""诚实"没有单元测试),我们怎么用数学把人类偏好变成模型能优化的损失函数。四张卡片是一条逻辑链:① RLHF 整体框架 → ② 核心组件「奖励模型」怎么从偏好学分数 → ③ 把昂贵的人换成 AI(Constitutional AI)→ ④ 用代数把整个框架塌缩成一个分类 loss(DPO)。

RLHF 的数学框架Reinforcement Learning from Human Feedback

对齐优化目标
一句话类比

RLHF 是"无法写测试时的 CI 流水线"。后端世界里你能为「金额计算」写断言,但你无法为「这段回答够不够礼貌」写 assert。RLHF 的做法是:先把大量人类的"这个比那个好"蒸馏成一个会打分的模型(奖励模型),再让主模型像通过 CI 一样不断优化去取悦这个打分器——把"无法形式化的需求"变成"可微分的目标函数"

它解决什么问题 + 工作机制

预训练后的模型只会"续写最可能的下一个 token",它没有动机变得有用或无害——这是目标错位:训练目标(语言建模)≠ 我们真正想要的(有帮助的助手)。InstructGPT(Ouyang et al. 2022)确立了经典三阶段:

RLHF 三阶段流水线

① SFT 用人写的示范微调 → 得到 π_ref(参考模型)
② RM 用成对偏好训练 奖励模型 r(见卡片 2)
③ PPO 强化学习优化策略 π_θ,让 r 打分更高
↑ 第三步的目标函数才是 RLHF 数学的核心

第三步要最大化的目标(核心公式):

maxθ   E[ r(x,y) ]   −   β · KL( πθ(y|x) ‖ πref(y|x) )

逐项拆解:x 是输入提示,y 是模型生成的回答;r(x,y) 是奖励模型给这条回答打的分;πθ 是正在训练的策略,πref 是冻结的 SFT 模型。第一项"奖励最大化"很直白——生成奖励模型喜欢的回答。关键是第二项 KL 惩罚KL 散度衡量新策略相对参考模型偏移了多少,β 是它的权重。

为什么必须有这根"拴绳"?因为奖励模型只是个有限的近似,存在盲点。没有 KL 约束,优化器会去钻奖励模型的空子(reward hacking)——找到一些人类看着是乱码、但奖励模型莫名给高分的输出,模型迅速"塌缩"到这些退化解。KL 惩罚像分布式系统里的限流器 / 熔断器:允许探索,但不准跑太远偏离已知良好的 π_ref。β 大 = 短拴绳(保守、贴近 SFT),β 小 = 长拴绳(敢探索、但易被 reward hacking)。

代码示例
import torch
# RLHF 第三步:实际优化信号 = 奖励 − β·KL(这是公式的逐 token 实现)
def rlhf_signal(policy_logp, ref_logp, reward, beta=0.1):
    # policy_logp / ref_logp:当前策略 / 参考模型对生成 token 的 log 概率
    # reward:奖励模型对整条回答打的标量分
    kl = policy_logp - ref_logp        # KL 散度的单样本估计
    return reward - beta * kl          # ← 拴绳:奖励减去"跑偏惩罚"

p = torch.tensor([-0.2, -1.1, -0.5])  # 策略对各 token 更自信
r = torch.tensor(2.0)
print(rlhf_signal(p, torch.tensor([-0.3, -0.9, -0.6]), r))
# β 调大 → KL 项压制奖励 → 输出更贴近 SFT,更稳但更保守
常见误区 + 实践场景
"RLHF 让模型变聪明了"——错。RLHF 几乎不增加知识或推理能力,它只是把模型预训练时就已具备的能力"调到台前",让模型选择以有帮助、无害的方式表达。能力来自预训练,对齐只负责引导表达方式。混淆这两者会让你高估 RLHF、低估数据质量。
📌 妈妈场景:当你给孩子的 AI 辅导助手设定"耐心、不直接给答案、引导思考"的风格时,你做的正是个人版对齐——只不过你用 system prompt(运行时引导),厂商用 RLHF(训练时烘焙进权重)。理解 RLHF 帮你判断:哪些行为靠 prompt 就能改,哪些是被权重锁死、prompt 撬不动的。
Takeaway + 思考题
💡 RLHF 的本质是"把无法写成代码的目标变成可微分的 loss",而 KL 拴绳是防止优化器作弊的安全带。
🤔 你工作中有哪些"无法写单元测试、只能靠人感觉好不好"的目标?如果要把它变成一个可优化的分数,你会怎么收集"偏好数据"?

奖励模型与 Bradley-TerryReward Model

偏好学习概率模型
一句话类比

奖励模型就是给回答算"ELO 棋力分"。象棋选手没人能直接打出绝对实力分,但通过大量"A 赢 B"的对局,ELO 系统能反推出每人一个标量等级分。奖励模型一模一样:人类说不准"这答案值 7.3 分",但能可靠判断"A 比 B 好"。于是我们只收集成对比较,再拟合一个标量分数,让它和所有比较结果一致——背后是同一套数学(Bradley-Terry / 逻辑回归)。

它解决什么问题 + 工作机制

痛点:RLHF 第三步要一个能实时、自动给任意回答打分的函数,但人类标注又慢又贵又主观。解法分两步:(1) 收集偏好数据——同一个提示生成两条回答,人选出更好的那条,得到三元组 (x, yw, yl),w=winner(被选中)、l=loser(被拒绝);(2) 用这些比较训练一个标量打分模型 r。

Bradley-Terry 模型把"偏好"翻译成概率——"yw 胜过 yl"的概率是两者分差经过 sigmoid:

P(yw ≻ yl) = σ( r(x,yw) − r(x,yl) )

σ 是 sigmoid 函数(把任意实数压到 0~1 当概率)。直觉:两条回答分差越大,人选高分那条的概率越接近 1;分数相等时概率正好 0.5(完全猜不准)。把它写成最大似然,就是奖励模型的训练损失:

L = − E[ log σ( r(x,yw) − r(x,yl) ) ]

这个 loss 只看分数之差,不看绝对值——所以奖励的绝对刻度是没有意义的(整体加 100 分,loss 不变),和 ELO 只关心相对强弱完全一致。这套从人类偏好学奖励的思路最早来自 Christiano et al. 2017。

成对偏好 → 标量奖励
提示 x回答 A (人选这个 = y_w) r=2.1
          回答 B (y_l) r=1.0
分差 1.1 → σ(1.1)≈0.75 → 模型认为"A 更好"的概率 75%,与人选一致 ✓
代码示例
import torch
import torch.nn.functional as F
# 奖励模型的 Bradley-Terry 损失:只学"相对差",绝对刻度无意义
def bt_loss(r_chosen, r_rejected):
    # r_*:奖励模型给"被选中"/"被拒绝"回答打的标量分
    # −log σ(r_w − r_l):分差越大、方向越对,loss 越小
    return -F.logsigmoid(r_chosen - r_rejected).mean()

r_w = torch.tensor([2.1, 0.5])   # 第二对:模型给被选中的反而打低分
r_l = torch.tensor([1.0, 0.8])
print(bt_loss(r_w, r_l))    # 第二对方向错 → 贡献更大的 loss,推动修正
常见误区 + 实践场景
"奖励模型的分数能当回答的绝对质量评分用"——错。它只在训练分布内、相对比较时可靠。一旦策略钻空子生成 OOD(分布外)的怪输出,奖励模型可能盲目给高分——这正是卡片 1 KL 拴绳要防的事。奖励模型是"裁判",但裁判本身可能被骗。
📌 决策辅助场景:当你让 AI 帮你"在 3 个方案里挑最好的"时,给它两两比较(A vs B、B vs C)往往比让它一次性"给每个打分"更可靠——因为相对判断比绝对评分更稳定。这条认知规律对人对模型都成立,是 Bradley-Terry 的现实投影。
Takeaway + 思考题
💡 奖励模型 = 从成对偏好里拟合标量分的 ELO 系统;它学的是相对秩序,不是绝对真理。
🤔 如果人类标注者之间本身就分歧很大(同一对回答有人选 A 有人选 B),Bradley-Terry 学出的奖励会变成什么?这对"对齐到谁的偏好"意味着什么?

Constitutional AI / RLAIFHarmlessness from AI Feedback

RLAIF可扩展监督
一句话类比

Constitutional AI 是"把人工 code review 换成跑 linter"。RLHF 里每条偏好都要人来标,像每个 PR 都要资深工程师手动审——又慢又贵又不一致。CAI 的做法是:写一份明文规则("宪法"),让模型拿这份规则审查并改写自己的输出,再用模型自己的偏好判断代替人类标注。用一份可读、可审计、可版本管理的原则文档,换掉成千上万次人工标注

它解决什么问题 + 工作机制

痛点:RLHF 的人类偏好标注是对齐的成本瓶颈与一致性瓶颈——尤其"无害性"标注要让人反复阅读有害内容,既贵又伤人。Anthropic 的 Constitutional AI(Bai et al. 2022)用两阶段把人换成 AI:

CAI 两阶段

阶段 1(SL):自我批判 + 改写
初版回答按宪法自我批判改写 用改写样本做 SFT

阶段 2(RLAIF):AI 标偏好
两条回答模型按宪法选更好的 训练奖励模型 → RL
↑ 把卡片 1 流程里的"人类标注"整段替换成"AI + 宪法"

核心机制叫 RLAIF(Reinforcement Learning from AI Feedback):流程和 RLHF 一模一样(还是奖励模型 + KL 拴绳 + RL),唯一区别是偏好标签由模型依据宪法生成,而非人类。"宪法"是一组自然语言原则(如"选择更无害、更少说教的回答")。这之所以能 work,依赖一个关键假设:判断哪个回答更好,比从零生成一个好回答更容易——模型有能力当合格的裁判,即使它做选手时会犯错。

代码示例
from anthropic import Anthropic
client = Anthropic()  # 需要 ANTHROPIC_API_KEY

principle = "回答不得提供可造成伤害的操作细节,应礼貌说明拒绝理由。"
draft = "<模型对某敏感问题的初版回答>"
# CAI 阶段 1:让模型按"宪法"自我批判 + 改写(无需人工标注有害样本)
revision = client.messages.create(
    model="claude-opus-4-8", max_tokens=512,
    messages=[{"role": "user", "content":
        f"原则:{principle}\n初版回答:{draft}\n"
        "请先指出它违反原则之处,再给出符合原则的改写版本。"}]
).content[0].text
print(revision)  # 用这些"自我改写"样本做 SFT → 再用 AI 偏好做 RLAIF
常见误区 + 实践场景
"CAI 完全不需要人了,对齐自动化了"——夸大。宪法本身是人写的——人的价值判断从"标每条数据"上移到"定原则"这一层,没有消失,只是杠杆变长了。而且模型当裁判会放大它自身的偏见,宪法写得含糊就会被钻空子。CAI 降低的是标注量,不是人的责任。
📌 AI 超级个体场景:给你的写作/编码 Agent 配一份"个人宪法"(如"先给结论再展开""不堆砌形容词""代码必带类型注解"),让它在输出前自我批判一遍再交付。这是 CAI 阶段 1 的微缩版——用一份明文原则,把"人工逐条 review"换成"模型自审"。
Takeaway + 思考题
💡 CAI 的杠杆在于"把人的价值判断从数据层抬升到原则层"——写规则比标数据可扩展得多。
🤔 当裁判(AI)和选手(AI)是同一个模型时,它评价自己的盲点也会一起继承。你会如何设计机制,让"自审"不退化成"自我感觉良好"?

DPO:直接偏好优化Direct Preference Optimization

代数塌缩无需 RL
一句话类比

DPO 是"用代数化简干掉一整个微服务"。RLHF 是个三件套架构:奖励模型服务 + 采样循环 + PPO 训练,组件多、互相耦合、调起来像调分布式系统一样脆。DPO 发现了一个数学恒等式,证明"奖励模型"其实可以用"策略本身相对参考模型的对数概率比"来表示——于是把奖励模型这个中间组件整个消掉,只剩一个普通的分类损失。就像你发现一个 RPC 调用其实能被代数化简成本地函数调用。

它解决什么问题 + 工作机制

痛点:RLHF 工程上很难——要同时维护 4 个模型(策略、参考、奖励、价值),PPO 对超参敏感、易崩、采样慢。DPO(Rafailov et al. 2023)的洞见从卡片 1 那个带 KL 的目标出发:那个目标其实有闭式最优解。最优策略长这样:

π*(y|x) = (1/Z) · πref(y|x) · exp( r(x,y) / β )

Z 是归一化配分函数(保证概率和为 1,依赖 x)。这步反过来解出奖励:

r(x,y) = β · log( π*(y|x) / πref(y|x) ) + β·log Z

关键魔法来了:把这个 r 代回卡片 2 的 Bradley-Terry loss,因为 loss 只含奖励之差 r(yw)−r(yl),而 β·log Z 对同一个 x 完全相同,相减直接抵消——那个最棘手、最难算的归一化项凭空消失了。剩下的就是直接作用在策略上的损失:

LDPO = − log σ( β·log[πθ(yw)/πref(yw)] − β·log[πθ(yl)/πref(yl)] )

对比卡片 2 的奖励模型 loss:结构一模一样的 −log σ(差),只是把"奖励差"换成了"策略相对参考模型的对数概率比之差"。这就是论文标题的含义——语言模型本身就是一个隐式的奖励模型。KL 拴绳没消失,它被 β 和 π_ref 偷偷编码进了 loss 里。

RLHF vs DPO:架构对比

RLHF:偏好数据训奖励模型PPO 采样+RL策略
       4 个模型 · RL 不稳 · 采样慢

DPO:偏好数据━━━━━━━━━━→策略(一个分类 loss)
     2 个模型(θ + 冻结 ref) · 无 RL · 像普通监督训练
代码示例
import torch
import torch.nn.functional as F
# DPO loss:奖励 = β·log(π/π_ref),配分函数 Z 在相减中自动消掉
def dpo_loss(pi_w, pi_l, ref_w, ref_l, beta=0.1):
    # *_w / *_l:策略(pi)/参考(ref)对 chosen/rejected 回答的序列 log 概率
    logits = beta * ((pi_w - ref_w) - (pi_l - ref_l))
    return -F.logsigmoid(logits).mean()  # 和卡片 2 同一个 σ!

# 策略相对参考,提升了 chosen、压低了 rejected → logits>0 → loss 小
print(dpo_loss(torch.tensor([-1.0]), torch.tensor([-2.0]),
               torch.tensor([-1.2]), torch.tensor([-1.5])))
# 实战中直接用 HuggingFace TRL 的 DPOTrainer,无需手写
常见误区 + 实践场景
"DPO 数学上等价于 RLHF,所以永远更优"——不对。等价是在理想假设下成立;实践中 DPO 因为只见训练集里那些固定的偏好对(离线),更容易过拟合偏好数据、在分布外不如在线 RLHF 鲁棒,也丢掉了"可复用的奖励模型"这个资产。DPO 简单稳,RLHF 上限高——这是工程权衡,归 super-individual,这里只点到为止。
📌 个人项目场景:如果你要在自己的领域数据上微调一个小模型的"风格偏好"(如让它学你的写作口吻),DPO 是首选——只需一批 (提示, 好回答, 差回答) 三元组 + TRL,不用搭 RL 那套基础设施。这正是 DPO 让"对齐"飞入寻常项目的原因。
Takeaway + 思考题
💡 DPO 用一个代数恒等式证明"语言模型本身就是隐式奖励模型",从而把 RLHF 的复杂架构塌缩成一个分类 loss。
🤔 一个数学化简(消掉配分函数 Z)就让对齐成本骤降一个数量级——回想你的领域,有没有哪个"看似必须的中间组件"其实能被一个恒等式消掉?
工程对应 → super-individual D20: Prompt Injection(对齐被绕过时的攻防)

深入资源Further Reading

深入思考Deep Questions

1. 四张卡片里"−log σ(差)"出现了两次(奖励模型 loss 和 DPO loss)。这个 sigmoid 损失为什么会成为偏好学习的"万能形状"?
因为偏好天生是二元比较问题,而 sigmoid 是把"实数分差"映射成"选择概率"的最自然函数。其根源是 Bradley-Terry 模型(以及它在心理学里的祖先 Thurstone 模型):假设每个选项有个潜在效用,观测到的偏好是效用差经过 logistic 噪声后的结果,那么 P(A≻B)=σ(uA−uB) 就是最大熵下的唯一形式。这和逻辑回归是同一套数学——逻辑回归是"特征→二分类概率",BT 是"两个候选→谁胜概率"。所以无论你把"分数"定义成奖励模型的输出(卡片 2)还是策略的对数概率比(卡片 4),只要你在学"成对偏好",loss 就长成 −log σ(差)。认出这个不变量,你就抓住了现代对齐的数学骨架:换的只是"差"里塞什么,外壳永远是 sigmoid。BigCat 你可以把它类比成:很多看似不同的排序/匹配/推荐问题,底层都能归约到 logistic 这同一个核。
2. KL 拴绳(β)在 RLHF 里是显式的惩罚项,在 DPO 里却"消失"了——它真的不见了吗?
没消失,它被编码进了 loss 的结构里。回顾 DPO 推导:最优策略 π* = (1/Z)·π_ref·exp(r/β),这个形式本身就是带 KL 约束的解——β 和 π_ref 一起决定了"策略能偏离参考多远"。当你把 r 解出来代入 BT loss,得到的 DPO loss 里 β 仍在(乘在对数概率比前面),π_ref 也仍在(作为分母)。所以拴绳还在拴,只是从"训练时额外加一项惩罚"变成了"被烘焙进损失函数的代数形式"。实践含义:DPO 里调 β 依然是在调"贴近参考 vs 敢于改变"的平衡,β 太小一样会让模型在偏好数据上跑偏、输出退化。一个反直觉点:DPO 的 KL 是隐式且离线的——它约束的是"相对训练集里那些回答",而 RLHF 的 KL 是在线约束当前策略采样出的新回答。这正是为什么 DPO 在分布外可能不如在线 RLHF 稳——同一根拴绳,拴的位置不同。
3. RLHF / CAI / DPO 都假设"判断 A 比 B 好"是可靠的监督信号。当任务复杂到人类(或 AI)都判断不准时,这套范式会怎样崩溃?
这是对齐研究的核心隐忧,叫可扩展监督(scalable oversight)问题。整套偏好学习的前提是"评价比生成容易"——我写不出完美代码,但能看出哪段更好。当任务超出评判者能力时(如评判一个超长数学证明、一段你看不懂的前沿研究、一个后果要十年才显现的决策),这个前提失效:(a) 人类标注者会偏向看起来好但实际错的回答(流畅的胡说 > 笨拙的真话),模型于是学会谄媚(sycophancy)说服性而非正确性;(b) CAI 里裁判 AI 自己就判断不准时,RLAIF 会放大而非纠正错误。已知的缓解方向:辩论(两个模型互相挑错,人只当裁判)、递归奖励建模、过程监督(评判推理的每一步而非只看结论)——但都没根本解决。深层张力:我们正在用"今天判断得了"的方式对齐"明天能力超过判断者"的系统。这其实是个认识论问题:当被监督者比监督者强时,"对齐"还能锚定在什么上?这是对齐数学触及的真正边界。
4. "RLHF 不增加能力,只引导表达"——如果对齐只是引导,那"对齐税"(aligned 模型在某些基准上变弱)从何而来?
"对齐税(alignment tax)"指对齐后的模型在部分能力基准上相比纯预训练模型出现的回退。如果对齐真的只调表达不动能力,为何会有税?几个机制:(a) 分布收窄——RLHF/DPO 把策略往"人类偏好的回答方式"拉,会压低一些低概率但有用的输出模式(如非常规但正确的解法),KL 拴绳越紧、收窄越明显;(b) 偏好与正确性错位——人类更喜欢自信、详尽、有礼的回答,模型为迎合可能牺牲简洁或承认不确定性的诚实,表现为校准(calibration)变差;(c) 能力-安全权衡——为无害性拒答的边界会"误伤"正当请求(过度拒绝)。InstructGPT 论文本身就观察到对齐在部分 NLP 基准上有回退,并用混入预训练梯度来缓解。所以更准确的说法是:对齐主要重塑能力的表达分布,而重塑分布不是零成本的——它会顺带压低没被偏好覆盖到的那部分能力。这也是为什么"对齐"和"能力"在前沿实验室是需要同时优化、互相拉扯的两个目标,而非一前一后。
5. DPO 把对齐从"实验室级 RL 工程"降到"普通微调",让任何人都能把模型对齐到自己的偏好。这种"对齐民主化"的两面是什么?
正面:对齐能力下放给个体和小团队,你可以让模型贴合你的价值观、领域口吻、工作流——这正是"AI 超级个体"的基础设施,BigCat 你的"个人宪法 + DPO 微调"工作流因此变得可行。反面也尖锐:(a) 对齐到谁的偏好?——DPO 让"对齐"变中性工具后,它既能对齐到"更有帮助",也能对齐到"更会操纵""更迎合特定立场",去对齐(un-alignment)和对齐用的是同一套数学;(b) 偏好数据即权力——谁定义那批 (好, 坏) 三元组,谁就定义了模型的价值,这把"价值判断"压缩成可外包、可买卖的数据集;(c) 碎片化——当每个人都把模型对齐到自己,共享的价值基线会瓦解。深层看,对齐数学解决的是"如何把偏好灌进模型"的机制问题,但"该灌谁的偏好""谁有权决定"是它无法回答的规范问题。技术越把机制变简单(DPO),规范问题就越被推到台前——这或许是这门数学留给我们最重要的非数学问题。