强化学习

简介: 强化学习(RL)是一种通过智能体与环境交互,以最大化累积奖励为目标的学习方法。核心包括状态、动作、奖励、策略与价值函数,依赖试错和延迟奖励机制。常见算法如Q-learning、PPO、DPO等,广泛应用于游戏、机器人及大模型训练。结合人类反馈(RLHF),可实现对齐人类偏好的智能行为优化。(239字)
  1. 概述
    强化学习(Reinforcement Learning, RL)是一种机器学习方法,它通过智能体(Agent)与环境(Environment)交互来学习策略(Policy),使得在不同状态(State)下采取的动作(Action)能够最大化累积奖励(Reward)。强化学习的核心思想是试错学习(Trial-and-Error Learning)和延迟奖励(Delayed Reward)。
    强化学习有几个关键概念:
  2. 智能体(Agent):做出决策的实体,它与环境进行交互。
  3. 环境(Environment):智能体所处的外部系统,智能体的行动会影响环境的状态,环境会根据智能体的行为给予反馈。
  4. 状态(State):环境在某一时刻的情况或配置,智能体基于这些状态做出决策。
  5. 动作(Action):智能体在特定状态下可以采取的行为。
  6. 奖励(Reward):智能体采取某个动作后,从环境中获得的反馈,奖励可以是正面的(促进目标的实现)或负面的(阻碍目标的实现)。
  7. 策略(Policy):智能体在给定状态下选择动作的规则或函数,策略可以是确定性的也可以是随机的。
  8. 价值函数(Value Function):衡量状态或动作的长期回报,评估某个状态或状态-动作对的好坏,价值函数帮助智能体了解在某个状态下采取行动的长期收益。

强化学习的特点:

  1. 无监督学习:不需要标注数据,智能体通过试错学习。
  2. 延迟奖励:智能体的动作可能在未来才获得奖励。
  3. 动态环境:环境可能随时间变化,智能体需要适应。
    强化学习的目标是找到最优策略,使得智能体在长远来看能够获得最大的累计奖励。
  4. 相关概念
    2.1 价值函数
    强化学习中的环境由一个马尔可夫决策过程(MDP) 建模。

贝尔曼方程(Bellman Equation) 是强化学习的核心概念,它描述了一个状态的价值如何递归地依赖于 当前奖励 和 未来状态的价值。(价值函数的核心公式是贝尔曼方程,它通过递归的方式计算长期收益。)它的核心思想是:当前的价值 = 直接奖励 + 未来可能的价值。贝尔曼方程将价值函数和价值-动作对函数 递归地表示 为:

通过贝尔曼最优方程,可以推导出最优值函数,并进一步得到最优策略:

2.2 策略函数
策略函数是智能体(Agent)在某个状态 s 下选择动作 a 的规则。策略函数决定了智能体的行为方式

基于价值(Value-based)方法
通过优化价值函数(如状态价值函数 V (s) 或状态-动作价值函数 Q(s,a))来间接推导出最优策略,智能体首先找到最优的价值函数,然后通过价值函数选择能够带来最大长期回报的动作,策略通常通过贪心算法得到。
价值函数可以表示每个状态的长期收益,动作价值函数则表示在特定状态下执行某个动作能获得的长期收益。
代表算法:
1)价值迭代(Value Iteration)
价值迭代(Value Iteration)是一种动态规划(Dynamic Programming, DP)方法,用于求解马尔可夫决策过程(MDP)的最优策略。该方法通过反复更新价值函数,直至收敛到最优值,并从中提取最优策略。

价值迭代的基本流程如下:
输入状态集合 S、动作集合 A、转移概率 P(s′∣s,a)、奖励函数 R(s,a)、折扣因子 γ、终止条件(如收敛误差 θ)

2)Q-learning
Q-learning 是一种值迭代算法,用于在 无模型(model-free) 的环境中学习最优策略。

基于策略(Policy-based)方法
Policy Gradient
策略梯度方法是一类直接优化策略 $π_θ(a∣s)$的方法,其核心思想是通过调整策略参数 $θ$ 来最大化期望累积奖励,策略本身是参数化的函数(如神经网络),通过梯度上升法不断调整策略参数,以最大化累积累积奖励的期望
策略梯度定理:
在此之前,首先介绍策略梯度定理,策略梯度定理是基于策略方法的理论基础,它提供了一种直接优化策略参数 $θ$ 的方法,以最大化期望累积奖励,累积奖励通常用目标函数$J(θ)$表示:

$G(\tau)=\sum_{t=0}^T \gamma^t r_t$ , $rt$ 表示在时刻 t 的奖励,$\gamma$ 表示折扣率,$J(\theta)$是所有轨迹的回报的期望值,也是优化的目标,策略梯度法是希望找到使得$J(\theta)$最大的策略参数 $θ$ 。直接计算期望的梯度比较困难,我们通常使用蒙特卡洛采样方法(通过采样来估计期望值来)近似计算梯度。具体在PG里,蒙特卡洛采样方法在策略 $\pi{\theta}$ 下采样多条轨 迹,然后使用这些轨迹回报的均值来近似计算梯度。
策略梯度定理表明,目标函数$J(\theta)$对策略参数 $θ$ 的梯度$\nabla_{\theta}J(\theta)$可以表示为:

其中:
● $\pi_{\theta}(a_t|st)$ 表示策略 $\pi{\theta}$ 在状态 $s_t$下选择动作 $at$ 的概率
● $\nabla
{\theta} log \pi_{\theta}(a_t|st)$ 表示策略 $\pi{\theta}$ 在状态 $s_t$下选择动作 $a_t$ 的对数概率关于参数 $θ$ 的梯度

为什么目标函数$J(θ)$对策略参数的梯度可以这么表示?

以上,策略梯度定理介绍完了,通过公式可以看出:如果某个轨迹 $\tau$ 的累积奖励 $$G(\tau)$$为正,我们就希望这个轨迹中的动作被选择的概率$ \pi_{\theta} (a_t | st)$ 更高;如果为负,我们就希望这个轨迹中的动作被选择的概率更低。
策略梯度方法中,策略参数根据梯度上升法优化:$\theta
{t+1} = \theta{t} + \alpha \nabla{\theta} J(\theta)$ ,使得策略朝着期望回报最大的方法更新
结论:策略梯度法提供了一种直接优化策略的方法,避免了基于值函数的间接优化,核心是通过调整策略参数 ,使得高回报的动作被选择的概率增加,低回报的动作被选择的概率减少。

REINFORCE 算法
原始PG算法的一个主要问题是:使用了不相关的奖励信息。在PG计算梯度时,使用了总回报 $G(\tau)$ 作为权重,它包含了整个轨迹的回报(也就是说,站在时刻 t 的视角去看,这个总回报既包含了时刻 t 之前的奖励,也包含了时刻t之后的奖励),实际上,在评估当前动作的时候,只需要关注从这一动作开始直到轨迹结束的“后续表现”(也叫 “rewards to go”),即当前以及未来的奖励,而不应该考虑过去的奖励 。
为了解决这个问题,REINFORCE 算法使用 $G_t$ 来代替 $G(\tau)$ 作为权重。 表示从当前时刻 t 到轨迹结束的总回报,也就是只要「现在」和「未来」,不要「过去」:
$Gt=\sum{k=t}^T \gamma^{k-t} r_k$ 表示从时刻 t 开始的累积折扣回报, $rk$ 表示在时刻 k 的奖励(初始化为 t ),$\gamma$ 表示折扣率 。( 对比$G(\tau)=\sum{t=0}^T \gamma^t r_t$ 理解)
这样一来,使用 $G_t$ 作为权重可以更准确地估计策略梯度。REINFORCE 算法的梯度计算公式如下:

带基线(Baseline)的REINFORCE 算法
REINFORCE 算法通过用“rewards to go”代替轨迹整体回报改进了PG,但由于强化学习是通过采样轨迹来计算策略梯度的,但这种梯度计算方法往往具有较高的方差,意味着每次采样得到的梯度值差异可能很大,会影响策略更新的稳定性和收敛速度 。
方差较高的原因:
● 智能体每次与环境交互产生的轨迹具体多样性和随机性
● 策略更新后,策略的微小变化可能会导致生成的轨迹发生很大改变
为了减少方差,可以引入基线(Baseline)。核心思想是,为每一步的“后续奖励”减去一个基准值,在数学上表示为b,即参考线,它不一定是一个常数,更多时候是状态 $s_{t}$ 的一个函数。这个参考线的实际意义是当前的状态下回报奖励的期望,那么超出期望(Baseline)的部分就是优势(Advantage)。在实际训练中,我们会用优势代替原来的“后续奖励”进行梯度估计,以减小方差。具体来说,使用 $G_t-b(s_t)$ 来代替 $G_t$ 作为权重,其中 $b(s_t)$ 是当前状态 $s_t$ 的基线值。
带基线的REINFORCE的梯度计算公式如下:

