作者丨涮月亮的谪仙人
' z2 h8 W0 q! H/ A" t来源丨https://zhuanlan.zhihu.com/p/21290410831
+ ]$ {1 d# m i6 }编辑丨极市平台 / K; Z! ]) ~; g2 x
项目代码可见:Unakar/Logic-RL(https://github.com/Unakar/Logic-RL),欢迎关注和star! / ?( f. _2 m3 h; s6 h9 c+ I/ Y
我们将开源完整的wandb曲线和训练日志,wandb report(https://wandb.ai/ustc_ai/GRPO_logic_KK/reports/GRPO-Zero--VmlldzoxMTIwOTYyNw?accessToken=gnbnl5mu5pwfww7gtwxymohg85w7d7vthvjvbl4w8yxg0a99vf1k22m11e61cvv8) E, V n% Q* v
在大四的最后一个寒假,和@AdusTinexl @ShadeCloak 两个小伙伴捣鼓出了点有意思的东西,非常开心,欢迎各位合作,指导! , T1 h% E, o6 C
先展示一下结果:
/ t4 _' k M& n. G4 J: b. J6 D# v+ j# d% E. @: M
基座模型Qwen 7B在测试集上只会基础的step by step逻辑。 3 T3 n" H- j- Q6 Z/ c! x" E9 O( x
无 Long CoT冷启动蒸馏,三阶段Rule Based RL后 (约400steps),模型学会了 7 }# y1 N5 d% z+ J' o1 K0 K" a
; ^( J9 o9 J3 U. ~5 Y( f- 迟疑 (标记当前不确定的step等后续验证),
& d/ U% N3 U7 h8 Z/ E - 多路径探索 (Les't test both possibilities),
2 w( G) T+ L: p4 y - 回溯之前的分析 (Analyze .. statement again),
# u% s3 {8 s% u4 r/ C& f5 T5 u - 阶段性总结 (Let's summarize, Now we have determined),' ]4 G1 O3 W( k1 Y6 _1 c
- Answer前习惯于最后一次验证答案(Let's verify all statements),4 m' _' ]! W- d+ R- _9 {
- Think时偶尔切换多语言作答 (训练数据纯英文的情况下,思考部分是中文,最后answer又切回英文)( @) \4 h" o) B* Z
测试集上性能也一举超越了gpt4o 的0.3,达到了 0.41的准确率,相比自身初始0.2 acc翻了一倍
$ c8 P! ]9 Q# e5 }7 G' O$ |; k非常漂亮的回复 3 Q+ r$ K Z& F" r! a
5 X0 L+ i+ p' x3 @& b% y+ O
- z6 E( v! A7 |# {4 R7 z$ U9 I7 Xdemo1:迟疑,回溯,总结,verify。训练后期模型总是倾向于在最后输出answer前,优先全部verify一遍。这些能力是RL训练涌现的,未加任何引导 1 N% C8 w+ T! a' T8 u! J+ P/ |
偶尔的多语言现象 * T( N' r) v$ k+ C- Z# y9 F" W# c
+ A- W# o7 U& B: D# X6 W$ }: j6 P' d# X- v; U) a A( i1 u" S
demo2: 多语言的例子,思考忽然说中文,最后为了格式奖励用英文做最终回答,回复是对的
& k( i( A: G# h
) F" t8 m& I( f- y4 |' H6 m
+ R' k. r" Q8 U2 O% n9 J+ Ydemo3:训练前模型原本的输出作为参考, 笨笨的也很可爱,看得出来是一点verify之类的基本思考单元也没有
) s4 b7 w, R; W: _Response长度增长
8 h5 {; K3 H# s& V& |) n- v) D; Z5 ^. J
8 z; a n4 D! ]7 @4 B7 t
Demo 4, Settings: prompt mean 276 tokens, origin response mean 400 tokens
* _: o- w6 V6 a/ }& O- P) J据我所知,这是第一个稳定实现输出长度大幅超越原始模型平均长度的(数据集prompt长度全部小于300 tokens,相比于基座模型原本输出的平均长度 400 tokens, 训练后期平均长度稳定在650 tokens,约50%的涨幅)
! `' U m6 t, s2 ]$ EReward曲线
8 d: X) x; n O' y8 U7 a我们设置了严苛的format reward和Answer Reward。
8 @" M- U s' ^' w1 dReward只有这两部分构成,避免任何reward hacking。 Q0 Y8 \& `6 x
我们编写了不少if else逻辑和正则。刚开始模型总能以匪夷所思的方式绕过我的预想,在和它一次次的斗智斗勇里完善了rule的编写 4 A6 m- u) x" k; M+ q; v
我们发现模型在学习format的时候,其实是一个快速收敛--逐渐崩坏--又忽然找回format的形式,与我们三阶段RL训练设置吻合。
' E3 C; ^7 y8 R8 h还有一个有趣的小发现,在中间阶段,模型似乎认为格式反而阻碍了它的思考:日志里看到不少例子,模型在tag开始后意识到自己犯错了,想重回进入思考模式,可惜被format reward狠狠惩罚了
( J3 i5 J4 l. Q B# a d
! k8 _/ b- A8 X" }9 ^% J
/ O! u+ A! k, q6 EDemo 5, 依次是平均reward, 全对的比例,格式错误比例,答案做错的比例 7 D p% r( R' J: v% u
基本Settings
, T: y$ e2 ]) Q1 l0 n( |5 f$ E, Z+ N
* u. b3 v) E' v% ]. U# J- u; X- U训练数据合成/ ]: w7 s; K4 j r
4 Q' d& t$ D5 o2 n3 K+ f
其实只有2K不到的训练数据集,完全由程序合成,确保对基座模型是OOD数据。 6 z+ k* J& b* a5 ^: G
其中逻辑问题类似老实人和骗子的益智题,老实人总说真话,骗子总说假话,下面N个人,各有各的表述,请判断谁是骗子。我们以此为例讲解实验细节。 I6 w9 y' F* a4 d+ m
可控性也不错,可以人为设置难度分级。测试下来gpt4o的acc在0.3左右,而3epoch的RL训练后,我们成功让qwen-7B达到了0.41。
7 {3 L: _+ O/ l. R0 n" y; Agpt4o和claude sonnet在这种逻辑题上的准确率出乎意料的低。我们选了一个合适的人数来控制难度,确保它高于qwen 7B当前的能力,但又不会过难(在8个人的情况下,qwen完全不能作答,RL训练曲线也堪比蜗牛爬。我们最后选取了5人作为基线) 1 ]% F0 T) w, Y6 s
模型基座选取0 t- s( I: t2 q: o$ @) S" W& i: l
9 y- X9 p" Q1 D+ j# Y& F6 s2 t
我们注意到deepseek官方开了一系列distill模型,测试下来感觉有点矫枉过正了,小参数量承载了超越其自身的推理能力。回复里的wait, alternatively这种字眼频率过高。
& |1 F3 }# w$ \ W4 {. JDeepseek distill系列选了qwen-math-7B作为基座。我们本来也是这个,后来发现这个模型有坑: 1 x. S9 X" ^5 d3 b
\! F9 A1 a& W) h' E
- 首先它指令跟随能力比较一般,很难学会format; l, M7 ~7 v2 G
- 其次,它说话老爱用python code解题,训练很难克服
+ G, q# i: h- d5 Z/ e/ c - 移除system prompt后,还是习惯用\box{}包裹answer,还是format不行
9 B! B$ ~* P& k/ m' e' i2 `/ I1 Y - Markdown味道太重,一板一眼的,Reasoning模型本应思想跳脱一些才是) `. X! m1 a% ]8 Y
我们训了几版RL,效果始终不好,最后决定放弃Qwen Math系列,Qwen 7B 1M就好
) z# e/ u3 f" dRL基本设置+ \# c3 t! L* C, P. N8 H
; G, C1 J, V+ m8 Z3 y' a
我们初始还是PPO,训练确实稳定,就是太慢了。Reinforce系列测试下来又快又好,显存还低,强烈推荐。 7 r1 c; v w: j. z: _8 o$ m
为了和deepseek对齐,我这里放出的所有结果都是GRPO Setting下的。 % [' r* C" U, y/ m
由于我只有四卡A100,跑实验相当费劲,坐等来个大佬资助我跑实验 () ! Z! x N+ e# |6 N
Train batch size只有8,Rollout先大后小 (32-64-16)
7 m: O6 I( R$ v8 D# A三阶段RL
$ ]3 o+ R* |0 b3 x3 f0 B; E) j$ d" _' e- f( E) c
我的经验是:高温采样+超大rollout Matters
" S( V8 Q% b; |# oStep1: 课程学习与格式遵循9 q5 p) }- d( k' G3 Y8 M' W
' N$ u) B9 e; f8 P% Y, c( N为了训练的平稳过渡,我们先用少量3人逻辑题做预热,使用默认采样设置。
# w- e% T1 x0 g- Y此阶段主要是学的格式,只要不遵守该规则,我们就施加很大的负面奖励。模型在10step训练里很快就能学会把format error降到0.1的占比
2 }' {2 |3 l4 M, I* o, Z& u伪变长:此阶段观察到极少量的response length ++,主要提升的是最短response的长度,max response长度基本没变,是反馈到mean length上是一个变长的过程。 4 K; @* v! }2 x& @4 Z
以及此阶段确实验证了Pure Rule Based RL有效性,Val acc一直在涨,不过不如SFT来收益来的快 4 X: b8 C9 C. Y
Step2:高温采样与大量rollout
" N: X& p1 P* ?& w
+ h+ d/ ?: _: u' b数据集过渡到正式的5人谜题,此阶段训练持续最长。也是最容易崩溃的时候。
- L5 C* [' Z }! b, [$ w/ [我训了14版超参,都是崩坏的,泪目,下面讲讲一些好玩的崩坏demo。
C) a* c! _7 ?尝试将采样温度设置为1.2附近。(实测1.5会崩,1.5什么鸟语言都蹦出来了)。topp和topk也调了一下,主要目的是紊乱模型回复格式,破坏其markdown的输出风格,增加token多样性。
: m# p3 g T9 s$ \' }下图是截取的模型一个很有意思的repeat现象,可以看得出来,RL极大地增加了verify token被chosen的概率,这纯粹是自发形成的。数据集没有任何verify相关的思考token。
$ P- Y) ?% X2 k4 T* v# ?1. 模型的呓语:它想verify, 要precise, 注意consistent执念很深 4 S/ k# z* [3 e( \9 o( J
. ]$ k- s. h+ Z, d& v( `
/ s9 q. S, {0 }% v( s2. Retrying too late,但没有后悔药可以吃 % O& k0 \6 g- r, z
模型已经到达最后需要输出结果的answer阶段了,忽然意识到自己前面犯了错,想重回think模式,但是retry太晚了,这样的行为会被给予严厉的负format惩罚 r U6 l% X: l4 I) o9 j7 K! u1 _
+ t8 G# \. N4 g5 N3 D% c5 _
) X* M4 n& Y; M3 Y7 i
3. 忽然学会了正确地verify,以及先总结初步结论再做进一步探索,但思考过程还是比较简陋
: G: k1 P3 R ?2 V5 A# {. @, F4 O# N( f5 Z
e- ]6 E) l& k. u0 E这里有很多有意思的设置小细节和中间输出的观察,非常值得深入探索 - ]7 m y7 Z5 D3 c- r. e3 S
请等后续,几周内我们会写好完整文章~
: A9 n7 P- ?1 J, g2 U" I! }Step3: 漫长的退火4 D# r# B$ _/ e+ g
3 O( r/ ? w, [, u7 c+ F) v采样设置里逐步回归正规,比如温度从1.2慢慢降到0.9。 / g7 e. [8 ?! Z* K) w+ h+ y P
此阶段模型的输出如demo1所示,非常的成熟,有verify,有反思,有回溯,有格式,要啥有啥,我很满意的。 4 T! | p& q7 R- K) K
整体思考并不冗长,废话也不多,比distill模型的回复看起来正常多了。 + l4 s4 [# r/ Y4 Q
学习率也逐级递减到了2e-7。此阶段模型收敛速度贼慢,但多等一会,会有很多惊喜。还是让它训着吧。
" Y. W- ^$ Z/ ]; i. g$ [, d4 E奇怪的想法
, {5 q$ M& ~0 d. C: \( F- Z0 h9 |/ I3 k2 F
% Y6 y: d: F7 H% w4 s0 [* P5 u/ @5 [- 语言混杂的现象非常迷人。手动查找log,似乎后期每个语言混杂的response都是对的,难道对模型来说混合语言作答是更有利于它reasoning的pattern?
% I2 p D% g9 W1 A - 进一步地,谁说thinking porcess一定要是人类可读的,只要answer看得懂就行。如果答案对,我宁可中间全是乱码也无所谓(bushi)
! m& ]6 s s( m& A* y% d9 R3 e - 只要能从模型输出里恢复出人类要的答案,answer format其实也是不必要的,只是测试验证的难度大大增加了。看上去又回到了某种ORM的老路... V# v( n) K% A# q( c, a# V, a8 D
- Response增加是合理的。此前模型只会一路走到黑,多了几次verify和check后,自然长度增加: g$ Z- {% C o
- 泛化性:当前模型的思考能力实测是可以迁移到GSM8K的。由此展开或许可以跑一堆实验...8 [0 ]% E5 f% b# v5 j' ]# p* B! v% C
- 此外,本地存了一堆ckpt,坐等后续可解释性分析哈哈哈。之前一直想做Long CoT的可解释性,现在手头终于有一些ckpt随便测了,启动!$ Z, ]% U( E- v! v; C/ k3 J, Z
最后扯一句,Deepseek真是越来越强了,眼睁睁看着从deepseek v2开始,成长到过年期间发现街头巷尾都在讨论它。逐渐变成了攀不上的模样(可能最早期我bar也不够)。欸,真想去deepseek实习看看。春节最快乐的事情,就是看着zero模型RL曲线嘎嘎地涨! |