RL之ppo训练

news2025/5/13 11:41:26

又是一篇之前沉在草稿箱的文章,放出来^V^
PPO原理部分这两篇就够了:

  • 图解大模型RLHF系列之:人人都能看懂的PPO原理与源码解读
  • 人人都能看懂的RL-PPO理论知识

那些你或多或少听过的名词

  • actor-critic: actor表示策略,critic表示价值。区别于value-based 和 policy-based(典型方法:REINFORCE、以及其变种GRPO、RLOO)
英文名中文名符号解释详情直达
state状态 s s s表示当前环境所处的状态,当前环境可能包含的所有状态的集合称为 状态空间 state space深入理解强化学习(一)- 概念和术语
observation观测-表示从智能体角度对当前状态的观测。
action动作 a a a表示智能体采取的动作,智能体所有可以采取的动作的集合称为 动作空间 action space
reward奖励 r r r表示环境当前状态好坏程度的值,也可以理解为环境对于智能体在状态 s s s 下采取动作 a a a 的反馈。
policy策略 π / μ \pi / \mu π/μ表示智能体基于当前环境状态选择动作所服从的分布,分为 随机策略 stochastic确定性策略 deterministic。随机策略表示动作的选择是随机的、未知的,确定性策略表示在特定状态下选择动作的概率分布是已知的、确定的。
trajectory轨迹 τ \tau τ表示智能体和环境交互的路径,比如 T T T 轮交互的轨迹可以表示为 ( s 0 , a 0 , … , s i , a i , … , s T − 1 , a T − 1 , s T ) (s_0, a_0, \dots, s_i, a_i, \dots, s_{T-1}, a_{T-1}, s_T) (s0,a0,,si,ai,,sT1,aT1,sT),其中 s i s_i si a i a_i ai 分别表示第 i i i 轮的状态和动作。很多时候,轨迹也可以等价于episode(回合)或者rollouts
return收益 / 回报-表示从初始状态到达终止状态的累积奖励。
cumulative return累积收益G表示某一次遍历过程中,从当前状态到达终止状态的累积奖励。 G G G 值的意义在于:一次遍历过程中,某个状态到最终状态奖励的总和。 G t = r t + 1 + γ r t + 2 + ⋯ = ∑ k = 0 ∞ γ k r t + k + 1 G_t = r_{t+1} + \gamma r_{t+2} + \cdots = \sum_{k=0}^{\infty} \gamma^k r_{t+k+1} Gt=rt+1+γrt+2+=k=0γkrt+k+1 这里 G t G_t Gt 就表示状态 S t S_t St 到达最终状态的折扣收益。 累积收益表示选择了当前状态 S t S_t St 之后到达最终状态的累积收益,与选择当前状态的奖励 r t r_t rt 无关深入理解强化学习(二)- 强化学习问题
discount factor折扣因子 γ \gamma γ表示用来衡量当前状态之后时刻的累积收益对于当前时刻累积收益影响的加权因子。计算累积收益时,考虑到距离越远的策略选择对于当前状态的影响越小,所以乘以折扣因子 γ \gamma γ深入理解强化学习(二)- 强化学习问题
State Value Function状态值函数V表示某一策略下,计算某一个状态到终止状态累积奖励期望的函数。也称V值,是 G t G_t Gt的期望。考虑到初始的策略是随机的,因此每一次初始状态达到最终状态的路径也是随机的,这导致每一次遍历时各状态的 G t G_t Gt都是一个不确定值。但是理论上只要一个系统存在最优策略,那么状态 S t S_t St下的动作 A t A_t At应该是确定的,所以 G t G_t Gt的期望是一个确定值。
当智能体采用策略 π \pi π 来进行动作选择时,累积收益服从一个分布,累积收益在状态 s s s 处的期望值定义为状态价值函数: v π ( s ) = E π [ ∑ k = 0 ∞ γ k r t + k + 1 ∣ S t = s ] v_{\pi}(s) = \mathbb{E}_{\pi} \left[ \sum_{k=0}^{\infty} \gamma^k r_{t+k+1} \mid S_t = s \right] vπ(s)=Eπ[k=0γkrt+k+1St=s] 注:状态值函数与策略 π \pi π 是对应的,这是因为策略 π \pi π 决定了累积收益 G G G 的概率分布。上面的公式好像有点问题,待确认,以下面为先 V π ( s t ) = E π [ G t ∣ s t ] = E a t ∼ π ( ⋅ ∣ s t ) [ E s t + 1 ∼ P ( ⋅ ∣ s t , a t ) [ r t + γ V π ( s t + 1 ) ] ] V_\pi(s_t) = E_\pi[G_t \mid s_t] = E_{a_t \sim \pi(\cdot \mid s_t)} \left[ E_{s_{t+1} \sim P(\cdot \mid s_t, a_t)} \left[ r_t + \gamma V_\pi(s_{t+1}) \right] \right] Vπ(st)=Eπ[Gtst]=Eatπ(st)[Est+1P(st,at)[rt+γVπ(st+1)]]
深入理解强化学习(二)- 强化学习问题
state-action value function状态-动作值函数 Q Q Q表示某一策略下,计算某一状态下选择的某一个动作到达终止状态的累积奖励期望的函数。上面提到 V V V 值是每一个状态的累积收益期望,那么每个动作自然也可以定义其对应的累积收益期望。因此,我们可以定义状态 s s s 下选择动作 a a a 的状态-动作值函数(State-Action Value function),对应 Q Q Q 值: q π ( s , a ) = E π [ ∑ k = 0 ∞ γ k r t + k + 1 ∣ S t = s , A t = a ] q_{\pi}(s, a) = \mathbb{E}_{\pi} \left[ \sum_{k=0}^{\infty} \gamma^k r_{t+k+1} \mid S_t = s, A_t = a \right] qπ(s,a)=Eπ[k=0γkrt+k+1St=s,At=a]
一个状态的 V V V值就是这个状态下所有动作的 Q Q Q值在策略 π \pi π下的期望。 在模型中就是当前时刻的reward model打分加上下一时刻的critic model 打分 = R t + γ ⋅ V t + 1 R_t + \gamma \cdot V_{t+1} Rt+γVt+1 作为该值的等价计算
上面的公式好像有点问题,待确认,以下面为先: Q π ( s t , a t ) = E π [ G t ∣ s t , a t ] = E s t + 1 ∼ P ( ⋅ ∣ s t , a t ) [ r + γ V π ( s t + 1 ) ] Q_\pi(s_t, a_t) = E_\pi[G_t \mid s_t, a_t] = E_{s_{t+1} \sim P(\cdot \mid s_t, a_t)} \left[ r + \gamma V_\pi(s_{t+1}) \right] Qπ(st,at)=Eπ[Gtst,at]=Est+1P(st,at)[r+γVπ(st+1)]
深入理解强化学习(二)- 强化学习问题
state transition
probability
状态转移概率 P P P表示环境中状态转移的概率分布函数,如 P s s ′ a P_{ss'}^a Pssa 表示在状态 s s s 下选择动作 a a a 之后转移到状态 s ′ s' s 的概率。深入理解强化学习(二)- 强化学习问题
expected return收益期望 J ( π ) J(\pi) J(π)表示策略 π \pi π 下,一条从初始状态到达终止状态的累积奖励期望。深入理解强化学习(二)- 强化学习问题
optimal policy最优策略 π ∗ \pi^* π表示使得收益期望最大的策略。深入理解强化学习(二)- 强化学习问题
advantage function优势函数 A ( s , a ) A(s, a) A(s,a)表示计算状态 s s s 下选择动作 a a a 相较于随机选择动作的额外奖励程度的函数。深入理解强化学习(二)- 强化学习问题

Policy-based强化学习优化目标
强化学习的优化过程可以总结为:

  • 价值评估:给定一个策略 π \pi π,如何准确评估当前策略的价值 V π V_{\pi} Vπ
  • 策略迭代:给定一个当前策略的价值评估 V π V_{\pi} Vπ,如何据此优化策略 π \pi π

整个优化过程由以上两点交替进行,最终收敛,得到我们想要的最优策略 π ∗ \pi^* π 和能准确评估它的价值函数 V π ∗ V_{\pi^*} Vπ

ppo原理整理

目标函数

现在我们知道强化学习的总优化目标是:

arg ⁡ max ⁡ π θ J ( π θ ) = E τ ∼ π θ [ R ( τ ) ] = ∑ τ R ( τ ) P ( τ ∣ π θ ) \arg \max_{\pi_\theta} J(\pi_\theta) = E_{\tau \sim \pi_\theta}[R(\tau)] = \sum_{\tau} R(\tau) P(\tau | \pi_\theta) argπθmaxJ(πθ)=Eτπθ[R(τ)]=τR(τ)P(τπθ)

我们据此来计算梯度:
∇ J ( π θ ) = ∑ τ R ( τ ) ∇ P ( τ ∣ π θ ) = ∑ τ R ( τ ) P ( τ ∣ π θ ) ∇ P ( τ ∣ π θ ) P ( τ ∣ π θ ) = ∑ τ R ( τ ) P ( τ ∣ π θ ) ∇ log ⁡ ( P ( τ ∣ π θ ) ) = E τ ∼ π θ [ R ( τ ) ∇ log ⁡ ( P ( τ ∣ π θ ) ) ] \begin{align*} \nabla J(\pi_\theta) &= \sum_{\tau} R(\tau) \nabla P(\tau | \pi_\theta) \\ &= \sum_{\tau} R(\tau) P(\tau | \pi_\theta) \frac{\nabla P(\tau | \pi_\theta)}{P(\tau | \pi_\theta)} \\ &= \sum_{\tau} R(\tau) P(\tau | \pi_\theta) \nabla \log(P(\tau | \pi_\theta)) \\ &= E_{\tau \sim \pi_\theta}[R(\tau) \nabla \log(P(\tau | \pi_\theta))] \end{align*} J(πθ)=τR(τ)P(τπθ)=τR(τ)P(τπθ)P(τπθ)P(τπθ)=τR(τ)P(τπθ)log(P(τπθ))=Eτπθ[R(τ)log(P(τπθ))]

引入重要性采样:(下面梯度公式写法更上面略有不同,但是第一个等号后面的跟上面的其实一样) 详情参考1 参考2 参考3(python实现)
∇ R ˉ θ = E τ ∼ p θ ( τ ) [ R ( τ ) ∇ log ⁡ p θ ( τ ) ] = E τ ∼ p θ ′ ( τ ) [ p θ ( τ ) p θ ′ ( τ ) R ( τ ) ∇ log ⁡ p θ ( τ ) ] \begin{align*} \nabla \bar{R}_\theta &= \mathbb{E}_{\tau \sim p_\theta(\tau)} \left[ R(\tau) \nabla \log p_\theta(\tau) \right] \\ &= \mathbb{E}_{\tau \sim p_{\theta'}(\tau)} \left[ \frac{p_\theta(\tau)}{p_{\theta'}(\tau)} R(\tau) \nabla \log p_\theta(\tau) \right] \\ \end{align*} Rˉθ=Eτpθ(τ)[R(τ)logpθ(τ)]=Eτpθ(τ)[pθ(τ)pθ(τ)R(τ)logpθ(τ)]

