强化学习 模仿学习 于robot[通俗易懂]

强化学习 模仿学习 于robot[通俗易懂]写在前面:分享知识是再好不过的事情。这篇文章主要是总结自己最近看的一些文章以及相关知识。自己在暑假实习的时候学习的就是在物理仿真平台上做robot的强化学习,未来读PhD的时候也被老师继续分配到了这个方向,哈哈。可能要一直从入门到入土了,趁着最近写researchproposal的时候,将最近的理解记录一下。鉴于笔者知识水平有限,若有不妥当之处,还请指出。摘要:robot强化学习模仿学…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

写在前面: 分享知识是再好不过的事情。这篇文章主要是总结自己最近看的一些文章以及相关知识。自己在暑假实习的时候学习的就是在物理仿真平台上做robot的强化学习,未来读PhD的时候也被老师继续分配到了这个方向,哈哈。可能要一直从入门到入土了,趁着最近写research proposal的时候,将最近的理解记录一下。鉴于笔者知识水平有限,若有不妥当之处,还请指出。

摘要:robot 强化学习 模仿学习

介绍

从Google的alphago以绝对优势接连战胜人类围棋中的佼佼者(李世石, 柯洁)之后,这总结果当然是震撼的,从此人工智能声名大噪。但是纵使目前能使机器智力超群,围棋上的造诣无人能比,但是它还是连一颗棋子都拿不起来。大家总在畅想未来各种家居机器人会成为我们得力的助手,洗碗做饭洗衣服,任劳任怨不叫苦。当然理想还是要有的,只不过实现起来路还是很长的。现在让机器人学会倒杯水都是很困难的。。。

早在1921年karel Capek就为我们第一次描述了一个机器人应该长什么样子:it should look like a human being。自从那时起,小说家们开始将这一想法发扬光大,在各式各样的科幻小说中,很多超过人的智能机器层出不穷。而现实呢,研究员们还在为实现最简单的可称得上“智能”的机器而夜以继日(artist的创作力真是远超scientist)。在做工程与研究的人眼中,类人的机器人就是合适材料组装的,质量尽可能轻的,有各种各样的motors还有各种各样的传感器的集合。但是在这样的基础上让机器学会推理(reasoning)是很困难的。目前为止,机器人也就只能重复性的完成那些被人为设计好,写在程序中的任务。为了克服这种需要人为给每个动作编程的繁琐步骤,我们迫切的需要一种新的算法。然后强化学习(Reinforcement Learning)被拿来用了。

Reinforcement Learning

强化学习 模仿学习 于robot[通俗易懂]

                 强化学习 模仿学习 于robot[通俗易懂]

一张图简单介绍下强化学习,我们前面提到的robot就是图中的智能体agent。每个agent都是肩负一个使命的,并且要为这个使命在环境(environment)中不断探索(actions),每探索一次都会到达一个新的状态(state)也会得到环境对这个action的反馈(reward)。往往我们的reward就是根据target来设定的,所以要实现的目标也等价于获得最大的累计回报。举个简单的例子(例子才是最能说明问题的),flabbybird 相信大部分人都玩过,没玩过可以玩一玩(强迫症绝对停不下来。。。)。

 

                                                      强化学习 模仿学习 于robot[通俗易懂]

这个游戏里面呢,小鸟就是我们的agent,环境就是各种各样的水管,state就是对环境的观测值(包括鸟的速度啊,水管距离啊等等),我们的目标呢就是穿越尽可能多的水管,能采取的action就是点一下或者不点,每穿越一个水管就会得到一个值是1的reward,若是不小心撞到水管那就得到-1的reward然后游戏结束。这个例子中动作空间是离散的也比较简单,用的就是DQN的算法,是很不错的强化学习的入门例子,有兴趣可以去玩一玩。

yenchenlin/DeepLearningFlappyBird​github.com

 