那么当前状态 $s_t$ 的基线值 $b(s_t)$ 如何计算?
“rewards to go” 即当前动作之后的奖励在强化学习中被称为 Q 函数(动作价值函数)$Q^\pi(s,a)$ ,即在状态 s 采取动作 a 后,未来能获得的累积奖励期望。(即上面的 $G_t$ )
当前状态 $s_t$ 的基线值 $b(s_t)$ 通常通过状态价值函数$V^\pi(s)$表示,状态价值函数$V^\pi(s)$ 指的是“状态 s 下的未来累积折扣回报期望”(基准值),可以被认为是对当前状态下「好坏」程度的评估 。$V^\pi(s)$通常由一个网络估计出来(如用一个神经网络(价值模型)拟合 $V^\pi(s)$,并与策略模型联合训练)
通过动作价值函数$Q^\pi(s,a)$ 减去状态价值函数 $V^\pi(s)$ , 我们得到优势函数:$A^\pi(s,a) = Q^\pi(s,a) - V^\pi(s)$, 具体的含义是在某个状态 s 下,选择某个动作 a 相比于平均走法能提升多少胜率。如果这个动作带来的预期回报 $Q^\pi(s,a)$ 远高于当前状态的基准水平 $V^\pi(s)$,那么这个动作的优势就是正的,说明它非常值得采用;反之,则说明不如平均水平。
优势函数在意的不是绝对的好,而是相对的好,即相对优势。

蒙特卡洛(Monte Carlo)方法
蒙特卡洛采样(Monte Carlo Sampling) 是一种通过多次随机采样来近似计算 “难以直接求解的期望或积分” 的方法。其核心思想是:对于一个随机变量的期望(如强化学习中的累积回报期望),如果无法通过数学公式直接计算,就通过大量随机采样的结果来近似计算期望。
举例来说,若要计算 “掷一枚骰子的平均点数”(理论期望是 3.5),蒙特卡洛采样的做法是:掷骰子 1000 次,记录每次的点数,然后计算这 1000 个点数的平均值(比如 3.48),以此近似 3.5 的真实期望。样本量越大,近似结果越准确。
根据蒙特卡洛(Monte Carlo)采样, f(x) 在 分布 p(x) 下的期望值估计 计算如下:从分布p(x) 里抽很多样本 x,对每个样本计算f(x),然后取这些 f(x) 的平均值。表示” 在随机变量 x 按 $p(x)$ 分布采样时,函数 $f(x)$ 的平均输出值。“
带入强化学习的场景,其中 $p(x)$ 是策略模型,随机变量 $x$ 就是从策略 $p(x)$中的采样到的轨迹,$f(x)$ 就是轨迹 $x$ 的期望回报。以REINFORCE 算法为例,蒙特卡洛采样步骤为:

  1. 采样完整轨迹:遵循当前策略 $\pi_{\theta}$,采集一条完整的轨迹 $\tau$。
  2. 计算轨迹的累积回报:对轨迹中每个时间步 t,计算从该步开始到轨迹结束的累积折扣回报 $$G_t=\sum_{k=t}^T \gamma^{k-t} r_k$$
  3. 估计策略梯度:重复采样N条轨迹,得到 N 条轨迹以及对应的累积折扣回报 $$G_t^1,G_t^2,···,G_t^N$$,利用策略梯度定理计算策略梯度$\nabla{\theta}J(\theta) \approx \frac{1}{N}\sum{i=1}N \sum{t=0}T \nabla{\theta} log \pi_{\theta}(a_t|st) · G{i,t}$,$G_{i,t}$ 是第 i 条轨迹第 t 步的累积回报。
  4. 更新策略参数:沿梯度方向更新 θ,使策略更倾向于选择能带来高回报的动作。

蒙特卡洛采样用于估计状态价值函数
在强化学习中,蒙特卡洛采样通常用于估计状态价值函数:状态价值函数$V^\pi(s)$ 指的是“状态 s 下的未来累积折扣回报期望”,蒙特卡洛方法通过从状态 s 开始,使用策略 $\pi_{\theta}$ 与环境进行多次交互,生成多条完整的轨迹 。对于每条轨迹,计算从状态 s 开始的累积折扣回报 ,然后对这些回报求平均值,以此来估计状态价值函数$V^\pi(s)$。具体步骤如下:

  1. 从状态 s (假设时间步为 t )开始,按照策略 $\pi_{\theta}$ 与环境交互,直到终止状态,计算从状态 s 出发的累积折扣回报 ,$$G_t=\sum_{k=t}^T \gamma^{k-t} r_k$$
  2. 多次重复步骤 1,得到 N 条轨迹以及对应的累积折扣回报 $$G_t^1,G_t^2,···,G_t^N$$
  3. 状态价值函数的估计值 $\widehat{V}^\pi(s) = \frac{1}{N}\sum_{i=1}^N G_t^i$ 。随着采样次数 N 的增加,状态价值函数的估计值 $\widehat{V}^\pi(s)$会逐渐收敛到真实的 $V^\pi(s)$

蒙特卡洛采样中价值函数的更新:
蒙特卡洛采样中会进行大量的试验,如果每次都重新计算平均值,效率会比较低。为了更便于计算,实际中一般会把上述过程写成「更新迭代」的公式,即节省资源,不用保存所有样本数据,也可以做到实时更新:
$V(s_t) \leftarrow V(s_t)+\eta[G_t-V(s_t)]$
其中 $\eta$ 是学习率,控制了我们对新信息的信任程度。如果 $\eta$ 很大(比如接近 1),那么价值函数的更新会比较激进,每次都大幅度地向着新的回报值 $G_t$ 靠拢。反之,如果 $\eta$ 很小,那么价值函数的更新会比较保守,每次都只稍微调整一点。而 $G_t-V(s_t)$是误差项:如果一次采样的回报大于当前价值函数的估计值,那么很可能说明,我们的估计值偏低了,需要变高一点;反则反之。

蒙特卡洛采样的优缺点
优点:
● 适用性广:蒙特卡洛采样不需要对问题的形式做过多假设,无论是简单的积分计算,还是复杂的强化学习问题,只要能进行随机抽样,都可以尝试使用该方法。
● 无偏估计: 蒙特卡洛估计直接使用从环境中采样的完整轨迹来计算累积奖励,因此它是无偏差的。
缺点:
● 收敛速度慢:为了获得较为准确的结果,通常需要大量的样本,尤其是在高维空间中,样本数量可能呈指数级增长,导致计算效率低下,即所谓的 “维数灾难”。
● 方差较高:每次采样的轨迹回报受随机因素影响大,导致不同轨迹的回报波动剧烈,梯度估计的方差较高,训练不稳定
● 离线学习:必须等待一条轨迹完整结束后才能计算回报并更新策略,无法 “在线”(边采样边更新)进行,数据利用效率较低。

时序差分法(TD,Temporal Difference)估计
MC方法可以通过「采样」来进行「策略评估」,进而进行策略控制,得到我们想要的策略。但是,MC方法有一个很大的缺点,就是它需要等到一个完整的回合结束,才能计算出每个状态的真实收益,然后用这个收益去更新策略 / 价值函数。这意味着,在回合结束之前,策略 / 价值函数 不会发生任何改变,学习效率比较低。对于步骤很长的任务,这种方法就不适合了。
时间差分 (Temporal Difference,TD) 方法做了一个变通,相比MC需要采样整个回合,TD方法只需要采样一步即可更新策略 / 价值函数,无需完整的轨迹。以估计价值为例,MC中更新价值公式如下,每次都需要迭代计算时刻 t 的未来折扣回报 $$G_t=\sum_{k=t}^T \gamma^{k-t} r_k$$
$V(s_t) \leftarrow V(s_t)+\eta[G_t-V(s_t)]$
时序差分将更新价值公式写为:
$V(s_t) \leftarrow V(s_t)+\eta[rt+\gamma V(s{t+1})-V(s_t)]$
即,用即时奖励 $rt$ , 下一状态的价值估计 $V(s{t+1})$ 近似$G_t$。
我的理解:蒙特卡洛是迭代法,时许差分是递归法
这种方法也称为单步 TD 残差,计算简单但偏差较大

偏差和方差:时序差分法 Vs 蒙特卡洛:
偏差(Bias): 指的是模型的预测值和真实值之间的差距。一个高偏差的模型通常意味着它对真实情况的假设过于简单,无法很好地拟合真实数据。
方差(Variance): 指的是模型在不同数据集上的预测结果的波动程度。一个高方差的模型通常意味着它对训练数据的噪声过度敏感,在新的数据上表现不佳。
对于MC方法,它利用实际的回报来更新价值函数。而这个回报是真实的回报,因此是无偏的(unbiased),不会有偏差。但是,因为MC方法需要等待整个回合结束才能计算出回报,而回报是多个随机事件叠加的结果,因此MC方法的更新目标波动比较大,也就是方差比较大。
TD方法利用递归,用下一个状态的估计值去更新上当前状态的估计值。因为下一个状态的估计值本身就是不准确的,所以TD方法的更新目标是不准确的,这导致了偏差。但是,因为TD方法只依赖下一个状态,所以每次更新的变动比较小,因此方差小。

优势函数
优势函数:$A^\pi(s,a) = Q^\pi(s,a) - V^\pi(s)$ 表示在状态 s下,执行动作 a 比按照平均走法的期望回报高多少。其中 Q 函数(动作价值函数)$Q^\pi(s,a)$ ,表示在状态 s 采取动作 a 后,未来能获得的累积奖励期望。状态价值函数$V^\pi(s)$ 指的是“状态 s 下的未来累积折扣回报期望”。
在实际应用中,如果直接使用 Q函数 来计算优势函数,我们需要训练一个额外的 Q 函数网络,这增加了算法的复杂性。所以我们通常使用 TD 误差 $\delta_t$ 来近似优势函数,只需使用状态价值V函数,无需动作价值Q函数:
$A_t \approx \delta_t = rt + \gamma V^\pi(s{t+1}) - V^\pi(s_t)$
其中 $rt$ 是 t 时刻的即时奖励,$V^\pi(s)$ 和 $V^\pi(s{t+1})$ 分别指的是当前状态和下一状态的估计价值(未来累积折扣回报的期望),$\gamma$ 是折扣因子,TD 误差 $\delta_t$ 可以看作是对优势函数的一个估计,表示当前状态的实际回报与预期回报之间的差值。