实际在做策略梯度的时候,我们并不是给整个轨迹 τ \tau τ一样的分数,而是将每一个状态-动作对分开计算。实际更新梯度的过程可写为:
E ( s t , a t ) ∼ π θ [ A θ ( s t , a t ) ∇ log ⁡ p θ ( a t n ∣ s t n ) ] \mathbb{E}_{(s_t, a_t) \sim \pi_\theta} \left[ A^\theta(s_t, a_t) \nabla \log p_\theta(a_t^n | s_t^n) \right] E(st,at)πθ[Aθ(st,at)logpθ(atnstn)]

我们用演员 θ \theta θ 采样出 s t s_t st a t a_t at,采样出状态-动作的对,我们会计算这个状态-动作对的优势(advantage) A θ ( s t , a t ) A^\theta(s_t, a_t) Aθ(st,at),就是它有多好。 A θ ( s t , a t ) A^\theta(s_t, a_t) Aθ(st,at) 即用累积奖励减去基线,这一项就是估测出来的。它要估测的是,在状态 s t s_t st 采取动作 a t a_t at 是好的还是不好的。接下来在后面乘 ∇ log ⁡ p θ ( a t n ∣ s t n ) \nabla \log p_\theta(a_t^n | s_t^n) logpθ(atnstn),也就是如果 A θ ( s t , a t ) A^\theta(s_t, a_t) Aθ(st,at) 是正的,就要增大概率;如果是负的,就要减小概率。