关于强化学各种各样的算法,诸如Q-learning,SARSA,policy gradient等,我就不在这里列公式了,看见公式我也晕,讲的也可能没有人家好,建议有兴趣的人可以去看下CS294课程,还有这里有一些博客链接:强化学习入门资料 – penkgao的博客 – CSDN博客

做了基本的了解之后,我们言归正传,强化学习真的在近些年来被证明是做motion control 任务的非常有效的方法。基于各种各样的仿真平台比如gym,dart,以及很多优秀的物理模拟工具 mujoco,bullet。让研究者们可以非常方便的搭建自己的agent,从人,动物甚至到自行车,再者还有集成各种强化学习算法的平台(如baseline, tensorflow agent)让研究者可以非常方便的调用或者编写自己的强化学习算法。所以在图形学领域,这个方向算是成为了一个热点吧,工作比较突出的,最敬佩的应该是Berkeley的大神博士生 Xuebin Peng吧。

                                                                      Xue Bin (Jason) Peng​xbpeng.github.io

他实现了一些列关于强化学习用于模拟智能体的工作,比如一维和三维的障碍跨越,在最近的文章里还实现了学杂技,也是让人眼前一亮了。所以大家可一看到强化学习在这个方向上的潜力与效果。(无脑宣传一波,暑假张老师 @张心欣提的idea做自行车的训练也是非常的exciting)。

好,吹完了开始黑了。

强化学习在做motion control是极好的,但是往往一开始产生的都是一些非常滑稽的,不对称的动作,为了解决这个问题,研究者们就开始将目光投到cost function上去,比如Wenhao Yu(VincentYu68/SymmetryCurriculumLocomotion)他们的设计了一种新颖的方式计算动作的协调对称性,取得了不错的效果,然后Xuebin Peng最近开始从视频中一帧帧匹配agent的动作与视频中角色动作的匹配度。除了loss fucntion,reward的设计也真的是奇技淫巧,灵光乍现,不然的话最后也变成了玄学调参。暑假做训练上面那个自行车的时候,reward加的也是随心所欲,不断尝试,出现问题马上就改。因为reward的设计直接决定了最后的训练效果,目前好像也还没有系统的指导我们如何设计reward function的行之有效的方法,毕竟对于不同的任务,情景和要求也是千差万别的。

虽然强化学习比较接近生物体学学习的本质了吧,可是仔细想想还是略有不同的,人往往可以通过看别人演示一遍,就能自己上手操作了,而不是完全无脑的尝试。于是模仿学习出现了。

imitation learning

目前模仿学习的主流方法分成两大类,behaviour cloning 和 inverse imitation learning。

对于behaviour cloning:

思路就是,一些专家(expert)提供一些demonstration。然后agent通过反复的研究这些demos,从中提取出专家的行为轨迹\gamma = (s_1, a_1, s_2, a_2 ..... s_n, a_n) ,然后当agent会去自己保存的专家轨迹中去匹配自己当前遇到的情形,然后模仿专家采取的动作来应对。就将这类问题变成了有监督的问题。那么然后问题来来了,有些情形下的数据无法收集,比如在自动驾驶中去收集高度危险的情形损失是很大的,然后就是遇见新的情形,专家轨迹中没有怎么办,就会造成covariate shift,误差就会累积。

强化学习 模仿学习 于robot[通俗易懂]

为了改善这种问题有人就提出了DAGGER方法:

  • train \pi_\theta(a_t|s_t) ​ from human data ​ {D_\pi^* = \{s_1, a_1, ... s_n, a_n \}}
  • run \pi_\theta(a_t|s_t) ​ to get dataset ​ {D_\pi = \{s_1,  ... s_n \}}
  • expert labels ​​ D_\pi with actions ​ a_t
  • ​ D_\pi^* = D_\pi^*  \cup D_\pi
  • go to first step

就是对于每次用当前策略遇到的情形,都会重新让专家进行标记。emmm,感觉无非就是扩大了数据集。虽然证明比较有效果,但是将冗余的劳动转移到了专家身上,这是比较低效和费时的。

