| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 强化学习笔记【7】DQN进阶技巧 -> 正文阅读 |
|
[人工智能]强化学习笔记【7】DQN进阶技巧 |
该系列主要是听李宏毅老师的《深度强化学习》过程中记下的一些听课心得,除了李宏毅老师的强化学习课程之外,为保证内容的完整性,我还参考了一些其他的课程,包括周博磊老师的《强化学习纲要》、李科浇老师的《百度强化学习》以及多个强化学习的经典资料作为补充。 笔记【4】到笔记【11】为李宏毅《深度强化学习》的部分; 本章介绍了在DQN基础上所做的六点改进:
正常情况下的DQN算出来的Q值往往比实际值高,这是因为网络一直是挑选Q值最大的动作作为策略,而一个动作对应的Q值难免会被高估,进而你又总是选择这个被高估的动作,因此导致最终学习出的网络估测出的Q值偏高。 为了解决这个问题,提出Double DQN:设置两个DQN,一个用来选择出Q值最大对应的动作,而另一个用来专门计算该动作对应的Q值。这样一来,第一个网络高估了也没关系,因为不是用它来计算Q值,只要第二个网络没有高估即可,那么最终预估的Q值就不会一直偏高。 在实现上,你有两个Q-network:目标Q-network和你会更新的Q-network。所以在 Double DQN 里面,你会拿你会更新参数的那个 Q-network 去选动作,然后你拿目标网络(固定住不动的网络)去算值。 Double DQN 相较于原来的 DQN 的更改是最少的,它几乎没有增加任何的运算量,连新的网络都不用,因为原来就有两个网络了。你唯一要做的事情只有,本来你在找Q值最大的a的时候,你是用目标网络来算,现在改成用另外一个会更新的Q-network 来算。
?图1. Dueling DQN相对于DQN所做的改动 Dueling DQN相对于DQN所做的改动仅仅是改变了一下网络结构:将原来的DQN的计算过程分为两个path。对于第一个path,会计算一个与input state有关的一个标量V(s);对于第二个path,会计算出一个vector A(s,a),其对应每一个action。最后的网络是将两个path的结果相加,得到我们最终需要的Q value。用一个公式表示也就是:Q(s,a)=V(s)+A(s,a)? 这么做的好处就是,你不需要把所有的 state-action pair 都 sample 过,你可以用比较高效的方式去估计 Q 值出来。因为有时候你更新的时候,可能只更新了?V(s),但更新?V(s)的时候,由于Q(s,a)=V(s)+A(s,a),所以只要一改所有的Q值就会跟着改。这是一个比较有效率的方法,去使用你的数据,这个是 Dueling DQN 可以带给我们的好处。 当然,为了避免网络将V置为0,然后只学习A来当作最终的Q,我们会给A添加相应的约束。比如将A归一化,将所有A的值求和取平均得到A*,然后用A-A*作为实际使用的“A”,这样就避免了网络将V一直设为0。
这个方法是为了解决我们在chapter6中提出的Experience Replay(经验回放)方法不足进一步优化提出的。我们在使用经验回放时是随机取出的experience buffer中的采样数据,这里并没有考虑数据间的权重大小。例如,我们应该将那些训练效果不好的data对应的权重加大,即其应该有更大的概率被采样到。因此,prioritized experience replay 不仅改变了sample data的 distribution,还改变了training process。 MC 跟 TD 的方法各自有各自的优劣,怎么在 MC 跟 TD 里面取得一个平衡呢?我们的做法是,在TD里面,在某一个状态st?采取某一个动作at?得到rt?,接下来跳到状态st+1?。但是我们可以不要只存一个步骤的数据,我们存 N 个步骤的数据。 这样的话,learning的时候,Q‘所计算的不是st+1?,而是st+N+1?的。你会把N个步骤以后的状态丢进来,去计算N个步骤以后,你会得到的reward。要算目标值的话,要再加上多步(multi-step)的reward,多步的reward是从时间 t一直到t+N的N个reward的和。然后希望你的Q(st?,at?)和目标值越接近越好。说白了,这个是n-step TD。
为了改进探索,之前我们使用Epsilon Greedy 等探索方式在动作空间上面加噪声,但是有一个更好的方法叫做Noisy Net,它是在参数空间上面加噪声。 其在每一个episode 开始的时候,即要和环境互动的时候,将原来的Q-function 的每一个参数上面加上一个Gaussian noise。那你就把原来的Q-function 变成Q’,即Noisy Q-function。同样的我们把每个network的权重等参数都加上一个Gaussian noise,就得到一个新的network??。我们会使用这个新的network从与环境互动开始到互动结束。 这两者有什么样本质上的差异呢?在原来 sample 的方法,比如说 Epsilon Greedy里面,就算是给同样的状态,你的 agent 采取的动作也不一定是一样的。因为你是用sample决定的,给定同一个状态,要根据Q-function的网络,你会得到一个动作,你sample到random,你会采取另外一个动作。所以给定同样的状态,如果你今天是用 Epsilon Greedy 的方法,它得到的动作是不一样的。但实际策略并不是这样运作的啊。在一个真实世界的策略,给同样的状态,他应该会有同样的回应。而不是给同样的状态,它其实有时候吃 Q-function,然后有时候又是随机的,所以这是一个不正常的动作,是在真实的情况下不会出现的动作。但是如果你是在Q-function上面去加噪声的话,就不会有这个情形。因为如果你今天在Q-function上加噪声,在Q-function的网络的参数上加噪声,那在整个互动的过程中,在同一个episode里面,它的网络的参数总是固定的,所以看到同样的状态,或是相似的状态,就会采取同样的动作,那这个是比较正常的。这个叫做state-dependent exploration,也就是说你虽然会做探索这件事, 但是你的探索是跟状态有关系的,看到同样的状态,你就会采取同样的探索的方式,而noisy的动作只是随机乱试。但如果你是在参数下加噪声,那在同一个 episode 里面,里面你的参数是固定的。那你就是有系统地在尝试,每次会试说,在某一个状态,我都向左试试看。然后再下一次在玩这个同样游戏的时候,看到同样的状态,你就说我再向右试试看,你是有系统地在探索这个环境。 Distributional Q-function是说,以往我们都是直接求奖励的期望值,该期望值是由奖励的分布得到的,但是我们并没有得到这个分布,而是直接求了期望。但是如果两个分布不同,其期望的结果也可能是相同的,所以说,只求期望而忽略分布的这种方式会造成信息的丢失。因此,Distributional Q-function就是可以求出这个分布的一种方法。 但是具体的方法实现起来比较复杂,我们这里不再详细说明。你只要知道有办法输出一个分布就对了。我们可以不只是估测得到的期望reward平均值的值,我们其实是可以估测一个分布的。
也就是将我们这两章内容所有的七个tips综合起来的方法,将DQN也算作一种方法,那么7个方法分别包括:DQN、DDQN、Prioritized DDQN、Dueling DDQN、A3C、Distributional DQN、Noisy DQN,进而考察每一个方法的贡献度或者是否对于与环境的交互式正反馈的。 图2. Rainbow 图2中左图为各种方法以及综合的Rainbow方法使用效果,可以看出综合的Rainbow方法使用效果最好;右图是综合的Rainbow方法以及分别去掉一种方法的使用效果。 ? ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/17 22:25:25- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |