Policy Gradient

来源:互联网 发布:medline数据库论文 编辑:程序博客网 时间:2024/04/28 04:51

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

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

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

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)

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

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方法就这么确定了。



原创粉丝点击