Meta Learning 单排小教学
Yixin Lv4

大家好!欢迎来到 FloodSung 的 AI 游乐场!

虽然 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 之后,我们就能得到一个这样的人工智能系统,这个虚拟人懂得自己去学习了,而我们还完全不知道他怎么学的。

So, this is 

Meta

Learning!

The Future of AGI!

  • Post title:Meta Learning 单排小教学
  • Post author:Yixin
  • Create time:2023-02-01 17:08:21
  • Post link:https://keep.xpoet.cn/2023/02/01/simpread-Meta Learning 单排小教学/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
 Comments