RSI如何借鉴深度学习的十一种机制

近年来,一种名为递归自我改进(RSI)的技术正从理论走向实践,相关研究成果层出不穷,不少可落地的方法与思路相继涌现。这些研究有的聚焦于对智能体的能力模块进行调整,有的侧重对自身记忆体系的优化,还有的针对运行框架进行迭代,或是通过生成训练数据来微调模型参数。
当接触这些研究时,有经验的深度学习从业者往往会产生强烈的共鸣——RSI研究中遇到的诸多问题,其实在深度学习发展过程中早已出现过,对应的解决思路也能在深度学习领域找到原型。不少方法的命名直接体现了这种借鉴,比如SkillAdam借鉴Adam优化原理来更新能力模块,TextGrad将反向传播的思路迁移到文本处理场景,RRSI则把正则化的理念应用于智能体运行框架的修改。
这种相似性并非表面现象,我们可以通过一个具体场景来理解。假设要让某个智能体在特定任务上表现更出色,常见做法是为其构建一套能力模块,每完成一批任务就根据结果更新模块内容,将失败的经验教训融入其中,经过多轮迭代后,智能体的表现会逐步提升。
但迭代到第20轮左右,问题就会逐渐凸显:
- 面对全新的、未见过的任务,表现会明显下滑,这是因为能力模块中仅针对见过的任务做了特殊处理,缺乏泛化性;
- 早期能顺利完成的任务,在迭代后反而容易出错,这是因为某一轮更新修改了原有规则,导致新任务适配了但旧任务被破坏;
- 能力模块的文档从最初的一页膨胀到十几页,很多条目是某次失败后添加的,之后从未发挥作用,却一直保留着。
这些问题并不陌生,从另一个角度看,不断更新能力模块就如同调整神经网络参数,都是深度学习领域的经典问题:新任务表现下滑对应过拟合,旧任务出错对应灾难性遗忘,文档冗余对应模型冗余。而深度学习经过多年发展,已经形成了正则化、回放、剪枝等一系列成熟机制来应对这些挑战。
不仅如此,RSI和深度学习的整体逻辑也有共通之处。深度学习是根据学习信号计算损失,再根据损失调整神经网络参数;而RSI则是在智能体完成任务后,根据任务结果和外部反馈,让智能体修改自身的能力模块和运行框架。
本文参考相关综述的内容,探讨当前RSI方法与深度学习的关联。综述中列举了RSI方法从深度学习借鉴的11种机制,包括优化、反向传播、强化学习、元学习、蒸馏、正则化、数据增强、持续学习、剪枝、集成学习和对抗学习。
后续将从四个维度展开讨论现有RSI对深度学习的借鉴:
- 每一轮该如何修改? 确定修改的内容、幅度,以及失败的归因对象,对应深度学习中的优化器和反向传播机制;
- 学习信号从哪里来? 当没有现成标签时,智能体如何从奖励、学习效果、自身训练轨迹、对手和同伴处获取信号,对应强化学习、元学习、蒸馏、对抗学习和集成学习机制;
- 如何避免过拟合? 也就是防止能力模块仅适配见过的任务,对应正则化和数据增强机制;
- 如何长期持续迭代? 即在持续更新中,既不丢失原有能力,也不会变得臃肿,对应持续学习和剪枝机制。
后续还将探索顺着这条思路可挖掘的新发展方向。
每一轮该如何修改
优化器:确定修改的内容与幅度
在深度学习中,优化器决定参数更新的方向和幅度。最基础的梯度下降会沿着梯度反方向每次小幅调整,后续的优化器会利用历史信息做两件事:一是对过往几步的梯度取平均,让更新方向更稳定,避免单次噪声的干扰;二是根据每个参数梯度的波动调整步长,波动大的参数会更谨慎更新。目前广泛使用的Adam优化器就同时实现了这两点。
能力模块的迭代修订面临同样的问题:每一轮应修改哪些内容,修改幅度该多大?以往的方法常按预设规则决定修改内容,且每轮会重写整个能力模块,导致之前正确的部分可能被误改。SkillAdam借鉴Adam的设计来解决这两个问题:它记录发现的问题、尝试过的修改及其结果,让后续修订能利用此前的经验,类似Adam利用历史梯度的思路;同时比较修订前后的任务表现,据此决定下一轮的修改幅度——如果某次修改在不同评估案例上的收益差异大,就缩小改动范围;如果收益一致,就允许更大范围的修改,这和Adam在梯度波动大时缩小步长的思路一致。
反向传播:明确失败的归因对象
训练神经网络时,需要确定最终误差由哪一层、哪个参数负责,反向传播分两步完成:前向计算时输入逐层处理得到输出和损失,反向时从损失开始逐层回传,每一层根据后续传来的梯度和自身计算,用链式法则算出本层参数的梯度,再传递给前一层,从而知道每个参数该如何调整。
智能体系统也存在同样的归因问题:一次任务失败,问题可能出在检索指令、提取代码,或是最后的汇总提示?TextGrad将反向传播的思路迁移到文本场景,以右侧系统为例:几段提示词分别交给语言模型、搜索引擎和工具调用,它们的输出汇总后形成最终答案。TextGrad先让语言模型按评估要求给最终答案写一段评价,相当于损失;然后沿系统反向传递:每一步都由语言模型结合当前输入、输出和后续传来的评价,写出上游输入该如何修改,这些文字意见相当于梯度。最后,优化器根据这些意见改写提示词、代码等变量,将任务层面的评价逐步转化为对具体组件的修改。
学习信号从哪里来
深度学习的多数场景都有现成的标签和损失函数,而智能体自我改进时往往没有提前备好的监督信号,需要自行获取:从环境奖励中学习、从学习效果中学习、从自身训练轨迹中学习、从对手处学习、从同伴处学习。这五类机制正好对应这五种信号来源。
强化学习:从奖励中学习记忆筛选
强化学习让学习者在与环境的交互中改进决策:做出选择后环境给出奖励,再根据奖励调整后续选择。其中一类常见思路是为每个选择估计价值,即预计能获得的回报,每拿到一次奖励就修正对应的估计,估计越准确,决策越清晰。
这一原理可应用于记忆检索:很多智能体记录过往任务,遇到新任务时按语义相似度找相近的旧记录参考,但相似的记录不一定有用,有时会带来干扰。MemRL为每条记忆额外记录效用值,代表用上该记忆后任务完成的好坏。MemRL的检索分两步:先按相似度召回候选,再综合相似度和效用值选出真正可用的记忆;任务成功时上调该记忆的效用值,失败则下调,这样,对任务有帮助的记忆会更易被选中。
元学习:从学习效果中学习学习方法
元学习的目标是学会如何学习:普通训练是在单个任务上训练模型,元学习则在多个任务上反复经历学习过程,根据每次学习后的效果改进学习方式,比如模型的初始参数、参数更新规则、训练数据的选择,这样遇到新任务时能学得更快更好。
SEAL将这一思路应用于模型自我更新:它想解决的问题是,给模型一段新材料,如何让模型真正把内容学进参数里,直接微调效果有限。SEAL的做法是:读完材料后,模型先自行生成训练材料,比如从材料推出的若干推论,称为“自编辑”;然后用这份训练材料微调自己,之后在不看原文的情况下回答相关问题。关键在于,训练材料的好坏要看学完后的答题效果,SEAL每次让模型写出几份训练材料,分别微调测试,保留效果好的训练材料,再训练模型以后生成这样的训练材料,形成两层学习:内层用训练材料更新参数,外层改进生成训练材料的能力,这正是元学习的核心——根据学习效果改进学习方式本身。
蒸馏:从自身训练轨迹构造教师模型
知识蒸馏最初是为了将大模型压缩为小模型:先训练一个强大的教师模型,再让小的学生模型模仿它,学生模仿的不是标注的正确答案,而是教师对每个候选输出的概率,这些概率包含不同输出的相对偏好,比单一标签更丰富,训练出的学生效果优于直接用标签训练的同规模模型。
RISE将蒸馏应用于强化学习,针对用强化学习训练数学题的场景,这类训练只看最终答案,信号较粗,模型不知道解答中哪几步好坏,而蒸馏的信号更细,教师会在每个位置告诉学生下一个词该怎么写,但需要比学生强、输出风格相近的教师模型。为此,RISE的做法是:模型做完一次强化学习更新后,将参数沿更新方向外推一段,得到预计更强的模型作为教师蒸馏学生,这个教师由学生外推而来,输出分布和学生接近,学生更容易学习,每轮流程是:强化学习更新→外推得到教师→蒸馏给学生。
对抗学习:从对手处发现漏洞
对抗学习让两个模型在对抗中共同进步:一方完成任务,比如生成逼真样本;另一方找破绽,比如区分真实和生成样本,双方轮流更新:一方进步后另一方要找新破绽,另一方找到破绽后一方知道如何改进,对手本身就是不断更新的训练信号,无需人工指出问题。
写代码的智能体也需要会挑错的对手,以往的做法是求解器写代码,验证器写测试,但验证器的测试通常只确认常见输入的正确性,求解器变强后就难发现错误。代码生成框架ACE换了思路,让同一个模型轮流扮演求解器和对抗者,求解器生成候选程序,对抗者生成专门触发执行失败的测试输入,比如让程序报错、崩溃或无法运行,系统用已有正确性测试和生成的输入评估程序,再用筛选出的程序微调求解器,执行结果也为对抗者提供偏好信号,偏好能让部分候选程序失败、部分成功的测试,更新后的求解器和对抗者进入下一轮,缺陷发现和代码生成在交互中持续改进。
集成学习:从同伴处取长补短
集成学习将多个学习者的预测结合,利用互补优势,做法是训练多个模型,对同一输入各自给出预测,再通过投票、取平均或加权得到最终结果,不同模型的错误通常不同,合在一起能抵消部分错误,所以集成成员既要各自优秀,又要有差异,合并方式可以是固定规则,也可以训练模块根据输入选择更信任的成员。
在智能体系统中,对应的问题是多个智能体如何协作求解,以及系统如何安排它们参与任务,很多多智能体系统事先固定协作结构,比如谁先做、谁后做、谁传递结果,相当于用固定规则合并成员结果。DMoA则让系统自行学习协作方式,它有一个智能体池,每个智能体由不同语言模型、角色和工具组合而成,推理时路由器根据当前问题和上下文从池中挑选少数智能体参与,它们的回答汇入上下文,最后由总结器给出答案,路由器是集成学习中根据输入选择成员的模块,训练不需要标注答案,底层语言模型不变,仅学习智能体间的协作方式。
如何避免过拟合
正则化:控制复杂度,引入扰动
正则化的目标是减少过拟合,让模型在训练数据外也有良好表现,常见做法分两类:一类是约束复杂度,在损失外加入惩罚项,优化目标为损失加复杂度惩罚,比如L1正则惩罚非零参数的数量,鼓励稀疏;L2正则惩罚参数平方和,抑制过大权重;另一类是引入扰动,典型代表是Dropout,训练时随机屏蔽部分单元,降低对特定特征组合的依赖。
RSI也面临类似风险:能力模块或运行框架反复修订后,可能只适合改进时用的任务,难以迁移到新任务。RRSI观察到,以往自动修改运行框架的方法,在改进任务上提升明显,换到未见过的任务时提升大多无法保持,甚至不如改进前。针对这个问题,RRSI将正则化控制复杂度的思路应用于框架演化:逐步减少每次提案允许的独立修改数量,限制一轮反馈能引入的变化;多次无收益的组件会被列为待删除对象;筛选候选版本时,执行成本的增加需伴随任务表现的提升,仅针对特定基准的修改会被过滤。SkillEvoReg则将Dropout思路应用于能力模块修订,随机屏蔽当前能力模块的部分指令或步骤,让智能体带着不完整的能力执行训练任务,更新器根据执行记录提出修订,之后恢复屏蔽内容并整合修改,减少对原有指令的过度依赖,同时限制模块不必要的增长。
数据增强:为难题生成变体
数据增强通过构造已有样例的变体扩充训练数据,图像分类中,对已标注图片随机裁剪、水平翻转或调整颜色,物体不变但模型能看到不同样子,从而抓住本质特征,而非死记细节,且变换不能改变样例本质,否则标签无效。
TTCS将数据增强应用于模型自我提升,面对的情况是模型只有一批难题,没有标准答案,需自行练习提高,没有标准答案时,模型只能对同一题回答多次,以出现最多的答案为正确答案,但题目太难时,多数回答错误,出现最多的答案也可能错,模型会跟着错误学习。为解决这个问题,TTCS借鉴数据增强,围绕题目生成变体,用问题合成器在保留解题思路的前提下,改变题目中的对象、情境或条件,生成难度合适的新题,所谓难度合适是指模型既不会每次都做对,也不会每次都做错:对新题多次回答后,约一半回答与最多答案一致时,合成器获得高奖励,太简单或太难的题奖励低,模型在原题和新题上训练,新题难度合适,最多答案更可靠,模型能学到正确内容,模型变强的同时,合成器也越来越会出题。
如何长期持续迭代
持续学习:用回放保留旧能力
持续学习关注模型接触后续任务或数据时,如何继续学习并保留已有能力,难点是新数据训练时,参数会向新任务调整,旧知识容易被覆盖,即灾难性遗忘,经典应对方法是回放:保存部分旧样例,学新东西时混入一起训练,让模型适应新任务的同时,不忘旧任务。
智能体反复更新能力模块时也会遇到这个问题:新任务改好了,旧任务可能被破坏。SEEK是一个搜索评估系统,用户搜索后得到短视频结果,系统用语言模型判断结果好坏,还要指出问题,判断标准常变化,这些标准被写成能力模块存入库,每次评估时取出相关的几条使用。用久了会发现,系统在某类情况上常判错,这时修改相应的能力模块,但改一条标准可能让原来判对的情况变错,所以SEEK准备了一组固定的历史案例,这些案例的正确判断经过人工确认,每次修改能力模块后,既要看新情况有没有判得更准,也要重新判断历史案例,只有新情况判得更准且历史案例表现基本不变,修改才会被保留,这组历史案例起到了回放的作用。
剪枝:给能力模块瘦身
剪枝会移除对目标行为贡献小的网络权重或结构,之后继续训练,训练好的网络里常有无用的权重,剪枝先估计每个权重或结构的重要性,比如看绝对值大小或去掉后损失的变化,把最不重要的部分删掉,再训练剩下的部分补回准确率,这个过程可反复进行,最后得到小得多但效果相近的网络。
智能体反复修订能力模块时,也会积累无用的内容,SkillProx在修订完成后专门简化:先把能力模块拆成单元,比如某节指令或参考资料,每次去掉一个单元,在验证任务上重新运行看效果变化,去掉后效果几乎不变的单元贡献小,可直接删除、合并有用部分或压缩详细内容,每次简化后,模块必须变短、结构完整且验证任务表现无明显下降,才会保留,否则撤回。
再往前一步:探索新的发展方向
前面讨论的都是现有方法已用上的机制,顺着这些关联,还能借鉴哪些新方向?这里列出五个方向,前三个来自深度学习,第四个来自更广的机器学习,第五个来自进化算法。
彩票假说:智能体起步需要多少资源
彩票假说指出,大网络中可能藏着小的子网络,用原初始权重单独训练,也能在相近训练轮数里达到相近准确率。那么对智能体来说,开始自我改进时,真的需要那么多能力模块和代码吗?如果一小部分就足够,我们就能找到更精简但同样能持续改进的起点。
对抗式Dropout:扰动能否更有针对性
Dropout是训练时随机屏蔽部分神经元,对抗式Dropout更进一步,在允许范围内专门找最能让模型出错的屏蔽方式,让模型学习应对。前面提到SkillEvoReg已将随机屏蔽用于能力模块修订,那能不能不随机屏蔽,而是专门屏蔽智能体最依赖的那部分能力模块,逼它找其他办法完成任务?
可塑性:智能体会不会越改越学不动
持续学习除了记住旧东西,还要学会新东西,这种能力叫可塑性,研究发现,网络连续学很多任务后,可塑性会下降,持续反向传播为此提出:训练中不断重新初始化少量贡献低的神经元,让它们重新学习新特征。如果智能体一直用自己生成的数据训练自己,时间长了会不会越来越学不会新方法?这个问题值得测试。
Freeze-Thaw贝叶斯优化:哪条分支值得继续
Freeze-Thaw贝叶斯优化会根据已看到的学习曲线,预测训练接下来的表现,再决定继续训练、暂停还是捡回之前的训练。很多RSI系统会同时跑多条改进分支,比如DGM维护智能体档案,不断挑出版本改进,那能不能根据每条分支前几轮的表现,预测后续进步空间,再决定哪条继续、哪条暂停?
模块化演化:能力模块能否自行拆分
有一个进化实验:如果演化目标在几个子目标的不同组合间切换,网络会自行长出可复用的模块,而现在的RSI方法比如ModularRSI是先划分模块再分别改进,那智能体能不能在任务变化中,自行把能力模块拆成可复用的模块,无需提前设计?这些方向在原综述中有更具体的讨论,感兴趣可查看原文。
结语
总的来看,智能体的自我改进正在不断遇到深度学习发展中的经典问题:每一轮该如何修改、学习信号从哪里来、如何避免过拟合、如何长期迭代。现有方法也已从优化器、反向传播、强化学习、元学习、蒸馏、正则化、数据增强、持续学习、剪枝、集成学习和对抗学习中借鉴了不少思路。
但RSI也有深度学习没有的特点:提出修改的系统本身也可能被修改。在深度学习中,Adam不会在训练过程中修改自己;而在SEAL中,模型既用自己写的训练材料更新自己,又学习如何生成更好的训练材料,改进者本身也在被改进,这正是递归自我改进的核心。
当然,能借鉴的远不止这些,学习率预热、早停、课程学习等许多深度学习方法,都值得应用到RSI中。

