LLM的后训练强化学习是怎么工作的

立委按:LLM的强化学习后训练是当前热点,也是最新思维链(CoT)推理模型范式的红利期。推理强化后的模型在复杂任务的表现上普遍性能提升。强化后训练的新范式正在不断推广到不同场景,而且也在多模态方面取得进展。应该是了解一点强化学习的基本工作流程的时候了。

一、训练阶段:延迟奖励如何影响参数更新

1.1 生成一个完整序列(Trajectory)之后才拿到奖励

    • 在 基于策略梯度的强化学习( RL)里,模型先“自下而上”采样生成一段文本,一般称为一个序列或轨迹(trajectory)。
    • 当整段文本生成完毕,才传给奖励模型或人类评审打分,得到一个序列级别的总奖励 R。这个奖励是对整段生成结果的“后验评价”。

1.2 把“序列级别奖励”拆给每一步“选择词元”的策略

    • 策略梯度(Policy Gradient)方法的核心是:用“生成过程中每一步输出的 log 概率”去乘以“那个序列最终的奖励”或“优势值(advantage)”,从而形成梯度,来更新模型参数。
    • 具体公式(简化版):
    • 看起来好像“序列级别只有一个 R”,但在公式里,它会被“复制”到每个时间步,也就是说“同一个奖励”会乘以这一序列中所有 log⁡π之和,变成一个总梯度——最终作用于参数更新。换句话说:
      • 如果这整段话拿了 10 分,那每一步生成那个概率就会“拿到正向信号”;
      • 如果这整段话只拿了 2 分,那每一步概率都会“拿到负向信号”。

1.3 参数更新:一次性影响整个生成过程中的每一步

在拿到梯度之后,往往用类似 PPO(Proximal Policy Optimization)的算法做一次“裁剪式更新”:

      1. 先计算出这段轨迹里旧策略的每一步的 log π_old(a_t|s_t),也记录下 R(τ)
      2. 然后在同样的状态序列(同样的前缀)下,让新策略再次计算一次 log π_new(a_t|s_t)
      3. 用“新旧策略的比值”去乘以“奖励或优势值”,并加上 PPO 的剪切项,算出损失。
      4. 再用梯度下降/上升一次性更新参数 θ

整个过程只迭代几轮(若干个序列)就能让策略“尽量往高奖励方向”靠拢,同时保持与旧策略“不要偏差太大”以免训练不稳定。核心思路:采样→拿到 R→把奖励和每一步的 log-prob 相乘→算梯度→更新参数

完成一次更新后,策略参数 θ 变成 θ_new;下一轮又回到“冻结策略→再采样→再更新”的循环。


二、“旧策略”和“新策略”的含义

  1. 模型参数不变,策略就是“固定不变”的

——至少在一次完整的生成(rollout)或一次训练迭代里,它的参数 θ 保持不动,策略自然不变

策略=“这个 state 下网络给我的下一个 action 打了哪些分,在语言模型就是网络根据当前 context 计算出来的next token 的概率分布”

    • 在训练里,一轮 rollout/采样结束后,你会根据奖励/损失去更新参数 θ,此后策略才会变成“新的策略 π_θ。但在“采样这段对话/文本”的整个过程中,θ 不变,所以策略函数 π_θ(⋅∣s) 也是不变的。

  1. 旧策略(π_old)

    • 是“收集轨迹时”的那一套模型参数下的策略网络。

    • 换句话说,你让模型在环境(或是对话上下文)里按照 π_old 去采样,得到了 N 条“(状态₁,动作₁)→(状态₂,动作₂)→ … →(状态_T, 动作_T)”的完整轨迹。

    • 在收集完这些轨迹后,你把这些轨迹连同 π_old 在每一步的 log π_old(a_t|s_t)(或者直接存储下来的 probs)一起都记录下来。这个“旧策略”相当于一个“快照”,是收集数据时的分布。

  2. 新策略(π_new)

    • 是“在更新参数过程中所使用的那套参数”——也就是我们正在训练的、会随着梯度下降而不断变化的策略网络。

    • 一旦开始做梯度更新,就会用当前那一刻的网络参数去计算“新策略输出的 log π_new(a_t|s_t)”。随着每一次梯度步,新策略的参数都会微调,这时 π_new(a_t|s_t) 就可能和旧策略 π_old(a_t|s_t) 不再相同。

核心思路

  1. 收集轨迹阶段:

    • 在策略还是 π_old 的时候,让它去环境里跑几千个或几万个 steps,把完整的“状态→动作→奖励→下一个状态”都存下来,连同当时的 log π_old(a_t|s_t)。

    • 由于在这一步,你还未做过任何梯度更新,所以“新策略”和“旧策略”是同一个网络。此时如果你立刻比较 π_new 和 π_old,它们是完全一样的——比值。但你先把 π_old 的值记下来,后面调整参数时就有对比用。

  2. 优化阶段:

    • 接下来,你拿到这批已经收集好的轨迹,开始做多轮(多个 epoch)小批量(mini-batch)的梯度更新。

    • 在做第 1 次梯度更新时,虽然此刻的“新策略”参数 θ 与“旧策略”参数(收集时的快照)是一模一样的,但你仍然把它们区分开来

      • π_old 作为“分母”是个常数(保留收集轨迹时计算出来的概率值),不会随梯度变化。

      • π_new 作为分子,用来重新在网络里跑一遍“给定同一个 s_t,计算当前参数下采样 a_t 的概率”——也就是 log π_new(a_t|s_t)

      • 从第 1 步到第 k 步,你都会做相同流程:把“旧 log π_old” 和“新 log π_new” 一起塞进目标函数里,再做梯度更新。梯度实际上来自于“新策略”下的 log π_new(a_t|s_t) 与“旧策略” log π_old(a_t|s_t) 的比值,因为你要优化的是 让比值往有利于大优势值 A_t 的方向调整

三、推理阶段:使用训练好的策略

    • 推理(Inference)阶段的模型权重已经固定,原本训练中“等生成完整序列才给分”的那套机制,在推理时已经不再用到——你只需要让模型按学到的“策略”来采样(sampling)或贪心(greedy)或 Beam Search,就可以一步步生成文本。
    • “延迟奖励”不影响推理:模型在训练时学到的是“哪种写法往往能拿高分”,它把这些偏好都编码进了参数里。推理阶段只负责“按概率分布一步步抽词”,不再需要知道“这个序列最终打了几分”。

小结

所以,重点就在于

  • 采样:用旧策略(现策略)拿到“随机生成的具体文本”以便算 reward。在采样阶段,模型参数不变,策略自然不变。

  • reward:只能在“采样出具体文本 τ”后才能得出。

  • 更新:等到我们从多条 τ 上都获取了 reward,再去把这些“sequence-level feedback”切片到每一步,算出梯度更新策略/参数。

 

发布者

立委

立委博士,多模态大模型应用高级咨询。出门问问大模型团队前工程副总裁,聚焦大模型及其AIGC应用。Netbase前首席科学家10年,期间指挥研发了18种语言的理解和应用系统,鲁棒、线速,scale up to 社会媒体大数据,语义落地到舆情挖掘产品,成为美国NLP工业落地的领跑者。Cymfony前研发副总八年,曾荣获第一届问答系统第一名(TREC-8 QA Track),并赢得17个小企业创新研究的信息抽取项目(PI for 17 SBIRs)。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理