【论文翻译】One-Shot Visual Imitation Learning via Meta-Learning

读这篇文章给我带来了不小的阻力,有两篇博客在理解上给了我很大的帮助和启发。谢谢他们,顺便附上链接:

     https://blog.csdn.net/u010909964/article/details/84501919

     https://zhuanlan.zhihu.com/p/33248019   

    原作中有一些东西我没理解于是直接跳过。


  • Abstract:

    • 为了让机器人演示许多任务时具有通用性,机器人需要能在复杂的非结构性环境中快速的习得各种策略。但是,每次都从头学起是不行的。本文展示了一种meta-imitation learning,使得机器学习“如何高效学习”,从一个demo就可以习得skill。我们的方法使用纯视觉,并且需要较少的prior tasks数据,就可以高效学习新的skill。
  • 1 .Introduction

    • 之前的方法需要大量的监督数据,并且不具备这样的机制:"利用以前的task数据来更加快速的学习新task"。因此,每次学习新skill的时候,都需要独立的收集针对不同task的数据。通过“重用”数据,可以提高数据效率,每次出现新任务时候,需要相对较少的监督。
    • 我们提出把“meta-learning”和“imitation结合起来”,使得机器人可以重用经验,并只通过一个demo就学习到新的skill。之前的方法:“把demo输入到“contextual policy”。我们的方法:学习一个参数化的策略,通过梯度更新适应不同的任务,从而用更少的参数使得skill更加弹性化。
  • 2 .Realted Work

    • 在环境已知情况下的,使用少量demo进行模仿学习已经获得了成功。本文聚焦于环境未知的问题,使用纯视觉作为输入。所以不再需要预定义视觉系统。在现实世界中运用视觉demo进行学习有两个问题:一是累积误差,二是每个task都需要大量的视觉demo。第二点是我们发展通用机器人的主要阻碍。逆强化学习可以减少对demo数量的需求,具体方法是通过demo推断奖励函数。但这需要额外的经验来优化奖励函数,而经验来自于试错。
    • 本文,我们通过共享任务之间的数据,减少对demo数量的需求。任务间共享数据可以考虑:建立task到task的映射/共享特征。具体来说,我们目的是:基于其他任务的数据,使用meta-learning,来从一个demo中学习新的task。
  • 3 .Meta-Imitation Learning Problem Formulation

    • 3.1 Problem Statement

      • 在meta-training阶段,policy被训练以适应许多tasks。每个task Ti如下:
      • demonstration data τ由专家策略πi⋆生成。L是损失函数。反馈是,连续动作用MSE,离散动作用交叉熵。任务分布是p(T )。

      • 在meta-learning场景中,策略需要学习来自p(T)的新任务Ti,使用的数据是Ti生成的一个demo。在meta-training阶段,从p(T)采样一个任务Ti,由专家策略πi在Ti上生成一个demo,策略使用这个demo进行训练。接下来根据专家策略生成的一个新demo,同时计算测试误差loss L。接下来根据新demo上产生的测试误差,对策略参数进行更新。因此,此时的测试误差在meta-learning中其实充当了训练误差的角色。在meta-training结束后,从任务分布采样一个新任务,并从这个任务采样一个专家demo。策略学习这个专家demo后,对策略性能进行评估。用来meta-test的数据和meta-training的数据是不相交的。

    • 3.2 Background: Model-Agnostic Meta-Learning

      • 我们基于MAML进行拓展,从而实现”基于视觉输入的meta- imitation learning“。MAML使用梯度下降作为优化器,不引入额外参数,具有一定的参数效率。
      • 在MAML中,优化对象是根据θ′计算出来的,但是要对θ进行优化。模型参数θ的优化方法是,优化fθ′的性能表现,fθ′又取决于θ,即对θ二次求导:
  • 4 .Meta-Imitation Learning with MAML

    • 本节讲解如何把MAML拓展到Imitation learning。模型的输入:t时刻的observation比如图像。模型的输出:t时刻agent的action,比如在关节上施加的力矩。demo的轨迹可以表示为   τ := {o1 , a1 , ...oT , aT } 。使用MSE作为损失函数:
    • 我们主要考虑one-shot的情况,也就是只依靠一个demo进行梯度更新。但是,我们也会使用多个demo解决语意模糊。
    • meta-training阶段,用来meta-training的数据集每个task至少两个demo。meta-test阶段,每个task只有一个demo。
    • 在meta-training阶段,每个meta-optimization步按照下述方式进行:采样一个batch的task,每个task采样两个demo。第一个demo的用法是:根据(2)式使用梯度下降计算新的 θi′ 。第二个demo的用法是:根据(1)式计算meta-objective的梯度,具体的loss使用的是(2)式。最终,θ根据meta-objective计算出来的梯度进行更新。实际上,这一对demo充当了“训练-评估对”的角色。算如下:
    • 【论文翻译】One-Shot Visual Imitation Learning via Meta-Learning_第1张图片
    • meta-training的结果应该是这样一个策略:使用一个demo就可以快速的适应一个新的任务。在meta-test阶段,从一个新任务T中采样一个新demo(可能包含之前没见过的目标),模型基于这个demo快速更新参数从而成功的适应了这个新任务。
    • 4.1 Two-Head Architecture: Meta-Learning a Loss for Fast Adaptation

      • 【论文翻译】One-Shot Visual Imitation Learning via Meta-Learning_第2张图片
      • 在标准的MAML框架中,在“前梯度更新”和“后梯度更新”中,使用的网络是相同的,都输出的是action,并且都使用标准的loss function。本文中,我们做出了这样的尝试:“前梯度更新”和“后梯度更新”依旧共用前面所有的架构,只是输出动作之前的最后一个隐藏层不再共享,而是一人一个隐藏层,称之为两个不同的“head”。【这里的pre and post gradient update stages指的到底是什么我没搞清楚】。The parameters of the pre-update head are not used for the final, post-update policy, and the parameters of the post-update head are not updated using the demonstration。But, both sets of parameters are meta-learned for effective performance after adaptation。基础版的MAML里,内循环的loss function其实是一个标准损失函数,比如MSE也就意味着内循环中函数输出的是一个action:
      • 【以下都是个人理解,非文章原话】
      • 本文中做了如下的改进,出于的是这样的思考:内循环其实的作用只是产生梯度,如果只是为了在内循环学习一个“输出动作的函数”的话,那么我把内循环的f改成这样的形式(此式和上式其实没什么太大区别,但是是在新的独立的网络进行实现和学习)。但注意,此时内循环用来更新的梯度来源于”在内循环和groundtruth作比较“,也就是说,内循环梯度产生的前提是:内循环可以接触到groundtruth:
      • 所以思考,如果只是为了产生梯度,能不能直接用“外循环和groundtruth作比较时所产生的梯度”经过BP回传到内循环的网络,此时内循环就不再需要groundtruth了。
      • 之前我们认为:“在内循环中如果学习到的参数可以使得输出的动作逼近ground-truth,那么这么这个参数对应的loss 就适合传到外循环来更新网络。”
      • 现在我们直接这样认为:“我们去掉ground-truth直接让网络自己学习一个loss function,如果这个loss 传到外循环可以有效地更新网络,那么这个loss function就是一个好的loss function。”【个人理解】。内循环的损失函数如下:
      • 那么这样做有什么好处呢?
        • 在meta-training阶段,我们依旧需要完整的“observation-action”数据来在Lv上产生梯度,并且BP到内循环。在经过多次迭代后,内循环已经产生了这么一个函数“输入observation,就可以产生合适的梯度送入外循环”。同时,在经过多次迭代后,外循环就已经收敛到一个比较适合整个任务分布的模型参数。
        • 接下来,拿到一个新任务时,我们可以使用“只有observation,没有action的”demo进行微调。过程如下:输入observation,此时内循环的loss function就可以只根据osbervation1来产生梯度,并送入外循环。外循环接收到来自内循环的梯度,推动模型的参数进行fine tunning。【我们发现,此时外循环更新参数不再需要ground-truth了!毕竟,只要有梯度,外循环的参数就可以更新,既然我们训练的内循环loss-function已经可以给外循环提供梯度了,那么我们不再需要“外循环和ground-truth做比较”从而产生梯度了!exciting!深度学习的神奇之处!】
        • 至此,我们成功的实现了“只需要observation的demo,就可以实现fine-tunning”。

这个思想还是很值得学习的,这篇文章就先读到这里,其他地方暂时不深究了。

你可能感兴趣的:(机器学习)