查看原文
其他

【综述专栏】Transfer, Life-Long, Meta Learning基础知识汇总

在科学研究中,从方法论上来讲,都应“先见森林,再见树木”。当前,人工智能学术研究方兴未艾,技术迅猛发展,可谓万木争荣,日新月异。对于AI从业者来说,在广袤的知识森林中,系统梳理脉络,才能更好地把握趋势。为此,我们精选国内外优秀的综述文章,开辟“综述专栏”,敬请关注。

来源:知乎—yearn

地址:https://zhuanlan.zhihu.com/p/270593259

主要来自Hung-yi Lee的课程加上一些自己对论文的理解

https://www.youtube.com/watch?v=7qT5P9KJnWo&ab_channel=Hung-yiLee

01

Transfer Learning
我们可用的数据与想做的任务没有直接相关
1. 数据来自同一个domain,但是数据是猫和狗,任务是老虎/狮子分类(task不同)
2. 任务相同,都是猫/狗分类,但是来源域不同(卡通与真实)
将相关方法根据任务是否有label分成四类

Model Fine-Tune

我们有target data    ,source data    ,目标数据很少,源数据很多。这种方法就是用源数据进行训练,然后在目标数据上fine-tune,因为目标数据很少,因此必须注意不要过拟合,下面是一些相关的方法
  • Conservative Training:在参数或者输出上做一些限制,比如对参数做一个    限制,或者对于相同输入保证输出尽可能的类似。
  • Layer Transfer:source data上训练好的model我们直接copy大多数层,只留下一小部分在target data训练时进行修改。那么哪些层被直接复制,哪些层继续做find-tune呢?
    • 对于语音工作而言,往往copy最后几层,因为最后几层包含着语音内容等信息,通用
    • 对于image,往往copy最前面几层,因为前几层是一些纹理,形状信息,通用。

Multi-Task Learning

希望在source和target数据集上都有很好的表现。即使任务的输入输出都不同,只要他们中间包含了类似的咨询,都可以进行multi-task learning。
经典:Progressive Neural Network:每个task训练的时候都会借鉴前面这些task模型每层的输出(也可以选择将他们的影响置为0).

Domain-adversarial Learning

这里考虑我们的source data有标签,但是target data没有标签。因此我们尽力的在feature extractor中去掉和domain相关的信息(style等与task无关的信息),这里的做法就是在feature extractor后面接一个domain classifier来判断它来自source还是target,但是存在一个问题
  • 我只要将feature vector全部固定为一个0向量你就无法正确区分他的类了,因此我们的feature extractor不仅要骗过domain的分类器,同时还要有能力判断原有的label
  • 一个目标最小化label分类损失,一个目标最大化domain分类损失,因此训练过程是不同的,因此使用了“gradient reversal layer”(乘个负号而已)

Zero-Shot Learning

Target Data是完全没有出现在source里面的,以分类问题为例,source data都是一些猫,狗之类的,但是target是分辨草泥马,这就很强人所难,毕竟model甚至连草泥马都没有见过
我们如是处理:将每一类object表示为它们的属性,我们需要让属性和类之间形成one2one mapping,因此训练的时候我们不再直接输出类别,而是输出他拥有哪些属性,然后对于属性,我们查表看他和哪个最接近。
  • Attribute通常维度很大,我们可以用NN做attribute的embedding   
  • 然后我们的model输出image的embedding    ,映射到想同维度才可以做比较。
  • 训练目标:  越接近越好,那么是下述形式吗?   ,No!model会把所有x和y都投影到相同的vector,因此还需优化成如下形式   ,这一项损失不为0时,意味着    ,即类内距离还不类间距离+k小,因此需要惩罚。

Zero-Shot Learning 2:Convex Combination of Semantic Embedding

这里完全不需要上面的属性之类的映射,我就输入img,输出预测标签,然后根据输出概率将预测标签的word vector(可以看作是上面的属性embedding)进行加权求和,得到的word vector在latent space里找距离最近的就是相应的类别。


02

Life-Long Learning
等价名称:Continuous Learning, Never Ending Learning, Incremental Learning.
可以看到我们目前的NN都是针对特定任务的(即使是multi-task的架构,每个task也是会有不同分支的),但是作为一个human being,我们的学习过程并不是这样的,人类都是在不断地学习的。因此我们希望机器也能做到这一点,通过不断的学习不同的任务,提升自己的能力,最后达到机械生命的层次。
为了达到这个目标,我们必须解决很重要的三个问题,下文将通过描述这三个问题以及解决方案来达到对Life Long Learning的理解

Problem 1: Knowledge Retention

