淘优惠

淘优惠

手把手 | OpenAI开发可拓展元学习算法Reptile,能快速学习(附代码)

热门文章 0

淘宝搜:【天降红包222】领超级红包,京东搜:【天降红包222】
淘宝互助,淘宝双11微信互助群关注公众号 【淘姐妹】


大数据文摘作品

编译:Zoe Zuo、丁慧、Aileen

本文来自OpenAI博客,介绍一种新的元学习算法Retile。

在OpenAI, 我们开发了一种简易的元学习算法,称为Reptile。它通过对任务进行重复采样,利用随机梯度下降法,并将初始参数更新为在该任务上学习的最终参数。

其性能可以和MAML(model-agnostic meta-learning,由伯克利AI研究所研发的一种应用广泛的元学习算法)相媲美,操作简便且计算效率更高。

MAML元学习算法:

http://bair.berkeley.edu/blog/2017/07/18/learning-to-learn/

元学习是学习如何学习的过程。此算法接受大量各种的任务进行训练,每项任务都是一个学习问题,然后产生一个快速的学习器,并且能够通过少量的样本进行泛化。

一个深入研究的元学习问题是小样本分类(few-shot classification),其中每项任务都是一个分类问题,学习器在每个类别下只能看到1到5个输入-输出样本(input-output examples),然后就要给新输入的样本进行分类。

下面是应用了Reptile算法的单样本分类(1-shot classification)的互动演示,大家可以尝试一下。

尝试单击“Edit All”按钮,绘制三个不同的形状或符号,然后在右侧的输入区中绘制其中一个,并查看Reptile如何对它进行分类。前三张图是标记样本,每图定义一个类别。最后一张图代表未知样本,Reptile要输出此图属于每个类别的概率。

Reptile的工作原理

像MAML一样,Reptile试图初始化神经网络的参数,以便通过新任务产生的少量数据来对网络进行微调。

但是,当MAML借助梯度下降算法的计算图来展开和区分时,Reptile只是以标准方法在每个任务中执行随机梯度下降(stochastic gradient descent, SGD)算法,并不展开计算图或者计算二阶导数。这使得Reptile比MAML需要更少的计算和内存。示例代码如下:

