Unleashing Reasoning Capability of LLMs via Scalable Question Synthesis from Scratch

news/2025/1/12 13:10:54/文章来源:https://www.cnblogs.com/yanlishao/p/18520272

1. 概述

LLM的SFT数据合成工作不可避免的可以划分为多个阶段:

  1. 指令合成
  2. 响应合成
  3. 数据筛选。

本篇文章采用了传统LLM的训练过程(SFT+DPO)进行数据合成。

在领域专有模型(DeepSeekMath7B-RL,Qwen2-Math-7BInstruct)的基础上,

  1. 指令合成:通过QFT(即SFT)使得模型能够正确的生成要求的指令,再通过QPO(即DPO)的方式使得模型生成的指令更加精致(更困难 or 可以解决)
  2. 指令筛选:语言筛选(统一用英文)、可解决性筛选(保证问题可解决)、困难性筛选(筛选出过于简单的问题)
  3. 响应合成:通过领域专有模型(Qwen2-Math-7B-Instruct)进行Response生成
  4. 响应筛选:启发式规则筛选 + RM(InternLM2-7B-Reward)打分筛选

效果:部分metric逼近甚至超过闭源模型。

2. 方法

2.1 Qustion Fine-Tunning(QFT)

基座模型:SFT基于领域专有模型(DeepSeekMath-7B-RL、Qwen2-Math-7BInstruct)。

目的:使基座模型摒弃之前的习惯(根据Prompt生成Response),仅生成Question,不需要学习具体的知识分布等信息

SFT数据主要包括两部分:

  1. Prompt
  2. Response

Prompt部分仅使用:

<|begin of sentence|>User:

Response部分:
从GSM8K和MATH两个数据集中筛选了15K的数据。对于这部分数据执行了如下操作:

  1. 丢弃solution
  2. question尾部添加终止字符,表示生成结束。

2.2 QFT验证部分

笔者基于GSM8K和MATH分别对Qwen2-Math-7B进行QFT,生成两个模型:Qwen2-QFT-GSM8K and Qwen2-QFT-MATH。分别用这两个模型生成了10K的问题。问题难度分布如下图:

其中上面的部分是GSM8K和MATH数据集的问题难度分布,下面部分是合成数据的问题难度分布。难度评估标准在后面赘述细节。

可以看到合成数据的问题难度分布与训练数据集完全无关,基本达到SFT的预期(不是从领域专业模型中蒸馏问题)。

2.3 QPO

问题:QFT后的模型生成的Question存在两个方向的问题:

  1. 可解决性(生成的Question本身就是现实世界中不可能的,例如 1+1怎么等于3这种。)
  2. 困难性(生成的Question太简单了)

目标:优化上述两种情况

DPO数据构造:

  1. 负向数据:QFT后的模型,生成10K的Question
  2. 正向偏好数据:通过GPT-4o-mini对负向数据进行优化(两个方向),得到的结果作为正向偏好数据。

笔者实验了Qwen2-Math-7BInstruct和GPT-4o-mini作为正向偏好数据的生成器,对优化结果采用GPT-4o进行评估(Prompt见附录4.1.3, 4.1.4)。

  1. 可解决性方向同时使用了两者进行优化,可以发现GPT-4o-mini完胜。(Prompt见附录4.1.1)
  2. 困难性方向仅用了GPT-4o-mini进行优化,在复杂度上也有明显提升(Prompt见附录4.1.2)

因此,正向偏好数据使用GPT-4o-mini进行合成的。

DPO loss的设置:

其中\(y_w\)是正向偏好数据,\(y_l\)是负向数据。

2.4 问题筛选

2.4.1 语言筛选

仅保留英文问题。

2.4.2 可解决性筛选

尽管进行了DPO,合成数据仍存在不可解决现象,主要包括:

  1. 缺失条件、冗余条件、逻辑不一致导致的约束不佳类问题
  2. 现实世界不符的问题(例如,计算人数出现负数)

解决方式:double chek,通过Qwen2-Math-7B-Instruct再验证一次可解决性,Prompt为附录4.1.3所示

2.4.3 困难性采样

困难度打分是通过对同一问题,采用DeepseekMath-7B-RL模型进行回答,采样n次,其中回答的失败率进行打分的,失败率越高,表示问题越困难。

通过上面的方式对GSM8K和MATH进行打分,然后基于DeepseekMath-7B-Base训练了一个分类器,即在模型的最后一层后添加了一个打分模块。

