查看原文
其他

一时学习一时爽,"持续学习"持续爽

夕小瑶 夕小瑶的卖萌屋 2021-02-05

一只小狐狸带你解锁NLP/ML/DL秘籍

作者:小鹿鹿鹿 

net~net~你围棋下的这么好,斗地主应该也不错吧

不敢当不敢当

但是人家柯洁才得了欢乐斗地主全国第一呢

那让老夫也学习学习吧~巴拉巴拉小魔仙Training。。。

net net stop!你怎么斗地主还没学会,就忘了怎么下围棋了呢o(╥﹏╥)o

net net 我不要你打斗地主了,net你快回来。。


画外音:就这样,小夕的net再也没有回来了。这真是一个机器学习史上的灾难呀。



问题定义



众所周知,柯洁是超级厉害的围棋高手。

众所周知,小夕是超级厉害的卖萌小能手斗地主民间高手


燃鹅,如果这时候把斗地主的规则教给柯洁,那么柯洁凭借已有的围棋知识,可以轻松的与小夕大战一场。并且战完后依然是那个能与阿法狗大战到天亮的围棋高手。


我们人类有能够将一个任务的知识用到另一个任务上的能力,学习后一个任务时也不会忘记如何做前一个任务。这种能力叫持续学习 (continual learning/ life-long learning)而这个能力归结起来主要有两个问题:

 

  • 如何能把之前任务的经验用上,使得更快更好的学习当前任务;

  • 学习当前任务时,不会忘记之前已经学会的任务。


用更专业的术语来讲就是可塑性(学习新知识的能力)和稳定性(旧知识的记忆能力)。

 

可是,神经网络不同于人类,由于其自身的设计天然存在灾难性遗忘问题当学习一个新任务的时候,需要更新网络中的参数,但是上一个任务提取出来的知识也是储存在这些参数上的呀。于是,神经网络在学习新任务的时候,旧任务的知识就会被覆盖。所以如果你试图教阿法狗去打斗地主,那么当它能与小夕一战的时候,它就再也不是柯洁的对手了。



用已有的斧头解决问题



神经网络算法的灾难性遗忘在黑早黑早以前就有研究关注这个问题了,众所周知(最近发现这个词超好用诶)的大佬Goodfellow在2013年的时候针对训练方法(是否使用dropout)和不同的激活函数(logistic sigmoid/ rectified linear/ LWTA/ Maxout)对灾难性遗忘问题的影响做了详尽的实验分析。

 

那年的实验

让神经网络学习两个任务(新任务和旧任务),两个任务的关系有三种:

  • Input reformatting:任务目标一样,只改变数据输入格式类比不同语言的学习,意大利语和西班牙语非常接近,有相似的语法结构。最大的不同是输入单词的形式,比如你好,意大利语是buon giorno,西班牙语是Hola。如果神经网络能学会从buon giorno映射到Hola,就能轻松的基于意大利语学习西班牙语啦~~基于这个假设,作者以MNIST数字识别为例,旧任务是原始的数字分类任务,新任务是将32*32像素打乱的数字分类任务。

  • Similar tasks:任务目标不一致,但是相似。这个就非常好理解啦,符合我们对持续学习最自然的认知。用对不同商品评价的情感分类作为新旧两个任务,比如旧任务是对手机评论的情感分类,新任务是对扫地机器人评论的情感分类( •̀ ω •́ )y。

  • Dissimilar tasks:任务目标不相似。设定旧任务为评论的情感分类,新任务是MNIST数字识别,完全风马牛不相及的两个任务。


对每一个task pair,我们有2×4组实验设置(是否加dropout和四种不同的激活函数)。针对每一个设置,跑25组实验(随机初始化超参数),记录新旧两个实验的test error。

 

实验结果和结论

  • dropout

相信训练过神经网络的小伙伴都知道,dropout是一个提高模型准确性和鲁棒性的一个利器。dropout的原理非常简单,就是网络中有非常多的连接,我们在每一次参数更新的时候,随机的对这些连接做mask,mask掉的权重参数置零,不参与网络更新。dropout可以理解成一个简易的assemble,每次更新一个子网络,最终的预测结果是所有子网络预测的均值。

              

以相似任务为例,在8种试验设置下的25组试验结果如上图所示。我们可以得到一条经验性的结论:Dropout有助于缓解灾难性遗忘问题(无论使用哪种激活函数和不同的任务关系)。

 

为什么呢?一个比较简单的理解是dropout强迫网络把每一层的模式相对均匀的记忆在各个神经元中(不加dropout时容易导致网络退化,一层中的神经元可能真正起作用的只有几个)。这样相当于增加了模型的鲁棒性,后续任务对其中的小部分神经元破坏时,不会影响整体的输出结果,对比之下,如果不加dropout,那么一旦关键的神经元被后续任务破坏,则前面的任务就完全崩了。使用dropout训练的模型size远大于不加dropout的模型大小。

              

  • 激活函数

但是遗憾的是激活函数的选择没有一致的结论。在三种不同的task pair下,激活函数的选择排序是不同的,大佬建议我们使用cross-validation来选择网络中使用的激活函数(是的,这也可以作为一个结论🙃)

       



造新斧头解决问题



持续学习方法