广义优势估计 (GAE)
MC步数太长,偏差小,方差大,TD步数太短,偏差大,方差小,为了平衡偏差和方差、对MC和TD进行折中,即 广义优势估计(Generalized Advantage Estimation,GAE) 。
上面用 TD 误差 $\deltat$ 来近似优势函数是一种单步TD方法,为了更好地估计优势函数,我们可以使用 n 步回报,
$$R_t^{(n)} = r_t+\gamma r_{t+1}+···+\gamma^{n-1} r_{t+n-1}+ \gamma^{n} V(s_{t+n})$$
$V(s
{t+n})$ 是时间步t+n的状态价值估计,当n=1时,即单步TD,当n=∞, 即蒙特卡洛
GAE为了更灵活地进行偏差-方差权衡,使用「加权平均」的技巧,引入参数 λ 融合多步 TD 残差,公式定义如下:
$$A_t = \sum_{k=0}^{T} ( {\gamma \lambda} )^ k \delta _{t+k}$$
λ∈(0,1) 是GAE 权重, λ =0时,GAE即单步TD(0的0次方为0), λ =1时,GAE基本为MC,而 GAE 引入 λ 的核心目的是平衡偏差与方差,实际应用中通常选择 λ=0.95,在偏差和方差之间取折中

基于 Actor-Critic(AC)方法
虽然带基线的REINFORCE 算法可以减少方差,但REINFORCE 算法仍然存在一些缺陷,由于REINFORCE 算法是一种基于蒙特卡洛(Monte Carlo,MC)采样的方法,而且它需要采样完整的轨迹数据,计算每个轨迹的回报,然后利用这些回报来更新策略网络的参数。多次采样虽然让它的估计「偏差」较小,但是轨迹的随机性会导致回报「方差」很高,这样训练的收敛速度就会受到影响
Actor-Critic 方法基于值函数 (Value-based) 和基于策略 (Policy-based) 方法的优点,核心思想是:利用 Critic 网络来评估当前策略的好坏,然后 Actor 网络根据 Critic 的评估结果来更新策略。它是一种结合了策略梯度方法和时序差分学习 (Temporal Difference Learning,TD Learning) 的方法。
● Actor:是一个策略网络 $\pi_{\theta}(a|s)$ ,即想要训练的目标模型,负责生成动作。它接受状态 $s$ 作为输入,输出动作 $a$ 的概率分布。Actor 的目标是学好一个策略,使得智能体能尽可能得到高回报。
● Critic :是一个价值函数$V^\pi(s)$ 或一个动作价值函数$Q^\pi(s,a)$, 它接收当前状态 s( 和动作a )作为输入,输出一个对当前状态(或状态-动作对)的评估值。Critic 的目标是准确地评估当前策略的好坏。
● 之前介绍的PG/REINFORCE算法,都只有Actor,而没有Critic这个角色。如果说REINFORCE算法是一种MC方法的话,那Actor-Critic就是它的TD改进版。
强化学习的数据
强化学习中,用于优化策略的数据(即 “经验样本”)是智能体与环境交互的 “产物”,核心来源是智能体执行策略后,环境反馈的 “状态 - 动作 - 奖励 - 下一状态”(State-Action-Reward-Next State, SARSA)等信息构成的轨迹(Trajectory)。一条轨迹通常包含以下关键信息(根据任务需求略有差异):
● s:智能体当前所处的状态(如游戏中角色的位置、血量;机器人传感器的读数);
● a:智能体在状态 s 下执行的动作(如游戏中 “向左移动”“释放技能”;机器人 “转动电机”);
● r:执行动作 a 后,环境给予的即时奖励(如游戏中 “击杀敌人得 10 分”;机器人 “避开障碍物得 1 分”);
● s′:执行动作 a 后,环境转移到的下一状态(如角色移动后的新位置;机器人转动后的新姿态);
● done(可选):是否达到终止状态(如游戏结束、机器人完成任务),用于标记轨迹的终点。
这些轨迹的形式如下:$τ=(s_0,a_0,r_0,s_1,a_1,r1,···,s{T-1},a{T-1},r{T-1},s_{T},done=true)$,其中 T 是轨迹长度。
数据来源1:在线学习(Online Learning)
智能体在与环境实时交互的过程中,边采集样本边优化策略。数据是 “即时生成” 的 —— 智能体每执行一个动作,环境就返回反馈(奖励、下一状态),形成 (状态, 动作, 奖励, 下一状态) 的数据序列,这些新数据会立即用于更新策略,然后用更新后的策略继续与环境交互,形成 “交互→收集数据→更新策略→再交互” 的循环。例如,机器人在物理环境中移动、游戏AI与游戏引擎交互等场景,数据随交互实时产生,且与当前策略紧密相关。
根据采集样本的策略与待优化策略的关系,又分为 “同策略采集” 和 “异策略采集”。
数据来源2:离线学习(Offline Learning / Batch Learning)
智能体先通过某种方式(如人类演示、其他策略的历史交互、模拟环境预采集)收集大量 “离线数据集”,之后完全脱离与环境的实时交互,仅通过这个固定数据集优化策略。数据是 “预先固定” 的,策略更新过程中不再与环境产生新交互。

同策略学习(On-Policy )
用待优化的目标策略直接与环境交互,策略自己为自己采集数据,然后更新策略,样本分布与目标策略分布完全一致
典型算法:
● 蒙特卡洛采样:用当前策略采样完整轨迹,基于轨迹的累积奖励更新策略;
● SARSA 算法:用当前策略采样 “状态 - 动作 - 奖励 - 下一状态 - 下一动作”(SARSA)样本,更新 Q 函数(进而优化策略);
● 近端策略优化(PPO):虽支持一定程度的样本复用,但核心样本仍由当前策略在线采集(每次更新策略前,用当前策略采集一批样本)。
● 优点:样本与策略完全对齐,无 “分布偏移” 问题;
● 缺点:样本利用率低(策略更新后,旧样本因分布与新策略不一致而失效,需重新采集),训练效率较低(尤其在复杂环境中,交互成本高)。

异策略学习(Off-Policy )
一个策略(行为策略,Behavior Policy)与环境交互采集样本,另一个策略(目标策略,Target Policy)利用这些样本中学习并优化自己(借别人的经验,提升自己)。样本分布与目标策略分布可能不一致(需用重要性采样(Importance Sampling) 技术,用来修正不同策略之间的 “数据分布差异”)
典型算法:
● Q-Learning:行为策略通常是 “ε- 贪心策略”(90% 选当前最优动作,10% 随机动作,保证探索),目标策略是 “贪心策略”(只选最优动作),用行为策略的样本更新目标策略的 Q 函数;
● 深度 Q 网络(DQN):延续 Q-Learning 的异策略逻辑,用 ε- 贪心策略采集样本存入 “经验回放池”(Replay Buffer),目标 Q 网络从回放池中随机采样样本更新,进一步提升样本利用率。
● 优点:
○ 样本利用率高,异策略的核心优势就是 “数据复用”,可以利用已有的大量离线数据(行为策略采集的样本可存入回放池,被目标策略反复利用),不需要每次更新策略都重新收集数据,适合与 “离线学习” 结合
○ 探索与利用分离(行为策略可专注于探索未知环境,目标策略可专注于优化性能,避免因 “过度探索” 影响策略收敛)。
● 缺点:样本分布与目标策略可能存在偏差,需通过 重要性采样,经验回放池(Experience Replay Buffer) 解决强化学习训练中的数据相关性、样本利用效率低等问题,尤其 等手段缓解,否则可能导致训练不稳定。

重要性采样
重要性采样(Importance Sampling)是一种利用从一个分布中采样得到的数据来估计另一个分布的期望值的方法,在蒙特卡洛方法中是一种常用的技巧,用于提高估计的效率和准确性。这种方法适用于目标分布难以直接采样,或者直接采样效率较低的情况。在强化学习中主要用于解决异策略(Off-policy)学习中 “数据分布不匹配” 的问题。
异策略学习中,通常存在两个独立的策略:

  1. 行为策略(Behavior Policy, $π_β$):负责与环境交互、收集训练数据的策略(可以是旧策略、探索策略,甚至随机策略)。
  2. 目标策略(Target Policy, $π_θ$):正在训练的,想要优化和提升的策略。
    ● 由于两个策略的决策逻辑不同(比如行为策略偏向 “探索”,目标策略偏向 “利用”),它们生成的数据(状态 - 动作序列)服从完全不同的分布。
    如果直接用行为策略收集的数据训练目标策略,会导致估计偏差,这时就可以用到「重要性采样」做分布修正: 通过一个 “权重”,将行为策略的数据 “修正” 为符合目标策略分布的数据,从而消除分布不匹配带来的偏差。

