前言
CVPR2022上的增量文章有些繁杂,具体体现在不少文章提出了新的实验设置来评估模型,不是很合个人胃口,故总结的不多,但有一篇将因果推断与增量结合的文章很有趣,文章名为《Distilling Causal Effect of Data in Class-Incremental Learning》,ICCV2022上的增量文章比较常规,有不少工作将自监督与增量做结合,本文将总结《Contrastive Continual Learning》
Contrastive Continual Learning
一般而言,有监督算法会逐步过滤掉与任务无关的特征,例如雪梨和苹果的二分类任务,特征提取器器只需要编码颜色相关的特征,即可让分类器区分两者,这表明有监督编码的特征较为有限。如果我们能训练一个能编码冗余特征的特征提取器,即使特征提取器遗忘了部分特征,这些冗余特征可能也可以用来刻画新的类别,基于此,作者提出了使用自监督训练具有冗余特征的特征提取器,同时利用知识蒸馏抵抗灾难性遗忘。
设当前batch中共有
N
N
N张当前任务的图像,对这
N
N
N张图像分别施加两次数据增强,得到
2
N
2N
2N张图像,这
2
N
2N
2N张图像组成集合
S
S
S,
p
i
p_i
pi为图像
i
i
i的正例集合,图像
i
i
i的正例集合包含图像
i
i
i数据增强后得到的图像,以及与图像
i
i
i同一类的图像,特征提取器针对图像
i
i
i的输出为
z
i
z_i
zi,则Contrastive Continual Learning的损失函数为
L
a
s
y
m
s
u
p
=
∑
i
∈
S
−
1
∣
p
i
∣
∑
j
∈
p
i
log
exp
(
z
i
∗
z
j
/
T
)
∑
k
≠
i
exp
(
z
i
∗
z
k
/
T
)
(1.0)
L_{asym}^{sup}=\sum_{i \in S}\frac{-1}{|p_i|}\sum_{j\in p_i}\log \frac{\exp(z_i*z_j/T)}{\sum_{k \not= i }\exp(z_i*z_k/T)}\tag{1.0}
Lasymsup=i∈S∑∣pi∣−1j∈pi∑log∑k=iexp(zi∗zk/T)exp(zi∗zj/T)(1.0)
其实就是InfoNCE的变种,
T
T
T为超参数,值得注意的是,旧样本只会作为对比学习中的负例,只参与计算
∑
k
≠
i
exp
(
z
i
∗
z
k
/
T
)
\sum_{k \not= i }\exp(z_i*z_k/T)
∑k=iexp(zi∗zk/T)中,如下所示(IRD是知识蒸馏loss,下文会介绍),作者发现这么做效果会更好
设
M
M
M为batch中的图像集合,则上图中的
L
s
u
p
L^{sup}
Lsup为
L
s
u
p
=
∑
i
∈
M
−
1
∣
p
i
∣
∑
j
∈
p
i
log
exp
(
z
i
∗
z
j
/
T
)
∑
k
≠
i
exp
(
z
i
∗
z
k
/
T
)
L^{sup}=\sum_{i \in M}\frac{-1}{|p_i|}\sum_{j\in p_i}\log \frac{\exp(z_i*z_j/T)}{\sum_{k \not= i }\exp(z_i*z_k/T)}
Lsup=i∈M∑∣pi∣−1j∈pi∑log∑k=iexp(zi∗zk/T)exp(zi∗zj/T)
为了抵抗灾难性遗忘,作者引入了知识蒸馏,针对图像
i
i
i,可以得到一个向量
P
=
[
P
i
,
1
,
P
i
,
2
,
.
.
.
.
P
i
,
i
−
1
,
P
i
,
i
+
1
,
.
.
.
.
P
i
,
2
N
]
(2.0)
P=[P_{i,1},P_{i,2},....P_{i,i-1},P_{i,i+1},....P_{i,2N}]\tag{2.0}
P=[Pi,1,Pi,2,....Pi,i−1,Pi,i+1,....Pi,2N](2.0)
其中
P
i
,
j
=
log
exp
(
z
i
∗
z
j
/
T
)
∑
k
≠
i
2
N
exp
(
z
i
∗
z
k
/
T
)
P_{i,j}=\log \frac{\exp(z_i*z_j/T)}{\sum_{k \not= i }^{2N}\exp(z_i*z_k/T)}
Pi,j=log∑k=i2Nexp(zi∗zk/T)exp(zi∗zj/T)
对于图像
i
i
i,设旧模型输出的式2.0为
P
o
P_{o}
Po,新模型输出的式2.0为
P
n
P_{n}
Pn,则知识蒸馏的loss为
L
I
R
D
=
−
∑
i
=
1
2
N
P
o
log
P
n
(3.0)
L_{IRD}=-\sum_{i=1}^{2N}P_{o}\log P_{n} \tag{3.0}
LIRD=−i=1∑2NPologPn(3.0)
总的损失函数为
L
=
L
a
s
y
m
s
u
p
+
λ
L
I
R
D
L=L_{asym}^{sup}+\lambda L_{IRD}
L=Lasymsup+λLIRD
λ
\lambda
λ为超参数,上述流程为训练特征提取器,特征提取器训练完毕后,作者将freeze特征提取器,同时在顶层添加分类器,利用保留的旧数据和当前数据训练分类器,保存的旧数据总量是固定的。
实验
为了验证自监督相比于有监督,可以编码更多的特征,作者做了一个实验,持续学习完毕后,将特征提取器固定,同时提供所有的训练数据训练分类器,在CIFAR10上,与有监督算法的对比如下图
我们看右边两幅图,这幅图表示学习完task i任务后,固定特征提取器,利用CIFAR10所有数据训练分类器,在CIFAR10上的准确率,可见自监督学习的确可以编码部分冗余特征,并且这类冗余特征有助于刻画后续的任务特征。
与其他method的实验对比如下图
思考
增量学习关注的是如何通过某种策略保留学到的旧知识,这篇文章并没有对此提出新的策略,反而是提出了如何让学到的特征更有助于编码新知识(这个问题是难以解决的,只能碰运气,比如新任务出现了严重的domain shift),换句话说,这篇文章只是给了一个策略用于构造较为鲁棒的特征空间,感觉上并没有解决增量学习的根源问题,有点写作文离题的感觉。但总体而言是值得发表的,这篇文章给人的insight便是自监督得到的模型能编码一些冗余特征,这类冗余特征可能有助于编码新任务。
自监督一般会引入额外的数据增强,如果有监督使用此类数据增强,是否也能让模型编码冗余特征?