理解DQN算法 Q-Learning算法

Q-Learning的算法如下:

对于Q-Learning,首先就是要确定如何存储Q值,最简单的想法就是用矩阵,一个s一个a对应一个Q值,所以可以把Q值想象为一个很大的表格,横列代表s,纵列代表a,里面的数字代表Q值.

维度灾难

在上面的分析中,我们使用表格来表示Q(s,a),但是这个在现实的很多问题上是几乎不可行的,因为状态实在是太多。使用表格的方式根本存不下。

怎么办呢?就是用一个函数来表示Q(s,a)。即

f 可以是任意类型的函数,比如线性函数:

 其中是函数f的参数。

通过函数表示,我们就可以无所谓s到底是多大的维度,反正最后都通过矩阵运算降维输出为单值的Q。

如果我们就用来统一表示函数f的参数,那么就有

高维输入低维输出表示

对应一个高维状态输入,一个低维动作输出。那么怎么来表示这个函数f呢?

其实就是,只把状态s作为输入,但是输出的时候输出每一个动作的Q值,也就是输出一个向量,记住这里输出是一个值,只不过是包含了所有动作的Q值的向量而已。这样我们就只要输入状态s,而且还同时可以得到所有的动作Q值,也将更方便的进行Q-Learning中动作的选择与Q值更新。

神经网络化Q值

我们用一个深度神经网络来表示这个函数f。

以DQN为例,输入是经过处理的4个连续的84×84图像,然后经过两个卷积层,两个全连接层,最后输出包含每一个动作Q值的向量。

对于这个网络的结构,针对不同的问题可以有不同的设置。

总之,用神经网络来表示Q值非常简单,Q值也就是变成用Q网络(Q-Network)来表示。接下来就到了很多人都会困惑的问题,那就是

Q网络的loss

神经网络的训练是最优化一个损失函数loss function。因此,我们需要有样本,然后通过反向传播使用梯度下降的方法来更新神经网络的参数。

所以,我们利用Q-Learning算法为Q网络提供有标签的样本。

Q-Learning算法中,Q值的更新依靠的是利用Reward和Q计算出来的目标Q值:

因此,我们把目标Q值作为标签,Q网络训练的损失函数就是:

上面公式是即下一个状态和动作。这里用了David Silver的表示方式,看起来比较清晰。

DQN训练

这里分析NIPS 2013提出的DQN。

具体的算法主要涉及到Experience Replay,也就是经验池的技巧,就是如何存储样本及采样问题。