最后一步中,我们可以将Φ?W作为梯度,并将其插入像这篇论文里(https://arxiv.org/abs/1412.6980)Adam这样更为先进的优化器中作为替代方案。

首先令人惊讶的是,这种方法完全有效。如果k=1,这个算法就相当于 “联合训练”(joint training)――对多项任务的混合体执行SGD。虽然在某些情况下,联合训练可以学习到有用的初始化,但当零样本学习(zero-shot learning)不可能实现时(比如,当输出标签是随机排列时),联合训练就几乎无法学习得到结果。

Reptile要求k>1,也就是说,参数更新要依赖于损失函数的高阶导数实现,此时算法的表现和k=1(联合训练)时是完全不同的。

为了分析Reptile的工作原理,我们使用泰勒级数(Taylor series)来逼近参数更新。Reptile的更新将同一任务中不同小批量的梯度内积(inner product)最大化,从而提高了的泛化能力。

这一发现可能超出了元学习领域的指导意义,比如可以用来解释SGD的泛化性质。进一步分析表明,Reptile和MAML的更新过程很相近,都包括两个不同权重的项。

泰勒级数:

https://en.wikipedia.org/wiki/Taylor_series

在我们的实验中,展示了Reptile和MAML在Omniglot和Mini-ImageNet基准测试中对少量样本分类时产生相似的性能,由于更新具有较小的方差,因此Reptile也可以更快的收敛到解决方案。

Omniglot:

https://github.com/brendenlake/omniglot

Mini-ImageNet:

https://arxiv.org/abs/1606.04080

我们对Reptile的分析表明,通过不同的SGD梯度组合,可以获得大量不同的算法。在下图中,假设针对每一任务中不同小批量执行k步SGD,得出的梯度分别为g1,g2,…,gk。

下图显示了在 Omniglot 上由梯度之和作为元梯度而绘制出的学习曲线。g2对应一阶MAML,也就是原先MAML论文中提出的算法。由于方差缩减,纳入更多梯度明显会加速学习过程。需要注意的是,仅仅使用g1(对应k=1)并不会给这个任务带来改进,因为零样本学习的性能无法得到改善。

X坐标:外循环迭代次数

Y坐标:Omniglot对比5种方式的

5次分类的准确度

算法实现

我们在GitHub上提供了Reptile的算法实现,它使用TensorFlow来完成相关计算,并包含用于在Omniglot和Mini-ImageNet上小样本分类实验的代码。我们还发布了一个较小的JavaScript实现,对TensorFlow预先训练好的模型进行了微调。文章开头的互动演示也是借助JavaScript完成的。

GitHub:

https://github.com/openai/supervised-reptile

较小的JavaScript实现:

https://github.com/openai/supervised-reptile/tree/master/web

最后,展示一个小样本回归(few-shot regression)的简单示例,用以预测10(x,y)对的随机正弦波。该示例基于PyTorch实现,代码如下:

论文链接:

https://arxiv.org/abs/1803.02999

代码链接:

https://github.com/openai/supervised-reptile

原文链接:

https://blog.openai.com/reptile/


教程 | 如何在Unity环境中用强化学习训练Donkey Car


作者:Felix Yu
编译:Bing

Donkey Car是一种为模型车开源的DIY自动驾驶平台,它利用一个带有相机的树莓派单片机,让模型车可在赛道上自动驾驶,Donkey Car会学习你的驾驶方法,在训练后懂得自动驾驶。对于那些没有背景知识的人来说,该平台能提供你所需要的必要细节,它既包含硬件也带有软件。阅读完这一教程,你也可以无需硬件背景知识组装一辆自己的自动驾驶汽车。

现在,训练汽车进行自动驾驶最常见的方法就是行为克隆和路线跟随。在高级层面,行为克隆是利用卷积神经网络学习汽车前方摄像机所拍摄的图像之间的映射,并通过监督学习控制方向和油门大小。而路线跟随是利用计算机视觉技术跟踪路线,并且利用一个PID控制器让小车跟着该路线。我尝试了两种方法,它们都很有用!

用行为克隆训练Donkey Car避开障碍物

重要的一点是,Donkey Car的目标是搭建一辆在比赛中跑的最快的车(能以最快速度跑完一圈)。我认为强化学习是训练的好方法,只需设计一种奖励,让汽车的速度达到最快,并且让它能一直保持在轨道内即可。听上去很简单对吧?但事实上,很多研究表示在实体目标上训练强化学习是很困难的。强化学习主要通过试错法训练,放在汽车身上,我们只能保佑车子不会在一次次的实验中撞碎。另外,训练时长也是一个问题,通常,强化学习智能体都要训练个几百回合才能掌握些许规律。所以,强化学习很少用在现实物体中。

最近有一些科学家们研究对现实进行模拟,即先用强化学习在虚拟模拟器上训练小车,然后将其迁移到现实世界里。例如,最近OpenAI就训练了一个灵活的机械手臂,可以做出多种动作,整个过程就是在虚拟中训练的。除此之外,谷歌大脑也曾训练过一个四足机器人,可以用模拟现实的技术学习灵活的动作。在虚拟器中学习控制策略,然后再将其部署到真正的机器人上。这样看来,若想用强化学习训练Donkey Car,一个可行方案就是先用模拟器训练,再把学到的策略用在真的小车上。

OpenAI训练的机械手

第一步是先为Donkey Car建造一个高保真度的模拟器。幸运的是,Donkey Car社区里一位爱好者在Unity中创建好了一个模拟器。但是它设计的目的主要针对行为学习(即将相机中的图片保存在对应的控制角度和油门大小文件中以进行监督学习),但是和强化学习无关。我希望的是有一个类似OpenAI Gym那样的交互界面,可以用reset( )重置环境、对其进行操作。所以,我决定在现有的Unity模拟器基础上对其进行修改,让它更适合强化学习。

4.1 创建一种能用Python和Unity沟通的方法

因为我们要用Python书写强化学习代码,所以我们首先要找到一种方法能让Python在Unity环境中使用。结果我发现这现有的模拟器也是用Python代码进行沟通的,但它是通过Websocket协议进行的,Weosocket和HTTP不同,它支持服务器和客户端之间进行双向通信。在我们的案例中,我们的Python“服务器”可以直接向Unity推送信息(方向和油门),而我们的Unity“客户端”也可以反向对服务器推送信息(状态和反馈)。

除了Websocket,我还考虑使用gRPC,这是一种高性能服务器-客户端通信框架,用谷歌在2016年八月开源。Unity将其用于机器学习智能体接口通信的协议。但是它的设置有点麻烦,并不高效,所以我还是选择Websocket。

4.2 为Donkey Car创建一个定制化的环境

下一步是创建一个类似于OpenAI gym的交互界面,用于训练强化学习算法。之前训练过强化学习算法的人可能对各种API的使用很熟悉。常见的就是reset( )、step( )、isgameover( )等。我们可以将OpenAI gym的种类进行扩展,然后用上面的方法创建自己的gym环境。

最终成果能和OpenAI gym相媲美,我们科用类似的指令与Donkey环境交互:

环境同样可以让我们设置frame_skipping,并且用headless模式训练智能体(也就是无需Unity GUI)。

同时,Tawn Kramer还有3中Unity场景可用:生成道路、仓库和Sparkfun AVC,都可以用于训练。在我们开始运行自己的强化学习算法之前,我们要么自己搭建Donkey Car的Unity环境,要么下载预先搭建好的环境可执行程序。具体的环境设置和训练指导可以在我的GitHub中找到:github.com/flyyufelix/donkey_rl

4.3 用DDQN训练Donkey Car

准备好了对强化学习友好的环境,我们现在就可以搭建自己的强化学习算法啦!我采取的是用Keras书写的Double Deep Q学习算法,这是DeepMind开发的经典强化学习算法,易于测试,编写简单。我已经在OpenAI gym中的cartpole和VizDoom中测试了,所以如果有什么问题,应该是Unity环境的问题,算法没有问题。关于DQN的文章,大家可以参考我之前的博文。flyyufelix.github.io/2017/10/12/dqn-vs-pg.html

4.3.1 状态空间

我们用Donkey Car前方安装的摄像机所拍摄的像素照片,执行以下转换:

  1. 将尺寸从(120, 160)改为(80, 80


    数据科学中的6个基本算法,掌握它们要学习哪些知识

    数据科学的方法有哪些,数据科学的基础理论,数据科学基本原理,数据科学的数学基础
    晓查 发自 凹非寺量子位 出品 | 公众号 QbitAI

    如果想从事数据科学,但是又没有数学背景,那么有多少数学知识是做数据科学所必须的?

    统计学是学习数据科学绕不开的一门数学基础课程,但数据科学也经常会涉及数学中的其他领域。

    数据科学使用算法进行预测,这些算法称为机器学习算法,有数百种之多。有人总结了数据科学中最常用的6种算法,已经掌握它们分别需要哪些数学知识。

    朴素贝叶斯分类器(Naive Bayes classifier)是一种简单的概率分类器,它基于特征之间相互独立的假设,以贝叶斯定理为基础。

    贝叶斯定理的数学公式为:

    其中A、B表示两个事件,且P(B)不等于0。各个部分具体的含义为:

    1、P(A|B)是条件概率,它是事件B发生后事件A发生的概率。

    2、P(B|A)也是一个条件概率,它是事件A发生后事件B发生的概率。事件发生的可能性 发生了 是真的。

    3、P(A)和P(B)是各自发生的概率,A、B两个事件彼此独立。

    需要的数学知识:

    如果你想要了解朴素贝叶斯分类器,以及贝叶斯定理的所有用法,只需学习概率课程就足够了。

    线性回归是最基本的回归类型,它用来理解两个连续变量之间的关系。在简单线性回归的情况下,获取一组数据点并绘制可用于预测未来的趋势线。

    线性回归是参数化机器学习的一个例子,训练过程最终使机器学习找到最接近于训练集的数学函数,然后可以使用该函数来预测未来的结果。在机器学习中,数学函数被称为模型。在线性回归的情况下,模型可以表示为:

    a1, a1, ……,an表示对数据集的参数值,x1, x1, ……,xn表示在线性模型中使用的特征值。

    线性回归的目标是找到描述特征值和目标值之间关系的最佳参数值。换句话说,就是找到一条最适合数据的线,可以外推趋势以预测未来结果。

    为了找到线性回归模型的最佳参数,我们希望让残差平方和(residual sum of squares)最小化。残差通常被称为误差,它用来描述预测值和真实值之间的差异。残差平方和的公式可表示为:

    y的“头顶”加上^用来表示预测值,y表示真实值。

    需要的数学知识:

    如果你只想粗略地了解,基础统计学课程就可以了。残差平方和的公式可以在大多数高级统计课程中学到。

    逻辑回归(Logistic regression)侧重于二元分类,即输出结果只有两种情况的概率。

    与线性回归一样,逻辑回归是参数化机器学习的一个例子。因此,这些机器学习算法的训练过程的结果是找到最接近训练集的数学函数模型。

    但是线性回归模型输出的是一组实数,而逻辑回归模型输出的是概率值。在逻辑回归的过程中还会用到sigmoid函数,它会把所有值压缩到0~1的范围之间。

    需要的数学知识:

    这一部分包含的知识有指数函数和概率,你需要对代数和概率论有充分的理解。如果想深入了解,建议学习概率论、离散数学或实分析。

    神经网络是一种机器学习模型,它们受到人类大脑中神经元结构的极大启发。神经网络模型使用一系列激活单元(称为神经元)来预测某些结果。神经元将输入应用于转换函数,并返回输出。

    神经网络擅长获取数据中的非线性关系,并帮助我们完成音频和图像处理等任务。虽然存在许多不同类型的神经网络(比如卷积神经网络、前馈神经网络、递归神经网络等),但它们都依赖于转换输入生成输出的基本概念。

    在上图中,线条将每个圆圈连接到另一个圆圈。在数学中,这就是所谓的图,一种由边连接的节点组成的数据结构。

    神经网络的核心是一个系统,它接收数据,进行线性代数运算,然后输出答案。

    线性代数是理解神经网络的关键,它通过矩阵和向量空间来表示线性方程。因为线性代数涉及矩阵表示线性方程,所以矩阵是理解神经网络核心部分必须知道的基本知识。

    矩阵是由数字、符号或表达式组成的矩形阵