前言
投完ICML之后火急火燎的入门RL,花了一些时间把RLHF学了。后来在知乎上看到了很多优秀的开源R1复现项目,于是手痒痒啃了下比较火的两个开源项目准备自己实践一下,一个是Huggingface的Open-R1,一个是Logic-RL。由于Logic-RL基于Verl,模型推理和训练过程都是shard到不同显卡上的,Huggingface的GRPOTrainer是单独用一张显卡做vllm推理,所以我在浅尝Open-R1做数学题的训练之后转移到了Logic-RL上面。
因为是民科,手上只有四张降了功率的3090,我就拿0.5B的千问做的实验,中间遇到了不少问题。
探索0.5B模型在KK数据集上的强化学习训练
我使用了qwen-0.5B的instruct模型实验,我看logic-rl论文中instruct模型也可以复现出思维链增长。但这里选用instruct模型主要还是因为base模型很难训练。
1. 多余的reward会让模型变懒
我首先是使用了Logic-RL中原来配置的reward规则,在原版规则中,模型学会格式后会得到一定奖励,但很快模型的输出就变得很短
<think>The reasoning process here involves understanding the characteristics of knights and knaves, analyzing the statements made by each person, and determining who is a knight and who is a knave.</think>
<answer>Ethan is a knight, David is a knave, Samuel is a knight.</answer><|im_end|>
然后模型几乎不care回答是否正确,输出长度急剧下降到只有几十个的长度。于是我尝试更改规则,
仅当模型格式正确且回答正确的时候才有reward,其余情况都是最低分。
但令人没想到的模型依然只是水一下思考内容,然后在answer tag里输出答案,似乎只要遵循<think></think>的格式就会让模型放弃思考过程。我后来将格式reward中有关<think></think>的要求去掉了,在训练过程中就能顺利保留下来模型的思考过程。
2. 模型很难直接学习3ppl以上的问题
0.5B模型可能是太小了,直接混合3ppl-7ppl的数据集训练会导致reward一直在最低分附近震荡,然后一会就开始输出胡言乱语。训练开始没多久我就看到输出长度爆炸增长,我以为是长思维链的出现,但其实是模型错误预测token导致输出大段胡言乱语。
于是,我转换了2ppl的数据集,让模型在2ppl数据集上先进行10个step的学习,然后在3ppl数据集上进行20个step的学习,再换到4ppl上进行10个step,5ppl上训练10step,最后换到6ppl上进行长的RL训练。这类似于课程学习,但在训练结束后我是保存了模型之后在新的训练中加载保存的模型,所以相当于reference model被更新了。
这个过程中确实观察到了一些有意思的现象,例如
错误检查
2.Avery’s statement: If Jacob is a knight, then Avery must be a knave, regrettably (vice versa). Since Jacob is not a knight, there’s a contradiction here, indicating a mistake in our reasoning. Alternatively, if Jacob is a knight, Avery must be a knave, meaning Jacob cannot be the perfect knight according to her statements.
Recheck
So, the contradiction here comes from Scarlett being a knight. This means the first term is misleading. Let’s recheck the clues.
虽然感觉推理过程好像不是很对。。。
还有一些输出我没有保存,例如语言混杂,使用数学来解逻辑问题,以及使用什么蕴含树?来解决问题的过程也是有的。
3. 模型总是会收敛到一个极短的推理过程
这也是为什么说复现是失败的,虽然通过前面的修改模型能顺利学到6ppl的问题上,但是模型的推理过程总是会变得极为简单,我分别多次尝试了在预热训练(前面提到的课程学习)后在5ppl和6ppl的数据集,或者混合的数据集上训练,都会出现思维链随着准确度越来越高下降的过程
5ppl上长训练,思维链长度下降
6ppl上长训练,思维链长度下降
观察模型的输出,它最后都会收敛到一个固定的,甚至是错误的推理模式
To determine the identities of each character, we will analyze each statement step by step.
1)Avery’s statement: “Zoey is a knight if and only if Aiden is a knave.” Therefore, Zoey is a knave if Aiden is a knight.
2)Zoey’s statement: “Aria is not a knave.” Hence, Aria is a knight.
3)Lily’s statement: “Zoey is a knight and Aiden is a knight.” Therefore, Zoey is a knight.
4)Evelyn’s statement: “Aria is a knave or Lily is a knight.” Since Aria is a knight, Evelyn must be a knight.
5)Aria’s statement: “Evelyn is a knight or Avery is a knave.” Since Avery is a knight, Aria’s statement is true, so Aryan is a knight.
6)Aiden’s statement: “Avery is a knave.” Therefore, Aiden is a knave.
So, the identities of the characters are:
-Avery is a knave,
-Zoey is a knight,
-Lily is a knight,
-Evelyn is a knight,
-Aria is a knight,
-Aiden is a knight.
The final answer is:
<answer> (1) Avery is a knave, (2) Zoey is a knight, (3) Lily is a knight, (4) Evelyn is a knight, (5) Aria is a knight, (6) Aiden is a knight. </answer><|im_end|>
模型的回答固定为(1)总起,一步一步推理。(2)先重复每个人的话,在后面紧接着做推理。(3)给出答案。(4)在<answer> tag里给出答案。
但是,当我们仔细检查推理过程的时候,发现这个推理是错的,但答案是对的。例如第四条,Since Aria is a knight, Evelyn must be a knight,第五条Aryan名字都没出现过。当然最明显的,推理过程得到的结论,例如第六条Aiden is a Knave和答案Aiden is a knight根本也对不上。
虽然Logic-RL论文中Instruct模型也是经历了输出长度下降之后上升
图源Logic-RL: Unleashing LLM Reasoning with Rule-Based Reinforcement Learning
但是我这里并不能在下降后上升,因为在32次rollout中,模型的输出几乎都一模一样了,模型的最短回答和最长回答几乎都收敛了,即模型不再探索新的可能性,熵已经收敛了。
可能原因的讨论
我对于rule based reward+RL训练的理解是,这个过程类似于抽签+筛选。如果抽到了正确的回答,那模型就知道这一次它是做对了的,会继续往这个方向靠,如果回答错误就被惩罚,抛弃这个action,被筛选掉。我们不断抽签过程中,模型的某些行为会被我们保留下来并强化,某些行为会被我们抛弃。
那么首先是筛选过程可能不准确,例如某次回答中模型不思考或胡乱思考,直接猜答案,但是答案猜对了,得到了reward,另一次回答进行了详尽且前后consistent的推理,但不幸答案是错的,那么这个行为会被筛掉。
对于简单的问题,小模型可通过简短的推理,或者直接给出答案的方式做对题,那么这些行为都会被保留下来。但对于难的问题,小模型一开始会尝试使用长思维链解决这个问题,但因为能力不足,它总是答不对,那么长思考的行为就会被我们筛选掉。
总的来说,我感觉是我们抽不出来小模型使用长思维链做对题的签,所以导致思维链收敛到很短。而因为直接给答案做对题概率可能更大,模型对于思考过程几乎不完善,而直接去学从prompt到答案的映射。随着训练进行,模型在val set上的准确度是越来越高的,在我的训练步数内,5ppl上能达到33%,6ppl上能达到22%,且还没有饱和,所以它是有能力做对题,但肯定不是靠思维链做对题。
而大的模型本身应该就有抽出长思维链+正确答案的潜力,所以这个行为能被我们保留并强化,在训练后期,简单题(例如仅靠一次前向推理就能确定所有人的身份)被学完,而后,当rollout出模型依靠更长思维链解决难题的样本后模型自然就会往长思维链解决难题上靠。
总结
总的来说,这次做的几次实验都没成功,模型太小肯定是个问题。换个大一点的模型试试吧,不知道我的四张3090还能不能撑得住。
由于刚入坑RL,很多东西都是速成的,可能理解上有误,还请见谅。
(文:机器学习算法与自然语言处理)