Q-learning的进阶版算法

本文详细介绍了DQN算法及其改进版DoubleDQN和DuelingDQN,强调了它们在解决Q-value高估问题上的策略。此外,还探讨了优先回放(Prioritized Experience Replay)、N步bootstraping、NoisyNet和DistributionalQ-function等增强学习技术,以提高训练效率和稳定性。最后,提到了Rainbow算法,它是这些技术的综合应用,显著提升了训练效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Double DQN(DDQN)

DQN的Q-value往往是被高估的,如下图
在这里插入图片描述
上图为四个游戏的训练结果的对比。

橙色的曲线代表DQN估测的Q-value,橙色的直线代表DQN训练出来的policy实际中获得的Q-value

蓝色的曲线代表Double DQN估测的Q-value,蓝色的直线代表Double DQN训练出来的policy实际中获得的Q-value

由图可以看出两点:

1.从橙色的曲线和橙色的直线可以看出,DQN估测出来的Q-value,往往会高于实际中的Q-value
2.从橙色的直线和蓝色的直线可以看出,Double DQN训练出来的policy,一般会好过DQN训练出来的policy

在这里插入图片描述
从Q-function的概念可以得出, Q ( s t , a t ) Q(s_t,a_t) Q(st,at)的结果会接近于。但是 m a x Q ( s t + 1 , a ) maxQ(s_{t+1},a) maxQ(st+1,a)往往容易会得到高估的结果,以下图为例子:
在这里插入图片描述
4个柱子代表4个action得到的Q-value,实际上都是相同的;右图绿色的部分表示高估的部分。

因为Q-function本身就是一个network,估测出来的值本身是有误差的,所以原本4个action都相等的Q-value就变成右图的样子。而因为 m a x Q ( s t + 1 , a ) maxQ(s_{t+1},a) maxQ(st+1,a),所以又往往会选择Q-value最大的那个结果。所以就会导致 Q ( s t + 1 , a t ) = r t + m a x Q ( s t + 1 , a ) Q(s_{t+1},a_t) = r_t + maxQ(s_{t+1},a) Q(st+1,at)=rt+maxQ(st+1,a)的结果总是偏大。
在这里插入图片描述
在Double DQN的右边中,决定采取Q-value最大的action,然后由算出Q-value。

好处:

即便Q过估计了某个值,只要Q^'没有高估,最后的结果还是正常的
即便Q^'过估计了某个值,只要Q没有选到那个action,最后的结果还是正常的
Q^'可以采用Target network去算Q-value,这样就不用训练额外的network。

Dueling DQN

Dueling DQN做得唯一一件事就是改network的架构 。
如下图,上半部分为DQN,下半部分为Dueling DQN。
在这里插入图片描述
Dueling DQN中,输出结果变成 Q ( s , a ) = A ( s , a ) + V ( s ) Q(s,a) = A(s,a) + V(s) Q(s,a)=A(s,a)+V(s),因为有时候在某种state,无论做什么动作,对下一个state都没有多大的影响,所以将Q-function分解为两部分。比如,在一个好的state,无论做什么action,都能得到很高的value;在一个很差的state,无论做什么action,都只会得到一个很低的value。

举个例子:
在这里插入图片描述
上表中, Q ( s , a ) = A ( s , a ) + V ( s ) Q(s,a) = A(s,a) + V(s) Q(s,a)=A(s,a)+V(s)

初始状态为左图所示。假设现在我们sample到新的Q-value Q ( s 2 , a 1 ) , Q ( s 2 , a 2 ) Q(s_2,a_1),Q(s_2,a_2) Q(s2,a1)Q(s2,a2)如中间图所示。这时network可以选择不更新 A ( s 2 , a 1 ) A(s_2,a_1) A(s2,a1) A ( s 2 , a 2 ) A(s_2,a_2) A(s2,a2),而去更新 V ( s 2 ) V(s_2) V(s2),如中间图所示。

更新完 V ( s 2 ) V(s_2) V(s2)后,可以看到 Q ( s 2 , a 3 ) Q(s_2,a_3) Q(s2,a3)也跟着被更新了。这样的好处是,原本只sample到 Q ( s 2 , a 1 ) , Q ( s 2 , a 2 ) Q(s_2,a_1),Q(s_2,a_2) Q(s2,a1)Q(s2,a2)的更新,但是由于 V ( s 2 ) V(s_2) V(s2)被更新,就使得 Q ( s 2 , a 3 ) Q(s_2,a_3) Q(s2,a3)也同样被更新,即便 Q ( s 2 , a 3 ) Q(s_2,a_3) Q(s2,a3)没有在实际中被sample到。这样实现比较有效率地使用数据,加速训练。

