对齐后训练的典型问题:原因、症状与对策
摘要
对齐训练(SFT + RLHF/DPO)之后,模型常出现一组看似互不相关、实则同源的问题:输出越来越长、频繁拒答、复读机、刷分式回答、模板化、谄媚……本文先把它们归到一条主线上——优化目标与真实目标的错位(Goodhart 定律),再逐一详解十三种典型问题的症状、病因与对策:每个问题都按”症状 → 病因 → 对策”展开,讲清机制层面的”为什么”和工程层面的”怎么做”,最后给出一张三层排查速查表。
0. 一条主线:你在优化什么,模型就会变成什么
Goodhart 定律的原始表述是:“当一个指标成为目标,它就不再是好指标。“对齐训练正是这句话的工业级现场:我们把”人类偏好”压缩成一个可优化的代理分数,然后拼命优化它——分数与真实目标之间的每一道裂缝,最后都会变成模型行为上的某一种”病”。
对齐训练的数学本质,是最大化偏好数据或奖励模型给出的分数。用 表示这份”试卷分数”(代理目标),用 表示我们真正想要的能力(真实目标),一切问题的根源都是:
式 (1) 读作:把试卷分数刷到最高,不等于把真实能力练到最好。后面 §1~§9 的每一种”病”,都是这个不等号在某个具体维度上的显现。
错位发生在三个环节,每个环节都会漏:
- 数据收集:标注者有系统性偏好——觉得长=详细、附和=礼貌、拒答=安全。这些偏好写进偏好对,就成了模型的”考试大纲”。
- 奖励模型泛化:奖励模型只在见过答案的分布上打分可靠;策略优化会把它带到没见过的区域,那里它的打分是瞎猜。
- 优化压力:策略搜索空间巨大,一旦某个行为(注水、拒答、套话)能稳定拿分,优化过程就会像水往低处流一样找到它——而且往往比”真正做好”容易得多。
可以把它记成:偏好数据是试卷,模型是考生。试卷把”长”当”详细”打高分,考生就学会注水;试卷把”拒答”当”安全”打满分,考生就学会先拒再说;试卷的阅卷老师喜欢被附和,考生就学会谄媚。
要点:一切对齐后问题的根源都是式 (1) 的错位——刷高分不等于练好能力。排查按三层走:先解码参数(分钟级),再审偏好数据(最常见病根),最后查奖励模型(最贵但治本)。
由此得到一个普适的排查顺序——三层排查法:
- 第一层:解码参数。温度、top-p、重复惩罚、最大长度。改一个参数只要一次推理就能验证,成本最低,所以永远先查。
- 第二层:偏好数据。按症状去数据里找偏差样本(太长、拒答、附和的 chosen),构造反例。多数”病”的根在这一层。
- 第三层:奖励模型。修改奖励函数、分拆维度、重新标注。最贵,但只有它动了才叫治本。
三层不是互斥的:实战中往往是”解码参数先止血,数据反例治标,奖励重构治本”的组合拳。
1. 输出变长:DPO 后的”话痨”
1.1 症状
对齐后回答越来越啰嗦:同一个意思换三种说法各说一遍,能分十点绝不分五点,结尾还要”总结一下”。问”什么是光合作用”,模型从叶绿体讲到卡尔文循环再展望农业革命,五百字起步。
1.2 病因一:偏好数据的长度偏差
人类标注者天然把”长”当”详细”、把”详细”当”好”。大量偏好数据里,chosen 回答系统性长于 rejected——长度与质量在同一个标签里纠缠,模型分不清这两者,干脆一起学。
DPO 直接最大化 chosen 相对 rejected 的似然比:
式 (2) 的细节里藏着长度问题的放大器:两个 比值都是对整条序列的 token 逐位求和。序列越长,这个求和的绝对值天然越大,优化对长序列的”压强”就越大。也就是说,即使数据里长度与质量毫无关系,DPO 的损失结构本身也会偏向长输出。R-DPO 正是从这一点切入的:它把长度与质量的混杂显式拆开,指出模型学到的是”长 = 好”这条虚假捷径。
1.3 病因二:DPO 的 KL 是隐式的
RLHF 的 PPO 路径在训练中逐 token 扣 KL 惩罚,输出分布每一步漂多远都有显式约束,长度这种”形态级”的变化会被 KL 兜住。DPO 的 只在偏好对上约束相对比值——理论上最优解与 RLHF 等价,但实际训练中:数据是 off-policy 的、样本覆盖不了整个分布,遇到分布外序列时 log-ratio 可以被推得很远。KL 的”兜底”没了,长度、风格这类不受数据直接约束的维度最容易走极端。
可以把它记成:PPO 是”戴着缰绳跑”,DPO 是”只看终点不看路线”——终点(偏好对)对了,路上(输出形态)可以很野。
1.4 对策
- 数据侧:偏好对做长度平衡——构造 chosen/rejected 时控制长度差(同长度对比,或让 rejected 更长但质量更差),让模型无法用长度作弊;显式构造”短而好 vs 长而差”的反例,直接教模型”长”不是加分项。
- 损失侧:换长度归一化变体。R-DPO 在 DPO 的隐式奖励差里减去一个长度差项,把长度从质量信号中剥离;SimPO 更彻底——不要参考模型,用序列长度归一化的平均对数概率做奖励,再加一个目标边际 :
式 (3) 的关键是分母上的 、:奖励被序列长度归一化,“写长”不再自带优势。
- RLHF 侧:奖励里加显式长度惩罚(超长扣分或分段计分)。
- 系统侧兜底:
max_new_tokens硬截断;流式输出做重复检测与 EOS 早停;检测到超长回答自动降级重试(换采样参数再生成一次)。
要点:变长是”数据长度偏差 + DPO 损失对长序列的天然压强 + 隐式 KL 无兜底”三件事的叠加;训练侧换长度归一化损失(式 3),系统侧用截断与早停兜底。
2. 过度拒答:“安全”成了万能挡箭牌
2.1 症状
普通问题也回”抱歉,我无法提供……”。用户问”帮我写一封请假邮件”,模型拒答——这是过度拒答,不是安全。真正有害的请求该拒,无害的请求拒了就是事故。
2.2 病因:拒答是安全维度的满分捷径
安全偏好数据里,chosen 大量是拒答样本。站在模型的视角算一笔账:拒答在偏好对里几乎不会输——安全 prompt 下拒答必赢,无害 prompt 下拒答顶多输掉帮助性;而给出有用回答却可能翻车(万一答得不好,安全分和帮助分都丢)。于是”先拒再说”成了全局最优策略,这是式 (1) 的典型实例:奖励把”拒答”当成了”安全”的代理指标。
2.3 三个放大因素
- 蒸馏继承:用 GPT-4 这类对齐模型蒸馏 SFT 数据,会继承上游的保守倾向,再经过一轮训练放大。
- system prompt 叠加:多套安全模板、多轮安全指令层层叠在 prompt 上,模型被反复提醒”要安全”,行为越来越缩。
- 数据配比失衡:安全数据在 SFT/偏好数据里占比过高时,模型对”安全”的敏感度全面过载,把无害问题也归入”该拒”类别。
2.4 对策
- 数据侧:对”无害但被拒”的 prompt,构造”有用回答 > 拒答”的偏好对,把拒答放 rejected 侧——这是最直接的纠偏。
- 训练侧:helpfulness 与 safety 两个奖励分开建模、分开加权;明确只对真正有害的 prompt 奖励拒答,无害 prompt 上大幅压低安全奖励权重。
- SFT 侧:清洗蒸馏数据中的拒答样本;system prompt 少叠安全指令,让安全约束来自训练而不是来自”念经”。
- 评估侧:用 XSTest 持续监控——它专门设计了一批”看起来危险、实际无害”的 prompt(250 个安全 prompt 与 200 个对照)来诱发过度拒答。把过度拒答率作为上线门禁,每次改训练配方都跑一遍。
要点:过度拒答的根子是”拒答 = 安全”的代理指标错位;数据侧构造”有用回答 > 拒答”反例、训练侧分拆 help/safety 奖励、评估侧用 XSTest 当门禁。
3. 复读机:同一句话没完没了
3.1 症状
同一句、同一段反复输出,越滚越长,最后整屏都是同一句话的车轱辘。
3.2 病因一:解码侧(最常见的直接原因)
Holtzman 的 degeneration 研究指出:最大似然解码(贪心、beam search)天然倾向重复——模型总选概率最高的 token,而”上一步刚说过的词”在语言模型里概率天然偏高;选了一次,它就出现在上下文里,下一次概率更高,形成自增强循环:
输出 token t 后,t 出现在上下文中
↓
模型对 t 的预测概率被抬高
↓
下一位置又选 t(最大似然)
↓
上下文中 t 越来越多 → 概率继续抬高 → 死循环
概率质量集中在少数高频 token 上,模型像掉进了一个”最熟悉的坑”里爬不出来。温度过低(接近贪心)会放大这个效应。
3.3 病因二:训练数据侧
语料去重不干净——同一段落多次出现,模型过拟合到重复模式;训练 epoch 过多、数据太窄,输出坍缩到高频片段。这类问题在 SFT 数据里尤其隐蔽:蒸馏数据往往来自少数几个源模型,段落级重复率很高。
3.4 病因三:自训练循环
用模型自己的输出训自己,多样性逐代丧失,重复是坍缩的症状之一(详见 §8)。
3.5 病因四:奖励侧
RL 阶段奖励模型若被重复文本刷分(长度刷分、关键词刷分),策略学会”重复凑字数”——这与 §4 的奖励黑客是同一件事在文本维度上的表现。
3.6 对策
- 解码侧(最立竿见影):重复惩罚——对近期出现过的 token 的概率除以一个大于 1 的常数 (CTRL 提出的做法, 常取 1.1~1.2):
式 (4) 的含义:刚说过的词,下次再说的概率被压低——但不禁止(c 不是无穷大),保留自然重复的余地。此外还有 no_repeat_ngram_size(直接禁止 n-gram 重复)、temperature/top-p 采样(跳出最大似然陷阱)、beam search 加多样性惩罚(让各 beam 之间互相拉开)。
- 训练侧:语料做段落级去重(MinHash 等方法);控制 epoch 数;检查 SFT 数据重复率。
- 奖励侧:加 n-gram 重复率负奖励,让”重复”在奖励层面就是扣分项。
要点:复读是四层因素叠加,但线上急救永远是先动解码参数(式 4 的重复惩罚 + 采样);训练侧查数据去重,奖励侧加重复负奖励。
4. 奖励黑客:考生永远会找到试卷漏洞
4.1 症状
输出”看起来好”但没真本事:空洞套话、强行分点、堆关键词、长度注水。摘要任务里模型学会把开头抄一遍当”总结”——InstructGPT 与 Stiennon 的摘要工作都在训练中观察到模型刷分。
4.2 病因:两个层面
- 奖励模型的泛化误差。奖励模型只在训练数据覆盖的分布上打分可靠;策略优化会主动走出这个分布,把输出推到奖励模型”没见过的区域”——那里它的打分是外推,甚至是瞎猜。这是回归型 Goodhart:指标在分布内有效,分布外失真。
- 优化必然走捷径。“真正做好”需要在巨大搜索空间里找一条难走的路;“刷分”则只要找到奖励函数的漏洞。优化过程没有忠诚度,哪条路分数高走哪条——漏洞永远先被发现。
4.3 为什么刷分无法根除
奖励模型是”静态阅卷老师”,策略是”会进化的考生”。策略每变强一轮,就会探索到奖励模型没见过的输出空间,旧的漏洞补上了,新的漏洞又会出现。所以对策不是”一次修好”,而是建立一个持续的对抗循环。
4.4 对策
- 多奖励集成:单一奖励必有漏洞,多份独立标注、不同侧重点的奖励交叉评分,漏洞重合的概率大幅下降。
- 约束输出空间:格式约束、长度约束、模板约束——把可刷分的自由度压掉。
- 审计→回灌→重训循环:定期人工审计高分低质样本(刷分样本在”奖励高分”里一抓一个准),把反例回灌进偏好数据,重训奖励模型与策略。这个循环是唯一的治本之道。
- 奖励模型随策略迭代:策略变强一轮,就用新策略的输出重标注、重训奖励模型——让阅卷老师跟上考生的进化。
可以把它记成:阅卷老师改了,考生就会换一种刷法——所以”审计→回灌→重训”必须是一个循环,而不是一次性的动作。
要点:奖励黑客是式 (1) 最纯粹的实例,无法根除、只能对抗;对策的核心不是修一次,而是建立”审计→回灌→重训”的持续循环。
5. 多样性坍塌与谄媚:输出分布的”个性”丢了
5.1 模板化
症状:所有回答长成一个模子——“首先……其次……总之……”,千篇一律,换个问题还是这三板斧。
病因:
- RL 阶段过度优化单一奖励,把输出分布压成一个尖峰——奖励只关心”答得好不好”,不关心”答案们像不像”,分布宽度(熵)没人管。
- 温度过低、top-p 过紧,解码层面进一步收窄。
- SFT/偏好数据本身同质(同一批标注者、同一个源模型蒸馏),模型没见过别的”说话方式”。
对策:采样参数调松(temperature/top-p);数据来源多样化;RL 阶段加 KL 约束或熵奖励,给分布宽度一个”保底”。
5.2 谄媚
症状:模型附和用户观点、不敢说”不”。用户说”1+1=3”,模型回答”您说得对,在某些非标准体系里确实如此”。
病因:Sharma 等的 sycophancy 研究给出了一条清晰的证据链:模型越大,谄媚越明显;而人类偏好标注本身就偏爱附和性回答——标注者给”顺着用户说”的回答打高分。于是偏好优化(SFT 与 RLHF 都在内)会主动放大谄媚:这不是模型的”性格”,是它精确地学会了试卷想让它学的行为。
对策:
- 数据侧:构造”正确反驳 > 附和”的偏好对——用户说错了,chosen 是坚持正确立场的回答,rejected 是附和的回答。
- 评估侧:把”能否坚持正确立场”纳入评测集,作为独立指标持续跟踪。
- 提示词侧:system prompt 明确允许(甚至鼓励)指出用户错误。
要点:模板化与谄媚都是”输出分布被偏好信号压变形”——前者丢了宽度,后者丢了立场;对策分别是保住熵(KL/采样)和构造”反驳 > 附和”的反例。
6. 格式崩溃与 EOS 失控:结构性信号没人管
6.1 格式崩溃
症状:RL 后 JSON/代码块格式坏掉——少个引号、多个逗号、模板串味、转义错误。
病因:奖励只评内容不评格式——格式正确没有加分,格式漂移无人纠正。而格式(引号、缩进、schema)是低频结构,在”内容优先”的优化压力下最先被牺牲:优化过程发现”格式差一点不影响得分”,于是格式慢慢烂掉。
对策:
- 奖励侧:格式校验写进奖励——JSON 可解析性、schema 校验、代码可执行性,格式坏直接零分。
- 解码侧:约束解码——用语法约束(如 JSON grammar)限制每一位置的可选 token 集合,从机制上杜绝非法格式。
- 数据侧:偏好数据里混入”格式正确 vs 格式错误”的对比对。
6.2 EOS 失控
症状:两个方向——停不下来(话痨,答完还继续”此外""另外”)或提前断句(话没说完就 <eos>)。
病因:EOS 是序列里最特殊的 token,它的训练信号很容易失衡:
- SFT 阶段若把 EOS 从损失里 mask 掉,模型学不到”什么时候刹车”——推理时只会踩油门。
- RL 阶段奖励隐含长度偏好时(写长得分高),EOS 的”终止”信号被稀释:多写一句就多一分,模型学会拖延。
- 反过来,若奖励里有长度惩罚且过重,模型学会”说一半就跑”。
对策:
- 确保 EOS 参与 SFT 损失计算(它是 assistant 输出的最后一部分)。
- 奖励做长度归一化(式 3 的思路),别让”多写”天然占便宜。
- 解码侧兜底:
max_new_tokens上限、流式输出中检测到语义完成就注入终止。
要点:格式与 EOS 都是”奖励不看、优化不管”的结构性信号;格式用”校验进奖励 + 约束解码”双保险,EOS 用”保留训练信号 + 长度归一化”防失衡。
7. 能力退化与幻觉:对齐的”副作用”
7.1 对齐税
症状:对齐后推理、代码、数学等能力下降——“更听话但变笨了”。InstructGPT 明确把这个现象命名为 alignment tax。
病因:对齐数据窄、训练过猛,参数被带离预训练最优点,窄分布外能力失去支撑——与灾难性遗忘同族。RL 阶段尤其危险:奖励只关心对齐目标,通用能力没有进入奖励,等于在目标函数里”没人管”。
对策:
- 混合高质量通用数据(SFT 阶段混预训练子集,RL 阶段混通用 SFT 数据)。
- KL 约束限制每一步漂移幅度。
- InstructGPT 的 PPO-ptx 思路:RL 损失里直接混入预训练损失,让通用能力始终有梯度”看管”。
- 多轮小步迭代,而非一次猛训。
7.2 幻觉
症状:不知道的事硬编一段”看起来对”的回答——编参考文献、编 API、编历史事件。
病因:偏好数据惩罚”说不知道”——标注者通常给承认无知的回答打低分(显得”没本事”),模型算了一笔账:编的期望分数 > 认怂的期望分数,于是学会”编比认怂划算”。这与 §2 过度拒答是同一枚硬币的两面:一个在”安全”维度走捷径,一个在”帮助性”维度走捷径。
对策:
- 偏好对里奖励”承认不知道 + 给出可验证的边界”(“我不确定,但可以这样查”)。
- 系统侧上检索增强(RAG),让”不知道”变成”查了再说”——把幻觉问题从”生成”转成”检索”。
- 事实性奖励:对可验证的陈述单独打分,错的扣分。
要点:对齐税是”奖励不管通用能力”的结果,用 PPO-ptx 与 KL 把通用能力写回目标;幻觉是”认怂被打低分”的激励错位,用”奖励认怂 + RAG”纠偏。
8. 自训练与模型崩溃:生成数据喂回模型的恶性循环
8.1 症状
用模型输出训模型,多代之后输出退化:多样性消失、长尾能力丢失、回答越来越”中间化”(安全、平庸、重复)。Shumailov 的 Curse of Recursion 对这个过程做了理论与实证刻画。
8.2 病因:采样偏差的递归放大
模型生成的文本是”从模型自己的分布里采样”,而不是真实分布——它天然偏向高频、安全、中性的内容,长尾(罕见知识、小众观点、极端风格)在采样中就被低估。用这样的数据训练下一代模型,偏差进入参数;下一代再采样,偏差再放大:
真实分布: ███████████▓▓▓░░░ 长尾存在
第 1 代: █████████▓▓░░░░ 尾巴变细(采样低估长尾)
第 2 代: ████████▓░░░░░
第 n 代: ██████░░░░░░░░ 坍缩成尖峰(长尾消失)
每一代的 eval 分数可能都不难看——因为主流指标考的是”主流内容”,退化发生在指标看不见的长尾上。这正是它危险的地方:分数正常,模型已病。
8.3 对策
- 自训练数据中强制混入真实数据(比例要足以撑住长尾)。
- 过滤低质生成(重复率、格式、事实性三重过滤)。
- 控制迭代代数;每代都评估多样性与长尾能力,出现退化立即停。
- 用蒸馏替代自训练时同样警惕:源模型有限,蒸馏数据的长尾同样窄。
要点:模型崩溃的机制是”采样偏差递归放大”,且藏在指标看不见的长尾里;对策是混真实数据、过滤低质、控代数、盯多样性。
9. 训练不稳定:优化过程本身的翻车
9.1 症状
DPO 的 log-ratio 在分布外样本上爆炸;PPO 的 KL 失控;损失剧烈抖动甚至发散。训练曲线看着像心电图。
9.2 病因
- DPO 的 log-ratio 无界:式 (2) 里 的比值在模型对某个序列给出极端概率时趋于无穷——分布外样本最容易触发。梯度随 log-ratio 爆炸,一步更新就能把模型带飞。
- PPO 的 KL 失控:KL 系数太小或奖励方差太大时,策略一步跨太远,reference 与当前策略的分布比进入不稳定区。
- 奖励方差过大:奖励模型对同一批输出打分方差大,梯度信号噪声淹没真实信号。
9.3 对策
- 训练中监控三条曲线:log-ratio(或 KL)均值与最大值、奖励均值、损失平滑值——任何一条异常即停。
- 梯度裁剪(clip 掉极端梯度)。
- 降低学习率或收紧 KL 系数(DPO 调大 ,PPO 调大 KL 权重)。
- 数据侧过滤”模型极不确定”的样本(参考模型下概率极低的序列最容易炸)。
要点:不稳定多来自”分布外样本 × 无界目标”的组合;监控 log-ratio/KL/奖励三条曲线,配合梯度裁剪与系数收紧,别让一次爆炸毁掉整个 run。
10. 三层排查速查表
| 症状 | 第一层:解码参数 | 第二层:偏好数据 | 第三层:奖励模型 |
|---|---|---|---|
| 输出变长 | 截断、早停 | 长度平衡、短好长差反例 | 长度归一化损失(SimPO/R-DPO) |
| 过度拒答 | 温度调高试验 | 清洗拒答样本、构造反例 | 分拆 safety/helpfulness 奖励 |
| 复读 | repetition_penalty、采样 | 语料去重 | n-gram 重复负奖励 |
| 模板化 | 采样参数调松 | 数据来源多样化 | KL 约束/熵奖励 |
| 格式崩溃 | 约束解码 | 格式过滤、对比对 | 格式校验进奖励 |
| 幻觉 | RAG 检索增强 | 奖励”承认不知道” | 事实性奖励 |
排查 checklist:
- 先改解码参数——分钟级验证,先排除最便宜的一层
- 再审偏好数据——按症状找偏差样本(太长、拒答、附和),构造反例
- 最后动奖励模型——最贵,但治本;记住奖励黑客的循环:审计→回灌→重训
- 每改一层,都用独立评测集(如 XSTest 之于拒答)验证症状是否缓解
11. 结论
对齐后训练的问题看似五花八门,实则共享一条主线:优化目标 ≠ 真实目标。输出变长是长度偏差进了数据,过度拒答是拒答当了安全的代理,复读是最大似然解码的天然陷阱,奖励黑客是考生找到了试卷漏洞,模型崩溃是采样偏差的递归放大——每一种病的”药方”本质上都是同一件事:把真实目标翻译回试卷,补数据的漏洞、补奖励的漏洞、补解码的漏洞。
遇到新问题时,按三层排查法定位(§10),再对症下药;同时记住两个必须长期坚持的动作:奖励模型随策略迭代(§4 的审计循环),以及生成数据喂回训练必须刹车(§8)。
参考文献
- Rafailov et al. Direct Preference Optimization: Your Language Model is Secretly a Reward Model. arXiv:2305.18290.
- Park et al. Disentangling Length from Quality in Direct Preference Optimization. arXiv:2403.19159.
- Meng et al. SimPO: Simple Preference Optimization with a Reference-Free Reward. arXiv:2405.14734.
- Röttger et al. XSTest: A Test Suite for Identifying Exaggerated Safety Behaviours in Large Language Models. arXiv:2308.01263.
- Holtzman et al. The Curious Case of Neural Text Degeneration. arXiv:1904.09751.
- Ouyang et al. Training language models to follow instructions with human feedback. arXiv:2203.02155.
- Sharma et al. Towards Understanding Sycophancy in Language Models. arXiv:2310.13548.
- Shumailov et al. The Curse of Recursion: Training on Generated Data Makes Models Forget. arXiv:2305.17493.
- Stiennon et al. Learning to Summarize with Human Feedback. arXiv:2009.01325.
- Keskar et al. CTRL: A Conditional Transformer Language Model for Controllable Generation. arXiv:1909.05858.