❝
一句话概括:穷哥们的强化学习指南——不用额外算力养裁判模型,靠参考答案的"自信即真理"也能弯道超车
第一阶段:识别核心概念
论文的motivation分析
这篇论文关注的是如何让大型语言模型(LLM)在需要推理的场景中得到进一步提升。现有做法往往依赖于所谓“可验证的奖励”(例如数学、代码领域可以通过测试用例或规则判定正误),并采用一种被称为“R1-Zero风格”的强化学习方式来训练模型。这种方法在数学、代码等有明确对错判断的领域确实取得了显著进展。但现实中很多领域(如化学、医疗、工程、法律、商业、经济等)并不像数学或代码那样能轻易用规则做自动验证,一旦没有了可验证的标准,就无法直接给模型准确的奖励信号。
因此,论文的出发点是:能否在没有明确“判定器”(verifier)的前提下,让LLM也获得像R1-Zero那样的推理能力提升? 这就是论文提出“VeriFree”方法的核心动机。它希望在保留强化学习训练理念的同时,不再依赖人工规则或额外的大模型作为验证者,从而让这类“强化学习式推理训练”能推广到更多真实世界的复杂领域。
论文主要贡献点分析
列出论文声称的主要创新点
根据论文内容,可以总结出以下几个主要创新点:
- 提出一个不需要显式“验证器”的强化学习方法(VeriFree): 传统的做法是使用一个“额外的判定器”或“额外的语言模型”去判断答案正确与否,然后把这个判定结果作为奖励进行RL训练。VeriFree跳过了这个外部判定器环节,直接利用模型对“参考答案”的自洽程度来给自己提供训练信号。
- 理论上证明该方法在唯一正确答案场景下,与“有验证器”的方式目标等价: 作者在文中阐述了一个关键观点:如果只有一个唯一正确答案,那么VeriFree和“有验证器”的强化学习方式在期望意义上能达到相同的优化目标,而且还能降低估计的方差,让训练更加稳定。
- 在多项任务和数据集上,VeriFree的效果能够媲美甚至超越使用显式验证器的做法: 论文在MMLU-Pro、GPQA、SuperGPQA以及一些数学推理基准上做了大量实验,结果显示VeriFree不但能达到与“带验证器”的强化学习近似的水平,有时还会有更好表现,而且在实践和资源占用方面更具优势(因为不需要额外加载一个强大的判定模型)。
- 为一般推理提供了一种新的思路: 过去的强化学习+链式思考训练更多聚焦在那些可验证环境中(如代码、数学)。这篇论文展示了如何将类似思路“移植”到更宽泛、更难以自动判断正误的场景,并用相对简单的概率方法替代了显式的判定过程。
找出支撑这些创新的关键技术或方法
从技术角度看,论文的核心创新可以概括为:把“模型在特定推理过程后对参考答案的概率”作为一种连续的奖励信号,既能进行策略梯度训练,又能做一定程度的监督学习。这个思路是他们摆脱显式判定器的关键。
论文有哪些显著性的结果
在结果层面,最显著的意义在于:
- 给行业提供了一套“通用推理”领域的强化学习训练新范式;
- 不再受制于必须找到“可执行判定脚本”或“另一个大型模型作裁判”;
- 理论和实验证明,这种思路并不会因省略判定器而明显牺牲性能,相反在一些场景里训练更稳定、更有效。
理解难点识别
分析哪些概念/方法是理解论文的关键
要想深入理解这篇论文,需要搞清楚以下几个核心概念和方法:
- R1-Zero风格强化学习在LLM推理中的应用: 这是论文的背景知识,包括如何把“模型生成的答案是否正确”当作奖励信号,以及如何通过策略梯度来更新LLM。这是论文想要扩展到更一般场景的基础。
- VeriFree核心思想:用“模型对参考答案的自信度”替代二进制判定结果: 这是全篇的核心:不再去拿一个外部工具判断对错,而是看“如果模型在生成完推理过程后,被迫把正确答案拼上去时,它对那个正确答案的内在‘概率’有多大”,把这当作训练的导向。
- 对比“有验证器”的做法如何等价,以及为什么方差更低: 文中给出的理论说明:在只有唯一正确答案的前提下,使用模型自身估计的“正确答案概率”去训练,与用二进制对错奖励的期望相同,但梯度估计会更平滑。这是一个难点:要理解为什么这两种方法在本质上类似,以及为什么减少了对额外判定模型的依赖反而可以在训练时更稳定。
- 在实践中如何拼接推理和答案,以及为什么要在“token化边界”处理得非常谨慎: 论文提到,要在语言模型输出的推理文本和最后答案之间进行一个精确的拼接过程,否则训练时就会出现偏差。这看似是工程细节,但其实很关键,尤其在大模型的token化机制下处理异常字符、特殊token时,会影响训练质量。
- 如何在没有“等价类”信息的情况下,仍然训练出强大的推理能力: 现实中有时答案不止一种表达方式,比如数学里“1.6”和“8/5”可能都对。如果训练数据只给一个参考答案,VeriFree会不会偏向参考答案的具体写法?论文在这方面也做了一些探讨和实验。理解它的处理方式能帮助读者知道在多种表述都算正确时,模型如何避免不必要的过拟合。
找出这些概念中最具挑战性的部分
这篇论文的理解难点主要集中在**“VeriFree”机制**如何同时扮演“策略优化”和“监督学习”这两个角色,以及它与传统有无验证器的对比关系上。
确定需要重点解释的核心概念
本论文最核心、最需要深入解释的概念就是**“VeriFree如何以参考答案的条件概率作为奖励信号,来替代显式的判定器”**。这一点囊括了以下要点:
- 它是如何把“生成的推理过程”与“参考答案”拼起来做自洽检测;
- 它为什么和二进制判定器在理论目标上可以等价;
- 它为什么还能降低训练时的方差;
- 它如何在没有外部判定器的场景下依然促进推理能力提升。
这一概念直接体现了论文的主要创新思路与理论基础,也是最能体现论文价值和难点之所在。
概念依赖关系
梳理核心概念之间的关系
从论文的结构和逻辑来看,可以把几个关键概念的关系梳理如下:
-
R1-Zero-style RL(背景):
-
- 这是最初的思路:有个外部的“对错判定”,把“正确答案”对应奖励1,否则0,然后用强化学习来更新模型。
-
Verifier(验证器/额外判定模型):
-
- 在没法用明确规则的领域里,可以用另一个大语言模型扮演“判定器”,但这带来额外依赖和麻烦。
-
VeriFree(论文提出的核心):
-
- 不用判定器,直接衡量模型对给定正确答案的匹配度或概率高低,就能给自己打分,相当于一个“自带评分”机制。
-
Token-level拼接策略:
-
- 在实现VeriFree的过程中,需要先把模型输出的推理部分“截断”,再手动拼上参考答案,让模型去计算这个“参考答案”的概率。这一工程技巧与VeriFree方法紧密相关。
-
实验与对比验证:
-
- 通过将VeriFree与“Verifier-based”方法在多个基准上做对比,展现其优势、学习效率及泛化能力。
确定解释的最佳切入点
一个合适的切入点通常是先介绍传统的“Verifier-based RL”是怎么做的,让读者理解其原理和痛点,然后再引出为什么VeriFree能绕过这些痛点,继而展开VeriFree的具体做法和推理原理。
第二阶段:深入解释核心概念
此阶段重点是引入比喻并将比喻和公式符号联系在一起
设计生活化比喻
选择一个日常场景或者容易理解的活动
生活场景:猜单词游戏
想象有这样一个场景:一个小朋友(相当于我们的“模型”)正玩“猜单词”游戏。
用这个比喻来展示核心机制是如何工作的
每次游戏流程是:
- 主持人(相当于我们给模型的“问题”)先给一个提示,比如一个特定主题(类似“这个单词与水果有关”)。
- 小朋友先在心中进行一番“推理”或“思考”——也就是试着想:“可能是苹果?香蕉?西瓜?葡萄?”等。这个过程对应我们论文里所说的**“生成推理过程()”**。
- 最后,小朋友需要大声说出一个“答案”(相当于最终输出)。在有外部裁判的时候,如果他猜中了,就被告知“对”并奖励,否则就是“错”没有奖励(这对应“有验证器”的做法)。 但现在,我们假设没有这个裁判,或者裁判的信息来源非常有限。我们只知道真正正确的单词(也就是游戏答案)是什么,但没人来告诉小朋友“猜对还是猜错”。我们想:能不能让小朋友在没有裁判判“对/错”的情况下,依然逐渐学会猜得更准?
现实中,如果只给小朋友最终正确单词,而没有“对错裁决”或“分数反馈”,一般是学不到东西的。但在VeriFree方法中,小朋友能够利用**自己对正确单词的“自信度”**来进行学习:他会想,“如果我脑子里推理了一番,最后发现真正的单词是apple
,那么根据我的推理过程,我对apple
这个单词的认可度(概率)有多高?”如果他很认可这个词,就表示这套推理过程是“对齐”正确答案的;反之,如果感觉说“apple”不符合自己推理过程(比如刚才心里一直想的是“圆形的热带水果,甜而多汁”,更像“pineapple”),那么他就知道“我需要调整一下推理”。
通过这个“自信度”——也就是“我对参考答案的内在认同感”——他就可以进行自我调整,慢慢让推理与正确答案越来越匹配,而不用有一个显式的裁判说“对”或“错”。
确保比喻简单且直观,最好是大多数人都熟悉的场景
“猜单词游戏”这个比喻相对简单直观,核心的“思考过程”和“最终答案”以及“外部反馈”等元素都易于理解。
建立比喻与实际技术的对应关系
列出比喻中的关键元素
- 主持人给的提示
- 小朋友先在脑中做一番推理
- 拼上真正正确的答案
- 衡量小朋友对正确答案的“自信度”
- 把自信度作为奖励
说明每个元素对应的实际技术概念
在这个猜单词游戏里:
- 主持人给的提示: 对应论文中的“输入问题()”。
- 小朋友先在脑中做一番推理: 对应论文中的“模型生成的推理过程()”。
- 拼上真正正确的答案: 在游戏里,相当于主持人最后把“其实正确答案就是
apple
”告诉小朋友,让他对比下自己的思路。对应技术中,就是“把参考答案()与模型生成的推理部分拼接在一起,让模型计算这串序列的概率”。 - 衡量小朋友对正确答案的“自信度”: 对应技术中,模型计算“”,即在给定问题与推理过程之后,模型对正确答案的条件概率。
- 把自信度作为奖励: 如果小朋友发现“我在推理之后,对
apple
的把握很大”,就会给自己的这条推理思路更高评价,反之则要进行修正。对应技术中,就是把该概率当作“奖励信号”,并由此进行策略梯度或近似的强化学习更新。
解释为什么这些对应关系是合理的
这些对应关系是合理的,因为它们抓住了核心的交互和学习机制:一个智能体(小朋友/模型)基于输入(提示/问题)进行内部处理(思考/推理),然后其行为(说出答案/生成答案)被一种机制(自信度/概率)评估,并用于调整未来的内部处理。VeriFree的核心就是这种内部评估机制。
深入技术细节
从比喻过渡到实际的技术原理
现在,让我们从比喻过渡到实际的数学原理与算法机制。以下会给出论文里最关键的一些公式,并用自然语言对每个符号做替换式解释。
解释相关的数学公式或算法
首先给出原始数学形式
论文中对“有验证器”和“无验证器(VeriFree)”各自的目标做了对比。最核心的就是VeriFree的目标函数和对应的梯度。
-
VeriFree的目标函数: 论文中给出的形式(Eq. (4))是:
-
VeriFree的梯度公式: 论文中标记为Eq. (5),是:
-
对比:有验证器时的梯度(用于理解差别): 传统“有验证器”的做法(Eq. (3))里,奖励是二进制的:正确答案->1,错误->0。
然后提供一个符号替换版本,用自然语言替换数学符号
-
VeriFree的目标函数 (Eq. (4))
自然语言替换:
❝
“VeriFree的目标” = “在所有可能的推理中,模型对参考答案的平均自信度最大化”。
-
- “”:模型的可学习参数(就像小朋友的大脑)。
- “”:输入的问题或提示(主持人给的信息)。
- “”:参考答案(真正正确的单词或句子)。
- “”:模型生成的推理过程,也可称链式思考。
- “”:模型在给定和的条件下,“输出参考答案”的概率。
-
VeriFree的梯度公式 (Eq. (5))
自然语言替换:
❝
“VeriFree的梯度” = “对于每个采样出来的推理,用
模型对参考答案的自信度
乘以 (推理过程的改进方向
+在该推理下输出参考答案的改进方向
),然后求平均”。换言之,如果模型非常确认“”会导致“”这个答案是合理的,那么就沿着这条“思路 + 输出”大力提升其概率,反之如果模型本身感觉对不认可,就弱化其影响。
-
**对比:有验证器时的梯度 (Eq. (3))**若用自然语言概括就是:
❝
“对每个样本,如果模型生成的答案
y
是参考答案y*
,就提升这条推理过程z + 生成答案y
的路径的概率,否则就不提升。” 这显然需要一个明确的“对/错”判断,无法在不确定情形或多个可能答案时做细分。
而在VeriFree里,“奖励”变成了“”这种分数型(连续值)自信度信号,使得每次训练都能更稳定地更新参数,从而拥有更低的梯度方差。
说明技术实现中的关键步骤
- 模型根据输入生成推理。
- 将与参考答案拼接。
- 计算模型对拼接后序列中部分的条件概率 。
- 将此概率作为奖励,代入策略梯度公式 (Eq. (5)) 进行模型参数 的更新。
将技术细节与比喻相互映射
解释每个技术步骤在比喻中的体现
回到“猜单词游戏”:
-
生成推理(模型采样出):
-
- 小朋友脑中对多个水果可能性的思考 = 模型通过“自回归”生成一系列token作为“思考过程”。
-
对参考答案的自信度 ():
-
- 主持人告诉小朋友最终正确答案是“apple”,小朋友回顾自己先前的思路后想,“我觉得对
apple
的把握是70%”,这70%就是这里的概率值。
- 主持人告诉小朋友最终正确答案是“apple”,小朋友回顾自己先前的思路后想,“我觉得对
-
用自信度当奖励去更新思维和回答:
-
- 如果小朋友越觉得自己推理过程能合理导向“apple”,越强化这种推理方式;若觉得“apple”与自己的推理过程格格不入,就会减少今后重复这种推理的倾向。
说明比喻如何帮助理解技术细节
比喻帮助我们将抽象的概率和梯度概念,转化为更易于理解的“自信度”和“自我调整”过程。
将数学公式中的概念对应到比喻中的具体行为或现象
- : 小朋友多次尝试思考的过程。
- : 小朋友在某次思考后,对正确答案的“认同程度”或“自信度”。
- : 小朋友调整“如何思考”的方向。
- : 小朋友调整“在当前思考下,如何更倾向于正确答案”的方向。
指出比喻的局限性(如果有的话)
- 在真实的语言模型训练中,“”需要大规模神经网络去实现,远比小朋友猜单词要复杂得多。
- 现实任务中可能有多种正确答案或不同等价表达,这时简单地拿单一“”也会有一定偏差;论文也提到如何在有“同义答案集合”或“等价类”信息时做更好处理。
- 但是从核心原理上,“利用模型本身对参考答案的匹配度当作奖励”就是VeriFree的关键思路,其它都可以视为在此基础上的扩展或修正。
总结
重申比喻与实际技术的核心联系
VeriFree的核心联系在于:利用模型计算“参考答案的概率”来评估当前推理过程的优劣,进而给出“连续型的奖励”信号,代替了传统“对/错”二值反馈。
强调这种对应关系如何帮助理解整个概念
像“小朋友猜单词”那样,哪怕没有评分裁判,仍能通过“我对正确答案的认可度”来反向调整大脑的推理方式。
用比喻来总结最关键的数学原理
论文中以公式(4)和(5)等形式给出了这一机制的目标和梯度;其本质是对“模型自信度”进行期望最大化,同时降低了采样带来的高方差。小朋友通过不断评估自己对正确答案的“自信”,而不是依赖外部的“对/错”评判,来学习如何更好地猜词。
第三阶段:详细说明流程步骤
1. 整体流程概述
下文展示的是论文提出的VeriFree训练管线的一个简化版本流程,帮助读者从输入到输出有一个清晰的脉络。大体可以分为以下步骤:
-
准备数据:
-
- 有一批问题()及其对应的参考答案()。
- 如论文中所述,这些问题可能来自多学科领域(如MMLU-Pro、SuperGPQA等),并非像数学那样易于自动验证。
-
生成“推理过程”:
-
- 对每条问题,模型(策略)会在给定的prompt下“自由地产生”一个推理文本(即)。
- 注意这里只让模型生成推理部分,在生成到固定标记(例如````)后停止。
-
拼接参考答案:
-
- 将上一步得到的推理与真实参考答案进行拼接,形成一个完整的序列。
- 由于论文强调了token级别的一致性,需要在拼接位置保证与tokenizer对齐,比如先把````当作分割点,再手动在末尾添加
>\boxed{...}
的规范格式。
-
计算模型对“参考答案”的条件概率:
-
- 将“问题 + 推理 + 参考答案”这一整串序列输入模型,拿到,即模型对于此参考答案的“自信度”。
- 在实现上,这通常意味着对参考答案部分进行一次前向传播来计算对数似然值或条件概率值。
-
确定奖励并进行梯度更新:
-
-
把第4步得到的“自信度”当作奖励信号,同时与推理过程的对数似然相结合,形成VeriFree的目标或其近似形式(如带有baseline的策略梯度,见论文Eq. (7))。
其中 , 是优势函数(如RLOO中的形式)。
-
执行一次反向传播,更新模型参数。如果使用PPO或类似算法,需要对新旧策略进行比对与裁剪。
-
-
重复采样多个回答或多条数据:
-
- 论文中的实现往往在一个batch里,对同一个问题生成多条推理(例如,条),然后统一计算奖励并做批量更新;或者在多个问题上并行开展。
- 在若干回合后(比如几千步),模型就能学到更好的推理策略,从而在没有显式判定器的情况下提升推理质量。
2. 示例:从输入到输出的过程
假设我们有如下输入——一个通用知识问题:
问题(x): "Who invented the telephone?"
参考答案(y*): "Alexander Graham Bell"
以下是一个可能的单轮训练流程示例:
-
Prompt构造:
<|im_start|>user Who invented the telephone? Please reason step by step, and put your final answer within <answer> \boxed{} </answer>. <|im_end|> <|im_start|>assistant
模型在看到以上指令后,开始生成思考过程。
-
模型生成推理过程():
-
-
比如模型输出:
I recall that the telephone was invented in the late 19th century. There is debate over some details, but the widely recognized inventor is the Scottish-born ... <answer
-
这里在遇到````后就停止输出,由此获得。
-
-
手动拼接真实答案():
-
-
拼接得到完整输入序列:
I recall that the telephone was invented in the late 19th century. There is debate over some details, but the widely recognized inventor is the Scottish-born ... <answer> \boxed{Alexander Graham Bell} </answer>
-
这时我们就可以让模型去评估:在给定此推理文本和问题的前提下,输出“Alexander Graham Bell”这个结尾的概率有多大。
-
-
计算概率并更新:
-
- 在实现上,对“...boxedAlexander Graham Bell做一次,拿到πθ(y∗∣x,z)...boxedAlexander Graham Bell做一次,拿到πθ(y∗∣x,z)。
- 作为奖励信号:。
- 结合策略梯度公式 (Eq. (5) 或 Eq. (7) 的变体)等更新公式,对参数做反向传播更新。
-
生成多样推理:
-
- 实际中,为降低方差和提高效率,会对一个问题采样多条推理,并对每条推理拼接同一个,都算出相应的概率值后,再进行一次整体的梯度更新。
当我们重复这一过程足够多次(对很多不同的输入问题),模型就逐渐调整自身的推理方式,让它在面对某一类问题时更倾向于产出与正确答案一致的思路。
3. 伪代码示例
以下给出一个简化的伪代码,帮助读者理解各步骤如何串联。
# 假设我们有:
# model: LLM (参数 theta)
# dataset: 包含很多 (x, y_star) 的条目
# tokenizer: 用于文本和token的转换
# PROMPT_TEMPLATE: 格式化输入x的模板
# STOP_TOKEN_ID: 例如 tokenizer.encode("<answer")[0]
# REFERENCE_ANSWER_FORMAT: 例如 "<answer> \\boxed{{}} </answer>"
def train_verifree(model, dataset, optimizer, num_train_steps, batch_size, group_size):
for step in range(num_train_steps):
# 1. 从数据集中取一批 (x_text, y_star_text)
# 每个x_text对应一个y_star_text
batch_prompts_text = []
batch_y_star_text = []
for _ in range(batch_size):
x_text, y_star_text = sample_from_dataset(dataset)
prompt_text = PROMPT_TEMPLATE.format(question=x_text)
batch_prompts_text.append(prompt_text)
batch_y_star_text.append(y_star_text)
all_generated_z_tokens = [] # List of lists of token IDs for z
all_rewards = [] # List of reward values (probabilities)
all_log_probs_of_z = [] # List of log_probs for each z
all_log_probs_of_y_star_given_z = [] # List of log_probs for y_star
for i in range(batch_size):
prompt_text = batch_prompts_text[i]
y_star_text_for_prompt = batch_y_star_text[i]
# Tokenize prompt
prompt_tokens = tokenizer.encode(prompt_text)
# For each prompt, generate 'group_size' reasoning traces (z)
# RLOO requires multiple samples per prompt
generated_zs_for_prompt_tokens = []
rewards_for_prompt = []
log_probs_z_for_prompt = []
log_probs_y_star_for_prompt = []
for _ in range(group_size):
# 2. 模型生成推理过程 z (token IDs)
# Generate autoregressively until STOP_TOKEN_ID or max_length
# z_tokens includes the prompt_tokens implicitly if generation starts from there
# or z_tokens is just the generated part. Let's assume z_tokens is just the generated part.
# In practice, model.generate takes prompt_tokens and returns full_output_tokens
# z_tokens would be full_output_tokens[len(prompt_tokens):-len_of_stop_sequence]
# For simplicity here, assume a function gives z_tokens and its log_prob
z_tokens, log_prob_z = model.generate_reasoning_trace(
input_ids=prompt_tokens,
stop_token_id=STOP_TOKEN_ID,
max_length_z=512 # example
)
generated_zs_for_prompt_tokens.append(z_tokens)
log_probs_z_for_prompt.append(log_prob_z)
# 3. 拼接 z_tokens 和 y_star_text
# This step is crucial for tokenization consistency as per paper.
# The paper implies z ends *before* the full stop sequence like "<answer>",
# and then the reference answer is patched in.
# Correct patching requires careful token handling.
# Essentially, we are creating: prompt_tokens + z_tokens + tokens_for_reference_answer_formatted
reference_answer_formatted_text = REFERENCE_ANSWER_FORMAT.format(y_star_text_for_prompt)
reference_answer_tokens = tokenizer.encode(reference_answer_formatted_text, add_special_tokens=False)
# Sequence for probability calculation: prompt + z + reference_answer
# If z_tokens already includes the stop sequence prefix like "<answer"
# then we just append the rest: "> \\boxed{y*} </answer>"
# Assuming z_tokens ends *at* the stop token like "<answer" (as per Sec 2.4)
# and reference_answer_tokens starts effectively *after* that.
# The model calculates P(reference_answer_tokens | prompt_tokens, z_tokens)
# This is log_prob(prompt_tokens + z_tokens + reference_answer_tokens) - log_prob(prompt_tokens + z_tokens)
# 4. 计算模型对参考答案的概率 (log P(y* | x, z)) and the probability P(y*|x,z)
log_prob_y_star_given_z, prob_y_star = model.calculate_conditional_probability(
prompt_tokens=prompt_tokens,
z_tokens=z_tokens,
y_star_tokens=reference_answer_tokens
)
log_probs_y_star_for_prompt.append(log_prob_y_star_given_z)
# 5. 计算奖励
reward = prob_y_star # VeriFree reward
rewards_for_prompt.append(reward)
all_generated_z_tokens.extend(generated_zs_for_prompt_tokens)
all_rewards.extend(rewards_for_prompt)
all_log_probs_of_z.extend(log_probs_z_for_prompt)
all_log_probs_of_y_star_given_z.extend(log_probs_y_star_for_prompt)
# 6. 使用RLOO、PPO或其他策略梯度方法计算梯度并更新模型
# For Eq. (7): A_i = R_i - baseline (e.g., RLOO baseline)
# The gradient for each sample i would be:
# grad_i = A_i * grad(log_prob_z_i) + R_i * grad(log_prob_y_star_given_z_i)
# This requires gradients of log probabilities.
optimizer.zero_grad()
total_loss = 0
# Iterate through all samples (batch_size * group_size)
# For RLOO, baselines are computed per prompt group
current_idx = 0
for i in range(batch_size):
# Extract rewards for the current prompt's group
rewards_in_group = all_rewards[current_idx : current_idx + group_size]
for j in range(group_size):
sample_idx = current_idx + j
R_i = all_rewards[sample_idx]
# Calculate RLOO baseline for this sample within its group
if group_size > 1:
baseline_rloo = (sum(rewards_in_group) - R_i) / (group_size - 1)
else:
baseline_rloo = 0 # Or some other global baseline
A_i = R_i - baseline_rloo
# Construct loss such that its gradient is Eq. (7)
# loss_i = -(A_i * all_log_probs_of_z[sample_idx] (detached for A_i) +
# R_i * all_log_probs_of_y_star_given_z[sample_idx] (detached for R_i))
# The actual implementation might vary based on RL framework (e.g., PPO needs old_log_probs)
# For on-policy REINFORCE with RLOO:
loss_for_sample = -(A_i.detach() * all_log_probs_of_z[sample_idx] +
R_i.detach() * all_log_probs_of_y_star_given_z[sample_idx])
total_loss += loss_for_sample
current_idx += group_size
if (batch_size * group_size) > 0:
total_loss = total_loss / (batch_size * group_size)
total_loss.backward()
optimizer.step()
if step % 100 == 0: # EVAL_INTERVAL
print(f"Step {step}, Avg Loss: {total_loss.item()}")
# evaluate(model) # Optional evaluation
上面的伪代码展示了核心逻辑,尤其强调了RLOO基线的计算和损失函数的构造,以使其梯度对应论文中的Eq. (7)。实际实现会依赖具体的RL框架(如Oat)和模型接口。
4. 总结流程
综上所述,一个典型的VeriFree训练回合可以被描述为:
- 采样:从给定问题出发,模型生成多条(
group_size
条)推理过程。 - 拼接:对每条,将其与参考答案连接起来,形成完整响应。
- 计算概率:让模型对每个拼接后的“参考答案部分”进行评分(计算条件概率 )。
- 更新:使用该评分作为奖励,计算优势(如RLOO基线),然后根据公式(如Eq. (7))构造损失函数,对模型参数进行强化学习式更新。
- 重复:在所有训练数据上迭代多个
step
,使模型不断学会在推理上对齐正确答案,从而提升推理质量。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。