Inverse Reinforcement learning

                     强化学习 模仿学习 于robot[通俗易懂]

逆向强化学习就是通过专家给出的demonstrations,去归类(离散)或者回归(连续)出reward function。怎么做呢,就是假设专家的动作是最优的,找出一种reward function,满足下面的式子:

E[\sum_{t = 0}^\infty \gamma^t R^*(s_t)|\pi^* ]  \ge E[\sum_{t = 0}^\infty\gamma^t R^*(s_t)|\pi ]                         \quad \forall \pi (1)

\pi^* 就是专家策略,而 \pi 就是当前reward function中产生的最优策略。逆向强化学习的方法有很多中比如学徒学习,MMP,结构化分类,最大熵IRL等。我们以学徒学习来说明一下:

首先假设reward function是关于status feature是线性的有 R(s) = w^T \phi(s) , w \in R^n \phi: s \rightarrow R^n . 然后(1)式可以进一步写成:

E[\sum_{t = 0}^\infty \gamma^t R(s_t)|\pi ] = E[\sum_{t = 0}^\infty\gamma^t w^T \phi(s_t)|\pi ] \\ \quad\quad\quad\quad\quad\quad\quad =w^T E[\sum_{t = 0}^\infty\gamma^t  \phi(s_t)|\pi ] \\ \quad \quad=w^T\mu(\pi)

现在我们的目标就是找到最优的 w^* 使得 w^{*T}\mu(\pi^*)\ge w^{*T}\mu(\pi) \quad \forall\pi . 当我们产生的策略与专家策略尽可能地一样优秀的时候,就会得到 |w^{*T}\mu(\pi^*)-w^{*T}\mu(\pi)|\le\epsilon 。通过上面的推导,然后写出下面的算法步骤:

  • assume ​ R_w(s)=w^T\phi(s)
  • initialize: pick some policy \pi_0 ​
  • iterate for ​ i = 1,2,3....
    • find a reward function so that the expert policy outperform all previous found policies
      max \gamma ​ s.t. ​ \gamma \le w^T \mu(\pi^*)-w^T \mu(\pi) \quad\forall\pi \in \{\pi_0,\pi_1...\pi_{i-1}\}
    • Run reinforcement learning algorithms to find the optimal policy ​ based on current reward function ​ R_w
    • update ​ w
    • if ​ \gamma \le \epsilon/2 , exit

尽管逆向强化学习取得了很不错的结果[2,3],但是也有一些一直被嫌弃的地方,就是每次内层循环都要跑一遍RL,这样的计算花费也是很大的。然后呢对于reward 关于feature的线性假设可能也有不合理的地方。

新的方法:

基于上面出现的问题,又有新的方法提出了,比如GAIL[1], 用GAN的思路来做这类问题,还是有一定的合理性的。不在费尽心思的设计reward function 或者迭代reward function,而是直接生成reward function的分布,思路还是很让人激动的不知道以后会不会有什么特别惊艳的结果。还有最近的one – shot imitation learning(被翻译成一眼学习)。干的事情就是,专家只提供一个demonstration,然后agent就可以学会完成这个任务。

https://blog.openai.com/robots-that-learn/​blog.openai.com

 

主页中可以看到,完成的是累积木块的任务,将特定颜色的木块放到另外一个上去。虽然目前完成的任务还比较简单,而且也是提前进行了大量的类似任务的训练,但是未来应该会基于此出现更多优秀的成果,毕竟openAI。。。

 

写在最后:

虽然出现了很多越来越优秀的算法和结果,但是还有很长的路要走啊。目前大部分的训练还都是在物理仿真平台上进行的,从模拟域到现实中的reality gap也是一个需要研究和解决的问题,此外目前的这些方法无非就是让agent不断的copy,模仿专家的动作,而真正通过demonstration理解专家的意图然后做出比专家更加优秀的动作也是还未能做到的。总之呢,会越来越好的。

 

