文章目录
DDQN
DQN的问题:
- Q-预估:训练时,每个状态都有一个预估的Q值,对多种不同的状态进行采样,求出Q值的平均值。
- Q-实际:有了策略之后真实的去玩很多次游戏,用reward求出实际的Q值,取平均。
会发现预估的Q值往往比实际的Q值要高。如下面paper中的图所示:

为什么Q-estimation > Q-reality?
假设状态s下能采取的动作得到的Q值都是一样的,但是由于网络的误差导致某一个动作的Q值被高估了,按照公式:
Q
(
s
t
,
a
t
)
←
→
r
t
+
max
a
Q
(
s
t
+
1
,
a
)
Q(s_t,a_t) \leftarrow \rightarrow r_t + \underset{a}{\operatorname{max}}Q(s_{t+1},a)
Q(st,at)←→rt+amaxQ(st+1,a)
产生的目标值就会被高估,于是训练时的Q值也会被高估。
另外可以发现,DDQN的实际值是高于DQN的,说明DDQN训练出来的策略优于DQN
解决方法:DDQN
Q ( s t , a t ) ← → r t + Q ′ ( s t + 1 , arg max a Q ( s t + 1 , a ) ) Q(s_t,a_t) \leftarrow \rightarrow r_t + Q'(s_{t+1}, \underset{a}{\operatorname{arg\,max}}Q(s_{t+1},a)) Q(st,at)←→rt+Q′(st+1,aargmaxQ(st+1,a))
精髓:选动作的Q-function和计算Q的Q-function不是同一个。于是被Q高估的动作用Q’算出来是正常的,被Q’高估的动作并不一定被Q选出来。
使用target-network
这一技巧本身就有两个网络,因此DDQN相对于DQN变化极少,其中Q是需要更新的网络,Q’是目标网络。
Dueling DQN
Framework
网络输出:scalar–V(s), vector–A(s, a)
好处:
- 若某一个状态s1所有的动作我都希望增加他们的值,那么我就不用每一个A(s1, a1), A(s1, a2)……都去增加,只需要增加V(s1)就可以了
- 某状态state下没有被sample到的action也能够和其他的action一起变化,提高了数据的更新效率
如何避免直接将V(s)恒等于0,然后Q=A,通过A来具体控制每一个Q(s, a)。答:对A加约束,强迫网络倾向于更新V
约束的类型例如:∑aA(s, a) = 0
Prioritized Experience Replay

采用Experience Replay
的时候,默认是均匀的从buffer里面sample数据。
但Prioritized Experience Replay
根据TD error调整sample的优先性(Priority),即TD error大(网络的输出和目标之间的差距很大)的数据说明训练的不好,因此之后sample的时候会以更大的概率被sample到。
注意目标网络和输出网络是不同的,Q和 Q ^ \widehat{Q} Q
Balance between MC and TD

- buffer里面存放的是玩了N步的数据,N是hyperparameter
- Q ^ \widehat{Q} Q 产生的是第N+1步的预估Q值
- 结合了MC和TD的好处和坏处
Noisy Net

在每一次episode开始前,在Q网络的参数上加一个高斯噪声,就变成了 Q ~ \widetilde{Q} Q : Noisy Q-function,接下来用固定住的Noisy网络去玩游戏直到游戏结束。再重新sample新的噪声。
- epsilon greedy在同一个状态下,动作有时候是随机的
- Noisy Net 只是参数上有噪声,看到同样或者相似的状态,会采取同样的探索方式。比较符合真实情况
Distributional Q-function
根据定义 Q π ( s , a ) Q^π(s, a) Qπ(s,a)其实Q值的分布的期望值,但是相同的期望值其实背后的分布可能是不一样的。因此若可以直接输出分布的话肯定有更多的信息可以利用。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-deFY2z2j-1631874540337)(https://datawhalechina.github.io/easy-rl/chapter7/img/7.12.png)]
虽然选取动作的时候我们还是根据平均值最大的动作去执行,但是像上图我们知道每个动作的Q值分布时,若两个较大的动作的平均值是差不多的,但是对于方差很大的动作,可能会觉得选它的风险很大,倾向于选择方差更小的。
Rainbow
把所有的方法结合起来。

上述方法它们本身之间是没有冲突的,所以全部都用上去就变成七彩的一个方法,就叫做 rainbow,然后它很高。
发现拿掉dueling差了一点,拿掉double的方法没什么差。
Q:为什么拿掉double没差?
A:因为加了distributional DQN的时候,就不会高估reward,并且发现反而会被低估,因为distributional DQN输出的是一个分布的范围,范围不可能是无限宽的,比如只是从-10~10,所以超过这个范围的Q值就被忽略了。