首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >强化学习(十三) 策略梯度(Policy Gradient)

强化学习(十三) 策略梯度(Policy Gradient)

作者头像
刘建平Pinard
发布于 2018-12-27 09:12:00
发布于 2018-12-27 09:12:00
1.5K00
代码可运行
举报
运行总次数:0
代码可运行

    在前面讲到的DQN系列强化学习算法中,我们主要对价值函数进行了近似表示,基于价值来学习。这种Value Based强化学习方法在很多领域都得到比较好的应用,但是Value Based强化学习方法也有很多局限性,因此在另一些场景下我们需要其他的方法,比如本篇讨论的策略梯度(Policy Gradient),它是Policy Based强化学习方法,基于策略来学习。

    本文参考了Sutton的强化学习书第13章和策略梯度的论文

1. Value Based强化学习方法的不足

    DQN系列强化学习算法主要的问题主要有三点。

    第一点是对连续动作的处理能力不足。DQN之类的方法一般都是只处理离散动作,无法处理连续动作。虽然有NAF DQN之类的变通方法,但是并不优雅。比如我们之前提到的经典的冰球世界(PuckWorld) 强化学习问题,具体的动态demo见这里。环境由一个正方形区域构成代表着冰球场地,场地内大的圆代表着运动员个体,小圆代表着目标冰球。在这个正方形环境中,小圆会每隔一定的时间随机改变在场地的位置,而代表个体的大圆的任务就是尽可能快的接近冰球目标。大圆可以操作的行为是在水平和竖直共四个方向上施加一个时间乘时长的力,借此来改变大圆的速度。假如此时这个力的大小和方向是可以灵活选择的,那么使用普通的DQN之类的算法就不好做了。因为此时策略是一个有具体值有方向的力,我们可以把这个力在水平和垂直方向分解。那么这个力就是两个连续的向量组成,这个策略使用离散的方式是不好表达的,但是用Policy Based强化学习方法却很容易建模。

    第二点是对受限状态下的问题处理能力不足。在使用特征来描述状态空间中的某一个状态时,有可能因为个体观测的限制或者建模的局限,导致真实环境下本来不同的两个状态却再我们建模后拥有相同的特征描述,进而很有可能导致我们的value Based方法无法得到最优解。此时使用Policy Based强化学习方法也很有效。

    第三点是无法解决随机策略问题。Value Based强化学习方法对应的最优策略通常是确定性策略,因为其是从众多行为价值中选择一个最大价值的行为,而有些问题的最优策略却是随机策略,这种情况下同样是无法通过基于价值的学习来求解的。这时也可以考虑使用Policy Based强化学习方法。

    由于上面这些原因,Value Based强化学习方法不能通吃所有的场景,我们需要新的解决上述类别问题的方法,比如Policy Based强化学习方法。

2. Policy Based强化学习方法引入

    回想我们在alue Based强化学习方法里,我们对价值函数进行了近似表示,引入了一个动作价值函数$\hat{q}$,这个函数由参数$w$描述,并接受状态$s$与动作$a$作为输入,计算后得到近似的动作价值,即:$$\hat{q}(s,a,w) \approx q_{\pi}(s,a)$$

    在Policy Based强化学习方法下,我们采样类似的思路,只不过这时我们对策略进行近似表示。此时策略$\pi$可以被被描述为一个包含参数$\theta$的函数,即:$$\pi_{\theta}(s,a) = P(a|s,\theta)\approx  \pi(a|s)$$

    将策略表示成一个连续的函数后,我们就可以用连续函数的优化方法来寻找最优的策略了。而最常用的方法就是梯度上升法了,那么这个梯度对应的优化目标如何定义呢?