references

[1] : Ho, Jonathan, and S. Ermon. “Generative Adversarial Imitation Learning.” (2016).

[2] : N. D. Ratliff, D. Silver, and J. A. Bagnell. Learning to search: Functional gradient techniques for imitation learning. Autonomous Robots, 27(1):25–53, 2009.

[3] : B. D. Ziebart, A. Maas, J. A. Bagnell, and A. K. Dey. Maximum entropy inverse reinforcement learning. In AAAI, AAAI’08, 2008.

[4] : Stéphane Ross, Geoffrey J Gordon, and Drew Bagnell. A reduction of imitation learning and structured prediction to no-regret online learning. In AISTATS, volume 1, page 6, 2011.

[5] : GAIL生成对抗模仿学习详解《Generative adversarial imitation learning》

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/191675.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • mysql中10049是什么错误_【学习笔记】Oracle数据库10049用于分析SQL解析笔记案例[通俗易懂]

    mysql中10049是什么错误_【学习笔记】Oracle数据库10049用于分析SQL解析笔记案例[通俗易懂]【学习笔记】Oracle数据库10049用于分析SQL解析笔记案例时间:2016-11-0513:54来源:Oracle研究中心作者:HTZ点击:次天萃荷净Oracle研究中心学习笔记:分享一篇关于Oracle数据库关于SQL解析的详细文档,该文档详细介绍使用10049event事件来分析SQL语句的解析笔记。1,数据库版本SQL>select*fromv$ve…

  • fstream中文路径

    fstream中文路径在C++的标准库中,std::fstream是个挺好用的文件读写流,操作文件很方便,因为是C++标准库,所以没有其它的环境依赖。在使用fstream过程中,有个打开中文路径文件会失败的问题,自己的代码中一直没处理好,这几天终于有点闲心,把这里改透。涉及很多知识点,也是个遗留已久的问题,特此做个记录。在最后用了个一劳永逸的解决此问题方法:将fstream、FILE再包装下。中文路径使用fstream调试程序过程中,发现打开含中文路径的文件时,会打开失败。查了一些资料,说在VS2008、vs200..

    2022年10月27日
  • 渗透测试笔记汇总_渗透测试怎么做

    渗透测试笔记汇总_渗透测试怎么做【拿shell】1.直接上传aspasajspcerphpaspxhtrcdx格式的木马,不行就利用IIS6.0解析漏洞”:1.asp;1.jpg/1.asp;.jpg/1.asp;jpg/1.asp;.xls2.上传图片木马遇到拦截系统,连图片木马都上传不了,记事本打开图片木马在代码最前面加上gif89a,一般就能逃过拦截系统了。3.上传图片木马把地址复制到数据库…

  • 不能逃避的分离「建议收藏」

    生命的意义是什么,我一直在探索 !对我来说,刚刚过往一个年,过年在家的状态是简单单纯的,不用去思考很多事情,就是享受家的感觉,享受和家人一切的幸福。2018这个年在家待的时间比较久,因为外出工作,现在也在外面生活,和家人在一起的时间真的很少,从2015年毕业后到外面工作一直是一年回家一次,2017还算多,回家两次,但是即便是回家两次,真正在家里待的时间也是不多的,仔细算算在父母有限…

  • oracle listagg限制4000 varchar 使用xmlagg解决[通俗易懂]

    oracle listagg限制4000 varchar 使用xmlagg解决[通俗易懂]由于在使用中listagg中的字段值拼接起来后长度超过4000,报以下错误:经查询发现是listagg结果长度限制为Varchar4000,帮改为以下方式解决:使用xmlagg:selectrtrim(xmlagg(XMLELEMENT(e,N,’,’).EXTRACT(‘//text()’)).GetClobVal(),’,’) fromtest_name;标准如下…

  • 区块链入门——比特币科普

    区块链入门——比特币科普

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号