正文
-
解法1:我直接做sft,把最正确的attempt放在输入序列最后,当作label进行训练即可
-
解法2:我用类似rlhf的方法,先有一个奖励模型,它能对每一个思考步骤做评估,然后利用这个评估结果,指引模型步步搜索,每一步都找到最佳的思考步骤,最后不就能找到答案了?
这两种解法,
仅从训练方法上来说,都可以算成是post-training
,也就是我们通过把算力花在post-training上来提升模型的逻辑推理能力。
可是,本文的标题不是【把算力花在inference上】吗?inference在哪里呢?我们再重新端详这2种解法
:
-
假设我们使用解法1或者解法2 post training好了模型,现在我们拿它做推理。模型吃一个问题,产出一系列中间结果和答案,
但是你能保证,这些中间结果和答案一定是最好的吗?
-
而此时,如果我们能有一个可以用来评估中间步骤好坏的verifier(比如解法2中的奖励模型),那么我们是不是就能在在使用这些post-training过的模型做推理时,更好指引模型步步产出更好的结果
?例如,我们对一个问题采样多个attempts链,从中找最好的。或者在单个attempts中找到最好的attempt,诸如此类。
-
或者说,假设我们在post-training阶段,使用这个verifier来指导模型
自动化
产生高质量的训练数据(这是个inference步骤),基于这些数据我们再做对齐。那么或许我们就能直接信任post-training的结果了。
所以,【优化推理输出】这一部分,你可以把算力全部花在post-training上,也可以花在post-training+inference上,从o1的技术报告上看,它应该选择了后者,同时post-training选择了某种基于强化学习的方法(
其实o1在pretrain阶段应该也有变动,具体的分析我们在后文中会通过实验数据给出猜想
)。至此,我们就把问题1和问题2都回答清楚了。
在理解了这些的基础上,我们就大概知道
【框架】
长什么样,具体而言:
-
首先,我们需要引导模型从“只产生结果”变成“同时产生中间步骤和结果”,这个过程称为post-training,这个过程里,你既可以使用基于强化学习的技术,也可以只做sft微调。你既可以只关注模型是否遵循了格式(即只关注是否产出了中间结果,而不关注中间结果的质量),也可以同时关注格式+中间结果质量
-
其次,我们需要训练一个能够评估中间结果的verifier,这其实也算post-training的一部分。这个verifier既可以被用在基于强化学习的post-training中(但它不一定是唯一的价值评估模型),也可以被用在第3步的inference阶段中引导搜索。
-
接着,我们需要设计一种搜索方法。它能够根据verifier返回的中间结果评估分数,在推理阶段更好指引模型做步步搜索,以达到思考的每一步都能最优化。(如果在post-training阶段,你只关注格式,那么inference阶段应用这种搜索方法就能更好指引搜索结果;如果你已经关注了格式+质量,这种方法也依然能达到更上一层楼的效果)。同时注意,如果在post-training阶段我们已经使用了基于强化学习的方案,那么这种搜索方法同样也能用在模型生产“经验数据”的阶段,这样可以
在自产自消的基础上,动化筛选高质量的数据集再做对齐
(避开人类标注,不是必须,但如果做得好的话,inference可能只需要在post-training阶段使用,目的是筛选高质量数据,而不需要在post-training后再做使用了)。
有了对框架的理解,接下来我们就来看deepmind基于这个框架做的两种方案:
-
方法一:利用PRM(Process-supervised Reward Model)指引搜索
-
post-training:只引导模型对齐格式 + 训练基于过程的verifier(PRM)
-
-
方法二:通过sft直接改变模型的输出分布(Revise proposal distribution)
-
post-training:通过sft方式引导对齐格式 + 保障中间结果基本质量 + 训练基于过程的verifier(PRM),这里直接用了的方案一中的PRM。
-
其中,方案一着重探讨训练PRM的一般方法和搜索过程的设计。方案二则给出sft型post training的一个例子。如果只看原始论文,我们很容易把这两种方案理解成Test/Inference scaling law的两方面。但是在我们总结出【框架】的基础上,就可以发现其实它们讲的是同一件事情,只是描述的侧重点不一样。
【注⚠️⚠️:本节内容打破了原始论文的逻辑结构,含有大量笔者的主观理解,大家选择性阅读】
二、方法一:利用PRM指引搜索
这种方法的主要目的,是通过训练一个
能够评估过程数据的奖励模型(Process-supervised Reward Model,PRM。与之相对应的是基于结果做评估的ORM,outcome-supervised Reward Model)
,来引导模型在推理阶段更好搜索出最佳答案。具体步骤如下:
-
格式训练
:先对模型做sft,使其能够产出带有过程数据的结果
-
训练PRM
:训练一个能够评估过程的verifier,我们称其为PRM
-
使用PRM指导搜索过程
:利用训练好的PRM,引导模型搜索出最佳答案。
我们来细看这三点。
2.1 格式训练
对于一个不做任何处理的基础模型,我们喂给它一个问题时,它一般会直接把答案吐给我们。
现在,我们希望引导模型在给出答案前,花更多的时间进行“思考”,也就是说,我们希望模型按照“思考步骤 + 回答”的这种格式,返回给我们response。
所以在这里我们需要先对模型做格式finetune。具体的方法是:
-
自生产数据
:在prompt中添加格式例子,引导模型按我们想要的格式产出结果。例如,我们可以按照一个思考步骤(step)一行的方式要求模型(正如lets verify step by step这篇论文说的一样)。我们把这些结果添加进sft数据集
-
sft
:使用这批自动化构建的sft数据集,微调模型,使其在之后回答问题时,都能按照“思考步骤+回答”的方式生成数据。
注意,这个sft过程仅仅是侧重于格式微调,并不关注思考步骤的质量
。思考步骤的质量是我们在后续过程中要考虑的事情。
2.2 训练PRM
现在,我们的模型已经能在生成结果里产出“思考步骤”数据了。我们需要训练一个能够评估这些steps的奖励模型,也就是
PRM(Process-supervised Reward Model)
。
有“supervised”,必然需要带有label的数据,也就是对于每个step,我们需要给它一个真值评分
。那么根据你是【超级有钱人】【有钱人】【一般有钱人】(能训得起来的都不算穷),我们有不同的构造方法。
(1)【超级有钱人】
-
直接调用格式微调后的模型,喂它吃一波问题,产出一波“steps + 回答”的数据(数据量级庞大)
-
让人工对steps打label(例如positive/negative/neural)。
这种方法除了昂贵和耗时,似乎没有别的缺点。
(2)【有钱人】
比起粗暴地将一堆数据打包给人工做标注,我们可不可以通过某种方式做细节筛选,只送那些我们认为有价值的数据给人工做标注呢?
-
直接调用格式微调后的模型,喂它吃一波问题,产出一波“steps + 回答”的数据(数据量级不大)