task incremental setting下的持续学习
在一系列的任务下,不同时刻到达的数据来自不同的任务,每个时刻拿到的数据是这个任务的全部数据,后续不会再拿到之前拿到过的数据。优化的目标是:
也就是在tao时刻的任务完成后,回头看所有任务上的loss之和都要最小。
持续学习的方法论
脉络:
具体分为三种方法(也有部分相互重叠):
- replay
- regularization-based
- parameter isolationreplay
- 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*小得太多,如果真的小的太多了,那么定义一个超参衰减因子α,把原来的超参衰减直到满足这个阈值。
这个过程写成代码:
这里好像没有体现出复制参数这回事。
各种方法的大概模型
replay
- iCaRL: class-incremental,存下了之前任务里面每个类最靠近这个类内平均特征的样本。使用蒸馏。
- GEM: 把当前任务梯度投影到可观测范围,和之前任务的梯度作比较。
把这些样本存起来会导致需要更多的资源和内存。
regularization-based
- Learning without Forgetting(LwF): 在新任务训练之前,先记录对新任务数据的输出,然后用来蒸馏之前的知识。但这个方法对新任务和旧任务之间的联系有依赖关系,如果一直给差的很远的任务,错误会不断累积。
- Encoder Based Lifelong Learning(EBLL):扩展了LwF,对不同的任务把原来低维的特征过一层自编码器。
- Elastic Weight Consolidation (EWC): 在训练之后决定当前这个新任务的重要性。不知道细节在干嘛。
- Synaptic Intelligence (SI): 在训练的时候就给出这个重要性。不知道细节在干嘛。
- Memory Aware Synapses (MAS):
- 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
分类的算法:
表示学习
也就是,给一堆新类和旧类的采样样本混起来,把当前模型先跑在旧类的采样样本上得到一些当前的分类,然后再用下面的loss训练。这个loss兼顾了新类的分类精确度,也有蒸馏部分,减少灾难性遗忘。这里的g_y只是声明类别,并不是过去时刻的模型。旧类采样样本存的是原图像而不是而不是特征向量,特征向量会因为随着时间变化而固定住,最后变得outdated。但是把他固定住有什么不好?感觉可以放松要求,不一定总是那几个值。
exemplar management
终于到了怎么选取采样样本的方法了,之前一直避而不谈。
在给定希望对新类建立m个采样样本的时候,用下面的方法构建采样样本集合。先算出整个类内的平均特征,然后逐个地找到离这个特征最近的那些样本,下面的argmin是在给定第k个采样样本之前的那些样本和当前正要加进来的第k个样本做平均,希望这个均值离全局均值最低。
P集合的顺序是有意义的,越靠前的样本越靠近均值。这样设计是因为前面看过的类是不可以再看到了,所以只能存下来。这样保证了就算采样样本变少了,也能看见平均的特征均值。
这只是对新类增加采样样本,然而在固定存储K个样本的时候,旧类需要减少已经存了的样本,也就是把原来存的一堆样本只取前m个。这里的m是K/t得出来的,t是已经观测的类数。
整个算法如下:
看起来iCaRL确实是共用了最后的分类头。
Learning without Forgetting
可以看作是蒸馏和finetune的结合。
在多任务尺度下的各种方法:
但是按照这种方法,好像后面的任务只能是前面任务的子集。
用了各种提点的小技巧,比如正则化,warm-up,temperature之类的技巧。
Gradient Episodic Memory for Continual Learning
这个ACC指的是在把所有任务都学完之后逐个任务跑test求avg。其中 \bar{b_i} 是随机初始化下对第i个任务的acc。当ACC相同时,更大的BWT或FWT是更优的。
GEM的核心是:
其中的M_k是前面任务的采样样本。这样可以让BWT不至于变得太不好。当找不到这样的g,那就退而求其次找一个\tilde{g},使得
不过事实上这里也不用存下来这个M_k,只需要把前面任务的梯度存下来就好了。也就像投影,不过这个投影是在垂直方向上的。至于这个投影的具体实施办法,还是参照原文吧,数学推导有点看不懂。GEM的算法(这里的g是上面那个g):
End-to-End Incremental Learning
两个成分:representative memory和deep network。
- representative memory:和iCaRL类似的保存一些采样样本。甚至保存样本的手段都是一样的,取均值最近的那些样本。
- deep network:一样的特征提取和分类头。但这里强调允许特征提取部分的fine-tune(虽然没人不允许特征提取部分是固定的)。这里的loss和iCaRL稍微不一样,表现在loss是整体都用的交叉熵。
这里的pdist和qdist是加了temperature的。
整体来看,pipeline有四步,这也是和iCaRL不一样的地方:
- 构建训练集,在这里加上data-augmentation。原文用了亮度、对比度、随机裁剪和镜像翻转。
- 训练。训练会把网络所有部分放开,包括特征提取部分。
- 挑训练集上的一个小部分出来fine-tune。为了平衡新类数目会远远多于采样样本数目,在训练之后加一个fine-tune环节,把新类的数目削减到和其他的一样多,跑在一个小学习率上。
- 修改representative memory。和iCaRL策略是一样的。
Faster ILOD: Incremental Learning for Object Detectors based on Faster RCNN
目标检测比分类更加困难,因为不止有灾难性遗忘的问题,还有在新任务的数据里是没有旧类标签的。
是class incremental的。
这里不避开新任务里含有旧物体的样本,不过没有了旧物体的label。
这里的设计基于Faster RCNN。在原来的基础上引入蒸馏以及各部分的loss。模式为:
在原有的loss上加上FE、RPN和RCN的loss。
这里的q是分类输出,r是锚框输出,\tau是一个阈值。
其中K是所有的RoI数,C_o是旧类且包含背景的总数,\tilde{p}是零均值下的分类结果,t是锚框输出。
- 最终的loss:L_{total} = L_{RCNN} + \lambda_1 L_{F_{Dist}} + \lambda_2 L_{RPN_Dist} + \lambda_3 L_{RCN_Dist}
Overcoming Catastrophic Forgetting in Incremental Object Detection via Elastic Response Distillation
同样是蒸馏下的目标检测,不过这里不细分RPN和RCN,因为这里也没有说是RCNN的任务。一样的蒸馏,不一样的loss而已。对分类,loss从
变成了
这个motivation是KL下如果weight不恰当的话,背景类会远远多于非背景类,损害旧知识的保留。新loss的C_T^i是教师模型在m种选择的类别中的预测概率。
对于锚框的回归,先建模
,表示锚框的矩阵,以及
来标识T的锚框和S的锚框的差距,最后累加起来
这里的J是由algorithm 1选出来的。
algorithm 1是本文的novelty所在。之前的阈值或者topK的选取锚框都很粗糙,导致如果阈值太小就会忽略旧的物体,而阈值太大就会带来负的response。algorithm 1:
分类的时候取\tau_{C^{‘}}作为阈值,而回归(锚框)的话先把最高的置信度的锚框挑出来,然后去选阈值,最后一并nms。这样干的motivation:平衡不同response,在正态分布上取阈值是合适的response数目;在IOD任务上背景类远远多于物体类,一个较大的均值μ代表着更好的候选物体质量,可以挑选足够多的正类response。