强化学习-PolicyGradient相关推导和记录

news/2024/5/19 0:11:09 标签: 强化学习, 策略梯度

首先定义强化学习的目标: m a x i m i z e J ( π θ ) = E τ ∼ π θ [ R ( τ ) ] maximize J(\pi_\theta)=E_{\tau \sim \pi_\theta}[R(\tau)] maximizeJ(πθ)=Eτπθ[R(τ)]也就是找到一个策略可以最大化累计奖励。其中是 π θ \pi_\theta πθ θ \theta θ参数化的策略。

那么策略梯度的目标就是寻找一个最好的 θ \theta θ去达到目标。其更新方式就是: θ k + 1 = θ k + α ∇ J ( π θ ) ∣ θ k \theta_{k+1}=\theta_k+\alpha \nabla J(\pi_\theta)|_{\theta_k} θk+1=θk+αJ(πθ)θk

那么 J ( π θ ) J(\pi_\theta) J(πθ)的导数形式是如何呢?下面就来推导一下
∇ J ( π θ ) = ∇ E τ ∼ π θ [ R ( τ ) ] = ∫ τ P ( τ ∣ θ ) R ( τ ) = ∫ τ ∇ P ( τ ∣ θ ) R ( τ ) \nabla J(\pi_\theta)=\nabla E_{\tau \sim \pi_\theta}[R(\tau)] = \int_\tau P(\tau|\theta)R(\tau) \\ = \int_\tau \nabla P(\tau|\theta)R(\tau) J(πθ)=Eτπθ[R(τ)]=τP(τθ)R(τ)=τP(τθ)R(τ)
其中 P ( τ ∣ θ ) = ρ 0 ( s 0 ) ∏ t = 0 T P ( r t + 1 , s t + 1 ∣ s t , a t ) π θ ( a t ∣ s t ) P(\tau|\theta)=\rho_0(s_0) \prod_{t=0}^{T}P(r_{t+1},s_{t+1}|s_t,a_t)\pi_\theta(a_t|s_t) P(τθ)=ρ0(s0)t=0TP(rt+1,st+1st,at)πθ(atst),因为里面包含连乘,所以将其转换一下形式,变成如下形式:
l o g P ( τ ∣ θ ) = l o g ρ 0 ( s 0 ) + ∑ t = 0 T [ l o g P ( r t + 1 , s t + 1 ∣ s t , a t ) + l o g π θ ( a t ∣ s t ) ] logP(\tau|\theta)=log\rho_0(s_0)+ \sum_{t=0}^{T}[logP(r_{t+1},s_{t+1}|s_t,a_t) + log\pi_\theta(a_t|s_t)] logP(τθ)=logρ0(s0)+t=0T[logP(rt+1,st+1st,at)+logπθ(atst)]
那么对 θ \theta θ求导可得如下形式
∇ θ l o g P ( τ ∣ θ ) = ∑ t = 0 T ∇ θ l o g π θ ( a t ∣ s t ) \nabla_\theta logP(\tau|\theta)= \sum_{t=0}^{T}\nabla_\theta log\pi_\theta(a_t|s_t) θlogP(τθ)=t=0Tθlogπθ(atst)
然后 ∇ θ P ( τ ∣ θ ) 和 ∇ θ l o g P ( τ ∣ θ ) \nabla_\theta P(\tau|\theta)和\nabla_\theta logP(\tau|\theta) θP(τθ)θlogP(τθ)可以通过这样一个变化联系起来: ∇ θ P ( τ ∣ θ ) = P ( τ ∣ θ ) ∇ θ l o g P ( τ ∣ θ ) \nabla_\theta P(\tau|\theta)=P(\tau|\theta)\nabla_\theta logP(\tau|\theta) θP(τθ)=P(τθ)θlogP(τθ)
所以,将其带回到上面的 ∇ J ( π θ ) \nabla J(\pi_\theta) J(πθ)中可得:
∇ θ J ( π θ ) = ∫ τ ∇ θ P ( τ ∣ θ ) R ( τ ) = ∫ τ P ( τ ∣ θ ) ∇ θ l o g P ( τ ∣ θ ) R ( τ ) = E τ ∼ θ [ ∇ θ l o g P ( τ ∣ θ ) R ( τ ) ] = E τ ∼ θ [ ∑ t = 0 T ∇ θ l o g π θ ( a t ∣ s t ) R ( τ ) ] \nabla_\theta J(\pi_\theta) = \int_\tau \nabla_\theta P(\tau|\theta)R(\tau) \\ = \int_\tau P(\tau|\theta)\nabla_\theta logP(\tau|\theta)R(\tau) \\ =E_{\tau \sim \theta}[\nabla_\theta logP(\tau|\theta)R(\tau)] \\ =E_{\tau \sim \theta}[\sum_{t=0}^{T}\nabla_\theta log\pi_\theta(a_t|s_t)R(\tau)] θJ(πθ)=τθP(τθ)R(τ)=τP(τθ)θlogP(τθ)R(τ)=Eτθ[θlogP(τθ)R(τ)]=Eτθ[t=0Tθlogπθ(atst)R(τ)]
与是我们就得到了最简单的一个策略梯度的形式。因为这里是期望,所以我们可以通过采样来估计这个期望,假设我们收集到了D组轨迹数据,那么这个 ∇ θ J ( π θ ) \nabla_\theta J(\pi_\theta) θJ(πθ)可以通过如下形式计算:
∇ θ J ( π θ ) = 1 ∣ D ∣ ∑ τ ∼ D ∑ t = 0 T ∇ θ l o g π θ ( a t ∣ s t ) R ( τ ) \nabla_\theta J(\pi_\theta) = \frac{1}{|D|}\sum_{\tau \sim D}\sum_{t=0}^{T} \nabla_\theta log\pi_\theta(a_t|s_t)R(\tau) θJ(πθ)=D1τDt=0Tθlogπθ(atst)R(τ).

