Press "Enter" to skip to content

Meta Learning单排小教学

虽然Meta Learning现在已经非常火了,但是还有很多小伙伴对于Meta Learning不是特别理解。考虑到我的这个AI游乐场将充斥着Meta Learning的分析解读及各种原创思考,所以今天Flood就和大家做一个Meta Learning小教学,希望能够用最简短,最通俗的语言来让大家明白Meta Learning的概念,Meta Learning的几种研究方法,以及Meta Learning未来的发展,带大家上分!相信这个Meta Learning小教学是目前全网唯一的中文教程。
当然要看懂这个小教学,大家至少要对深度学习和增强学习有一定了解。下面我们就开始吧!
1.Meta Learning到底研究什么?
要回答这个问题,我们先来问另一个问题:
Deep Learning是在研究什么?
简单一句话就是Deep Learning研究一个从x到y的映射mapping,只是这个映射函数f是用一个端到端的深度神经网络来表示:

如果是计算机视觉中的图像识别,那么x就是图片,y就是标签;
如果是自然语言处理中的文本翻译,那么x就是比如中文,y就是英文;
如果是深度增强学习中的玩Atari游戏,那么x就是屏幕画面,y就是输出的动作。
所以,我们可以看到,深度学习研究的就是通过深度神经网络来学习一个针对某一特定任务task的模型。通过大量的样本进行训练,训练完,这个模型就可以用在特定任务上。
说完Deep Learning研究什么,那Meta Learning呢?
Meta Learning研究Task!
Meta Learning的目的是希望学习很多很多的task,然后有了这些学习经验之后,在面对新的task的时候可以游刃有余,学的快又学的好!
为什么叫Meta呢?Deep Learning是在Task里面研究,现在Meta Learning是在Task外面,更高层级来研究。也就是在Meta Learning的问题上,Task是作为样本来输入的。这里我们将用Few-Shot Learning的问题加以解释。

但在此之前,我们要先从人类智能的角度,仿生学的角度说说Meta Learning的意义!
2. 为什么研究Meta Learning?
Deep Learning现在的研究,训练一个模型,都是从0开始,也就是所谓的train from scratch。但是对比一下人,我们人是从0开始学习嘛?没有,人就算是刚出生的婴儿,都已经有一套本能的智能来引导他们去学习,而之后随着人不断长大,我们就慢慢的不再从0开始学习了,都是基于我们已有的知识学习,也就是所谓的先验知识Prior。比如我们没有玩过炉石传说这个游戏,但是我们通过我们的先验知识知道这是卡牌游戏,然后我们理解了游戏规则,我们也就可以上手来玩了。所以,我们人要玩一个新游戏是非常快的,而现在Deep Learning,Deep Reinforcement Learning在做什么?在让一个婴儿从0开始学习玩游戏。这不符合现实,而实际上我们也发现从0开始学习需要巨量的时间,虽然最后学会了甚至学的比人更好,但是这很不类人,很不智能。
因此,我们的研究需要转换一下思路了,我们为什么要从0开始学习呢?我们为什么不先学习一个Prior先验知识呢?如果我们构建的深度学习系统能够学到先验知识,并且能够利用这些知识,我们就可以在新的问题上学的更快更好!那么,这个就是Meta Learning要做的事情了,非常有意义,非常符合人工智能的发展路线。更进一步的,如果我们能够实现lifelong learning终身学习,那么我们的人工智能系统就可以越来越智能了。
有了这样的背景知识,我们就更好的理解Meta Learning要干什么了?我们不是要学一个具体的模型,我们要学的是一个先验知识。这里我特别喜欢用金庸武侠的武功修炼比喻,如果说Deep Learning是学习具体的外功的话,Meta Learning我们要学的是内功。

相信大家都看过倚天屠龙记,里面张无忌自从学习了九阳神功之后,学任何武功什么太极拳,乾坤大挪移都变得特别快。Meta Learning就是我们的九阳神功。
那么从AI的发展角度看,人工智能的发展肯定是一个由外向内的过程,简单的x到y的映射这种其实一点都不知道,想想人的情感,人的思维,一句话可以解毒出无数种可能,怎么可能是简单的x到y呢? 也因此,Meta Learning是AI研究的必然趋势。
3. Few-Shot Learning,一个引子
有了上面的知识基础,我们现在就要深入一点,具体的看一个典型的Meta learning问题,也就是Few-Shot Learning少样本学习!

