文章首先提到了一个推理-动作轨迹数据集的问题。这些数据集经常会包括一些需要多步推理的任务。但是,无论是让人去取得这些数据,还是让更高质量的模型代劳,成本都太高了。因此最好是自我监督,自己产生数据来学习(self-instruct还在追我)
文章使用Re-ReST(反射增强自训练)来优化生成的样本。具体地讲,模型先生成样本(比如说一段代码)然后把他交出去(比如说拿去运行)然后看反馈的结果,结合反馈结果优化生成样本,这样就可以得到高质量样本了。
文章做了很多方面的实验,多跳问答、顺序决策、代码生成、视觉问答和文本到图像生成都有涉及。最后还展示了一种不需要真实反馈的反射增强自训练方法(比如说不需要真的把生成的代码拿去运行的方法)
流程大致如下:
这里比较一下Re-ReST与Self-Instruct之间的区别啊。Self-Instruct是人工制作一批种子任务,然后让agent仿照产生新任务,用查重等方法筛选,最后用产生的数据集去微调。
Re-ReST是命令agent去生成某种数据(比如说代码,图像与文字啥的)然后把这些数据放到真实情况中去使用,把使用结果反馈给agent,让他自己修改自己原本生成的数据,从而得到新的高质量数据,最后用这些高质量数据去微调。
总之,Self-Instruct是根据查重筛选,而这个方法是根据真实反馈修改。
可以注意到,这个流程中实际上涉及了两个模型,一个是负责产生数据的agent(M),一个是负责修改不合格数据的Reflector(R)。其中反射模型R是可以访问外部环境的。
流程中文章会先把task输入给agent,agent会给出k种解法(文章推荐3个),然后交给环境。环境会进行反馈,没问题的话,那就把这一对input和output作为合格数据加入数据池,有问题就交给R这边。
其中M是一个大语言模型,可以接受一个task然后输出对应的解决思路,动作步骤。这个task是数据集提供的。具体做法是使用这个公开数据集中的一部分作为训练集,使用上文提到的过程进行训练啥的,然后用剩下的数据集进行测试。感觉这样子其实有一点赖皮,最后实验的时候应该测试一下假如不适用Re-ReST法,单纯的用一部分数据微调一下然后用剩下数据测试看看两者区别。
R也是一个大语言模型,可以访问外部环境获取反馈,从而修改M的输出,提高数据质量直到环境反映说达标了(也可以在修改之前生成cot)。文章发现假如R不能访问外部环境,得到真实反馈的话,其效果会很差。
M,R的参数不互通。
接下来是模型微调的具体细节。文章首先微调了R。R其实不微调也行,不过还是调了。具体做法是让M生成数据,正确的就直接拿来用,不正确的就加上环境给的反馈一起拿来给R微调用。此外,R自己也要生成一批数据(做法和M一样),也拿来微调自己。这些数据都是给R微调用的,没有做Re-ReST,就算有低质量数据也只是加上环境反馈就拿来用了。反正R也不需要太好。
这样,我们拥有了一个比较好的R之后,就可以开始使用上文提到的Re-ReST过程生成数据了。最后拿精修过的高质量数据交给agent(M)来微调。
这样训练部分就完成了。做inference的时候只需要agent(M)就可以了,R不用。
接下来是实验部分。在信息检索任务方面,文章使用HotpotQA数据集,其包含大量有关在维基百科上搜索信息之类的任务(是多步的)。agent能做的动作就三种,(1) 搜索[实体],在维基百科上搜索确切的实体,(2)查找[关键字],在检索到的段落中定位关键字,以及(3)完成[答案]。agent要做的就是给出一系列动作,给出之后会用维基百科的api执行这些动作,看看能不能完成task。具体的检查方法就是看agent最后得到的答案和数据集里的一样不一样,不一样就把检索结果和评估结果作为环境反馈交给R去矫正。这里提到了用LoRA来训练,什么意思?可以学一下LoRA。
此外,文章还做了序列决策,代码生成,用文字生成图片等方面的实验。
最后,文章进行了分析,证明了使用Re-ReST方法比单纯的让agent生成数据,不做反馈精修的方法更好。同时,实验开头的先微调R的做法被证明具有一定的作用。
最后,文章还做了一个小测试。之前有提到做inference的时候是没有R参与的,毕竟按照之前的思路,难不成做inference的时候还要把agent输出的结果先用api试一遍,然后把反馈交给R再把精修过的结果交给用户?但R不一定要这么用,这里测试了一下假如让R也来会怎么样。这里使用了一种self-consistent方法,就是让M和R各自生成三个output(总共6种解法)然后少数服从多数,选择最多人选择的那种方法,发现效果更好了。这样可以让R也参与进来,而且不需要环境反馈那一步,这里的R相当于只是普通的模型,不是负责精修数据的。