DQN的一些变体(改进)总结,如:Double DQN、Prioritized Experience Replay DQN等

王者荣耀最早也是基于DQN来实现智能体,后来改成PPO

引入Double DQN的前言

DQN总共有两个网络,一个是实时更新的评估网络,一个是阶段性更新的目标网络
目标Q值(即下个时刻的累积价值)的计算主要依赖目标网络,通过传入下个状态S(t+1),来获取S(t+1)状态下最大的Q值以及对应的动作,从而完成Q函数的更新
但是无论是DQN还是QLearning,在计算价值函数的时候都采用了贪心策略,即每次都对(状态-动作)的实际价值进行了过高的估计,最终会影响到我们最后的决策
因此引入Double DQN,通过解耦目标Q值动作的选择和目标Q值的计算,来消除过估计的问题

Double DQN具体介绍

目标Q值的计算不再单纯依赖目标网络,而是先通过评估网络获取S(t+1)状态下最大的Q值对应的动作A,再从目标网络中获取S(t+1)状态下动作A对应的Q值,来进行Q函数的更新。因为S(t+1)和A出自两个互不相关的网络,因此估计出来的目标Q值可能大于实际目标Q值,也可能小于实际目标Q值,从而实现消除过估计问题
但是,目标网络的更新实际上是阶段性从评估网络中获取参数实现的,所以两个网络并不是真的互不相关,所以Double DQN只是减缓了过估计的问题,并没真的实际解决这个问题,但是它确实在一定程度上提高了最终决策的准确性。

引入Prioritized Experience Replay DQN的前言

DQN构造了一个记忆库来存储过去的经验,通过经验回放来进行采样,进而实现目标Q值的计算,记忆库有两个特点:
1.随机抽取,用来移除数据之间的相关性,保证训练样本分布的均匀
2.滚动更新,用最新的记忆替换最老的记忆,从而保证记忆库不会溢出
这里有一个问题,经验是有重要度的,有的成功经验比平时经验重要,于是就有了PER(优先经验回放) DQN

这个成功经验感觉可以用在我想做的欺骗防御那里,防御成功的经验肯定更有用

Prioritized Experience Replay DQN具体介绍

DQN的时候,我们存储在记忆库里面的内容只有(当前状态,执行的动作,下个时刻的状态,即时奖励),PER DQN在此基础上添加了一个优先级信息,即:(当前状态,执行的动作,下个时刻的状态,即时奖励)-优先级,主要改造三个地方:
1.存储的时候,通过策略(比如设置成记忆库里面所有优先级的最大值,代表最新的经验一开始是最重要),算出这个状态转移过程的优先级,存储进记忆库;
2.采样的时候,根据优先级策略按照一定的概率(优先级越大,被取出的概率也越大)把对应的状态转移过程取出来进行计算,同时根据优先级计算出损失函数权重参与损失函数的计算;
3.更新评估网络的时候,利用|Q目标-Q评估|,即评估和目标差值的绝对值来计算出对应状态转移过程的优先级(绝对值越大,优先级越高),用新的优先级更新记忆库中旧的优先级。

PER同样适用于DDQN,可以有PER DDQN

引入sumtree数据结构的前言

一个强大的记忆库可以让PER DQN更加强大,强大的标准有两个:
1.可以根据优先级策略把对应的经验取出来
2.存储查询过程要足够快
所谓的优先级策略就是经验的优先级越大,被取出的概率也越大,正常逻辑下我们要实现这个策略至少要把记忆库遍历一遍,也就是时间复杂度要达到O(n),这不满足第二个要求,因此引入sumtree数据结构,sumtree是一棵二叉树,父节点的数值等于两个子节点数值之和,它的检索时间复杂度只需要O(logn)

sumtree数据结构具体介绍

具体实现流程如下:
1.叶子节点存储优先级信息,对应的经验数据存储在另一个容器中,数据索引=树形索引-叶子节点个数+1
2.存储的时候,从左到右存储,每次存储更新父节点信息
3.查询的时候,假设我们要抽取一个数据s
3.1.以根节点为父节点,先比较左子节点
3.2.如果左子节点大于等于s,以左子节点为新的父节点,继续遍历
3.3.如果左子节点小于s,以右子节点为新的父节点,继续遍历
3.4.直到遍历到叶子节点,叶子节点的数值就是优先级,数据索引=该叶子节点的树形索引-叶子节点个数+1