具体来说,假设我们有一个目标分布 $p(x)$ ,我们希望计算函数 $f(x)$ 在该分布下的期望值 ,但是从分布 $p(x)$ 中采样很困难,或者成本很高。这时我们可以引入一个简单的分布 $q(x)$ ,并从$q(x)$ 中采样,然后使用重要性采样来估计 $p(x)$ 下的期望值。
根据期望的定义,我们可以将 $p(x)$ 下的期望值写成(连续变量版,如果是离散的,把积分换成求和):
$$E_{X \sim p(x)}[f(X)] = \int f(x)p(x)dx$$
如果从 $p(x)$ 中采样比较困难,我们可以引入另一个分布 $q(x)$ ,并对上式进行如下变换:
$$E_{X \sim p(x)}[f(X)] = \int f(x)\frac{p(x)}{q(x)}q(x)dx$$
上式可以看做是函数 $f(x)\frac{p(x)}{q(x)}$在分布 $q(x)$ 下的期望,所以可以将其写为:
$$E_{X \sim p(x)}[f(X)] = \int [f(x)\frac{p(x)}{q(x)}]q(x)dx = E_{X \sim q(x)}[f(x)\frac{p(x)}{q(x)}]$$
其中,$\frac{p(x)}{q(x)}$被称为重要性权重。

在强化学习中,通常需要计算目标策略的期望回报,其中 $p(x)$ 代表目标策略 $\pi(a|s)$ ,而 $q(x)$ 可以代表行为策略$\pi_b(a|s)$ 。因此,我们可以使用行为策略 $\pi_b$ 与环境交互产生数据,然后用重要性采样来估计目标策略 $\pi$ 的期望回报,

重要性采样的方差问题:
虽然重要性采样为我们提供了一种计算不同分布期望值的方法,但它也存在一些问题。其中最主要的问题就是方差问题。当 $\frac{p(x)}{q(x)}$ 的值较大时,会导致估计值的方差很大。特别是在强化学习中,如果目标策略和行为策略差异较大,会导致重要性权重的方差很大,进而导致算法不稳定。

图片参考自从Policy Gradient到PPO的来龙去脉
为了解决这个问题,我们可以采取一些措施,例如:
● 截断重要性采样(Truncated Importance Sampling): 当重要性权重超过某个阈值时,将其截断为该阈值,从而降低方差。
● 使用平滑策略: 尽量使目标策略和行为策略的差异不要太大。
以上重要性采样部分参考【强化学习教程 16】Off-Policy的策略梯度方法
策略梯度的更新总结
由上,我们知道了根据未来奖励期望计算的不同,策略梯度的写法有不同的形式,现在为策略梯度设置一个更通用的形式:

其中, $\Psi_t$是一个通用的系数。不同的选择方式会产生不同的策略梯度更新算法,并且它们的性质也会有所不同。
● PG: $\Psit = \sum{t=0}^T \gamma^{t} r_t$, 此时的梯度更新是无偏的,但是方差较大。
REINFORCE :$\Psit = \sum{k=t}^T \gamma^{k-t} r_k$, 此时的梯度更新是无偏的,但是方差较大。
带有基线的REINFORCE :$\Psit = \sum{k=t}^T \gamma^{k-t} r_k - V^\pi(s)$, 通过减去基线,降低了梯度估计的方差。
● 优势函数:$\Psi_t = A^\pi(s,a) = Q^\pi(s,a) - V^\pi(s)$,这是我们前面讨论的优势函数,它也是一种降低方差的手段。

策略梯度方法的问题
学习率的选择:策略参数进行梯度更新来提升策略:$\theta{t+1} = \theta{t} + \alpha \nabla{\theta} J(\theta)$ ,如果学习率选择过大,会导致策略的更新幅度过大,使得策略性能急剧下降,甚至直接崩溃;如果选择过小,会导致策略的更新速度过慢,训练效率低下。
● 数据无法复用: 普通策略梯度 (PG) 的流程如下:
PG 是「采样数据→ 立刻更新 → 数据废弃」的,一批数据只能用一次,更新后数据分布变了,旧数据就不再符合当前策略分布了
a. 用当前策略 $\pi
{\theta_0}$ 采样数据 $s0$;
b. 用采样数据计算策略梯度,更新一次策略参数 ,得到新策略 $\pi
{\theta1}$;
c. 更新后策略已经变了,那么之前由策略 $\pi
{\theta_0}$ 采样得到的数据 $s0$不再符合新策略 $\pi{\theta_1}$的分布,所以无法再用那批数据继续更新策略
d. 重新采样,继续以上操作,继续更新策略
更新无约束:策略更新幅度无约束,新旧策略的分布差异可能过大,导致基于旧策略采样的数据无法有效指导新策略学习,样本利用率低
● 样本方差大: 策略梯度优化一个核心的假设是可以通过采样的方法来估计策略的梯度。但是当问题的规模变得非常大:比如每次轨迹都非常长,又或者策略模型非常大,为了预估准确的梯度,我们就不得不采样多次,否则就会面临方差很高的问题。

信任区域策略优化(Trust Region Policy Optimization,TRPO)近端策略优化(Proximal Policy Optimization,PPO)是对PG的改进,它们通过引入约束或者限制,来确保每次策略的更新不会太大,从而避免策略崩溃,同时又能够保证策略的持续提升。

TRPO和PPO中都有两个策略,一个是旧策略,一个是新策略,先对于普通策略梯度 (PG) 的始终一个策略,他们的区别在哪?
普通策略梯度方法中,每个数据样本只进行一次梯度更新,而TRPO和PPO可以对同一批采样数据进行多个 epoch 的小批量更新 ,可以提高样本复用率,同一批数据可以被充分利用( epoch),每次只更新小步(小批量),可以平稳优化策略,每次更新幅度小,使得新策略不会偏离旧策略太远。为了让TRPO和PPO在同一批旧策略数据上可以进行多个 epoch 的小批量更新(想用旧策略采样数据来估计新策略的期望回报),TRPO和PPO就是用了重要性采样的思想,通过重要性权重$\frac{\pi\theta}{\pi{\theta_{old}}}$ 修正更新后的策略分布和旧策略上采样得到的数据分布的偏差。
TRPO
信任区域策略优化(Trust Region Policy Optimization,TRPO)的核心思想是引入「信任区域」的概念。所谓「信任区域」,指的是在这个区域内,我们可以信任当前的策略梯度,进行策略的更新。当策略更新超出这个信任区域时,我们就需要重新评估策略的性能,并调整更新方向。
TRPO的优化目标函数是:

其中, $\pi{\theta{old}}$是旧策略, $\pi{\theta}$是新策略,$A^{\pi{\theta{old}}}$是优势函数。这个目标函数和普通的策略梯度方法类似,都是希望最大化期望的累积回报。但将累积奖励$$G(\tau)=\sum_{t=0}^T \gamma^t r_t$$改为了优势函数$ A^{\pi{\theta{old}}}$,轨迹是从旧策略$\pi{\theta{old}}$中采样的,目标函数还在优势函数上加了重要性权重$\frac{\pi\theta}{\pi{\theta{old}}}$ ,用于修正更新后的策略分布和旧策略上采样的数据分布的偏差。
TRPO与普通策略梯度方法的区别在于,它引入了一个约束条件,保证新策略与旧策略的差距不能太大:

其中, $D_{KL}$是KL散度,用来衡量两个策略之间的差异; 是一个预先设定的超参数,表示信任区域的大小。这个约束条件确保了新策略不会偏离旧策略太远,从而保证了策略的单调提升。
TRPO的算法流程:

  1. 采样: 用当前策略 $\pi_{\theta0}$ 采数据,把它冻结,命名为 $\pi{\theta_{old}}$ ,表示旧策略
  2. 计算优势函数: 使用GAE或其他方法计算每一步的优势函数值 $A^{\pi{\theta{old}}}(s,a)$。
  3. 构建目标函数和约束条件: 根据上述公式构建TRPO的目标函数和约束条件。
  4. 求解优化问题: 解带约束的优化问题,得到策略更新量 $\delta \theta$。
  5. 更新策略: 使用得到的策略更新量更新策略参数:$\theta{new} = \theta{old} +\delta \theta$。
  6. 迭代: 使用更新后的策略作为新的旧策略,重复上述步骤。

RLHF
RLHF(Reinforcement Learning from Human Feedback,基于人类反馈的强化学习)是一种结合强化学习和人类反馈的技术,核心是通过人类偏好指导模型优化,使输出更符合人类价值观、安全性和实用性
RLHF流程
RLHF 主要包括3个流程

  1. 第一步:Supervised Fine-Tuning(SFT)监督微调
    用高质量的 “人类指令 - 响应” 数据微调预训练模型,得到初始模型 $model_{sft}$
  2. 第二步:Reward Model(RM)奖励模型训练
    ○ 让模型对同一指令生成多个候选答案,然后人工对后选答案进行质量排序或评分,构建偏好数据集
    ○ 用偏好数据集训练一个奖励模型来预测人类偏好得分
  3. 第三步:Reinforcement Learning(PPO 等)优化策略模型
    ○ 以初始模型 $model{sft}$ 为初始策略,模型的输出由奖励模型打分,作为 RL 的 reward,用强化学习算法(PPO等)优化模型参数,目标是最大化奖励模型的打分(reward)
    ○ 约束:加入 “KL 散度惩罚”(KL Penalty),限制优化后的模型与 SFT 模型的偏离(避免模型忘记预训练知识或输出离谱内容)
    ○ 最终得到对齐人类偏好的模型 $model
    {rlhf}$
    PPO(Proximal Policy Optimization,近端策略优化)
    paper
    PPO 是 OpenAI 提出的强化学习算法,用于在 RLHF 中更新策略模型。
    「近端」一词来源于优化问题中的近端优化(Proximal Optimization)概念。它指的是在优化过程中,通过引入某种约束或惩罚机制,限制每次更新的幅度,使得新策略不会偏离当前策略太远,从而保证优化的稳定性和安全性。
    PPO是TRPO的一种简化版本,它的目标函数是对TRPO的目标函数进行了一些改进
    动机
    ● 传统 RL 中的策略梯度方法容易出现 更新太大导致性能崩坏 的问题
    ● PPO 限制策略更新幅度,确保每次更新不会离旧策略太远
    核心思想
    用 “新旧策略的概率比” 衡量策略变化,在限制策略更新幅度的同时进行优化,以达到稳定、高效的训练结果。

