「元学习」解析:学习如何梯度下降与学习新的算法
来源:AI科技评论
作者:Cody Marie Wild
原文地址:
https://towardsdatascience.com/learning-about-algorithms-that-learn-to-learn-9022f2fa3dd5
编译:MrBear
编者按:Cody Marie Wild,一位机器学习领域的数据科学家,在生活中还是名猫咪铲屎官,她钟爱语言和简洁优美的系统。在这篇文章中,Cody 介绍了元学习的基本概念和方法类别,讨论了「元学习」到底在学什么、又有哪些限制。
当我第一次听到「元学习」的时候,它的概念是如此地令我沉醉:这个项目要构建不仅能够进行学习的机器,这些机器还能学习「如何学习」的方法。
理想的元学习算法应该能够根据反应其性能的信号去修改它们的基本结构、参数空间,或者能够在它们面对新的环境时利用它们之前积累起来的经验。
简而言之:当未来主义者憧憬着通用强人工智能时,符合这种描述的组件就是这个愿景必不可少的组成部分。
本文的目的在于从这些高屋建瓴的概念慢慢落到实处,从我们所想象的那些抽象的能够自我修改的智能体可以做的事开始,一直到这个领域的现状,来讨论这个领域的成功、它的局限性,以及我们距离鲁棒的多任务人工智能还有多远。
为什么人类可以做到我们习以为常的事?
具体而言:在许多强化学习任务中,相对于人类而言,算法需要花费长得多的时间去学习任务;目前最先进的能够玩 Atari 游戏的算法需要花 83 个小时(或 1800万帧)的游戏时间才能达到人类的平均表现,大多数人在玩了几个小时游戏之后就能达到这个水平。
图1 该图来自最近的 Rainbow RL 的论文
这种差异导致机器学习研究人员提出这样的一个问题:人类大脑在这样的任务体现了什么样的工具和能力,我们如何能够用统计学和信息论的方式理解这些工具呢?
具体来说,元学习的研究人员所追求的策略似乎可以分为两类,它们大致可以和下面两种人类认知「什么是工具」的理论相对应。
学到的先验知识:从这一点看,人类可以很快地学习新的任务,因为我们可以重复使用我们已经在之前的任务中学到的信息。比如直觉上物体如何在空间中移动的物理特征,或者在一个电子游戏中死掉会降低奖励的元知识。
学到的策略:这种思路是,在我们的生活中(或许在进化的过程中),我们不仅仅收集对象级别的关于世界的知识,而且还建立了一个更高效的神经结构,这种结构使得我们即使在非常新的环境中也能接受输入,并且准确地将其转化为输出或者策略。
现如今,很明显,这两个观点并不是相互排斥的,而且这两者之间甚至并没有一个硬性的、快速区分它们的边界:我们与世界互动的一些硬编码策略可能是基于对世界的深刻的先验知识,正如事实上(至少对于所有与这篇博文相关的目的而言)世界有一个因果结构。
即便如此,我觉得这两个想法的区别足够大,值得我们将它们分到这两个标签之下,并且将他们看作一个平面上的 x 和 y 坐标。
别忘了我们的小(单)样本学习(one-shot learning)
在正式研究元学习之前,了解一些与单样本学习相关的概念基础是十分有用的。如果说元学习的问题在于「如何建立一个能快速学习新任务的模型」,那么单样本学习的问题则是:我们如何建立一个模型,它能够在只看到某个类别的一个示例后,就能够学习如何去对这个类别进行分类。
现在,我们不妨思考一下,从概念层面上说,是什么让单样本学习如此困难。如果我们试着只用某一个类别的一个样本数据上训练一般性的模型,这几乎必然会产生过拟合。
如果一个模型仅仅能得到一个手写数字的数据,比方说「3」,它不会知道一张图片可以经过怎样的像素变化之后还能在本质上是一个「3」。
例如,如果这个这个模型仅仅看到了一组数字中的第一个「3」,他如何能知道第二个「3」也是同种数字这样的先验呢?从理论上讲,我们感兴趣的类别标签在网络学习中与构成它的线条的粗细情况可能相关吗?
对于人类来说,这似乎是很愚蠢的想法,但是由于我们只有一个「3」的示例,网络需要进行的推断并不简单,所以这也不失为一种有效的尝试。
更多的数字「3」的示例有助于解决这个问题,因为我们可以了解图像的什么特性决定了它是「3」:主要是垂直方向上存在的两个凸形。以及了解什么样的修改是无关紧要的:线条的粗细、角度的锐度。
为了成功地进行单样本学习,我们必须激励网络去学习什么样的属性能够在不给出每个数字所允许的具体的变化的情况下,泛化性地将一个数字和另外的数字区分开来。
在单样本学习中,一个常见的技巧是学习一个嵌入空间,在这个空间中计算两个样本的表示之间的欧式距离,这是一种很好的计算两个样本是否属于同一类的方法。从直觉上来说,这需要学习在这个分布中总体来讲可以使得类别间的差异最强的内部维度,并且学习如何将输入压缩、转化成最相关的维度。
我发现,首先考虑这样的问题是一个很有用的基础。我们并非试图学习如何总结各种不同的类之间共通的信息和模式,而是试图学习一组任务中的总会存在的规律,并且每个任务都有自己的内部结构或者目标。
如果要我以从低到高的抽象程度为标准对神经网络的元参数进行排序,排序结果应该如下:
1.一个能够通过超参数梯度下降法学习到完整的任务分布上的数据表示的网络。MAML 和 Reptile 就是一个这样做的很通俗易懂的例子。而共享层次的元学习也是一种有趣的方法,它将学习数据表示作为被一个主策略控制的显式子策略去学习。
2.一个能够学着去优化自己的梯度下降操作的参数的网络。这些参数包括:学习率、动量、自适应学习率算法的权重。在这里,我们开始沿着修改学习算法本身的道路前进,但是我们的方法是有限的、参数化的。这就是《Learning to Learn by Gradient Descent by Gradient Descent》(https://arxiv.org/abs/1606.04474)一文所做的工作。
3.一个能够学到本身就是神经网络的内循环优化器的网络。也就是说:在这里,梯度下降算法被应用于更新神经优化器网络的参数,使其在各项任务中运行良好,但是每个任务中输入数据到输出预测的映射是完全由网络进行的,没有任何显式的损失或者梯度计算。
这就是 RL2(https://arxiv.org/abs/1611.02779)和 A simple neural attentive meta learner (https://openreview.net/forum?id=B1DmUzWAW) 的工作方式。
为了使本文不那么庞大,我将主要关注 1 和 3,以说明这个连续的概念谱的两端。
其它名称的任务
此外还有一个小问题,最后一个......我保证!我希望能够澄清一个令人困惑的话题。通常,在关于元学习的讨论中,你常常会看到「任务分布」的概念。你可能会注意到这是一个定义不明确的概念,是的,你是对的!似乎没有一个明确的标准来判断什么时候一个问题是一个任务,或者一个任务分布。
例如:我们是否应该把 ImageNet 看作一个任务——物体识别——或者多项任务:在一个任务中区分狗,在另一个任务中区分猫。为什么将玩 Atari 游戏视为一个单独的任务,而不是将游戏中的各个关卡分别作为多个任务?
我已经能从这一切描述中总结出来的是:
「任务」的概念与「我们建立了什么样的数据集」这两个概念是纠缠在一起的,因为我们会很自然地把学习一个数据集作为一个单一的任务
对于任何给定的任务分布,其中的任务之间的差异可以是非常明显的(例如:任务分布中的每个任务都在学习一个不同振幅的正弦波 vs 任务分布中的每个任务都在玩不同的 Atari 游戏)
因此,我们不应该直接说「噢!这个方法可以泛化到<这个任务分布的样本上>,这说明它能够泛化运行在一些任意的不同的任务分布上。」从方法的有效性上说,这当然不是一个不好的证据,但是我们确实需要批判性思考,去考虑:为了在所有的任务上表现出色,网络需要多大的灵活性。
那些以动物命名的令人费解的名字
在 2017 年初,Chelsea Finn 和来自加州大学伯克利分校的团队发布了一项被称为「MAML:模型无关的元学习」的技术(https://arxiv.org/abs/1703.03400 )。
如果你认为这个笑话不是有意为之的,那么请看一下论文中的「MAML 物种」一节。
在学习策略和学习先验之间,这种方法倾向于后者。这个网络的目标是训练一个模型,对于一个新任务只需要做单步梯度更新,就可以很好地在这个任务上进行泛化。伪代码大概长这个样子:
1.随机初始化一个网络的参数,把这组参数记为 theta。
在一个任务分布 T 中选择一些任务 t。使用训练集中的 k 个(k通常在 10 左右)样本,在当前参数集所在的位置执行一个梯度步,你将得到一组最终的参数。
2.在测试集上评估使用最终这组参数的模型性能。
3.然后,求模型执行任务集 t 的性能关于初始参数 theta 的梯度。然后根据这个梯度更新参数,接下来回到第一步,使用刚刚更新的 theta 作为这一轮的初始 theta 值。
4.这是在做什么呢?从一个非常抽象的层面上讲,这是在寻找参数空间中的一个点,这个点对于任务分布中的许多任务来说,在期望上是泛化最好的那个点。你也可以认为这就像迫使模型在对参数空间的探索中维持了一定的不确定性和保守性。
简而言之:一个认为它的梯度能完全表示整体分布的网络,可能会陷入一个损失特别低的区域,MAML 更容易被激励去找到一个靠近多个损失函数的「峡谷」尖点的区域,这些「峡谷」在所有的任务上的期望损失都相当低。正是这种对于保守性的激励使 MAML 不会像那些一般通过少量来自新任务的样本训练的模型一样过拟合。
2018 年初,OpenAI 又发表了一篇名为 Reptile 的论文(https://arxiv.org/abs/1803.02999)。正如你可能从它的名字中猜到的那样——使用了早先的 MAML 的方法起名。Reptile 以 MAML 为前提,但是找到了一种更高效的循环计算更新初始参数的方法。
MAML 需要显式地计算在初始化参数 theta 下运行的测试集损失的梯度,Reptile 则仅在每项任务中执行了几步 SGD 更新,然后用更新结束时的权重和初始权重的差异,作为用于更新初始权重的「梯度」。
这里的 g_1 代表了为每个任务只执行一次梯度下降步得到的更新后的梯度
从直观上说,这项研究能运行出任何结果都非常奇怪,因为简单的说,这看起来和在将所有任务合并而成的一个任务上对模型进行训练没有任何不同。然而,作者认为,由于对每个任务都使用了 SGD 的多个步骤,每个任务损失函数的二阶导数都被影响了。为了做到这一点,他们将更新工作分解为两部分:
第一项:促使结果趋向「联合训练损失」,也就是说,如果你仅仅使用合并的任务作为数据集,训练会得到什么样的结果。
第二项:促使初始化参数趋向于一个点,在这一点,后续的 SGD mini-batch 的梯度都是接近的:也就是说,各个 mini-batch 之间的梯度差异很小。作者推测,这一项能够使得训练时间更快,因为它促使模型在每个任务上都处于一个稳定、低反差的训练区域。
我选择 MAML/Reptile 的组合代表事物的「学习到的先验」,因为从理论上讲,这个网络通过对学习内部数据表示取得了成功,这些数据表示要么有助于对全部的任务分布进行分类,要么在参数空间中与普遍使用的数据表示相接近。
为了进一步明确这一点,请看上图。上图对 MAML 和一个预训练网络进行了比较,这两个网络都用一组由不同相位与振幅组成的正弦曲线组成的回归任务进行训练。
这之后,两个网络都针对新的具体任务进行了精细调节(fine-tune):如红色曲线所示。紫色三角的代表寥寥几步梯度步中使用的数据点。
与预训练网络相比,MAML 学到了例如——正弦曲线具有周期性结构:在 K=5 时,它可以在没有真正从空间的这一区域观察到数据的情况下快得多地将左边的峰值移到正确的地方。
虽然说很难判断我们的解释是不是与底层发生的情况完美地相匹配,但我们不妨推测: MAML 在算出两个相关正弦曲线不同之处——相位和振幅——方面做得更好,同时也能更好地从给定的数据中学到它们的数据表示。
一直下降的网络
对一些人来说,他们使用已有的、像梯度下降这样的算法,来对全局先验进行学习。但谁说我们以往设计的算法就是最高效的呢?难道我们不能学到更好的方法吗?
这就是 RL²(通过慢速增强学习进行快速增强学习)所采用的方法。这个模型的基础结构是循环神经网络(具体来说,是一个 LTSM 网络)。因为 RNN 有储存状态信息的能力,并且给出不同输出,这些输是该状态的函数,所以理论上它们可以学到任意可计算的算法。
换而言之,它们都具有图灵完备的潜力。以此为基础,RL² 的作者设计了一个 RNN,每一个用于训练 RNN 的「序列」事实上都是一组具有特定 MDP(MDP = Markov Decision Process,马尔科夫决策过程。
基于这个解释,你只需将每次 MDP 看作定义一系列可能动作并且在环境中对这些动作产生奖励)的经验片段。接着,会在许多序列上训练这个 RNN,像一般的 RNN 一样,这样就会对应多个不同的 MDP,并且 RNN 的参数会被优化,使得找所有序列或试验集合中产生的负反馈(regret)较低。
负反馈(regret)是一个可以捕获你一组事件中所有奖励的度量,所以除了激励网络在试验结束时得到更好的策略之外,它还可以激励网络更快地进行学习,以致于网络会在低回报的策略中更少地使用探索性动作。
如图所示,这是运行在多重试验上的 RNN 的内部工作机制,对应多个不同的 MDP
在试验中的每一个点,网络采取的动作都是一个以从都个任务中学到的权重和隐含状态的内容为常数的函数,隐藏状态的内容是作为数据的函数进行更新并用作动态参数集合。
因此,RNN 在多个任务中学习到了如何更新隐含状态的权重,以及控制如何利用隐含状态的权重。然后,在一个给定的任务中,隐藏状态可以描述网络的确定性、当前应该继续探索还是利用学到的信息,等等,作为它在这个特定任务中看到的数据的函数。
从这个意义上讲,RNN 这种学习算法决定了如何最好地探索空间、把什么样的策略看作最佳策略,而且通过学习使该算法在一组任务分布上得到很好的效果。该作者把 RL² 的架构和专门对任务进行过渐进优化的算法进行了对比,RL² 取得了与其相当的性能。
我们能对此进行扩展吗?
本文只是对该领域一个非常精炼的简介,我确信我忽略了一些想法或者概念。如果你需要其它(更明智的)的观点,我强烈推荐这篇 Chelsea Finn 的博客,Chelsea Finn 是 MAML 论文的第一作者。
过去的几周中,我试着从概念上对这些文章进行压缩,并产生一个能够普遍解释这些文章的理解,在这个过程中我想到了一系列一般性的问题:
这些方法该如何被扩展到更多样的任务?这些文章大多是在多样性较低的任务分布中对概念进行了验证:具有不同参数的正弦曲线、参数不同的吃角子老虎机、不同语言的字符识别。我认为,在这些任务上性能好并不是显然能在复杂程度不同、模态不同的任务上得以泛化,例如图像识别、问答和逻辑谜题结合的任务。然而,人类的大脑确实从这些高度多样化的任务中形成了先验,可以在不同的任务中来回传递关于世界的信息。我主要的问题是:只要你投入更多的单元计算它们,这些方法在这些更多样的任务中是否会像作者们宣称的一样有效?或者,在任务多样性曲线上的某一点上,是否存在一种非线性效应,使得在这些低多样性的情况下起作用的方法在高多样性问题中并不有效。
这些方法在多大程度上依赖于大量计算?这些文章中的大部分都使用小型简单的数据集的部分原因是,当你每训练一次,就会涉及一个内部循环,这个内部循环则包含(有效地)用元参数效果相关的数据点训练模型,以及测试,这都是需要耗费相当大时间和计算量的。由于现在摩尔定律似乎渐渐失效,在 Google 以外的地方研究这些算法的实用版本的可能性有多大?在这种情况下,每个内部循环对一个难题进行迭代可能要花费数百个小时的 GPU 时间。
这些方法与寻找能显式地对这个世界的先验进行编码的思路相比如何呢?语言是人类世界的百宝箱中一个十分有价值的工具。以机器学习的话来说,基本上是是将高度压缩的信息嵌入我们知道该如何在概念上进行操作的空间中,我们可以将这些信息从一个人传递给另一个人。没人可以独立地从经验中提取出所有这些知识,所以除非我们弄清楚如何做出与这些学习算法相似的事,不然我怀疑我们是否真的可以整合关于世界的知识,建立解决问题的模型。
*推荐文章*
CVPR 2018 | 腾讯AI Lab、MIT等机构提出TVNet:可端到端学习视频的运动表征
不用地图如何导航?DeepMind提出新型双路径强化学习「智能体」架构
PS.极市平台正式启动了极市原创作者计划。欢迎各位的高质量的视觉方向的原创投稿文章,我们将不遗余力得在我们所有的平台上进行传播分享。更多详情请点击:活动 | 加入极市原创作者行列,实现一个小目标