机器终身学习与灾难性遗忘

原视频链接:https://www.bilibili.com/video/BV1Wv411h7kN?p=84在这里插入图片描述

按照我们以往的观点,当neural network的模型上线之后,我们可以源源不断地从网上获得反馈,获得新的资料,从而更好地更新我们的模型,达到life-long-learning的效果,使得模型越来越强大。但真的是这样吗?

这里举一个例子,这里有两个Domain的任务,但非常类似,都是识别手写数字,区别是一个噪声较多,一个没有噪声,当模型学完任务一然后去做任务二的识别,已经可以达到96%的正确率了。但是,如果把拿这个模型继续去学习任务二的资料,我们发现,虽然任务二的正确率有所提升,但是,我们回过头来去做任务一的识别发现,任务一的正确率已经大大下降了。也就是说,模型发生了遗忘的现象。在较为类似的Domain上尚且如此,在不那么相似的Domain结果更惨。

Tips:其实先学任务二,再学任务一,结果会比较好,可见任务的顺序也对正确率有至关重要的影响,研究任务顺序的课题叫做Curriculum Learning。

在这里插入图片描述

但是如果我们把两种资料混合在一起学习的话,正确率是较为不错的。但如果模型对资料的学习顺序有先后,那么模型往往会遗忘前面学过的内容。这件事情叫做Catastrophic Forgetting。

在这里插入图片描述

比较简单好用的做法就是把所有资料倒在一起进行学习,这个做法的缺陷是你有可能没有办法储存如此多的资料,训练周期也较为漫长。好处是在所有任务上都能兼顾到较高的正确率,通常life-long-learning没有办法超越这个正确率,被视为life-long-learning的天花板。

以下是一个模型life-long-learning的好坏评估标准:

在这里插入图片描述

Selective Synaptic Plasticity(可选择的突触可塑性)

这是life-long-learning其中一个解法,意思是训练完一个任务后,模型中的一部分链接参数不能够再动了,以后的训练只能选择修改另外一部分参数。这部分研究是发展的最为完整的,因此我们也主要学习这种做法。

在这里插入图片描述

因此,我们希望在对任务分类中比较重要的参数,我们的改动尽可能小一些,对不重要的参数我们希望可以把改动做大一些。这种做法是我们给每个参数都设置一个保镖(guard),这也是一个参数。这个参数代表了我们希望该参数可以改动的幅度,然后重新定义我们的Loss。
L ′ ( θ ) = L ( θ ) + λ ∑ i b i ( θ i − θ i b ) L'(\theta) = L(\theta) + \lambda \sum_i b_i (\theta_i - \theta_i^b) L(θ)=L(θ)+λibi(θiθib)
L ′ ( θ ) L'(\theta) L(θ)就是我们改动后的Loss函数,它于原来Loss函数的不同只在于加上了一项。要使后面一项的值为零,一个条件是使所有更新后的参数不改变它的值。但是前面乘以了一个guard b i b_i bi的值,当 b i = 0 b_i = 0 bi=0时,无论新的参数怎么变化,Loss都是0,说明这个参数对原来的任务不重要,可以任意变化,guard全部为0会造成Catastrophic Forgetting。相反, 当 b i = + ∞ b_i = + \infty bi=+时,只要参数稍有变化,Loss就是无穷,说明这个参数及其重要,不允许改变,guard全部为正无穷则造成intransigence,由于不肯妥协而学不到任何新东西。因此我们可以通过调整 b i b_i bi来实现用这个新的Loss训练出只改变某些特定参数的网络。

b i b_i bi一般只能人为设定。我们可以求Loss对某一个参数的导数,即梯度,来确定这个参数的重要性,梯度较大则 b i b_i bi设大一些,反之设小一些。

现在看这个算法的实验结果:

在这里插入图片描述

可以看到SGD是所有 b i = 0 b_i = 0 bi=0的情况,即不限制参数的改变,可以看到发生了Catastrophic Forgetting,前面任务的正确率下降幅度很大。L2是所有 b i = 1 b_i = 1 bi=1的情况,对所有参数做一样的限制,可以看到旧任务的遗忘度比原来的低,但是在学新任务的时候反而造成了新任务正确率低学不起来的情况。EWC是根据梯度设置 b i b_i bi的做法,可以看到不仅躲到了低遗忘率,在新任务上的表现也比较不错。

对于 b i b_i bi的具体算法有多种,可以查看论文原文:

在这里插入图片描述

这是有关Regularization-based的做法。关于这个还有一个早年的做法是Gradient Episodec Memory(GEM)。这个方法劣势是还需要一定量的过去资料。

在这里插入图片描述

Additional Nerual Resource Allocation(额外的神经资源分配)

这是life-long-learning的第二种做法。

Progressive Neural Networks

这是最早的做法,当任务一训练完成之后,我们就不要再动里面的参数了,我们可以再新开一个模型,这个模型使用任务一隐藏层中的输出作为输入,然后再训练自己的参数。任务三亦然。这个方法的缺点是模型随着训练任务数量的增多而增大,最后可能难以保存。但在任务量没有太多的时候,这个也是可以派上用场的。

在这里插入图片描述

PackNet

这种做法是和Progressive Neural Networks相反,首先就建立一个比较大的Network,每次训练任务只使用一小部分的参数。

在这里插入图片描述

Compacting,Picking,and Growing(CPG)

这种做法是上两种的结合。生成一个比较大的网络但是我们一边只使用部分参数,一边新增新的网络,确保参数不会用完。

在这里插入图片描述

Memory Reply

Generating Data

这种做法是直接训练一个Generator,这个Generator可以直接产生过去任务的资料,因此我们就不用保存过去的资料,直接用这个Generator生成过去的资料和现在任务的资料混合进行训练,以达到同时学习所有数据的效果。这种做法是非常有效的,经过实验证明,往往可以达到跟Multi-Task Learning差不多的结果。

在这里插入图片描述

Adding new classes

当我们每个任务需要分类的数量不一致应该怎么办?详情请参考以下链接的论文。

在这里插入图片描述


后记

life-long-learning的讲解到这里告一段落,前面讲的只是life-long-learning三个情景中最简单的一种,如果想要深入学习这个领域,可以查看论文:https://arxiv.org/abs/1904.07734。

猜你喜欢

转载自blog.csdn.net/tianjuewudi/article/details/118740042