Lee Hung-yi强化学习 | (7) Sparse Reward

Lee Hung-yi强化学习专栏系列博客主要转载自CSDN博主 qqqeeevvv,原专栏地址
课程视频
课件地址

在强化学习的训练过程中,当环境的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。

2. Curiosity

由于环境中的reward很稀疏,导致agent不知道要干嘛,一直在里面瞎转。所以要制造一些reward使这个agent去探索一些没做过的事情/动作,其实这是一种exploration的技术。

论文中的提到的例子,在Mario游戏中,智能体(Mario)纯粹利用好奇心进行探索,而不从杀死敌人或者躲避危险中得到任何激励信号。这样的智能体仍然学会了如何杀死敌人和躲避攻击。原因是被敌人杀掉会导致智能体只能看到一小部分的游戏空间,从而迅速导致其好奇心饱和。为了保持"好奇心",智能体必须学会杀死敌人和躲避危险,以到达更多更新的游戏空间。(此段落参考博文

下面看具体的过程:
在这里插入图片描述
左图是之前的图,以在 s t s_t 执行 a t a_t 获得 r t r_t 。然后累加整个过程的 r t r_t 作为total reward。

右图是加入Curiosity技术的ICM模块的图,ICM以 s t a t s t + 1 s_t,a_t,s_{t+1} 为输入,输出一个 r t i r^i_t ,然后累加整个过程的 r t r t i r_t,r^i_t 的总和作为total reward。所以现在不仅希望 r t r_t 越大越好,还希望 r t i r^i_t 也越大越好。

ICM的设计
在这里插入图片描述
输入到ICM的 s t a t s_t,a_t 作为模块中的一个网络Network 1的输入,去预测接下来会遇到的状态,然后和实际下一个状态去作对比。预测的状态和实际的状态越不像,这个reward( r t i r^i_t )就越大,所以agent就会越倾向于去冒险以满足自己的好奇心。

注意:其中的Network 1是另外训练出来的,训练好后在ICM中运用的时候,它的参数是被固定住的。

这是ICM最原始的样子,但是这是不够的。因为在实际中,有一些state虽然难预测,但是不代表就要让agent往这些state靠近,有可能这些state是无关紧要的。比如agent站下树下看树叶飘动,而树叶飘动很难预测,但是由于好奇心驱使就导致agent一直站在原地看树叶飘动了。。

所以需要让agent知道哪些事情才是应该要关注的。
在这里插入图片描述
在刚才的基础上,再增加Feature Ext这个网络,Feature Ext先把 s t s t + 1 s_t、s_{t+1} 变为 Φ ( s t ) Φ ( s t + 1 ) \Phi (s_t)、\Phi (s_{t+1}) (这一步可以理解为把状态输入CNN后把游戏画面变成电脑看得懂的东西),再送到Network 2去预测由 s t s_t 跳到 s t + 1 s_{t+1} 需要执行的动作 a ^ t \hat{a}_t 。把 a ^ t \hat{a}_t 和实际做的动作 a t a_t 作对比,如果比较接近则说明 s t s t + 1 s_t、s_{t+1} 是有用的状态;如果相差较大,则说明 s t s t + 1 s_t、s_{t+1} 是和agent要采取的动作无关的没用场景,这时就把这些状态过滤掉。

2. Curriculum Learning

给agent安排学习计划,先从简单的题目开始学,学会以后再学习难的题目,就像我们从小学读到大学这样。
在这里插入图片描述
以Facebook的vizdoom为例子,他们让agent和不同等级的怪物打斗,先从速度慢血量薄的训练起,再慢慢和更强的怪物打斗。他们也有尝试过一开始直接让agent和最强的boss打,然后发现完全训练不了。

知道让agent从简单学起,但是还要知道如何给它设计课程,这时就可以用Reverse Curriculum Generation。
在这里插入图片描述
1)假设 s g s_g 是目标状态(完成任务的状态),先从 s g s_g 附近找出一些点,让agent从这些地方出发,往 s g s_g 靠近。
2)到达 s g s_g 后算出各点的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的愿景(粉色点)走,最终到达目的地(黄色点)。