2. 关于DRL的一些经验
转自知乎专栏, 原文 深度强化学习落地方法论 https://zhuanlan.zhihu.com/p/95989190
需求分析
这里作者强主要强调DRL并不是万能的解药
弱点(过拟合与环境和泛化能力弱)。作者单独强调这俩是想和监督学习做对比。监督学习是在training set上训练test set上测试,但是强化学习是在真正环境中也就是test set上训练继而把自己好的经验都保留下来。这样就导致DRL是很依赖于环境的,一方面为了训练得足够多的数据,这也就依赖于模拟器;另一方面一旦环境发生变化,得重新训练。作者把这一现象描述为value function过拟合于环境,policy function过拟合于value function.
适用场景:作者给出了适用DRL的五个条件
场景固定:这里所谓的场景,是非agent之外的所有环境dynamics一定要是stationary的. 比如在multi-agent RL (MARL) 中, 其他agent的不断演化就属于非稳态环境。
目标明确:这个一般问题的目标都是确定了的,目标越明确,reward越好design
数据廉价:这个很好理解,因为具体环境中的learning需要大量的data
过程复杂:实际环境的规律难以总结或者很难找到解决方法才有学习的必要
自由度高:选择空间越大,自由度越高,人越容易出现选择困难症,但是这对DRL却是极好的。
算法选择
本节作者主要highlight了三种最基本的框架,一般在这三重大的框架下我们还要进行微调。
总的来说,DRL是一种由exploration慢慢转化为exploitation的算法,充分的探索对学习性能的影响至关重要,各种exploration的设计本文没有提及
DQN:DQN一般大家都很熟悉了,就是一个Q值网络由状态学习到各个action的values再选最大的。几个需要注意的特性:1)离散状态空间;2)off-policy当前用于学习的经验并不一定是当前policy采集的;3)epsilon greedy exploration。DQN也有很多问题,其中一个我想重复的是:off-policy对历史数据重复利用但是环境不能变化。比如MARL中off policy效果就不是很好,因为各个agent都在不断进化。
DDPG(soft actor critic?):DQN是离散action space,DDPG可以用在连续action space,它的主要特征是:1)与DQN相比有了一个显式的policy,而且这个policy是确定性,而非传统 actor-critic 中概率分布式的policy;2)action + noise to explore. DDPG也有一些问题,我们强调1)连续动作一般比离散动作要难,所以离散化连续空间也许比连续动作空间学习的更好;2)高维度action表现不好,维度灾难;3)critic的误差全部传给了actor,稳定性不足。
A3C (→同步版本A2C):这是作者着力推荐的框架, 与DDPG相比actor输出的是action的概率分布,因此梯度无法直接由critic流向actor, instead梯度定义为advantage function和actor梯度的乘积A(s,a)▽logπ(a|s) (这里得复习一下A3C+PPO以回顾具体算法流程)。它是一种on-policy方法,即每次训练policy net的经验都是由当前policy net产生的,更适用于MARL场景。总之,作者根据自己的经验最推荐A3C+PPO或者其同步版本A2C+PPO的组合,说比DQN和DDPG都要好。
动作空间
动作空间的选择一般比较简单,一般这个是由具体问题直接决定的,几个注意事项:
尽量选择离散空间(互斥,可穷举,表示成one-hot vector );注意离散化并不是代表着性能差,反而还会因为容易学习带来性能提升!
one-hot vector
如果实在无法离散化比如高维action,那么最好把action space归一化到 [-1,1].
特定状态下引起严重后果的action应该直接屏蔽。
状态空间
状态空间的优化非常重要,也就是所谓的feature engineering. 一般,用未经处理的状态空间做端到端学习效果是极差的,一方面时间成本,一方面干扰信息是致命的。所以说设计状态空间非常重要。
四步设计状态空间:
任务分析:本文举例在一个遍布障碍物的的区域内有若干小车在随机位置待命。目的是让他们最短时间内行驶到各自终点停下来,且过程中不发生任何碰撞。目标可以分解为1)到达终点;2)避免碰撞;3)最快。这三部分的要求分别对应着1)各个小车知道自己在哪终点在哪;2)知道障碍物和其他小车的位置运动状态;3)少绕路行驶速度快,尽量避免减速刹车。因此,我们第一步要总结出所有的可用的信息。
2.相关信息筛选:在列出所有可用信息之后,我们要去筛选与主任务和子任务相关的那些信息。RL中action的质量最终是要通过reward来反馈回来的,所以说实际上我们在学习的就是各个状态和reward/value之间的关系,进而利用这层关系来指导action。所以说状态的设计和reward的设计息息相关,我们要设计的让神经网络更快更好的学习到他俩之间的关系!可以想象,在某个状态下得到的reward反馈越快,那么这层关系越容易学习到。因此,给定reward的设计之后,我们可以根据反馈时间长短把信息分为两类
1) 直接相关信息:与某个reward直接相关的信息,比如距离周围障碍物的距离,这一信息直接影响着碰撞这一事件(假设碰撞引起很大的负reward),因此我们称其为直接相关信息。
2) 间接相关信息:间接相关信息指的是这一信息的反馈得很久很久之后才能得到。比如小车到达终点得先拿到钥匙开门,但是我们没有设置拿钥匙这一奖励。那么,距离钥匙远近这一信息就是间接相关信息,因为我们只有在打开了门最终到达终点才发现拿钥匙是必要条件。
Remark: 显然间接信息是可以转换为直接信息的,因为我们可以单独设计一个吃钥匙的奖励,所以说状态设计和reward设计是相关的。
Remark: 其实已经不言自明了,如果我们把状态设计为一幅地图让小车自己学习拿钥匙这个动作,肯定会比直接告诉他钥匙坐标来的慢,因此状态的设计直接影响到学习效率。统一性考虑:这一步是保证我们设计的状态有泛化性而不只是局限于某一场景
1)外在形式统一。比如说,如果我们把所有小车的数据都当做状态,那么当小车的个数变化时,这一状态就不可用了尼?所以这就属于bad design。好的design比如我们把整个地图当做一幅图,原本环境是一幅图,所有小车位置是一幅图,重点位置是一幅图,然后把图叠在一起。
2) 逻辑统一。比如说我们把小车当前位置和终点位置当做信息输入。那么神经网络会记住这张图和终点位置坐标,如果换一幅图就得重新学习。一个更好的设计是输入两个位置的差,这样的话神经网络看到的是终点在小车自身坐标系中的相对位置,如果换一幅图,那么学习到的内容勉强还能用。这样的policy就和具体地图脱钩了。再比如我们设计防撞机制,说距离障碍物低于一个阈值时就要减速,那么如果我们把当前距离和绝对距离阈值输入,那么换一个阈值就得重新学习,因此我们其实可以输入一个相对比例阈值,即当前还差多少就到了阈值该减速了。效果验证。在设计好状态空间后,我们需要验证自己设计的状态是不是合理。
1)模仿学习验证:如果我们已经有了一个比较好的baseline,那我们可以搭建一个policy net用自己设计的状态来验证输出结果是否接近baseline。
2)直接验证:没有baseline就直接把程序跑完把policy训练出来在比较好坏了。
3)缺省验证:我们如果已经train得到了一个比较好的policy,那么可以用缺省验证来比较状态中不同信息对policy的影响程度,即控制变量法,其他正常输入把待测试的信息取一个平均值看看train完之后的性能。
reward
DRL是极度依赖于优秀的reward的,因为我们要靠reward来不断诱导神经网络的学习。
- 怎么消除对reward的依赖尼?
- inverse RL 利用专家示范expert demonstration来学习到reward函数,在用这个reward函数训练RL策略.
- Imitation Learning, 抛开reward直接拟合expert的policy
- Reward很难设计时,用DL自动学习reward函数,比如在actor-critic框架下再加一个reward函数(state, action直接算reward), see this paper: Deep Reinforcement Learning from Human Preferences.
- 主线reward和稀疏回报问题
一般一个任务的主要任务是很容易理清楚的,所以主线reward是很好设计的。简单任务里我们只需要主线reward就够了,但是复杂的问题里通常情况下主线任务是很难难碰到的,比如说操控机器人打开盒子扔进去一个东西再拿出来再观赏盒子,这一操作的复杂程度使得机器人根本无法在主线任务上前进,因为大部分状态信息相对于主线reward也就都属于间接相关信息。这一类问题称为稀疏回报问题,解决这一问题的方案有很多比如通过鼓励agent探索未见过的状态,提高正样本利用率,或者干脆用遗传算法或进化策略代替RL学习policy网络。本文讨论的是,如何通过reward设计本身来规避稀疏回报问题,并尽可能提高训练效率和最终性能。
解决方案是,design引导信号来诱导agent学习,也叫 credit assignment。比如说,我们要求小车尽快到终点,可以加一些转弯处罚。一些经验:
1) 贪婪。实际上,除了主线reward应该提供正向奖励以外,其他辅助reward最好都设置为惩罚项。除非某个子目标与主线事件之间存在强关联,而且该子目标的达成是一次性的或者数量可控,否则不应轻易设置额外奖励项,因为这样很容易诱导agent学习到短视的贪婪策略,只捡芝麻,不要西瓜。
2) 胆怯。如果惩罚项很多且绝对值相对于主线reward太大,那么agent在探索过程中会收到大量负反馈,从而变得畏首畏尾,学习到各种意想不到的“绥靖”策略。此时,只需要将惩罚项绝对值减小,突出主线奖励的影响,还可以适当降低折扣因子,让agent变成“近视眼”,更多关注眼前利益,忽略长期的负收益期望(靠后的负反馈都被折扣掉了),只要agent“迈开腿”出来探索,就有更大可能遇到主线事件。
3)鲁莽: 某个不希望出现的事件的惩罚太小,比如小车可能为了尽快到达终点宁愿撞到其他小车上也不绕远。
3. Reward Shaping
一个让RL收敛更快的方法是reward shaping:在原有reward基础上增加一项shaping reward,该项代表某种势能函数,与最终目标的差距决定了势能大小。比如说把reward修改为离终点越近奖励越高,那么agent就很容易被引导到G位置,从而大大加速算法收敛。理论上,Ng证明了理想势能函数就是V(s)因为它就是长期收益的期望,policy就是根据它优化的。如果一开始就把完美的V(s)提供给小车,那也就不用学了。对小车到终点的应用而言,用小车当前位置与终点的距离作为势能函数,增加一个惩罚项 -alpha*dist ,离终点较远时惩罚得多一些,较近时惩罚得小一些,这样就能起到reward shaping的作用。
- Optimal Reward Problem(ORP),
另一个问题是,是否存在一组最优reward使得DRL算法在同等条件下收敛最快、性能最高?答案是肯定的,但要想找到它是困难的,该问题在学术界被称为ORP. 解决方案文中也列了一些。
总结一下,reward设计的原则是:尽可能稠密(最好每步都有反馈),能够反映任务目标/子目标逻辑,与状态空间相呼应,控制好各项取值和相对大小,避免异常行为,适时采用reward shaping。当算法选择好,动作空间定义好,状态空间和回报函数都设计好,接下来就该进入训练环节了
训练
在最后一节,作者介绍了DRL training的一些经验。
训练开始前:
最好可视化environment随着action的变化,因为这样可以直观发现问题。
状态空间归一化,reward scaling and clipping r=
2. 关于DRL的一些经验相关推荐
- 《强化学习周刊》第59期:GCRL、DNN-RCUCPD-MORL
No.59 智源社区 强化学习组 强 化 学 习 研究 观点 资源 活动 周刊订阅 告诉大家一个好消息,<强化学习周刊>已经开启"订阅功能",以后我们会向您自动推送最 ...
- 《强化学习周刊》第38期:DreamingV2、Shadow-price DRL、离线强化学习
No.38 智源社区 强化学习组 强 化 学 习 研究 观点 资源 活动 关于周刊 强化学习作为人工智能领域研究热点之一,其研究进展与成果也引发了众多关注.为帮助研究与工程人员了解该领域的相关进展和 ...
- 生物,AI,心理:目前的大脑/认知/意识/AGI/DRL模型
来源:人工智能前沿讲习 一 基于生物和经验的模型 首先是 2012 年的 Spaun,基于生物基础(脑图谱),类生物神经元(尖峰放电 SNN). 在训练后可完成多种识别和生成和反应任务. map ...
- 人工智障学习笔记——强化学习(5)DRL与DQN
在普通的Q-learning中,当状态和动作空间是离散且维数不高时可使用Q-Table储存每个状态动作对的Q值,而当状态和动作空间是高维连续时,Q-Table则不再适用. 通常做法是把Q-Table的 ...
- 拔掉机器人的一条腿,它还能学走路?| 三次元里优化的DRL策略
行走栗 发自 凹非寺 量子位 出品 | 公众号 QbitAI 迪士尼的机器人,不管剩几条腿 (n>0) ,都能学会走路. 那么,是怎么学的? 研究团队不用模拟器,直接在硬件上修炼深度强化 ...
- 【Tensorflow教程笔记】深度强化学习(DRL)
基础 TensorFlow 基础 TensorFlow 模型建立与训练 基础示例:多层感知机(MLP) 卷积神经网络(CNN) 循环神经网络(RNN) 深度强化学习(DRL) Keras Pipeli ...
- 【深度强化学习】DRL算法实现pytorch
DRL Algorithms DQN (deep Q network) Policiy_Gradient 策略梯度是强化学习的一类方法,大致的原理是使用神经网络构造一个策略网络,输入是状态,输出为动作 ...
- OptaPlanner将弃用DRL(Drools)评分方式!!!
本来这段时间一直都在加紧我家"三胎"(易排通用智能规划平台)建设,毕竟我们的通用规划平台原定6月初就能上线,但因为其中遇到的各种技术问题及其它项目的突发情况,导致也只能跟随国家的0 ...
- 深度强化学习(DRL)简介与常见算法(DQN,DDPG,PPO,TRPO,SAC)分类
简单介绍深度强化学习的基本概念,常见算法.流程及其分类(持续更新中),方便大家更好的理解.应用强化学习算法,更好地解决各自领域面临的前沿问题.欢迎大家留言讨论,共同进步. (PS:如果仅关注算法实现, ...
最新文章
- RabbitMQ 入门系列(7)— 如何保证 RabbitMQ 高可用性
- Network Broadcast
- Interview and paper based test
- jsonp模拟获取百度搜索相关词汇
- redis分布式锁的这些坑,我怀疑你是假的开发
- 高手教您编写简单的JSON解析器
- WebService的简单实现
- 我的新书《Android App开发从入门到精通》终于出版啦
- 方正计算机如何用u盘安装系统,方正电脑用u盘装系统操作方法
- 3Dmax转cad及批量出图
- python label显示图片_Python3 tkinter基础 Label imag显示图片
- 代码传奇 张一鸣的成长之路
- vue添加cnzz统计
- 信度效度难度区分度是什么意思_信度、效度、难度、区分度
- 解决Win2000 不能启动的几种方法
- java中怎么引用圆周率_Java简单计算圆周率完整示例
- [WebSocket]使用WebSocket实现实时多人答题对战游戏
- 如何在微信小程序中下载APP?
- 记录四川移动盒子打开adb命令的方法 型号:UNT401H
- windows8 下载
热门文章
- gitblit 自定义URL复制按钮
- JavaScript(11) - 阻止事件冒泡和默认行为,拖拽,事件监听器
- 桌面mini计算机,迷你电脑来袭:市场中10款最小的电脑
- 分享 - 微信域名检测API接口
- 关于NodeMCU烧写的坑(load 0x33333333, len 858993459, room 0)
- 浪潮服务器nf5270m5做raid_浪潮服务器PM8060阵列卡,如何做热备盘?操作相对有点复杂...
- 微信语音如何转发,如何将语音内容转换成文字,这个方法非常的简单
- elk插件x-pack安装以及破解
- 学会使用jupyter来编写代码
- 原创程序|基于AutoCAD的宗海界址图快速自动化绘制技术