链载Ai

标题: OpenAI o1技术初探3:如何让模型拥有自我纠错的能力 [打印本页]

作者: 链载Ai    时间: 昨天 11:35
标题: OpenAI o1技术初探3:如何让模型拥有自我纠错的能力

在这个系列之前的文章中:

在这篇文章中,我们来探索另一块更好玩的积木:“o1是如何拥有自我纠错的能力的?”在下文中,我会基于自己的猜想,把o1的这种self-correction的能力与基于强化学习的post-training过程,以及我们上篇中所说的MCTS过程串起来。同样,这也是我在阅读相关论文,及观察o1输出结果demo后给出的自己的猜想,具有强主观性,大家选择性阅读。

一、o1 demo中体现的自我纠错能力

在openai o1官网的例子中(https://openai.com/index/learning-to-reason-with-llms/),当我们展开模型回复结果里thought for xx seconds选项时,我们可以看见模型在推理过程中的整个思维链过程,这时我们会发现一个有趣的规律,o1在思考时展现了【自我纠错】的能力,例如:

User_question:xxxx

o1:
xxxxxx,Butwait,xxxxxx
Alternatively,xxxxx,hmmbut,xxxx
Alternatively,xxxxx

我们观察到,o1有时会在提出一系列的分析后,对这串分析进行自我验证(but wait),如果不对,那么就会采取别的思路(Alternatively)。我观察到Alternatively里这个单词在o1切换方案时频繁出现,估计就是训练时给的prompt模版之一。

那么有趣的问题来了:模型是怎么知道自己可能做地不太对?

如果基于上篇我们讲MCTS的文章来说,假设模型在post-training或者之后的搜索优化中用到了MCTS,那么既然你都用了MCTS了,你肯定是指望它一下就能搜索到最佳的路径(这也是MCTS设计的初衷,如果错了还要重搜,说明这棵搜索树本身就训得不好)。同时,你也很难想象,在MCTS中,如果遇到了错误的结点(暂且不说怎么判断是“错”的),你该怎么做,难道要回退吗?又回退到哪个祖先结点才可以呢?

在我刚开始探索o1时,我同样有这样的困惑。因为我一直认为o1的training data模式是“self-generated(人工标注应该更多用在PRM的训练上) + 某种基于inference的优化方法帮助生成高质量训练数据”,所以如果想让训练数据里就有纠错信息,必然要在inference方法上做相应的考虑。在(痛苦地挠抓头皮)之后,我有了一些自己的猜想,所以下面,我们马上来循序渐进地回答这个有趣的问题。

二、从MCTS的角度看o1 demo的具体例子

在上一篇中,我们讲过MCTS通过模拟人类的思考方式所定义出的【行动空间】,那么现在我们结合o1官网的一个具体的例子,来看看如何把相似的思路用在上面。我们选用的是官网给出的【Science(化学)】问题样例,因为它的样例中涉及到了【自我纠错】(别的样例要么太长,要么没有)

【阅读本节前一定先看讲解MCTS的第二篇!】

2.1 原始问题

大致意思就是:求NH4F的0.1M溶液的PH值,给定了NH4+的Ka值(酸解离平衡常数)和Kb值(碱解离平衡常数)。

看不懂问题也没关系哈,不需要有什么化学知识,我们只关注o1回复中thoughts的规律。

2.2 rephrase(重述问题)

首先,o1执行了rephrase这个动作,把问题重述了一遍,特别地,它把原始问题中的一些重要的条件用Given这种形式再次明确了一遍。正如我们在MCTS篇中所说的,模型能做到这些是因为每个动作空间都配有一些特定的prompt。

2.3 propose subquestion and subanswer

接着,模型开始把复述过的问题分解成“子问题-子回答”,它提出的第一个subquestion是:

接下来它对这两个问题分别给出subanswers:

同样,subqs-subas也是在进行动作空间采样后,通过相关prompt指引生成的。同时回顾MCTS篇的讲解:这里不意味着rephrase之后一定接subqs-subas,在MCTS的rollout阶段这个动作空间是随机采样的,在推理阶段这个动作空间是基于价值函数做选择的。

2.4 emphasize

接下来,模型继续复述/强调了一遍原始问题。emphasize这个动作空间在MCTS讲解篇中没有,但是我们完全可以灵活地根据自己的需要和理解,去拆分o1 demo的动作空间。

2.5 propose original subanswer

接下来,针对这个被emphasize的问题,模型提出了第1个子回答,也就是去比较两个离子的酸碱程度:

但是显然,(也许在某种方法的判定下,我们后面就会来说这种方法可能的实现),模型觉得这个回答不够充分。(注意,这里用的形容词是“不充分”,而不是“错误”)

2.6 propose a self-corrected subanswer

于是,模型开始提出进一步修正上面的子回答(第一个alternatively出现了):

这个子回答的产生过程可能还包括一系列“提出假设-证明-得出假设结论是否正确”等一系列更精细的动作空间(表现在MCTS搜索树上就是一个或若干个结点),这里不再细拆。需要强调的是,模型还是通过某种方法,知道当前的解法可能还是不充分。

2.7 propose another self-corrected subanswer

所以,模型又提出了一种解法(又一个alternatively出现了),这回这个解法通过了模型那【某种方法】的验证,模型认为是可信的,于是step by step给出了接下来的所有结果(这里就不截图了)。这样,一个完整的思维链就出来了。模型最后根据原始问题+这个思维链,生成了给用户的最终答案。

好,在我们讨论【模型到底用什么方法来判断一个方案是否可行】前,我们来端详这个例子,看一个有趣的现象

根据这个现象,我们来猜想模型做判断的方法:

那么,谁来执行这种【判断方法】呢?是待训练的模型本身,还是可能引入一个新的模型来做这个判官?我个人认为是待训练的模型本身,因为之后我们还需要直接使用它来做用户推理,所以这个模型本身应该要能具备在给定采样动作的情况下去做修复的本领。也就是先让模型具备这种修复能力(这个能力不一定要很强,但得有),再讨论接下来的inference优化,结合两者更好产生self-generate的训练数据,以便用于后续可能的post-training相关优化中。

那么接下来,我们就来探索这种【判断方法】的一种可能的实现方式,它采用的是self-generated training data + 多轮post-training(RL)的方法。

三、判断结点是否进行self-corrected采样:以SCoRe为例

这里,我们借助deepmind在今年9月提出的SCoRe(Self-Correction via Reinforcement Learning)工作,来看模型做修正判断的一种方法(当然说起方法,这也是一块积木,实现方式有很多,这里只是给出一个我觉得合适的例子)。

直接来看SCoRe的整体运作流程:

(1)首先,

(2)基于这个基础模型,我们采用强化学习的方式,训练若干轮stage1,具体细节如下:

(2)在若干轮stage1的基础上,我们同样采用强化学习的方式,用更新后的模型,再进行若干轮stage2的训练,细节如下

(4)若干轮stage1 + 若干轮stage2交互训练,直到达到停止条件为止。






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5