(那 Q ( s 2 , a 3 ) Q(s_2,a_3) Q(s2,a3)没有被sample到,然后也跟着更新会不会造成错误的结果呢?答案是不会,因为根据sample到的data,在s2无论采取 a 1 a_1 a1 a 2 a_2 a2都会使得 Q ( s 2 , a 1 ) , Q ( s 2 , a 2 ) Q(s_2,a_1),Q(s_2,a_2) Q(s2,a1)Q(s2,a2)进一步上升,所以可以把s2看成是一个好的state,无论采取什么action,都会得到好的结果)

为了防止network把V(s)直接调成0,然后导致 Q ( s , a ) = A ( s , a ) Q(s,a) = A(s,a) Q(s,a)=A(s,a),这样Dueling DQN和普通的DQN就没区别了,所以需要对 A ( s , a ) A(s,a) A(s,a)做一下限制。这样对 A ( s , a ) A(s,a) A(s,a)进行参数更新比较麻烦,network就会倾向于对V(s)进行参数更新。

具体来说,所加的限制可以是:强制A(s,a)的每一列的和都为0,如上图所示。

加上这个限制后,按照刚才的例子,如果 Q ( s 2 , a ) Q(s_2,a) Q(s2,a)这一列都加1,network如果不去调 V ( s 2 ) V(s_2) V(s2)而去调 A ( s 2 , a ) A(s_2,a) A(s2,a)的值都加1,就会导致最终 A ( s 2 , a ) A(s_2,a) A(s2,a)这一列的和不为0,没办法符合上述的限制。所以加上这个限制后就防止network只调 A ( s , a ) A(s,a) A(s,a)而不去调V(s)。

这时V(s)可以看成Q(s,a)每一列的平均值,推导如下:

Q ( s 1 , a 1 ) + Q ( s 1 , a 2 ) + Q ( s 1 , a 3 ) = V ( s 1 ) + A ( s 1 , a 1 ) + V ( s 1 ) + A ( s 1 , a 2 ) + V ( s 1 ) + A ( s 1 , a 3 ) = V ( s 1 ) + V ( s 1 ) + V ( s 1 ) + 0 Q(s_1,a_1) + Q(s_1,a_2) + Q(s_1,a_3) =V(s_1)+A(s_1,a_1) + V(s_1)+A(s_1,a_2) + V(s_1)+A(s_1,a_3) =V(s_1) +V(s_1)+ V(s_1) + 0 Q(s1,a1)+Q(s1,a2)+Q(s1,a3)=V(s1)+A(s1,a1)+V(s1)+A(s1,a2)+V(s1)+A(s1,a3)=V(s1)+V(s1)+V(s1)+0

下图展示了实际过程中,如何使 A ( s , a ) A(s,a) A(s,a)的每一列的和都为0:
在这里插入图片描述
上图V(s)的输出值为1,A(s,a)的输出值为{7,3,2}

为了使A(s,a)的每一列的和都为0,可以使A(s,a)的每个数减去对应所在列的平均数,即{7,3,2}变成{3,-1,-2},此为Normalization的过程。

优先回放(Prioritized Experience Replay)

之前在buffer中sample数据去训练network的时候,是无差别地sample每一笔数据,就是说没有偏向于sample哪些数据。

这样做的不足是有些:有时候因为sample到的某一笔训练数据质量不好,造成 Q ( s t , a t ) Q(s_t,a_t) Q(st,at)估测的值和 r t + Q ( s t + 1 , a t + 1 ) r_t + Q(s_{t+1},a_{t+1}) rt+Q(st+1,at+1)的差距比较大(即TD error)。如果接下去还是无差别地sample每一笔数据,就会导致这些TD error比较大的情况没有得到更多更好的训练,就会导致Q network 在有些情况估值不准确。
在这里插入图片描述

所以使用Prioritized Reply后,对于那些会造成TD error的情况,就会倾向于sample更多相关的数据来训练network,使得network克服这个TD error。(举个例子:A同学数学考99分,英语考30分,那他就应该买多点英语资料来学习,而不是数学英语仍然花同样的力气去学。)

N step bootstraping

MC是计算的在s_t之后直到episode结束的所有reward,TD是计算 s t 到 s t + 1 s_t到s_{t+1} stst+1的reward。

