文章目录
-
- 1、Reward Shaping
-
- Curiosity
- ICM的设计
- 2、Curriculum Learning
- 3、Hierarchical RL
在强化学习的训练过程中,当环境的reward很少时(指出现的次数),这样对agent的训练是很不利的。比如,让一个机器人拿起螺丝刀,再把螺丝拧进去才能得到reward。这一系列操作组合起来对于一个一开始什么都不懂的机器人无疑是很难的,因为它一开始不管做什么动作都不会得到reward,即便有exploration也只有极小的几率能成功获得reward。
所以下面介绍几种方法来处理这种Sparse Reward的方法。
1、Reward Shaping
既然环境的reward很稀疏,那我们就自己设定一些假的reward去引导agent往我们想要的方向。
举个例子,这里agent是这个小孩。它有两个动作,如果选择出去玩,短时间内能得到reward +1,但是之后的考试可能很很差(reward -100);如果选择学习,短时间内可能会不爽,所以reward是-1,但是之后能获得reward +100。
所以,为了引导这个小孩(agent)能往去好好学习,就会骗他说坐下来念书给棒棒糖吃,所以对他来说下一个时间点的reward就变成+1。然后他就会选择学习这个动作,即便这个reward不是实际存在的。
这是一个比较简单的例子,所以比较容易假设。而在现实中要引导agent需要设定正确的reward才能得到好的训练效果,这个reward可能不是很直观就能想到的。
所以下面要介绍一些比较通用的可以加进去reward。
Curiosity
由于环境中的reward很少,导致agent不知道要干嘛,一直在里面瞎转。所以要制造一些reward使这个agent去探索一些没做过的事情,其实这是一种exploration的技术。
以论文(https://arxiv.org/pdf/1705.05363.pdf)中的提到的例子,在Mario游戏中,智能体(Mario)纯粹利用好奇心进行探索,而不从杀死敌人或者躲避危险中得到任何激励信号。这样的智能体仍然学会了如何杀死敌人和躲避攻击。原因是因为被敌人杀掉会导致智能体只能看到一小部分的游戏空间,从而迅速导致其好奇心饱和。为了保持"好奇心",智能体必须学会杀死敌人和躲避危险,以到达更多更新的游戏空间。
下面看具体的过程:
左图是之前的图,以在sts_tst?执行ata_tat?获得rtr_trt?。然后累加整个过程的rtr_trt?作为total reward。
右图是加入Curiosity技术的ICM模块的图,ICM以sts_tst?,ata_tat?,st+1s_{t+1}st+1?为输入,输出一个rtir^i_trti?,然后累加整个过程的rt,rtir_t,r^i_trt?,rti?的总和作为total reward。所以现在不仅希望rtr_trt?越大越好,还希望rtir^i_trti?也越大越好。
ICM的设计
输入到ICM的sts_tst?,ata_tat?作为模块中的一个网络Network 1的输入,去预测接下来会遇到的状态,然后和实际下一个状态去作对比。预测的状态和实际的状态越不像,这个reward就越大,所以agent就会越倾向于去冒险以满足自己的好奇心。
注意:其中的Network 1是另外训练出来的,训练好后在ICM中运用的时候,它的参数是被固定住的。
这是ICM最原始的样子,但是这是不够的。因为在实际中,有一些state虽然难预测,但是不代表就要让agent往这些state靠近,有可能这些state是无关紧要的。比如agent站下树下看树叶飘动,而树叶飘动很难预测,但是由于好奇心驱使就导致agent一直站在原地看树叶飘动了。。
所以需要让agent知道哪些事情才是应该要关注的。
在刚才的基础上,再增加Feature Ext这个网络,Feature Ext先把st、st+1s_t、s_{t+1}st?、st+1? 变为 Φ(st)、Φ(st+1)\Phi (s_t)、\Phi (s_{t+1})Φ(st?)、Φ(st+1?)(这一步可以理解为把状态输入CNN后把游戏画面变成电脑看得懂的东西),再送到Network 2去预测由sts_tst?跳到st+1s_{t+1}st+1?需要执行的动作。把和实际做的动作ata_tat?作对比,如果比较接近则说明sts_tst?、st+1s_{t+1}st+1?是有用的状态;如果相差较大,则说明st、st+1s_t、s_{t+1}st?、st+1?是和agent要采取的动作无关的没用场景,这时就把这些状态过滤掉。
2、Curriculum Learning
给agent安排学习计划,先从简单的题目开始学,学会以后再学习难的题目,就像我们从小学读到大学这样。
以Facebook的vizdoom为例子,他们让agent和不同等级的怪物打斗,先从速度慢血量薄的训练起,再慢慢和更强的怪物打斗。他们也有尝试过一开始直接让agent和最强的boss打,然后发现完全训练不了。
知道让agent从简单学起,但是还要知道如何给它设计课程,这时就可以用Reverse Curriculum Generation。
1.假设sgs_gsg?是目标状态(完成任务的状态),先从sgs_gsg?附近找出一些点,让agent从这些地方出发,往sgs_gsg?靠近。
2.到达sgs_gsg?后算出各点的reward
3.删掉reward最大(agent已经学会的,就没必要再学)的点和reward最小(目前还是萌新的agent觉得太难)的点
4.根据刚才删掉后剩下的点,继续寻找越远的点,再学习靠近。
3、Hierarchical RL
把一个大的任务,通过上层agent的不断分解,让下层的agent去完成子任务。
以上图为例子:校长为了学校的建设,让教授每年发3篇期刊;而教授把实验规划做好后,就让下面的研究生去干活(太真实了)。
其中注意一点,如果上层agent一直弄一些很难的任务给下层agent,导致下层agent没办法完成,上层的agent就会得到负的reward(你没看错)。
另一点要注意的是,如果下层的agent到达一个错误的目标,那为了下层做过的action不被浪费掉,就把上层原来目标改为这个错误的目标。以上图为例子,原本校长要求教授发期刊,但是教授后来经过探索却变成YouTubers,那校长就只能把原来的目标改成要求教授成为YouTubers。
再举例子就是这个,紫色点代表下层的agent,粉色点代表上层agent的愿景,黄色点代表目的地。
这个任务中,把紫色点到目的地(黄色点)的路线,拆成4个子任务,让下层的agent(紫色点)跟着上层agent的愿景(粉色点)走,最终到达目的地(黄色点)。