我们可以通过重要性采样把同策略变成异策略,从 θ \theta θ 变成 θ ′ \theta' θ。所以现在 s t , a t s_t, a_t st,at θ ′ \theta' θ 与环境交互以后所采样到的数据。但是训练时,要调整的参数是模型 θ \theta θ。因为 θ ′ \theta' θ θ \theta θ 是不同的模型,所以我们要有一个修正的项。这个修正的项,就是用重要性采样的技术,把 s t , a t s_t, a_t st,at θ \theta θ 采样出来的概率除以 s t , a t s_t, a_t st,at θ ′ \theta' θ 采样出来的概率。

E ( s t , a t ) ∼ π θ ′ [ p θ ( s t , a t ) p θ ′ ( s t , a t ) A θ ( s t , a t ) ∇ log ⁡ p θ ( a t n ∣ s t n ) ] = E ( s t , a t ) ∼ π θ ′ [ p θ ( s t , a t ) p θ ′ ( s t , a t ) A θ ‘ ( s t , a t ) ∇ log ⁡ p θ ( a t n ∣ s t n ) ] = E ( s t , a t ) ∼ π θ ′ [ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) p θ ( s t ) p θ ′ ( s t ) A θ ′ ( s t , a t ) ∇ log ⁡ p θ ( a t n ∣ s t n ) ] = E ( s t , a t ) ∼ π θ ′ [ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A θ ′ ( s t , a t ) ∇ log ⁡ p θ ( a t n ∣ s t n ) ] \begin{align*} \mathbb{E}_{(s_t, a_t) \sim \pi_{\theta'}} \left[ \frac{p_\theta(s_t, a_t)}{p_{\theta'}(s_t, a_t)} A^\theta(s_t, a_t) \nabla \log p_\theta(a_t^n | s_t^n) \right] &= \mathbb{E}_{(s_t, a_t) \sim \pi_{\theta'}} \left[ \frac{p_\theta(s_t, a_t)}{p_{\theta'}(s_t, a_t)} A^{\theta‘}(s_t, a_t) \nabla \log p_\theta(a_t^n | s_t^n) \right] \\ &=\mathbb{E}_{(s_t, a_t) \sim \pi_{\theta'}} \left[ \frac{p_\theta(a_t | s_t)}{p_{\theta'}(a_t | s_t)} \frac{p_\theta(s_t)}{p_{\theta'}(s_t)} A^{\theta'}(s_t, a_t) \nabla \log p_\theta(a_t^n | s_t^n) \right] \\ &=\mathbb{E}_{(s_t, a_t) \sim \pi_{\theta'}} \left[ \frac{p_\theta(a_t | s_t)}{p_{\theta'}(a_t | s_t)} A^{\theta'}(s_t, a_t) \nabla \log p_\theta(a_t^n | s_t^n) \right] \end{align*} E(st,at)πθ[pθ(st,at)pθ(st,at)Aθ(st,at)logpθ(atnstn)]=E(st,at)πθ[pθ(st,at)pθ(st,at)Aθ(st,at)logpθ(atnstn)]=E(st,at)πθ[pθ(atst)pθ(atst)pθ(st)pθ(st)Aθ(st,at)logpθ(atnstn)]=E(st,at)πθ[pθ(atst)pθ(atst)Aθ(st,at)logpθ(atnstn)]

所以实际上,当我们使用重要性采样的时候,要去优化的目标函数为
J θ ′ ( θ ) = E ( s t , a t ) ∼ π θ ′ [ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A θ ′ ( s t , a t ) ] J^{\theta'}(\theta) = \mathbb{E}_{(s_t, a_t) \sim \pi_{\theta'}} \left[ \frac{p_\theta(a_t | s_t)}{p_{\theta'}(a_t | s_t)} A^{\theta'}(s_t, a_t) \right] Jθ(θ)=E(st,at)πθ[pθ(atst)pθ(atst)Aθ(st,at)]
我们将其记为 J θ ′ ( θ ) J^{\theta'}(\theta) Jθ(θ),因为 J θ ′ ( θ ) J^{\theta'}(\theta) Jθ(θ) 括号里面的 θ \theta θ 代表我们要去优化的参数。 θ ′ \theta' θ 是指我们用 θ ′ \theta' θ 做示范,就是现在真正在与环境交互的是 θ ′ \theta' θ。因为 θ \theta θ 不与环境交互,是 θ ′ \theta' θ 在与环境交互。然后我们用 θ ′ \theta' θ 与环境交互,采样出 s t s_t st a t a_t at 以后,要去计算 s t s_t st a t a_t at 的优势 A θ ′ ( s t , a t ) A^{\theta'}(s_t, a_t) Aθ(st,at),再用它乘 p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) \frac{p_\theta(a_t | s_t)}{p_{\theta'}(a_t | s_t)} pθ(atst)pθ(atst) p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) \frac{p_\theta(a_t | s_t)}{p_{\theta'}(a_t | s_t)} pθ(atst)pθ(atst) 是容易计算的,我们可以从采样的结果来估测 A θ ′ ( s t , a t ) A^{\theta'}(s_t, a_t) Aθ(st,at),所以 J θ ′ ( θ ) J^{\theta'}(\theta) Jθ(θ) 是可以计算的。实际上在更新参数的时候,我们就是按照式 (5.5) 来更新参数的。

