小明想学做菜。最传统的做法是请一位专业评委——评委先尝遍各种菜品,建立一套“好吃标准”,然后小明每做一道菜,评委就打个分,小明再根据分数反复调整。请评委费时费力,标准也可能偏颇。 但还有一种更聪明的办法:不请评委,直接把两盘菜端到食客面前,问一句“你更喜欢哪一盘?”小明只需记住每一次“这盘更好吃”的对比结论,就能改进厨艺。这就是本文主角——DPO(Direct Preference Optimization,直接偏好优化)的核心理念:不训练显式的奖励模型,只靠成对的偏好数据,让模型直接学会人的喜好。 在AI大模型的世界里,“学做菜的小明”是被对齐的大语言模型,“食客”是人类用户,“两盘菜”是同一个问题的两个候选回答。DPO凭借更简单、更稳定、更省资源的优势,已经成为大模型对齐工程师的必修课。
对AI从业者而言,DPO是当前最实用的大模型对齐技术之一:它大幅降低了RLHF的门槛,让普通开发者在有限算力下也能把模型“调教”得安全、有用、讨人喜欢,是模型对齐岗位面试的高频考点和落地利器。
可视化演示
动态演示DPO的核心机制,通过输入/处理/存储/输出四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
DPO:DPO消 DPO消除奖励模型的核心动机 Bradley-Terry偏好 核心机制可视化 DPO整体架构与关键组件
核心原理
小明学做菜有两个版本的故事。第一个版本,他花大价钱请了一位专业评委,先让评委吃遍所有菜系、建立打分标准,再让小明每炒一盘菜都端过去求打分。第二个版本,小明干脆不请评委,直接把两盘菜放在食客面前,让他们说“哪一盘更好吃”,然后照着改进。DPO就是第二个版本——它绕开了RLHF里那个昂贵的“评委”(奖励模型),把人类偏好数据直接变成策略模型的训练信号,一步到位。
先看看传统RLHF的复杂度:它要先训练一个奖励模型(评委),让它在任意回答上打出质量分;随后再用PPO强化学习算法,让语言模型(小明)在评委的反馈下反复迭代。这个流程要维护多个模型、做大量采样,超参敏感又费算力。DPO的突破口是一个数学等价:在对人类偏好建模的框架下,最优策略可以被写成“参考模型乘以一个隐式奖励”的形式,而奖励函数本身可以从优化目标中消去。
于是DPO给出了一个极其简洁的定义:一个回答值多少“分”,不再需要一个单独训练的网络,而是直接由策略模型自身的概率比来度量。这个式子就是DPO一切推导的地基。
回到小明的厨房:他不再依赖评委打分,而是对照着老菜谱,心里默默算“我这道菜比老菜谱好多少”。这个差值本身就是一道隐形评分——它藏在小明的做法里,不需要任何人额外打分。这就是“隐式奖励”四个字的全部含义。
- π_θ(y|x)这是正在训练的策略模型(小明本人)在给定提示x时生成回答y的概率,代表“小明现在做这道菜的手法”。
- π_ref(y|x)这是参考模型(家里那本老菜谱)在同样提示下生成y的概率,代表“老菜谱原本的做法”。
- 比值(两者相除)衡量新策略相对参考模型对回答y的“超额倾向”,比值大于1说明新策略比老菜谱更愿意这么回答。
- log取对数把乘除关系变成加减关系,让后续损失函数和梯度的计算更方便稳定。
- β缩放系数一个大于0的超参数,控制这份“隐式奖励”的放大力度,相当于把“比老菜谱好一点”放大成“高很多分”还是“略高一点分”。
偏好数据
食客不会说“这盘菜的辣度是87分、咸度是63分”,他们只会说“左边这盘更好吃”。小明收集的就是这些两两对比的记录。在AI领域,这样一条记录叫一个“偏好对”(preference pair),它是DPO唯一的燃料,也是整个对齐工作的原材料。
一个完整的偏好对包含三个字段:prompt(提示词)、chosen(更受青睐的回答)、rejected(不受青睐的回答)。举个例子,“怎么早睡?”这个问题下,chosen可能是“建议睡前半小时远离手机,听点轻音乐”,rejected可能是“你立刻必须11点睡”。DPO完全不关心绝对分数,只关心相对好坏,这非常符合人类的判断习惯——我们本来就很难给抽象事物打精确的分,但“选一个更好”却轻而易举。
那么,人类这种“二选一”的偏好,是怎么被翻译成数学语言的?学界最常用的是 Bradley-Terry 模型:它假设“更优回答胜出”的概率只取决于两个候选回答奖励值的差距,再用sigmoid函数把这个差距映射到0到1之间。这个模型虽然简单,却是DPO整个推导的支点。
小明的记录本越清晰——谁比谁好吃、具体好在哪里——他的改进就越有依据。记录本混乱甚至记反了,他再怎么努力也会跑偏。所以,偏好数据的质量直接决定DPO对齐效果的“天花板”,这一点比训练轮次和算力投入都更关键。
- r(x, y_w)奖励模型(或隐式奖励)对“更优回答”打出的分,相当于食客对这盘菜留下的好评程度。
- r(x, y_l)对“更差回答”的打分,相当于食客对另一盘菜的冷淡程度。
- 差值(两者相减)两盘菜的“口碑差距”,差值越大,说明食客对两盘菜的偏爱差异越明显。
- σ sigmoid函数将任意实数差压缩到(0,1)区间,差值为0时胜出概率恰为50%,差值趋近正无穷时概率趋近1。
损失函数
小明有了记录本还不够,他需要一个“改进法则”:看到“这盘好吃”的时候,该怎么把手上的动作往对的方向推?DPO的改进法则就是它的损失函数——一个数学上精确描述“这次对比让模型学得好不好”的式子。
把上一节的Bradley-Terry概率代入“最大化chosen胜出概率”的目标,再取负对数,就得到了DPO损失。直观地说,当chosen的隐式奖励明显高于rejected时,损失很小;当模型把好坏搞反了,损失就会变得很大,逼着模型往正确的方向调整。
从梯度的视角看,DPO每次更新都在做两件事:把chosen回答的概率往上推,同时把rejected回答的概率往下压,推和压的力度由奖励差值和β共同决定。这正是“从对比中学习”这一句话背后的数学动作。
- 隐式奖励差值用β乘以两者对数概率比的差,作用是把chosen和rejected各自的隐式奖励拉开距离。
- σ函数把上面的奖励差值映射成“chosen胜出”的概率,差值越大胜出概率越高。
- 负对数取-log是为了把“最大化概率”变成“最小化损失”,概率越接近1,损失越接近0。
- 期望E对所有偏好对求平均,保证模型在整个数据集上学到一致的规律,而不是在单个样本上忽左忽右。
参考模型
小明厨房角落里放着那本泛黄的家传菜谱——它从不被改动,却一直默默存在。在DPO里,这本“老菜谱”就是参考模型(reference model)。小明每做一步改进,都要回头看看自己离老菜谱还有多远,确保没有把菜做成不可名状的黑暗料理。
参考模型通常由监督微调(SFT)得到的模型担任,在DPO训练全程中完全冻结,参数一动也不动。它有两个不可替代的作用:第一,它是隐式奖励的计算基准——“新策略比老菜谱强多少”本身就是奖励的定义;第二,它提供KL散度约束,防止策略模型为了讨好偏好数据而把原始语言能力彻底丢掉。
KL散度(Kullback-Leibler divergence)是衡量两个概率分布差异的工具。在DPO里,它的作用是确保新策略不会偏离参考模型太远,数学形式如下:
试想,如果没有这本老菜谱,小明很可能越学越飘——某天为了赢得食客投票,突发奇想做出“榴莲炖火锅”。投票赢了,但整个厨房毁了。参考模型就是DPO的安全带,让“对齐”不变成“能力退化”,这正对应了思维导图中“冻结基线、防止漂移”的作用。
- π_θ(y|x)新策略模型在提示x下生成回答y的概率,是“小明现在的手法”。
- π_ref(y|x)参考模型在同样提示下生成y的概率,是“老菜谱的标准做法”。
- 对数比值(逐位置累计)对每个可能的回答求“新策略相对参考模型”的倍数再取对数,衡量单点偏差。
- 期望E(按新策略生成分布)因为我们要考察的是“新策略平时会生成什么”,所以按新策略自己的概率分布来加权平均,得到整体的偏离程度。
DPO对比PPO
小明的学艺之路有两条。第一条路是RLHF+PPO:请专业评委、建打分标准、反复迭代,阵容豪华但开销巨大;第二条路是DPO:只看食客两两对比,轻装上阵。两条路都能提升厨艺,但成本和体感完全不同。
从工程视角看,PPO管线需要同时维护四个模型:策略模型(小明)、参考模型(老菜谱)、奖励模型(评委)、价值模型(教练的直觉)。每一步更新都要采样、算优势、做裁剪,代码复杂、调试困难。DPO只需要两个模型——策略模型和冻结的参考模型,整个训练流程退化成一次常规的监督学习,显存占用和调试难度都大幅下降。
为了更清楚地对比,我们看看RLHF的整体优化目标:它要在“最大化奖励模型打分”和“最小化与参考模型的KL散度”之间找平衡。
小明的总结是:请评委那套阵容“贵但能干重活”——PPO可以在做饭过程中不断试吃新菜(在线探索),应对复杂多步任务;DPO更适合“照着笔记学已有案例”(离线数据),简单省力。没有绝对的好坏,只有是否适合当下的处境。
- 奖励期望项对所有提示和模型生成的回答,求奖励模型打分的平均,代表“评委整体满意程度”。
- KL惩罚项新策略与参考模型的KL散度,代表“小明偏离老菜谱的距离”。
- β权重调节“讨好评委”和“不跑偏”之间的优先级,β大则更保守、β小则更激进。
- 整体目标最大化“得分减惩罚”,PPO通过打圈采样逼近它,DPO则直接算出了闭式解。
超参调优
小明渐渐发现,做菜的关键不只是记录好坏,更在于“火候”。DPO里最重要的“火候旋钮”就是β(beta)。它决定了一个方向性的问题:小明到底是老老实实照着老菜谱做,还是大胆按照食客偏好去创新。
从数学上看,β既是KL正则项的权重,又是隐式奖励的缩放系数。为了看清它的作用,可以写出RLHF/DPO框架下最优策略的闭式解——这是一个贯穿始终的重要公式:
实际操作中,β通常从0.1到0.5之间起步,先固定学习率,再用一个小验证集试几组β。除此之外,学习率、batch size、训练轮数也需要配套调整:学习率太大会让模型在偏好数据上剧烈震荡,训练轮数过多则会过拟合,把“千人千面的泛化能力”学成“死记硬背的讨好模板”。
- π_ref(y|x)参考模型的生成概率,是“老菜谱的基础做法”。
- exp(r/β)奖励越高、β越小,这个指数因子就越大,对应回答在最优策略里被放大的倍数。
- 1/Z(x)归一化常数(配分函数),保证所有回答的概率之和为1,相当于把放大后的权重“按比例缩回”。
- β位置的意义β出现在分母上,直观地说明——β调大,指数趋近于1,模型更保守;β调小,指数差异更悬殊,模型更激进。
应用落地
从小明的厨房走到连锁餐厅:DPO如今已经是开源社区里最常用的大模型对齐工具之一。它让小团队不必请“专业评委天团”——也就是省去了训练奖励模型所需的算力、数据与人力——也能把自家大模型调教得安全、有用、有礼貌。
工程上,HuggingFace的TRL库提供了开箱即用的 DPOTrainer,LLaMA-Factory、Axolotl等工具也内置了DPO支持。一个典型的落地流程是:用SFT模型初始化参考模型 → 收集几千到几万条偏好对(比如“安全回答 vs 危险回答”) → 在DPOTrainer上训练几小时 → 用胜率(win rate)指标做效果评测。
衡量对齐效果最直观的指标就是“胜率”——把新模型和基线模型的回答放在一起,让人或者GPT-4投票,统计新模型被偏好的比例:
小明的餐厅招牌上写着:“本店不请评委,只用食客的投票来改进每一道菜。”对大模型对齐工程师而言,DPO正是那本简单实用的“开店手册”:理解它的原理、配好偏好数据、调好β,就能让AI更懂人,也更值得信赖。
---
- N(样本总数)评测集中问题和回答对的规模,N越大,胜率统计越可靠。
- s_A、s_B(得分)模型A与模型B对第i个问题的回答,由评测者(人或GPT-4)给出的偏好判断。
- 指示函数I条件成立记1、不成立记0,把“谁胜出”变成可累加的数字。
- 求平均统计所有样本中A获胜的占比,就得到了一个0到1之间的胜率。
AI 应用场景
开源模型的安全对齐改造
阶段:模型对齐与微调
解决的问题:企业拿到开源基座模型(如Llama、Qwen)后,希望它不输出有毒内容、不泄露隐私、不过度拒绝。传统RLHF需要训练奖励模型再用PPO迭代,对算力和调参经验要求极高。DPO只需收集偏好对,直接微调即可生效,普通工程师也能在单机多卡环境下快速完成。
具体案例:某AI创业公司用DPO对Llama-3-8B做安全对齐,收集约1万条“安全回答 vs 危险回答”偏好对,在8张A100上用TRL库训练不到半天,有害回复率显著下降,且通用能力几乎不掉点。
客服机器人的语气风格调优
阶段:风格调优与体验优化
解决的问题:企业客服大模型回答专业但语气生硬、缺乏温度。人工重写语料做监督微调难以覆盖千变万化的对话场景,而DPO用“更友好版本 vs 原版本”的偏好对,能把“讨人喜欢”这种主观感受直接教给模型。
具体案例:某电商平台的客服机器人收集3000条“友好回答/冷漠回答”偏好对,用DPO训练,β设为0.15,两轮迭代后用户满意度评分提升约12%,且没有引入新的幻觉。
缓解模型的“过度拒绝”问题
阶段:行为矫正与安全边界细化
解决的问题:安全对齐过度的模型会对很多合理问题也说“我不能帮你”。DPO可以收集“正常回答 vs 过度拒绝”的偏好对,让模型学会区分“真正危险的请求”和“正常合理的请求”。
具体案例:某智能助手在8000条问题上构造偏好对(合理问题给出正常回答,越界问题仍保持拒绝),用DPO训练后,合理查询的误拒率从18%降到4%,同时危险内容拦截率没有回退。
Python 演示
import mathimport random def sigmoid(x): """sigmoid函数: 把任意实数映射到(0,1)区间""" return 1.0 / (1.0 + math.exp(-x)) class ToyDPO: """极简DPO训练演示: 每个样本只有chosen/rejected两个回答的logit""" def __init__(self, beta=0.5, lr=0.05): self.beta = beta self.lr = lr self.logits_w = {} self.logits_l = {} self.ref_w = {} self.ref_l = {} def add_pair(self, prompt, w_logit, l_logit, ref_w, ref_l): """添加一条偏好对: prompt下chosen优于rejected""" self.logits_w[prompt] = w_logit self.logits_l[prompt] = l_logit self.ref_w[prompt] = ref_w self.ref_l[prompt] = ref_l def dpo_loss(self, prompt): """计算DPO损失: -log sigma(beta * (rw - rl))""" rw = self.beta * (self.logits_w[prompt] - self.ref_w[prompt]) rl = self.beta * (self.logits_l[prompt] - self.ref_l[prompt]) return -math.log(sigmoid(rw - rl)) def train_step(self, prompt): """对单个偏好对做一次梯度更新""" rw = self.beta * (self.logits_w[prompt] - self.ref_w[prompt]) rl = self.beta * (self.logits_l[prompt] - self.ref_l[prompt]) p_win = sigmoid(rw - rl) grad_w = self.beta * (1.0 - p_win) grad_l = -self.beta * (1.0 - p_win) self.logits_w[prompt] += self.lr * grad_w self.logits_l[prompt] += self.lr * grad_l def train(self, epochs=30, seed=42): """在多条偏好对上迭代训练若干轮""" random.seed(seed) prompts = list(self.logits_w.keys()) for epoch in range(epochs): random.shuffle(prompts) total = 0.0 for p in prompts: total += self.dpo_loss(p) self.train_step(p) if epoch % 5 == 0 or epoch == epochs - 1: print("epoch %2d avg_loss %.4f" % (epoch, total / len(prompts))) def main(): dpo = ToyDPO(beta=0.5, lr=0.05) dpo.add_pair("如何学编程", 0.9, 0.2, 0.8, 0.6) dpo.add_pair("如何早睡", 0.7, 0.1, 0.6, 0.5) dpo.add_pair("如何写简历", 0.8, 0.3, 0.7, 0.5) dpo.add_pair("如何健身", 0.6, 0.0, 0.5, 0.4) dpo.add_pair("如何面试", 0.8, 0.2, 0.7, 0.5) dpo.train(epochs=30) print("DPO 训练完成!") if __name__ == "__main__": main()
sigmoid(x)将奖励差值压缩到(0,1)区间,作为“chosen胜出概率”。self.logits_w[prompt]记录每个提示下chosen回答的可训练logit,等价于真实模型中策略网络对回答的打分。rw = self.beta * (self.logits_w[prompt] - self.ref_w[prompt])计算chosen回答的隐式奖励:β乘以“新策略logit减去参考模型logit”。p_win = sigmoid(rw - rl)用Bradley-Terry模型算出chosen胜出概率。grad_w = self.beta * (1.0 - p_win)对chosen回答的梯度方向:胜出概率越低,向上推的力度越大。self.logits_w[prompt] += self.lr * grad_w一步梯度更新,对应真实训练中的optimizer.step()。
常见误区
误区新手听说DPO“绕开了奖励模型”,就误以为它只需要一个策略模型,参考模型是多余的摆设。
正解参考模型是DPO的另一条腿。它既提供了隐式奖励的计算基准——“新策略比老菜谱强多少”——又通过KL散度约束防止策略模型能力漂移。没有参考模型,损失函数根本无法定义,训练会迅速崩溃或过拟合。
为何常见:“直接”两个字容易让人以为DPO把所有辅助模型都简化掉了,实际上DPO只是省掉了奖励模型,参考模型依然是核心组件。
误区以为DPO只靠偏好对的先后顺序,完全抛弃了奖励概念。
正解DPO不需要显式训练的奖励模型,但它的梯度里隐含了一个“隐式奖励”——策略模型与参考模型的对数概率比乘以β。DPO并没有消灭奖励,只是把奖励函数“藏”进了策略模型自己的概率里。
为何常见:“直接偏好优化”这个名字容易让人误以为没有奖励,但数学上它只是换了一种方式表达奖励。
误区认为对齐效果只取决于数据量,偏好对越多,模型就越听话。
正解偏好数据的质量决定对齐的上限。如果chosen和rejected差异不明显、标注互相矛盾、甚至标反了,模型会学到错误信号。实践中,几千条高质量偏好对的效果往往好过几万条噪声数据。
为何常见:深度学习“数据越多越好”的惯性思维被套用到了主观偏好标注上,忽略了偏好对本身的主观性和噪声特点。
误区看到DPO简单高效、开源工具多,就认为它应该全面取代PPO。
正解DPO基于静态偏好数据,无法在线采集新策略的生成结果来探索;PPO可以在环境中边采样边学习,天然适合需要探索、多步决策、奖励信号来自环境的任务。DPO更擅长“从已有对比中学习”,PPO更擅长“在和环境的互动中试错”。
为何常见:在标准对齐benchmark上DPO屡屡取得好成绩,容易让人忽略它“离线学习”的本质局限。
误区β既然控制“偏好强度”,那把它调大,模型应该更听话、更符合人类偏好。
正解β越大,KL惩罚越强,模型越不敢偏离参考模型,实际对齐效果反而变弱;β太小,模型又会对偏好数据严重过拟合,丧失通用能力。通常从0.1到0.5之间试起,配合验证集观察效果。
为何常见:人们习惯于“参数越大=效果越强”的直觉,忽略了β作为正则权重出现在 KL 项里的“抑制”作用。
面试题
Q1. DPO中“直接偏好优化”的“直接”主要体现在哪里?
- A.直接使用人类标注的得分
- B.直接对偏好对求梯度更新模型← 正确答案
- C.直接使用奖励模型的打分输出
- D.直接利用强化学习的累积回报
答案:B。DPO的“直接”指跳过训练奖励模型和PPO采样循环,直接把偏好数据(chosen/rejected对)代入损失函数求梯度更新策略。A说的是人类给绝对分数,C说的是奖励模型打分,D说的是强化学习回报,都不是DPO的典型做法。
Q2. DPO训练过程中,参考模型扮演什么角色?
- A.被训练优化的奖励函数模型
- B.提供初始参数的教师模型
- C.固定不动的稳定性锚点← 正确答案
- D.生成对比答案的生成器
答案:C。参考模型在DPO中由SFT模型初始化后全程冻结,提供KL散度约束和隐式奖励的计算基准,好比“固定不动的老菜谱”。它不是奖励模型,不参与训练更新,也不负责生成答案。
Q3. 下列关于DPO损失函数的说法,正确的是?
- A.最大化两者的联合概率输出
- B.最小化chosen的胜出概率值
- C.最大化chosen的胜出概率值← 正确答案
- D.最小化两者的隐式奖励差
答案:C。DPO损失的定义是“chosen胜出概率的负对数”,所以最小化损失等价于最大化chosen胜出概率,同时拉开chosen与rejected的隐式奖励差。A的“联合概率”、B的“最小化”、D的“最小化差值”都与正确方向相反。
Q4. DPO中的β(beta)超参数主要控制什么?
- A.模型对参考模型的偏离程度← 正确答案
- B.学习率的衰减速度大小
- C.偏好数据集的总规模大小
- D.模型参数量的大小尺度
答案:A。β是KL正则权重和隐式奖励的缩放系数。β越大,KL惩罚越强,模型越不敢偏离参考模型;β越小,模型越激进地拟合偏好数据。它和学习率、数据规模、参数量没有直接关系。
Q5. 一个合法的DPO偏好数据样本不包含哪个字段?
- A.提示词prompt的文本内容
- B.更优回答chosen的文本
- C.更差回答rejected的文本
- D.奖励模型打出的reward分数← 正确答案
答案:D。DPO样本只需要prompt、chosen、rejected三个字段,不依赖任何奖励模型打出的绝对分数。这正是DPO与传统RLHF的区别——后者需要reward,DPO只需要相对偏好。
Q6. 相比RLHF加PPO,DPO的优势有哪些?
- A.无需训练显式的奖励模型← 正确答案
- B.训练流程更简单稳定可控← 正确答案
- C.效果必然会全面超越PPO
- D.训练所需显存资源更小← 正确答案
答案:ABD。DPO省去了奖励模型训练和PPO采样循环,只需策略和参考两个模型,显存更小、流程更简单。但“效果必然全面超越PPO”是过度断言:在需要在线探索和复杂多步任务上,PPO依然有优势。
Q7. 关于DPO训练,下列说法正确的有?
- A.梯度会增大chosen的回答概率← 正确答案
- B.梯度会降低rejected的回答概率← 正确答案
- C.隐式奖励由策略模型隐含表达← 正确答案
- D.参考模型随训练过程同步更新
答案:ABC。DPO的梯度更新方向是提升chosen概率、压低rejected概率;隐式奖励定义为β乘以策略与参考模型的对数概率比,确实内嵌在策略模型里。参考模型全程冻结不更新,因此D错误。
Q8. DPO隐式奖励函数的正确表达式是哪个?
- A.r = β·log(π_θ/π_ref)← 正确答案
- B.r = β·(π_θ - π_ref)
- C.r = (1/β)·log(π_θ·π_ref)
- D.r = β·log(π_ref/π_θ)
答案:A。隐式奖励的定义是β乘以“新策略概率与参考模型概率之比”的对数。B是概率相减没有取对数,C把β放到了分母上且用了乘积,D把分子分母颠倒了,都会导致奖励方向或量级错误。
Q9. 从技术流派来看,DPO属于哪一类大模型对齐方法?
- A.基于人类反馈的强化学习类← 正确答案
- B.纯无监督的预训练技术类
- C.有监督的指令微调技术类
- D.知识蒸馏与模型压缩类
答案:A。DPO本质上是RLHF的一种简化形式——它基于人类偏好反馈(Bradley-Terry模型),目标是让模型行为对齐人类偏好,因此属于“基于人类反馈的强化学习”大类。它不需要试错式强化学习,但在理论框架上仍属于这一流派。
Q10. 下列哪些做法有助于提升DPO的实际对齐效果?
- A.收集并清洗高质量的偏好对← 正确答案
- B.合理调节β超参数找平衡← 正确答案
- C.选择恰当的参考模型做基线← 正确答案
- D.无限增加训练轮数以追求最优
答案:ABC。高质量偏好对决定了对齐上限,β控制保守与激进的平衡,参考模型提供稳定的计算基准,这三者都是关键因素。而“无限增加训练轮数”会导致过拟合,模型变得死板、丧失泛化能力,因此D不正确。