3. 策略梯度的优化目标

    我们要用梯度上升来寻找最优的梯度,首先就要找到一个可以优化的函数目标。

    最简单的优化目标就是初始状态收获的期望,即优化目标为:$$J_1(\theta) = V_{\pi_{\theta}}(s_1) = \mathbb{E}_{\pi_{\theta}}(G_1) $$

    但是有的问题是没有明确的初始状态的,那么我们的优化目标可以定义平均价值,即:$$J_{avV}(\theta) =\sum\limits_sd_{\pi_{\theta}}(s)V_{\pi_{\theta}}(s)$$

    其中,$d_{\pi_{\theta}}(s)$是基于策略$\pi_{\theta}$生成的马尔科夫链关于状态的静态分布。

    或者定义为每一时间步的平均奖励,即:$$J_{avR}(\theta) = =\sum\limits_sd_{\pi_{\theta}}(s) \sum\limits_a \pi_{\theta}(s,a) R_s^a$$

    无论我们是采用$J_1,J_{avV}$还是$J_{avR}$来表示优化目标,最终对$\theta$求导的梯度都可以表示为:$$\nabla_{\theta} J(\theta) = \mathbb{E}_{\pi_{\theta}}[\nabla_{\theta}log \pi_{\theta}(s,a) Q_{\pi}(s,a)]$$

    具体的证明过程这里就不再列了,如果大家感兴趣,可以去看策略梯度的论文的附录1,里面有详细的证明。

    当然我们还可以采用很多其他可能的优化目标来做梯度上升,此时我们的梯度式子里面的$\nabla_{\theta}log \pi_{\theta}(s,a)$部分并不改变,变化的只是后面的$ Q_{\pi}(s,a)]$部分。对于$\nabla_{\theta}log \pi_{\theta}(s,a)$,我们一般称为分值函数(score function)。

    现在梯度的式子已经有了,后面剩下的就是策略函数$\pi_{\theta}(s,a)$的设计了。

4. 策略函数的设计

    现在我们回头看一下策略函数$ \pi_{\theta}(s,a) $的设计,在前面它一直是一个数学符号。

    最常用的策略函数就是softmax策略函数了,它主要应用于离散空间中,softmax策略使用描述状态和行为的特征$\phi(s,a)$ 与参数$\theta$的线性组合来权衡一个行为发生的几率,即:$$\pi_{\theta}(s,a) = \frac{e^{\phi(s,a)^T\theta}}{\sum\limits_be^{\phi(s,b)^T\theta}}$$

    则通过求导很容易求出对应的分值函数为:$$\nabla_{\theta}log \pi_{\theta}(s,a) = \phi(s,a) - \mathbb{E}_{\pi_{\theta}}[\phi(s,.)]$$

    另一种高斯策略则是应用于连续行为空间的一种常用策略。该策略对应的行为从高斯分布$ \mathbb{N(\phi(s)^T\theta, \sigma^2)}$中产生。高斯策略对应的分值函数求导可以得到为:$$\nabla_{\theta}log \pi_{\theta}(s,a) =  = \frac{(a-\phi(s)^T\theta)\phi(s)}{\sigma^2}$$

    有策略梯度的公式和策略函数,我们可以得到第一版的策略梯度算法了。

