代码:
https://jyopari.github.io/posts/seal拟人比喻:
学生把备考的东西,以自己的方式记成笔记精华,更有利于他的理解和记忆。
背景:
Self-improving:
本文:
输入外界知识,LLM将其整理为笔记(self-edit);拿<笔记+原文>做训练数据做SFT,SFT后的模型(临时用,不更新到最终模型里)用原文自带的QA(全靠SFT后的临时模型的记忆,input里没有原始语料和笔记)进行评判打分;在这组QA上得分最高的,将其<外界知识,笔记>输入到模型进行SFT训练,更新模型。
通过”拿表现好的self-edit,做SFT训练”,在推理或评测时,来一条<原文,Q>,同样生成self-edit(1条),用这条<self-edit,原文>做训练数据临时SFT训练一把模型(过后即仍),用这个临时模型去回答Q; 等于是让模型学会看原文做“好的”笔记的能力,然后来条测试样本同样生成笔记并用笔记+原文去回答问题。
Inner loop,之所以先SFT训练再评测,而不是直接把<self-edit,原文>直接放入content,是因为别的研究有说TestTimeTraining效果更好:
算法:
C是外界知识,
是该知识对应的QA。
损失函数:
reward, 做对了题就是1,做错了就是0:
经过近似,loss:
说白了就是"SFT on good self-edits"
这里的外层loop相当于teacher, 内层loop相当于student。在本文两者是同一模型;也可分开为2个模型。
实验:
1. 知识内化
实验结果:
Train on Passage: 直接使用原始的外部知识来SFT训练模型;不使用任何合成数据。(结果表明,效果提升非常小)
Train on Passage+Synthetic: 使用原始外部知识+本模型合成的self-edit数据,共同SFT训练模型;除了不进行RL训练,其他设置和SEAL组相同。(结果表明,这组效果提升较大,但加上RL训练的SEAL能更好些)
Train on Passage+GPT-4.1 Synthetic: 使用原始外部知识+GPT4.1生成的self-edit数据,共同SFT训练模型;(结果表明,效果提升较大,但SEAL虽然用的小模型来合成self-edit数据,因为有RL训练,效果更好)
附录B里,有实验的详细配置:50篇文章做训练数据,一共2个epoch;每个epoch,把每篇文章输入模型生成self-edit,采样5次生成5个self-edit;每个self-edit临时对模型进行SFT训练,在该文章的QA上进行评测,5个self-edit里找到评测分数最高的那1个;这些最优的50个self-edit及其原文(即context),交给大模型SFT训练一把(batch-size=10);
评测,用的和train不一样的评测集,也是遵循先生成self-edit再fine-tune的步骤:
(我的疑问:这里为什么还要fine tune? 生成完self-edit直接放入input prompt问问题不就可以了吗?)
2. ARC推理和泛化能力benchmark
self-edit的内容,就是:1. 调用tools做数据增强;2.SFT优化的参数;
知识内化实验:
模型:Qwen2.5-7B
训练数据: SQuAD段落的training set
测试数据: SQuAD段落的evaluation set
算法:ReSTARC实验:
模型:Llama-3.2-1B-Instruct;
训练数据: ARC数据集的training set;
测试数据: ARC数据集的evaluation set
算法:ReST
存在的问题:
灾难性遗忘。容易记住新的忘了旧的。
学会2个术语:
ICL(In Context Learning)
TTT (Test Time Training)









self-edit的内容,就是:1. 调用tools做数据增强;2.SFT优化的参数;
183

被折叠的 条评论
为什么被折叠?



