之前两篇文章介绍的内容其实都属于策略网络,即用神经网络去模拟在给定状态s下,每个动作a的执行概率。这篇用到的DQN则属于值函数网络,在这一大类里又可以分为:状态值函数和状态-动作值函数,DQN属于后者,即用神经网络去模拟在给定状态s和动作a的情况下,回报的期望。
代码参考自龙良曲的tensorflow2开源书籍。
|
|
DQN中也是有几点要注意的:
- 使用了 经验回放池 来减轻数据之间的强相关性,这个在第二篇文章中我们也使用了。
- 在选择动作的时候,并不是一定选择期望回报最大的那个动作,而是有一定概率选择别的,即 $\epsilon-greedy$ 算法,这个也是蛮常用的。
- 用到了影子网络,影子网络的更新会滞后Q网络,用来计算目标值。这是因为如果训练目标值和预测值都来自同一网络,那么数据之间就会存在很强的相关性。
- 用的是时序差分方法(TD)而不是蒙特卡罗方法(MC)来计算回报值。这样只需要交互一步即可获得值函数的误差,并优化更新值函数网络,因此比蒙特卡罗方法计算效率更高。但是一般来说,蒙特卡罗方法得到的结果更为准确,毕竟是算到头的。