5. 蒙特卡罗策略梯度reinforce算法

    这里我们讨论最简单的策略梯度算法,蒙特卡罗策略梯度reinforce算法, 使用价值函数$v(s)$来近似代替策略梯度公式里面的$Q_{\pi}(s,a)$。算法的流程很简单,如下所示:

    输入:N个蒙特卡罗完整序列,训练步长$\alpha$

    输出:策略函数的参数$\theta$

    1. for 每个蒙特卡罗序列:

    a. 用蒙特卡罗法计算序列每个时间位置t的状态价值$v_t$

    b. 对序列每个时间位置t,使用梯度上升法,更新策略函数的参数$\theta$:$$\theta = \theta + \alpha \nabla_{\theta}log \pi_{\theta}(s_t,a_t)  v_t$$

       2. 返回策略函数的参数$\theta$

  这里的策略函数可以是softmax策略,高斯策略或者其他策略。

 6. 策略梯度实例

    这里给出第5节的蒙特卡罗策略梯度reinforce算法的一个实例。仍然使用了OpenAI Gym中的CartPole-v0游戏来作为我们算法应用。CartPole-v0游戏的介绍参见这里。它比较简单,基本要求就是控制下面的cart移动使连接在上面的pole保持垂直不倒。这个任务只有两个离散动作,要么向左用力,要么向右用力。而state状态就是这个cart的位置和速度, pole的角度和角速度,4维的特征。坚持到200分的奖励则为过关。

     完整的代码参见我的github:https://github.com/ljpzzz/machinelearning/blob/master/reinforcement-learning/policy_gradient.py

    这里我们采用softmax策略作为我们的策略函数,同时,softmax的前置部分,也就是我们的策略模型用一个三层的softmax神经网络来表示。这样好处就是梯度的更新可以交给神经网络来做。

    我们的softmax神经网络的结构如下,注意这个网络不是价值Q网络,而是策略网络:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def create_softmax_network(self):
        # network weights
        W1 = self.weight_variable([self.state_dim, 20])
        b1 = self.bias_variable([20])
        W2 = self.weight_variable([20, self.action_dim])
        b2 = self.bias_variable([self.action_dim])
        # input layer
        self.state_input = tf.placeholder("float", [None, self.state_dim])
        self.tf_acts = tf.placeholder(tf.int32, [None, ], name="actions_num")
        self.tf_vt = tf.placeholder(tf.float32, [None, ], name="actions_value")
        # hidden layers
        h_layer = tf.nn.relu(tf.matmul(self.state_input, W1) + b1)
        # softmax layer
        self.softmax_input = tf.matmul(h_layer, W2) + b2
        #softmax output
        self.all_act_prob = tf.nn.softmax(self.softmax_input, name='act_prob')
        self.neg_log_prob = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=self.softmax_input,
                                                                      labels=self.tf_acts)
        self.loss = tf.reduce_mean(self.neg_log_prob * self.tf_vt)  # reward guided loss

        self.train_op = tf.train.AdamOptimizer(LEARNING_RATE).minimize(self.loss)

    注意我们的损失函数是softmax交叉熵损失函数和状态价值函数的乘积,这样TensorFlow后面可以自动帮我们做梯度的迭代优化。

    另一个要注意的点就是蒙特卡罗法里面价值函数的计算,一般是从后向前算,这样前面的价值的计算可以利用后面的价值作为中间结果,简化计算,对应代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def learn(self):

        discounted_ep_rs = np.zeros_like(self.ep_rs)
        running_add = 0
        for t in reversed(range(0, len(self.ep_rs))):
            running_add = running_add * GAMMA + self.ep_rs[t]
            discounted_ep_rs[t] = running_add

        discounted_ep_rs -= np.mean(discounted_ep_rs)
        discounted_ep_rs /= np.std(discounted_ep_rs)

    其余部分和之前的DQN的代码类似。

7. 策略梯度小结

    策略梯度提供了和DQN之类的方法不同的新思路,但是我们上面的蒙特卡罗策略梯度reinforce算法却并不完美。由于是蒙特卡罗法,我们需要完全的序列样本才能做算法迭代,同时蒙特卡罗法使用收获的期望来计算状态价值,会导致行为有较多的变异性,我们的参数更新的方向很可能不是策略梯度的最优方向。

    因此,Policy Based的强化学习方法还需要改进,注意到我们之前有Value Based强化学习方法,那么两者能不能结合起来一起使用呢?下一篇我们讨论Policy Based+Value Based结合的策略梯度方法Actor-Critic。

(欢迎转载,转载请注明出处。欢迎沟通交流: liujianping-ok@163.com)     

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-12-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用 OWIN Self-Host ASP.NET Web API 2
Open Web Interface for .NET (OWIN)在Web服务器和Web应用程序之间建立一个抽象层。OWIN将网页应用程序从网页服务器分离出来,然后将应用程序托管于OWIN的程序而离开IIS之外,关于OWIN的详细资料可参考博客 MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN。使用OWIN 自宿主 ASP.NET WebAPI 2可以参考以下2篇文章: Use OWIN to Self-Host ASP.NET Web API 2 As
张善友
2018/01/29
1.4K0
Asp.Net 之 Web.config 配置文件详解
  在asp.net中配置文件名一般默认是web.config。每个web.config文件都是基于XML的文本文件,并且可以保存到Web应用程序中的任何目录中。在发布Web应用程序时web.config文件并不编译进dll文件中。如果将来客户端发生了变化,仅仅需要用记事本打开web.config文件编辑相关设置就可以重新正常使用,非常方便。
