自动进化高质量sft数据

前言

在做sft的小伙伴可能知道一份高质量的sft数据是多么重要!而想要得到一份高质量的sft数据是非常难的,可以说做sft的工作最最重要的一个核心就是怎么做好一份sft数据。

而依托大模型自动蒸馏生成sft数据成了一个重要的研究方向,而且被多次证明是有重大收益的。笔者在较前也写过一篇(可能会漏掉了最新的一些工作),感兴趣的小伙伴可以看看:

大模型SFT微调指令数据的生成 :https://zhuanlan.zhihu.com/p/650596719

其中最经典的一篇就是微软的Wizardlm,其通过进化的方式得到了一份高多样性、复杂度的样本。由于其idea过于朴素且有效,以至于后面有很多的sft数据工作都是基于其思想进行改进,感兴趣的小伙伴可以搜一下。(打个小广告:笔者所在的团队也在ACL发了一篇:https://arxiv.org/pdf/2312.15692

好了,言归正传,上面的进化方法虽然很好,但是怎么进化却是需要人工精心设计的,再说的直白点就是怎么精心写好prompt,这里是需要大量人工经验的,要反复调试。那么有没有更好的办法呢?

有!那就是把流程弄的更自动化一些呗,即尽可能的不让人参与,让LM自动完成进化迭代。今天就给大家介绍一篇这样的paper:《Automatic Instruction Evolving for Large Language Models》,同样是微软团队出品,并在多个领域比如文本、代码、数学验证有效。

论文链接:https://arxiv.org/pdf/2406.00770

方法

正如前面所说,不同领域的复杂进化可能需要不同的人工先验设计,比如在代码领域我们可能更关注时间和空间复杂度,而这些在闲聊对话场景就不是很合适了。于是作者都把这些进行了自动化。大概分为三个步骤。

  • 初始进化

先对seed进行初始进化,和以往精心设计进化不同,这里尽量都是以“自动化”的方式进行,具体来说就是先让模型好好看看当前的seed指令,然后自动的列出一些可能增强复杂度的方法,接着再基于这些方法给出详细具体的实施计划,然后就是根据计划去逐步实施具体进化了,最后一步就是在review一下比如纠正一些不合理的地方等等。

上述整个过程其实是一气呵成的即一个prompt,过一遍大模型即可,作者也分享了这个宝贵的具体Prompt Engineering:

  • 进化分析

上面虽然进行了自动化进化,但是有时候可能进化的不好,所以进化完后需要对结果进行一个分析

  • 润色进化方法

通过上面的分析我们就可以知道优化方法哪里不足?进而我们就可以进行二次润色优化

  • 优化兜底

即使有了上面的润色优化,但是有时候其依然不能保证所有的case都被优化的很好,所以作者又搞了一些规则兜底,具体来说就是看当前优化指令对应的response,比如response出现“please provide”这个关键字,那么就任务指令中其实缺失关键信息,不是一个好指令。更多规则如下:

  • case

为了方便大家理解整个流程,作者直接给了一个完整case

Original Instruction就是seed初始种子,Evolved Instruction就是初始进化的结果,Feedback就是进化分析,Updated Evolved Instruction就是再次润色后的指令,可以看到Feedback能够分析出冗余等badcase。

附录中作者给了更多详细的prompt,大家可以看看或者直接用。

  • 实验结果

笔者这里就放一张最关键的图吧,其中GSM8K是数学,HumanEval是代码,其他两个benchmark可以理解为通用文本指令遵循能力,可以看到相比于普通的Evol-Instruct,自动进化这条pipeline基本上都有提高,而且作者也和数学Wizard和代码Wizard两个专门域内Wizard模型做了对比。效果还是不错的,尤其是数学涨了非常多。

总结

(1)凡是蒸馏大模型来做训练数据的相关工作核心资产或者壁垒就是这些prompt。怎么设计好流程并编写好prompt就是关键,再往大了说就是想做好sft,就必须有好的数据,有好的数据就必须依赖好的Prompt Engineering。可见会写prompt是必备核心竞争力了。

(2)另外一个思考就是既然我们都能从一个较大的模型比如GPT4中蒸馏出这些好的数据并且训练得到好的效果,那么为什么有时候直接评测这些大模型GPT4就得不到好的效果呢?按理说他自身是有这些能力的,不然我们也蒸馏不出来对吧。其实很简单,还是用的姿势不对,我们蒸馏它的时候用了大量的Prompt Engineering,prompt写的很复杂甚至多次调用才完成一次工作,但是我们直接评测有时候都没做这些事,那当然不会好了,举个最最极端的例子就是cot,好好写一下prompt,你会发现原来它还是挺强的。大模型本身是有这些能力的,只是我们没有激发出来而已。所以说到底还是怎么写好prompt的是关键。有时候不是大模型做不了这件事,而是我们没有好好debug prompt。当然了这也是做底层大模型的研究人员需要注意的,为什么需要人工写大量的prompt且反复调试才能实现目的?而不能直接快速对齐人类呢?如果能做到这一点是不是更好?所以双方都需要努力吧,或许到后面随着模型能力的提高,Prompt Engineering会越做越轻。

关注

欢迎关注,下期再见啦~

知乎csdngithub微信公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值