简介
Q learning和SARSA有Q表的限制,因为S通常难以枚举,但Q表的本质是一种映射,因此可以用函数代替Q表,例如对于玩游戏来说,当每帧画面是一个s时,那么可以用CNN来代替Q表。这样的RL方法称为Deep Q Network,简称DQN。
同Q learning,NN的训练以Q实际(即R + γ·max(Q_next(s', a_all)))为目标值,以error (= Q实际 - Q估计)乘上学习率lr来更新NN。此外,DQN使用了两大技巧:
- exprience replay - 建立记忆库(如过去2000步s,a,r,s_),通过随机从记忆库中提取经历来学习,打乱经历间的相关性
- fixed Q-targets - Q实际使用旧参数计算,Q估计则使用新参数,打乱相关性
算法
![](https://img.haomeiwen.com/i8358903/57410e5bb54455f7.jpg)
整体和Q learning是相似的,区别:
从前面两个init可见除了Q估计还建立了一个Q_target的函数(NN);
假想做完动作后得到的s, r, s_, a不直接更新,而是存放到D记忆库;
更新Q是随机选择D中的记忆更新,且Q_target是用旧参数计算,这些旧参数每隔C步后会更新一次。
PS: 还可以在迭代后期逐渐提高epsilon,以减少不确定性。
代码
DQN代码(由于是TensorFlow1的代码,暂时略过讲解,大体同伪代码思路)
Double DQN
原始DQN中Q_target = R + γ·max(Q_next(s', a_all))
,其中Q_next即同NN的旧参数的预测,由于误差存在又取max导致总是增加误差,使存在overestimate,例如对于奖励最高为1的学习,原始DQN可能出现预测的奖励超过1的情况。为避免最大误差的影响,Double DQN使用Q估计即新参数的NN来估计使Q最大的a,用这个a来代回Q_next的函数获得Q_target。新的Q_target = R + γ·Q_next(s', argmax Q(s(t+1), a;θt)))
。DDQN对比DQN仅计算Q_target的区别。有点类似SARSA和Q learning的区别。
DQN with Prioritized Replay
如果是只有极少的s带有正reward时,正负样本比例悬殊,DQN的学习效率将会变得很低,除了手动更改reward之外,使用 Prioritized replay可以重视这些少量的但更值得学习的样本,方法就是给予不同样本以不同的权重或优先级。如何计算优先级?最简单的方式就是直接以TD_error来作为优先级,即错误越高的样本越有提升空间越可以学习,类似boosting。batch不再是随机选出,而是选出优先度高的样本。同时为了避免每次对优先度排序的耗时,使用了SumTree.
![](https://img.haomeiwen.com/i8358903/66447343d02ddf16.png)
Duelling DQN
由于在某些s下采取任何a都没有意义,所以可以将Q(s)分解为Value (s的价值) + Advantage (每个动作在s下的价值的均值),简写为Q=V+A。为此NN的最后一层将有两个独立的全连接分别输出V和A。
网友评论