Life Long Learning机器终身学习


Life long learning又可以叫做终身学习;对于人类自身而言,我们每次都是用同一个脑来学习机器学习的每一堂课,每次的作业也都需要训练不同的神经网络,那么我们可不可以每次作业都使用同一个神经网络呢?

life long learning可简称为LLL,也可被称作Continuous Learning, Never Ending Learning, Incremental Learning;

我们可以让机器先学会task 1,再学第二个任务task 2,这时机器就学会了2项技能,……

那么要让机器学会这么多的技能,到底要学会什么样的技能呢?

主要有以下三点:

  • Knowledge retention,即怎么样让机器把学过的东西记下来,
  • knowledge transfer,
  • model expansion,

Knowledge Retention

Example – Image

现在有一个2层的network,每层都50个neural,我们希望这个network可以学习这两个task,task 1和2都是关于手写数字识别的,但task 1的数据加上了一些杂讯;

先用task 1的训练数据来对network进行训练,训练完成后,再分别对两个task的测试数据进行测试,task 1的测试数据得到了90%的准确率,而task 2的测试数据得到了96%的准确率;虽然network并没有看到过task 2的训练数据,但由于task 1和2是很接近的,因此学习到的东西可以transfer到task 2上,network在task 2的数据上也表现得很好;

如果现在把task 1训练好的参数作为task 2的network的初始值,再用task 2的训练数据继续训练下去,训练完成后,分别在task 1和2的测试集上进行测试;task 2的准确率上升到97%,但却忘记了task 1要怎么做,task 1的准确率下降到80%;

现在我们可以让task 1和2同时进行学习,即把这两者的训练资料都混合到一起,可以发现学习的效果还不错,在task 1上的准确率是89%,在task 2上的准确率是98%;

两个任务同时学习的效果还不错,但这两个任务分开学习,就会忘记之前学习过的内容。

Example – Question Answering

再举一个知识问答的例子;给出一个document,根据这个document来回答提出的问题;这里用到的数据集是bAbi,一共包括20个不同类型的问题;

现在就有两个选择,这20个task分开进行训练,也可以把这20个task同时训练

如果我们选择分开训练,先训练task 1,在训练task 2,……;每个task训练完,我们都来观察题型5(who)正确率的变化,在题型1,2,3,4上正确率都很低,在题型5上正确率就突然到了100%,但做完题型6后,又不会做题型5了,忘记了之前学习的结果。

如果我们选择把所有题型的数据进行混合,只用一个network,来一起训练,可以发现结果正确率还不错。

Multi-task training

我们可以把所有任务的训练数据都进行混合,再输入数据network进行训练;这种训练方式就不会忘记之前学过的东西;

但这种学习方式会出现一个新问题,我们之前已经把999个task的数据进行混合,也把这个模型训练好了;但现在来了一个新的task 1000,如果还使用这种训练方式,我们就必须把前面999个task的训练资料一直保存,再将1000个task的数据重新混合,重新进行训练;

那么我们可不可以通过一种方式,使机器不要重新读取之前的任务数据,就可以保存机器过去学过的东西,这也就是life long learning要探讨的问题;

Elastic Weight Consolidation (EWC)

我们可以通过一种经典的解法,EWC来解决这个问题;有一些weight对上一个task是非常重要的,如果这些weight发生了变化,机器就会忘记过去的任务要怎么做了;我们可以把这些重要的参数保护起来,只改变那些不重要的参数。

$\theta^b$表示前面任务学习完的模型参数,其中的每一个参数$\theta_i^b$都有一个guard $b_i$,来说明这个参数的重要性;

现在我们就有了一个新的loss function $L’(\theta)$,

如果$b_i=0$,那么参数$\theta_i$就可以不受任何的限制,可以任意调整$\theta_i$的值;

如果$b_i=\infty$,就表示$\theta_i$已经被强烈地保护起来了,不可以对$\theta_i$的值进行变化。

loss function中的$\sum b_i(\theta_i-\theta_i^b)^2$表示一种正则化,由于$b_i$的存在,我们希望$\theta_i,\theta_i^b$之间的距离有时候越近越好,有时候什么距离都可以。