引入Duiling DQN的前言

无论是QLearning、DQN、DDQN、PER DQN,他们的核心都是Q值的计算,我们对Q值的定义是在某个状态执行某个动作转移到下一个状态所获得的累积收益,从定义来看,Q值是由两部分组成的,一部分是状态转移产生的,一部分是执行动作产生的,之前我们一般都是直接计算Q值,那么,分开计算会不会更准确一些?这个思路就诞生了Duiling DQN算法,用公式表示也就是Q=V+A

Duiling DQN具体介绍

给定Q的前提下,我们无法找到对应的A和V,举个例子,假如Q=[11,12,13,14,15],那么V和A可以有很多种组合:
V=11,A=[0,1,2,3,4,];
V=10,A=[1,2,3,4,5];
等等;
因此实际计算中,我们会对A进行z-score归一化操作,即A=(A-A.mean()),以上面那个例子来看,A=[-2,-1,0,1,2],那么V=13。

从具体实现上来看,Duiling DQN只是对DQN的神经网络进行了修改,并没有对整体的算法逻辑进行修改,因此可以无缝对接DQN、DDQN、PER DQN等
比如Duiling DDQN

引入Multi-Step DQN的前言

DQN的时候,我们是每执行一步,就记录下这一步的状态转移过程(当前状态,执行的动作,下一个状态,即时奖励),然后神经网络也是一步一步的学,有点像走路,走一步学一步,这样是不是有点慢,那么我们能不能走n步后,把状态转移过程进行累加

Multi-Step DQN具体介绍

要改动的地方有两个:
1.存储的时候,状态转移过程先进入一个n_step大小的小型缓存队列,然后再把这个小型缓存队列里面的n个状态转移过程合并成一个状态转移过程,存储进记忆库,合并逻辑如下:
1.1.假设n_step=2,折扣系数=gamma
1.2.我们现在有以下过程:S1-A1->S2-A2->S3,产生两个状态转移过程:[S1,A1,S2,R2],[S2,A2,S3,R3]
1.3.将它们合并成一个状态转移过程:[S1,A1,S3,R2+gamma*R3],相当于直接从S1执行动作A1后跳到S3,然后即时奖励打折后进行累加
2.计算损失函数的时候,折扣系数要取n_step次方(因为每转移一次要乘以一个折扣系数)
当n等于1的时候, Multi-Step DQN就退化成了DQN

变种优化算法总结

1.DQN,利用神经网络来对价值函数进行近似表示,从而解决了QLearning采用Q-Table计算价值函数导致的维度爆炸问题,同时引入记忆库,使神经网络能够从过去的经验中进行学习
2.Double DQN,通过解耦目标Q值动作的选择和目标Q值的计算,来消除DQN的过估计的问题,即目标Q值最大动作的选择不再依赖目标网络,而是先通过评估网络获取S(t+1)状态下最大的Q值对应的动作A,再从目标网络中获取S(t+1)状态下动作A对应的Q值,来进行Q函数的更新
3.Prioritized Experience Replay DQN, 记忆库中的每一条经验都被赋予优先级,该优先级与Q目标和Q评估的差值的绝对值呈正相关,即绝对值越大,优先级越高,采样的时候,经验的优先级越大,被取出的概率也越大
4.Duiling DQN,将Q值的计算分成两个部分,一部分是状态转移产生的,一部分是执行动作产生的,即Q=V+(A-A.mean()), 这样能够更好的关注在某一状态下选择不同动作所带来的差异
5.Multi-step DQN,将n个单步的经验进行累加,变成一个,再利用累加后的经验进行学习,从而加速学习的过程(要注意n的选择)
除此之外,还有:
6.Noisy DQN,与其他DQN算法通过随机贪婪策略来增加探索能力不同,Noisy DQN直接在神经网络中添加噪声,从而增加探索能力
7.Distribution DQN,与其他DQN算法不同的是,其神经网络输出的Q值不再是一个确定的值,而是一个分布,目标函数也相应变成Q值分布间的差异最小化

Rainbow是将上述七种算法进行灵活组合

学习记录–引用自学长的微信朋友圈笔记加上自己的理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值