2018-ECCV-《End-to-End Incremental Learning》论文阅读笔记

2018-ECCV-《End-to-End Incremental Learning》

论文地址:https://arxiv.org/abs/1807.09536

代码地址:https://github.com/fmcp/EndToEndIncrementalLearning

摘要

尽管深度学习方法近年来因其最先进的结果而脱颖而出,但依旧面临着灾难性遗忘的问题——当新类增量添加进行训练时,整体性能急剧下降。

这是由于现在的神经网络架构需要整个数据集(包括旧类和新类的样本)来更新模型,但是随着类别的数量在不断增加,这一要求不能得到满足。

我们通过增量学习深度神经网络的方法来解决这个问题,使用新数据,并且仅使用和旧类相关的少量示例集。这是基于一个蒸馏损失(保留从旧类中学到的知识)和一个交叉熵损失(学习新类)组成的loss。我们的增量训练是在保持整个框架端到端的同时实现的,即共同学习数据表示和分类器,这与最近没有此类保证的方法不同。

我们在CIFAR-100和ImageNet(ILSVRC 2012)图像分类数据集上进行了实验,并展示了最先进的性能。

1 Introduction 

开发针对现实世界应用的视觉识别系统的主要挑战之一是增量学习分类器,其中新类是不断学习的。………………..

用于分类的真正增量式深度学习方法的特点是

(i)能够从数据流中训练,类以任何顺序出现,并且随时出现;

(ii) 在新旧类别分类方面表现良好;

(iii) 模型的合理数量的参数和内存要求;

(iv)端到端学习机制,共同更新分类器和特征表示。

因此,理想的方法将能够以增量方式在无限多的类上进行训练,而不会损失准确性,并且具有完全相同数量的参数,就好像它是从头开始训练的一样。

现有的增量学习方法[4,9,13,14,16,23,26,28,30,32,34,37]都没有满足所有这些约束。它们通常将分类器和表示学习任务分离[23],或者仅限于非常特定的情况,例如,从新数据集中学习,但不从与旧数据集相关的新类中学习[9,13,16,34],或特定问题,例如对象检测[30]。其中一些[4,26]与传统的分类器(如SVM)相关联,不适合深度学习架构。其他 [14, 28, 32, 37] 导致参数或层数的迅速增加,导致随着类数的增加而占用大量内存。总而言之,没有最先进的方法可以满足真正增量学习者的所有特征。

本文的主要贡献是通过我们为增量学习设计的端到端方法来应对这一挑战。该模型可以通过任何深度学习结构以及我们的代表性内存组件来实现,这类似于用于维护与旧类相对应的一小组样本的示例集(见第3.1节)。该模型是通过最小化交叉蒸馏损失(cross-distilled loss)来学习的,交叉蒸馏损失是两种损失函数的组合:交叉熵学习新类蒸馏以保留先前从旧类学习到的知识(见第3.2节)。如第4节所述,任何深度学习架构都可以适应我们的增量学习框架,唯一的要求是用我们新的增量损失替换其原始损失函数。最后,我们说明了我们的图像分类方法在CIFAR-100 [15]和ImageNet [27]上获得最先进的增量学习结果方面的有效性(参见第6节和第7节)。

2 Related Work

描述了和作者方法相关的一些方法,分为:传统的、其他的。

2.1 Traditional approaches

Overall,所有这些方法的主要缺点是缺少特定于任务的数据表示,从而导致性能降低。

2.2 Deep learning approaches

………..

Rebuffi等人[23]提出了iCaRL,一种增量学习方法,其中学习分类器和数据表示的任务是分离的。iCaRL使用传统的NMC对测试样本进行分类,即它维护一个包含新旧数据样本的辅助集。数据表示模型是一种标准神经网络,当新样本可用时,使用蒸馏和分类损失的组合进行更新[12,16]。

虽然我们的方法还使用了旧类中的一些示例作为代表性内存组件中的示例(参见 Sec. 3.1),但它通过以端到端的方式共同学习分类器和特征克服了以前工作的局限性

3 Our Model

我们端到端的方法使用用交叉-蒸馏损失函数训练的深度网络,即交叉熵和蒸馏损失。

该网络可以基于为分类而设计的大多数深度模型的架构,因为我们的方法不需要任何特定的属性。

分类的典型体系结构如图1,具有一个分类层和一个分类损失。此分类层使用特征提取器中的要素来生成一组logits,这些logit由softmax层转换为类别的分数。唯一必要的修改是损失函数,如第3.2节所述。为了帮助我们的模型保留从旧类中获得的知识,我们使用一个代表性内存(第3.1节)存储和管理旧类中最具代表性的样本。除此之外,我们还执行了数据增强和均衡微调(第4节)。所有这些组件放在一起,使我们能够获得最先进的结果。

3.1 Representative memory 代表性内存(感觉这里和2017-CVPR-iCaRL论文里的一样,控制内存容量为K,选择示例、删除示例)

当将新类添加到当前模型时,将从中选择一个子集,其中包含最具代表性样本,并将其存储在代表性存储器(representative memory)中。

我们在这项工作中研究了两种内存设置

  • 1)第一种设置:考虑容量有效的K个样本的内存。那么每个类别的样本数量n=K/c,c为存储在内存中的类别数,K是内存容量。
  • 2)第二种设置:每个类别存储恒定数量的示例。因此,内存的大小随着类的数量而增长。

代表性内存执行两个操作:

  • 选择要存储的新样本基于herding selection,它根据一个类的平均样本的距离生成一个类的样本排序列表。给定样本的排序列表,选择列表的前n个样本。
  • 去除剩余样本:此步骤在训练过程之后执行,以便为新类中的样本分配内存。由于示例存储在排序列表中,因此此操作非常简单。存储单元只需要从每个类的示例集的末尾删除样本

3.2 Deep network 深度网络

为了构建我们的增量学习框架:

  • 我们从传统的、非增量的深度架构开始,用于第一组的分类。
  • 当训练新类时,我们添加与这些类相对应的新分类层,并将其连接到特征提取器和组件以计算交叉蒸馏损失。

任何架构都可以与我们的方法一起使用,只需在必要时添加增量分类层和交叉蒸馏的损失函数即可。

Cross-distilled loss function 交叉蒸馏损失

  • 蒸馏损失应用于旧类的分类层
  • 多类交叉熵损失应用于所有分类层

4 Incremental Learning 增量学习

我们方法的增量学习步骤主要有4个,如图2所示:

  • 1)训练集的构造,准备在第二阶段使用的训练数据
  • 2)训练过程,拟合给定训练数据的模型
  • 3)使用训练数据的子集进行微调,此阶段包含每个类的相同数量的样本
  • 4)更新代表性内存以包含来自新类的样本

4.1 Construction of the training set 训练集的构造

  • 我们的训练集包含:
    • 新类的样本
    • 在代表性内存里存储的旧类示例
  • 我们的方法使用两种损失函数:
    • 分类损失:我们使用one-hot向量,它指示图像中出现的类。
    • 蒸馏损失:我们使用每个分类层与旧类(图1中的灰色全连接层)产生的logits作为标签。因此,每个样本的蒸馏标签数与具有旧类的分类层一样多
  • 为了加强旧知识,新类别的样品也用于蒸馏。这样,所有图像都会为两种损耗生成渐变。因此,当网络评估图像时,输出编码组成深度模型每一层的权重的行为,而与它的标签无关。我们的训练集的每个图像都有1个分类标签和F个蒸馏标签参看公式1。请注意,此标签提取在每个增量步骤中执行。
  • 考虑一个示例场景以更好地理解此步骤,其中我们正在执行模型的第三个增量步骤(图 1)。此时,模型有三个分类层(N = 3),其中两个将处理旧类(灰色框),即F = 2,其中一个对新类(绿色框)进行操作。评估样本时,使用旧类的两个分类图层生成的 logits 用于蒸馏(黄色箭头),使用三个分类层生成的 logits 进行分类(蓝色箭头)。

4.2 Training process 训练过程

我们的交叉蒸馏损失函数(方程 1)采用增强训练集及其相应的标签,并生成一组梯度来优化模型。

请注意,在训练期间,模型的所有权重都会更新。因此,对于任何样本,从特征提取器获得的特征很可能在连续的增量步骤之间发生变化,分类层应调整其权重以处理这些新特征。这是与其他一些增量方法(如 [16])的重要区别,其中特征提取器被冻结,并且仅训练分类图层

4.3 Balanced fine-tuning 均衡微调

由于我们不存储来自旧类的所有样本,因此可用于训练的这些类的样本可能明显低于新类的样本。

为了处理这种不平衡的训练场景,我们添加了一个额外的微调阶段,学习速率小,样本子集平衡。

新的训练子集包含每个类相同数量的样本,无论它们属于新类还是旧类。根据第 3.1 节中描述的选择算法,该子集是通过减少新类的样本数量来构建的,仅保留每个类中最具代表性的样本。通过从新类中删除样本,模型可能会忘记在上一个训练步骤中获得的知识。我们通过向新类的分类层添加临时蒸馏损失来避免这种情况。

4.4 Representative memory updating 代表性内存更新

在平衡微调步骤之后,必须更新代表性存储器以包括来自新类的示例。这是通过第 3.1 节中所述的选择和移除操作执行的。首先,内存单元从存储的类中删除样本,以便为新类中的样本分配空间。然后,从新类中选择最具代表性的样本,并根据选择算法存储在存储单元中。

5 Implementation Details 执行细节

按照He等人建议的设置[11],我们使用特定于数据集的CNN /深度模型。这使得网络的架构能够适应数据集的特定特征。我们使用 CIFAR-100 的 32 层 ResNetImageNet 的 18 层 ResNet 作为深度模型。我们将 K = 2000 个蒸馏样本存储在 CIFAR-100 的代表性存储器中,将 ImageNet 的 K = 20000 存储。在针对 CIFAR-100 训练模型时,我们通过将像素值除以 255 并减去训练集的平均图像来规范化输入数据。在 ImageNet 的情况下,我们只执行减法,没有像素值归一化,遵循 [11]的实现。

由于没有现成的类增量学习基准,我们遵循将传统多类数据集的类拆分为增量批次的标准设置 [23,30]。

在下面的所有实验中,iCaRL指的是[23]中的最终方法,而hybrid1指的是它们的变体,它使用CNN分类器而不是NMC。LwF.MC 是 LwF [16] 的多类实现,如 [23] 中所述。我们使用了GitHub4中公开提供的iCaRL实现。LwF.MC 的结果也是从此代码中获得的,没有示例用法。我们将每种方法的结果报告为所有增量批次的平均精度请注意,我们不考虑此平均值中第一批的准确性,因为它不对应于增量学习。这与[23]中的评估不同,后者是我们报告的方法结果与已发布结果之间存在差异的原因。

数据增强。我们方法的第二和第三阶段(参见第4节)在训练步骤之前执行数据增强。具体而言,执行的操作包括:

  1. 亮度:通过在 [−63; 63] 范围内添加随机强度值来改变原始图像的强度。

  2. 对比度归一化:原始图像的对比度由范围 [0:2; 1:8] 中的随机值改变。执行的操作是近似 = (im − 平均值) × 对比度 + 平均值。其中 im 是原始图像,均值是每个通道的像素的平均值,对比度是随机对比度值。

  3. 随机裁剪:所有图像(原始,亮度和对比度)都被随机裁剪。

  4. 镜像:计算所有图像(原始,亮度,对比度和裁剪)的镜像。

 6 总结

和2017年的CVPR-iCaRL相比,也是旧类的示例+新类来训练数据,使用交叉蒸馏损失(cross-distilled loss),交叉蒸馏损失是两种损失函数的组合:蒸馏损失(保留从旧类中学到的知识)和交叉熵损失(学习新类)组成的loss

不过感觉它的创新点在于:多了一个端到端的学习方式,共同学习分类器和特征,克服了以前工作的局限性(2017-iCaRL,学习分类器和数据表示的任务是分离的,使用传统的NMC对测试样本进行分类,维护一个包含新旧样本的的辅助集)。

猜你喜欢

转载自blog.csdn.net/weixin_39450145/article/details/124947771