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

强化学习(⼗三)策略梯度(PolicyGradient)
    在前⾯讲到的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:
    这⾥我们采⽤softmax策略作为我们的策略函数,同时,softmax的前置部分,也就是我们的策略模型⽤⼀个三层的softmax神经⽹络来表⽰。这样好处就是梯度的更新可以交给神经⽹络来做。
    我们的softmax神经⽹络的结构如下,注意这个⽹络不是价值Q⽹络,⽽是策略⽹络:
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 = lu(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')
<_log_prob = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=self.softmax_input,
labels=self.tf_acts)
self.loss = tf.reduce__log_prob * self.tf_vt)  # reward guided loss
    注意我们的损失函数是softmax交叉熵损失函数和状态价值函数的乘积,这样TensorFlow后⾯可以⾃动帮我们做梯度的迭代优化。
    另⼀个要注意的点就是蒙特卡罗法⾥⾯价值函数的计算,⼀般是从后向前算,这样前⾯的价值的计算可以利⽤后⾯的价值作为中间结果,简化计算,对应代码如下:
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)   
财政部长Processing math: 0%

本文发布于:2024-09-22 10:23:40,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/433331.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:策略   函数   梯度   状态   价值   学习
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议