Policy Gradient

2018-11-21  本文已影响0人  winddy_akoky

一、介绍

回顾以下以前 value-based的方法:在value-based方法中,他们都是去学习一个动作的价值函数,然后根据这个动作的价值函数作出下一步选择。以至于这个方法高度依赖动作价值函数,如果没有动作价值函数,也就不知道如何为下一步作出抉择。
在本文中,我们提出一种新的想法来解决Reinforcement Learning 中的决策问题。即直接去训练这么一个策略,它能直接给出下一步动作是什么。当然,这个策略肯定是带参数的。我们最直接的目标就是优化策略的参数,使之能够很好的做出准确的决策。换句话说,以前 value-based方法是找出每一个状态下的每一个动作的价值函数,而 Policy Gradient 的方法是找出每一个状态下该采取哪个动作的函数。前者是 状态动作到价值的映射,后者是状态到动作的映射。显然后者更简单粗暴点。后者这种方法就叫做policy-based.

为了表示出Policy Gradient中的策略,我们记 \theta 为策略的参数向量。因此策略可以用如下概率表示:
\pi(a|s, \theta) = Pr\{A_t = a | S_s, \theta_t = \theta\}

image.png

即在时间 t 时,在状态 s 下选取某一个动作的概率。
实际上,我们定义了一个某一个状态下关于动作的概率分布。有了这个概率分布,决策时在这个分布中采样就可以了。

当然policy gradient 也可以处理连续空间问题,如下图所示,但本文主要以离散动作空间做例子:


image.png

二、优化策略

OK,那问题来了,策略 \pi(a|s, \theta) 有了,该怎么优化这个策略呢?如果能找到最优的策略,那不管环境给你怎样的状态,我们都能从策略中得到当前状态下关于动作的分布,最后采样结果就是抉择的结果。但是前提是这个策略是靠谱的,所以我们下面研究如何优化这个策略。

这里要提出一个优化方法:梯度下降

首先,我们要有一个衡量策略结果好坏的函数,把它叫做目标函数,记 J(\theta),其中\theta是参数向量。这个目标函数值越大,说明我们的策略越好,反之越差。所以实际上问题就转化为最大化目标函数。而最大化该函数的方法就是用梯度下降。
应用梯度下降方法求解最大化函数问题,简单地讲就是求偏导,最后的参数更新有如下形式:
\theta_{t+1} = \theta_t + \alpha \nabla J(\theta_t)

这个一个非常一般的一种形式,不同的目标函数催生出不同的算法。但是,只要可以表示成上面这种形式的表达式,都属于 Policy Gradient 方法。

那么,该怎么计算 \nabla J(\theta) 以及 \pi(a|s, \theta) = Pr\{A_t = a | S_s, \theta_t = \theta\}呢?
实际上,这两个的计算方法都依赖于其本身的定义。例如:对于离散动作空间下,策略\pi可以用 soft-max 分布表示
\pi(a|s, \theta) = \frac{e^{h(s, a, \theta)}}{\sum_b e^{h(s, b, \theta)}}
其中h(s, a, \theta)是状态-动作对的参数化表示,可以用一个神经网络去近似它:
h(s,a, \theta) = \theta^T x(s,a)
其中 \theta 是网络中去权重的向量,x(s,a)表示状态和动作的特征。

至于如何计算 \nabla J(\theta)? 计算前必须先定义好 J(\theta)。假设环境能产生一段完整的 episode, 那么我们可以用初始状态的价值去表示目标函数:
J(\theta) = v_{\pi_\theta}(s_0)

J(\theta) = v_{\pi_\theta}(s_0) 求偏导,其偏导结果有定理Policy Gradient Theorem给出

image.png

有了上面的求导结果,就可以导出第一个 policy-gradient 算法了:Monte Carlo Policy Gradient
从上面公式看,\nabla J(\theta) 结果与 \sum \mu (s) \sum_a \nabla \pi (a|s) q_\pi (s,a) 成正比,进一步写成:
\nabla J(\theta) \propto \sum \mu (s) \sum_a \nabla \pi (a|s) q_\pi (s,a)
= E_\pi[ \sum_a q_\pi (S_t , a) \nabla \pi (a|S_t, \theta)]
实际上我们可以把\nabla J(\theta)\sum \mu (s) \sum_a \nabla \pi (a|s) q_\pi (s,a) 之间画上等号,因为我们在更新参数 \theta 的时候会乘上一个学习数率\alpha,这个参数可以消去这两个项之间的比例系数。所以,放心画上等号后:
\begin{align} \nabla J(\theta) & =\sum \mu (s) \sum_a \nabla \pi (a|s) q_\pi (s,a) \\ & = E_\pi[ \sum_a q_\pi (S_t , a) \nabla \pi (a|S_t, \theta)] \\ & = E_\pi[ \sum_a \pi(a, | S_t , \theta) q_\pi (S_t , a) \frac{ \nabla \pi (a|S_t, \theta)]}{\pi (a|S_t, \theta)} ]\\ & = E_\pi [q_\pi (S_t , A_t) \frac{\nabla \pi (a|S_t, \theta)}{\pi (a|S_t, \theta)}] \\ & = E_\pi [G_t \nabla log \pi(A_t | S_t , \theta) ] \end{align}

现在就能导出 monte carlo 的 policy gradient 的更新公式了:
\theta_(t+1) = \theta_t + \alpha G_t \nabla \pi(A_t | S_t , \theta)

三、算法框架

image.png
  1. 初始化状态 s_0
  2. 将状态 s_0 传入 RL 算法,得到各个动作的概率
  3. 根据概率分布采样,得到下一步动作 a_0
  4. 环境对 Agent 作出的动作 a_0 给予相应的奖励 r_1, Agent 到达下一个状态 s_1

经过上面步骤后,得到数据集: \{s_0, a_0, r_1, s_1\}, 如果 a_0 不是终止动作,上面的步骤还必须继续进行,直到遇到终止动作,一段 episode 就说是结束了。

最后收集的数据: \{ s_0, a_0, r_1, s_1, a_1, r_2, s_2 , ... ..., s_{T-1}, a_{T-1}, r_T, s_T \}

有了数据后才进行算法的更新。

image.png

这是 sutton 的《Reinforcement learning 》书中所叙的算法。下面再贴上 Devil 的算法:


image.png

这两个算法差别不大,可以说基本差不多。注意 Devil 版本的算法中的更新公式中有一项是v_t,这个v_t实际上还是用G_t去估计。

上一篇下一篇

猜你喜欢

热点阅读