CVPR2020 tutorial:高效的标注学习:增量学习,少样本和自监督
今年CVPR的tutorial是在线上的,做一个听课笔记。
增量学习:不遗忘的持久学习
面对new task:可以采用的方法:
- 重新训练:
可能没有那么多计算空间,而且很耗时间,每次有新类都要重新训练
- 使用新数据微调最后一层:
可以得到接近最优的结果
- 使用新数据微调全部层:
会导致灾难性的遗忘
对于重新训练和使用新数据微调全部层,作者给出了一个对比实验的数据。

从这里可以看到,相比重新学习,在old(1-10)上训练后在new上微调全部网络(11-20)的结果,在new上还可以,但是在old上一塌糊涂,因为在训练B的时候模型遗忘了A上训练的内容。固定更多层可以提升在old上的性能但是还是不能与重新训练相提并论。
作者提到了增量学习的几个规则:

几个规则:
- 串行学习任务
- 不从前面的任务里存储(许多)数据
- 不增长大量内存使用
- 不完全遗忘过去的任务
举了一些例子作为有代表性的工作:

Regularization-based Models:

基于规则的方法中的第一个:
知识蒸馏

简而言之就是先训练好一个teacher网络,再用这个网络的输出和数据的真实标签去训练student网络;知识蒸馏有两种作用:第一种是将大网络转化为小网络,同时保留接近大网络的性能;第二种是将多个网络所学到的知识转移到一个网络中,使单个网络的性能接近ensemble的效果;也就是我们可以在一个大网络上利用大量数据训练好模型,再在另一个网络上训练少量模型,把大网络的输出通过loss结合起来,提升这个网络的性能。我感觉与微调其实是类似的,都是在仅有少量样本的情况下尝试从外界,或者其它任务中获取更多知识用于新网络的训练。从头开始的网络训练类似于从极有限的数据中近似一个未知的函数,而如果是让新网络与原网络的分布匹配,不但所需数据量小,同时可以得到更多信息——原分布类似于one-hot,原网络则是有logits,可以告诉你各类有多可能或者多可能。
知识蒸馏在相关联的任务上表现很好,然而对不同的任务却表现很差,同时需要把旧模型整个存下来。
再来介绍一下model-focused的regularization方法。
简而言之就是避免重要的参数发生重大改变,也就是添加正则项。

lambda项的大小取决于这个theta的重要程度。
举了一些最近的工作作为例子。具体就不列举了,咖喱味的英语加上暂时兴趣不大也没有认真听懂。。

rehearsal/replay-based methods

这类方法从之前的任务中存储一些例子,或者从一个产生式模型中生成一些样本(GAN?)。这里介绍了一个17年CVPR的工作:iCaRL。这个工作主要有以下这些亮点:

从每个类的特征表示中心选取样本;
使用了知识蒸馏作为损失函数;
巧妙利用了现有的存储空间。
具体往下看。这篇论文将问题划分成:
- 学习特征
- 使用NCM分类器。
简而言之就是将分类转化为一个类似聚类的问题,使得可以动态扩充类别,同时使用知识蒸馏来缓解灾难性遗忘问题(类似另一篇论文Learning Without Forgetting),另外采取策略部分解决了存储限制的问题。

给了一个简单的总结。巧妙利用了现有空间,但是存储数据以及内存使用上存在一些隐患和缺点。
然后又举了一个关于rehearsal/replay-based method的例子:Deep Generative Replay
大概就是每一个任务都有一个generator和solver,组成一个scholar,train的时候使用当前任务的数据和上一个任务的scholar(细节完全没懂,要去看论文才行)。

Architecture-based
少样本学习:从有限的数据中学习新知识
自监督学习:在没有人为监督的情况下学习表示
未完待续。
发表评论