那么这个最简单的策略梯度有什么缺点呢?我们通过公式可以看出,其对于每个动作(不管好坏)更新的幅度(比例)都是一样的,因为后面都是乘以一个 R ( τ ) R(\tau) R(τ),而这个值无法分别反映每个动作的价值。
所以,在这里,一个很自然的想法就是对于每个动作,后面都乘以其相应执行后得到的奖励即可。所以上面的形式就转为如下:
∇ θ J ( π θ ) = 1 ∣ D ∣ ∑ τ ∼ D ∑ t = 0 T ∇ θ l o g π θ ( a t ∣ s t ) ∑ t ′ = t T R ( s t ′ , a t ′ , s t ′ + 1 ) \nabla_\theta J(\pi_\theta) = \frac{1}{|D|}\sum_{\tau \sim D}\sum_{t=0}^{T} \nabla_\theta log\pi_\theta(a_t|s_t) \sum_{t'=t}^{T}R(s_{t'},a_{t'},s_{t'+1}) θJ(πθ)=D1τDt=0Tθlogπθ(atst)t=tTR(st,at,st+1).
这种形式也称为Reward-to-go policyGradient。因为每个动作后面乘以的是从当前动作执行后后续的所有奖励累计。

但是,虽然这种形式比最开始的形式估计的要好点,但是还是没有到好的动作更新的多点,差的动作更新的少点。 因为 ∑ t ′ = t T R ( s t ′ , a t ′ , s t ′ + 1 ) \sum_{t'=t}^{T}R(s_{t'},a_{t'},s_{t'+1}) t=tTR(st,at,st+1)是由t时刻开始后面所有动作的奖励组成,所以,如果当前的动作好,但是累计奖励小(后面的动作差),那么这个动作更新的幅度并不会很大,反之,如果当前的动作很差,但是累计奖励大(后面的动作好),那么这个动作更新的幅度反而会大。

