在现实生活中我们强化学习实验中我们经常会遇到的一种情况是:reward过于稀疏,导致强化学习的训练是十分艰难的。举个例子:在一张桌子上训练一个机器人用螺丝刀去拧螺丝,机器手臂很多时候都是没有reward(reward很多时候都是为零的)的,在这种情况下,因为reward一直是0,所以很难去更新,在这种情况下,我们应该怎样才可以完成对强化学习的更新呢!
第一种方法就是Reward Shaping(回报塑造)
举个例子就是:一个小孩如果play的情况下,及时reward就是+1,但是往后后一百步的rewrd就是-100.如果是study的情况下及时的奖励是-1,但是往后一百步的reward是100。为了可以让小孩子去学习,这时候我们可以重新塑造这个学习的reward为1。
下一个例子就是强化学习训练计算机自己玩VizDoom游戏的例子,这个游戏本身只有一个最终的reward,就是赢了就会是很大的奖励,但是输了就会是一个负数的奖励。
因为过于稀疏,所以我们人为的去设置一些重塑reward(Reward Shapping),比如加到血袋会有一个小奖励,加到一个枪会有一个小奖励,打枪不中会有一个负的小奖励。用这些重塑的奖励来使reward不那么稀疏
但是这些重塑的奖励有时候也会使得出错,比如说下面这个例子,我们设置重塑奖励是:蓝色小框架越接近木头架,重塑奖励越大,但是有时候机器会一直击打着这个架子。
设置Reward Shapping的时候需要用到的是这个领域的先验知识。
接下来会有一个好奇心的架构去做Reward Shapping
原来我们都是一个s,一个a去得到一个奖励r,但是这个例子中我们增加一个ICM(intrinsic curiosity module 内在好奇心模块)去得到一个好奇心的奖励。就是一个s,a对进入网络中得到两个奖励,一个是环境给予的,一个是ICM给予的,我们的目的是使两个奖励的加和达到最大。
接下来我们分析一下ICM内部是如何工作的,输入有三个,at,st,st+1。先是at,st输入得到一个预估的s ̂_(t+1),我们判断s ̂_(t+1)和st+1这两个的区别大小,如果区别大的话,r就很大,如果区别小的话,r就很小。
意味着,如果好奇心很大,用了意想不到的a,得到意料之外的s,就会让r很大(st+1和s ̂_(t+1)差别很大的情况)但是如果好奇心很小,就会让r很小(st+1和s ̂_(t+1)差别很小的情况)
这个模型鼓励冒险,希望agent会做一些难以预料的事情
但是这种情况也是有弊端的,因为模型鼓励做一些难以预料的例子,比如一个agent在打游戏,但是游戏画面的背景是树叶在舞动,树叶如何舞动是一个难以预料的东西,这个模型会鼓励这种难以预料的东西。所以这个模型会让agent一直观察树叶是如何舞动。
根据刚才的例子我们知道,不能让智能体总是去看无关紧要的东西,所以我们增加了一个network。这个network是用来判断这个东西是不是和实验结果有关的。
输入时at,st,st+1。st和st+1会经过一个Feature Ext从而生成一个向量。将这两个向量输入到network中生成对a的预测a ̂_t,比较a ̂_t和at的关系,如果区别不大,证明这个是和结果有关系的,但是如果区别大,就证明这是一个无关紧要的东西。
network1和之前的是一致的。
network1和network2都是类似于监督学习的神经网络,之前会有数据库中的数据来训练,训练好后,应用到我们的强化学习中来,在强化学习中,我们要把这两个network的参数fix住。
第二种方法是Curriculum Learning(课程学习)
类似于人类不会一口吃成一个胖子,机器学习中的机器也不会一下子就全部学会。小孩子要学习微积分肯定不会一下子学会,但是我们可以为其规划好先验课程,比如乘法,除法等等,一点一点学习。强化学习也类似于这种方法。
比如刚开始我们先给出一些简单的工作,之后再慢慢去学习更加难得工作。
接下来这个例子叫做Reverse Curriculum Generation(反向课程生成)
1,先是规定一个目标状态sg,2,接下来我们在这个sg状态周围取样到一些状态来接近这个sg,接近得这些状态相应得会获得相对较高得分数。
我们要处理一下取样得数据,如果取样的状态的reward太大(太容易学),或者取样的reward太小(太不容易学)。都要去掉。
我们再在取样的周围再取样,直到这个模型好训练为止。
因为是从结果goal开始慢慢反着推,所以叫Reverse Curriculum Generation。
第三种方法叫Hierarchical Reinforcement Learning(阶段强化学习)
其实整体的思路是将原来的任务分段完成。论文中的例子是这样的:总得要求就是校长要发论文,但是这个任务太难了,于是校长要求教授一年发三个期刊的论文(第一个阶段:goal是校长要教授发论文),但是教授不编码,就让研究生写代码,发论文(第二个阶段:subgoal是教授让研究生发)就是将大任务拆分为好多的阶段。
论文中体到如果agent得到的goal是错的话,就假设最初的goal是错的
假设教授不想发论文了,想要当up主,那么发论文这个goal就是错的了。这时候假设原来的goal是错的,就在原来努力结果保留的基础上,整体改为当up主。
在这个实例中就是蓝色是agent的位置,黄色是最终目标,我们分阶段完成,粉色是阶段小目标
完成小目标,才有大目标