我们再举一个具体的例子来叙述EWC。

下图表示有两个task,参数分别也只有两个$\theta_1,\theta_2$,颜色表示error surface的变化,颜色越深,表示loss越小;

假设task 1之前没有其他的训练任务,在训练task 1时,首先进行随机初始化,初始参数$\theta^0$在途中所示位置,沿着梯度下降的方向走,到了$\theta^b$;

现在进行task 2的训练,把$\theta^b$的值复制到task 2上,沿着梯度下降的方向走,走到loss最小的地方,到了图中$\theta^*$的位置;

这时我们会发现task 2的学习结果完全忘记了task 1,现在的$\theta^*$会得到很高的loss。

在使用EWC之后,我们会为每个参数设置一个$b_i$,不同文章有不同的做法;一个比较简单的做法是,算每个参数的二次微分,得到下图中右边的曲线图;

在task 1上,对于其中的一个参数$\theta_1$,其值对loss的结果影响不大,我们可以把$b_1$设置为一个很小的值;但$\theta_2$的变化对loss的影响就很大,就必须要给$\theta_2$一个很大的$b_2$,在下一个task时,就尽量不要对这个参数进行变化。

我们再来看task 2,现在参数移动的方向就发生了变化,为了保证不对$\theta_2$进行变化,task 2的参数更新方向只能是水平的,只改变$\theta_1$的值,不改变$\theta_2$的值。如果在这个方向进行变化,就算我们训练好了task 2,也不会对task 1的精确度造成太大影响。

这是原论文中的训练结果,

还有一些最新的研究,

Generating Data

在进行multi-task learning时,既然memory是有限的,那么我们可不可以训练一个模型,来产生以前的训练资料呢?

实际上是可以的,首先需要训练一个generator,来生成task 1的训练数据,那么现在就可以丢掉task 1的数据;接下来就可以把task 1和2的训练数据进行混合,一起学习出新的模型

但generator生成一些很高清的图像,是有很大难度的。

Adding New Classes

对于之前我们叙述的任务,都是网络结构不需要调整的;如果现在有一个任务是进行10个类别的分类,另一个任务是进行20个类别的分类,就需要修改网络的结构,下图展示了一些修改网络结构的方法;

Knowledge Transfer

我们希望机器不仅能记住knowledge, 还可以把不同任务之间的knowledge进行transfer;

如果对于每个task,我们都单独学习一个模型,就不会遗忘过去训练的模型了;但这种做法没有考虑不同模型之间的knowledge的转换,而且我们并不能把所有的模型都存储下来。

Life-Long v.s. Transfer

transfer learning是先训练好一个模型task 1,在进行fine-tune得到另外一个模型task 2,并不会再重新回去学习task 1;

life long learning比transfer learning多考虑了一步,希望不忘记过去学到的东西。

Evaluation

下面我们介绍如何来对life long learning进行评价,评价的方式有很多种,这里只说一个大概的方向。

一般都会画一个矩阵出来,纵轴表示在task上的performance,第一行表示学完task 1之后,在每个task上的performance;其中$R_{i,j}$表示在训练完task i之后,在task j上的performance;

如果$i>j$,表示在训练任务i之前,已经学完了第j个任务,$R_{i,j}$则表示学任务i之后,之前的任务j到底忘记了多少;

如果$i<j$,表示机器学习了第i个任务,但还没学到第j个任务,$R_{i,j}$则表示前i个任务能不能transfer到第j个任务上;

在这个矩阵的基础上,我们就可以定义各式各样的标准,比如我们可以算Accuracy,表示在第T个任务学习完后,在第1到T个任务上的performance的平均值,即把矩阵最后一行的performance都平均起来,
$$
{\rm Accuracy}=\frac{1}{T}\sum_{i=1}^TR_{T,i}
$$
如果想知道机器有多会做knowledge retention,我们就可以定义一个Backward Transfer, 先看机器在学完第一个task的performance $R_{1,1}$,再看一直学习到T个task之后,在task 1上的performance $R_{T,1}$,再计算这两者之间的差距;
$$
{\rm Backward\ Transfer}=\frac{1}{T-1}\sum_{i=1}^{T-1}R_{T,i}-R_{i,i}
$$
这个值一般是负值,在刚开始时准确率最高,学习到后面的task之后,就慢慢忘记了前面task 1,在task 1上的performance就变小了,

