第十五章 模仿学习
15.1 简介
虽然强化学习不需要有监督学习中的数据标签,但它十分依赖奖励函数的设置。有时在奖励函数上做一些微小的改动,训练出来的策略就会天差地别。在很多现实场景中,奖励函数并未给定,或者奖励信号及其稀疏,此时随机设计奖励函数将无法保证强化学习训练出来的策略满足实际需要。例如,对于无人驾驶车辆智能体的规控,其观测是当时的环境感知恢复的3D局部环境,动作是车辆接下来数秒的具体路径规划,那么奖励是什么?如果只是规定正常行驶而不发生碰撞的奖励为+1,发生碰撞为-100,那么智能体学习的结果则很可能是找个地方停滞不前。具体能帮助无人驾驶小车规控的奖励函数往往需要专家的精心设计和调试。
假设存在一个专家智能体,其策略可以看成最优策略,我们就可以直接模仿这个专家在环境中交互的状态动作数据来训练一个策略,并且不需要用到环境提供的奖励信号。模仿学习研究的便是这一类问题,在模仿学习的框架下,专家能够提供一系列状态动作对{ (st,at)}\left\{(s_t,a_t)\right\}{ (st,at)},表示专家在sts_tst环境下做出了ata_tat的动作,而模仿者的任务则是利用这些专家数据进行训练,无须奖励信号就可以达到一个接近专家的策略。目前学术界模仿学习的方法基本上可以分为三类:
- 行为克隆(BC)
- 逆强化学习(RL)
- 生成式对抗模仿学习(GAIL)
在本章将主要介绍行为克隆方法和生成式对抗模仿学习方法。尽管逆强化学习有良好的学术贡献,但由于其计算复杂度较高,实际应用价值较小。
15.2 行为克隆
行为克隆(BC)就是直接使用监督学习方法,将专家数据中(st,at)(s_t,a_t)(st,at)的sts_tst看作样本输入,ata_tat视为标签,学习的目标为
θ∗=argminθE(s,a) B[L(πθ(s),a)]\theta^*=arg\text{}\underset{\theta}{min} \mathbb E_{(s,a)~B}[\mathcal L(\pi_\theta(s),a)]θ∗=argθminE(s,a) B[L(πθ(s),a)]
其中,B是专家数据集,L\mathcal LL是对应监督学习框架下的损失函数。若动作是离散的,该损失函数可以是最大似然估计得到的。若动作是连续的,该损失函数可以是均方误差函数。
在训练数据量比较大的时候,BC能够很快地学习到一个不错的策略。例如,围棋人工智能AlphaGo就是首先在16万盘棋局的3000万次落子数据中学习人类选手是如何下棋的,仅仅凭借这个行为克隆方法,AlphaGo的棋力就已经超过了很多业余围棋爱好者。由于BC的实现十分简单,因此在很多实际场景下他都可以作为策略预训练的方法。BC能使得策略无须在较差时仍然低效地通过和环境交互来探索较好的动作,而是通过模仿专家智能体的行为数据来快速达到较高水平,为接下来的强化学习创造一个高起点。
BC也存在很大的局限性,该局限性在数据量比较小的时候犹为明显。具体来说,由于通过BC学习得到的策略只是拿小部分专家数据进行训练,因此BC只能在专家数据的状态分布下预测的比较准。然而,强化学习面对的是一个序贯决策问题,通过BC学习得到的策略在和环境交互过程中不可能完全学成最优,只要存在一点偏差,就有可能导致下一个遇到的状态是在专家数据中没有见过。此时,由于没有在此状态(或者比较相近的状态)下训练过,策略可能就会随机选择一个动作,这会导致下一个状态进一步偏离专家策略遇到的数据分布。最终,该策略在真实环境下不能得到比较好的效果,这被称为行为克隆的复合误差问题。

15.3 生成式对抗模仿学习
生成式对抗模仿学习(GAIL)是2016年由斯坦福大学研究团队提出的基于生成式对抗网络的模仿学习,他诠释了生成式对抗网络的本质其实就是模仿学习。GAIL实质上是模仿了专家策略的占用度量ρE(s,a)\rho_E(s,a)ρE(s,a),即尽量使得策略在环境中的所有状态对(s,a)(s,a)(s,a)的占用度量ρπ(s,a)\rho_\pi(s,a)ρπ(s,a)和专家策略的占用度量一致。为了达成这个目标,策略需要和环境进行交互,收集下一个状态的信息并进一步做出动作。这一点和BC不同,BC完全不需要和环境交互。GAIL算法中有一个判别器和一个策略,策略π\piπ就相当于是生成式对抗网络中的生成器,给定一个状态,策略会输出这个状态下应该采取的动作,而判别器D将状态动作对(s,a)(s,a)(s,a)作为输入,输出一个0到1之间的实数,表示判别器认为该状态动作对(s,a)(s,a)(s,a)是来自智能体策略而非专家的概率。判别器D的目标是尽量将专家数据的输出靠近0,将模仿者策略的输出靠近1,这样就可以将两组数据分辨开来。于是判别器D的损失函数为
L(Φ)=−Eρπ[logDΦ(s,a)]−EρE[log(1−DΦ(s,a))]\mathcal L(\varPhi )=-\mathbb E_{\rho_\pi}[logD_\varPhi(s,a)]-\mathbb E_{\rho_E}[log(1-D_{\varPhi}(s,a))]L(Φ)=−Eρπ[logDΦ(s,a)]−EρE[log(1−DΦ(s,a))]
其中Φ\varPhiΦ是判别器D的参数。有了判别器D之后,模仿者策略的目标就是其交互产生的轨迹能被判别器误认为专家轨迹。于是,我们可以用判别器D的输出来作为奖励函数来训练模仿者策略。具体来说,若模范者策略在环境中采样到状态sss,并且采取动作aaa,此时该状态动作对(s,a)(s,a)(s,a)会输入到判别器D中,输出D(s,a)D(s,a)D(s,a)的值,然后将奖励设置为r(s,a)=−logD(s,a)r(s,a)=-logD(s,a)r(s,a)=−logD(s,a) (当判别器输出越靠近0奖励值越大,输出越靠近1奖励值越小)。于是,我们可以用任意强化学习算法,使用这些数据继续训练模仿者策略。最后,在对抗过程不断进行后,模仿者策略生成的数据分布将接近真实的专家数据分布,达到模仿学习的目标。GAIL的优化目标如图15-2所示。

第三章介绍过一个策略和给定MDP交互的占用度量呈一一对应的关系。因此,模仿学习的本质就是通过更新策略使其占用度量尽量靠近专家的占用度量,而这正是GAIL的训练目标。由于一旦策略改变,其占用度量就会改变,因此为了训练好最新的判别器,策略需要不断和环境做交互,采样出最新的状态对样本。
15.4 代码实践
15.4.1 生成专家数据
首先,我们需要有一定量的专家数据,为此,预先通过PPO算法训练出一个表现良好的专家模型,再利用专家模型生成专家数据。本次代码实践的环境是CartPole-V0,以下是PPO代码内容。
import gym
import torch
import torch.nn

博客介绍了模仿学习,在奖励函数未给定或稀疏时,可模仿专家状态动作数据训练策略。主要介绍行为克隆(BC)和生成式对抗模仿学习(GAIL)方法,分析了BC的局限性,还给出代码实践,包括生成专家数据、BC和GAIL代码实现,此外讲解了Python中交叉熵损失函数。
最低0.47元/天 解锁文章
1370

被折叠的 条评论
为什么被折叠?



