作者丨涮月亮的谪仙人 . j$ _; {; O) W R- g
来源丨https://zhuanlan.zhihu.com/p/21290410831 4 P, O4 L, J" X, z( o9 S
编辑丨极市平台 4 O1 I. O9 M$ O
项目代码可见:Unakar/Logic-RL(https://github.com/Unakar/Logic-RL),欢迎关注和star!
3 B$ t$ r8 ~8 L1 p' W, y2 A/ B6 p我们将开源完整的wandb曲线和训练日志,wandb report(https://wandb.ai/ustc_ai/GRPO_logic_KK/reports/GRPO-Zero--VmlldzoxMTIwOTYyNw?accessToken=gnbnl5mu5pwfww7gtwxymohg85w7d7vthvjvbl4w8yxg0a99vf1k22m11e61cvv8)
! i/ f+ W" n) {; d" ^+ B8 N7 j3 l) X在大四的最后一个寒假,和@AdusTinexl @ShadeCloak 两个小伙伴捣鼓出了点有意思的东西,非常开心,欢迎各位合作,指导! , i1 v" C, @# d1 d$ ^% Q5 a* a
先展示一下结果:
1 O' @3 b: G* P2 l$ `
& x6 x3 ]9 H0 C- p8 Z" g2 p7 q9 L基座模型Qwen 7B在测试集上只会基础的step by step逻辑。
! M: J/ n J1 d0 Y3 x无 Long CoT冷启动蒸馏,三阶段Rule Based RL后 (约400steps),模型学会了
. c/ A. O! M+ V, u* r+ _, I8 H$ k8 L0 A
- 迟疑 (标记当前不确定的step等后续验证),/ g8 P3 c1 t8 K9 G( `
- 多路径探索 (Les't test both possibilities),
" W# b( v% \. E+ v. ` - 回溯之前的分析 (Analyze .. statement again), q) y" u- z7 r& g. d4 @' \& S) q
- 阶段性总结 (Let's summarize, Now we have determined),
2 @: Y2 `9 I5 i3 O) F - Answer前习惯于最后一次验证答案(Let's verify all statements),, O' Q1 {7 C3 A, v/ h U9 v8 \
- Think时偶尔切换多语言作答 (训练数据纯英文的情况下,思考部分是中文,最后answer又切回英文)$ R9 s+ T) Z- }& e
测试集上性能也一举超越了gpt4o 的0.3,达到了 0.41的准确率,相比自身初始0.2 acc翻了一倍
* J; a2 `6 K+ O( d% b非常漂亮的回复
6 H2 \$ E1 o! e V5 L9 C0 Z: e. R- s, n2 }7 X
( n: s/ X% ?' Y1 _
demo1:迟疑,回溯,总结,verify。训练后期模型总是倾向于在最后输出answer前,优先全部verify一遍。这些能力是RL训练涌现的,未加任何引导 ?7 L o( d5 ^, ~
偶尔的多语言现象 2 q Q6 T0 L5 K' w, Q& n2 @
' r$ i( z4 X- M% _" V# u# r: U h* o* ?% p, `& J) v
demo2: 多语言的例子,思考忽然说中文,最后为了格式奖励用英文做最终回答,回复是对的
* E+ \/ |# ]) r# V. n# \% @9 f( E9 l! V
! l: h; n/ f" M- Y) R4 v% R! f* cdemo3:训练前模型原本的输出作为参考, 笨笨的也很可爱,看得出来是一点verify之类的基本思考单元也没有
7 h0 ]5 L2 N$ `3 {1 lResponse长度增长 & _1 d5 | V( |% I a
3 `0 \) a8 ~* ~& ] M8 r3 f
1 R7 r* B+ r, Q& n0 G: C% Q. F$ H
Demo 4, Settings: prompt mean 276 tokens, origin response mean 400 tokens 5 h. A8 E9 G: I+ L, o+ t+ c
据我所知,这是第一个稳定实现输出长度大幅超越原始模型平均长度的(数据集prompt长度全部小于300 tokens,相比于基座模型原本输出的平均长度 400 tokens, 训练后期平均长度稳定在650 tokens,约50%的涨幅) # A g7 E0 n* p5 v+ H$ @' ?
Reward曲线
/ g( \1 W( U- [我们设置了严苛的format reward和Answer Reward。
& R# z1 L) l# W! r$ o8 V |+ p. oReward只有这两部分构成,避免任何reward hacking。
3 ^: _3 N0 ]. L) `' h我们编写了不少if else逻辑和正则。刚开始模型总能以匪夷所思的方式绕过我的预想,在和它一次次的斗智斗勇里完善了rule的编写 $ M0 I" {- t+ k) v1 |
我们发现模型在学习format的时候,其实是一个快速收敛--逐渐崩坏--又忽然找回format的形式,与我们三阶段RL训练设置吻合。
- U! v6 z$ q0 ^1 I B还有一个有趣的小发现,在中间阶段,模型似乎认为格式反而阻碍了它的思考:日志里看到不少例子,模型在tag开始后意识到自己犯错了,想重回进入思考模式,可惜被format reward狠狠惩罚了
% `0 O# a2 I" o7 o/ d
2 o) f& l. i! ^6 r1 J b+ I2 P4 N* k" |6 N& B/ M" \. h5 S
Demo 5, 依次是平均reward, 全对的比例,格式错误比例,答案做错的比例 # X6 I( p, @7 d& Y9 q k
基本Settings# h, F/ x1 z2 b5 X
/ M# R" H+ V2 V) m8 Z, s9 i训练数据合成4 B e7 d" ^% W' i* S0 L# [- g/ I
: n0 P& |" m5 e( z j7 y
其实只有2K不到的训练数据集,完全由程序合成,确保对基座模型是OOD数据。
4 o: H3 K+ M7 c, ]1 j8 ~其中逻辑问题类似老实人和骗子的益智题,老实人总说真话,骗子总说假话,下面N个人,各有各的表述,请判断谁是骗子。我们以此为例讲解实验细节。
! S2 p$ @5 w6 z+ c% x0 S/ V! _可控性也不错,可以人为设置难度分级。测试下来gpt4o的acc在0.3左右,而3epoch的RL训练后,我们成功让qwen-7B达到了0.41。
* |1 K! H7 ~9 S' Y8 \( B! B; C* Zgpt4o和claude sonnet在这种逻辑题上的准确率出乎意料的低。我们选了一个合适的人数来控制难度,确保它高于qwen 7B当前的能力,但又不会过难(在8个人的情况下,qwen完全不能作答,RL训练曲线也堪比蜗牛爬。我们最后选取了5人作为基线)
4 z# g; G) {1 p H: i1 y模型基座选取0 D* f; u2 o+ r4 [8 Z
9 N- s' n6 L5 d我们注意到deepseek官方开了一系列distill模型,测试下来感觉有点矫枉过正了,小参数量承载了超越其自身的推理能力。回复里的wait, alternatively这种字眼频率过高。
3 C8 S5 O6 G$ KDeepseek distill系列选了qwen-math-7B作为基座。我们本来也是这个,后来发现这个模型有坑:
; b1 u7 V0 I$ f; V+ O: a* C) w3 v- {3 J- \) Z
- 首先它指令跟随能力比较一般,很难学会format;
0 g5 ?9 N- p( `8 ?& \2 D" m; y - 其次,它说话老爱用python code解题,训练很难克服
, S) k7 M" X Z3 k. T4 E* c - 移除system prompt后,还是习惯用\box{}包裹answer,还是format不行2 }" _+ I' j2 O% z
- Markdown味道太重,一板一眼的,Reasoning模型本应思想跳脱一些才是' @! `9 s1 S* v7 @
我们训了几版RL,效果始终不好,最后决定放弃Qwen Math系列,Qwen 7B 1M就好
4 h' w7 D, [8 i0 V0 \RL基本设置; m! @* I' H& ~2 Z% p& I0 d
* K$ C9 Q7 _; A# x7 `6 M
我们初始还是PPO,训练确实稳定,就是太慢了。Reinforce系列测试下来又快又好,显存还低,强烈推荐。
1 c! l% m0 G; Z/ x, S为了和deepseek对齐,我这里放出的所有结果都是GRPO Setting下的。 7 i4 l% }& Y# Q$ m7 l; e% ^; ?( k
由于我只有四卡A100,跑实验相当费劲,坐等来个大佬资助我跑实验 ()
) u" }( l" n+ Z+ m1 k g1 JTrain batch size只有8,Rollout先大后小 (32-64-16) 0 q9 _9 n/ J2 r. q
三阶段RL
) X9 V* X- C" ^9 R
' Z5 H! K; y/ {% D9 v2 V" f我的经验是:高温采样+超大rollout Matters & F3 r2 T% w; B: M& |
Step1: 课程学习与格式遵循5 |. p2 r" q3 t0 m1 @5 X% ?7 V! b5 u
2 o/ Q0 L3 \$ W, h$ n% l为了训练的平稳过渡,我们先用少量3人逻辑题做预热,使用默认采样设置。 7 ~9 ]- _: ?3 J) U, i7 d r
此阶段主要是学的格式,只要不遵守该规则,我们就施加很大的负面奖励。模型在10step训练里很快就能学会把format error降到0.1的占比 * ~ a3 Y, {& y* O& [
伪变长:此阶段观察到极少量的response length ++,主要提升的是最短response的长度,max response长度基本没变,是反馈到mean length上是一个变长的过程。
' G2 z/ h) m; ^7 I' ?' g' L以及此阶段确实验证了Pure Rule Based RL有效性,Val acc一直在涨,不过不如SFT来收益来的快 6 _7 w# E R' m! F, P
Step2:高温采样与大量rollout
2 `: R7 \3 e' Z s% I9 w0 a ~) c0 }! x7 @8 a3 Q% {
数据集过渡到正式的5人谜题,此阶段训练持续最长。也是最容易崩溃的时候。
) L& L! G) a: P我训了14版超参,都是崩坏的,泪目,下面讲讲一些好玩的崩坏demo。
" V8 `+ i% {1 k尝试将采样温度设置为1.2附近。(实测1.5会崩,1.5什么鸟语言都蹦出来了)。topp和topk也调了一下,主要目的是紊乱模型回复格式,破坏其markdown的输出风格,增加token多样性。 J5 F8 a- {! I! K7 o
下图是截取的模型一个很有意思的repeat现象,可以看得出来,RL极大地增加了verify token被chosen的概率,这纯粹是自发形成的。数据集没有任何verify相关的思考token。 ' v/ B6 F6 F) T( H
1. 模型的呓语:它想verify, 要precise, 注意consistent执念很深
( V6 I2 i' f7 j3 o2 ~" ^& q2 D% M4 _, O8 ?3 p0 {, ^9 r& e
" E& G$ a& l3 S5 |5 b7 V" f- d3 B1 g
2. Retrying too late,但没有后悔药可以吃
& k( I: f# m, R- z$ _模型已经到达最后需要输出结果的answer阶段了,忽然意识到自己前面犯了错,想重回think模式,但是retry太晚了,这样的行为会被给予严厉的负format惩罚 " \! ^# B4 a) v" N( u, ?- o
$ z. {# t3 u5 \$ H
: S1 V' m9 E8 m5 I- Z' g4 q3. 忽然学会了正确地verify,以及先总结初步结论再做进一步探索,但思考过程还是比较简陋
. |+ w: V: X- b; x2 b( l& y" m# N7 g% x' q' u* d. u3 k
, N E' g( i2 |$ c4 l( K2 `9 Q, P8 i
这里有很多有意思的设置小细节和中间输出的观察,非常值得深入探索 , e4 v# c6 O* k. G, L
请等后续,几周内我们会写好完整文章~
( C5 g. j& T1 o) p; U1 T2 ZStep3: 漫长的退火9 R: X# w& X/ d2 a& j. t# z
: C7 y) a) D1 t/ k, y5 Z采样设置里逐步回归正规,比如温度从1.2慢慢降到0.9。
! N) E6 { n1 N此阶段模型的输出如demo1所示,非常的成熟,有verify,有反思,有回溯,有格式,要啥有啥,我很满意的。
0 d' C4 |6 {/ L7 h' `& I整体思考并不冗长,废话也不多,比distill模型的回复看起来正常多了。 & Z7 V+ [( T: A# o# o* U& r5 \
学习率也逐级递减到了2e-7。此阶段模型收敛速度贼慢,但多等一会,会有很多惊喜。还是让它训着吧。 ) y7 G, B/ C" w" g& M/ j, V
奇怪的想法
0 A0 K& H: w+ @; m6 D- W' j% r3 `7 s- l/ {+ \0 w3 _0 n
" b [( J# [9 ~- r' V- o
- 语言混杂的现象非常迷人。手动查找log,似乎后期每个语言混杂的response都是对的,难道对模型来说混合语言作答是更有利于它reasoning的pattern?6 y6 H! E& v0 G* b: z0 B
- 进一步地,谁说thinking porcess一定要是人类可读的,只要answer看得懂就行。如果答案对,我宁可中间全是乱码也无所谓(bushi)
" M7 V# r( w% i0 X& a - 只要能从模型输出里恢复出人类要的答案,answer format其实也是不必要的,只是测试验证的难度大大增加了。看上去又回到了某种ORM的老路..
2 g+ b2 A* i3 }$ D, j - Response增加是合理的。此前模型只会一路走到黑,多了几次verify和check后,自然长度增加7 y% t: n9 s& k$ u, f$ k
- 泛化性:当前模型的思考能力实测是可以迁移到GSM8K的。由此展开或许可以跑一堆实验...
( k; z3 i9 P6 J9 D - 此外,本地存了一堆ckpt,坐等后续可解释性分析哈哈哈。之前一直想做Long CoT的可解释性,现在手头终于有一些ckpt随便测了,启动!
8 n) M4 _: N' n; R) } 最后扯一句,Deepseek真是越来越强了,眼睁睁看着从deepseek v2开始,成长到过年期间发现街头巷尾都在讨论它。逐渐变成了攀不上的模样(可能最早期我bar也不够)。欸,真想去deepseek实习看看。春节最快乐的事情,就是看着zero模型RL曲线嘎嘎地涨! |