持续学习笔记

image.png

task incremental setting下的持续学习

在一系列的任务下,不同时刻到达的数据来自不同的任务,每个时刻拿到的数据是这个任务的全部数据,后续不会再拿到之前拿到过的数据。优化的目标是:
image.png
也就是在tao时刻的任务完成后,回头看所有任务上的loss之和都要最小。

持续学习的方法论

脉络:
image.png

具体分为三种方法(也有部分相互重叠):

  • replay
  • regularization-based
  • parameter isolation

    replay

  • rehearsal:在训练的时候把存起来的一个子集一起拿来训练。
  • constrained optimization:不那么容易过拟合在选出来的那些之前的子集。限制新的任务不要在旧的任务上跑inference,通过把之前的任务梯度投影到可观测范围。
  • pseudo rehearsal:给之前的模型喂随机数据。是一些早期的工作。

regularization-based

  • data-focused:对之前任务的模型做知识蒸馏,作用在当前新数据下的模型。
  • prior-focused:估计模型参数的分布作为先验。如果后续任务改变了重要参数会被惩罚。

parameter-isolation

把各种任务的参数都分离开。

怎么平衡stability和flexibility?

  • 最大化flexibility的搜索:把在原来任务上的参数复制一份到新任务上,通过粗的grid search去搜学习率,挑出在新的这个复制参数上得到的最好性能(在新任务的验证集上),这个性能acc称为A*,学习率叫η*,也就是这个时候暂时不考虑过去任务的表现
  • stability decay:用这个η*训练原来的参数,要把相关的超参调到最高来达到最小遗忘。定义一个阈值p在A*上,来保证不会比A*小得太多,如果真的小的太多了,那么定义一个超参衰减因子α,把原来的超参衰减直到满足这个阈值。

这个过程写成代码:
image.png
这里好像没有体现出复制参数这回事。

各种方法的大概模型

replay

  • iCaRL: class-incremental,存下了之前任务里面每个类最靠近这个类内平均特征的样本。使用蒸馏。
  • GEM: 把当前任务梯度投影到可观测范围,和之前任务的梯度作比较。

把这些样本存起来会导致需要更多的资源和内存。

regularization-based

  • Learning without Forgetting(LwF): 在新任务训练之前,先记录对新任务数据的输出,然后用来蒸馏之前的知识。但这个方法对新任务和旧任务之间的联系有依赖关系,如果一直给差的很远的任务,错误会不断累积。
  • Encoder Based Lifelong Learning(EBLL):扩展了LwF,对不同的任务把原来低维的特征过一层自编码器。
  • Elastic Weight Consolidation (EWC): 在训练之后决定当前这个新任务的重要性。不知道细节在干嘛。
    image.png
  • Synaptic Intelligence (SI): 在训练的时候就给出这个重要性。不知道细节在干嘛。image.png
  • Memory Aware Synapses (MAS):
    image.png
  • Incremental Moment Matching (IMM): 对过去的模型参数去加权平均。提出三种方法:
    • 用之前任务的参数初始化当前任务的参数
    • 把之前的任务参数通过一层特殊的dropout
    • 用l2正则处理之前的任务参数

parameter-isolation

  • PackNet: 先不修改之前的参数,但是会去掉一些不重要的参数(通过一定的计算方法),然后剩下的参数被拿到训练里。
  • HAT: 略。

综述里还有对各个方法的一个总结性表格。

iCaRL

class-incremental manner:

  • 每次到达的数据都是不同类的
  • 需要对已经观测到的多个类的分类。
  • 计算开销有限,或者缓慢增加。

iCaRL的三个内容:

  • nearest-mean-of-exemplars rule的分类
  • prioritized exemplar selection
  • 知识蒸馏、样本回顾的表示学习

nearest-mean-of-exemplar

在给定输入x要求做分类的时候,对之前观测到的类可以求出来那些类各自的特征向量的平均值,也就是,其中是网络前面的层。
然后对这个新图可以做分类,也就是
一般的分类都是,然而和w是解耦的,这导致了灾难性遗忘,而这里的分类方式和y不解耦,就是一起变化的,减少了灾难性遗忘的发生。

分类的算法:
image.png

表示学习

image.png
也就是,给一堆新类和旧类的采样样本混起来,把当前模型先跑在旧类的采样样本上得到一些当前的分类,然后再用下面的loss训练。这个loss兼顾了新类的分类精确度,也有蒸馏部分,减少灾难性遗忘。
这里的只是声明类别,并不是过去时刻的模型。
旧类采样样本存的是原图像而不是而不是特征向量,特征向量会因为随着时间变化而固定住,最后变得outdated。但是把他固定住有什么不好?感觉可以放松要求,不一定总是那几个值。

exemplar management

终于到了怎么选取采样样本的方法了,之前一直避而不谈。
在给定希望对新类建立m个采样样本的时候,用下面的方法构建采样样本集合。先算出整个类内的平均特征,然后逐个地找到离这个特征最近的那些样本,下面的argmin是在给定第k个采样样本之前的那些样本和当前正要加进来的第k个样本做平均,希望这个均值离全局均值最低。
P集合的顺序是有意义的,越靠前的样本越靠近均值。这样设计是因为前面看过的类是不可以再看到了,所以只能存下来。这样保证了就算采样样本变少了,也能看见平均的特征均值。image.png