PPO类别
PPO主要有两种实现方式:PPO-Clip 和 PPO-Penalty。
PPO-Clip
PPO-Clip是使用最广泛的一种PPO实现方式,它直接使用上述目标函数进行优化。
PPO-Penalty
PPO-Penalty 则是通过将KL散度约束以惩罚项的形式加入目标函数中,来达到限制策略更新幅度的目的。
$Loss_{penalty} = \mathbb{E}[ r_t(\theta)At - \beta KL(\pi{\theta{old}},\pi{\theta})]$
PPO-Clip
PPO 的有两个关键组件:
● 裁剪机制(Clipping): 限制每次更新的幅度
● 价值网络(Value Network): 相当于评论员Critic,预测"从当前位置开始,预期能得多少分",像一个经验丰富的老师,能预判学生的潜力
对应的,PPO算法使用了两个损失函数:
● 第一个损失函数是近端比率裁剪损失,用于限制策略更新幅度(最核心);
● 第二个损失函数是价值函数损失,用于优化策略。

策略网络:近端比率裁剪损失
PPO算法中,策略网络用于学习和更新策略,这里使用了近端比率裁剪损失,用于限制策略更新幅度。近端比率裁剪损失定义如下:
$Loss_{clip} = \mathbb{E}[ min(r_t(\theta)A_t ,clip(r_t(\theta),1-\epsilon,1+\epsilon)A_t)]$
其中:
● $rt(\theta) = \frac{p{\theta}(a_t | st)}{p{old}(a_t | s_t)}$是策略的更新幅度,表示当前策略$\theta$在状态$s_t$下采取动作$a_t$的概率与旧策略$old$在状态$s_t$下采取动作$a_t$的概率之比,$r_t(\theta)$越大,表示在状态$s_t$下采取动作$a_t$的概率越大,即策略更新幅度越大
● $\epsilon$ 是超参数,用于控制裁剪幅度,通常取0.1~0.2
● $clip(r_t(\theta),1-\epsilon,1+\epsilon)$ 表示将更新幅度$r_t(\theta)$限制在$(1-\epsilon,1+\epsilon)$范围里
● $A_t = Q^\pi(s,a) - V^\pi(s)$ :优势函数,表示在某个状态 s 下,选择某个动作 a 相比于平均水平能提升多少胜率(动作的相对收益,正为优,负为劣)
● 取最小值的原因也是限制策略更新幅度,可分为优势函数为正和负分别讨论
价值网络:价值函数损失
价值函数(由 Critic 网络实现)的核心作用是:
● 输入是状态,输出是该状态的价值估计值(一个标量)
● 估计状态 $s_t$ 的价值$V^\pi(s_t)$ ,即从状态 $s_t$ 开始,遵循当前策略能获得的累积奖励期望。
● 为优势函数 $A_t = Q^\pi(s_t,a_t) - V^\pi(s_t)$ 提供基准。($Q^\pi(s_t,a_t) = rt + \gamma V^\pi(s{t+1})$是动作价值,用即时奖励 $rt$ 和下一状态价值估计 $V^\pi(s{t+1})$ 近似得到),而优势函数是策略优化的核心依据。
PPO 中价值函数损失通常采用均方误差(MSE)损失,目标是让 Critic 网络的预测值 $V^\pi(st)$ 尽可能接近 “真实的累积奖励目标”,价值函数损失定义如下:
$Loss
{value} = \frac{1}{2} \mathbb{E}[(V_{\theta}(st) - V{target}(st))^2]$
其中,$V
{\theta}(s_t)$是Critic 网络(参数为 $\theta$)对状态 $s_t$ 的价值预测(预计从状态 $st$ 开始,遵循当前策略能获得的累积奖励期望”)。
$V
{target}(s_t)$是状态 $st$ 的价值目标(真实累积奖励的估计)。
所以目标值$V
{target}(st)$是从当前时刻 t 开始的所有未来奖励的折扣总和:$V{target}(st) =\sum{k=t}^{T} \gamma^{t-k}r_k$,T是轨迹终止时间步。但实际回报的计算存在一个核心矛盾:当前时刻无法预知未来所有奖励,所以需要通过不同的方法合理估计实际回报。

损失函数
实际实现中,PPO的损失函数通常包含三部分:
$L{total} = L{策略函数损失} - c1 L{价值函数损失} + c2S{\theta}$
其中,$c_1 ,c2$是超参数,用于平衡不同损失函数的权重,$S{\theta}$是策略函数的熵,用于鼓励策略探索,防止策略过早收敛到单一动作

策略函数的熵$S_{\theta}$可以用来衡量策略的不确定性,即策略对于每个状态下的动作的概率分布的随机性。策略的熵越大,策略在每个状态下采取的动作的概率分布就越均匀,策略的探索性就越强。
PPO 的流程
在 RLHF 流程中,PPO 的工作流程如下:

  1. 初始化:用 SFT 模型的权重初始化策略模型(Policy Model),并通常也用它来初始化价值模型(Value Model)。
  2. 采样:从一个指令数据集中随机抽取一个指令(Prompt)。
  3. 生成:策略模型根据指令生成一个回答。
  4. 评估:奖励模型(RM)对“指令-回答”对打分,得到奖励(Reward)。
  5. 价值模型估计状态 $s_t$ 的价值(Value)。
  6. 计算优势:根据奖励和价值计算优势函数。
  7. 更新:使用 PPO 的 Clipped Surrogate Objective 计算损失,并更新策略模型和价值模型的参数。循环:重复步骤 2-6,直到模型收敛。

PPO的算法流程

  1. 采样: 使用旧策略 采样一批轨迹数据。
  2. 计算优势函数: 使用GAE或其他方法计算每一步的优势函数值 。
  3. 构建目标函数: 根据上述公式构建PPO的目标函数。
  4. 优化策略: 使用梯度下降等优化方法,最大化PPO的目标函数,得到新的策略参数 。
  5. 迭代: 使用更新后的策略作为新的旧策略,重复上述步骤。

