上一篇博客讲述了奖励稀疏时的训练方法。实际场景中,可能难度还会更大一些。很多场景很难有一个明确的reward,甚至没有reward。那么这里就提出模仿学习,即agent模仿expert的操作。具体两个方法是:Behavior Cloning、Inverse Reinforcement Learning
Behavior Cloning
动作克隆,其实本质上就是有监督学习,以自动驾驶为例子,让agent自己去开,不现实。一般的做法就是收集很多人类驾驶的训练样本,图中的s是开车的场景,a是在此场景下做出的动作。把这些资料输入到Neural Network中,使网络输出的动作能尽可能接近实际人类做出的动作,就完成任务。
但这个Behavior Cloning也是有缺点,expert通常是很有经验的,比较少犯错的。比如在驾驶中,expert是很少会在转弯中会撞墙。所以缺少了这部分的样本,agent在这些情况下就不知道如何处理
这时候可以引入Dataset Aggregation可以缓解这个问题。
- 通过行为模仿,训练一个actor π 1 \pi_1 π1
- 让 π 1 \pi_1 π1去与环境做互动
- 遇到不同state的时候, π 1 \pi_1 π1询问expert的做法,但是不会采取expert的做法,如果这时候导致episode结束,那就拿着新数据(expert的做法作为label)训练。
- 这时actor就知道在快要撞墙的时候要采取什么样的动作,然后用这个新的data去训练新的 π 2 \pi_2 π2。
- 重复1-4
即使采用了Dataset Aggregation的Behavior Cloning,也有它的缺点,比如每次训练都需要expert试错,在特定的场景,比如自动驾驶,以撞车收集数据肯定不可行。其次expert不是所有行为都是好的,需要学习的。最关键的一点,强化学习的问题多数属于马尔科夫链,即下一个状态只和上一个状态有关,那所以上一个状态是错的,下一个状态就跟着错了,一步错步步错。那这个expert缺少这种数据,所以引导也很有限。
Inverse Reinforcement Learning
反向强化学习,比较通俗的解释就是,先射箭再画靶。
正常的Reinforcement Learning的步骤,是通过Environment和Reward function,最终更新出理想的Actor。
Inverse Reinforcement Learning的步骤,由于没办法从Environment获得reward,那就通过收集expert的训练数据和Environment的信息,来反推Reward function,推出Reward function再用以前的Reinforcement Learning的方法来训练Actor。
在具体的训练中,我们如何实操?
- 让expert π ^ \hat{\pi} π^去玩游戏,记录游戏过程,形成n个 τ ^ \hat{\tau} τ^,每个 τ ^ \hat{\tau} τ^代表一个episode。
- 让actor π \pi π去玩游戏,记录游戏过程,形成n个 τ \tau τ。
- 设定一个reward function,这个reward function强制要求expert的累计得分一定要高于actor的累计得分。
- 用这个reward function训练出一个新的actor π \pi π,如果它的reward已经比expert高了,那就修改reward function,使得其 π \pi π获取的reward还是比expert低。
- 重复1-4
这个过程其实和GAN的训练很像,reward function就是一个判别器,actor则是一个生成器。actor需要不断提高自己,使得在新的reward function下,得到的reward越高越好。
Third Person Imitation Learning
第三人称视角的模仿学习,顾名思义,agent会观看expert的行为进行学习,这也是一个拟人的过程。这里就不展开讲解了,仅做记录。
Recap: Sentence Generation & Chat-bot
最后,也可以将强化学习用在句子生成上,即expert给定很多对话的素材,agent通过学习这些素材来生成人类会回答的句子。