理解DQN算法

理解DQN算法从 QLearning 到 DQN 网络

Q-Learning算法

Q-Learning的算法如下:

理解DQN算法

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

维度灾难

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

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

Q(s,a) = f(s,a)

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

Q(s,a) = w_1s + w_2a + b 其中w_1,w_2,b是函数f的参数。

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

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

Q(s,a) = f(s,a,w)

高维输入低维输出表示

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

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

神经网络化Q值

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

理解DQN算法

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

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

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

Q网络的loss

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

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

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

R_{t+1}+\lambda \max _aQ(S_{t+1},a)

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

理解DQN算法上面公式是s^`,a^` 即下一个状态和动作。这里用了David Silver的表示方式,看起来比较清晰。

DQN训练

这里分析NIPS 2013提出的DQN。

理解DQN算法

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




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223559.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午1:55
下一篇 2026年3月17日 下午1:56


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号