链接:/abs/.02500
简介
实现lifelong learning的最大问题便是catastrophic forgetting(机器会把之前的知识忘了)。如何对抗catastrophic forgetting?目前的主流方法有三种:
正则化:学习新的任务时候,我们让参数不要变化太大(不然就没法做之前的任务了)。复述REPLAY:学完一个任务后,存储一些样例,以便之后学新任务的时候使用。架构Architectural:为每个任务向现有的基本模型添加特定于任务的参数。当然,也有容量固定的做法,但主要在CV领域使用,一般不好做nlp终身学习。
本文采取了第二种方法。
在本文()年之前,Replay在nlp的应用集中在文本分类和QA,但有三个缺点:
要存的太多:我们需要一个超大的内存模块,即存储所有训练示例,以实现最佳性能。还是会倒退:虽然该模型可以减轻灾难性遗忘,但其局部适应步骤容易产生负迁移,以至于在最近的任务中表现不如没有任何终身学习规则化的朴素基线。太慢:它的推理速度非常慢,因为每个测试示例都需要大量的局部自适应步骤。
对此,本文的主要贡献有3点:
我们确定了终身学习方法的三个基本原则。我们试图在语言学习中描述它们的特点,并收集现有方法中被忽视的缺点的见解。基于这一分析,我们提出了一个统一这三个原则的meta-lifelong框架。我们的方法是d 'Autume等人()的直接扩展,它明确地将元学习模型作为局部适应的更好初始化。我们进行了大量的实验,以证明我们提出的方法可以利用上述三个原则来实现高效的终身语言学习。我们发现,我们的框架比以前的方法性能更好,同时使用的内存减少了100倍。实验结果表明,该方法能够有效地缓解灾难性遗忘和负迁移,缩小了与多任务学习上限的性能差距。它还可能获得22倍的推理速度。
终身学习的三个基本原则
首先,我们明确一下终身学习的任务形式:
模型按顺序学习Dtrain={D1train,D2train,...,Dntrain}D^{train}=\{ D^{train}_{1},D^{train}_{2},...,D^{train}_{n} \}Dtrain={D1train,D2train,...,Dntrain}共n个任务。
每个任务Dttrain={(xti,yti)}i=1ntD^{train}_{t}=\{ (x^i_t,y^i_t)\}^{n_t}_{i=1}Dttrain={(xti,yti)}i=1nt。
目标是学一个网络:fθ:X→Yf_θ:X \rightarrow Yfθ:X→Y,最小化:
1.Generic Representation通用表征
就像迁移学习一样,跨不同任务传递知识的一个关键思想是学习一种通用表征(如encoder),它能够为所有任务编码有用的信息。
例如,基于正则化的终身学习方法对Loss Function增加了额外的约束,让模型参数θ不要变化那么大。
在语言领域,由于语言模型已经成功地为许多语言理解任务生成高度通用的表示,d 'Autume等人()和Sun等人()都提出使用预训练的语言模型初始化参数,并在DtrainD^{train}Dtrain上进一步训练模型。
2.Experience Rehearsal经历再现
学完一个任务后,存储一些样例,以便之后学新任务的时候使用。
3.Task-specific Finetuning任务特定的微调
在多任务学习中,加入任务特定的参数并对单个任务进行微调已被证明对不同的语言理解任务,甚至多种语言都是有效的。
早期工作将这一想法运用到终身学习中,即:在学习每个新任务时,适当增加一些模型参数。
然而,所有这些方法都需要一个任务描述符,以便知道何时添加新的参数。当不存在这种信号时,局部自适应在推理阶段,使用每个测试样例的K个存储的最近邻进行额外微调。
近期一些工作(d ’ autumn等人,;Khandelwal等人,)的研究表明,通过预处理模型生成的句子embedding可以有效地测量query的相似度,而局部适应可以提高文本分类、QA和语言建模的性能。
框架
在展示框架之前,我们首先回顾一下当时最先进的方法:改进过的MbPA (Model-based Parameter Adaptation)。并展示了这些原则如何帮助我们识别局限性。
Model-based Parameter Adaptation
MbPA的核心方法是用情节记忆episodic memory模块来进行复述。
改进过的MbPA(MbPA++)包含3大部分:
一个预测网络 fθf_θfθ一个key网络 gΦg_ΦgΦ一个记忆模块 MMM
为了学习通用表征,MbPA++使用BERT来初始化fθf_θfθ 和 gΦg_ΦgΦ。每一步,模型通过训练数据(xti,yti)∈Dtrain(x^i_t,y^i_t)∈D^{train}(xti,yti)∈Dtrain来优化损失函数:
为了确定是否要将训练样例添加到内存模块MMM中,我们用预先设定的概率绘制一个伯努利随机变量来控制内存大小。
为了对抗catastrophic forgetting,在MMM中选一个子集SSS(每ntrn_{tr}ntr个样本中选nren_{re}nre个),从而设定replay损失:
在推理阶段,使用key网络gΦg_ΦgΦ(训练时是固定的)将输入数据编码为key,得到第iii个数据xix_ixi的KKK个最近邻上下文NxiN_{xi}Nxi。然后执行局部自适应梯度更新,实现针对特定任务的微调,实现以下目标:
尽管它很有效,但mbpa++的性能提高是以大内存存储和慢推理速度为代价的。这种低效的根源在于它不够协同一致——这三个原则是独立执行的,没有密切的相互作用。特别是:
学习到的通用表征没有对局部适应进行优化,因此需要更多的步骤来实现鲁棒性能;内存模块是随机选择的,缺乏有效减小内存大小的系统选择方法;局部适应在每个测试例中只使用少数邻域,因此在内存较小的情况下容易出现过拟合和负迁移。
Synergistic Meta-lifelong Framework
我们注意到在mbpa++中培训和测试之间存在着差异。
具体来说,通用表征直接对Eq.(2)中的任务损失进行训练,在测试时经过局部适应后进行预测。
因此,模型总是对它所看到的最新任务过拟合,而且它永远不会学习如何有效地经历再现。
然而,根据CLS理论,人类学习系统在本质上是互补的——我们学习结构化知识的方式,也能使我们快速适应情景性信息。
因此,为了解决MbPA++的训练测试差异,我们将通用表征的训练目标从如何更好地执行当前任务,改为如何有效地适应情景记忆。
因此,我们利用meta learning范式交叉三个关键原则,提出了MbPA++的扩展:
为了解决训练和测试的差距,我们的框架学习了一个为局部适应定制的通用表征。为了实现稳健的局部适应,内存模块使用基于多样性的选择标准来减少内存大小。适应小内存,该框架利用粗糙的局部适应来缓解负迁移。
下图中概述了完整的框架,之后我们将详细介绍细节。
算法流程:
通用表征
我们将局部适应融入到通用表征的训练中。
简单来说,我们利用元学习的思想,将局部适应作为基本任务,通用表征作为元任务。即:通用表征经过训练,使其在局部适应后表现良好(又称学习适应)。
因此,对于每个训练示例(xti,yti)∈Dtrain(x^i_t,y^i_t)∈D^{train}(xti,yti)∈Dtrain,我们将Eq.(2)中的任务损失定义为元任务损失:
其中ααα为当前学习速率。
注意,微分需要计算梯度的梯度,这可以通过现代自动微分框架实现。
直观上,我们先用梯度步逼近局部适应,然后对适应后的网络进行优化。
经历再现
基于与元任务丢失相似的原理,我们将式(3)中的记忆replay损失重构为meta-replay损失:
目的是促进所有任务的有效局部适应。
我们使用与MbPA++相同的replay率。
此外,我们提出了一种基于多样性的选择准则,来确定是否应该在内存模块中加入训练样例(xti,yti)∈Dtrain(x^i_t, y^i_t)∈D^{train}(xti,yti)∈Dtrain。
在这里,我们利用关键网络gφg_φgφ通过xtix^i_txti到现有内存的最小距离来估计多样性:
其中p(xti)p(x^i_t)p(xti)是样本xxx被选中的概率,β是缩放参数。
一种直觉的做法是:选择与现有内存不太相似的样例,从而覆盖数据分布的不同部分。
如后文所示,该方法优于基于不确定性的选择规则(Ramalho和Garnelo, ):利用预测网络fθf_θfθ的确定性水平来选择示例。
这是因为当内存MMM不能真实反映数据分布时,局部适应容易产生负迁移。
任务特定的微调
在内存较小的情况下,每个测试样例的局部适应容易产生负迁移。
这是因为关联较小的内存样本更有可能被包含在NxiN_{xi}Nxi中,模型很容易过拟合。
因此,我们考虑更粗粒度的局部适应。例如,我们可以对测试示例进行聚类,并对每个聚类独立进行局部适应。经过试验,本文发现将这就足够了。
我们将所有测试样例视为单个集群。因此,我们将整个内存视为邻居,并从它中随机取样。
和原来的局部适应相比较(相同的batch大小和梯度步骤),这样做有两个好处:(1)对负迁移更鲁棒,(2)更快。