如何自动筛选高质量的指令微调数据喂给大模型?

news2024/11/19 15:38:20

前言

大家都知道在大模型时代,数据有多么重要,质量多高都不过分!甚至直接决定着最终的效果。

尤其做SFT,模型框架基本不用改(事实上也改不动),如何做一份符合自己场景高质量的SFT数据成了唯一且核心的工作。

之前笔者已经写过几篇来强调数据的重要性以及业界如何自动做数据的文章,比较有参考性,感兴趣的小伙伴可以穿梭:

《大模型时代下数据的重要性》:https://zhuanlan.zhihu.com/p/639207933

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

《怎么更好的训练一个会数学推理的LLM大模型呢?》:https://zhuanlan.zhihu.com/p/656665345

今天再给大家带来三篇如何自动筛选高质量数据的文章以及穿插在中间的笔者自己的一些讨论。

总的来说这些paper都是做SFT数据比较有参考意义的,大家可以收藏反复琢磨研究进而抽象理论。

MoDS: Model-oriented Data Selection for Instruction Tuning

论文地址:https://arxiv.org/pdf/2311.15653.pdf

注意这篇文章的出发点是在给定一个LLM的前提下,如何筛选出适合当前给定这个LLM的高质量数据,也就是说高质量是和模型深度绑定的,这也是比较trick的做法。适合自己的才是最好的,对于不同的模型想要学好,可能需要的数据是不完全一样的。

(1)标准

为了更具体量化什么是“高质量”,作者归纳了下面三个方面:

(a)质量: 高质量的prompt以及对应的高质量response可以很好的让模型学会遵循指令。

(b)覆盖率: prompt的多样性,越多样性越好

(c)必要性: 同一条prompt对不同基座模型的重要度和必要性是不一样的,如果一条prompt对于基座来说已经很好的输出response了,也就是说模型已经很好的遵循prompt了,不需要再训练了,相反则是模型需要的。

其中必要性这里是非常重要的,这也是为啥有一个很强的基座只需要很少很少的SFT数据就行了,大部分都能cover,而一个比较差的基座模型对很多prompt都天然不理解,也就需要海量的SFT数据来弥补自身天然的缺陷。总的来说前期不努力,后期就要努力,前期努力了后期也就会省事很多。

(2)具体筛选做法

好了,言归正传,既然定义好了上面三个维度,下面作者就逐个针对性的进行筛选

  • (a)Quality Evaluation

这部分主要就是基于模型打分筛选出高质量的SFT数据,具体的作者使用的模型是OpenAssistant/reward-model-deberta-v3-large-v2

链接为https://huggingface.co/OpenAssistant/reward-model-deberta-v3-large-v2/tree/main

部分打分case如下:

分数越高认为质量越高,最终是会选取一个门限值作为过滤。最终过滤得到High-Quality Instruction Data

不过笔者认为想要一个好的打分模型是非常难的,类似PPO中的reward model, 纠结什么是好?一份高质量的训练reward model的数据本身也是一个难题,而且reward model本身也不应该太小,应该和待最终训练的SFT模型规模大小相等甚至更大才能保证是“老师”给“学生”打分,一个好的reward model也是LLM的核心壁垒,甚至笔者认为,如果有一个好的打分模型就有了LLM的半壁江山,可以用来做评估、筛选数据等等用处,现在大家基本还是用GPT4来打分。

如果想训练某一个垂直方向的reward model,还可以针对性的准备样本,因为什么是“好”比较明确定义比如安全、比如做对题。如果想做一个通用的reward model,这件事本身难度就非常高甚至目前就不可行,因为通用的“好”到底是什么本身就很难定义,太多标准和维度了,就算你定义了几个标准,把他认为是通用的了,甚至包含想了很多很多维度,但是终究还是不能包含全部,总会有遗漏,更不用说该这么具体落地准备样本了,比较难。

  • (b)Diverse Data Selection for Seed Instrucitons

经过上面过滤,可以得到一份高质量的SFT数据即High-Quality Instruction Data,本节的目的就是在这份高质量SFT数据集中继续过滤出一个子集,该子集的多样性要足够好,能表征整个数据集。

作者具体采用的手段就是k-Center Greedy算法