Gradient Episodic Memory (GEM)

对于现在在训练的task 2,如果我们修改其梯度的方向,就可以提高之前学习完的task 1的performance;

在下图中,现在要训练的模型是$\theta$,再计算出参数更新的方向g;同时,我们还需要一些前面task的训练资料,再根据这些资料计算出前面task的梯度反方向,也就是前面task参数更新的方向$g^1,g^2$,

如果$g^1,g^2$和g的内积分别都是正的(左),那么我们参数更新的方向就是现在的g;

但也有可能这个内积的负的(右),现在$g^1,g$之间的内积就是负的,如果继续往g的方向更新参数,很可能会对$g^1$这个方向的task造成伤害;我们可以把g的方向稍微变换一下,变成$g’$的方向,使$g’\cdot g^1\geq0,g’\cdot g^2\geq0$,这样进行参数的更新,就不会对之前的task 1和2造成伤害,很可能还会提高其performance;

但g的方向不能变化太大,不能伤害到现在的task。

下面是实验结果展示,GEM算法的正确率都还不错。

Model Expansion

network也可以学习自动扩张,比如扩充一些神经元,但这个扩张并不是毫无限制的,我们希望这个扩张是有效率的,模型扩张的速度最好不要和task加进来的速度成正比。

Progressive Neural Networks

首先需要训练task 1,再用新的model来训练task 2,由于要进行knowledge transfer,前一个task的hidden layer的输出,会作为task 2的后面几层的输入;

Expert Gate

每个task还是需要训练自己的模型,如果进来一个新的任务,会去和旧的任务进行比较,看哪一个旧任务和这个任务最接近;选择最接近的任务来作为新任务的初始化参数;

每次新加入一个任务,都会新加入一个模型,模型的数量和任务的数量是成正比的。

Net2Net

如果要把network进行扩张,就需要新加入一些neural,这些新加入的neural很可能会对之前的任务造成影响,很可能会忘记过去学习到的技能。那么怎么加入新的neural,而不忘记过去的技能呢?

如下图所示,要扩张的新神经元是$h[3]$,可以发现扩张之后的网络要做的事和扩张之前是一样的;

但这样做可能有一个问题,这两个网络是完全一样的,我们可以在扩张之后的network加一些noise,使这两个network有区别,但又不会影响原来network已经学习到的技能

补充:Transfer Learning

如果现在没有和我们任务直接相关的数据,比如我们要做的任务是猫狗分类,很可能手头只有elephant和tiger的数据集,是不同标签的;也有可能是动漫的cat/dog数据,和真实数据集的domain不一样。

那么这些不相关的数据,会对我们的任务是有帮助的吗?

Overview

现在有一些data是和我们的任务有关的,是target data,有一些data是和我们的任务无关的,是source data;target data和source data可能是有label的,也可能是没有label的,我们也将分为这四种情况来进行讨论。

如果target data和source data都是有label的,那么我们就可以进行model fine-tuning。

Model Fine-tuning

现在我们只有很小一部分target data $(x^t,y^t)$,但却有很多的source data $(x^s,y^s)$;如果target data只有少量的几个example,那么我们就可以称作是one-shot learning

我们可以针对这样的task举一个例子,speaker adaption,任务是辨识某一个人的声音,但只有这个人的少量audio data,但我们有很多其他人的audio data;

为了解决这个task,我们可以先使用source data来训练一个model,然后再用target data来进行fine-tuning;即把source data训练的model当成一个初始值,再用我们source data来进行训练任务。

但对这个模型进行训练的时候我们必须非常小心,由于target data的数量太少了,必须要注意overfitting问题。

我们在训练过程中加入一些小技巧,conservative training、layer transfer。

Conservative Training

现在有大量的source data,即很多其他人的audio data,用这些data来训练一个model;把这个训练好的model来作为另外一个model的初始值,再用target data来进行训练;

为了防止overfitting,我们需要加上一些constrain。在看到同一个data的时候,我们希望这两个model的output越接近越好;或者这两个model的参数之间的差距也要越小越好,可以计算这两者之间的L2-norm。

