自主学习-《Absolute Zero: Reinforced Self-play Reasoning with Zero Data》

1. 监督学习:需要人工给出推理过程;

2. RLVR: 推理过程由agent自我生成和学习,计算reward的gold值是环境或工具给出的,题目仍需要人工给出;

3. 本方法:题目也是agent自己生成的。(gold值仍需环境或工具给出)。

基本理论:

1. SFT的公式:(优化\theta,使得input prompt x生成推理c*和结果y*的概率最大化)

痛点:模型吸收了足够多的知识后,没有更强的模型可供生成数据了,人工来标注数据又太费钱;

2. Reinforcement Learning with Verifiable Rewards的公式:(波浪线表示采样;y是模型采样得到的结果,y*是ground truth结果, r是reward function)

3. 本方法的公式:

示意图:

learnability: 模型训练了该样本之后,变强了多少;(太简单,模型每次都答对,则该样本没价值;太难,模型每次都打错,则该样本也没价值)

本文中,z这个随机变量,是用当前的题目集合中采样几个得到的题目集合;

流程图:

借助python这个工具,进行了对propose结果的learnability打分,进行了对solve结果的正确性打分。这2个分数,共同更新模型参数。

proposer的reward,就是多次solve(蒙特卡洛展开)取分数的平均值:

solver的reward,就是答对了还是答错了:

1. Buffer初始化

只用1个输入和输出都是"hello world"的极简python程序作为seed,多次迭代生成和完善新seed。

induction的program,是从另2个task的seed集合里选取的program。

2. propose

每次propose,放在prompt里的seed子集,都是变化的,采样自总seed集合。

prompt里明确强调:生成和seed不一样的program。

3. 样本过滤

3.1 <program,input>执行后,不抛异常,且有输出结果,则通过;

3.2 安全性:program不能使用敏感包(os.sys, sys, util等)

3.3 确定性:多跑几次,结果都一样,才通过;(为避免里面用了随机数)

注意:对于<i,o>生成p的任务, 只用一半<i,o>去生成p,用所有的<i,o>去验证生成的p是否正确。目的:防止生成if input1 then output1 elif input2 then output2这种取巧的program。

4 生成结果验证正确性:<p,i>生成o的任务,比对o和正确答案o是否相同即可;<p,o>生成i的任务,用p和生成的i去执行,判断o和正确答案o是否相同(因为生成同一个o的i可能有多组);<i,o>生成p的任务,用p和所有的i依次生成o,判断o和正确答案o是否相同。

用的是python程序来判断,如下:

5. 优势函数,用的是相对的:

算法描述:

每轮(t):生成一批样本(B=64个)。从总样本池里(不是本轮t生成的这B个),进行solve。计算reward,更新模型。

<p, i, o, m>,m是为了让LLM从<i,o>推理p时,有更多信息来生成p,也就是“题目描述”。

评测:

在Qwen2.5-7B和Qwen2.5-7B-coder的基础上,进行的训练,得到2个训练后的模型。

使用了coding和math两组评测集。

效果:两者上都有大的提升。(math评测集上的好效果,说明coding能力的提升,对general推理能力的提升是有帮助的)。比人工编写的coding训练数据上训出的SOTA模型,在coding能力上还要略有提升!

Qwen2.5-7B-coder上训练的模型,效果比Qwen2.5-7B上训练的模型,效果要更好。

In-Distribution: 大的模型,训练到后面还在提升;小的模型,效果曲线开始扁平下降;Out-of-Distribution: 越大的base模型,效果提升越大。

观察到的现象:1. <p,o>生成i任务时,反复从<p,i>推理结果,自我纠正,再更换i继续推理;2. <p,i>生成o任务时,跟踪代码,记录中间数据结构的值;3. <i,o,m>生成p任务时,每一条<i,o>都进行验证;其中1的例子:

生成代码任务,生成的代码中夹杂着step-by-step planning注释。

越训练,生成的token长度越长(DeepSeek等工作里也说过这个现象)。

消融实验(ablation studies):3个task,选择性的去除某个或某几个,和没去除的,对比效果;结果显示,3个task都在,效果更好;

不使用动态采样例子放入prompt,则效果大幅下降;

让proposer不更新模型参数,只让solver更新模型参数,效果下降不大;

Prompt示例:

<p,i>生成o的任务,proposer:

<p,i>生成o的任务,solver:

proposer的prompt,强调:

1. 可执行;

2. 多样性;

3. 有一定难度(多步推理才能推出output;算法数据结构题);

4. 输出的确定性(避免random)

5. 安全性(避免使用指定的那些包)

6. 多样性(尽量跟prompt里的reference样例不同)

提示其先做plan,再输出结果。

<i,o>生成p任务,proposer也强调了生成i的可执行、多样性、难度等:

主实验:Qwen2.5-7B and Qwen2.5-7B-Coder(强); 次要实验:Qwen2.5-Coder-3B, Qwen2.5-Coder-14B(最强), Qwen2.5-14B, Llama-3.1-8B
训练数据:LLM自己生成的
评测数据:代码:HEval+, MBPP+, LCB; 数学:AME24, AME25, AMC, M500, Minva, Olypiad
算法:REINFORCE++

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值