核心做法就是首先选一个初始点,然后每次迭代都选取离当前中心集合最远的点,最终得到一份Seed Instruction Data

  • (c) Augmented Data Selection

正如前面考虑的必要性,Seed Instruction Data中的每条prompt对模型来说不一定都是需要的,同样被Diverse Data Selection for Seed Instrucitons阶段过滤掉的样本也不一定是模型不需要的。

为此作者先用Seed Instruction Data训练了一下模型,然后用该模型去对High-Quality Instruction Data中的prompt进行推理得到response,然后同样用reward-model-deberta-v3-large-v2去打分筛选出得分低的那些样本,这些样本就是模型处理不好的,言外之意就是模型需要的样本,作者把这部分新筛选出了的样本叫做 augmented dataset

(3)训练模型和结果

作者使用Seed Instruction Data + augmented dataset 来训练模型,具体的作者选用的初始数据是Alpaca、HC3、alpaca-evol-instruct等等混合而成,最终得到一份量级为214526的数据集。

测试集的选取的也是来着Self-instruct、LIMA等多个知名开源数据集。最终的打分借助的是GPT4打分。

作者训练的是Llama2,结果如下:

最终筛选过后的4k数据就能达到不错的效果。

Active Instruction Tuning: Improving Cross-Task Generalization by Training on Prompt Sensitive Tasks

论文地址:https://arxiv.org/pdf/2311.00288.pdf

这篇论文是从任务这一粒度(本质也是样本)来出发的即,怎么更好的选择一个新任务来提高模型泛化性。

论文的具体做法是提出了一个Prompt Uncertainty概念,假设有一个原始样本对<prompt, response>,然后对prompt做一些扰动得到promot_v1,其中promot_v1还是要保留大部分prompt语义,然后将prompt和promot_v1分别传给模型,分别拿到response的输出,计算得到两者之间的likelihood值,该值即为Prompt Uncertainty。

这里的扰动作者采用的是随机drop掉部分单词。

作者的理论假设是:从上下文学习的鲁棒性角度来看,如果模型不能稳定地将任务指令映射到特定的潜在概念(response),那么它对相应任务的泛化能力是有限的。为了刻画量化这一假设,作者将其反映在对指令扰动的敏感性上,即假设在不确定prompt的任务上训练模型将提高其将prompt与特定潜在概念(任务)相关联的能力,从而在未见prompt的情况下获得更好的零样本性能。

作者将Prompt Uncertainty高的作为困难样本来进行active学习,为了说明当前方法的有效性,设计了三个baseline:Random Sampling即随机抽样任务、High Perplexity即在response上面高困惑度的任务、Low Perplexity即在response上面低困惑度的任务。

实验结果如下:可以看到当前方法是最好的。

除了Prompt Uncertainty,作者进一步算了Prediction Probability即模型对自己预测response的自信度。Prompt Uncertainty代表的是模型将一个prompt映射到特定概念的一致性,表明模型对任务的模糊性;Prompt Uncertainty表示模型执行任务的自信程度。有了这两个概念,作者将任务大概分为三类Easy、Difficult、Ambigous:

可以看到在Ambigous任务上可以有效的提高模型性能,而Easy、Difficult还不如随机抽取,特别是多加一些Easy任务还可以提高点,但是Difficult任务是没啥用的,作者认为这是因为Difficult太难了没法学。

说到这里不禁让笔者想到了WizardLM系列论文,他的核心是不断的进化出困难样本,而且很有效,本质原因就是既有简单样本又有困难样本,模型可以学到两者之间的diff也即有点对比学习的逻辑在里面,只学简单或者只学困难样本都是不行的,混在一起可能更好,甚至先学简单的,再学难的也可以尝试。话说这里的Ambigous样本是不是也有点混于简单和困难样本中间的味道呢?大家可以多想想,哈哈。

From Quantity to Quality: Boosting LLM Performance with Self-Guided Data Selection for Instruction Tuning

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

本篇论文提出了一个IFD指标来筛选过滤数据,成功的实现了只使用10%的原始数据便可达到不错效果,并且实验在Alpaca和WizardLM两个知名开源数据集上都得到了验证。

(1)方法