Layer Transfer

首先用source data训练好一个model,把这个model中的其中几个layer的参数拿出来,到新的model里面去;

再用target data来训练没有复制过去的layer(rest layer),target data只需要训练非常少的参数,因此就可以避免overfitting;

如果target data足够多,也可以直接直接对整个network进行fine-tuning。

对于不同的task,需要copy的layer也是不同的。比如Image相关的任务,通常都是copy前几层的参数,因为前几层都是在做一些比较基础的工作,类似于有没有直线,有没有简单的几何图形。

下面是Image使用Layer transfer进行的实验,source data包括500个类别,target data包括也包括500个其他的类别,数据来自imagenet;下图中横轴表示copy的层数,纵轴表示copy这几个layer,再用target data来进行训练所能达到的准确度accuracy;

红色的曲线(only train the rest layer):首先用source data训练好model,copy其中的某几个layer之后,只用target data训练剩下没copy的layer;随着copy的层数不断增多,可以从图中看到训练的准确度是在不断下降的;只有copy前面几个layer,performance稍微有些进步;

橙色的曲线(fine-tune the whole network):现在我们不只是用target data来训练剩下的layer,而是对整个network进行fine-tuning,可以发现随着copy的layer数量越多,模型准确度越高;

下图中红色的曲线和上图中红色曲线相对应,只训练剩下的layer,纵轴表示source和target data之间的相关程度。从图中我们可以看出,如果source和target data差别很大,在做transfer learning的时候performance会下降很多;但如果只copy 前几个layer,performance就掉得不会太多。

Multitask Learning

Introduction

在进行fine-tunign时,我们更多关心的是target对应的准确率,并不太关心source的准确率;而multitask learning则是两者的准确率都考虑进来了。

有两个不同的task A,B,这两个task所使用的input feature都是一样的,前几层的网络结构也是一样的;但在之后的某个层就分叉了,Task A会用到部分output,Task B会用到另外一部分的output;

这样做的其中一个好处就是,我们会用task A和B的data一起来对前几个layer进行训练,这几个layer很可能有更好的performance;

即使这两个task的前几个input层的layer都不一样,只有中间某些layer是可以共用的,我们也可以使用transfer learning的思想。

Multilingual Speech Recognition

Multitask Learning有一个很成功的应用,即Multilingual Speech Recognition(多语音辨识);

现在我们有一堆多种语言的语音数据,我们要对这些audio进行语音辨识。我们可以训练一个model,来同时对这五种语言进行辨识,这个model的前面几个layer都是共用参数的,只有后面几个layer的参数不一样。因为都是人类说的语言,所以前几层可以共用参数。

Domain-adversarial training

如果现在target data是unlabeled,而source data是labeled,我们可以通过Domain-adversarial training来进行transfer learning。

在下图中,source data是带label的,是来自MNIST的数据,$(x^s,y^s)$是training data;target data是没有label的,来自MNIST-M,$(x^t)$是testing data;这两者是mismatch的;

那么我们怎么让在MNIST上训练出来的model,应用到MNIST-M(背景五颜六色)上呢?

如果直接把MNIST-M中的某个图像x输入训练好的network,然后输出对应的classification,效果会非常不好;我们可以把这整个network的前几层看作是在extract feature,后面几层看作是在进行classification;

在下图中,我们把extract出来的feature做一个可视化的展示,如果把MNIST的数据输入进去,即图中蓝色的点,会发现有10个cluster,classifier可以根据这些feature进行分类;但如果把MNIST-M输入network,会变成图中红色的点,是没有规则的,classifier并不能根据这些feature进行分类。

针对这个问题,我们可以对网络结构进行改进;

我们可以通过network中的feature extractor,即Domain-adversarial training,把domain的这些特性给消掉。不同的domain不应该像上图那样分成两群,而应该被混在一起;

为了训练这个feature extractor,我们可以把提取出来的feature输入一个classifier,提取出来的feature要想办法骗过classifier;如果把extractor看作是generator,那么classifier就可以看作是discriminator,和起来就可以看作是GAN;

但骗过这个classifier太简单了,feature只要全都是0,就可以骗过这个classifier;

