今天也要加油啊江同学

CVPR2020 tutorial:高效的标注学习:增量学习,少样本和自监督

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。这个工作主要有以下这些亮点:

从每个类的特征表示中心选取样本;

使用了知识蒸馏作为损失函数;

巧妙利用了现有的存储空间。

具体往下看。这篇论文将问题划分成:

  1. 学习特征 
  2. 使用NCM分类器。

简而言之就是将分类转化为一个类似聚类的问题,使得可以动态扩充类别,同时使用知识蒸馏来缓解灾难性遗忘问题(类似另一篇论文Learning Without Forgetting),另外采取策略部分解决了存储限制的问题。

给了一个简单的总结。巧妙利用了现有空间,但是存储数据以及内存使用上存在一些隐患和缺点。

然后又举了一个关于rehearsal/replay-based method的例子:Deep Generative Replay

大概就是每一个任务都有一个generator和solver,组成一个scholar,train的时候使用当前任务的数据和上一个任务的scholar(细节完全没懂,要去看论文才行)。

Architecture-based

少样本学习:从有限的数据中学习新知识

自监督学习:在没有人为监督的情况下学习表示

未完待续。

xinyu