这只是对新类增加采样样本,然而在固定存储K个样本的时候,旧类需要减少已经存了的样本,也就是把原来存的一堆样本只取前m个。这里的m是K/t得出来的,t是已经观测的类数。

整个算法如下:
image.png

看起来iCaRL确实是共用了最后的分类头。

Learning without Forgetting

可以看作是蒸馏和finetune的结合。
在多任务尺度下的各种方法:
image.png
image.png

但是按照这种方法,好像后面的任务只能是前面任务的子集。
用了各种提点的小技巧,比如正则化,warm-up,temperature之类的技巧。

Gradient Episodic Memory for Continual Learning

提出两个指标BWT,FWT:BWT希望后面学习的东西能对前面的知识起作用,FWT希望前面的知识能对后面的任务起作用,甚至是zero-shot。
还有一个更加有针对性的metric,提出每次任务训练完之后,都要在所有任务上跑一次test,总共T个任务的话,可以得到一个矩阵,其中表示在任务i上刚训练完后在j任务上的test acc。然后有三个指标:
image.png
这个ACC指的是在把所有任务都学完之后逐个任务跑test求avg。其中 是随机初始化下对第i个任务的acc。
当ACC相同时,更大的BWT或FWT是更优的。

GEM的核心是:
image.png
其中的是前面任务的采样样本。这样可以让BWT不至于变得太不好。当找不到这样的g,那就退而求其次找一个,使得
image.png
不过事实上这里也不用存下来这个,只需要把前面任务的梯度存下来就好了。
也就像投影,不过这个投影是在垂直方向上的。至于这个投影的具体实施办法,还是参照原文吧,数学推导有点看不懂。
GEM的算法(这里的g是上面那个g):image.png

End-to-End Incremental Learning

两个成分:representative memory和deep network。

  • representative memory:和iCaRL类似的保存一些采样样本。甚至保存样本的手段都是一样的,取均值最近的那些样本。
  • deep network:一样的特征提取和分类头。但这里强调允许特征提取部分的fine-tune(虽然没人不允许特征提取部分是固定的)。这里的loss和iCaRL稍微不一样,表现在loss是整体都用的交叉熵。
    image.png这里的pdist和qdist是加了temperature的。

整体来看,pipeline有四步,这也是和iCaRL不一样的地方:

  1. 构建训练集,在这里加上data-augmentation。原文用了亮度、对比度、随机裁剪和镜像翻转。
  2. 训练。训练会把网络所有部分放开,包括特征提取部分。
  3. 挑训练集上的一个小部分出来fine-tune。为了平衡新类数目会远远多于采样样本数目,在训练之后加一个fine-tune环节,把新类的数目削减到和其他的一样多,跑在一个小学习率上。
  4. 修改representative memory。和iCaRL策略是一样的。

Faster ILOD: Incremental Learning for Object Detectors based on Faster RCNN

目标检测比分类更加困难,因为不止有灾难性遗忘的问题,还有在新任务的数据里是没有旧类标签的。
是class incremental的。
这里不避开新任务里含有旧物体的样本,不过没有了旧物体的label。

这里的设计基于Faster RCNN。在原来的基础上引入蒸馏以及各部分的loss。模式为:
image.png

在原有的loss上加上FE、RPN和RCN的loss。

  • FE的loss为:
    image.png
    这里的是特征图的最后一层输出,M是特征图的特征数;
  • RPN的loss为:
    image.png这里的q是分类输出,r是锚框输出,是一个阈值。
  • RCN的loss为:
    image.png其中K是所有的RoI数,是旧类且包含背景的总数,是零均值下的分类结果,t是锚框输出。
  • 最终的loss:

Overcoming Catastrophic Forgetting in Incremental Object Detection via Elastic Response Distillation

同样是蒸馏下的目标检测,不过这里不细分RPN和RCN,因为这里也没有说是RCNN的任务。
一样的蒸馏,不一样的loss而已。对分类,loss从
image.png
变成了
image.png
这个motivation是KL下如果weight不恰当的话,背景类会远远多于非背景类,损害旧知识的保留。新loss的是教师模型在m种选择的类别中的预测概率。

对于锚框的回归,先建模
image.png,表示锚框的矩阵,以及
image.png来标识T的锚框和S的锚框的差距,最后累加起来
image.png
这里的J是由algorithm 1选出来的。

algorithm 1是本文的novelty所在。之前的阈值或者topK的选取锚框都很粗糙,导致如果阈值太小就会忽略旧的物体,而阈值太大就会带来负的response。
algorithm 1:
image.png
分类的时候取作为阈值,而回归(锚框)的话先把最高的置信度的锚框挑出来,然后去选阈值,最后一并nms。
这样干的motivation:
平衡不同response,在正态分布上取阈值是合适的response数目;在IOD任务上背景类远远多于物体类,一个较大的均值μ代表着更好的候选物体质量,可以挑选足够多的正类response。