理解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个连续的84x84图像,然后经过两个卷积层,两个全连接层,最后输出包含每一个动作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,也就是经验池的技巧,就是如何存储样本及采样问题。