结合知识蒸馏的增量学习方法总结

结合知识蒸馏的增量学习方法总结

知识蒸馏(Knowledge Distillation)最早是在Hinton的《Distilling the Knowledge in a Neural Network》一文中提出,运用在图像分类任务上,并迅速在其他领域广泛应用开来。

知识蒸馏通过引入教师网络(Teacher network:复杂度高、但推理性能优越)以指导学生网络(Student network:复杂度低、简单)的训练,实现知识迁移(Knowledge transfer)。知识蒸馏具体的介绍及发展不在这赘述。

增量学习的概念,是指一个学习系统能不断地从新样本中学习新的知识,并能保存大部分以前已经学习到的知识。就像我们从小开始学习新东西,但是也能记住之前学习到的知识。

期望的增量学习系统应该有这样四个特点:

  1. 可以学习到新信息中的有用信息;
  2. 不需要访问已经用于训练分类器的原始数据;
  3. 对已经学习到的知识具有记忆功能;
  4. 在面对新数据中包含的新类别时,可以有效地进行处理。

但是机器学习、深度学习这些神经网络有个很严重的问题是,只会去拟合当前数据集的分布,如果在新的数据集上再训练,就会产生灾难性遗忘,学了新的忘了旧的。

本文总结了4篇用到知识蒸馏思想来做增量学习的代表性论文,也是增量学习领域内的重要论文

1.《Learning without Forgetting》(ECCV 2016)

论文地址:https://arxiv.org/pdf/1606.09282.pdf
详细解读:https://zhuanlan.zhihu.com/p/51587674
本篇论文可以说是利用深度学习来做增量学习的里程碑之作,具有非常重要的意义。
不需要旧的数据
论文提出了增量学习中常见的几种方法(a)为针对旧任务设计的原始模型,(b)为微调,原模型除旧任务输出层参数外其他所有参数以及新任务相关新参数都在训练过程中进行优化,(c)为特征提取,只将原模型当做一个特征提取器,只训练跟新任务相关的新参数,(d)为联合训练,需要旧数据,所有新旧数据结合在一起,所有参数均在训练过程中被优化,往往可以达到一个最优的结果,但参数量可能会十分爆炸,效率低下。

而在本篇论文中提出的LwF方法(e)可以视为是知识蒸馏网络和微调方法的结合。

LwF尝试只使用新数据集对新任务进行监督学习,对旧任务进行非监督学习,训练优化得到新的网络参数。

训练过程:

  1. 现有一个在old数据上训练得到的模型M,
  2. 输入新数据,得到的输出是旧模型M对新数据的旧类别输出Yo,
  3. 用新数据微调M得到M’(M’包括所有类的输出),loss函数分为下面三部分:
    • 现在M’对新数据的旧类别输出Yo’与Yo之间的蒸馏loss,
    • M’对新数据的新类别输出Yn’与ground truth Yn之间的交叉墒,
    • 正则化。

2. 《iCaRL: Incremental Classifier and Representation Learning》(CVPR 2017)

论文地址:
http://openaccess.thecvf.com/content_cvpr_2017/papers/Rebuffi_iCaRL_Incremental_Classifier_CVPR_2017_paper.pdf
与LWF不同点:

  1. 利用一部分旧数据,构建exemplar。

  2. 特征表示与分类器两个部分是分开的。特征表示部分的参数固定,调整的是分类器部分的参数。

训练过程:

  1. 使用特征提取器φ(⋅)对新旧数据的(旧数据只取一部分)提取特征向量,并计算出各自的平均特征向量

  2. 通过最近均值分类算法(Nearest-Mean-of-Examplars) 计算出新旧数据的预测值

  3. 在上面得到的预测值代入如下loss函数进行优化,最终得到模型

  4. 每次增量学习的时候调整exemplar(删去一些旧数据,加入一些新数据,保持exemplar大小不变,每个类的数据量相同)

loss函数与LWF类似,包括蒸馏loss和分类loss。只不过因为有旧数据,所以旧数据是旧模型的输出与当前输出的蒸馏loss,新数据是分类loss。
实验数据集:iCIFAR-100、ImageNet ILSVRC 2012

3.《End-to-End Incremental Learning》(ECCV 2018)

论文地址:http://openaccess.thecvf.com/content_ECCV_2018/papers/Francisco_M._Castro_End-to-End_Incremental_Learning_ECCV_2018_paper.pdf
利用一部分旧数据:与iCaRL一样的exemplar。
特征提取器与分类器同时学习:在旧类别数据上使用知识蒸馏loss进行训练,在新类别数据上采用分类交叉熵loss进行训练,并且可以同时端到端地训练特征抽取器以及分类器。
加入数据平衡的微调fine tune阶段:数据集构造时,使用herding selection算法,从新类别数据中抽取部分数据,构成与旧类别examplar大小相等的数据集,此时数据各类别之间达到平衡,利用该数据集,在小学习率下对模型进行微调,可以很好地解决灾难性遗忘问题。
训练过程:

  1. 新数据(大量)与少量旧数据(exemplar)合在一起,训练网络。loss函数分为旧数据蒸馏loss与新数据分类loss
  2. 对所有网络参数都进行更新。
  3. 微调阶段:使用herding selection算法,从新类别数据中抽取部分数据,构成与旧类别examplar大小相等的数据集,此时数据各类别之间达到平衡,利用该数据集,在小学习率下对模型进行微调,
  4. exemplar更新

实验数据集:iCIFAR-100、ImageNet ILSVRC 2012

4.《Large Scale Incremental Learning》(CVPR 2019)

论文地址:
http://openaccess.thecvf.com/content_CVPR_2019/papers/Wu_Large_Scale_Incremental_Learning_CVPR_2019_paper.pdf
主要是针对大数据集提出BiC模型,通过引入一个偏置修正层来很好地解决数据偏好问题。
文章中发现,增量学习中,FC 层对新数据有很大的偏向,出现分类偏好。所以,在 FC 层后引入一个偏置纠正层,进行 Bias 的纠正:
训练过程:

  1. 数据集划分:新数据>>旧数据。新旧数据都分别分成训练集和验证集
  2. 用新旧结合的训练集训练模型,和大部分增量学习模型的训练方式一样,采用知识蒸馏loss和交叉熵loss结合训练CNN模型。
  3. 修正偏置层。其实就是一个线性回归层,只有两个参数,训练速度快,实际效果也还不错,在训练第二阶段,使用数据val_old和val_new来训练偏置修正层。

通过这样两阶段的训练,模型最后能在新任务以及旧任务上都表现出良好的性能,展现了其优越的鲁棒性。
实验结果显示,相对前三个模型,BiC模型基本达到了SOTA水平。

实验数据集:MS-Celeb-1M、iCIFAR-100、ImageNet ILSVRC 2012

参考:https://zhuanlan.zhihu.com/p/107496421

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