具体的论文是通过如下三步来实现:

  • Learning from Brief Experience

这一步主要目的就是先训练得到一个能够遵循基本指令的模型。具体做法就是将我们所有的SFT数据聚类,论文是聚了100个簇,然后从每个簇中心选10个代表样本,使用这些样本去训练基座模型(LLaMA )得到一个初版的SFT,具体的论文中给这个模型起名为brief pre-experienced model。

  • Evaluating Based on Experience

用第一步的模型便可以得到Conditioned Answer Score

可以看到其实该指标反应了在给定prompt的前提下,模型能够在多大程度上生成正确的response。

但是Conditioned Answer Score分越高并不一定真真就意味着越是困难样本(对模型来说),因为有可能response答案本身就很难(可以这么理解:即使模型很理解prompt了,也get到prompt的目的了,但就是因为缺乏知识,回答不上来),所以作者又计算了一个指标:

即衡量response答案本身的难度。

基于上面两个指标,便可得到本篇论文提出的核心量化指标IFD:

IFD的物理含义是prompt对于模型来说的困难度,该指标已在一定程度上消除了response答案本身的影响。

  • Retraining from Self-Guided Experience

这部分就很简单了,就是批量跑得到每个样本的IFD得分,然后选取较高得分(prompt困难样本)的样本,paper中称为cherry samples,用其重新训练模型。

(2)实验

作者在Alpaca和WizardLM都进行了实验,经过过滤漏斗分别是5%、10%

可以看到效果要好于使用全部样本。

同时作者进一步按照能力项拆开看各部分的影响

最终观察到的现象是在数学、代码、复杂任务上都会有性能损失,但在其他任务上都会有提高(这里也侧面反映出对于数学,代码等比较复杂的理科领域还是需要保证数据量级的,这也是一条咱们可以借鉴的宝贵经验。)

同时论文也做了不断加数据量看性能的变化,可以看到随机量级增大,模型的性能并没有带来限制的提升,甚至出现了下降,也侧面说明了IFD的重要性

为了进一步说明,论文又对比了几个baseline,一个是取低IFD分的(LOW IFD score),一个是取高Conditioned Answer Score(High CA),一个是随机取,通过LOW IFD score进一步佐证了IFD的有效性。

同时作者也对brief pre-experienced model做了消融,也即需要多少样本来训练brief pre-experienced model,可以看到当增加到300时有了一个显著的提升,但是再继续增加时没有带来特别明显受益,即进一步增加样本数量并不能使模型的性能更好。

作者进一步进行了可视化分析,红蓝分别代表高低IFD分,可以看到两者具有明显界限,为了更深入的观察,作者使用了K-means(K=100)进行聚类,并关注了10个代表性的聚类簇,其中一半与前5%的样本有显著重叠,另一半与最后5%的样本有显著重叠。低IFD分数样本主导的聚类簇基本是基础任务,如编辑标点符号、单词或句子,而高IFD分数的聚类簇是更深入、更复杂的任务如讲故事或阐明现象。作者认为这些深入的任务对于对齐大型语言模型至关重要。

总结

(1)数据广义的好坏(脱离模型)也即对于所有模型来说他都是坏样本或者好样本,这个筛选可以基于一些先验知识又或者reward model来做,这本质是和待训练模型是异步的。同时训练一个reward model尤其是通用的reward model是一件不易的事情。

(2)基于待训练模型进行筛选是一个不错的出发点,毕竟适合不适合自己只有自己最清楚,当前样本也只有当前模型认为重要才是真真的重要。那该怎么具体量化“重要”这一概念,无非就是两个角度:一个是prompt,一个是response。更具体来说就是一个二维象限。衡量的角度也有很多比如loss,不确定性等等,本质都是利用了生成token的概率,然后进行抽象组合,找到一个有效点加以区分样本。

(3)当前的方法目标都是减量,但是减量后基本上都是维持和原来一样的效果,当然IFD有一些提升的趋势(和用全量相比),如果你已经有资源甚至是已经在全量数据上训练过了又或者全量一把梭哈的代价也不大,这种情况下再做减量的性价比就要衡量一下了,因为做半天减量,最多也是保持和现在一样的效果(已经拿到了当前效果模型),除非期望减量能带来进一步效果的提升或为了后续迭代效率。

