智能单元
首发于智能单元
DQN从入门到放弃7  连续控制DQN算法-NAF

DQN从入门到放弃7 连续控制DQN算法-NAF

1 前言

在上一篇文章DQN从入门到放弃6 DQN的各种改进中,我们介绍了DQN的各个方面的改进。从各种改进的角度和思路很有利于我们思考如何去创新这个事情。那么,本着从入门到放弃的精神[呲牙],在今天这篇文章中,我们还是来分析一下将DQN拓展到连续控制的算法------NAF。

2 DQN算法用在连续控制上存在的问题

从之前对DQN的分析,大家已经知道,DQN是一个面向离散控制的算法,也就是说输出的动作是离散的,不是连续的。这里也单独说一下离散控制和连续控制。这可以认为是增强学习任务的一种分类方法。那么一开始在没有引入深度学习的情况下,增强学习的任务基本是面向低维输入,低维输出的问题,因为高维的问题难度实在是太大,很难收敛。那么,DQN,引入了深度学习,使得输入可以拓展到高维空间,比如玩Atari,完全图像输入,维度是80x80=6400维,但是玩Atari的输出只是离散的键盘按键输出,比如Breakout这个游戏,也就是4个输出。而如果问题换成一个机械臂的控制呢?假设有6个关节,然后每个关节的扭矩输出是连续值,也就是在一个范围内任意取值,比如(-1,1)。那么,即使把每一个输出离散化,比如精度到0.01,那么一个动作有200个取值,那么6个关节也就是200的6次方个取值,这实在太多了。更何况如果进一步提升这个精度,那么取值的数量就成倍增加了。这就是连续控制比离散控制难得多的地方。将连续控制离散化也是完全不可取的做法

那么DQN为什么没办法直接用在连续控制上呢?原因很简单,DQN依靠计算每一个动作的Q值,然后选择最大的Q值对应的动作。那么这种方法在连续控制上完全不起作用。因为,根本就没办法穷举每一个动作,也就无法计算最大的Q值对应的动作。

所以,问题也就来了:

如何将DQN拓展成能够用在连续控制上的深度增强学习算法?

3 Continuous Deep Q-Learning with NAF

arxiv.org/abs/1603.0074

在上面这篇Paper中,作者提出了一种idea来实现连续控制。基本思路是这样的:

Step 1:在DQN的框架下,连续控制的输出需要满足什么条件?

因为DQN是通过计算Q值的最大值来选择动作。那么对于连续控制,我们已经无法选择动作,我们只能设计一种方法,使得我们输入状态,然后能够输出动作,并且保证输出动作对应的Q值是最大值。

Step 2:又要输出动作,又要输出Q值?

第一步的分析我们会发现一个两难的境地,就是我们输入状态,输出的时候,既要能输出动作,还要能输出Q值。那么这个时候,我们有两种选择,一种就是弄两个神经网络,一个是Policy网络,输入状态,输出动作,另一个是Q网络,输入状态,输出Q值。另外一种就是弄一个神经网络,既输出动作,有能输出Q值。先说第一种做法。这种做法其实就是Actor-Critic算法的做法。这种做法需要能够构建一个能够更新Policy网络的方法。而DQN并没有提供更新Policy网络的方法。这使得我们要基于DQN做文章,只有一个办法,就是只弄一个神经网络,既能输出动作也能输出Q值。But,how?

Step 3:如何构建神经网络,又能输出动作,也能输出Q值,而且动作对应的Q值最大?

这个问题确实是很困难的一个问题,很难直接就想出一个好的做法。虽然在Paper中作者其实只用了一段话来说明他们的方法,但是确实是很酷的idea。先提一下这些作者Shixiang Gu, Timothy Lillicrap, Ilya Sutskever, Sergey Levine 后面两个都很牛。然后我们还是直接分析他们提出的方法吧!

上图就是这个方法的示意图了。输入输出关系非常复杂。正常简单的Q网络就是200relu之后直接输出Q,但是这里经过很多复杂的步骤之后才输出Q。

基本的idea就是引入了Advantage,也就是每一个动作在特定状态下的优劣。我们不是要选最优的动作吗?其实就是要选Advantage最大的动作。Q,A(Advantage)和V(Value)的关系如下:

Q(s,a) = A(s,a) + V(s)

所以,核心idea来了如果我们能够限制A小于等于0,并且选择的动作对应的A为0,那么问题就解决了。要做到这点,一种简单的想法就是让

A(a) = -P(a-x)^2 P为正

也就是二次方程取负。这个时候当a=x即选择的动作时为0.

那么具体构建当然是用矩阵的方式来构建。只是显然复杂的多。

state经过两个200层的神经网络(包含非线性)后分别构建三个分力的全连接层,输出Value,mu(动作)还有构建矩阵P所需的L0。也就是同时输出了价值还有动作

那么最大的问题就是如何构造A的矩阵表示了。

上式是A的矩阵表示,也就是一个二次型。其中x是状态,u是动作,mu是神经网络的输出动作。

那么令z = u - \mu ,也就是

A = -0.5z^TPz\leq 0

z^TPz>0

要满足这个要求,P必须为正定矩阵。这本身也就是正定矩阵的定义。

接下来就是如何构造P的问题了。

这里作者竟然采用了乔列斯基(Cholesky)分解:

若A为n阶对称正定矩阵,则存在唯一的主对角线元素都是正数的下三角阵L,使得A=LL^T,此分解式称为 正定矩阵的乔列斯基(Cholesky)分解。

也就是构造了一个对角线元素都是正数的下三角阵L,然后利用L构造P。

---------------------------------------------------------------------------------------

上面的分析确实是有点复杂。

那么我们再回到上面那个神经网络流程图来具体看看神经网络具体是怎么处理的?

1)State,维度是输入维度state_dim

2) 经过两个200的RELU全连接层

3)输出V,维度为1

4)输出mu(动作),维度为动作的维度action_dim

5)输出L0,维度为(action_dim)x(action_dim+1)/2,也就是构造下三角矩阵L所需要的维度

6)构造L。将L0转化为L.也就是将一个列向量转换为下三角矩阵,就是从新排列,然后把对角线的数exp对数化。

7)根据L构造P。

8)根据mu,P,action构造A

9)根据A和V构造Q,也就是Q=A+V

综上,最终输出Q,并且可以根据DQN的方法进行梯度下降。

以上就是这个算法的整个过程。

3 小结

这个算法确实设计精美,但实现起来其实蛮复杂。未来需要有更多的改进!

编辑于 2016-07-16

文章被以下专栏收录

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