如果你先用一个做segment的task,然后再用他做detection的task,当他detection性能很好时很可能segment的性能已经大不如前了,即机器的很容易忘记已经学到的知识。比如给定如下两个任务,如果我们先学T1再学T2,T1就会掉的很惨,但是如果把数据集combine起来效果又很好,也就是说Model明明是有能力把两个task的解法都记住的,但是不知道为什么他会选择性的遗忘,这种遗忘是灾难性的,称之为Catastrophic Forgetting。
这时你可能会说,那我直接multi-task learning不就可以了,那考虑我们有1000个任务,就需要把1000个任务的资料同时放在内存里(Storage Issue),并使用所有的这些数据进行训练(Computation Issue),因此我们需要一种方法,使得机器不需要看到以往已经学到的task,只关注当前的task,而之前学到的知识又不会被遗忘(从这里可以看到multi-task learning其实是life-long learning的upperbound)。

经典解法:Elastic Weight Consolidation(EWC)系列[1]

基本思路:有一些参数对过去的task是非常重要的,我们对当前的task,只改变不重要的参数,保证过去的知识不被遗忘。设    是已经学到的参数,每个参数    都有一个守卫    ,告诉我们这个参数有多重要!然后损失函数就变成了
也即我们不仅希望把当前的任务学好    ,也希望和之前的参数差距不要太大    ,可以看作一个正则化项。一个可视化的做法如下:当我在task 1找到误差的较小值    然后每个参数对Loss的梯度都可以得到计算,对于梯度很大的参数我们会给他一个比较强的参数,训练新的task时就要避免在    方向的巨大改变。使用不同的    就构成了不同的paper。
除此之外,既然不能完整地保存历史数据进行multi-task learning,那么可以生成模型生成过去task数据来进行联合训练(避免了全部存储的内存负担),也有一些研究当不同task输出形式不同的问题。

Problem2:Knowledge Transfer

这被称作触类旁通,与每个task对应一个model相比,我们希望model再学习了一个任务之后对其它任务的学习也有所帮助。这与Transfer Learning的最大不同之处在于Transfer learning在学习了Task 1之后,关注的是他是否能在Task 2上取得很好的效果,但是他并不关注学习了task 2后机器在原有的任务上的性能,因此transfer learning可以看作是life long learning的特例。
举一个可以触类旁通的work为例

Gradient Episodic Memory(GEM)[2]

限制梯度来提升之前任务的性能。保存过去任务的一小部分数据(对比其他方法有些不公平),计算出当前任务的gradient    以及过去任务的更新梯度    ,尽可能保证梯度更新不会使得过去任务的性能下降(即当前任务梯度与历史任务梯度点积大于等于0).

Problem 3:Model Expansion

任务太多了,Model真的没能力再学了,即使multi-task一起学都不行。那么我们能不能设计一个model可以自动进行扩张(当model能力不足时进行神经元的扩充),当然这种扩充必须是高效的(至少model的增长速度比任务增加的速度来的慢)。

Net2Net[3]:如何改变网络结构而不改变之前学到的知识

简单的将神经元分裂为两个,input都是    ,但是输出变为1/2,但是这样两个neural完全一样,没啥作用,因此需要添加一些noise,但是需要注意的是,不是每进来一个task就做expand,而是task进来后发现loss降不下去或者准确率提不上去才会进行拓宽操作。

Problem 4:Extra Problem:Curriculum Learning

task之间的顺序仍然是一个非常重要的问题,同样是mnist数据集,调换任务的顺序会造成非常大的差别,因此让机器先学哪个任务,再学哪个任务是非常重要的(一般是从易d)。

Meta Learning: Learn to Learn

与Life long learning相似的地方在于,这里都是不断的学多个任务,不同之处在于
1. Life-Long Learning关注的是在各个任务上的表现,是使用同一个模型不断进行学习,希望这一个model在各个task都有很好的表现。
2. Meta-Learning对不同的任务有不同的模型,我们希望在训练过程中机器能学到一些东西使得它在未来要train新模型的时候可以训练的更快更好。
将其与传统的Machine learning相比较
1. Machine Learning:根据数据找一个函数    的能力    ,    可以是CNN的参数,即输入数据,输出预测值。
2. Meta Learning:根据数据找一个    ,    可以从数据中挖掘函数    做特定任务。即输入数据,输出模型。
如果模型是NN,那么就是如下形式
那么可以看到,除了寻找的函数功能不同外,meta/machine learning其实并无太大差别,因此他也可以通过传统机器学习的三个步骤来进行设计
  • 先定义一组学习的algorithm
  • 定义learning algorithm的损失函数,告诉你哪个algorithm更好
  • 然后我们选择最好的algorithm就得到了   

