增量学习
Python编程在线资源
增量学习的概念
人类有终身不断获取、调整和转移知识的能力,虽然在我们的一生中,我们确实倾向于逐渐忘记之前学习过的知识,但只有在极少的情况下,对新知识的学习会灾难性地影响已经学到的知识,这样的学习能力被称为增量学习的能力。
具体来讲,「增量学习的能力就是能够不断地处理现实世界
中连续的信息流,在吸收新知识的同时保留甚至整合、优化旧知识的能力。」
增量学习(Incremental Learning)已经有20多年的研究历史,但增量学习更多地起源于认知神经科学对记忆和遗忘机制的研究,因此不少论文的idea都启发于认知科学的发展成果,本文不会探讨增量学习的生物启发,关于面向生物学和认知科学的增量学习综述可见 Continual lifelong learning with neural networks: A review1。
为什么要增量学习
在机器学习领域,增量学习致力于解决模型训练的一个普遍缺陷:「灾难性遗忘(catastrophic forgetting)」 ,也就是说,一般的机器学习模型(尤其是基于反向传播的深度学习方法)在新任务上训练时,在旧任务上的表现通常会显著下降。
造成灾难性遗忘的一个主要原因是 「传统模型假设数据分布是固定或平稳的,训练样本是独立同分布的」,所以模型可以一遍又一遍地看到所有任务相同的数据,但当数据变为连续的数据流时,训练数据的分布就是非平稳的,模型从非平稳的数据分布中持续不断地获取知识时,新知识会干扰旧知识,从而导致模型性能的快速下降,甚至完全覆盖或遗忘以前学习到的旧知识。
为了克服灾难性遗忘,我们希望模型一方面必须表现出从新数据中整合新知识和提炼已有知识的能力(可塑性),另一方面又必须防止新输入对已有知识的显著干扰(稳定性)。这两个互相冲突的需求构成了所谓的「稳定性-可塑性困境(stability-plasticity dilemma)」。
解决灾难性遗忘最简单粗暴的方案就是使用所有已知的数据重新训练网络参数,以适应数据分布随时间的变化。尽管从头训练模型的确完全解决了灾难性遗忘问题,但这种方法效率非常低,极大地阻碍了模型实时地学习新数据。而增量学习的主要目标就是在计算和存储资源有限的条件下,在稳定性-可塑性困境中寻找效用最大的平衡点。
增量学习的特点
增量学习和持续学习(Continual Learning)、终身学习(Lifelong Learning)的概念大致是等价的,它们都是在连续的数据流中训练模型,随着时间的推移,更多的数据逐渐可用,同时旧数据可能由于存储限制或隐私保护等原因而逐渐不可用,并且学习任务的类型和数量没有预定义(例如分类任务中的类别数)。
但增量学习目前还没有一个特别清晰的定义,因此比较容易与在线学习,迁移学习和多任务学习等概念混淆,「尤其要注意增量学习和在线学习的区别,在线学习通常要求每个样本只能使用一次,且数据全都来自于同一个任务,而增量学习是多任务的,但它允许在进入下一个任务之前多次处理当前任务的数据」。上图表现了增量学习和其他学习范式的区别,一般来说,增量学习有如下几个特点:
- 学习新知识的同时能够保留以前学习到的大部分知识,也就是模型在旧任务和新任务上均能表现良好。
- 计算能力与内存应该随着类别数的增加固定或者缓慢增长,最理想的情况是一旦完成某一任务的学习,该任务的观测样本便被全部丢弃。
- 模型可以从新任务和新数据中持续学习新知识,当新任务在不同时间出现,它都是可训练的。
由于增量学习问题的复杂性和挑战的多样性,人们通常只讨论特定设置下的增量学习。以一个图像分类模型为例,我们希望模型具有增量学习新的图像和新的类别的能力,但前者更多地与迁移学习有关,因此任务增量学习(Task-incremental Learning)和难度更高一点的类增量学习(Class-incremental Learning)是深度学习社区当前主要考虑的增量学习范式。
「本文主要讨论近几年关注度最高的类增量学习范式」,更广泛更详细的增量学习介绍可参考专著《Lifelong Machine Learning》2。
online machine learning 与 incremental learning
Is online machine learning the same as incremental learning?
The difference is that on-line learning learns a model when the training instances arrive sequentially one by one (1-by-1), whereas incremental learning updates a model when a new batch of data instances arrive.
增量学习的实现方式
增量学习是一个连续不断的学习过程,在这个过程中,我们假设模型已经学习了前 n 个任务:
T
1
T_{1}
T1,
T
2
T_{2}
T2, …,
T
n
T_{n}
Tn,当面对任务
T
n
+
1
T_{n+1}
Tn+1和对应的数据
D
n
+
1
D_{n+1}
Dn+1时,我们希望可以利用从旧任务中学习到的先验知识帮助
T
n
+
1
T_{n+1}
Tn+1的学习,然后更新模型所学习到的知识。这个过程要求我们在当前任务 T中寻找参数
θ
∗
\theta^*
θ∗最小化下面的损失函数:
其中旧数据
(
X
(
t
)
,
Y
(
t
)
)
,
t
<
T
(X^{(t)},Y^{(t)}),t<T
(X(t),Y(t)),t<T 是部分可见或完全不可见的。
增量学习方法的种类有很多种划分方式,本文将其划分为以下三种范式:
- 正则化(regularization)
- 回放(replay)
- 参数隔离(parameter isolation)
其中基于正则化和回放的增量学习范式受到的关注更多,也更接近增量学习的真实目标,参数隔离范式需要引入较多的参数和计算量,因此通常只能用于较简单的任务增量学习。关于其他划分方式和不同类别的增量学习的优缺点对比可见A Comprehensive Study of Class Incremental Learning Algorithms for Visual Tasks3,下面仅介绍基于正则化和回放的增量学习的经典方法以及相关进展。
基于正则化的增量学习
基于正则化的增量学习的主要思想是「通过给新任务的损失函数施加约束的方法来保护旧知识不被新知识覆盖」,这类方法通常不需要用旧数据来让模型复习已学习的任务,因此是最优雅的一类增量学习方法。Learning without Forgetting (ECCV 2016)4提出的LwF算法是基于深度学习的增量学习的里程碑之作,在介绍LwF算法之前,我们先了解一些最简单的增量学习方法。
上图展示了一个具有多头网络结构的模型学习新任务的不同策略,其中(a)为已经训练好的基于CNN的原始模型,
θ
s
\theta_s
θs表示不同任务共享的CNN参数,
θ
0
\theta_0
θ0表示与原始任务相关的MLP参数,当加入一个新的分类任务时,我们可以增加一个随机初始化的MLP参数
θ
n
\theta_n
θn.基于
θ
s
,
θ
0
\theta_s,\theta_0
θs,θ0来学习
θ
n
\theta_n
θn的方法包括如下几类:
- 微调(Fine-tuning):微调没有旧任务参数和样本的指导,因此模型在旧任务上的表现几乎一定会变差,也就是发生灾难性遗忘。
- 联合训练(Joint Training):联合训练相当于在所有已知数据上重新训练模型,效果最好,因此通常被认为是「增量学习的性能上界」,但训练成本太高。
- 特征抽取(Feature Extraction):特征抽取只训练 θ n \theta_n θn,