那么我们如何再改进这个形式呢?首先,先引出了一个EGLP引理,这个引理说的是导数的期望是0,即: E x ∼ P θ [ ∇ θ l o g P θ ( x ) ] = 0 E_{x \sim P_\theta}[\nabla_\theta logP_\theta(x)] = 0 ExPθ[θlogPθ(x)]=0
下面我们证明一下这个引理:
∵ ∫ x P θ ( x ) = 1 ∴ ∇ θ ∫ x P θ ( x ) = 0 ∴ 0 = ∇ θ ∫ x P θ ( x ) = ∫ x ∇ θ P θ ( x ) = ∫ x P θ ( x ) ∇ θ l o g P θ ( x ) = E x ∼ P θ [ ∇ θ l o g P θ ( x ) ] \because \int_x P_\theta(x)=1\\ \therefore \nabla_\theta \int_xP_\theta(x) = 0 \\ \therefore 0=\nabla_\theta \int_xP_\theta(x)=\int_x \nabla_\theta P_\theta(x)=\int_x P_\theta(x) \nabla_\theta logP_\theta(x) \\ =E_{x \sim P_\theta}[\nabla_\theta logP_\theta(x)] xPθ(x)=1θxPθ(x)=00=θxPθ(x)=xθPθ(x)=xPθ(x)θlogPθ(x)=ExPθ[θlogPθ(x)]
那么根据这个引理,我们可以知道对任意的函数 f ( y ) f(y) f(y) E x ∼ P θ [ ∇ θ l o g P θ ( x ) f ( y ) ] = 0 E_{x \sim P_\theta}[\nabla_\theta logP_\theta(x) f(y)]=0 ExPθ[θlogPθ(x)f(y)]=0
那么,我们就可以在上面的 ∇ θ J ( π θ ) \nabla_\theta J(\pi_\theta) θJ(πθ)中加入可以解决上述问题的一些函数。比如状态价值函数 V π ( s t ) V_\pi(s_t) Vπ(st)

这样一个仅与状态有关的函数 f ( x ) f(x) f(x),我们称它为baseline
所以上面的形式就转为如下:
∇ θ J ( π θ ) = E τ ∼ θ [ ∑ t = 0 T ∇ θ l o g π θ ( a t ∣ s t ) ( ∑ t ′ = t T R ( s t ′ , a t ′ , s t ′ + 1 ) − f ( s t ) ) ] \nabla_\theta J(\pi_\theta) =E_{\tau \sim \theta}[\sum_{t=0}^{T}\nabla_\theta log\pi_\theta(a_t|s_t)(\sum_{t'=t}^{T}R(s_{t'},a_{t'},s_{t'+1})-f(s_t))] θJ(πθ)=Eτθ[t=0Tθlogπθ(atst)(t=tTR(st,at,st+1)f(st))].
在这里,baseline最常用的是状态价值函数 V π ( s t ) V_\pi(s_t) Vπ(st)。当baseline为状态价值函数的时候,可以减小策略梯度估计的方差,从而获得更快、更稳定的策略学习。从直觉上来说,这里选择了这个状态价值函数以后,后面的 ∑ t ′ = t T R ( s t ′ , a t ′ , s t ′ + 1 ) − f ( x ) \sum_{t'=t}^{T}R(s_{t'},a_{t'},s_{t'+1})-f(x) t=tTR(st,at,st+1)f(x)相当于是这个动作与平均动作的好坏。