当前主流的针对神经网络模型的持续学习方法可以分为以下五类:

  • Regularization:在网络参数更新的时候增加限制,使得网络在学习新任务的时候不影响之前的知识。这类方法中,最典型的算法就是EWC。

  • Ensembling: 当模型学习新任务的时候,增加新的模型(可以是显式或者隐式的方式),使得多个任务实质还是对应多个模型,最后把多个模型的预测进行整合。增加子模型的方式固然好,但是每多一个新任务就多一个子模型,对学习效率和存储都是一个很大的挑战。google发布的PathNet是一个典型的ensembling算法。

  • Rehearsal:这个方法的idea非常的直观,我们担心模型在学习新任务的时候忘了旧任务,那么可以直接通过不断复习回顾的方式来解决呀(ง •_•)ง。在模型学习新任务的同时混合原来任务的数据,让模型能够学习新任务的同时兼顾的考虑旧任务。不过,这样做有一个不太好的地方就是我们需要一直保存所有旧任务的数据,并且同一个数据会出现多次重复学习的情况。其中,GeppNet是一个基于rehearsal的经典算法。

  • Dual-memory:这个方法结合了人类记忆的机制,设计了两个网络,一个是fast-memory(短时记忆),另一个slow-memory(长时记忆),新学习的知识存储在fast memory中,fast-memory不断的将记忆整合transfer到slow-memory中。其中GeppNet+STM是rehearsal和dual-memory相结合的一个算法。

  • Sparse-coding: 灾难性遗忘是因为模型在学习新任务(参数更新)时,把对旧任务影响重大的参数修改了。如果我们在模型训练的时候,人为的让模型参数变得稀疏(把知识存在少数的神经元上),就可以减少新知识记录对旧知识产生干扰的可能性。Sensitivity-Driven是这类方法的一个经典算法。


这个方法的idea确实是挺合理的,当有效知识储存在少数的节点上,那么新知识我们就大概率可以存储在空的神经元上。


等等!


还记得前面我们说过,dropout是说我们把信息备份在更多的神经元上,当我们在学习新任务的时候就算破坏了其中的几个也不会影响最终的决策。那么这两个推论不就自相矛盾了么??所以到底应该是稀疏还是稠密,还得通过实验才能知道呀~~

 

实验设计

  • 数据集

       

作者使用了三个数据集,MNIST就不用说了,CUB-200(Caltech-UCSD Birds-200)同样也是一个图片分类数据集,不过比MNSIT更加复杂,里面有200类不同种类的鸟类。而AudioSet则是来源于youtube的音频数据集,它同样也是一个分类数据集,有632个类。

 

  • 任务

  • Data Permutation Experiment:和前文设置一样,新任务就是将旧任务的输入数据做置换。

    Incremental Class Learning:实际中我们总是会有这样的诉求,就是当模型可以对花🌺进行分类的时候,希望通过持续学习可以认识各种类别的树🌴。所以这个任务设计就是不断增加模型可分类类别。以MNSIT数字分类为例,先让模型学习一次性学习一半的类别(识别0-5),再逐个增加让模型能够识别6-9。

    Multi-Modal Learning:多模学习是希望模型能够实现视觉到听觉的转换。作者分别尝试让模型先学习图像分类CUB-200再学习音频任务AudioSet,以及先学习AudioSet再学习CUB-200。(大概是作者觉得MNSIT任务太简单,就直接忽略了╮( ̄▽ ̄"")╭)

 

  • 评估

                 

前文提到持续学习的两个主要问题是学习能力记忆能力,所以作者用Omiga_new来评估模型学习新任务的能力,Omiga_base评估模型的记忆能力,Omiga_all是这种两个能力的综合考量。alpha_new,i是模型刚学完任务i对任务i的准确率,alpha_base,i是模型刚学完任务i,对第一个任务(base任务)的准确率,ahpha_all_i是模型刚学完任务i,对学习过的所有任务的准确率。为了保证不同任务之间的可比性,作者用不使用任何持续学习方法,直接学习base任务的准确率做了归一。

 

实验结果和结论

              

上表中除了上面提到的五种持续学习方法以外,还有MLP是不加持续学习方法的baseline。

 

在数据输入格式变换任务下,GeppNet和GeppNet+STM能保持记忆但是丧失了学习新任务的能力;FEL学习新任务能力强,但是不能保持记忆;PathNet和EWC都能一定程度改善灾难性遗忘问题,pathnet比ewc要稍好一些~~

               

在逐渐增加分类类别实验下,随着分别数的增加(新任务的不断学习),已学习过的分类类别平均准确率在不断的下降,其中EWC算法完全失效,准确率曲线和baseline重合,而其他持续学习算法,GeppNet 优于 GeepNet+STM 优于 FEL。但是在多模实验下,EWC却又是唯一一个方法在两个顺序下都有效的。(刚被打脸又长脸了emmm)

               

最终实验结论!!在实验了各大主流方法的经典算法之后,发现。。并没有一个统一的方法可以一致的解决不同场景下的问题。╮(╯▽╰)╭

 

由此可知,解决灾难性遗忘问题还是非常任重而道远的呀。后续小夕和小伙伴们还会更加详细的介绍文中提到的以及没有提到的持续学习方法更为具体的算法细节。希望大家多多支持鸭~~




不要忘了关注小夕~星标⭐小夕哦~








参考文献


[1] An Empirical Investigation of Catastrophic Forgetting in Gradient-Based Neural Networks

[2] Measuring Catastrophic Forgetting in Neural Networks

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

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