paper: https://arxiv.org/abs/1905.13260
code: https://github.com/wuyuebupt/LargeScaleIncrementalLearning
BiC针对现在增量学习方法在大规模数据集上表现不好的这个问题,提出了BiC(bias Correction)这个方法,并且还提出了增量学习在大规模数据集上存在的两个问题:
- 训练数据的不平衡;
- 随着增量学习进行下去,类别会越来越多,这样特征相似的类别就会变多。(就又需要区分相似类别这个问题)
而本文的BiC方法就是用来解决第一个问题的,即解决训练数据不平衡的问题。
等一会再解释一下大规模数据集上为什么会存在训练数据不平衡的问题。
作者在如何利用旧数据集信息的角度上,将增量学习分为三大类:
- 完全不使用到旧数据。EWC、LwF等
- 使用合成的数据,利用GAN网络生成和旧数据分布相同的数据。
- 使用部分旧数据,从旧数据中按某种方式抽取一部分样例,再和新数据一起训练。
BiC就属于第三类,使用了部分旧数据。现在就可以解释为什么会存在训练数据不平衡的问题了。在大规模数据集上,每一类的数据都非常多,而抽取的部分旧数据不可能有很多,每次都是取少部分的旧数据,也就是说旧类别中的每一类数据量和新类别每一类的数量相差非常大,两者一起训练的时候,就会存在数据不平衡的问题。
(举个例子:假设旧数据现在有100类,增量学习一次增加10个类别,这个新类别的数据有600个,假如从旧数据中选取1000个样本数据,即每个旧类别挑选10个数据,这样训练的时候每个新类有600个数据,每个旧类别只有10个数据,也就产生了训练数据不平衡)
作者先假设 FC Layer is Biased ,最后一层FC是存在偏置的。然后用两个实验来验证自己的这个假设:
实验一:
用Cifar100做5次增量学习,每次新增20类。下图是80到100的那次增量学习的混淆矩阵。里面的一个点代表True classs被预测成为另一个类的概率,对角线就是这个类被预测正确的概率。可以看到80-100这20个新类对应的对角线都接近红色,即这20个类被预测正确的概率接近于1。而对于0-18这80个旧类别,可以看到对角线的概率不高,但是横坐标80-10,纵坐标0-80这个区域颜色相对更亮,即0-80这些旧类别被预测成80-100这20个新类的概率更高。即旧类更倾向于被预测成为新类。
实验二:
还是在Cifar10上做的实验。如下图,分五次增量。
蓝线指普通分类器训练结果,
红线指BiC纠正FC层之后的结果,
橙线指用全部的新旧数据训练最后一个FC层的结果,
绿线指用全部的新旧数据训练整个网络的结果。
即用本文的方法BiC纠正最后一个FC层后,更接近于用全部数据训练FC层的效果(毕竟本文只用到部分旧数据+全部新数据),而且和普通FC层的效果更好。即两个实验说明了FC是存在严重偏差的。
Baseline:使用蒸馏损失的增量学习
最后的损失是loss = λ * Distilling Loss + (1- λ ) * CE Loss, λ = n /(n+m),n是旧类中类别数量,m是新类中的。两个损失公式具体见论文。
作者具体的改进其实就是在原来的FC层后面再加了一层FC层(叫做bias correction),具体BiC如下:
Validation Set
作者首先提出将原来的训练数据划分为训练数据和验证数据,
stage 1:训练数据用来训练普通的卷积层和FC层;
stage 2:验证数据用来训练bias correction层;
Bias Correction Layer
这一层就是更具前一层的FC层(原来的最后一层FC)做的线性变换来的:
Ok就是新模型的输出,size 1*(n + m)。bias correction层前n个类别的输出不变,对后m个输出做一个线性变换(纠正原来的新类别输出,因为原来旧类别会更倾向于预测成新类别)。即这一层就两个参数,这两个参数用val来训练。
作者最后还讨论了训练集验证集的比例和从旧数据如何选取样例的问题,最后认为9:1的比例更好,样例的选取时,随机和按照iCaRL中提到的方法选取相差一个点。