深度学习(增量学习)——CVPR2020:Semantic Drift Compensation for Class-Incremental Learning

文章目录

  • 前言
  • Embedding Network
  • Semantic Drift Compensation

前言

匆忙返校,与朋友们挥别,大学四年,给自己画上了一个完美的句号。

我将看过的增量学习论文建了一个github库,方便各位阅读地址

《Semantic Drift Compensation for Class-Incremental Learning》发表于CVPR2020,该算法针对于class incremental learning设计,与以往使用交叉熵作为损失函数的增量学习算法不同,该文章选用Triple loss作为损失函数,利用LwF、EWC、MAS等文章提出的正则项抵抗遗忘(命名为Embedding Network),在不存储图片的前提下,利用设计的Semantic Drift Compensation算法估计各类别中心,通过NCM分类器(即iCaRL分类器)进行分类预测,得到不错的结果。

简单而言,论文提出了两个对于lifelong learning而言,较新的技术

  • Embedding Network
  • Semantic Drift Compensation

Embedding Network

Embedding Network在结构上与普通的CNN一致,仅仅是损失函数不同,损失函数由分类损失函数,以及抗遗忘正则项两部分组成,Embedding Network未选用传统的交叉熵分类损失函数,而是选用了Triple loss,Triple loss的结构如下:

L T = max ⁡ ( 0 , d + − d − + r ) L_T=\max(0,d_+-d_-+r) LT=max(0,d+d+r)

假设样本a经过CNN编码后,得到的feature vector为 Z a Z_a Za,Embedding Network会另外选择两个样本,一个样本与a属于同一个类别,称为positive sample,编码后的feature vector为 Z p Z_p Zp。另一个样本与a不属于同一个类别,称为negative sample,编码后的feature vector为 Z n Z_n Zn d + d_+ d+ Z a Z_a Za Z p Z_p Zp之间的欧式距离, d − d_- d Z a Z_a Za Z n Z_n Zn之间的欧式距离,若 d + − d − < 0 d_+-d_-<0 d+d<0,则a与正样本的距离较近, d + − d − d_+-d_- d+d越小a与正样本的距离越近。当a离正样本足够近,离负样本足够远时,Triple loss的值将为0,这个度量尺度由超参数r决定。

抗遗忘正则项选用LwF、EWC、MAS论文中的正则项,在此处不在复述,有兴趣的同学可以浏览相应论文。

这里有个疑问,相比于交叉熵,使用triple loss真的更有助于抵抗遗忘吗?为了解答上述疑问,作者给出了实验结果:
深度学习(增量学习)——CVPR2020:Semantic Drift Compensation for Class-Incremental Learning_第1张图片
E-FT表示使用triple loss,finetune的结果, F T ∗ FT^* FT表示使用交叉熵损失函数finetune,利用NCM分类器的结果, F T FT FT表示使用交叉熵损失函数finetune,使用FC分类器的结果,在三个数据集上,triple loss的结果都优于交叉熵损失函数,很有趣,表明triple loss真的更有助于抵抗遗忘,但是为什么增量前的模型要用50类训练呢?50类训练的model,已经相当于pretrain了一个不错的模型,triple loss效果显著,有一定可能是pretrain模型的功劳,直觉上,metric learning可能更依赖于pretrain模型。


Semantic Drift Compensation

Embedding Network使用NCM分类器,在每个类都拥有类别中心的情况下,NCM分类器才可以运作。严格要求下,增量学习不能保存旧类别的图像,这导致无法计算每个类的类别中心,为了解决该问题,作者提出了Semantic Drift Compensation,用于估计类别中心。

一个task由多个类别组成,Embedding Network在学习完第s个task后,会计算并存储每个类别的类别中心,设task s学习完毕后,第 C s C_s Cs类的类别中心为 μ C s s \mu_{C_s}^s μCss

Semantic Drift Compensation利用新task中的数据来估计旧类别中心的偏移量,加上上一轮存储的旧类别中心后,即可得到学习完新task后,旧类别中心的估计量。

具体而言,设当前学习第t个task,在训练之前,Semantic Drift Compensation会计算task t中所有数据的feature vector,其中第 i i i个数据的feature vector为 Z i t − 1 Z_i^{t-1} Zit1,训练完毕后,第 i i i个数据的feature vector为 Z i t Z_i^{t} Zit,则有
δ i t − > t − 1 = Z i t − Z i t − 1 (1.0) \delta_i^{t->{t-1}}=Z_i^{t}-Z_i^{t-1}\tag{1.0} δit>t1=ZitZit1(1.0)

依据式1.0,利用task t中的所有数据计算第 C s C_s Cs类类别中心的偏移量:

Δ ^ c s t − 1 − > t = ∑ i w i δ i t − > t − 1 ∑ i w i (2.0) \hat\Delta_{c^s}^{t-1->t}=\frac{\sum_i w_i\delta_i^{t->{t-1}}}{\sum_iw_i}\tag{2.0} Δ^cst1>t=iwiiwiδit>t1(2.0)
w i = e − ∣ ∣ Z i t − 1 − μ C s t − 1 ∣ ∣ 2 2 δ 2 (3.0) w_i=e^{-\frac{||Z_i^{t-1}-\mu_{C_s}^{t-1}||^2}{2\delta^2}}\tag{3.0} wi=e2δ2Zit1μCst12(3.0)

δ \delta δ为超参数,则task t训练完毕后,第 C s C_s Cs类类别中心的估计值为

μ C s t = μ C s t − 1 + Δ ^ c s t − 1 − > t (4.0) \mu_{C_s}^t=\mu_{C_s}^{t-1}+\hat\Delta_{c^s}^{t-1->t}\tag{4.0} μCst=μCst1+Δ^cst1>t(4.0)

式2.0利用task t中每个数据点偏移量的加权平均来计算旧类别类别中心的偏移量,其中权重由式3.0给出,个人无法解释为什么如此设计,作者也没给出一个合理的解释。

为了证明经过SDC(Semantic Drift Compensation)处理后的类别中心更靠近真实的类别中心,作者给出了以下实验结果:
深度学习(增量学习)——CVPR2020:Semantic Drift Compensation for Class-Incremental Learning_第2张图片
E-FT、E-LwF、E-EWC、E-MAS表示训练完第t个类别后,存储第t个类别的类别中心,后续分类直接使用,而SDC会在后续分类中更新第t个类别的类别中心。可以看到,SDC确定的类别中心离真实的类别中心更近一些。

如果您想了解更多有关深度学习、机器学习基础知识,或是java开发、大数据相关的知识,欢迎关注我们的公众号,我将在公众号上不定期更新深度学习、机器学习相关的基础知识,分享深度学习中有趣文章的阅读笔记。

深度学习(增量学习)——CVPR2020:Semantic Drift Compensation for Class-Incremental Learning_第3张图片

你可能感兴趣的:(增量学习)