自动进化高质量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微信公众号

### 如何为大模型选择和过滤高质量SFT训练指令数据 #### 数据质量的重要性 为了提升大型语言模型(LLMs)的表现,尤其是通过监督微调(SFT),所使用的训练数据的质量至关重要。高质量数据不仅能够改善模型的理解能力和响应准确性,还能帮助减少潜在偏差并提高安全性[^1]。 #### 高效获取优质SFT数据的原则 当考虑哪些类型的数据可以增强SFT效果时,应优先关注那些具有清晰上下文、明确意图以及合理长度的回答实例。这些特征有助于确保生成的内容既自然又符合预期用途。此外,多样化的领域覆盖也是关键因素之一;来自不同行业的多样化样本可以使模型更好地适应各种应用场景的需求[^2]。 #### 构建高效的数据收集流程 获得适合于SFT过程的理想数据集通常涉及几个重要环节: - **初始采集**:可以从公开可用资源如书籍摘要、新闻文章或其他结构化文档中提取候选材料。 - **预处理与清洗**:去除无关信息或低价值条目,并对保留下来的文本片段做必要的格式调整以便后续分析。 - **标注指导原则制定**:定义详细的评分标准用来评价每一对问答配对的好坏程度,这一步骤对于维持整个项目的一致性和可靠性非常重要。 - **自动筛选机制设计**:开发算法来识别最有可能带来正面影响的例子,比如基于复杂度衡量或者特定主题的相关性测试等技术手段[^3]. #### 实施有效的过滤策略 一旦拥有了初步构建好的大规模语料库之后,则需进一步精炼以剔除不适合参与最终训练阶段的部分。具体做法可能包括但不限于以下几个方面: - 利用对比学习框架评估相似案例间的差异性; - 结合人类专家评审确认敏感话题表述恰当与否。 #### 自动化辅助方案介绍 考虑到手动审查海量资料耗时费力,在实际操作过程中往往还会引入一些智能化组件来进行辅助工作。例如SELF-INSTRUCT就是一个很好的例子,它采用了一种创新性的自我迭代方式——即让机器自己创造新的练习题目及其解答方案,再经过一系列严格的质检程序后加入到总的素材池里去[^4]. ```python def filter_high_quality_sft_data(data_samples, quality_threshold=0.8): filtered_data = [] for sample in data_samples: score = evaluate_sample_quality(sample) # 使用预先设定的标准打分 if score >= quality_threshold and passes_additional_checks(sample): # 达到阈值并通过额外检查 filtered_data.append(sample) return filtered_data def passes_additional_checks(sample): checks_passed = True # 执行更多具体的检验逻辑... return checks_passed ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值