1-如何定义一组learning algorithm

对于NN来说,网络架构,初始化,梯度更新的学习率都可以看作是  的参数,不同的参数就对应了不同的learning algorithm。

2-如何评价一个learning algorithm的好坏

我们使用    得到模型    ,然后就可以评估    的好坏,当然我们的    可能恰好就很会解某一类任务,因此我们需要多个task进行测试,假如我们有    个task,我们分别从他们各自的train数据集得到    ,然后在test数据集得到损失    ,将他们全部加起来就得到了学习算法    的损失,    .
至于说选择最好的algorithm就是不断优化这个损失函数了


03

Meta-Learning 数据集准备
元学习与传统机器学习一个非常不同的地方,也是我个人觉得比较难以理解的地方就是他数据集的设置,只有真正了解了meta learning是做什么的,才能理解为什么数据集划分成这种形式。传统机器学习就直接一部分做train集一部分做test集。而meta learning的数据分割方式如下,
1. 训练集分成    个task,每个task有一个训练集和一个测试集(因为我们需要在各个任务上使用    找到合适的algorithm然后使用各自的测试机评估    )。
2. 测试集就是一个单独的task,当然要和训练集中的任务不太一样。
meta learning常常与few shot learning一起考虑,因为在训练    的时候,对每个task都必须走完训练,测试的流程,因此数据量必须是不大的,一般可能也就几张image或者几十,称得上是few-shot了。而在few-shot learning中,每个人物的训练集称为Support set,测试机称为query set。

Popular benchmark

如果我要做    way    shot,就是    个类,每个类有    个样本。我们希望meta learning能够在样本很少(每类K个)的情况下,就能学到一个    ,从而产生对分类任务最优的model。具体来说,我们先将整体数据集分为训练集(1200 characters)和测试集(其余characters)随机抽取    个不同类的character,每类抽取    个样本作为meta-learning的训练数据。

MAML[4]: Model Agnostic Meta Learning

MAML是为了学到一个更好的初始化参数,因此每个task学到的model都和初始化有关,且过程中唯一不同且需要改进的地方就是模型初始化的部分,因此每个model的参数    依赖于    。
那么我们只需要能够计算    对损失函数的梯度,就可以使用梯度下降进行优化了,即
  
这里有必要讨论一下他和传统的model pre-training的差别,后者直接优化损失函数    ,即    作为模型的参数,直接优化模型的性能。而meta-learning不同,    会影响模型的参数,但模型最终的表现还是由    决定的,因此meta-learning并不局限于模型目前的表现,而是想找到一个如何得到更好的model的方法。这也是为什么meta-learning称为learn to learn。
在实作的时候,训练集上每个task只能update一次参数,即计算一次梯度之后得到的    就当作model的最终参数了。理由如下
  • 为了更快,因为数据集很大,task很多,每个task训练一次用的时间也不算短了。
  • 我们就希望model这么牛逼,只用更新一次就能效果很好。
  • 测试的时候update多次都可以的,因此性能还有提升。
  • Few-Shot learning每个类样本比较少,更新多次容易过拟合。
Reptile[5]:On First-Order Meta-Learning Algorithms
reptile是进化版的MAML,用一张图表示他们的差距,pretrain就是在当前model性能提升最大的方向进行一步初始化值的更新,而MAML使用初始化值    对model进行两步更新,取第二步的方向作为    更新的方向。Reptile则是使用    对model进行多步更新,取从原始的    到最终参数位置的方向为    的更新方向。
上图可以看但,pretrain确实是最菜的那个。

More。。。

不仅有工作研究如何优化初始化参数,也有优化网络架构,优化更新方式的方法等。
我们之前研究了如何为model优化初始化参数,但是优化过程也需要初始化参数,这个初始化依然需要去learn,这就造成了俄罗斯套娃的现象,learn to learn to learn to...

Metric Based-Learn to compare

Siamese Network:N-way K-shot的基于度量学习的元学习,每个类N张图片,计算test数据和哪一个最像(属于他们哪一类)。
Relation Network:相似度计算进行了修改,使用    进行计算。
Imaginary Data:使用生成器生成更多的相关图片进行训练,联合训练
参考

1. https://www.pnas.org/content/114/13/3521

2. https://arxiv.org/abs/1706.08840

3. https://arxiv.org/abs/1511.05641

4. https://arxiv.org/abs/1703.03400

5. https://arxiv.org/abs/1803.02999

本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。


“综述专栏”历史文章


更多综述专栏文章,

请点击文章底部“阅读原文”查看



分享、点赞、在看,给个三连击呗!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存