DPO(Direct Preference Optimization,直接偏好优化)
DPO(Direct Preference Optimization,直接偏好优化)是为解决 PPO 训练复杂问题而生的强化学习方法,核心是‘跳过奖励模型(RM)训练,直接用人类偏好数据优化模型
背景
尽管 PPO 非常成功,但 RLHF 中的 PPO 流程相当复杂。它需要同时维护和训练多个模型(策略模型、价值模型、奖励模型、SFT 参考模型),这使得训练过程非常消耗计算资源和内存,且超参数调整也颇具挑战。正是这些挑战,催生了更简洁的替代方案——DPO。
动机
传统 RLHF 是一个“两步走”的过程:先用偏好数据(A 比 B 好)训练一个能给绝对分数(A 得 90 分,B 得 60 分)的奖励模型,然后再用这个分数去指导强化学习。这个中间的奖励建模步骤不仅复杂,还可能引入误差。
DPO 直接跳过 显式奖励模型 和 RL 采样优化,用一个可解析的似然比目标从偏好数据直接优化策略模型,本质上是将偏好数据转化为一种直接的监督信号
方法

  1. 数据格式:DPO 使用 “成对比较数据”,即对于同一个输入(prompt),人类标注者会给出两个回答(优质回答, 地质回答),记为 $(x,y{chosen},y{reject} )$。
  2. 布拉德利-特里(Bradley-Terry) 偏好模型,常用于比较成对的数据,对于任意两个对象 $i$ 和 $j$ ,若为每个对象分配正实数得分 $p_i$ 和 $p_j$ ,则对象 $i$ 被认为比对象 $j$ 强的概率为:$p(i> j )= \frac{p_i}{p_i+p_j}$
  3. 目标:DPO 的目标是在输入相等的情况下,最大化 “偏好回答” 的概率,同时最小化 “非偏好回答” 的概率

    a. DPO 基于布拉德利-特里(Bradley-Terry) 偏好模型, 假设人类的偏好概率 $p^$ 可以用一个潜在的奖励模型 $r^(y,x)$ 来建模:
    $$ p^*(y_w \succ y_l)= \frac{r^*(y_w,x) }{r^*(y_w,x) + r^*(y_l,x)} $$
    其中,$yw$ 指的是$y{winner}$,即优质回答,$yl$指的是$y{loser}$,即低质回答。 $y_w \succ y_l$ 表示元素 $y_w$ 在某个偏序关系中严格大于(或优于)元素 $y_l$, $ p^*(y_w \succ y_l) $表示策略偏向优质回答的概率,$y_w$ 的奖励比 $y_l$高得越多,人类偏好$y_w$的概率就越大。

    实际场景中,因为$r^(y,x)$ 有正有负,在计算 $p^(y_w \succ y_l)$ 的时候将$r^(y,x)$ 转换为$exp(r^(y,x))$ ,保证其为正实数,因此$$ p^*(y_w \succ y_l)= \frac{exp(r^*(y_w,x)) }{exp(r^*(y_w,x)) + exp(r^*(y_l,x)) } $$

    为避免显式训练一个单独的奖励模型,将潜在的奖励模型 $r^(y,x)$ 定义如下,其中 $\pi ^$ 表示最佳策略(训练时用当前待更新模型 $\pi ^{\theta}$表示),$\pi ^{ref}$ 表示参考策略(当前策略和参考策略都来源于同一个初始模型,但是参考策略参数冻结), $\beta$是超参数,用于缩放奖励。$\pi ^(y,x)$ 表示给定x,策略输出y的概率,奖励模型 $r^(y,x)$ 的含义:待优化模型相对于参考模型,对回答 y 的偏好程度差异。DPO 算法的核心目标是让模型 θ 生成 “人类偏好的回答” 的概率,相对高于 “人类不偏好的回答” 的概率
    $$ r^*(y,x) = \beta log \frac{\pi ^*(y,x) }{\pi ^{ref}(y,x) } + const$$
    把假设的奖励表达式带入$p^(y_w \succ yl)$ ,由下面的恒等式:
    $$log \frac{e^a}{e^a+e^b} = log \frac{1}{1+e^{b-a}} = log \alpha(a-b)$$
    其中$\alpha$表示sigmoid函数,就能得到一个直接可优化的对数似然目标:
    $Loss
    {DPO}(\pi ^ {\theta} ;\pi ^ {ref}) = - log( \alpha (\beta (log \frac{\pi ^ {\theta} (y_w,x)}{\pi ^ {ref} (y_w,x) } - log \frac{\pi ^ {\theta} (y_l,x)}{\pi ^ {ref} (y_l,x) })))$
    DPO希望最小化这个loss,实际上就是最大化$p^
    (y_w \succ y_l)$,即最大化 $y_w$ 被偏好的概率,理想情况,loss的计算中左半部分变大,右半部分变小,即chosen response概率提升,rejected response概率下降,模型训练结束后更倾向选择chosen的答案。
    左边的式子- 右边式子的值,即选择好回答和坏回答的差异:
    ● 左边变大,右边变小,理想情况,good response概率提升,bad response概率下降
    ● 左边变小,右边更小,good response概率下降,但是bad response概率下降的更多,生成的时候还是倾向于good response
    ● 左边变的更大,右边只大了一点点,和2同理
    DPO算法步骤

  4. DPO算法仅包括两个模型:actor model 和 reference model
  5. 微调过程开始时,首先对正在训练的model复制一份,并冻结其可训练参数,成为reference model
  6. 对于每个样本,选择和拒绝的答案由训练和冻结的语言模型评分,这个评分是与每一步所需答案的所有 token 概率的乘积(或和)
  7. 在对选择和拒绝的答案评分后,我们可以计算policy模型给出的评分(R_policy)与冻结reference模型给出的评分(R_reference)之间的比率。
  8. 这些比率然后用于计算最终损失,该损失用于在梯度下降更新中修改模型权重。
    优点
    训练流程简化(仅需 SFT 初始化模型→DPO 单阶段训练)、算力成本低(无需训练 RM 和价值网络);
    缺点
    偏好数据维度少(比如仅二元偏好)时,对齐精细度不如 PPO(PPO 支持多候选排序)。

GRPO(Group Relative Policy Optimization,分队相对策略优化)
我们不仅需要训练本来的大语言模型(也称策略模型),还需要训练一个价值模型,它的大小经常与策略模型相当,这对显存和计算能力有相当的耗费,同时也带来了训练的不稳定等问题。
GRPO(Group Relative Policy Optimization,群组相对策略优化)是一个基于 PPO 的变体,由 DeepSeek 团队在其论文《DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models》中首次提出
它的核心创新在于取消了 价值函数(Critic / Value Network),取而代之的是改为使用多个样本的平均奖励作为基线,从而减少模型结构复杂度和算力开销
背景
PPO 的核心是优势函数$A^\pi(s,a)$ ,它需要一个奖励模型来提供奖励$Q^\pi(s,a)$ ,还需要一个价值模型$V^\pi(s)$来提供基线,即在状态 $s_t$ 下的平均期望回报。训练和维护这个价值模型是 PPO 流程中主要的复杂性和成本来源之一。
方法
GRPO 的核心是对 PPO 中优势函数的计算方式进行了修改。其步骤如下:

  1. 组采样 (Group Sampling):对于一个给定的指令 q,使用当前的策略模型 $\pi ^{\theta}$ 生成一个包含多个回答的组 $o_1,o_2,···,o_n$ 。
  2. 组评估 (Group Evaluation):使用一个奖励函数(可以是一个训练好的奖励模型,也可以是某种可计算的启发式规则,例如代码的执行结果、数学题的答案是否正确等)为组内的每一个回答 $o_i$ 打分,得到奖励 $r_i$。
  3. 组内优势计算 (Group-Relative Advantage Estimation):计算组内所有回答的平均奖励 $\bar{r}$ 和标准差 $\sigma_{r}$ 。对于组内的每一个回答 $o_i$ ,其优势被定义为其归一化后的奖励:$A_i= \frac{r_i- \bar{r}}{\sigma_r}$, 这种方法被称为组内奖励归一化(Group-wise Reward Normalization)。它直接用组内的统计量(均值和标准差)来替代了 PPO 中需要专门训练的价值模型所扮演的角色。
  4. 策略更新:一旦计算出了每个样本的优势 $A_i$ ,接下来的步骤就和 PPO 非常相似了。GRPO 同样使用 Clipped Surrogate Objective 来更新策略模型,对组内每个输出分别计算策略比$rt(\theta)$, (当前策略与旧策略的比值),然后使用 clip 优化目标:
    $Loss
    {grpo-clip} = \mathbb{E}[ min(r_t(\theta)A_t ,clip(r_t(\theta),1-\epsilon,1+\epsilon)A_t)]$
    GRPO 的优势与特点
  5. 高效性: GRPO 最显著的优势是无需价值模型。价值模型通常和策略模型一样大,去掉它可以节省近一半的训练内存和计算量,这对于训练超大规模模型来说意义重大。
  6. 灵活性:GRPO 对奖励函数的定义非常灵活。它不一定需要一个端到端训练的神经网络奖励模型。在某些任务中(如代码生成、数学推理),我们可以设计出可验证的奖励函数(Verifiable Reward Functions)。例如,如果生成的代码能成功运行并通过所有单元测试,就给予高奖励;如果数学题的最终答案正确,也给予高奖励。这种方式使得奖励信号更客观、更廉价。
  7. 稳定性:通过组内归一化,GRPO 使得优势函数的尺度保持在一个稳定的范围内,这有助于稳定训练过程,减少了对超参数的敏感性。

GRPO论文
paper
PPO优化目标如下:

其中:

在 PPO(近端策略优化)中,需要将一个价值函数与策略模型一同训练;并且,为了减轻对奖励模型的过度优化,标准做法是在每个标记(token)的奖励中,加入来自参考模型的逐token KL 散度惩罚。

PPO vs GRPO 流程算法对比:

GRPO优化目标:

需要注意的是,GRPO 并未在奖励中添加 KL 散度惩罚项,而是通过将 “训练策略与参考策略之间的 KL 散度” 直接加入损失函数来实现正则化,从而避免了给优势函数估计的计算带来额外复杂度。
GRPO流程:

μ是一个超参数,它控制了 “在每一批次数据上,对策略模型进行 GRPO 更新的次数”

DAPO
DAPO是字节跳动和清华大学提出的一个对GRPO的改进,其全称是裁剪解耦与动态采样策略优化(Decouple Clip and Dynamic sAmpling Policy Optimization)

Clip-Higher——提高裁剪的上界
这个改进主要基于研究团队在GRPO训练过程中观察到的一个现象——策略模型输出的熵快速下降。这意味着模型随着训练的进行,越来越倾向于利用之前的经验,而很少进行新的探索。研究团队认为,这跟裁剪的上界有关,他们认为,同样的裁剪上界 $\epsilon$,对于较高概率的行为,其被限制后仍然能达到很高的概率,但较低概率的行为,则限制更严。这个某种意义上是有道理的,因为我们裁剪的是重要性比率,即$\frac{\pi{\theta}}{\pi{\theta{old}}}$ ,实际作用到 $\pi{\theta}$上的上界是$(1+\epsilon)\pi{\theta{old}}$ ,原来 \pi{\theta{old}}$越高的,其能增加的也越高。研究团队实验也发现,被上界裁剪的确实多是一些概率较低的标记。
于是研究团队将重要性比率裁剪的上下界进行了解耦:设置两个不同的ϵ,low设置的小一点,high设置的高一点。从而给低概率Token一定增长空间。论文中low被设置成0.2,high被设置成0.28。
动态采样
GRPO中,使用基于规则的奖励,优势的计算是用奖励减去分组的平均奖励再除以分组奖励的标准差,当某些提示词Acc等于1时的梯度消失问题。因为Acc为1时,GRPO一组输出的Reward都是1,Advantage等于0,此时Policy没有优化,因此降低了样本效率。根据经验,精度等于1的样本数量会在训练过程中持续增加。
因此,使用过采样并过滤掉准确度等于1和0的提示词,也就是损失函数中的 s.t. 部分,equivalent的意思是样本时等效的(过滤掉无效的)。具体做法是:在训练前持续采样,直到批次被准确率既不为 0 也不为 1 的样本完全填充。可用于提高训练效率。

