强化学习的学习之路(二十一)_2021-01-21: Dueling DQN(Dueling networkarchitectures for deep reinforcement learning)

作为一个新手,写这个强化学习-基础知识专栏是想和大家分享一下自己学习强化学习的学习历程,希望对大家能有所帮助。这个系列后面会不断更新,希望自己在2021年能保证平均每日一更的更新速度,主要是介绍强化学习的基础知识,后面也会更新强化学习的论文阅读专栏。本来是想每一篇多更新一点内容的,后面发现大家上CSDN主要是来提问的,就把很多拆分开来了(而且这样每天任务量也小一点哈哈哈哈偷懒大法)。但是我还是希望知识点能成系统,所以我在目录里面都好按章节系统地写的,而且在github上写成了书籍的形式,如果大家觉得有帮助,希望从头看的话欢迎关注我的github啊,谢谢大家!另外我还会分享深度学习-基础知识专栏以及深度学习-论文阅读专栏,很早以前就和小伙伴们花了很多精力写的,如果有对深度学习感兴趣的小伙伴也欢迎大家关注啊。大家一起互相学习啊!可能会有很多错漏,希望大家批评指正!不要高估一年的努力,也不要低估十年的积累,与君共勉!


接下来的几个博客将会分享以下有关DQN算法及其改进,包括DQN(Nature)、Double DQN、 Multi-step DQN、Pirority Replay Buffer、 Dueling DQN、DQN from Demonstrations、Distributional DQN、Noisy DQN、Q-learning with continuous actions、Rainbow、Practical tips for DQN等。

Dueling DQN

Dueling DQN 是一种基于 DQN 的改进算法,它的主要突破点在于利用模型结构 将值函数表示成更细致的形式,这使得模型能够拥有更好的表现。它来自论文 Dueling network architectures for deep reinforcement learning 。接下来,我们就来看看它的改进 形式。
经过前面的介绍,我们可以给出这个公式并定义一个新的变量:
q ( s t , a t ) = v ( s t ) + A ( s t , a t ) q\left(s_{t}, \boldsymbol{a}_{t}\right)=v\left(\boldsymbol{s}_{t}\right)+A\left(\boldsymbol{s}_{t}, \boldsymbol{a}_{t}\right) q(st,at)=v(st)+A(st,at)
也就是说,基于状态和行动的值函数 q(以下简称为 q q q ) 可以分解成基于状态的值 函数 v v v (以下简称为 v v v ) 和优势函数(Advantage Function )A(以下简称为 A A A )。由于存 在
E a t [ q ( s t , a t ) ] = v ( s t ) E_{a_{t}}\left[q\left(s_{t}, a_{t}\right)\right]=v\left(s_{t}\right) Eat[q(st,at)]=v(st)
所以如果所有状态行动的值尼数不相同,一些状态行动的价值 q ( s , a ) q(s, a) q(s,a) 必然会高于状态的价值 v ( s ) , v(s), v(s), 当然也会有一些状态行动对低于价值,于是优势函数可以表示出当前行动和平均表现之间的区别:如果优于平均表现,那么优势函数为正; 反之则为负。

于是我们在保持网络主体结构不变的基础上,将原本网络中的单一输出变成两路输出,一个输出用于输出 v , v, v, 它是一个一维的标量,另一个输出用于输出 A,它的维度和行动数量相同。

最后将两部分的输出加起来,就是原本的 q 值。改变输出结构 后,我们只需要对模型做很少的改变即可实现功能:模型前面的部分可以保持不变,模 型后面的部分从一路输出改变为两路输出,最后再合并成一个结果。模型结构的改变如下图所示:

image-20210225161554991

我们还需要对这两部分的输 出做一定的限制。如果我们不对这两个输出做限制,那么当 q q q 值一定时, v v v a a a 有无穷种可行组合,而实际上只有很小一部分的组合是合乎情理、接近真实数值的。为了解决这个问题,我们可以对 A 函数做限定。我们知道 A 函数的期望值为 0:
E a [ A ( s t , a t ) ] = E a [ q ( s t , a t ) − v ( s t ) ] = v ( s t ) − v ( s t ) = 0 \begin{aligned} E_{a}\left[A\left(s_{t}, a_{t}\right)\right] &=E_{a}\left[q\left(s_{t}, a_{t}\right)-v\left(s_{t}\right)\right] \\ &=v\left(s_{t}\right)-v\left(s_{t}\right) \\ &=0 \end{aligned} Ea[A(st,at)]=Ea[q(st,at)v(st)]=v(st)v(st)=0
就可以对输出的 A 值进行约束,例如将公式变成
q ( s t , a t ) = v ( s t ) + ( A ( s t , a t ) − 1 ∣ A ∣ ∑ a ′ A ( s t , a t ′ ) ) q\left(s_{t}, a_{t}\right)=v\left(s_{t}\right)+\left(A\left(s_{t}, a_{t}\right)-\frac{1}{|A|} \sum_{a^{\prime}} A\left(s_{t}, a_{t}^{\prime}\right)\right) q(st,at)=v(st)+(A(st,at)A1aA(st,at))
让每一个 A 值减去当前状态下所有 A 值的平均数,就可以保证前面提到的期望值 为 0 的约束,从而增加了 v v v A A A 的输出稳定性。

进行这样的输出分解有什么好处呢?

首先, 通过这样的分解,我们不但可以得到给定状态和行动的 q 值,还可以同时得到 v v v 值和 A A A 值。这样如果在某些场景需要使用 V 值时,我们同样可以获得 v 值而不用再训练一个网络。

同时,通过显式地给出 v 函数的 输出值,每一次更新时,我们都会显式地更新 v 函数。这样 V V V 函数的更新频率就会得到确定性的增加

其次,从网络训练的角度来看,我们从原本需要训练 |A| 个取值为 [0, ∞ \infty ] 的数值 变成了训练一个取值为 [ 0 , ∞ ] [0, \infty] [0,] 的数值,和 ∣ A ∣ |A| A 个均值为 0,实际取值为 [ − C , C ] [-C, C] [C,C] 的数值, 对网络训练来说,后者显然是更友好且容易的

同时,对一些强化学习的问题来说,A值的取值范围远比 v 值小,这样将两者分开训练更容易保持行动之间的排列顺序。

由于我们需要从所有的行动中挑选出价值最高的行动,因此不同行动之间的价值需要保持一定的区分度。由于 A 值的数值范围比较小,因此它对模型更新更敏感,这样模型在更新时会更容易考量与其他行动的相对变化量,也就不会因为某一次的更新使得原本的行动排序被意外打破。如果采用 q 值进行更新,由于 q 值相对于 A 值可能会很大,因此 q 值对微小的更新不敏感,某一次的更新可能会影响行动的原本排序,从而对策略造成一定的波动。

将值函数分解后,每一部分的结果都具有实际的意义,我们也可以从中挖掘出很多有价值的信息。从论文中给出的实验效果图可以看出,将模型分为 A A A 函数和 v v v 函数后,两个函数会展示出不同的特点。通过反卷积操作得到两个函数值对原始图像输入的梯度后,可以发现V函数对游戏中的所有关键信息都十分敏感,而A函数只对和行动相关的信息敏感。

上一篇:强化学习的学习之路(二十)_2021-01-20:Priority Replay Buffer

下一篇:强化学习的学习之路(二十二)_2021-01-22:DQN from Demonstrations(DQfD解决DQN冷启动问题)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值