LOSS详情

整体由两部分loss构成,其中actor_loss是我们目标的actor模型优化,而critic_loss主要是为了保证我们的打分足够准,确保优势函数是无偏估计。
Loss第一部分:actor_loss
以ppo-clip为例(ppo-penalty参考下文百问):
actor_loss = − min ⁡ ( A d v t ⋅ P ( A t ∣ S t ) P o l d ( A t ∣ S t ) , A d v t ⋅ clip ( P ( A t ∣ S t ) P o l d ( A t ∣ S t ) , 0.8 , 1.2 ) ) \text{actor\_loss} = -\min(Adv_t \cdot \frac{P(A_t | S_t)}{P_{old}(A_t | S_t)}, Adv_t \cdot \text{clip}(\frac{P(A_t | S_t)}{P_{old}(A_t | S_t)}, 0.8, 1.2)) actor_loss=min(AdvtPold(AtSt)P(AtSt),Advtclip(Pold(AtSt)P(AtSt),0.8,1.2))
其中:

  • Adv_t表示优势函数,就是上面目标函数里面的 A θ ′ ( s t , a t ) A^{\theta'}(s_t, a_t) Aθ(st,at)
    GAE: A d v t = ∑ l = 0 ∞ ( γ λ ) l δ t + l = ( r t + γ ⋅ V t + 1 − V t ) + γ ⋅ λ ⋅ A d v t + 1 Adv_t = \sum_{l=0}^\infty (\gamma \lambda)^l \delta_{t+l} = (r_t + \gamma \cdot V_{t+1} - V_t) + \gamma \cdot \lambda \cdot Adv_{t+1} Advt=l=0(γλ)lδt+l=(rt+γVt+1Vt)+γλAdvt+1。其中 δ t = r t + γ V π ( s t + 1 ) − V π ( s t ) \delta_t = r_t + \gamma V_\pi(s_{t+1}) - V_\pi(s_t) δt=rt+γVπ(st+1)Vπ(st) 这里的 A d v t Adv_t Advt其实准确来说应该写成 A d v t _ o l d Adv_t\_old Advt_old,因为是当前batch跟环境第一次交互产生的优势。GAE用来解决偏差和方差问题。

其中时间差分(Temporal Difference, TD):
T D _ e r r o r = R t + γ ⋅ V t + 1 − V t TD\_error = R_t + \gamma \cdot V_{t+1} - V_t TD_error=Rt+γVt+1Vt

  • 我们已经对 R t R_t Rt 进行改造,使其能够衡量 Actor 模型是否遵从了 Ref 模型的约束。
    { R t = − k l _ c t l ⋅ ( log ⁡ P ( A t ∣ S t ) P r e f ( A t ∣ S t ) ) , t ≠ T R t = − k l _ c t l ⋅ ( log ⁡ P ( A t ∣ S t ) P r e f ( A t ∣ S t ) ) + R t , t = T \begin{cases} R_t = -kl\_ctl \cdot \left( \log \frac{P(A_t | S_t)}{P_{ref}(A_t | S_t)} \right), & t \neq T \\ R_t = -kl\_ctl \cdot \left( \log \frac{P(A_t | S_t)}{P_{ref}(A_t | S_t)} \right) + R_t, & t = T \end{cases} Rt=kl_ctl(logPref(AtSt)P(AtSt)),Rt=kl_ctl(logPref(AtSt)P(AtSt))+Rt,t=Tt=T

  • 我们已经对 A d v t Adv_t Advt 进行改造,使其不仅考虑了当前时刻的优势,还考虑了未来的优势。

  • 我们重复利用了 1 个 batch 的数据,使本来只能被用来做 1 次模型更新的它现在能被用来做 ppo_epochs 次模型更新。我们使用真正吃了 batch、产出经验值的那个时刻的 Actor 分布来约束 ppo_epochs 中更新的 Actor 分布。

  • 我们考虑了裁剪机制(clip),在 ppo_epochs 次更新中,一旦 Actor 的更新幅度超过我们的控制范围,则不对它进行参数更新。

  • 注: P ( A t ∣ S t ) P o l d ( A t ∣ S t ) , \frac{P(A_t | S_t)}{P_{old}(A_t | S_t)}, Pold(AtSt)P(AtSt),前面是没有log的,采用重要性采样(待研究)

第二部分:critic_loss
c r i t i c _ l o s s = ( A d v t + V t − V t n e w ) 2 critic\_loss = (Adv_t+V_t-V_t{new})^2 critic_loss=(Advt+VtVtnew)2
其中
δ t = r t + γ ∗ V t + 1 − V t A d v t = δ t + γ ∗ λ ∗ A t + 1 r e t u r n s t = A d v t + V t = δ t + γ ∗ λ ∗ A t + 1 + V t = r t + γ ∗ V t + 1 − V t + γ ∗ λ ∗ A t + 1 + V t = r t + γ ∗ ( V t + 1 + λ ∗ A t + 1 ) \begin{align*} \delta_t &= r_t + \gamma * V_{t+1} - V_t \\ Adv_t &= \delta_t + \gamma * \lambda * A_{t+1} \\ returns_t &= Adv_t + V_t \\ &= \delta_t + \gamma * \lambda * A_{t+1} + V_t \\ &= r_t + \gamma * V_{t+1} - V_t + \gamma * \lambda * A_{t+1} + V_t \\ &= r_t + \gamma * (V_{t+1} + \lambda * A_{t+1}) \end{align*} δtAdvtreturnst=rt+γVt+1Vt=δt+γλAt+1=Advt+Vt=δt+γλAt+1+Vt=rt+γVt+1Vt+γλAt+1+Vt=rt+γ(Vt+1+λAt+1)

PPO 中的 critic loss 被设计为(这里我们写的是单步 Value,所以我们再做一次符号的简写,把下标 ϕ \phi ϕ 变成 t t t,但是 critic 网络依然是由参数 ϕ \phi ϕ 定义的):

V t C L I P = clip ( V t n e w , V t o l d − ϵ , V t o l d + ϵ ) R t = A t G A E + V t o l d arg ⁡ min ⁡ V ϕ L ( V ϕ ) = E t [ max ⁡ [ ( V t n e w − R t ) 2 , ( V t C L I P − R t ) 2 ] ] \begin{align*} V_t^{CLIP} &= \text{clip}(V_t^{new}, V_t^{old} - \epsilon, V_t^{old} + \epsilon) \\ R_t &= A_t^{GAE} + V_t^{old} \\ \arg \min_{V_\phi} L(V_\phi) &= E_t[\max[(V_t^{new} - R_t)^2, (V_t^{CLIP} - R_t)^2]] \end{align*} VtCLIPRtargVϕminL(Vϕ)=clip(Vtnew,Vtoldϵ,Vtold+ϵ)=AtGAE+Vtold=Et[max[(VtnewRt)2,(VtCLIPRt)2]]

  • 首先,我们递归地展开 A t G A E A_t^{GAE} AtGAE,得到:
    A t G A E = δ t + γ λ A t + 1 G A E = ( r t + γ ∗ V t + 1 o l d − V t o l d ) + γ λ A t + 1 G A E A_t^{GAE} = \delta_t + \gamma \lambda A_{t+1}^{GAE} = (r_t + \gamma * V_{t+1}^{old} - V_t^{old}) + \gamma \lambda A_{t+1}^{GAE} AtGAE=δt+γλAt+1GAE=(rt+γVt+1oldVtold)+γλAt+1GAE

  • 基于这个表达式,本质上 R t = A t G A E + V t o l d = ( r t + γ ∗ V t + 1 o l d ) + γ λ A t + 1 G A E R_t = A_t^{GAE} + V_t^{old} = (r_t + \gamma * V_{t+1}^{old}) + \gamma \lambda A_{t+1}^{GAE} Rt=AtGAE+Vtold=(rt+γVt+1old)+γλAt+1GAE

  • 在 PPO epoch 开始前,我们有初始 actor 和初始 critic。其中初始 critic 就是上面所说的 V t o l d V_t^{old} Vtold

  • 我们用初始 actor 和初始 critic 产生经验值,然后这波经验值将被用在接下来 PPO epochs 轮的迭代中,也就是在这些迭代中,上式里的 r t r_t rt, V t o l d V_t^{old} Vtold, V t + 1 o l d V_{t+1}^{old} Vt+1old, A t G A E A_t^{GAE} AtGAE, A t + 1 G A E A_{t+1}^{GAE} At+1GAE, R t R_t Rt 都来自这些初始的经验值,它们在接下来的这个 PPO epochs 轮迭代中是不变的。

  • 本质上,critic 的优化目标是以下差值的平方:
    V t n e w − R t = [ V t n e w − ( r t + γ ∗ V t + 1 o l d ) ] − γ λ A t + 1 G A E V_t^{new} - R_t = [V_t^{new} - (r_t + \gamma * V_{t+1}^{old})] - \gamma \lambda A_{t+1}^{GAE} VtnewRt=[Vtnew(rt+γVt+1old)]γλAt+1GAE

百问PPO

看完上面的公式,因为细节设计比较多,你可能会有不少问题,下面的问题可能能解释你一部分疑虑~

动作价值函数和状态价值函数的关系?

状态价值函数的定义为
V π ( s t ) = E π ( G t ∣ s t ) V_\pi(s_t) = E_\pi(G_t | s_t) Vπ(st)=Eπ(Gtst)

动作价值函数的定义为
Q π ( s t , a t ) = E π ( G t ∣ s t , a t ) Q_\pi(s_t, a_t) = E_\pi(G_t | s_t, a_t) Qπ(st,at)=Eπ(Gtst,at)

展开状态价值函数的定义,我们得到
V π ( s t ) = E a t ∼ π ( ⋅ ∣ s t ) [ E s t + 1 ∼ P ( ⋅ ∣ s t , a t ) [ r t + γ V π ( s t + 1 ) ] ] V_\pi(s_t) = E_{a_t \sim \pi(\cdot | s_t)} \left[ E_{s_{t+1} \sim P(\cdot | s_t, a_t)} \left[ r_t + \gamma V_\pi(s_{t+1}) \right] \right] Vπ(st)=Eatπ(st)[Est+1P(st,at)[rt+γVπ(st+1)]]

展开动作价值函数的定义,我们得到
Q π ( s t , a t ) = E s t + 1 ∼ P ( ⋅ ∣ s t , a t ) [ r t + γ V π ( s t + 1 ) ] Q_\pi(s_t, a_t) = E_{s_{t+1} \sim P(\cdot | s_t, a_t)} \left[ r_t + \gamma V_\pi(s_{t+1}) \right] Qπ(st,at)=Est+1P(st,at)[rt+γVπ(st+1)]

根据这两者的定义展开式,我们得到两者的关系为
V π ( s t ) = E a t ∼ π ( ⋅ ∣ s t ) [ Q π ( s t , a t ) ] = ∑ a t ∈ A π ( a t ∣ s t ) Q π ( s t , a t ) \begin{aligned} V_\pi(s_t) &= E_{a_t \sim \pi(\cdot | s_t)} \left[ Q_\pi(s_t, a_t) \right] \\ &= \sum_{a_t \in \mathcal{A}} \pi(a_t | s_t) Q_\pi(s_t, a_t) \end{aligned} Vπ(st)=Eatπ(st)[Qπ(st,at)]=atAπ(atst)Qπ(st,at)

关于 V V V Q Q Q,我们可能在脑海里一直有“ V V V Q Q Q 的期望”这样一个模糊的印象,但是却很难做具象化的解读。希望这里通过上面马里奥游戏的例子 + 具体的推导过程,能帮助大家更深入了解 V V V Q Q Q 的关系。

优势函数跟动作价值函数/状态价值函数的关系?

A π ( s t , a t ) = Q π ( s t , a t ) − V π ( s t ) A_\pi(s_t, a_t) = Q_\pi(s_t, a_t) - V_\pi(s_t) Aπ(st,at)=Qπ(st,at)Vπ(st)

这个差值,就可以衡量在某个状态 s t s_t st 下,执行某个动作 a t a_t at,要比其它的动作好多少了,这个差值就是优势。

我们展开来讲优势函数,在前面的推导中我们已知:

Q π ( s t , a t ) = E s t + 1 ∼ P ( ⋅ ∣ s t , a t ) [ r t + γ V π ( s t + 1 ) ] Q_\pi(s_t, a_t) = E_{s_{t+1} \sim P(\cdot | s_t, a_t)} \left[ r_t + \gamma V_\pi(s_{t+1}) \right] Qπ(st,at)=Est+1P(st,at)[rt+γVπ(st+1)]

而对于 V π ( s t ) V_\pi(s_t) Vπ(st),我们可以把它重新改写成:

V π ( s t ) = E s t + 1 ∼ P ( ⋅ ∣ s t , a t ) [ V π ( s t ) ] V_\pi(s_t) = E_{s_{t+1} \sim P(\cdot | s_t, a_t)} \left[ V_\pi(s_t) \right] Vπ(st)=Est+1P(st,at)[Vπ(st)]

之所以这样改写,是因为 V π ( s t ) V_\pi(s_t) Vπ(st) 只依赖于这个确定的 s t s_t st,而与 s t + 1 s_{t+1} st+1 无关。

基于这两个式子,我们可以写成优势函数的表达式:

A π ( s t , a t ) = Q π ( s t , a t ) − V π ( s t ) = E s t + 1 ∼ P ( ⋅ ∣ s t , a t ) [ r t + γ V π ( s t + 1 ) ] − E s t + 1 ∼ P ( ⋅ ∣ s t , a t ) [ V π ( s t ) ] = E s t + 1 ∼ P ( ⋅ ∣ s t , a t ) [ r t + γ V π ( s t + 1 ) − V π ( s t ) ] = E s t + 1 ∼ P ( ⋅ ∣ s t , a t ) [ T D _ e r r o r ] \begin{aligned} A_\pi(s_t, a_t) &= Q_\pi(s_t, a_t) - V_\pi(s_t) \\ &= E_{s_{t+1} \sim P(\cdot | s_t, a_t)} \left[ r_t + \gamma V_\pi(s_{t+1}) \right] - E_{s_{t+1} \sim P(\cdot | s_t, a_t)} \left[ V_\pi(s_t) \right] \\ &= E_{s_{t+1} \sim P(\cdot | s_t, a_t)} \left[ r_t + \gamma V_\pi(s_{t+1}) - V_\pi(s_t) \right] \\ &= E_{s_{t+1} \sim P(\cdot | s_t, a_t)} \left[ TD\_error \right] \end{aligned} Aπ(st,at)=Qπ(st,at)Vπ(st)=Est+1P(st,at)[rt+γVπ(st+1)]Est+1P(st,at)[Vπ(st)]=Est+1P(st,at)[rt+γVπ(st+1)Vπ(st)]=Est+1P(st,at)[TD_error]

大家发现了吗:

  • 假设这里的 V π V_\pi Vπ 可以准确衡量策略 π \pi π 的价值,那么 TD_error 就是优势函数的无偏估计。 这意味着在期望的意义下,使用 TD_error 近似优势函数不会引起系统性的偏差。
  • 假设这里的 V π V_\pi Vπ 不能准确衡量策略 π \pi π 的价值,那么 TD_error 对于优势函数则是有偏的。 这意味着由于 V π V_\pi Vπ 的不准确,我们无法用 r t + γ V π ( s t + 1 ) r_t + \gamma V_\pi(s_{t+1}) rt+γVπ(st+1) 去近似那个真实的优势函数,因为我们将引入系统性偏差。(读到这里,你可能已经开始联想到在 actor-critic 算法下,用于估计 V π V_\pi Vπ 的 critic 网络在没有收敛之前都是偏离真值的,这就意味着此时我们用 TD-error 去近似优势是有偏的,所以这时我们就要请 GAE 出场了)

PPO前身或者变形有哪些?

TRPO
在重要性采样中遗留的问题:如果 π θ \pi_\theta πθ π o l d \pi_{old} πold 这两个分布差异太大,且我们采样的轨迹数量没有足够大时, J ( π θ ) J(\pi_\theta) J(πθ) 的估计是不准确的。那要怎么办呢?

一种直观的解决办法是,把 π θ \pi_\theta πθ π o l d \pi_{old} πold 的分布相似性作为 J ( π θ ) J(\pi_\theta) J(πθ) 的 constraint,这就是 TRPO 的做法,即我们有:

arg ⁡ max ⁡ π θ J ( π θ ) = E t [ π θ ( a t ∣ s t ) π o l d ( a t ∣ s t ) A ϕ GAE ( s t , a t ) ] subject to  E t [ K L ( π θ o l d ( ⋅ ∣ s t ) , π θ ( ⋅ ∣ s t ) ) ] ≤ δ \begin{aligned} \arg \max_{\pi_\theta} J(\pi_\theta) &= E_t \left[ \frac{\pi_\theta(a_t | s_t)}{\pi_{old}(a_t | s_t)} A_\phi^{\text{GAE}}(s_t, a_t) \right] \\ \text{subject to } & E_t \left[ KL(\pi_{\theta old}(\cdot | s_t), \pi_\theta(\cdot | s_t)) \right] \leq \delta \end{aligned} argπθmaxJ(πθ)subject to =Et[πold(atst)πθ(atst)AϕGAE(st,at)]Et[KL(πθold(st),πθ(st))]δ

由于这种限制不直接加在 J ( π θ ) J(\pi_\theta) J(πθ) 中,因此使得整体优化过程变得较为复杂,这就是 TRPO 的缺陷(关于 TRPO 的更多细节,这里就不做展开了,大家可以去看 paper)。

PPO两种类型是什么?

ppo-clip 和 ppo-penalty: 参考里面8.5

GAE

Ψ t = ∑ l = 0 ∞ ( γ λ ) l δ t + l \Psi_t = \sum_{l=0}^\infty (\gamma \lambda)^l \delta_{t+l} Ψt=l=0(γλ)lδt+l

  • δ t = r t + γ V π ( s t + 1 ) − V π ( s t ) \delta_t = r_t + \gamma V_\pi(s_{t+1}) - V_\pi(s_t) δt=rt+γVπ(st+1)Vπ(st)

  • γ \gamma γ:超参,折扣因子。

  • λ \lambda λ:超参,即用于平衡方差-偏差的因素。

    • λ \lambda λ 接近 0 时, Ψ t \Psi_t Ψt 退化成 r t + γ V π ( s t + 1 ) − V π ( s t ) r_t + \gamma V_\pi(s_{t+1}) - V_\pi(s_t) rt+γVπ(st+1)Vπ(st),也即上图所绘制的高偏差情况。
    • λ \lambda λ 接近 1 时, Ψ t \Psi_t Ψt 变成 − V π ( s t ) + ∑ l = 0 ∞ γ l r t + l -V_\pi(s_t) + \sum_{l=0}^\infty \gamma^l r_{t+l} Vπ(st)+l=0γlrt+l,也即上图所绘制的高方差-低偏差情况。
    • 综上, λ \lambda λ 越小,方差越小,偏差越大; λ \lambda λ 越大,方差越大,偏差越小。

在接下来的表达中,我们记这种引入了 GAE 方法的单步优势为 A ϕ G A E ( s t , a t ) A_\phi^{GAE}(s_t, a_t) AϕGAE(st,at)

其他

一些RLHF典型方法:
https://zhuanlan.zhihu.com/p/714364995

value-based Q-based
https://zhuanlan.zhihu.com/p/478649483

https://zhuanlan.zhihu.com/p/677607581

参考资料

  • 图解大模型RLHF系列之:人人都能看懂的PPO原理与源码解读
  • 人人都能看懂的RL-PPO理论知识
  • 代码deep-speed
  • 详解近端策略优化(ppo,干货满满)
  • 第5章 PPO 算法
  • 深入理解强化学习(一)- 概念和术语
  • 深入理解强化学习(二)- 强化学习问题
  • 02 重要性采样(importance sampling)及 python 实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2373887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker封装深度学习模型

1.安装Docker Desktop 从官网下载DockerDesktop,安装。(默认安装位置在C盘,可进行修改) "D:\Program Files (x86)\Docker\Docker Desktop Installer.exe" install --installation-dir"D:\Program Files (x86)\Do…

11、参数化三维产品设计组件 - /设计与仿真组件/parametric-3d-product-design

76个工业组件库示例汇总 参数化三维产品设计组件 (注塑模具与公差分析) 概述 这是一个交互式的 Web 组件,旨在演示简单的三维零件(如带凸台的方块)的参数化设计过程,并结合注塑模具设计(如开模动画)与公…

OpenAI 30 亿收购 Windsurf:AI 编程助手风口已至

导语: 各位开发者同仁、产品经理伙伴们,从2024年起,一场由AI驱动的研发范式革命已然来临。Cursor等AI代码编辑器凭借与大语言模型的深度集成,正以前所未有的态势挑战,甚至颠覆着IntelliJ、VS Code等传统IDE的固有疆域。根据OpenRouter的API使用数据,Anthropic的Claude 3.…

【linux】倒计时小程序、进度条小程序及其puls版本

小编个人主页详情<—请点击 小编个人gitee代码仓库<—请点击 linux系列专栏<—请点击 倘若命中无此运&#xff0c;孤身亦可登昆仑&#xff0c;送给屏幕面前的读者朋友们和小编自己! 目录 前言一、知识铺垫1. 回车换行2. 缓冲区 二、倒计时小程序1. 实现 三、进度条小…

物流无人机结构与载货设计分析!

一、物流无人机的结构与载货设计模块运行方式 1.结构设计特点 垂直起降与固定翼结合&#xff1a;针对复杂地形&#xff08;如山区、城市&#xff09;需求&#xff0c;采用垂直起降&#xff08;VTOL&#xff09;与固定翼结合的复合布局&#xff0c;例如“天马”H型无人机&am…

【MySQL】表空间结构 - 从何为表空间到段页详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…

[特殊字符] 免税商品优选购物商城系统 | Java + SpringBoot + Vue | 前后端分离实战项目分享

一、项目简介 本项目为一款功能完备的 免税商品优选购物商城系统&#xff0c;采用 Java 后端 Vue 前端的主流前后端分离架构&#xff0c;支持用户、商家、管理员三类角色&#xff0c;满足商品浏览、下单、商家管理、后台运营等多项功能&#xff0c;适用于实际部署或作为毕业设…

图像处理基础与图像变换

一、目的 通过本次实验&#xff0c;加深对数字图像的理解&#xff0c;熟悉MATLAB中的有关函数&#xff1b;应用DCT对图像进行变换&#xff1b;熟悉图像常见的统计指标&#xff0c;实现图像几何变换的基本方法。 二、内容与设计思想 1、实验内容&#xff1a;选择两幅图像&…

并发笔记-锁(一)

文章目录 1. 基本问题与锁的概念 (The Basic Idea)2. 锁的API与Pthreads (Lock API and Pthreads)3. 构建锁的挑战与评估标准 (Building A Lock & Evaluating Locks)4. 早期/简单的锁实现尝试及其问题 (Early/Simple Attempts)4.1 控制中断 (Controlling Interrupts)4.2 仅…

【Bootstrap V4系列】学习入门教程之 组件-媒体对象(Media object)

Bootstrap V4系列 学习入门教程之 组件-媒体对象&#xff08;Media object&#xff09; 媒体对象&#xff08;Media object&#xff09;一、Example二、Nesting 嵌套三、Alignment 对齐四、Order 顺序五、Media list 媒体列表 媒体对象&#xff08;Media object&#xff09; B…

2025数字中国创新大赛-数字安全赛道数据安全产业积分争夺赛决赛Writeup

文章目录 综合场景赛-模型环境安全-3综合场景赛-数据识别与审计-1综合场景赛-数据识别与审计-2综合场景赛-数据识别与审计-3 有需要题目附件的师傅&#xff0c;可以联系我发送 综合场景赛-模型环境安全-3 upload文件嵌套了多个png图片字节数据&#xff0c;使用foremost直接分离…

无法更新Google Chrome的解决问题

解决问题&#xff1a;原文链接&#xff1a;【百分百成功】Window 10 Google Chrome无法启动更新检查&#xff08;错误代码为1&#xff1a;0x80004005&#xff09; google谷歌chrome浏览器无法更新Chrome无法更新至最新版本&#xff1f; 下载了 就是更新Google Chrome了

数字孪生市场格局生变:中国2025年规模214亿,工业制造领域占比超40%

一、技术深度解析&#xff1a;数字孪生的核心技术栈与演进 1. 从镜像到自治&#xff1a;数字孪生技术架构跃迁 三维重建突破&#xff1a;LiDAR点云精度达2cm&#xff0c;无人机测深刷新频率5Hz&#xff0c;支撑杭州城市大脑内涝预警模型提前6小时预测。AI算法融合&#xff1a…

全球首款无限时长电影生成模型SkyReels-V2本地部署教程:视频时长无限制!

一、简介 SkyReels-V2 模型集成了多模态大语言模型&#xff08;MLLM&#xff09;、多阶段预训练、强化学习以及创新的扩散强迫&#xff08;Diffusion-forcing&#xff09;框架&#xff0c;实现了在提示词遵循、视觉质量、运动动态以及视频时长等方面的全面突破。通过扩散强迫框…

颠覆性技术革命:CAD DWG图形瓦片化实战指南

摘要 CAD DWG图形瓦片化技术通过金字塔模型构建多分辨率地图体系&#xff0c;实现海量工程图纸的Web高效可视化。本文系统解析栅格瓦片与矢量瓦片的技术原理&#xff0c;详细对比两者在生成效率、样式自由度和客户端性能等维度的差异&#xff0c;并结合工程建设、工业设计和智…

不换设备秒通信,PROFINET转Ethercat网关混合生产线集成配置详解

在汽车制造中&#xff0c;连接Profinet控制的PLC&#xff08;如西门子S7&#xff09;与EtherCAT伺服驱动器&#xff08;如倍福AX5000&#xff09;&#xff0c;实现运动控制同步。 在汽车制造的混合生产线集成中&#xff0c;实现西门子S7 PLC与倍福AX5000 EtherCAT伺服驱动器的…

c++STL-string的使用

这里写自定义目录标题 string的使用string写成类模板的原因string的版本举例构造、析构函数和赋值重载构造函数和析构函数operator Iterators迭代器begin和endrbegin和rendcbegin和cend&#xff0c;crbegin和crend&#xff08;c11&#xff09; capacity容量有关函数不同编译器下…

UNet网络 图像分割模型学习

UNet 由Ronneberger等人于2015年提出&#xff0c;专门针对医学图像分割任务&#xff0c;解决了早期卷积网络在小样本数据下的效率问题和细节丢失难题。 一 核心创新 1.1对称编码器-解码器结构 实现上下文信息与高分辨率细节的双向融合 如图所示&#xff1a;编码器进行了4步&…

使用 SHAP 进行特征交互检测:揭示变量之间的复杂依赖关系

我们将探讨如何使用 SHAP&#xff08;SHapley 加法解释&#xff09;来检测和可视化机器学习模型中的特征交互。了解特征组合如何影响模型预测对于构建更透明、更准确的模型至关重要。SHAP 有助于揭示这些复杂的依赖关系&#xff0c;并使从业者能够以更有意义的方式解释模型决策…

Python-MCPInspector调试

Python-MCPInspector调试 使用FastMCP开发MCPServer&#xff0c;熟悉【McpServer编码过程】【MCPInspector调试方法】-> 可以这样理解&#xff1a;只编写一个McpServer&#xff0c;然后使用MCPInspector作为McpClient进行McpServer的调试 1-核心知识点 1-熟悉【McpServer编…