使用标记级别的损失
在原来GRPO中,分组内每个样本的损失被赋予了相同的权重(我们是先求每个标记的平均损失,然后再求每个样本的平均损失,解释:由于不同输出序列的长度可能不同(例如有的回答含 10 个 token,有的含 20 个 token),GRPO 会对每个序列中所有 token 的损失项取平均,再在批次内对所有序列的平均损失进一步取平均),这导致了长的优质回答不容易被学习,而长的错误模式(比如不必要的重复等)又不容易被惩罚,导致回答的熵和长度出现异常增长。
为什么较长回复中的Token对总体损失的贡献更低?因为每个样本都被平均到Token级别了,和长度无关了,导致长样本的影响被“稀释”了,对总Loss的贡献和短样本相同。所以就可能导致高质量的长样本学习的较差,而低质量的长文本又无法得到惩罚。
改进部分体现在损失函数的求和部分,改为将 “所有 token 的损失之和” 除以 “所有 token 的总数量”。此时,较长的序列(相比短的)对整体Loss的影响更大。此外,从单个Token的角度来看,如果某种特定的生成模式能够导致奖励的增加或减少,那么无论该模式出现在多长的回复中,它都会被同等地促进或抑制。

超长奖励调整
论文主要研究的是长思维链推理能力的增强,对于一些问题,模型的响应可能会过长,超过了预设的长度限制,传统的做法是进行截断并赋予一个长度惩罚,但这样未免有些粗暴。论文研究团队首先实验了直接在计算损失时不计入被截断的过长样本的损失,发现这样可以很好地稳定训练并提升模型表现。随后,论文研究团队又提出了一个弹性超长惩罚,对于被截断的过长样本,在一定的区间内不予惩罚,超过一定程度后逐步线性增加惩罚,直到一个预设的最大长度,惩罚保持为-1。

GSPO
paper
中文博客:GSPO:迈向持续拓展的语言模型强化学习 | Qwen
动机:
● 在每个 token 级别应用重要性采样,会在长序列中积累高方差,导致训练不稳定。
● 这一问题在 专家混合模型(Mixture-of-Experts, MoE) 中尤为严重,因为 token 级别的路由变化会加剧不稳定性。
GSPO(Group Sequence Policy Optimization,分组序列策略优化)是阿里巴巴的千问团队提出的一个对于GRPO的改进,其核心要义在于将原先GRPO中token级别的重要性比率裁剪改为序列接别的,从而增强训练的稳定性。
设 x 为查询,$\pi{\theta{old}}$为用于采样回复的策略,${yi} {i=1}^G$为采样得到的回复组,$\hat{Ai}$为各个回复的组内相对优势,为需优$\pi{\theta}$化的当前策略。GSPO 采用以下优化目标:

要理解GSPO设计的理念,需要回到重要性比率的意义,PPO引入重要性比率本质上在提高样本的利用率,在策略梯度定理的推导中引入了一个期望,通过采样求平均的方式来近似,但是每次模型更新都重新采样对计算资源会带来巨大的浪费,于是使用重采样,使用之前策略产生的样本但乘以一个重要性比率。
GRPO中,重要性比率是对每个标记计算并应用的,但奖励或者优势又往往是对于整个序列而言的,这就导致了 优化目标和奖励目标的颗粒度不匹配,给训练梯度带来了高方差的噪声,这个噪声会随着长序列而累积并被裁剪操作放大。据此,千问的团队提出了GSPO,在序列级别上应用重要性比率。
这里的 $s_i(θ)$ 即为 GSPO 基于序列似然定义的重要性比率,这种采样权重的设计自然地缓解了逐 token 方差的累积问题,从而显著提升了训练过程的稳定性。
此外,GSPO 对 序列级的重要性比率 $s_i(θ)$还做了 长度归一化,不同问题的回答长度差别很大,如果不归一化,importance ratio 会对长度非常敏感,
最后,因为同一个序列中的所有 token 共用同一个重要性权重,一旦发生 clipping,被裁剪掉的就是 整个序列,而不是像 GRPO 那样只影响部分 token

GFPO

Sample More to Think Less: Group Filtered Policy Optimization for Concise Reasoning
微软:分组过滤策略优化(Group Filtered Policy Optimization,GFPO)
核心思想:少思考,多采样
大型语言模型(LLM)领域日益凸显的问题:“答案虚胖”。使用强化学习(RL)来训练模型解决复杂问题(如数学、编程)时,模型为了获得更高的分数(奖励),倾向于生成越来越长的答案。这种现象被称为“长度爆炸”(Length Inflation)。然而,更长的答案并不总是意味着更高质量的推理。很多时候,增加的文本只是重复、啰嗦的“填充物”,并没有提供实质性的解题步骤,反而增加了计算成本和用户的阅读负担。

GFPO 的核心思想并非设计一种全新的 RL 算法,而是在 GRPO 的框架内引入一个简单而有效的过滤步骤。其理念可以概括为:通过在训练数据层面进行主动筛选,来隐式地塑造模型的行为,而不是依赖复杂的奖励函数工程。
“基于选择性采样的隐式奖励塑造”:传统方法可能会设计复杂的奖励函数来惩罚长度,GFPO另辟蹊径:它不直接修改奖励函数,而是在训练的“原材料”上下功夫。通过在每次训练迭代中生成一大批候选答案,然后只把那些“短小精悍”的答案喂给模型去学习,被拒绝的答案则完全不参与梯度更新。这种“只看好榜样”的学习方式,间接地引导模型朝着我们期望的方向进化。

GFPO 的完整流程如下:

  1. 扩大采样:对于每个问题q ,GFPO 会从当前策略 π 中采样一个比标准 GRPO 更大的响应组 G。例如,如果 GRPO 使用 G=8,GFPO 可能会使用 G=16 或 G=24。这一步的目的是为了增加生成「理想」响应(既正确又简洁的响应)的概率,为后续的筛选提供更丰富的候选池。
  2. 度量与过滤:这是 GFPO 的核心。算法会使用一个用户指定的度量函数 metric(·) 来为采样出的G个响应打分。然后,根据分数对所有响应进行排序,并只选择其中最优的K个响应,形成一个保留子集 S。新的优化指标:除了传统的正确率奖励,GFPO还引入了两个关键的筛选指标:响应长度(Response Length)和 令牌效率(Token Efficiency)(即奖励与长度的比值),引导模型学习简洁性。
  3. 选择性学习:在计算优势函数和策略梯度时,只有被选入子集 S中的K 个响应会被用于学习。对于那些未被选中的响应,它们的优势值将被强制设为零。这意味着这些被「拒绝」的响应不会对模型的参数更新产生任何影响。
    GFPO Vs. GRPO:

GFPO 目标函数:

其关键在于优势函数 的定义:
这里,μ 和 σ 分别是保留子集 S中K 个响应的奖励均值和标准差。最重要的是$m_i$ ,它是一个二进制掩码(mask):如果响应$o_i$ 在子集S 中,则$m_i=1$ ;否则 $m_i=0$。正是这个掩码$m_i$ 实现了选择性学习,它将不符合期望的响应从梯度计算中「屏蔽」掉。
这种机制是一种隐式奖励塑造(Implicit Reward Shaping)。它没有直接修改奖励R本身,而是通过数据过滤,告诉模型什么样的响应是「值得学习的」。这种方法比手动调整多目标奖励函数中的权重(例如 )要更加直接和稳定。
GFPO 的主要干预措施是在 Advantage 估计层面,使其可与任何 GRPO 类似的方法兼容,例如 DAPO、Dr. GRPO 或带有 Dual-Clip PPO 损失的 GRPO。

奖励模型
输入:状态 + 动作 / prompt + 生成结果(任务依赖)。
输出:一个标量分数,衡量质量或偏好。
训练方式:通常直接用 神经网络(尤其是 Transformer、CNN、MLP 等)建模,具体取决于输入模态,如:
● 自然语言任务(RLHF)
○ 用一个大语言模型(Transformer)作为 backbone。
○ 输入是 Prompt + 模型生成的候选文本。
○ 在最后的 [CLS] token 或 pooling 层 上接一个线性头,输出标量 reward。
● 图像任务(如图像生成偏好学习)
○ 用 CNN / Vision Transformer 提取图像特征,最后接一个 MLP 输出标量。
● 强化学习控制任务(IRL/Preference Learning)
○ 输入是状态 s 或 (状态, 动作) (s,a)。
○ 网络一般是 MLP,输出一个 reward 值。

人类偏好标注数据
让人类标注者针对智能体(如初始 LLM)的输出进行标注。
具体操作:先让基础模型(如未经 RLHF 的 GPT-3)对大量用户问题生成多个候选回复(如每个问题生成 3-5 个不同回复),再由标注者对这些回复进行偏好判断。
标注方式(两种核心模式):
● 单样本绝对标注
标注者针对单个回复,按预设标准(如 “准确性、相关性、流畅性、安全性”)打分。
● Pairwise 对比标注
标注者面对两个候选回复(A 和 B),直接判断 “哪个更符合人类偏好”,输出 A>B、B>A 或两者相当。