其中\(h_l\)表示DeepseekMath-7B-Base的最后一层隐藏层,\(W\)\(b\)是最后打分模块的权重和bias(毕竟单层神经网络的表达式为\(y=Wx+b\)),\(L\)表示loss,是预测分数和真值分数的MSE。

最后实际上对于DeepSeekMath-QGen仅筛选掉了极简单的问题,对于Qwen2Math-QGen没有进行额外筛选

2.5 结果生成和评估

结果生成使用的模型:Qwen2-Math-7B-Instruct

生成方式:
(1)同一个问题生成5个Response,推理出正确答案的即被使用。(我猜测如果5个Response都是正确答案,应该也是RM打分)
(2)如果没有正确答案生成,则使用出现频率最高的答案作为正确答案,然后收集这个答案的所有Response作为候选集合。最后用RM获取候选集合中最优秀的。RM用的是InternLM2-7B-Reward。

3. 实验

本文通过以DeepSeekMath-7B-RL、Qwen2-Math-7BInstruct为基座,通过QFT和QPO生成了两个模型:

  1. Deepseek-QGen
  2. Qwen2-Math-QGen

进而通过这两个模型一共生成了1M(一共生成了2M,筛选后剩下1M)的问题,其中400K来自Deepseek-QGen,600K来自Qwen2-Math-QGen。然后通过第2章中的方法生成Response,构建了1M的SFT数据。

然后使用这部分数据对4个模型进行了SFT。分别是:

  1. Mistral-7B
  2. Llama3-8B
  3. DeepSeekMath-7B
  4. Qwen2-Math7B

评估标准:使用难度递增的4个数据集:

  1. GSM8K
  2. MATH
  3. College Math
  4. Olympiad Bench

比较零样本下 pass@1 (1次回答就准确的比率)。

结果如下:

  1. 效果最优,超越了之前的数据合成方法,甚至可以媲美闭源大模型(GPT-4系列)
  2. ScaleQuest随着数据量增大效果提升。(这部分,我没太看懂原论文的解释,太数学领域了),主要好似是看LLama-8B的那部分,数据集的size是不断上升的。

3.1 消融实验

注意:以下3个实验,不是在同一基座模型上SFT的,这是一个特别的点。

3.1.1 子步骤的有效性

Raw:通过指令进化的方式,生成新的问题和Response(这里没有细说,生成了1M的数据,保证数据量一致),使用的是Qwen2-Math-7B-Instruct。

左图是使用GPT-4o-mini 为不同模型生成问题的可解决性和困难性进行打分。 可以看到每一步都是有提升的。

右图是通过Raw、QFT、QPO、数据过滤,这四个过程生成的1M数据,对LLama3-8B微调,在4个数据集上的效果,也可以看到每一步都是有提升的。

3.1.2 问题生成的有效性

笔者对4个开源数据集保证Question不变,重新使用Qwen2-Math-7B-Instruct生成了Response。然后用这部分数据SFT了DeepSeekMath-7B,结果如下:

印证了Question生成的有效性,ScaleQuest生成的Question更优质。

3.1.3 使用多生成器提升了数据的多样性

本文使用了两个问题生成器:

  1. DSMath-QGen
  2. Qwen2-Math-QGen

分别生成了400K和600K的Question。

这里从两部分数据中,都只采样400K的数据,去SFT一个Mistral-7B。以及混合数据后采用400K(采样比例没提),去SFT一个Mistral-7B。效果如下:

笔者解释:

  1. DSMath-QGen生成的问题更简单,贴近现实
  2. Qwen2-Math-QGen生成的问题更复杂,具有挑战性。

进而提升了数据的多样性。

3.2 花销分析

数据合成使用了8 A100-40G-PCIe GPUs,跑了522.9 GPU hours。花销是全用GPT-4o生成同样量级数据的1/10.

4. 附录

4.1 QPO部分的Prompts

  1. 可解决性的优化Prompt

  1. 复杂性的优化Prompt

仔细看Prompt会发现和指令进化很类似。

  1. 可解决性检测的Prompt

  1. 复杂性分类的Prompt

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Azure Developer】VS Code打包Java maven Project 遇见 BUILD FAILURE

问题描述 在VS Code中创建的Java Maven项目,在进行项目打包时,遇见 BUILD FAILURE\lbimage> mvn -clean package [INFO] Scanning for projects... [INFO] [INFO] ----------------< org.yourcompany.yourproject:lbimage >----------------- [INFO] Building lbima…