Multi-step这个方法结合了MC和TD各自的特点,将TD改为计算 s t 到 s t + n s_t到s_{t+n} stst+n,即由原来跳到下一个状态,改为跳到之后n个状态。特殊的,直接跳到episode结束则变为MC方法。
在这里插入图片描述
在之前的Q-function的训练中,从buffer中sample出 ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st,at,rt,st+1),左边Q network的输入为 s t , a t s_t,a_t stat,输出结果 Q ( s t , a t ) Q(s_t,a_t) Q(st,at),右边target network的输入为 s t + 1 s_{t+1} st+1 a t + 1 a_{t+1} at+1,输出结果 Q ( s t + 1 , a t + 1 ) Q(s_{t+1},a_{t+1}) Q(st+1,at+1)再加上 r t r_t rt,最终训练结果应该使这两个结果尽可能接近。

而使用Multi-step后,假设为N step,则应从buffer中sample出。左边左边Q network的输入为 s t , a t s_t,a_t stat,输出结果 Q ( s t , a t ) Q(s_t,a_t) Q(st,at),右边target network的输入为 s t + N + 1 s_{t+N+1} st+N+1 a t + N + 1 a_{t+N+1} at+N+1,输出结果 Q ( s t + N + 1 , a t + N + 1 ) Q(s_{t+N+1},a_{t+N+1}) Q(st+N+1,at+N+1)再加上从t到t+N的所有reward的总和。

Noisy Net

在这里插入图片描述
这个技术是为了改进exploration的。之前的exploration(epsilon greedy)是在action上做noise。而Noisy Net是在Q-function的参数上做noise。

注意:在每一个episode开始前,对Q-function的参数添加noise,用这个添加了noise的network去玩游戏,直到episode结束,才可以重新添加新的noise。

在这里插入图片描述
在action上加noise,即epsilon-greedy,就算给出同一个state s,也会做出不同的action,可能是按照Q-function的结果,也可能是以random得到的结果。这不符合实际的情况,因为实际上我们希望给出同一个state,都会做出同样的action。

而在Q-function的参数上加noise,因为在这个方法规定了只在一个episode开始前添加noise,不会在episode中途再增加noise,所以在episode中遇到同一个state都会做出同样的action。所以它是比较有系统地进行exploration。比如在一个episode中,遇到状态 s t s_t st都采取“向右”的action,在另一个episode遇到状态 s t s_t st都采取“向左”的action。

Distributional Q-function

在这里插入图片描述
使用同一policy的actor在同一个state采取同一个action,得到的cumulated reward是不同的,因为后续state是具有随机性的。如果对它进行统计,会发现它是会呈现一个分布(distribution)。而Q-value就是这些分布取mean的结果。

这样做有一个不足就是:即便mean相同,但是可能实际的分布是完全不同的。然而因为Q-function只输出Q-value(即分布的mean),所以我们看不到实际的分布。

所以Distributional Q-function就是为了能够实现从输出Q-value变成输出Q-function的分布。
在这里插入图片描述
左边为Q-function,右边为Distributional Q-function。

三种颜色代表三种action

同一颜色不同柱子代表在同一state下采取同一action产生的reward落在分布里的几率,具体来说,在绿色柱子里,5个柱子的X轴代表5种不同reward,Y轴代表在某一state采取某一action得到的reward落在此处的几率。

Distributional Q-function的好处:有了具体的分布,我们不仅可以从中挑选一个mean最大的动作之后(其实这一步不用Distributional Q-function也能做),还能进一步考虑哪个分布的方差最小,进一步降低不稳定的可能性。

Rainbow

在这里插入图片描述
这种就是把前面所有的方法全部运用在一起,可以看到最终效果还是很不错的。

其中,文章前面讲到的Multi-step可以看A3C当做参考,因为A3C中就有运用到 Multi-step 的技术。
在这里插入图片描述
这张图讲的是,在上面的Rainbow拿掉某一种技术后导致分数降低多少(比如绿色的线就是拿掉Dueling DQN技术)。

其中拿掉Double DQN后没有产生影响,是因为有使用Distribution Q-function的时候,一般就克服了DQN过估计(over estimate)reward的问题(而这正是Double DQN想解决的问题),甚至会出现略微低估(under estimate)reward的情况,所以使用Double DQN的效果就没有那么大。Distribution Q-function之所以能解决过估计,是因为Distribution Q-function的输出是一个分布,而这个分布的X轴(即reward大小)是有一个区间的,假设这个区间是[-10,10],而这时过估计的reward为100,超出这个区间,就没有被记录到,所以就不会有过估计(over estimate)的情况发生。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值