[论文阅读] iCaRL: Incremental Classifier and Representation Learning

论文地址:https://openaccess.thecvf.com/content_cvpr_2017/html/Rebuffi_iCaRL_Incremental_Classifier_CVPR_2017_paper.html
代码:https://github.com/srebuffi/iCaRL
发表于:CVPR 17

Abstract

人工智能道路上的一个主要的开放性问题是开发渐进式学习系统,随着时间的推移从数据流中学习越来越多的概念。在这项工作中,我们介绍了一种新的训练策略,即iCaRL,它允许以这种类增量的方式进行学习:只有少数类的训练数据必须同时存在,而新的类可以逐步增加。iCaRL同时学习强分类器和数据表示法。这使它区别于早期的工作,这些工作从根本上受限于固定的数据表示,因此与深度学习架构不兼容。我们通过对CIFAR-100和ImageNet ILSVRC 2012数据的实验表明,iCaRL可以在很长一段时间内逐步学习许多类别,而其他策略很快就会失败。

I. Introduction

从某种角度看,本文与Learning without Forgetting(ECCV 16)[1]一起,构成了深度类增量学习(Class-Incremental Learning, CIL)的开山之作。尤其是iCaRL本身定义好了相对完整的"刷榜规范",使得后续出现了许多有关CIL的研究。为此这里我们首先对CIL进行一个简单的介绍。

(类)增量学习其实是个在落地中十分现实的问题。一般来讲,在我们炼丹的时候,如果有新数据加入,那么为了刷点,我们是需要将所有的新旧数据都拿去训练的。然而在实际工程中不可能这么搞,因为retrain是非常花时间的,何况可能每时每刻都会有新的业务数据被加入(一个典型的例子为人脸识别)。

至此,一个直观的想法是直接把新数据拿去finetune,以获得新数据中的知识。但这么做有个问题,由于只在新数据上训练,对于网络本身而言,其目标单纯就是使得新数据的loss尽可能的更低,而不需要去考虑旧任务的性能。为此,这么一通操作下来后,新任务的性能是上来了,而旧任务的性能往往会下降非常明显。而增量学习这一任务的目的就是尽可能地去保留新旧任务的性能,终极目标是构建一个不会遗忘旧有知识的学习系统。

II. Definition

这节我们以一个例子来说明增量学习的实验室设置。既然是类-增量学习,也就是说研究的是图像分类任务。以Cifar-100为例,首先,随机选取10个类,并在这10个类上训练收敛。接着,新获得了10个类,网络在10个新类的图像上继续训练,而不再使用旧有的(10个类)数据。如此反复,直到使用完100个类。每轮的测试是在目前已知的类上进行的(不考虑尚未加入训练的类),换而言之就是新旧类的平均度。实验结果往往都是一张长这样的图:
在这里插入图片描述
由于初始类(包括后续类)的选择以及顺序都可能对性能产生影响,为此最终的实验往往是多个随机种子取平均。此外,需要注意一点的是,虽然上面讲的是"不再使用旧有的(10个类)数据",然而实际工作中,为了保证旧任务的性能,许多CIL会维护一个小型的旧样本库,这些样本也会与每轮的新样本一起训练,iCaRL也采用了这种思路。这类方法可以被称作基于示范(exemplar-based,示范指的就是上面的旧样本)的方法。与之相对的,也有彻底不依赖旧样本的方法(如LwF[1]),不过这种情况下性能一般就会差些意思了。

接下来,将介绍iCaRL为实现增量学习所采用的方法。

III. Nearest-Mean-of-Exemplars Classification

首先一个问题就是怎么训练。使用全连接+softmax进行分类的话,有个问题,就是全连接层的结点数得和任务的分类数相对应,比如10分类就得有10个结点。但是,类增量学习的设置下类的数量是会不断发生变化的,因此使用传统的FC可能出现问题。

本文的分类采用了类似KNN的思想,即,为每个类计算一个原型(prototype)向量,然后对于一个新样本,其特征和哪个原型接近就属于哪一类。这样的话,原有的类的知识不会受影响(存在原型向量里),而新类也可以很方便地加入。至于原型向量,其实就是算所有该类所有示例样本的特征平均(不用所有样本可能是基于计算效率的考虑)。

IV. Exemplar Management

解决了分类的问题后,下一个问题就是怎么去添加/删除示例样本的问题。

添加: 其实就是一个类似于求聚类中心的概念。对于某一类的所有样本,求这些样本的特征平均,然后选出前 k k k个最接近特征平均的样本作为示例。

删除: iCaRL采取的策略是,每时每刻都利用满内存。假设某一时刻已经观察到了 t t t个类,那么就为每个类存储 k = K / t k = K/t k=K/t个示例(K为最大存储容量)。从这里可以发现,随着新类的加入,一些旧类的样本是要被移除的。而移除的策略也很简单粗暴。记上一轮该类能存储 k k k个示例,而本轮只能存储 k ′ k' k个,那么只需要把 k − k ′ k - k' kk个相对离特征平均更远的样本移除即可(即尽可能地去保留离特征平均近的样本)。

V. Loss

在损失函数中加入蒸馏项,以约束网络在旧类上的输出尽可能保持不变,从而进一步减缓对旧类知识的遗忘: ℓ ( Θ ) = − ∑ ( x i , y i ) ∈ D [ ∑ y = s t δ y = y i log ⁡ g y ( x i ) + δ y ≠ y i log ⁡ ( 1 − g y ( x i ) ) + ∑ y = 1 s − 1 q i y log ⁡ g y ( x i ) + ( 1 − q i y ) log ⁡ ( 1 − g y ( x i ) ) ] \begin{aligned} \ell(\Theta)=-\sum_{\left(x_{i}, y_{i}\right) \in \mathcal{D}} & {\left[\sum_{y=s}^{t} \delta_{y=y_{i}} \log g_{y}\left(x_{i}\right)+\delta_{y \neq y_{i}} \log \left(1-g_{y}\left(x_{i}\right)\right)\right.} \\ +&\left.\sum_{y=1}^{s-1} q_{i}^{y} \log g_{y}\left(x_{i}\right)+\left(1-q_{i}^{y}\right) \log \left(1-g_{y}\left(x_{i}\right)\right)\right] \end{aligned} (Θ)=(xi,yi)D+[y=stδy=yiloggy(xi)+δy=yilog(1gy(xi))y=1s1qiyloggy(xi)+(1qiy)log(1gy(xi))]

Ref

[1] Li, Zhizhong, and Derek Hoiem. “Learning without forgetting.” IEEE transactions on pattern analysis and machine intelligence 40.12 (2017): 2935-2947.

猜你喜欢

转载自blog.csdn.net/qq_40714949/article/details/123667226