项目经理在项目初期应如何界定项目范围

在项目初期,项目经理应该明确项目范围以确保成功。这包括确定项目目标、明确项目结果、识别主要利益相关者、进行需求收集、创建详细的工作分解结构(WBS)。其中,创建详细的工作分解结构是至关重要的步骤。WBS 将项目活动细分为可管理的任务,确保每个项目组件都得到适当的关…

[CSP-S 2024] 超速检测

前言 寄! 算法 计算超速区间 容易发现可以计算出每一辆车的超速区间 分讨策略大致如下void Calc(int Now) {if (Car[Now].v > V){if (Car[Now].a >= 0){Car[Now].Left = Car[Now].d, Car[Now].Right = L;return;}else{Car[Now].Left = Car[Now].d;Car[Now].Right = (int)…

ctfshow web入门 文件上传

Ctfshow Web入门 151查看源代码,发现只能上传.png的文件 用bp抓包.png的图片格式 添加一句话木马,文件格式修改成.php对于上传成功的后门代码, 直接通过hackbar发送post包利用php内置system()函数执行查看flag.php文件152 和上一题做题步骤一样但此题考点不同的是添加了后端…

什么是软件即服务(SaaS)

软件即服务(SaaS)作为一种基于云计算的软件交付模式,具有多租户架构、网络访问、定制化和灵活性、安全性和可靠性等特点。它在商业和个人生活中都有广泛的应用,帮助企业降低成本、提高效率和灵活性,同时为个人用户提供便捷和定制化的应用体验。一、软件即服务(SaaS)的定…

如何学习 C 语言

# 如何学习 C 语言 在探索如何学习 C 语言的旅程中,关键步骤包括理解语言基础、实践编程技巧、熟悉标准库、掌握数据结构与算法、以及参与项目实战。首先,深入理解C语言的基础是至关重要的,它不仅包括语法规则和基本数据类型,还涉及指针、内存管理等高级概念。实践编程技巧…

Python 迭代器和生成器的区别

Python 迭代器和生成器的区别:1.迭代器的定义与创;2.生成器的定义与创建;3.迭代器和生成器的使用场景;4.性能对比。通过比较和对比,本文旨在提供一个全面的视角,帮助读者理解何时使用迭代器和生成器,以及如何有效地在Python编程中利用这两种工具。1.迭代器的定义与创建 …

线上服务正常运行一段时间后就开始出现STW超过1秒的young gc是怎么回事

线上服务在一段正常运行后出现STW(Stop-The-World)超过1秒的young gc(垃圾收集)问题可能涉及多个方面的原因:一、内存分配与管理策略;二、GC算法与配置;三、对象生命周期管理;四、系统资源与环境;五、代码质量与优化。在这些方面中,Java虚拟机的内存管理和垃圾收集策…

WPS Excel中配置下拉多选(VBA)

网上找到两种方案,一种利用数据选择其他单元格,也就是在其他单元格建数据。需求是模板,不合适 这里我用的VBA,踩了挺多坑,详细说下 首先更新WPS为最新版,确保可用VBA和JSA  确定使用VBA还是JSA,两种语法不同VBA较老,语法可靠些,推荐(本文使用VBA)JSA为新引入JS,但…

manim边做边学--通用三维坐标系

ThreeDAxes是Manim中用于创建三维坐标系的类。 在数学、物理和工程等领域,三维坐标系的绘制是非常重要的。 ThreeDAxes使得用户能够在动画中直观地展示三维空间中的对象和关系,从而提高演示文稿和教学的效果。 ThreeDAxes提供了多种参数,如坐标轴的范围、长度、颜色、粗细等…

KubeSphere v4 应用商店配置指南

在 KubeSphere v4 版本中,为保持平台的简洁性,系统默认移除了内置应用商店中的应用。用户可以按照下列步骤进行手动配置和添加。注意:应用商店和扩展市场有所不同,扩展市场的使用方法将在后续文档中详细介绍。Helm Repo 源:安装过程中需要从源下载 Chart 包,确保源可用并…

Go语言的动态链接库(DLL)创建和使用

# Go语言的动态链接库(DLL)创建和使用 在讨论Go语言的动态链接库(DLL)创建和使用时,核心要点包括:创建DLL的步骤、调用DLL中的函数、跨平台兼容性问题、性能优化策略。创建DLL的步骤是理解和实践Go语言动态链接库的基础,涉及编写DLL源代码、编译为DLL文件以及确保DLL在目…