(4)除了上面介绍的方法,应该还会有更加抽象理论的方法将其统一,进行全面合理的解释,如果找到那是非常幸运的。

关注

欢迎关注,下期再见啦~

知乎,csdn,github,微信公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1298219.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++中STL的容器vector

文章目录 什么是vectorvector与普通顺序表不同的点 vector的成员函数operatoroperator[]begin与end与iteratorsize()capacityresizeemptyreservepush_backpop_backinserteraseswapclear成员变量 总结 什么是vector vector&#xff1a;是数据结构里面的顺序表&#xff0c;开辟一…

【MATLAB】基于EMD分解的信号去噪算法(基础版)

代码操作 【MATLAB】基于EMD分解的信号去噪算法&#xff08;基础版&#xff09; 代码的主要内容 基于EMD&#xff08;经验模态分解&#xff09;的信号去噪算法通常可以结合相关系数、信号的熵值或者方差贡献率来完成去噪处理。这些指标可以用于确定阈值&#xff0c;从而对信号…

WPF仿网易云搭建笔记(2):组件化开发

文章目录 前言专栏和Gitee仓库依赖属性实战&#xff1a;缩小&#xff0c;全屏&#xff0c;关闭按钮依赖属性操作封装主窗口传递this本身给TitleView标题控件主要代码MainWindow.xmalMainWindow.cs依赖属性方法封装TitleView.csTitleViewModelTitleViewModel实现效果 前言 这次…

FreeRTOS的内存管理方法(超详细)

内存管理 我们知道每次创建任务、队列、互斥锁、软件定时器、信号量或事件组时&#xff0c;RTOS 内核都需要 RAM &#xff0c; RAM 可以从 RTOS API 对象创建函数内的 RTOS 堆自动动态分配&#xff0c; 或者由应用程序编写者提供。 如果 RTOS 对象是动态创建的&#xff0c;那么…

Mac虚拟机CrossOver23破解版下载和许可证下载

CrossOver Mac Mac 和 Windows 系统之间的兼容工具。使 Mac 操作系统的用户可以运行 Windows 系统的应用&#xff0c;从办公软件、实用工具、游戏到设计软件&#xff0c; 您都可以在 Mac 程序和 Windows 程序之间随意切换。 系统要求 运行macOS的基于Intel或Apple Silicon 的…

99、NeRF ray space

CG相机模型 在图形学中最常用的相机模型的原理和小孔成像是类似的。 不同之处在于&#xff0c;如上图&#xff0c;小孔成像得到的图像是倒立的&#xff0c;但是我们希望得到的图像是正向的&#xff0c;因此&#xff0c;我们选择小孔前成像。 从 3D 到 2D 的投影&#xff0c;…

笔迹鉴定系统

用于笔迹鉴定书的生成。对于检材进行的特征采集&#xff0c;将采集到的特征自动排版&#xff0c;生成比对表&#xff0c;然后在比对表上进行标注。主要标注有&#xff1a;写法、笔顺、箭头、实线、虚线、左括号、右括号、上括号、下括号、运笔、注释、来源、折线、测量、矩形、…

iptables——建立linux安全体系

目录 一. 安全技术类型 二. linux防火墙 1. 按保护范围划分&#xff1a; 2. 按实现方式划分&#xff1a; 3. 按网络协议划分&#xff1a; 4. 防火墙原理 三. 防火墙工具——iptables 1. netfilter 中五个勾子函数和报文流向 数据包传输过程&#xff1a; ① .五表四链…

【2023传智杯-新增场次】第六届传智杯程序设计挑战赛AB组-DEF题复盘解题分析详解【JavaPythonC++解题笔记】

本文仅为【2023传智杯-第二场】第六届传智杯程序设计挑战赛-题目解题分析详解的解题个人笔记,个人解题分析记录。 本文包含:第六届传智杯程序设计挑战赛题目、解题思路分析、解题代码、解题代码详解 文章目录 一.前言二.赛题题目D题题目-E题题目-F题题目-二.赛题题解D题题解-…

个人博客网站如何实现https重定向(301)到http