这里我引用了Google Brain的Hugo Larochelle的一张ppt来加以说明。我们知道一般的图像识别比如imagenet,就是给你1000个类的训练集进行训练,每一个类有600张图片,然后训练好神经网络后,我们要用1000个类里面新的图片对这个神经网络进行测试,看能够识别多好。那么Few-Shot Learning的要求就是少样本,我们希望给你5个类的训练集进行训练,每一个类只有1张或者几张图片,总之非常少,然后训练好神经网络之后,我们要用着5个类里面的新的图片进行测试,看识别效果。
那么我们直接看这个问题,肯定觉得不可能啊,只用几张图片怎么训练?不得分分钟过拟合吗?没关系,我们有Meta Learning的设定,这训练样本和测试样本都只是一个task,我们可以用很多别的task进行训练,学习一个Prior,然后我们希望在新的task上能够学出效果来。
所以就如上图所示,在Meta Learning上,我们不再直接叫train和test了,而是叫Meta-train和Meta-test。在上图中,每一行都是一个task,包含了task的train set和test set,图中展示就是所谓的5way 1shot 设定,也就是一个task包含5个类,每一个类一个训练样本,然后给你2个测试样本测试。我们可以把每一个task当做一个meta learning的训练样本。我们要通过多种task的训练,从而在Meta-test的时候也就是在新的task上取得好效果。
相信通过上面的解释,大家对于Meta Learning这个问题设定是理解的了。下面我们就来看看怎么来学这些task。
4.Meta Learning的三种解决办法
我们还是根据Few-Shot Learning的问题设定来说明怎么学。

我们看到,现在输入到神经网络的数据变了,实际上就是多了一个D_train 训练集,也就是这个task拥有的东西。这个训练集比如上面说的5way 1shot,也就是5张图片和5个对应的标签。我们希望我们的神经网络能够仅根据这几张图片得到一个针对这几张图片的神经网络,从而能够对新的样本进行识别。所以,这里就产生一个问题:
怎么使用D_train来影响我们的神经网络呢?
1)HyperNetwork 生成参数

HyperNetwork是一个蛮有名的网络,简单说就是用一个网络来生成另外一个网络的参数。那么我们这里非常直接,我们的设想就是希望用一个hypernetwork输入训练集数据,然后给我输出我的对应模型也就是上图f的参数,我们希望输出的这个参数能够使得在测试图片上取得好的识别效果。那么,有了这样设计,这个hypernetwork其实就是一个meta network。大家可以看到,本来基本的做法是用训练集直接训练这个模型f,但是现在我们用这个hypernetwork不训练了,直接给你输出参数,这等价于hypernetwork学会了如何学习图像识别,这也是为什么meta learning也同时叫做learning to learn的原因。我们通过hypernetwork学会学习。训练好了这个模型,连反向传播梯度下降都不要了,直接给你参数,是不是很酷?
那怎么训练这个神经网络呢?
这里有个所谓的episodic training!一个episode就是包含了一个task,有训练集有测试集。我们使用训练集输入到hypernetwork,得到f的参数,然后使用测试集输入到f 得到预测的标签,最后用测试集的样本标签得到模型的loss,之后就用梯度下降进行训练。所以我们可以看到,整个模型是端到端的。通过大量的episodic training,也就是大量的task进行训练,我们就可以训练出一个模型出来。
需要稍微说明一下这个task哪里来呢?我们采样出来的。比如我们给你100个类的训练样本,每一个类可能有600个图片,也就是imagenet的规模。但是我们这里不是直接batch这些样本进行训练,而是随机采样出一个task,比如选5个类,每一个类1个图片,然后再每一个类选5个图片作为task的测试集。这样采样是为了模拟meta-test阶段的task构造。

那么因为meta-train和train和乱,常常会混掉,所以大家约定俗成的把task里面的训练集称为support set,把task里面的测试集称为query set。而Meta training set和Meta test set分别直接称为training set和test set。
使用Hypernetwork在我看来是最直接表现meta learning的一种做法。但是现在实际上我们好像没有看到直接用hypernetwork做few shot learning的paper,而都是间接的使用,或者简单使用一下。具体的优缺点我们还是等下再总结。先说第二个方法。
2)Conditional Neural Network 条件神经网络

这个做法其实就是上图啦,我们直接把D_train当做条件输入到f中,那么这个f本身就变成一个meta network了。也就是条件神经网络实际上能够得到和上面的hypernetwork一样的意义。因为我们可以想,只要条件D_train变了,那么y_test肯定也就变了。所以这里就非常非常直接了。把数据全部输入进去,让神经网络自己学就行了,不外乎就是去设计一个合适的网络结构而已。那么,这里最最简单粗暴的网络结构就是SNAIL算法使用temporal convolutional network,也就是wavenet的架构:

当然,我们也可以巧妙一点的设计,比如我的relation net,不把标签y作为输入:

