实际上,强化学习中,大部分时间agent都没办法得到reward,所以agent的训练比较困难。解决Sparse Reward(稀疏奖励)有三个解决方向。
一、Reward Shaping
环境有一个固定的Reward,但为了引导agent去我们想要的方向,设计中间时间点的奖励。
下图是一篇论文中设计的Reward Shaping。训练环境是战斗游戏,当你杀害对方智能体时,你会得到一个大的Reward,但你杀害的过程是很长一段时间,所以设计了几项小的Reward。比如说掉血扣分,捡到补给包加分,如果固定不动扣分,有动作加分之类。这其中有一项Reward比较有意思,那就是Living,它得到的奖励是个很小负奖励,设计的原因是:如果智能体在探索的时候发现正奖励不好获取,它可能为了选择活下来而不去与对方智能体交战,所以这个负奖励的设置其实是为了逼迫你去和对方交战,去探索环境。至于这些奖励是怎么设计的,应该是通过不断的调试找到合适的奖励值。
加上Curiosity,根据s1,a1,s2得到ri1,最终的总Reward包括采取动作得到的Reward和ICM得到的好奇心Reward。
怎么设计ICM,让它有好奇心功能?Network1会 input 现在状态下采取的动作at 和现在的状态st去output 预测接下来的状态st+1,之后再判断这个预测和正式的状态之间区别大不大,区别越大的话得到Reward就越大,也就是鼓励智能体去冒险那些不可预测的情况。在训练的时候,Network要学习怎么根据st和at去预测接下来的状态。
但这个想法是有问题的: 有些State很难去预测,但不代表它就是重要的或好的。所以光教会agent去预测是远远不够的。所以用把无关紧要的事情“过滤”掉,只保留一些重要的Feature(比如说在战斗环境里,风吹草动之类的事情并不是重要的,可以过滤掉)。这个“过滤器”的训练是通过另外一个Network(这个Network的output写错了,得到的应该是预测的,而不是实际的,两个at写反了),就是从到需要采取什么才能做到,将这个与实际进行比较,两者越接近越好。这样就能保证抽出来的Feature是和预测这件事有关的。
二、Curriculum Learning
为智能体的学习做规划,训练由简单到难。比如下面这些战斗训练任务,先从最简单的训练任务(对方速度慢,血量低)做起,再到比较难的任务(对方速度快,血量高)。
比较常见的方法是Reverse Curriculum Generation。以机械手抓东西为例子。先给出一个goal-state(机械手已经抓到东西),接下来再根据goal-state去找靠近goal-state的state(机械手没有抓到东西,但已经非常靠近那个东西),但怎么定义这个状态之间的近是比较麻烦的,再从这些比较近的state做互动,看能不能达到goal-state。
在这过程中会得到reward,之后将这些reward中极端的的reward对应的state删除(对应case太简单或太难), 再从这些适中reward对应的state去衍生出更多的state。
三、 Hierarchical Reinforcement Learning
之前已经学习过分层强化学习。