UDN-企业互联网技术人气社区

板块导航

浏览  : 2719
回复  : 0

[干货] 强化学习系列之七:逆向强化学习

[复制链接]
巡山霉少女的头像 楼主
发表于 2016-6-6 21:21:51 | 显示全部楼层 |阅读模式
  这篇文章我们介绍逆向强化学习 (Inverse Reinforcement Learning)。

6.png


  1. 逆向强化学习是什么

  我们知道强化学习背后的假设是马尔科夫决策过程 (MDP)。马尔可夫决策过程是基于马尔可夫过程理论的随机动态系统的决策过程,其分五个部分:

  1. S 状态集 (states);

  2. A 动作集 (Action);

  3. Ps′s,a 转移概率;

  4. Rs 或者 Rs,a 奖励函数;

  5. γ 衰减因子。

  有时候我们不知道转移概率和激励函数,便让系统探索环境。在探索过程中,环境根据我们未知的转移概率和激励函数,确定下一个状态和给出激励。这一类强化学习被称为模型无关的强化学习。逆向强化学习更极端:系统进行探索的过程中,环境不给出奖励。一般的强化学习的训练数据是{s1,a1,r1,...,sn,an,rn},而逆向强化学习的训练数据是一组轨迹{ζ=s1,a1,...,sn,an}。

  为什么人们要发明逆向强化学习呢?说一个场景,训练自动导航机器人,我们拿到的出租车司机的行为数据是一组轨迹{ζ=s1,a1,...,sn,an},我们无法获得司机在一个地址做了一个动作的即时奖励。可以用有监督学习处理这个问题,分类器的输入是地点,输出是动作。这种方法被称为行为克隆 (Behavior Cloning)。行为克隆有两个缺陷。一个是导航本质上是强化学习的范畴。导航行为的优劣是有整体用时决定的,整体用时只有在最后才知道,具有强化学习教师信号延迟特点。另一个是行为克隆只学习司机的行为,并没有深究司机的动机。

  逆向强化学习的马尔科夫决策过程不知道奖励函数,但是有教师策略探索环境的结果。

  1. S 表示状态集 (states);

  2. A 表示动作集 (Action);

  3. Ps′s,a 表示状态 s 下采取动作 a 之后转移到 s' 状态的概率;

  4. D={ζ=s1,a1,...,sn,an} 表示教授策略探索环境的轨迹;

  5. γ 是衰减因子。

  2. 逆向强化学习算法

  逆向强化学习算法的目标是还原激励函数 R∗s。一个重要假设是奖励函数等于状态特征向量和参数向量内积

5.png


  其中 θθ∈Rn 是参数向量,ϕ(s):s→Rn 将状态 s 映射到状态特征向量。只要求得参数θθ,即得奖励函数。逆向强化学习的目标是使得下面的公式成立。

4.png


  其中 u(π) 表示策略 π 下的状态特征的期望。本来 π∗ 表示最优策略。但我们对最优策略长什么样完全没有头绪,故而假设教师策略就是最优策略 π∗。我们介绍两种逆向强化学习的算法。

  2.1 学徒学习

  Abbeel and Ng, 2004 提出了学徒学习解决逆向强化学习问题。学徒先观察自己方法和师傅的差距并猜测原因,根据猜测结果尝试改进自己方法,再观察自己方法和师傅的差距并猜测原因,循环往复,直到自己和师傅差不多。因此学徒学习有两个步骤:

  猜测步骤,观察已有策略和教师策略的差距,并猜测奖励函数。猜测步骤的目标得到奖励函数参数,优化问题如下所示。

3.png


  猜测步骤的代码 (建议先简单学习下线性规划包 pulp 的用法 ):

  
  1. def guess_reward(self, policys):

  2.   gamma = LpVariable("gamma");

  3.   theta = [];

  4.   for i in xrange(len(self.theta)):

  5.   theta.append(LpVariable("theta_%d"%(i), -1.0,1.0));

  6.   prob = LpProblem("guess_reward", LpMaximize);

  7.   e = 0

  8.   for i in xrange(len(self.theta)):

  9.   e += theta[i]

  10.   prob += e < 1

  11.   prob += e > -1

  12.   for p in policys:

  13.   e = 0

  14.   for u in xrange(len(self.trajectories_u)):

  15.   e += theta[u] * self.trajectories_u[u]

  16.   e -= theta[u] * p.u[u]

  17.   e -= gamma

  18.   prob += e >= 0

  19.   prob += gamma;

  20.   prob.solve()

  21.   for i in xrange(len(self.theta)):

  22.   self.theta[i] = value(theta[i])
复制代码


  学习步骤根据猜测的奖励函数,学习一个新策略。我们使用奖励函数参数得到教师策略轨迹的奖励,再利用蒙特卡罗方法学习一个新策略。

 
  1.  def learn_policy(self, trajectories):

  2.   policy = Apprenticeship_Policy(self.mdp);

  3.   n = dict();

  4.   for s_a in policy.q:

  5.   n[s_a] = 0.0001;

  6.   policy.q[s_a] = 0.0;

  7.   for t in trajectories:

  8.   G = 0.0;

  9.   for i in xrange(len(t.states)-1,0,-1):

  10.   s = t.states[i];

  11.   r = self.state_reward(mdp.feas[s]);

  12.   G *= self.mdp.gamma;

  13.   G += r;

  14.   for i in xrange(len(t.states)-1):

  15.   s = t.states[i];

  16.   a = t.actions[i];

  17.   policy.q["%s_%s"%(s,a)] += G;

  18.   n["%s_%s"%(s,a)] += 1.0;

  19.   G -= self.state_reward(mdp.feas[s]);

  20.   G /= self.mdp.gamma;

  21.   for s_a in policy.q:

  22.   if n[s_a] > 0.1: policy.q[s_a] /= n[s_a];

  23.   return policy
复制代码


  3. 做个实验

  实验还是以机器人找金币为场景。机器人从任意一个状态出发寻找金币,找到金币则获得奖励 1,碰到海盗则损失 1。找到金币或者碰到海盗,机器人都停止。衰减因子 γ 设为 0.8。

2.png


  我们用学徒学习得到的奖励函数如下图所示 (实验代码)。我们很容易知道,这个奖励函数和机器人找金币的奖励函数,导致的最优策略是一样的。

1.png


  4. 总结

  本文介绍了逆向强化学习中的学徒学习。下次将更新本文,添加其他逆向强化学习算法。本文代码可以在 Github 上找到,欢迎有兴趣的同学帮我挑挑毛病。

原文作者:佚名 来源:开发者头条
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部