奖励模型的损失
奖励模型(Reward Model, RM)的 损失函数 一般不是直接 MSE,而是基于 排序/偏好学习 (preference learning) 设计的
针对绝对评分:回归损失(Regression Loss)
目标是让模型预测分与人类标注分的误差最小,常用 均方误差(MSE) 或 平均绝对误差(MAE):
Loss = MSE(模型预测分, 人类标注分)
配对比较损失(Pairwise Loss)最主流场景
基于 Bradley–Terry 的思想,假设人类给了一个偏好对 $(y1,y2)$,并标注说 $y1≻y2$ ,奖励函数打分: $r\theta (y1)$ ,$r\theta (y2)$ ,定义概率:$$p(y1 \succ y2)= \frac{exp(r_\theta (y1)) }{exp(r_\theta (y1)) + exp(r_\theta (y2)) }$$
损失函数:$L(θ)=−log⁡(P(y1 \succ y2))$
由于 $$log \frac{e^a}{e^a+e^b} = log \frac{1}{1+e^{b-a}} = log \alpha(a-b)$$,因此也可以写成$L(θ)=−log⁡(sigmod(y1- y2)) $的形式
思想:如果人类更喜欢 y1,模型就要学到 $r\theta (y1)>r\theta (y2)$
margin优化:
直接优化 “更优行为分数 ≥ 较差行为分数 + 边际值(margin)”,强制两者分数差距至少达到一个阈值margin(避免模型输出微小差异),有时用 Hinge Loss 风格:
$L(θ)=max(0,m-(r\theta (y1)-r\theta (y2)))$
列表排序损失(Listwise Loss)—— 多候选场景
Listwise Ranking Loss 是 奖励模型在有多个候选输出时(不仅仅是二选一)常用的一类偏好损失。它的核心思想是:用 softmax 把奖励模型的打分转化成一个概率分布,然后和人类提供的排序分布做交叉熵损失,让模型对整个列表的分数排序,与真实偏好排序尽可能一致,直接优化 “排序质量”。

  1. 给定同一个输入(例如同一个 prompt),假设模型生成了 n 个候选输出 $y_1,y2,···,yn$,奖励模型打分$r\theta (y_i)$
  2. 把奖励模型的打分转化为一个概率分布:$p(yi)= \frac{exp(r\theta (y_i)) }{\sumj exp(r\theta (y_j)) }$, 这个 softmax 分布表示奖励模型对候选的偏好概率。
  3. 计算真实偏好的理想分布 $q(y_i)$ :
    ● Top-1 选择: 人类只在多个候选里挑出一个“最好”的, 那么$q(y_i)$ 就是一个 one-hot 分布,选择的为1,其余为0
    ● 完整排序(Full ranking): 如果人类给出了一个完整的排序,比如:$y_2≻y_1≻y3$,可按照 $q{y_i} = \frac{1 / rank_i} {Σ_j (1 / rank_j)}$ 计算(rank_i是行为 i 在真实排序中的名次,名次越靠前,q_i越大);
  4. 交叉熵(cross-entropy loss)定义预测分布和人类偏好分布的差异:$Loss = - Σ_i q(y_i) · log(p(y_i))$

奖励函数设计的核心原则
在设计奖励函数前,先了解几个核心原则:

  1. 目标对齐:奖励信号必须清晰、无歧义地指向你希望智能体最终达成的业务目标。
  2. 稀疏性与稠密性: 稀疏奖励只在任务完成或失败时给出(如游戏赢或输),但可能导致学习困难。稠密奖励则提供更频繁的中间反馈,引导智能体学习,通常需要在二者间取得平衡
  3. 可量化:业务目标应能转化为可计算的数值信号。例如,用户体验这类抽象概念,可以通过“用户满意度评分”、“点击率”等指标来量化。
  4. 平衡与权重:当奖励函数包含维度时,需要为不同部分分配合适的权重。
    reward的设计如何和业务结合?
    reward 是优化目标,要想让模型为业务服务,必须让 reward 与业务指标(KPI)强相关。具体流程:明确业务目标 → 找到可量化指标 → 组合成 reward → 增加惩罚项避免模型“投机取巧”
    ● 短视频推荐:在短视频平台的推荐业务中,reward 可以设计为与用户互动相关的指标。例如,用户对视频的点赞、评论、转发行为可以分别赋予不同的正奖励,而用户快速划走视频则给予负奖励。快手的研究团队在短视频推荐场景中,提出了 R1-Reward,其奖励函数包括格式奖励、结果奖励和一致性奖励。格式奖励要求模型的输出符合指定格式,鼓励模型在给出最终答案之前先进行推理;结果奖励则是确保模型最终生成的答案与人类专家的偏好一致;一致性奖励是让模型的分析过程和最终答案保持一致,通过这样的设计提升了短视频推荐的性能。

参考
强化学习入门:基本思想和经典算法 - 知乎 (zhihu.com)
从Policy Gradient到PPO的来龙去脉
强化学习7-PPO(Agent-only) 逐行代码讲解
近端策略优化 (PPO) 算法深度解析
DPO详解
强化学习入门,小学生都可以读懂的DPO,PPO
从 PPO、DPO 到 GRPO:万字长文详解大模型训练中的三大关键算法

相关文章
|
9月前
|
数据可视化 Ubuntu 数据挖掘
linux中使用R语言
R语言是一种专用于统计计算和数据分析的编程语言,以其强大的数据处理能力和丰富的可视化功能著称。在Linux中安装R非常简单,通过`sudo apt install r-base`即可完成。R支持基本数据分析和复杂的数据可视化,如使用ggplot2包绘制精美图形。此外,R还能生成甘特图等项目管理工具,帮助清晰展示项目进度。无论是数据处理还是可视化,R都表现出色,适合各种数据分析任务。
449 3
|
20小时前
|
自然语言处理
主流大模型结构
本文介绍了四大模型架构:Encoder-Decoder、Decoder-Only、Encoder-Only和Prefix-Decoder,涵盖代表模型与应用场景。详解GPT系列演进、LLaMA发展及主流中文大模型,并对比GPT-4、LLaMA-3、Qwen等在架构、参数量与上下文长度等方面的异同。
|
20小时前
|
机器学习/深度学习 网络架构
前馈神经网络
前馈网络(FFN)是Transformer的核心模块,提供非线性变换。标准FFN为两层线性加激活函数,扩展倍数通常为4;MoE则通过稀疏激活、动态路由提升模型容量与效率。常用激活函数包括ReLU、GELU(BERT采用)和SwiGLU(LLaMA采用)。相比标准FFN,MoE参数更多、表达更强,计算更高效。
|
20小时前
|
机器学习/深度学习 存储 缓存
注意力机制详解
注意力机制是Transformer核心,通过自注意力、交叉注意力等实现序列间动态关联。多头、分组、多查询等变体在效率与性能间权衡,广泛应用于大模型设计,助力高效长序列建模与推理优化。
|
20小时前
|
机器学习/深度学习 自然语言处理 算法
分词器详解
分词器将文本转为模型可处理的数字序列,主流算法有BPE、WordPiece和SentencePiece。BPE高效但中文支持弱;WordPiece用于BERT,适合英文;SentencePiece语言无关,支持中日文。实战中常用SentencePiece处理中文,Hugging Face工具处理英文。面试需掌握算法差异、中文分词策略、词汇表设计及OOV问题解决。
|
1天前
|
存储 Java 编译器
Java泛型类型擦除以及类型擦除带来的问题
Java泛型在编译时会进行类型擦除,所有泛型信息被移除,替换为原始类型(如Object或限定类型)。例如,List<String>和List<Integer>在运行时均为List,导致反射可绕过泛型限制。类型检查发生在编译期,针对引用而非对象本身。擦除后通过桥方法解决多态冲突,自动插入类型转换,但不支持基本类型、静态成员不能使用类级泛型参数,且instanceof无法用于泛型类型判断。
|
1天前
|
Java 大数据
ArrayList扩容机制
ArrayList添加元素时,先调用ensureCapacityInternal()确保容量,首次添加时默认扩容至10。每次扩容通过grow()实现,新容量为原容量的1.5倍(oldCapacity + (oldCapacity >> 1)),提升性能。当元素数超过当前容量时触发扩容,保证后续添加不越界。注意:length用于数组,length()用于字符串,size()用于集合。
|
5月前
|
缓存 编译器 Shell
【实战指南】 CMake搭建编译环境总结
本文总结了使用CMake搭建编译环境的技巧,涵盖单个及多个源文件的编译、CMakeLists嵌套管理、变量设置、交叉编译配置、常用编译选项及警告处理等内容。通过实例说明了如何高效组织工程结构,并利用CMake灵活控制编译流程,适用于嵌入式开发场景。
760 42
|
4月前
|
Web App开发 小程序 网络安全
Charles抓包微信小程序请求响应数据
Charles抓包微信小程序请求响应数据
513 0
|
存储 网络协议 数据安全/隐私保护
OSI七层模型 (详细讲解,看这一篇就够了)
OSI七层模型 (详细讲解,看这一篇就够了)
12092 0