CherishTheYouth
2019/09/11
6.3K0
Asp.Net 之 Web.config 配置文件详解
ASP.NET那点不为人知的事(二)
上一篇博文《ASP.NET那点不为人知的事(一)》中我们提到HttpApplication有19个标准事件,在HttpApplication的第8个事件PostMapRequestHandlerExcute触发的时候,标志着已经获取了处理当前请求的处理程序对象,在第11个事件PreRequestHandlerExcute之后,HttpApplication将执行这个处理程序,接下来我们继续讨论以下话题: HttpContext状态管理 处理HttpApplication的事件 常见的HttpMod
用户1161731
2018/01/11
7760
ASP.NET那点不为人知的事(二)
Microsoft ReportViewer 控件类型版本兼容问题及解决方法
错误 Parser Error Message: The base class includes the field 'rvEquipment', but its type (Microsoft.
用户1637609
2018/04/12
3K0
Microsoft ReportViewer 控件类型版本兼容问题及解决方法
Asp.Net Web API(三)
    在Asp.Net Web API中,一个控制器就是一个处理HTTP请求的类,控制器的public方法就被叫做action方法或简单的Action。当Web API接收到一个请求的时候,它将这个请求路由到一个Action。
莫问今朝
2018/08/31
2K0
Asp.Net Web API(三)
ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline - Part II
二、ASP.NET Runtime Pipeline(续ASP.NET Http Runtime Pipeline - Part I) 现在我们真正进入ASP.NET管辖的范畴,下图基本上囊括整个处
蒋金楠
2018/02/07
8570
ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline - Part II
不要随便使用runAllManagedModulesForAllRequests="true"来解决问题
在 IIS 7.0 中,对于使用 Url 路由 访问页面的 ASP.NET 应用程序,IIS可能会不能出 Url 是对 ASP.NET 的请求。会显示404啊,403啊之类的错误代码(因为路径不存在,或者不允许查看目录)。网上一般的解决方案比较“粗暴”,直接设置 runAllManagedModulesForAllRequests="true" 即可。
孙小北
2024/01/30
7740
Asp.net web api部署在某些服务器上老是404
asp.net web api部署在Windows服务器上后,按照WebAPI定义的路由访问,老是出现404,但定义一个静态文件从站点访问,却又OK。
guokun
2020/09/03
2.4K0
asp.net MVC 应用程序的生命周期
  首先我们知道http是一种无状态的请求,他的生命周期就是从客户端浏览器发出请求开始,到得到响应结束。那么MVC应用程序从发出请求到获得响应,都做了些什么呢?       本文我们会详细讨论MVC应用程序一个请求的生命周期,从一个控件到另一个控件是怎样被处理的。我们还会详细介绍一下整个请求的生命周期中,用到的相关组件。因为在平常的开发过程中,我们可能知道怎样去使用MVC框架来处理相关的请求,大部分的时候我们只是在controller和action方法之间做相关的处理,对于真正内在的运行机制可能不是很了解。
用户1172223
2018/01/26
2.2K0
Asp.Net Web API 2第六课——Web API路由和动作选择
      Asp.Net Web API第一课——入门http://www.cnblogs.com/aehyok/p/3432158.html
aehyok
2018/08/31
1.2K0
Asp.Net Web API 2第六课——Web API路由和动作选择
.NET WebAPI中使用Session使用
今天做项目的时候因为需要编写一个短信验证码的接口我需要在我的后台.net webapi中存入我随机生成的短信验证码方便与前端传递过来的数据对比,所以决定使用session做缓存。但是没想到的是我调用都是都是为空的。让后在网上找了下原因是因为Web Api的控制器类派生自ApiControll它只继承了IHttpController, IDisposable这两个接口,与 MVC Controll类没有直接关系,因此不能像在ASPX.CS代码隐藏类中直接使用HttpContext、HttpApplicationState或HttpSessionState等状态数据。要使用的话,一般是从System.Web.HttpContext.Current静态对象引用HttpContext,从而使用Session等状态数据。所以接下来我们需要做的是重写Global.asax中的方法,通过路由重写启用WEB API 中的session会话。
追逐时光者
2019/08/28
2.6K0
WCF Web API 说再见,继承者ASP.NET Web API
从 .NET 3.5 开始 WCF 已经支持用 WebHttpBinding 构建 RESTful Web 服务,基于 WCF 框架的 RESTful Web 服务还是建立在 WCF Message 栈上,还是基于RPC风格的,因为 REST 的工作原理有所不同,它不需要依赖 SOAP 协议,因此 WCF 消息管道对于它经过了特殊的消息优化。但 REST 集成在 WCF 消息管道上还是不理想,所以微软重新开始构造基于Http 协议特点的RESTful的Web API, 从2010年10月份开始把代码放在co
张善友
2018/01/30
1.5K0
WCF Web API 说再见,继承者ASP.NET Web API
ASP.NET Web API路由规则(二)
(注:至于为什么用MapHttpRoute而不是MapRoute;为什么用routeTemplate而不是用url我们再以后的章节介绍)
liulun
2022/05/09
5690
ASP.NET Web API路由规则(二)
ASP.NET Web API编程——路由
路由过程大致分为三个阶段: 1)请求URI匹配已存在路由模板 2)选择控制器 3)选择操作 1匹配已存在的路由模板 路由模板 在WebApiConfig.Register方法中定义路由,例如模板默认生成的路由为: config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new
甜橙很酸
2018/04/17
2K0
asp.net web api添加统一异常处理
1、自定义异常处理过滤器 /// <summary> /// 自定义异常处理过滤器 /// </summary> public class CustomExceptionFilterAttribute : ExceptionFilterAttribute { public override void OnException(HttpActionExecutedContext actionExecutedContext) {
guokun
2020/09/03
1K0
Asp.Net Web API 2第五课——Web API路由
    Asp.Net Web API第一课——入门 http://www.cnblogs.com/aehyok/p/3432158.html