所以,策略梯度可以写成下面这样的一般形式:
∇ θ J ( π θ ) = E τ ∼ θ [ ∑ t = 0 T ∇ θ l o g π θ ( a t ∣ s t ) Φ t ] \nabla_\theta J(\pi_\theta) =E_{\tau \sim \theta}[\sum_{t=0}^{T}\nabla_\theta log\pi_\theta(a_t|s_t) \Phi_t] θJ(πθ)=Eτθ[t=0Tθlogπθ(atst)Φt]
其中 Φ t \Phi_t Φt可以是 R ( τ ) R(\tau) R(τ),或者是 ∑ t ′ = t T R ( s t ′ , a t ′ , s t ′ + 1 ) \sum_{t'=t}^{T}R(s_{t'},a_{t'},s_{t'+1}) t=tTR(st,at,st+1),或者 ∑ t ′ = t T R ( s t ′ , a t ′ , s t ′ + 1 ) − f ( s t ) \sum_{t'=t}^{T}R(s_{t'},a_{t'},s_{t'+1})-f(s_t) t=tTR(st,at,st+1)f(st),或者 Q π θ ( s t , a t ) Q_{\pi_\theta}(s_t,a_t) Qπθ(st,at)又或者是 A π θ ( s t , a t ) = Q π θ ( s t , a t ) − V π θ ( s t , a t ) A_{\pi_\theta}(s_t,a_t)=Q_{\pi_\theta}(s_t,a_t)-V_{\pi_\theta}(s_t,a_t) Aπθ(st,at)=Qπθ(st,at)Vπθ(st,at)
虽然每个选择都会具有不同的方差,但是最终的期望值都是一样的。
在这里要说明的是, A π θ ( s t , a t ) A_{\pi_\theta}(s_t,a_t) Aπθ(st,at)也称为优势函数,描述的是当前执行的动作相比于其它动作的平均好坏(是对于当前策略而言).

详细信息(推导)可以参考:SpinningUp


http://www.niftyadmin.cn/n/1060862.html

相关文章

多线程之GCD

1.进程:正在进行中的程序被称为进程,负责程序运行的内存分配,每一个进程都有自己独立的虚拟内存空间2.线程:线程是进程中一个独立的执行路径(控制单元),一个进程中至少包含一条线程,即主线程(UI操作)&#…

【时间序列分析】03. 谱密度

Contents谱密度谱函数和谱密度白噪声的谱密度线性序列的谱密度线性滤波与谱密度谱密度 谱函数和谱密度 随机变量的统计性质可以由它的分布函数或概率密度刻画,类似地,平稳序列的统计性质可以由它的谱分布函数或谱密度函数刻画。平稳序列的谱分布函数是…

seo工具

http://tool.seowhy.com/ 一、关键词查词类工具:可以查询出更多目标客户可能搜索的词语 1、百度指数:http://index.baidu.com/ 这个工具是使用人数最多的 2、百度推广工具:http://www2.baidu.com/ 这个不一定非得百度推广才能用的&#xff…

python2入门(2)

四、python条件语句 if语句基本语法if 判断条件: 执行语句块else if: 执行语句块else: 执行语句 五、循环语句 1 - while循环基本语法while 判断条件: 执行语句块while循环使用else基本语法while 判断条件: while 判断条件: 执行语句块 else: 执行语句块执行逻辑是第二层while循…

自由能(Free Energy)(一)

博客内容参考,本篇博客所有内容基于在这个链接内容做的一些加工以及思考,强烈建议去看一遍原文。 前言 假设一个场景,你在球场投篮,那么你是如何完成这个投篮动作呢?你的大脑会先根据抛物线公式计算一下角度高度等&a…

【时间序列分析】04. 自回归模型

Contents自回归模型推移算子齐次常系数线性差分方程通解的收敛性非齐次常系数线性差分方程自回归模型的定义AR(p){\rm AR}(p)AR(p) 模型的平稳解Wold 系数的递推公式自回归模型 推移算子 为了方便对时间序列的讨论,需要对时间序列的时间指标 ttt 引入向后推移算子…

如果判断图片是否存在,可以使用javascript,省资源并且方便简单.

<img src"a.gif" οnerrοr"javascript:this.srcb.gif" />转载于:https://www.cnblogs.com/engine/p/4304026.html

Chromium Graphics Update in 2014(滑动)

原创文章&#xff0c;转载请注明为链接原始来源对于http://blog.csdn.net/hongbomin/article/details/40897433. 摘要&#xff1a;Chromium图形栈在2014年有多项改进。在图形性能和资源消耗方面做了进一步优化&#xff0c;比如ubercompositor的使用&#xff0c;GPU加速的光栅化…