对于个人网站站注册比较少的&#xff0c;服务器配置不是很好的&#xff0c;没必要https,https跳转到http是要时间的&#xff0c;会影响网站打开的速度。免费的https每年都要更换。个人博客网站https有一段时间了&#xff0c;而且很多页面都有收录排名&#xff0c;现在已去掉htt…

redis中使用事务保护数据完整性

事务是指一个执行过程&#xff0c;要么全部执行成功&#xff0c;要么失败什么都不改变。不会存在一部分成功一部分失败的情况&#xff0c;也就是事务的ACID四大特性&#xff08;原子性、一致性、隔离性、持久性&#xff09;。但是redis中的事务并不是严格意义上的事务&#xff…

Eclipse 4.30 正式发布 来看看有哪些值得期待的新特性

Eclipse 4.30 已正式发布&#xff0c;主要特性如下&#xff1a; 1、支持新的 Java 语言特性&#xff1a;包括 JEP 440: Record Patterns 和 JEP 441: Pattern Matching for Switch 2、针对 Java 编辑器的快速修复功能&#xff1a;包括添加默认 case、移除默认 case 和插入 br…

VGG模型

概念&#xff1a; CNN感受野 在卷积神经网络中&#xff0c;决定某一层输出结果中的一个元素所对应的输入层的区域大小&#xff0c;被称作感受野&#xff08;receptive field&#xff09;。通俗的解释是&#xff0c;输出feature map上的一个单元对应输入层上的区域大小。 VGG…

IntelliJ IDEA创建一个Maven项目

在IDEA中创建Maven项目&#xff0c;前提是已经安装配置好Maven环境 。 本文主要使用的是IntelliJ IDEA 2022.2.1 (Community Edition) 1.创建一个新project:File>Project 2.修改Maven配置&#xff1a;File>Settings>搜索maven 创建好的工程如下&#xff1a; src/main…

[ 蓝桥杯Web真题 ]-组课神器

目录 介绍 准备 目标 规定 思路 参考解法 介绍 在很多教育网站的平台上&#xff0c;课程的章节目录会使用树型组件呈现&#xff0c;为了方便调整菜单&#xff0c;前端工程师会为其赋予拖拽功能。本题需要在已提供的基础项目中&#xff0c;完成可拖拽树型组件的功能。 准…

【数据结构】——排序篇(上)

前言&#xff1a;前面我们已经学过了许许多多的排序方法&#xff0c;如冒泡排序&#xff0c;选择排序&#xff0c;堆排序等等&#xff0c;那么我们就来将排序的方法总结一下。 我们的排序方法包括以下几种&#xff0c;而快速排序和归并排序我们后面进行详细的讲解。 直接插入…

【SpringBoot】解析Springboot事件机制,事件发布和监听

解析Springboot事件机制&#xff0c;事件发布和监听 一、Spring的事件是什么二、使用步骤2.1 依赖处理2.2 定义事件实体类2.3 定义事件监听类2.4 事件发布 三、异步调用3.1 启用异步调用3.2 监听器方法上添加 Async 注解 一、Spring的事件是什么 Spring的事件监听&#xff08;…

Android 从assets读取文件装载成Bitmap,Kotlin

Android 从assets读取文件装载成Bitmap&#xff0c;Kotlin /*** fileName assets里面图片文件名*/fun readBitmapFromAssets(ctx: Context, fileName: String): Bitmap? {val assetManager: AssetManager ctx.assetsvar bitmap: Bitmap? nulltry {val inputStream assetMa…

自行编写一个简单的shell!

本文旨在编写一个简单的shell外壳程序&#xff01;功能类似于shell的一些基本操作&#xff01;虽然不能全部实现shell的一些功能&#xff01;但是通过此文章&#xff0c;自己写一个简单的shell程序也是不成问题&#xff01;并且通过此文章&#xff0c;可以让读者对linux中一些环…

实现一个简单的外卖系统

在这个技术飞速发展的时代&#xff0c;外卖系统已经成为人们生活中的一部分。通过一些简单的技术代码&#xff0c;我们可以搭建一个基本的外卖系统&#xff0c;让用户方便地选择、下单和支付。本文将使用Python和Flask框架为基础&#xff0c;演示一个简单的外卖系统的实现。 …