aehyok
2018/08/31
1.5K0
Asp.Net Web API 2第五课——Web API路由
asp.net mvc本地程序集和GAC的程序集冲突解决方法
一个从asp.net mvc 3升级到asp.net mvc 4的项目发生了如下错误: [A]System.Web.WebPages.Razor.Configuration.HostSection cannot be cast to [B]System.Web.WebPages.Razor.Configuration.HostSection. Type A originates from 'System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutra
张善友
2018/01/29
1.1K0
ASP.Net请求处理机制初步探索之旅 - Part 3 管道
开篇:上一篇我们了解了一个ASP.Net页面请求的核心处理入口,它经历了三个重要的入口,分别是:ISAPIRuntime.ProcessRequest()、HttpRuntime.ProcessRequest()以及HttpApplication.Init()。其中,在HttpApplication的Init()方法中触发了请求处理管道事件的执行,本篇我们就来看看所谓的请求处理管道。
Edison Zhou
2018/08/20
1.3K0
ASP.Net请求处理机制初步探索之旅 - Part 3 管道
ASP.NET Web API: 宿主(Hosting)
ASP.NET Web API 处理架构中介绍了ASP.NET Web API主要有三层组成:宿主(hosting),消息处理管道(message handler pipeline)和控制器处理(controller handling),本篇文章主要介绍宿主(Hosting):包括ASP.NET经典管道上的Web Hosting和WCF堆栈的自宿主SelfHosting。 ASP.NET经典管道上的Web Hosting 1、ASP.NET 路由使您可以使用不必映射到网站中特定文件的 URL。 由于该 UR
张善友
2018/01/19
1.5K0
ASP.NET Web API: 宿主(Hosting)
通过ASP.NET Web API + JQuery创建一个简单的Web应用
看了dudu的《HttpClient + ASP.NET Web API, WCF之外的另一个选择》一文,想起多很久之前体现ASP.NET Web API而创建的一个Demo。这是一个只涉及到简单CRUD操作的Web应用,业务逻辑以Web API的形式定义并以服务的形式发布出来,前台通过jQuery处理用户交互并调用后台服务。[源代码从这里下载] 目录 一、一个简单的基于CRUD 二、通过ASP.NET Web API提供服务 三、通过JQuery消费服务 一、
蒋金楠
2018/01/15
1K0
通过ASP.NET Web API + JQuery创建一个简单的Web应用
推荐阅读
相关推荐
使用 OWIN Self-Host ASP.NET Web API 2
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验