【强化学习笔记1】从强化学习的基本概念到近端策略优化(PPO)
好久没有更新了。最近想学习一下强化学习,本系列是李宏毅老师强化学习的课程笔记。
1. Policy-based Model
1.1 Actor
在policy-based model中,主要的目的就是训练一个actor。

对于一个episode(例如,玩一局游戏),agent的observation、action和reward组成这样一个序列:
τ = { s 1 , a 1 , r 1 , . . . , s T , a T , r T } \tau = \{s_1,a_1,r_1,...,s_T,a_T,r_T\} τ={s1,a1,r1,...,sT,aT,rT}
上面的s可以理解为环境的State,那么做N次episode,所有的reward的和是
R ( τ ) = ∑ n = 1 N r n R(\tau) = \sum_{n=1}^Nr_n R(τ)=n=1∑Nrn
对于模型的一个参数 θ , τ \theta, \tau θ,τ取到的概率实际上与\theta有关系:
P ( τ ∣ θ ) P(\tau|\theta) P(τ∣θ)
然后我们关心的是一个episode的reward的期望:
R ˉ θ = ∑ τ R ( τ ) P ( τ ∣ θ ) \bar{R}_{\theta}=\sum_\tau R(\tau)P(\tau|\theta) Rˉθ=τ∑R(τ)P(τ∣θ)
那么怎么去训练这个模型?推导过程如下:
∇ θ R ˉ θ = ∑ τ R ( τ ) ∇ θ P ( τ ∣ θ ) ( 所以梯度与 R ( τ ) 无关,它不需要可微,甚至可以是一个黑盒 ) ( ∇ x log f ( x ) = 1 f ( x ) ∇ x f ( x ) ) = ∑ τ R ( τ ) P ( τ ∣ θ ) ∇ x log P ( τ ∣ θ ) 根据大数定律 , 当样本足够多时,样本均值依概率收敛于总体均值,即 μ = ∑ τ R ( τ ) P ( τ ∣ θ ) ≈ X ˉ = 1 / N ∑ i = 1 N R ( τ i ) 因此 原式 ≈ 1 / N ∑ i = 1 N R ( τ i ) ∇ θ log P ( τ ∣ θ ) \nabla_\theta\bar{R}_{\theta}=\sum_\tau R(\tau)\nabla_\theta P(\tau|\theta) \\ (所以梯度与R(\tau)无关,它不需要可微,甚至可以是一个黑盒) \\ (\nabla_x \log f(x)=\frac{1}{f(x)} \nabla_x f(x)) =\sum_\tau R(\tau)P(\tau|\theta)\nabla_x \log P(\tau|\theta) \\ 根据大数定律, 当样本足够多时,样本均值依概率收敛于总体均值,即\mu=\sum_\tau R(\tau)P(\tau|\theta)\approx \bar{X} = 1/N\sum_{i=1}^N R(\tau_i) \\ 因此 \\ 原式\approx 1/N \sum_{i=1}^N R(\tau_i) \nabla_\theta \log P(\tau|\theta) ∇θRˉθ=τ∑R(τ)∇θP(τ∣θ)(所以梯度与R(τ)无关,它不需要可微,甚至可以是一个黑盒)(∇xlogf(x)=f(x)1∇xf(x))=τ∑R(τ)P(τ∣θ)∇xlogP(τ∣θ)根据大数定律,当样本足够多时,样本均值依概率收敛于总体均值,即μ=τ∑R(τ)P(τ∣θ)≈Xˉ=1/Ni=1∑NR(τi)因此原式≈1/Ni=1∑NR(τi)∇θlogP(τ∣θ)
那么
∇ θ log P ( τ ∣ θ ) \nabla_\theta \log P(\tau|\theta) ∇θlogP(τ∣θ)
怎么算?
将一个episode拆解开,实际上就是每次的1. 根据环境的state做出action,2. 环境根据action和上一次的state给出下一次的state和当前的reward:
P ( τ ∣ θ ) = p ( s 1 ) p ( a 1 ∣ s 1 , θ ) p ( s 2 , r 1 ∣ s 1 , a 1 ) . . . p ( a k ∣ s k , θ ) p ( s k + 1 , r k ∣ s k , a k ) . . . = p ( s 1 ) ⋅ Π t = 1 T p ( a t ∣ s t , θ ) p ( s t + 1 , r t ∣ s t , a t ) P(\tau|\theta)=p(s_1)p(a_1|s_1,\theta)p(s_2,r_1|s_1,a_1)...p(a_k|s_k,\theta)p(s_{k+1},r_k|s_k,a_k)... \\ =p(s_1)\cdot \Pi_{t=1}^Tp(a_t|s_t,\theta)p(s_{t+1},r_t|s_t,a_t) P(τ∣θ)=p(s1)p(a1∣s1,θ)p(s2,r1∣s1,a1)...p(ak∣sk,θ)p(sk+1,rk∣sk,ak)...=p(s1)⋅Πt=1Tp(at∣st,θ)p(st+1,rt∣st,at)
有连乘,取对数:
log P ( τ ∣ θ ) = log p ( s 1 ) + ∑ t [ log p ( a t ∣ s t , θ ) + log p ( s t + 1 , r t ∣ s t , a t ) ] \log P(\tau|\theta)=\log p(s_1) + \sum_t[ \log p(a_t|s_t,\theta) + \log p(s_{t+1},r_t|s_t,a_t)] logP(τ∣θ)=logp(s1)+t∑[logp(at∣st,θ)+logp(st+1,rt∣st,at)]
所以
∇ θ log P ( τ ∣ θ ) = ∑ t ∇ θ log p ( a t ∣ s t , θ ) \nabla_\theta \log P(\tau|\theta) = \sum_t \nabla_\theta \log p(a_t|s_t,\theta) ∇θlogP(τ∣θ)=t∑∇θlogp(at∣st,θ)
最终的梯度更新方式为:
∇ θ R ˉ θ = 1 / N ∑ i = 1 N R ( τ i ) ∑ t ∇ θ log p ( a t ∣ s t , θ ) \nabla_\theta\bar{R}_{\theta}=1/N \sum_{i=1}^N R(\tau_i)\sum_t \nabla_\theta \log p(a_t|s_t,\theta) ∇θRˉθ=1/Ni=1∑NR(τi)t∑∇θlogp(at∣st,θ)
Reward越大越好,所以实际上上面这个式子也是越大越好。上述这种梯度计算的方式是显然的:
-
对于一个episode,如果它最终的reward R ( τ i ) R(\tau_i) R(τi) 为正,那么我们肯定希望在这个episode中的每一个决策出现的概率都足够大;反之,如果reward为负,那么我们希望概率足够低。
-
为什么要用 log \log log的梯度,而不直接是 ∇ θ p ( a t ∣ s t , θ ) \nabla_\theta p(a_t|s_t,\theta) ∇θp(at∣st,θ)? 这是因为,假如出现了下面这种情况,即状态 s s s在4个episode中都出现过,actor的反应和得到的reward如下图:

所以,模型会偏好出现次数多的action,因为虽然出现次数多的action,reward不一定很大,但是相加起来依旧可以增大最后的reward。所以,要对“出现次数”进行某种“归一化”,也就是除以概率就好: ∇ θ p ( a t ∣ s t , θ ) p ( a t ∣ s t , θ ) = ∇ θ log p ( a t ∣ s t , θ ) \frac{\nabla_\theta p(a_t|s_t,\theta)}{p(a_t|s_t,\theta)} = \nabla_\theta \log p(a_t|s_t,\theta) p(at∣st,θ)∇θp(at∣st,θ)=∇θlogp(at∣st,θ).
在通常情况下,为了避免Reward在啥时候都是正数的情况,需要减去一个bias,让Reward有正有负:
∇ θ R ˉ θ = 1 / N ∑ i = 1 N ( R ( τ i ) − b ) ∑ t ∇ θ log p ( a t ∣ s t , θ ) = 1 / N ∑ i = 1 N ∑ t ( R ( τ i ) − b ) ∇ θ log p ( a t ∣ s t , θ ) \nabla_\theta\bar{R}_{\theta}=1/N \sum_{i=1}^N (R(\tau_i) - b)\sum_t \nabla_\theta \log p(a_t|s_t,\theta) \\ = 1/N \sum_{i=1}^N \sum_t (R(\tau_i) - b)\nabla_\theta \log p(a_t|s_t,\theta) ∇θRˉθ=1/Ni=1∑N(R(τi)−b)t∑∇θlogp(at∣st,θ)=1/Ni=1∑Nt∑(R(τi)−b)∇θlogp(at∣st,θ)
然而,上面这个公式还有一点点问题。在一条轨迹中所有的动作都具有同样的价值。然而从直觉上来看,一条轨迹中一般不会所有的动作都是好的,而是有些动作好,而另外一些动作差,然而这些动作目前却会以相同的方式更新概率,这也会造成训练的不稳定。因此有必要为每个动作赋予其所应得的奖励。考虑到交互过程中 Actor 采取某一动作只会对之后的状态产生影响,而不会对之前的有影响。因此,不必令每个动作的权重都为全部奖励之和,而只需要累计在当前动作之后的奖励之和 R ( τ i ) = ∑ t ′ = t T i r t ′ i R(\tau_i)=\sum_{t'=t}^{T_i}r_{t'}^{i} R(τi)=∑t′=tTirt′i, 其中 T n T_n Tn是第 i i i个trajectory的长度, r t ′ i r_{t'}^{i} rt′i表示第 i i i个trajectory中时刻 t ′ t' t′的环境真实奖励。
另一个直觉是,当前动作会对时间较近的状态影响大,时间较远的影响小。因此,在计算累计奖励的时候,对于未来较遥远的奖励应该予以折扣,因此
R ( τ i ) = ∑ t ′ = t T i γ t ′ − t r t ′ i R(\tau_i)=\sum_{t'=t}^{T_i} \gamma^{t'-t} r_{t'}^{i} R(τi)=t′=t∑Tiγt′−trt′i
最终的梯度更新公式为:
∇ θ R ˉ θ = 1 / N ∑ i = 1 N ∑ t ( ∑ t ′ = t T i γ t ′ − t r t ′ i − b ) ∇ θ log p ( a t ∣ s t , θ ) \nabla_\theta\bar{R}_{\theta} = 1/N \sum_{i=1}^N \sum_t (\sum_{t'=t}^{T_i} \gamma^{t'-t} r_{t'}^{i} - b)\nabla_\theta \log p(a_t|s_t,\theta) ∇θRˉθ=1/Ni=1∑Nt∑(t′=t∑Tiγt′−trt′i−b)∇θlogp(at∣st,θ)
1.2 Critic
Critic并不决定action,其负责评价action的好坏,表示为 V π ( s ) V^\pi(s) Vπ(s), 意思是用一个actor π \pi π,在当前状态为 s s s的情况下,从现在到一个episode结束累积的Reward的期望是多少.
如何估计Critic?
- 蒙特卡洛方法: 让Critic看actor玩游戏, 当前state为 s s s时,在游戏结束的Reward总和为 r r r,所以这就是一个回归问题. 让Critic输入为 s s s时,输出为 r r r.
- 时序差分方法: 对于序列中的 s t , a t , r t , s t + 1 s_t,a_t,r_t,s_{t+1} st,at,rt,st+1, 有递归关系 V π ( s t ) = V π ( s t + 1 ) + r t V^\pi(s_t)=V^\pi(s_{t+1})+r_t Vπ(st)=Vπ(st+1)+rt,也就是说 V π ( s t ) − V π ( s t + 1 ) = r t V^\pi(s_t)-V^\pi(s_{t+1})=r_t Vπ(st)−Vπ(st+1)=rt, 因此,只需要在Critic网络中,输入 s t s_t st得到 V π ( s t ) V^\pi(s_t) Vπ(st),输入 s t + 1 s_{t+1} st+1得到 V π ( s t + 1 ) V^\pi(s_{t+1}) Vπ(st+1),然后约束是让 V π ( s t ) − V π ( s t + 1 ) V^\pi(s_t)-V^\pi(s_{t+1}) Vπ(st)−Vπ(st+1)接近 r r r. 这样的好处就是不需要等整个游戏结束之后再计算Critic.
还有一种Critic的方式, 称之为Q-function, 定义是 Q π ( s , a ) Q^\pi(s,a) Qπ(s,a).意思是用一个actor π \pi π,在当前状态为 s s s的情况下,采取action为 a a a, 从现在到一个episode结束累积的Reward的期望是多少.
从Q-function可以引出Q-learning, 流程是这样的: 1. actor π \pi π和环境进行交互. 2. 通过MC或者时序差分方法训一个 Q Q Q. 3. Q Q Q可以去选一个比 π \pi π更好的actor π ′ \pi' π′, 然后重复上面这个过程.
上面的第三步是怎么做到的呢? 实际上, 更好的actor π ′ \pi' π′的本质是对于所有的 s s s, V π ′ ( s ) ≥ V π ( s ) V^{\pi'}(s)\ge V^\pi(s) Vπ′(s)≥Vπ(s). 做到这一点, 实际上就是采取能使得 Q Q Q最大的 a a a:
π ′ ( s ) = arg max a Q π ( s , a ) \pi' (s) = \arg \max_a Q^\pi(s,a) π′(s)=argamaxQπ(s,a)
1.3 Actor + Critic
1.3.1 Advantage Actor-Critic( A 2 C A^2C A2C)
在A2C中, actor网络的更新公式为:
∇ θ R ˉ θ = 1 / N ∑ i = 1 N ∑ t A ( s t , a t ) ∇ θ log p ( a t ∣ s t , θ ) \nabla_\theta\bar{R}_{\theta}=1/N \sum_{i=1}^N \sum_t A(s_t,a_t) \nabla_\theta \log p(a_t|s_t,\theta) ∇θRˉθ=1/Ni=1∑Nt∑A(st,at)∇θlogp(at∣st,θ)
所以, 和前面传统方法不同的就是用优势函数 A A A替代了原本的环境Reward真值 R ( τ ) R(\tau) R(τ). 优势函数的引出如下:
我们考虑采取某个动作 a a a相对于平均动作的优势:
A ( s t , a t ) = Q ( s t , a t ) − V ( s t ) A(s_t,a_t) = Q(s_t,a_t)-V(s_t) A(st,at)=Q(st,at)−V(st)
(我们先忽略上标 π \pi π, Q , V Q,V Q,V的含义和上面一样)
根据时序差分的关系,可以得到
Q ^ ( s t , a t ) = r + γ V ( s t + 1 ) \hat{Q}(s_t,a_t) = r+\gamma V(s_{t+1}) Q^(st,at)=r+γV(st+1)
(上式的含义就是对于 t t t往后的平均reward大概等于当前的环境reward r r r 加上 从 t + 1 t+1 t+1往后的reward均值)
代入上面的式子得到:
A ( s t , a t ) = Q ( s t , a t ) − V ( s t ) = r + γ V ( s t + 1 ) − V ( s t ) A(s_t,a_t) = Q(s_t,a_t)-V(s_t)=r+\gamma V(s_{t+1})-V(s_t) A(st,at)=Q(st,at)−V(st)=r+γV(st+1)−V(st)
所以 A A A实际上可以和 a t a_t at是没有关系的。
让上面的式子 γ = 1 \gamma=1 γ=1, 还可以写成:
A ( s t , a t ) = r + V ( s t + 1 ) − V ( s t ) = r − ( V ( s t ) − V ( s t + 1 ) ) A(s_t,a_t) =r+ V(s_{t+1})-V(s_t) = r - ( V(s_{t})-V(s_{t+1})) A(st,at)=r+V(st+1)−V(st)=r−(V(st)−V(st+1))
第一项是采取当前action的环境真实reward,第二项是对于actor π \pi π来说这一步的平均reward. 所以说, 优势函数描述了当前action在平均意义上的优势程度. 如果优势程度比较大, 那么我们就鼓励这种action的发生. 上面的式子还可以看出, 相当于给环境的reward加了一个动态的bias.
然后,别忘了 V ( s t ) V(s_{t}) V(st)是直接由价值网络预测的,价值网络的训练就是一个回归问题,尽量贴近环境真实的reward. 参见1.2 Critic
A2C等actor+critic相比于前面的传统方法,主要是解决这几个问题:
- 传统的方法过度依赖环境的Reward,但是环境的Reward通常不够稳定;而Q-learning通过学习动作价值预测函数来选择最优动作,不直接优化策略,可能会导致策略更新滞后。
- Critic的价值估计为Actor提供了更直接的反馈,减少了策略探索的盲目性,加速了学习过程。
- Actor-Critic方法可以在每一步都更新策略和价值函数,充分利用每个样本的信息,提高样本效率。
1.3.2 Async Advantage Actor-Critic( A 3 C A^3C A3C)
A3C就是A2C的异步版本, 允许多个代理同时在不同环境中采样和更新,显著提高采样效率。

2. Inverse RL
对于没有reward function(比如机器人操作), 而只有一对trajectory的示例(或者说episode的示例), 那就需要IL来学习.
Inverse RL的核心是: 老师(也就是已经有的一堆trajectory)永远是对的.
所以说核心步骤如下: (核心概念就是先射箭在画靶)
- 初始化一个actor
- 在每个迭代中:
- actor和环境互动, 得到一些trajectory
- 定义一个reward function, 它使得teacher的trajectory永远比actor的要好
- actor的目的就是最大化reward
- 输出reward function和actor
所以IRL和GAN异曲同工:

3. PPO 近端策略优化
近端策略优化(Proximal Policy Optimization,PPO)是一种强化学习算法,用于训练智能体通过与环境的交互来学习最优策略。它是深度强化学习中的一种策略梯度方法,目的是在更新策略时确保“过度更新”不会导致性能下降。
3.1 PPO的引出
我们再看一下1.3.1节的Actor-Critic范式里Actor的梯度更新公式:
∇ θ R ˉ θ = 1 / N ∑ i = 1 N ∑ t A ( s t , a t ) ∇ θ log p ( a t ∣ s t , θ ) \nabla_\theta\bar{R}_{\theta}=1/N \sum_{i=1}^N \sum_t A(s_t,a_t) \nabla_\theta \log p(a_t|s_t,\theta) ∇θRˉθ=1/Ni=1∑Nt∑A(st,at)∇θlogp(at∣st,θ)
再复习一下,第一个 ∑ \sum ∑中的 i i i表示轨迹(或者episode)的序号,第二个 ∑ \sum ∑的 t t t表示轨迹中第 t t t步(的状态或动作)。为了简化,我们先只考虑一个轨迹:
∇ θ R ˉ θ = ∑ t A ( s t , a t ) ∇ θ log p ( a t ∣ s t , θ ) ∼ E ( s t , a t ) ∼ π θ { A ( s t , a t ) ∇ θ log p θ ( a t ∣ s t ) } \nabla_\theta\bar{R}_{\theta}=\sum_t A(s_t,a_t) \nabla_\theta \log p(a_t|s_t,\theta) \\ \sim \mathbb{E}_{(s_t,a_t)\sim \pi_\theta} \{A(s_t,a_t) \nabla_\theta \log p_\theta(a_t|s_t) \} ∇θRˉθ=t∑A(st,at)∇θlogp(at∣st,θ)∼E(st,at)∼πθ{A(st,at)∇θlogpθ(at∣st)}
其中, ∼ \sim ∼是一个正比关系,因为上面是求和,下面是平均,实际上就差一个系数,我们先不管。 E \mathbb{E} E的下标表示状态和动作是从参数为 θ \theta θ的actor π θ \pi_\theta πθ中采样得来的。
**于是发现一个问题:**如果按这种方式更新,那么流程就是,用actor π θ \pi_\theta πθ和环境交互,得到一系列的 ( s t , a t ) (s_t,a_t) (st,at), 然后梯度更新之后,更新了参数 θ \theta θ. 然而,我们的 ( s t , a t ) (s_t,a_t) (st,at)是从 π θ \pi_\theta πθ中采样来的,所以参数更新之后,我们需要重新采样!效率很低。这种方式称为on-policy。
那么怎么解决这个问题?我们就需要使得 ( s t , a t ) (s_t,a_t) (st,at)的采样和要更新的参数 θ \theta θ无关,这样我们就可以重复利用采样的数据,多次充分训练。这种方式称为off-policy。
具体怎么做呢?
我们先考虑这么一个问题:我们想求 E x ∼ p [ f ( x ) ] \mathbb{E}_{x\sim p}[f(x)] Ex∼p[f(x)],但是我不希望 x x x从分布 p p p中采样,而是希望 x x x从另一个分布 q q q中采样,同时还能估计这个概率值。于是写出:
E x ∼ p [ f ( x ) ] = ∫ f ( x ) p ( x ) d x = ∫ f ( x ) p ( x ) q ( x ) q ( x ) d x = E x ∼ q [ f ( x ) p ( x ) q ( x ) ] \mathbb{E}_{x\sim p}[f(x)] = \int f(x)p(x) dx = \int f(x) \frac{p(x)}{q(x)}q(x)dx = \mathbb{E}_{x\sim q}[f(x) \frac{p(x)}{q(x)}] Ex∼p[f(x)]=∫f(x)p(x)dx=∫f(x)q(x)p(x)q(x)dx=Ex∼q[f(x)q(x)p(x)]
但是这样就万事大吉了吗?对 p , q p,q p,q的接近程度是否有要求呢?均值相同,但是方差不一定相同。我们考察
D x ∼ p [ f ( x ) ] = E x ∼ p [ f 2 ( x ) ] − E x ∼ p 2 [ f ( x ) ] D x ∼ q [ f ( x ) p ( x ) q ( x ) ] = E x ∼ q [ ( f ( x ) p ( x ) q ( x ) ) 2 ] − E x ∼ q 2 [ f ( x ) p ( x ) q ( x ) ] = ∫ ( f ( x ) p ( x ) q ( x ) ) 2 q ( x ) d x − E x ∼ p 2 [ f ( x ) ] = ∫ f 2 ( x ) p ( x ) q ( x ) p ( x ) d x − E x ∼ p 2 [ f ( x ) ] = E x ∼ p [ f 2 ( x ) p ( x ) q ( x ) ] − E x ∼ p 2 [ f ( x ) ] \mathbb{D}_{x\sim p} [f(x)] = \mathbb{E}_{x\sim p}[f^2 (x)] - \mathbb{E}^2_{x\sim p}[f(x)] \\ \mathbb{D}_{x\sim q} [f(x) \frac{p(x)}{q(x)}] = \mathbb{E}_{x\sim q} [(f(x) \frac{p(x)}{q(x)})^2] - \mathbb{E}^2_{x\sim q} [f(x) \frac{p(x)}{q(x)}] \\ = \int (f(x) \frac{p(x)}{q(x)})^2 q(x) dx - \mathbb{E}^2_{x\sim p}[f(x)] \\ = \int f^2(x) \frac{p(x)}{q(x)} p(x) dx - \mathbb{E}^2_{x\sim p}[f(x)] = \mathbb{E}_{x\sim p}[f^2(x) \frac{p(x)}{q(x)}] - \mathbb{E}^2_{x\sim p}[f(x)] Dx∼p[f(x)]=Ex∼p[f2(x)]−Ex∼p2[f(x)]Dx∼q[f(x)q(x)p(x)]=Ex∼q[(f(x)q(x)p(x))2]−Ex∼q2[f(x)q(x)p(x)]=∫(f(x)q(x)p(x))2q(x)dx−Ex∼p2[f(x)]=∫f2(x)q(x)p(x)p(x)dx−Ex∼p2[f(x)]=Ex∼p[f2(x)q(x)p(x)]−Ex∼p2[f(x)]
所以,对于方差来说, D x ∼ q [ f ( x ) p ( x ) q ( x ) ] \mathbb{D}_{x\sim q} [f(x) \frac{p(x)}{q(x)}] Dx∼q[f(x)q(x)p(x)]的第一项里面多乘了一个 p ( x ) q ( x ) \frac{p(x)}{q(x)} q(x)p(x). 所以,如果两个分布相差很大,那么方差也会相差很大,即采样的点会特别不同,那么明显不是一个好的估计。所以说,约束 p , q p,q p,q不要相差的太远是很必要的.
好,那我们一会再说如何约束,先看看,如果当前更新的参数是 θ \theta θ,能不能从另一个分布 θ ′ \theta' θ′去采样从而可以充分利用数据。我们通过上面的结论,假设,在actor π θ \pi_{\theta} πθ下 ( s t , a t ) (s_t,a_t) (st,at)的联合概率密度函数为 p θ ( s t , a t ) p_\theta (s_t,a_t) pθ(st,at), 在另一个actor π θ ′ \pi_{\theta'} πθ′下 ( s t , a t ) (s_t,a_t) (st,at)的联合概率密度函数为 p θ ′ ( s t , a t ) p_{\theta'} (s_t,a_t) pθ′(st,at). 根据上面的结论立即写出
E ( s t , a t ) ∼ π θ { A ( s t , a t ) ∇ θ log p θ ( a t ∣ s t ) } = E ( s t , a t ) ∼ π θ ′ { p θ ( s t , a t ) p θ ′ ( s t , a t ) A ( s t , a t ) ∇ θ log p θ ( a t ∣ s t ) } \mathbb{E}_{(s_t,a_t)\sim \pi_\theta} \{A(s_t,a_t) \nabla_\theta \log p_\theta(a_t|s_t) \} \\ = \mathbb{E}_{(s_t,a_t)\sim \pi_{\theta'}} \{\frac{p_\theta (s_t,a_t)}{p_{\theta'} (s_t,a_t)} A(s_t,a_t) \nabla_\theta \log p_\theta(a_t|s_t)\} E(st,at)∼πθ{A(st,at)∇θlogpθ(at∣st)}=E(st,at)∼πθ′{pθ′(st,at)pθ(st,at)A(st,at)∇θlogpθ(at∣st)}
又因为
p θ ( s t , a t ) p θ ′ ( s t , a t ) = p θ ( a t ∣ s t ) p θ ( s t ) p θ ′ ( a t ∣ s t ) p θ ′ ( s t ) ≈ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) \frac{p_\theta (s_t,a_t)}{p_{\theta'} (s_t,a_t)}=\frac{p_\theta (a_t|s_t) p_{\theta}(s_t)}{p_{\theta'} (a_t|s_t) p_{\theta'}(s_t)} \approx \frac{p_\theta (a_t|s_t)}{p_{\theta'} (a_t|s_t)} pθ′(st,at)pθ(st,at)=pθ′(at∣st)pθ′(st)pθ(at∣st)pθ(st)≈pθ′(at∣st)pθ(at∣st)
上述约等于号的原因是,1. 我们很难估计 p ( s t ) p(s_t) p(st) 2. 其实在不同的actor下,可能某个状态出现的概率是近似相等的。
所以
E ( s t , a t ) ∼ π θ { A ( s t , a t ) ∇ θ log p θ ( a t ∣ s t ) } = E ( s t , a t ) ∼ π θ ′ { p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A ( s t , a t ) ∇ θ log p θ ( a t ∣ s t ) } ( ∇ log f ( x ) = ∇ f ( x ) f ( x ) ) = E ( s t , a t ) ∼ π θ ′ { ∇ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A ( s t , a t ) } \mathbb{E}_{(s_t,a_t)\sim \pi_\theta} \{A(s_t,a_t) \nabla_\theta \log p_\theta(a_t|s_t) \} \\ = \mathbb{E}_{(s_t,a_t)\sim \pi_{\theta'}} \{\frac{p_\theta (a_t|s_t)}{p_{\theta'} (a_t|s_t)} A(s_t,a_t) \nabla_\theta \log p_\theta(a_t|s_t)\} \\ (\nabla \log f(x) = \frac{\nabla f(x)}{f(x)})= \mathbb{E}_{(s_t,a_t)\sim \pi_{\theta'}} \{\frac{ \nabla p_\theta (a_t|s_t)}{p_{\theta'} (a_t|s_t)} A(s_t,a_t) \} E(st,at)∼πθ{A(st,at)∇θlogpθ(at∣st)}=E(st,at)∼πθ′{pθ′(at∣st)pθ(at∣st)A(st,at)∇θlogpθ(at∣st)}(∇logf(x)=f(x)∇f(x))=E(st,at)∼πθ′{pθ′(at∣st)∇pθ(at∣st)A(st,at)}
注意, A ( s t , a t ) A(s_t,a_t) A(st,at)这个量理论上也是与 θ \theta θ有关的,但是这种优势函数最主要还是受reward和state的影响,还是跟环境影响大,所以在更换参数前后不做区分。
所以,令
R ˉ θ = E ( s t , a t ) ∼ π θ ′ { p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A ( s t , a t ) } \bar{R}_{\theta} = \mathbb{E}_{(s_t,a_t)\sim \pi_{\theta'}} \{\frac{ p_\theta (a_t|s_t)}{p_{\theta'} (a_t|s_t)} A(s_t,a_t) \} Rˉθ=E(st,at)∼πθ′{pθ′(at∣st)pθ(at∣st)A(st,at)}
那么我们就按照$\nabla_\theta \bar{R}_{\theta} $更新参数。
那么,话说回来,我们如何约束 p θ p_\theta pθ和 p θ ′ p_{\theta'} pθ′的相似性?PPO-1算法指出,可以这样定义:
R ˉ θ = E ( s t , a t ) ∼ π θ ′ { p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A ( s t , a t ) } − β K L ( p θ , p θ ′ ) \bar{R}_{\theta} = \mathbb{E}_{(s_t,a_t)\sim \pi_{\theta'}} \{\frac{ p_\theta (a_t|s_t)}{p_{\theta'} (a_t|s_t)} A(s_t,a_t) \} - \beta KL(p_\theta, p_{\theta'}) Rˉθ=E(st,at)∼πθ′{pθ′(at∣st)pθ(at∣st)A(st,at)}−βKL(pθ,pθ′)
其中KL散度的作用是,在最大化上面的式子,就需要最小化KL,也就是要让两个分布尽量接近。有的时候,也会采取动态 β \beta β参数,也就是如果KL太小了,说明模型过度关注要让两个分布接近,那么就减少 β \beta β,否则,就增大 β \beta β.
3.2 PPO-2流程以及伪代码
相比于PPO-1,PPO-2具有更简洁的形式,它通过限制每次更新策略的变化幅度,来避免策略更新时的巨大波动。具体来说,它通过引入一个“剪切”目标函数(clipped objective),来约束策略更新的范围,从而避免策略的突然变化。
PPO的更新方式如下:
R ˉ θ = 1 / N ∑ i = 1 N ∑ t min { r t ( θ ) A ( s t , a t ) , clip ( 1 − ϵ , 1 + ϵ ) A ( s t , a t ) } \bar{R}_{\theta} = 1/N \sum_{i=1}^N \sum_t \min \{r_t(\theta)A(s_t,a_t),\text{clip}(1 - \epsilon,1 + \epsilon) A(s_t,a_t)\} Rˉθ=1/Ni=1∑Nt∑min{rt(θ)A(st,at),clip(1−ϵ,1+ϵ)A(st,at)}
其中 r t ( θ ) = p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) r_t(\theta) = \frac{ p_\theta (a_t|s_t)}{p_{\theta'} (a_t|s_t)} rt(θ)=pθ′(at∣st)pθ(at∣st), 是当前策略与旧策略的比值,
A ( s t , a t ) A(s_t,a_t) A(st,at)就是优势函数,可以按照1.3.1节中的计算方式去计算,但是更常用的是广义优势估计(GAE)的方法,公式如下:
A ( s t , a t ) = δ t + ( λ γ ) δ t + 1 + ( λ γ ) 2 δ t + 2 + … A(s_t,a_t) = \delta_t + (\lambda \gamma) \delta_{t+1} + (\lambda \gamma)^2 \delta_{t+2} + \dots A(st,at)=δt+(λγ)δt+1+(λγ)2δt+2+…
其中 δ t \delta_t δt是从 t t t时刻开始到结束的平均reward,计算方式恰好是1.3.1节中的 A A A, 也即:
δ t = r + γ V ( s t + 1 ) − V ( s t ) \delta_t = r+\gamma V(s_{t+1})-V(s_t) δt=r+γV(st+1)−V(st)
取min的深意是什么?可以看下面这个图。图的横纵坐标是 r t ( θ ) = p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) r_t(\theta)=\frac{ p_\theta (a_t|s_t)}{p_{\theta'} (a_t|s_t)} rt(θ)=pθ′(at∣st)pθ(at∣st). 如果现在的A是正的,红色线是取min之后的总体结果。A是正的说明现在的action比较好,我们自然希望增大 p θ ( a t ∣ s t ) p_\theta(a_t|s_t) pθ(at∣st). 但是,也不能太大,因为太大之后分布差异太大,我们反而无法获益于从不同分布采样带来的好处(参见上一节)。所以,要限制。同理,A是负的时候,红线是取min的结果(乘负数大小相反)。A是负的我们希望减小 p θ ( a t ∣ s t ) p_\theta(a_t|s_t) pθ(at∣st). 但是,也不能太小,道理是一样的。

伪代码如下:
# 初始化策略网络 π_θ 和价值网络 V_φ,设置超参数
初始化策略网络 π_θ 和价值网络 V_φ
设置折扣因子 γ,GAE 参数 λ,剪切参数 ε,学习率 α,批次大小 N
设置最大更新步数 T,最大训练轮数 Kfor 每个训练轮次 k in 1 到 K:# 收集数据初始化存储容器,存储状态 s, 动作 a, 奖励 r, 下一状态 s' 和折扣回报for 每个时间步 t in 1 到 T:通过策略网络 π_θ 选择动作 a_t 在状态 s_t 上与环境交互,获得奖励 r_t 和下一个状态 s_{t+1}存储 (s_t, a_t, r_t, s_{t+1}) 到存储容器# 计算优势估计 (GAE)对于每个时间步 t 从 T-1 到 1 反向计算:计算 TD 残差 δ_t = r_t + γ * V_φ(s_{t+1}) - V_φ(s_t)计算优势估计 \hat{A}_t 使用 GAE进行优势估计平滑# 更新策略和价值网络对每个 mini-batch(大小 N)进行迭代:# 计算重要性采样比 r_t(θ)r_t(θ) = π_θ(a_t | s_t) / π_θ_old(a_t | s_t)# 计算损失函数 L_CLIPL_CLIP = E_t[ min(r_t(θ) * \hat{A}_t, clip(r_t(θ), 1-ε, 1+ε) * \hat{A}_t) ]# 可选:加上熵正则化项 H(π_θ)L = L_CLIP + β * H(π_θ)# 更新策略网络参数 θ计算 L 对 θ 的梯度更新 θ = θ + α * 梯度# 更新价值网络参数 φ计算价值网络损失函数 L_critic更新 φ = φ - α * 梯度(使用 TD 错误的均方误差)# 更新旧策略网络 π_θ_old复制当前策略网络参数 π_θ 到 π_θ_old返回 最终的策略 π_θ
在实践中一般取 ϵ = 0.2 \epsilon=0.2 ϵ=0.2
参考学习链接:https://www.zhihu.com/tardis/bd/art/717010380
相关文章:
【强化学习笔记1】从强化学习的基本概念到近端策略优化(PPO)
好久没有更新了。最近想学习一下强化学习,本系列是李宏毅老师强化学习的课程笔记。 1. Policy-based Model 1.1 Actor 在policy-based model中,主要的目的就是训练一个actor。 对于一个episode(例如,玩一局游戏)&…...
Deepseek对ChatGPT的冲击?
从测试工程师的视角来看,DeepSeek对ChatGPT的冲击主要体现在**测试场景的垂直化需求与通用模型局限性之间的博弈**。以下从技术适配性、效率优化、风险控制及未来趋势四个维度展开分析: --- ### **一、技术适配性:垂直领域能力决定工具选择…...
STM32中的ADC
目录 一:什么是ADC 二:ADC的用途 三:STM32F103ZET6的ADC 3.1ADC对应的引脚 3.2ADC时钟 3.3ADC的工作模式 编辑3.4ADC校准 3.5ADC转换结构和实际电压的换算 四:ADC配置步骤 五:两个重要的函数 一:…...
开启AI短剧新纪元!SkyReels-V1/A1双剑合璧!昆仑万维开源首个面向AI短剧的视频生成模型
论文链接:https://arxiv.org/abs/2502.10841 项目链接:https://skyworkai.github.io/skyreels-a1.github.io/ Demo链接:https://www.skyreels.ai/ 开源地址:https://github.com/SkyworkAI/SkyReels-A1 https://github.com/Skywork…...
【uniapp】在UniApp中实现持久化存储:安卓--生成写入数据为jsontxt
在移动应用开发中,数据存储是一个至关重要的环节。对于使用UniApp开发的Android应用来说,缓存(Cache)是一种常见的数据存储方式,它能够提高应用的性能和用户体验。然而,缓存数据在用户清除缓存或清除应用数…...
大白话React第十一章React 相关的高级特性以及在实际项目中的应用优化
假设我们已经对 React 前端框架的性能和可扩展性评估有了一定了解,接下来的阶段可以深入学习 React 相关的高级特性以及在实际项目中的应用优化,以下是详细介绍及代码示例: 1. React 高级特性的深入学习 1.1 React 并发模式(Con…...
java容器 LIst、set、Map
Java容器中的List、Set、Map是核心数据结构,各自适用于不同的场景 一、List(有序、可重复) List接口代表有序集合,允许元素重复和通过索引访问,主要实现类包括: ArrayList 底层结构:动态数组…...
使用IDEA如何隐藏文件或文件夹
选择file -> settings 选择Editor -> File Types ->Ignored Files and Folders (忽略文件和目录) 点击号就可以指定想要隐藏的文件或文件夹...
DOM HTML:深入理解与高效运用
DOM HTML:深入理解与高效运用 引言 随着互联网的飞速发展,前端技术逐渐成为软件开发中的关键部分。DOM(文档对象模型)和HTML(超文本标记语言)是前端开发中的基石。本文将深入探讨DOM和HTML的概念、特性以及在实际开发中的应用,帮助读者更好地理解和使用这两项技术。 …...
形象生动讲解Linux 虚拟化 I/O
用现实生活的比喻和简单例子来解释 Linux 虚拟化 I/O,就像给朋友讲故事一样。 虚拟化 I/O 要解决什么问题? 想象你有一栋大房子(物理服务器),想把它分割成多个小公寓(虚拟机)出租。每个租客&…...
git从零学起
从事了多年java开发,一直在用svn进行版本控制,如今更换了公司,使用的是git进行版本控制,所以打算记录一下git学习的点滴,和大家一起分享。 百度百科: Git(读音为/gɪt/)是一个开源…...
汽车低频发射天线介绍
汽车低频PKE天线是基于RFID技术的深度研究及产品开发应用的一种天线,在汽车的智能系统中发挥着重要作用,以下是关于它的详细介绍: 移动管家PKE低频天线结构与原理 结构:产品一般由一个高Q值磁棒天线和一个高压电容组成ÿ…...
【Java分布式】Nacos注册中心
Nacos注册中心 SpringCloudAlibaba 也推出了一个名为 Nacos 的注册中心,相比 Eureka 功能更加丰富,在国内受欢迎程度较高。 官网:https://nacos.io/zh-cn/ 集群 Nacos就将同一机房内的实例划分为一个集群,一个服务可以包含多个集…...
【C++】ImGui:极简化的立即模式GUI开发
如果你是GUI开发的新手,或想试试轻量级、易集成的GUI库,ImGui(即时模式图形用户界面)是个不错的选择。它以简洁的API、跨平台的兼容性和卓越的性能,受到许多开发者的喜爱。无论是为C项目添加调试界面,还是构…...
5G学习笔记之BWP
我们只会经历一种人生,我们选择的人生。 参考:《5G NR标准》、《5G无线系统指南:如微见著,赋能数字化时代》 目录 1. 概述2. BWP频域位置3. 初始与专用BWP4. 默认BWP5. 切换BWP 1. 概述 在LTE的设计中,默认所有终端均能处理最大2…...
1. 搭建前端+后端开发框架
1. 说明 本篇博客主要介绍网页开发中,搭建前端和后端开发框架的具体步骤,框架中所使用的技术栈如下: 前端:VUE Javascript 后端:Python Flask Mysql 其中MySQL主要用来存储需要的数据,在本文中搭建基本…...
深入浅出:插入排序算法完全解析
1. 什么是插入排序? 插入排序(Insertion Sort)是一种简单的排序算法,其基本思想与我们整理扑克牌的方式非常相似。我们将扑克牌从第二张开始依次与前面已排序的牌进行比较,将其插入到合适的位置,直到所有牌…...
(十一)基于vue3+mapbox-GL实现模拟高德实时导航轨迹播放
要在 Vue 3 项目中结合 Mapbox GL 实现类似高德地图的实时导航轨迹功能,您可以按照以下步骤进行: 安装依赖: 首先,安装 mapbox-gl 和 @turf/turf 这两个必要的库: npm install mapbox-gl @turf/turf引入 Mapbox GL: 在组件中引入 mapbox-gl 并初始化地图实例: <templ…...
DeepSeek到TinyLSTM的知识蒸馏
一、架构设计与适配 模型结构对比: DeepSeek(教师模型):基于Transformer,多头自注意力机制,层数≥12,隐藏层维度≥768TinyLSTM(学生模型):单层双向LSTM&#…...
【Transformer模型学习】第三篇:位置编码
文章目录 0. 前言1. 为什么需要位置编码?2. 如何进行位置编码?3. 正弦和余弦位置编码4. 举个例子4.1 参数设置4.2 计算分母项4.3 计算位置编码4.4 位置编码矩阵 5. 相对位置信息6. 改进的位置编码方式——RoPE6.1 RoPE的核心思想6.2 RoPE的优势 7. 总结 …...
微信小程序自定义导航栏实现指南
文章目录 微信小程序自定义导航栏实现指南一、自定义导航栏的需求分析二、代码实现1. WXML 结构2. WXSS 样式样式解析:3. JavaScript 逻辑三、完整代码示例四、注意事项与优化建议五、总结微信小程序自定义导航栏实现指南 在微信小程序开发中,默认的导航栏样式可能无法满足所…...
(十 六)趣学设计模式 之 责任链模式!
目录 一、 啥是责任链模式?二、 为什么要用责任链模式?三、 责任链模式的实现方式四、 责任链模式的优缺点五、 责任链模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,…...
20250225-代码笔记03-class CVRPModel AND other class
文章目录 前言一、class CVRPModel(nn.Module):__init__(self, **model_params)函数功能函数代码 二、class CVRPModel(nn.Module):pre_forward(self, reset_state)函数功能函数代码 三、class CVRPModel(nn.Module):forward(self, state)函数功能函数代码 四、def _get_encodi…...
面试常问的压力测试问题
性能测试作为软件开发中的关键环节,确保系统在高负载下仍能高效运行。压力测试作为性能测试的重要类型,旨在通过施加超出正常负载的压力,观察系统在极端条件下的表现。面试中,相关问题常被问及,包括定义、重要性、与负…...
Python——365天学习规划
文章目录 1. 第一阶段:Python基础(Day 1-60) 1.1 Week 1-2:基础语法 1.1.1 Day 1-3:变量、数据类型、运算符、输入输出 1.1.2 Day 4-7:条件语句(if-elif-else) 1.1.3 Day 8-14&…...
河南理工XCPC萌新选拔赛
A 树之荣荣 青梅熙熙 树之荣荣 青梅熙熙 这个题是一个经典的博弈问题。我们可以考虑一种情况,就是你每一次都会取一个。那么最后一个你肯定不能取。所以我们可以考虑减去一个后的值。判断它的和是奇数还是偶数即可。 int n; cin >> n;int s 0;for (int i 1;…...
设计模式|策略模式 Strategy Pattern 详解
目录 一、策略模式概述二、策略模式的实现2.1 策略接口2.2 具体策略类2.3 上下文类2.4 客户端代码2.5 UML类图2.6 UML时序图 三、优缺点3.1 ✅优点3.2 ❌ 缺点 四、最佳实践场景4.1 适合场景描述4.2 具体场景 五、扩展5.1 继承复用机制和复合策略5.2 对象管理:优化策…...
Wireshark 插件开发实战指南
Wireshark 插件开发实战指南 环境搭建流程图 #mermaid-svg-XpNibno7BIyfzNn5 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-XpNibno7BIyfzNn5 .error-icon{fill:#552222;}#mermaid-svg-XpNibno7BIyfzNn5 .error-t…...
使用Java构建高效的Web服务架构
使用Java构建高效的Web服务架构 随着互联网技术的飞速发展,Web服务在现代应用中扮演着至关重要的角色。尤其是在企业级应用中,如何构建一个高效、可扩展且易维护的Web服务架构,成为了开发者和架构师面临的一项重要挑战。Java作为一种成熟、稳…...
《Python实战进阶》No 10:基于Flask案例的Web 安全性:防止 SQL 注入、XSS 和 CSRF 攻击
第10集:Web 安全性:防止 SQL 注入、XSS 和 CSRF 攻击 在现代 Web 开发中,安全性是至关重要的。无论是用户数据的保护,还是系统稳定性的维护,开发者都需要对常见的 Web 安全威胁有深刻的理解,并采取有效的防…...