事实上基于条件神经网络的做法,效果是最好的。
3)MAML 基于梯度的做法
现在我们来说MAML,这个可以单独算一个不一样的做法。

这个思路只能说也太简单了,就是为什么不用D_train先用一般的监督学习方式更新一下网络,然后再使用更新参数后的f来使用D_test进行训练呢?这样的话,我们也通过D_train更新了网络了,只是我们希望我们只需用极少的step训练D_train就能使D_test取得好的效果。
所以,MAML的核心步骤就是
(1)采集Task,得到D_train和D_test
(2)使用D_train对神经网络f训练少数几步,得到新的参数
(3)利用新的参数训练D_test,然后使得梯度下降更新一开始的参数。
这里最不好理解的可能就是二次梯度了,也就是我们的目的还是要训练一开始的参数,只是中间我们要先计算梯度得到新的参数,然后用新的参数再算一次梯度,这样对于一开始的原始参数就要算两次梯度。这是MAML比较麻烦的地方,也可以认为是一种缺点。当然,现在使用Pytorch可以分分钟实现这种二次梯度的操作。
可以说MAML还是非常巧妙的,一种不一样的方法,当然了已经被Chelsea Finn发扬光大了。
5. 三种解决办法有什么优缺点呢?
下面我们来谈谈三种办法的优缺点。先说HyperNetwork生成参数的做法。这种做法最大的问题就在于参数空间是很大的,所以要生成合适的参数特别是巨量的参数其实是比较困难的,所以目前绝大多数生成参数的做法都是只生成少量参数,比如一层的MLP,或者对于参数的空间进行一定的限制,比如就在[-1,1]之间,否则空间太多,有无数种选择输出一样的结果,就很难训了。但是采样HyperNetwork又有其灵活性,意味着我们可以只更新少部分参数,而不用全部。
接下来就是条件神经网络了。这又有什么问题呢?我觉得在性能上绝对会是最好的,很直接,但是不好看,一直要拖着一个条件,网络很大。不管是生成参数还是MAML,他们的模型网络就是独立的,之后只要输入x就行了,而条件神经网络每次都要输入条件,很烦啊。
那么MAML呢?可能最烦人的就是二次梯度了,这意味着MAML的训练会很慢,那么就很难hold住大网络了。实际上MAML目前对于大的网络结构比如Resnet效果并不好。然后MAML是使用D_train的Loss来更新整个网络,对比HyperNetwork缺少灵活性。这个Loss就是最好的吗?不见得。如果D_train是无监督数据,那怎么办?所以MAML是有局限性的。
目前各种各样的Meta Learning研究,在方法论上都逃不出这三种方法。要么改改网络结构,要么结合一下上面的方法,比如先MAML再生成参数,或者hypernetwork和conditional neural network混着用等等。那么什么才是终极必杀呢?可能还是要具体问题具体看吧,对于不同的问题采用不同办法效果会不一样。这些都值得我们去探索。
6. Meta Learning的潜在威力!
讲完了前面的方法论,相信大家对于Meta Learning已经有所了解了。但是大家肯定会疑问,难道Meta Learning只是在做Few-Shot Learning这种有点boring的任务吗?
当然不是。
首先我们可以改成增强学习的task,对于增强学习的task,这里的D_train就是历史信息了:

所谓的历史信息也就是之前的transitions(state,action,reward,next_state)。把历史信息输入进去,原来的reinforcement learning就分分钟变成meta reinforcement learning啦。
那么,Meta Learning也仅仅止步于此吗?
也当然不是!
扩宽思维极限的时候到了!
谁说D_train和D_test要一样呢!!!
这才是Meta Learning最最重要的思想!一个task里面的训练集和测试集可以完全不一样。只要通过D_test的loss signal能够传递到D_train中,整个网络就可以端到端的训练。
比如D_train可以是完全的无监督数据(没有标签),那么我们同样可以构造一个hypernetwork来更新我们的模型,然后用D_test有标签的数据来训练。这样训练完之后,我们就得到了一个能够无监督学习的hypernetwork了。
实际上D_train和D_test的差异性可以进一步变大,训练可以是增强学习,测试可以是模仿学习,训练可以是语音,测试可以是图像,等等,会不会很有趣呢?
最后,我们可以举一个更形象一点的idea:比如有一个虚拟世界,里面可以生成虚拟人在里面生活,我们的train过程就是让这个虚拟人在里面爱干啥干啥,可以玩比如1年的游戏时间,然后我们的test过程要求这个虚拟人通过200的智商测试。那么通过巨量的虚拟meta training之后,我们就能得到一个这样的人工智能系统,这个虚拟人懂得自己去学习了,而我们还完全不知道他怎么学的。

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注