智能单元
首发于智能单元
深度增强学习之Policy Gradient方法1

深度增强学习之Policy Gradient方法1

1 前言

在之前的深度增强学习系列文章中,我们已经详细分析了DQN算法,一种基于价值Value的算法,那么在今天,我们和大家一起分析深度增强学习中的另一种算法,也就是基于策略梯度Policy Gradient的算法。这种算法和基于价值Value的算法结合而成的Actor-Critic算法是目前效果最好的深度增强学习算法。

那么关于Policy Gradient方法的学习,有以下一些网上的资源值得看:

  1. Andrej Karpathy blog: Deep Reinforcement Learning: Pong from Pixels
  2. David Silver ICML 2016:深度增强学习Tutorial
  3. John Schulman:Machine Learning Summer School
  4. David Silver的增强学习课程(有视频和ppt): www0.cs.ucl.ac.uk/staff

那么实际上Andrej Karpathy的blog已经很详细的分析了Policy Gradient的方法,这里我将综合以上的内容根据我自己的理解来说以下Policy Gradient。

2 Why Policy Network?

我们已经知道DQN是一个基于价值value的方法。换句话说就是通过计算每一个状态动作的价值,然后选择价值最大的动作执行。这是一种间接的做法。那么,更直接的做法是什么?

能不能直接更新策略网络Policy Network呢?

什么是策略网络Policy Network?就是一个神经网络,输入是状态,输出直接就是动作(不是Q值)。

a = \pi(s,\theta)a = \pi(s,\theta)

或者输出概率:a = \pi(a|s,\theta)

这里要提一下概率输出的问题。对于DQN来说,本质上是一个接近于确定性输出的算法。至多就是采用\epsilon-greedy进行探索。但是有很多时候,在某一个特定状态下,很多动作的选择可能都是可以的。比如说我有20块钱去买饭。那么不管我买的是蛋炒饭还是土豆肉片盖码饭,结果都是一样的填饱肚子。因此,采用输出概率会更通用一些。而DQN并不能输出动作的概率,所以采用Policy Network是一个更好的办法。

3 Policy Gradient

要更新策略网络,或者说要使用梯度下降的方法来更新网络,我们需要有一个目标函数。对于策略网络,目标函数其实是比较容易给定的,就是很直接的,最后的结果!也就是

L(\theta) = \mathbb E(r_1+\gamma r_2 + \gamma^2 r_3 + ...|\pi(,\theta)) 所有带衰减reward的累加期望

那么问题就在于如何利用这个目标来更新参数\theta呢?咋一看这个损失函数和策略网络简直没有什么直接联系,reward是环境给出的,如何才能更新参数?换个说法就是如何能够计算出损失函数关于参数的梯度(也就是策略梯度):

\nabla_{\theta} L(\theta)

咋一看根本就没有什么思路是不是,所以先换一个思路来考虑问题。

4 就给我一个Policy Network,也没有loss,怎么更新?

改变动作的出现概率!

现在我们不考虑别的,就仅仅从概率的角度来思考问题。我们有一个策略网络,输入状态,输出动作的概率。然后执行完动作之后,我们可以得到reward,或者result。那么这个时候,我们有个非常简单的想法:

如果某一个动作得到reward多,那么我们就使其出现的概率增大,如果某一个动作得到的reward少,那么我们就使其出现的概率减小。

当然,也显然的,用reward来评判动作的好坏是不准确的,甚至用result来评判也是不准确的。毕竟任何一个reward,result都依赖于大量的动作才导致的。但是这并不妨碍我们做这样的思考:

如果能够构造一个好的动作评判指标,来判断一个动作的好与坏,那么我们就可以通过改变动作的出现概率来优化策略!

假设这个评价指标是f(s,a),那么我们的Policy Network输出的是概率。一般情况下,更常使用log likelihood log \pi(a|s,\theta)。原因的话看这里Why we consider log likelihood instead of Likelihood in Gaussian Distribution

因此,我们就可以构造一个损失函数如下:

L(\theta) = \sum log\pi(a|s,\theta)f(s,a)

怎么理解呢?举个简单的AlphaGo的例子吧。对于AlphaGo而言,f(s,a)就是最后的结果。也就是一盘棋中,如果这盘棋赢了,那么这盘棋下的每一步都是认为是好的,如果输了,那么都认为是不好的。好的f(s,a)就是1,不好的就-1。所以在这里,如果a被认为是好的,那么目标就是最大化这个好的动作的概率,反之亦然。

这就是Policy Gradient最基本的思想。

5 另一个角度:直接算

f(s,a)不仅仅可以作为动作的评价指标,还可以作为目标函数。就如同AlphaGo,评价指标就是赢或者输,而目标就是结果赢。这和之前分析的目标完全没有冲突。因此,我们可以利用评价指标f(s,a)来优化Policy,同时也是在优化的同时优化了f(s,a).那么问题就变成对f(s,a)求关于参数的梯度。下面的公式直接摘自Andrej Karpathy的blog,f(x)即是f(s,a)

\begin{align}
\nabla_{\theta} E_x[f(x)] &= \nabla_{\theta} \sum_x p(x) f(x) & \text{definition of expectation} \\
& = \sum_x \nabla_{\theta} p(x) f(x) & \text{swap sum and gradient} \\
& = \sum_x p(x) \frac{\nabla_{\theta} p(x)}{p(x)} f(x) & \text{both multiply and divide by } p(x) \\
& = \sum_x p(x) \nabla_{\theta} \log p(x) f(x) & \text{use the fact that } \nabla_{\theta} \log(z) = \frac{1}{z} \nabla_{\theta} z \\
& = E_x[f(x) \nabla_{\theta} \log p(x) ] & \text{definition of expectation}
\end{align}

从公式得到的结论可以看到正好和上一小结分析得到的目标函数一致。

因此,Policy Gradient方法就这么确定了。

6 小结

本篇blog作为一个引子,介绍下Policy Gradient的基本思想。那么大家会发现,如何确定这个评价指标才是实现Policy Gradient方法的关键所在。所以,在下一篇文章中。我们将来分析一下这个评价指标的问题。

文章被以下专栏收录

    面向通用人工智能和机器人学习,聚焦深度增强学习,可微神经计算机和生成对抗模型。