又是一篇之前沉在草稿箱的文章,放出来^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,…,sT−1,aT−1,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+1∣St=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π[Gt∣st]=Eat∼π(⋅∣st)[Est+1∼P(⋅∣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+1∣St=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π[Gt∣st,at]=Est+1∼P(⋅∣st,at)[r+γVπ(st+1)] | 深入理解强化学习(二)- 强化学习问题 |
state transition probability | 状态转移概率 | P P P | 表示环境中状态转移的概率分布函数,如 P s s ′ a P_{ss'}^a Pss′a 表示在状态 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θ(atn∣stn)]
我们用演员 θ \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θ(atn∣stn),也就是如果 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θ(atn∣stn)]=E(st,at)∼πθ′[pθ′(st,at)pθ(st,at)Aθ‘(st,at)∇logpθ(atn∣stn)]=E(st,at)∼πθ′[pθ′(at∣st)pθ(at∣st)pθ′(st)pθ(st)Aθ′(st,at)∇logpθ(atn∣stn)]=E(st,at)∼πθ′[pθ′(at∣st)pθ(at∣st)Aθ′(st,at)∇logpθ(atn∣stn)]
所以实际上,当我们使用重要性采样的时候,要去优化的目标函数为
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θ′(at∣st)pθ(at∣st)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θ′(at∣st)pθ(at∣st)。
p
θ
(
a
t
∣
s
t
)
p
θ
′
(
a
t
∣
s
t
)
\frac{p_\theta(a_t | s_t)}{p_{\theta'}(a_t | s_t)}
pθ′(at∣st)pθ(at∣st) 是容易计算的,我们可以从采样的结果来估测
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(Advt⋅Pold(At∣St)P(At∣St),Advt⋅clip(Pold(At∣St)P(At∣St),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+1−Vt)+γ⋅λ⋅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+1−Vt
-
我们已经对 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(At∣St)P(At∣St)),Rt=−kl_ctl⋅(logPref(At∣St)P(At∣St))+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(At∣St)P(At∣St),前面是没有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+Vt−Vtnew)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+1−Vt=δt+γ∗λ∗At+1=Advt+Vt=δt+γ∗λ∗At+1+Vt=rt+γ∗Vt+1−Vt+γ∗λ∗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[(Vtnew−Rt)2,(VtCLIP−Rt)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+1old−Vtold)+γλ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} Vtnew−Rt=[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π(Gt∣st)
动作价值函数的定义为:
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π(Gt∣st,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+1∼P(⋅∣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+1∼P(⋅∣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)]=at∈A∑π(at∣st)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+1∼P(⋅∣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+1∼P(⋅∣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+1∼P(⋅∣st,at)[rt+γVπ(st+1)]−Est+1∼P(⋅∣st,at)[Vπ(st)]=Est+1∼P(⋅∣st,at)[rt+γVπ(st+1)−Vπ(st)]=Est+1∼P(⋅∣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(at∣st)πθ(at∣st)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 实现