因此这个feature不仅要能骗过classifier,还需要保留原来digit的特性;如果输入label predictor,也需要做的好,要能输出对应的label(0~9);

这个feature extractor需要满足两个条件,Maximize label classification accuracy + minimize domain classification accuracy,这也就是Domain-adversarial training中adversarial的由来。

虽然Domain-adversarial training原理很简单,但训练起来还是很麻烦的

这里就是论文中的实验结果,

Zero-shot learning

在Zero-shot learning里面,training和testing data的task是不一样的;比如source data是要进来猫狗分类的数据,但testing data却只有草泥马,这是在training data中没有的类别

在语音辨识领域,如果我们并不知道所有可能的source data,我们如何来进行辨识呢?

我们对这个问题进行了转化,不是要辨识一段语音属于哪一个word,而是要辨识语音属于哪一个“音标”,即把辨识的单位变成“音标”。还需要建立表示“音标”和word之间转换关系的表格,当我们辨识出“音标”之后,查表就可以得到对应的word。就算有一段语音没有在training data中出现过,我们也可以先辨识出其对应的“音标”,再得到具体的word。

现在回到图像领域。

如果是在图像领域,我们可以把每个class用attribute来表示,如下图的 Database所示,比如dog有毛,是四条腿,有尾巴的,……。这个attribute的数量要足够多,每个class都有其特别的attribute组合,如果出现两个类别的class有相同的attribute组合,这个方法就失效了。

那么现在的任务就变成了,辨识每张image里面的attribute,比如看到dog的图像,就要说这是有毛、有四条腿、有尾巴的动物;

在testing的时候,即使出现一个从来没看过的动物,network只需要辨识这个动物的attribute就可以了,再去查看属性表,看哪一个class和这些attribute最接近。

这个attribute的数量可能会非常多,这时我们就需要做attribute embedding(降维成一个vector,表示成space上的一个点);首先我们需要把图像的attribute先投影到embedding space上,把表格里面的属性也投影到这个space,分别写作$f(x^i),g(y^i)$,f和g可以看作是一个network;

在training的时候,我们希望$f(x^i),g(y^i)$越接近越好;在testing的时候,即使我们从来没见过这个草泥马,我们也可以把这个草泥马的attribute投影到embedding space上,看哪个class的attribute和这个点最接近

如果没有这个database(class和attribute的关系),我们可以借助word vector来完成这个任务。即用word vector来表示这个动物,这个vector的某个dimension就表示动物的某个attribute,再把attribute也用对应的word vector表示,再来做embedding

$x^1,y^1$投影到embedding space之后,他们之间的距离要越接近越好,对应着一个最小化问题;但这样做会造成一个问题,只要把所有的word都投影到一个点上,距离就是0;

因此要对loss function进行一些变化,我们要使同一个pair之间的距离越小越好,还要使不同pair之间的距离越大越好,即

如果后面一项小于0,这个loss function的值就是0,把这一项进行化简,

还有一个更简单的方法来做zero-shot learning,即Convex Combination of Semantic Embedding只需要off-the-shelf NN for ImageNet和一个word vector就可以完成;

  • 首先把图像输入neural network,但NN可能没办法分辨出到底是哪一个class,lion和tiger的几率都是0.5;
  • 再找出Lion和tiger的word vector,把这两者的vector用1:1的比例进行混合,即0.5V(tiger)+0.5V(lion),得到混合之后的vector;
  • 观察哪个vector和这个混合之后的vector最为接近,这里是V(liger)。

这里是这个方法的实验结果,ConSE即是Convex Combination of Semantic Embedding,第一只海狮取得了不错的效果,

还有关于翻译的例子,训练数据只有English到Japanese、Korean等,但没有Japanese到Korean的数据,通过transfer learning的思想,也可以对这两种语言进行翻译。

Self-taught learning

刚才讲了很多source data都有label的情况,现在我们来叙述source data是unlabeled,target data是label的情况,即self-taught learning。

现在我们有足够多的source data,即使是unlabeled,可以学习一个feature extractor,再去target data上抽取feature。


文章作者: 杰克成
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 杰克成 !
评论
  目录