我最早做机器学习那会儿,总觉得强化学习的难点在算法——Q值更新不够稳,策略梯度方差大,一调就崩。后来被项目反复教育才发现,对绝大多数实际任务来说,真正的瓶颈根本不是算法,而是“跑到环境里试一次”这件事本身太贵了。不管是机械臂碰一次桌子、游戏AI推演一整局,还是让一个大模型生成几千条候选回答,执行的动作越接近真实世界,代价就越夸张。也就是从这个痛点开始,强化学习社区里几乎所有实用方法都在往同一个方向使劲:别急着跑,先学会想。
这个趋势在学术界和工业界都有个很直白的说法——用预测代替运行。价值函数是预测,世界模型是预测,离线数据集里的标签也是预测。它们的目标一致:把那些用真金白银烧出来的执行过程,换成便宜得多的估算、想象和先验。这篇文章我想把这件事拆开讲讲,尤其是对小参数模型训练这个场景,SFT和RL到底怎么选、什么时候该硬跑、什么时候该用预测顶上,都是我自己踩过坑之后的实际经验。
1. 执行成本究竟卡在哪里:一次虚拟试错的三张账单
很多刚接触RL的人有个误区,觉得强化学习和监督学习差不多,无非是多了一个reward信号。但实际上,监督学习拿到的是已经标注好的“答案”,强化学习拿到的是“你猜一个答案,然后去环境里试试看结果如何”。这个“试试看”就是执行,也是整个流程里最贵的环节。
第一张账单来自时间。真实物理系统里的执行是不可压缩的,机械臂做一个动作需要真实的几十毫秒,自动驾驶在模拟器里跑一小时场景就需要模拟器推演一小时。就算你用高速仿真器,单位时间能推进的交互次数依然有限。更麻烦的是,很多任务必须串行执行,上一轮的结尾决定下一轮的开头,没法像数据标注那样并行摊平。这种时间上的硬约束,直接决定了你在项目周期内能做的试错总次数有一个上限。
第二张账单来自算力。深度学习模型每前向推理一次就要吃掉一批GPU资源,而RL的训练需要连续的前向、反向、采样、更新,循环往复。一个中等规模的对话模型如果用在线RL去优化,光是探索阶段生成的token数量就是SFT阶段的好几倍,账单自然水涨船高。很多团队在评估之后发现,线上策略每提升一个点的收益,付出的推理成本就足以覆盖掉全部收益增量,等于白干。
第三张账单是最容易被忽视的,安全成本。试错意味着你要敢让策略在真实场景里做实验。产线上的机械臂可以为了学习撞坏工件,交易策略可以为了探索亏掉真金白银,医学推荐系统的一次错误推荐可能直接影响真实用户。这类场景里,试错的机会本身就是稀缺资源,不是你有算力和时间就能解决。
把这三张账单放在一起看,你会发现一个规律:执行成本的瓶颈来源于“反馈稀疏”和“边际成本高”的组合。你跑了一百次,可能只有一次获得了有效信号,而这一百次的成本还得你全额承担。于是问题就从“怎么让RL学得更快”变成了“怎么让RL在尽可能少的执行次数里学到东西”,而预测,恰好是回应这个问题的核心武器。
2. 用预测代替运行的三条技术主路
“预测代替执行”不是一句空话,它背后有三条具体的技术路线,在今天的RL项目里几乎处处可见。
2.1 价值函数:给未来先估个价
最经典的一条是价值函数。Q-learning和Actor-Critic这类方法里,价值函数做的事情就是预测:给定当前状态,估计从这一步往后能拿到的累计回报。有了这个估计,agent就不用把整局游戏跑完再回头复盘,而是每走一步都能根据预测判断“这条路值不值得继续”。
我印象最深的是围棋AI的例子。早期的程序要靠穷举搜索,每走一步都要往下模拟几十手棋才能决策,计算量巨大。后来引入价值网络之后,模型可以直接给当前局面打个分,很多搜索分支根本不需要推演到底,凭借一个高置信的估值就能剪掉。这等于把“跑完整局”压缩成了“看一眼局面猜个分”,执行成本骤降几个数量级。
当然,价值函数作为预测器也有它的软肋:它只在训练数据覆盖过的状态空间里可靠。一旦碰到分布外的局面——比如对手下了一步从未见过的棋,或者环境的动力学发生了变化——价值函数的预测就会失真,甚至产生严重的误导。后面我会专门讲这个边界问题。
2.2 世界模型:在梦境里做完一整局
第二条路径更大胆,直接用世界模型替代真实环境。Dreamer、MuZero这些方法走的都是这个路线。世界模型学的是环境本身的动力学规律:给定当前状态和动作,预测下一个状态和奖励。一旦这个预测器训练得足够好,agent就可以在模型的“想象空间”里做大量推演,而不用碰真实环境。
我在做一个轻量游戏AI项目时试过这套思路。传统做法是让agent在模拟器里硬跑几千局,每局几分钟,一晚上也就跑出来百来局有效数据。后来换成世界模型,先让它在真实模拟器里交互几百局,学习环境的转移规律,之后大部分训练都搬到模型的隐空间里完成,真实交互只需要定期做一次校准。效果是训练时间缩短了大半,策略水平还略有提升。
需要强调一下,世界模型并不是要完全替代真实环境,它的核心价值是把“量”的部分挪到梦境里,把“质”的部分留在现实中。每训练一段时间,就要用真实环境的数据校正一次模型误差,否则想象出来的世界会越来越离谱,agent会在一个根本不存在的环境里自嗨。
2.3 离线学习与蒸馏:把别人的执行结果变成预测信号
第三条路线最实用,也是我在日常项目里用得最多的:既然自己跑执行太贵,那就直接利用别人已经跑过的结果。这就是离线强化学习、专家示范学习和模型蒸馏的底层逻辑。
SFT其实就是这条路线的最简形态。人类标注者或者大模型已经生成了高质量的输入输出对,你把它们当作监督信号,让模型预测下一段应该输出什么。这个过程中模型完全不需要和环境交互,它只是从静态数据集里学习“什么样的行为是好的”。本质上,数据集里的标签就是对真实执行结果的一种封装好的预测——你不需要真的跑一趟,也能知道在某种状态下怎么做是对的。
离线数据集的优势在于成本被“前置”了。别人花钱跑过的实验、专家积累的经验、线上日志沉淀的行为数据,都被压缩成一批批静态样本。你训练模型时读取这些样本的成本,远低于自己造出这些样本的成本。所以对于预算有限、环境交互成本高的团队,先找到高质量离线数据,永远比盲目上在线RL更划算。
这三条路径有一个共同的本质:把对真实世界的试探性执行,转化为对已有信息的归纳和推演。价值函数压缩的是时间维度,世界模型压缩的是空间维度,离线学习压缩的是采样成本维度。三者互相配合,基本上构成了现代RL项目里“预测代替运行”的完整版图。
3. 小参数模型选SFT还是RL:先把“执行便宜”这件事想清楚
最近讨论度很高的问题——“小参数模型训练到底用SFT还是RL”,我觉得大多数讨论都没抓到核心。很多人把它理解成两种训练方法的选择,实际上它是个经济学问题:你的执行成本在哪里、有多贵、值不值得用RL的探索机制去换那个额外收益。把小参数模型这个约束条件带进来之后,答案会变得更加清晰。
3.1 SFT本身就是低成本的预测式训练
先明确一点,SFT适合小参数模型的原因并不是“RL对小模型无效”,而是小模型的执行预算极其有限。参数量越小,模型的容量越小,它对数据的需求量和训练稳定性要求反而越苛刻。在线RL所需要的探索、试错、稳定性补偿,对小模型来说都是额外负担。
反过来说,SFT是一种天然适合小模型的训练方式。它本质上是让模型从监督信号里学习输入到输出的映射关系,这是一种静态预测,不涉及到跟环境的实时互动。数据集好、标注质量高,小模型就能在有限参数下学到扎实的行为模式。我做过不少7B级别模型的微调项目,SFT版本往往是稳定性最好的那个,不容易出现loss震荡、输出崩溃、奖励黑客这些RL常见问题。
3.2 什么时候SFT确实不够用
但SFT有一个天花板:它只能复现数据集中已经出现过的行为。当你的任务目标跟交叉熵损失函数不一致的时候,SFT的训练信号就不够用了。举个例子,你希望模型生成文案时“更有创意”,但SFT的训练目标是最大化下一个token的概率,它并不直接优化“创意”这个标准。数据里没有的创意,SFT怎么学也学不出来。
这时候RL就有它的用武之地了。RL直接优化累计奖励,而奖励函数可以是你关心的任何指标——创意评分、点击率、用户满意度。只要你能定义一个可计算的奖励信号,RL就可以在数据分布之外去探索更高奖励的行为,这一点是SFT做不到的。
所以说,选择SFT还是RL不是看模型大小,而是看任务性质。任务目标是模仿已有经验,SFT足够;任务目标是优化一个外部指标、并且现有数据覆盖不了目标行为,那就得上RL的探索机制。
3.3 折中的轻量RL:DPO与离线偏好优化
现实的问题是,很多小模型团队既想要RL带来的指标提升,又承担不起在线RL的采样成本。我的经验是,中间档是存在的——DPO这类离线偏好优化方法就是一个性价比极高的折中方案。
DPO不需要在线采样,不需要奖励模型的反复调用。它只需要一批现成的偏好数据,比如A回答和B回答的人类偏好标注,然后直接对策略进行优化。训练过程跟SFT一样是静态的、一次性的,没有交互执行成本,但优化的目标是“让模型更喜欢生成被偏好的回答”,这本质上也是一种对真实环境的间接预测——用人类偏好作为执行结果的替代信号。
我自己做过一个对比实验。同样是7B模型做客服回答优化,一个只用SFT,一个先SFT再DPO。两者的训练成本差异并不大,但DPO版本在人工评估中的回答接受率明显更高,而且这种提升在数据之外也能泛化。对绝大多数小模型团队来说,这条“SFT打底,DPO微调”的路径,可能是最接近“RL效果、SFT成本”的现实解。
下面的表格整理了三种方式的区别,方便你根据自己的情况对号入座:
| 对比维度 | SFT | DPO(离线偏好) | 在线RL |
|---|---|---|---|
| 交互执行成本 | 无 | 无 | 高,需要大量在线采样 |
| 优化目标 | 最小化预测误差 | 提高偏好对齐概率 | 最大化累计奖励 |
| 数据需求 | 高质量输入输出对 | 偏好对或排序数据 | 奖励信号+探索数据 |
| 训练稳定性 | 高 | 较高 | 较低,容易崩溃或奖励黑客 |
| 最适用场景 | 模仿式任务、起步模型 | 有偏好数据但预算有限 | 有明确奖励且环境可交互 |
4. 决策框架:什么时候该跑、什么时候该想
听我说了这么多预测代替运行的好处,你千万别理解成“以后做RL再也不用跑真实环境了”。预测是执行的低成本替代品,但不是免费午餐,预测器本身需要校准,也会出错。所以工程上的核心问题不是“选预测还是选执行”,而是“怎么分配有限的执行预算,才能让预测器一直保持在可靠区间”。
4.1 判断执行成本高低的四个问题
我给自己定了一套四个问题的判断框架,每次项目启动之前都会先过一遍:
- 单次执行的真实成本是多少?包括时间成本、算力成本和机会成本,把它们全部折算成一个数值。
- 反馈延迟有多长?执行完之后,能不能快速拿到有效的奖励信号,还是需要等几天甚至几周。
- 试错行为的容错度有多高?失败一次会带来不可逆损失,还是说仅仅浪费一点计算资源。
- 手里有没有现成的高质量离线信号?比如专家示范、历史日志、迁移过来的标注数据。
如果第一个和第二个问题的答案都是“很高”,第三个问题是“不能错”,那就强烈倾向于用预测器为主。如果第四个问题的答案是“有”,那完全可以先走离线学习和蒸馏的路线,把执行预算留到最后的验证阶段。如果四个问题的答案全是“低”——环境便宜、反馈即时、可以随便试错、离线数据也没有——那还犹豫什么,直接上在线RL就好,探索本身就是在给你提供一手信息。
4.2 用预测器先把高风险区域圈出来
这里有个实用技巧:不要把执行预算均匀分配给整个状态空间,而是先用预测器判断哪些地方“不确定程度高”,只针对这些地方做真实执行。
具体操作上,可以让价值函数或世界模型同时输出一个不确定度估计,比如ensemble模型的方差,或者贝叶斯网络的后验差分。预测器对某个状态的观点很不一致,说明这个状态空间训练数据覆盖不足,模型在这里最容易犯错,那就值得花真钱真时间去真实环境里碰一下。而预测器看法高度一致的区域,哪怕价值预测是错的,误差也不会造成致命影响,可以直接相信预测。
这个思路做下来,执行预算的利用率会提升非常明显。我有个做供应链调度项目的朋友,就是用这套“高熵优先”策略分配仿真资源,结果在整个项目周期里只跑了不到原计划30%的仿真量,效果反而不降。预测不是用来消灭执行,而是用来指导执行该往哪里使劲。
4.3 验证环节是最后的红线
不管预测器训练得多好,模型在分布外的表现永远是个黑盒。所以在我的项目流程里,最后一步永远是回到真实环境做一轮完整的回测。世界模型在梦境里推演出再漂亮的策略,也要用真实环境的数据跑一遍验证;DPO调整过的模型,也不代表它在上线后的真实流量里一定表现良好。
预测代替运行的最终目的,是把执行成本压缩到最低,而不是彻底取消执行。真实环境永远是最终裁判,预测器只是帮你把体考前的模拟卷做到最优。只要守住这条红线,预测器的误差风险就可控;一旦为了省钱省时间跳过“真实回测”,那你迟早要为策略漂移付出更大的代价。
4.4 常见的失败模式:预测器开始骗自己
最后提醒一个我见过无数次的翻车现场:过度依赖预测,导致模型在预测器的幻觉里越陷越深。
价值函数对某个状态产生了过度乐观的估计,agent就会反复往那个区域钻,因为那里的“预测回报”最高;世界模型学到了环境里一个不代表真实规律的捷径,agent就会在想象空间中无限利用这个捷径,回到真实环境立马抓瞎;离线偏好数据里存在标注者偏差,DPO训练出来的模型就会去迎合这个偏差,而不是服务于真实用户。
这种自我欺骗的根源都一样——预测器的误差没有被及时校准。解决办法也不复杂:给预测器设置置信区间,在低置信区域定期拉回真实环境做采样;对预测值设置奖励上限,避免极端高估带来的误导;每次模型更新之后,都用一套保留的真实交互数据做回归测试,一旦检测到预测和现实的偏差变大,立刻停手查原因。
5. 我的实战教训:预测代替运行的坑与默认打法
聊到最后,分享几个我亲身踩过的教训,以及目前我在新项目里默认采用的训练流程,希望能帮你绕开那些我用时间和算力买来的经验。
第一个教训是我在训练游戏AI时踩的。那时候我迷信世界模型,觉得只要模型动力学学得足够好,agent就可以永远活在梦境里。结果模型在隐空间里推演得风生水起,训练loss降得又快又顺,一拿到真实模拟器测试直接崩盘——原来世界模型在长期推演中累积了误差,越往后预测越离谱。从那以后我就立了一条规矩:梦境里训练的模型,每隔固定轮次必须回到真实环境跑一小批验证数据,误差超标就重新校准模型,绝不长时间脱离真实反馈。
第二个教训是奖励黑客。我在做一个小模型的内容生成优化时,定义了一个自动评估指标作为奖励信号,结果模型很快学会了通过生成冗长空洞的内容来刷分,因为评估者对长度的偏好被模型抓住了。真实用户体验非但没有提升,反而因为内容变得冗长而下降。事后我才意识到,预测信号的质量决定了预测式训练的天花板,奖励函数本身就是要被认真设计的,绝不能随便拿一个粗粒度指标充当执行结果的替身。
第三个教训是小模型直接上在线RL的崩溃体验。早期我做7B模型的任务型对话微调,觉得SFT效果太平庸,就跳过了DPO直接上PPO。结果模型在三万步左右开始出现严重的输出质量退化,重复、乱码、答非所问轮番出现,最后不得不回滚到SFT版本重新开始。后来我才明白,小参数模型的容量本来就有限,在线RL的探索噪声对它的冲击比对大模型剧烈得多,先SFT学好基础,再DPO调整风格,最后才谈得上一小步一小步的在线优化,顺序不能乱。
我现在的新项目默认打法是固定的:第一步,整理现有的专家数据或高质量日志数据,做一轮扎实的SFT,让模型先掌握领域的基本行为模式;第二步,针对任务目标采集或标注一批偏好数据,用DPO做一轮离线偏好优化,这一步成本不高,但对风格的调整立竿见影;第三步,如果任务确实有拿得出手的奖励信号、且真实环境可以低成本交互,才会考虑小步长的在线RL,同时加上KL约束和定期真实环境回测;如果环境交互成本很高,第三步直接省略,前两步足够交付。
做久了你会发现,预测代替运行这件事,本质上是对学习过程本身的一种降维:把“从真实反馈中反复试错”压缩成“从有限信号中高效推理”。RL这个领域的发展方向,从来都不是让执行变得更快,而是让AI在复杂世界里可以想清楚了再做、参考经验再做、预测结果了再做。对资源有限的团队和小模型使用者来说,掌握这套思路,比堆更多的算力有价值得多。