持续学习+元学习+无监督学习文章调研(七)
LEARNING TO LEARN WITHOUT FORGETTING BY MAXIMIZING TRANSFER AND MINIMIZING INTERFERENCE
这篇文章提出了MER++,一种基于元学习的经验回放算法(meta-experience replay),用来实现前向后向的迁移-干扰平衡。
对于持续学习的研究关注于系统在非iid分布数据上顺序学习多个任务的能力,传统的解决视角关注灾难性遗忘,从而导出了EWC等基于正则化的方法。除了灾难性遗忘外,稳定性-可塑性悖论(stability-plasticity delema)是一个更加复杂和全面的角度,在该场景下,模型不经需要保留旧的知识(stability),也需要快速学习新知识(plasticity),从而推导出了基于权重共享的一系列方法,它们旨在通过有限的权重共享实现快速学习。本文的一个重点在于不仅考虑到了前向情况下的trade-off,而且考虑到了模型反向时的情况,也就是说,在学习是不仅考虑到了当前学习对于过往经验的利用和干扰,也考虑了之后继续学习式的类似情况。和其它类似的工作相比,本文(为权重的共享)提供了更加坚实的理论分析,并且基于这些分析给出了天然的元学习的解决方案。
持续学习中的迁移-干扰
对于一个权重 θ \theta θ,损失函数 L L L和两个样本 ( x i , y i ) (x_i,y_i) (xi,yi)和 ( x j , y j ) (x_j,y_j) (xj,yj),它们的梯度之间的迁移可以表达为 ∂ L ( x i , y i ) ∂ θ ⋅ ∂ L ( x i , y i ) ∂ θ > 0 \frac{\partial{L(x_i,y_i)}}{\partial{\theta}}\cdot \frac{\partial{L(x_i,y_i)}}{\partial{\theta}}>0 ∂θ∂L(xi,yi)⋅∂θ∂L(xi,yi)>0,而干扰则相反表示为 ∂ L ( x i , y i ) ∂ θ ⋅ ∂ L ( x i , y i ) ∂ θ < 0 \frac{\partial{L(x_i,y_i)}}{\partial{\theta}}\cdot \frac{\partial{L(x_i,y_i)}}{\partial{\theta}}<0 ∂θ∂L(xi,yi)⋅∂θ∂L(xi,yi)<0。
对于传统的平衡这二者的方法(比如梯度对齐)而言,其关注的重点在过去的任务,这就使得所有的方法都忽略了系统对于将来问题的学习潜力。
而如果从元学习的角度来观察上述问题,为了最大化迁移同时最小化干扰,我们就需要对
∂
L
(
x
i
,
y
i
)
∂
θ
⋅
∂
L
(
x
i
,
y
i
)
∂
θ
\frac{\partial{L(x_i,y_i)}}{\partial{\theta}}\cdot \frac{\partial{L(x_i,y_i)}}{\partial{\theta}}
∂θ∂L(xi,yi)⋅∂θ∂L(xi,yi)最大化,也就是说对于数据集
D
D
D,我们将学习的损失函数修改为:
然而在具体问题中,有几个问题需要解决:
- 损失函数中的样本i和j应该是随机采样的数据点,而在数据流中无法做到,对此本文采取了基于experienc replay的方法。
- 和很多元学习方法一样,该损失函数需要进行二阶求导,而本文在实际中采用一阶泰勒展开近似。
算法流程
RESERVOIR SAMPLING & ER
该方法由Vitter等在1985年提出,用于在不知道
N
N
N的情况下(一个个样本到来时)在线从
N
N
N个样本中采样
M
M
M个样本的同时确保每个样本被采样的几率均等(简而言之,该方法被用于在每个样本来了之后不断更新Memory Buffer):
使用Buffer进行Experience Replay的方法如下(多头情况下的版本,手动进行不同任务之间的平衡,也可以单头,B里面一直视为一个task):
元学习与Reptile
Reptile元学习方法的优化目标在每一个inner_loop中取s步迭代时可以近似表示如下(见Reptile论文):
而在MER中,由于数据是顺序到来的,因此inner_loop无法通过事先采集好mini-batches来实现,因此内圈改为不断从M中采样。结合了Experience Replay的Reptile优化目标变成如下(详见论文附录I):
不过我感觉这里的两组各两个连加号可以合并,这样整个算法就是一个内圈mini_batches的每个batch又拆分成了batchsize为1的micro_batches,并且最后一个样本始终为当前样本的reptile,不过可能作者是想表示出Batch的概念吧。(这样的算法实际上就是下面的变体1)
MER全流程
算法及变体
整体的算法流程如下,可以看到更新过程和Reptile方法一致:
对于每一个要学习的样本,从Buffer中选择s个batch,每个batch包含k-1个样本,再将当前样本加入到每一个batch中,或者了s个数量为k的batch,对于每一个batch,再拆分成一个个单独的样本(视为batchsize为1的minibatch)进行更新(实际上就对应了reptile的内圈操作),更新完成之后计算和初始值的差距再加到初始值上(Reptile常规操作),然后再顺序对于其它batch进行(注意这里没有对不同batch的结果做平均而是顺序进行,个人认为做平均也可以,是Reptile的两种不同变体罢了)。
还可以推导出两个变体,一个是直接将内圈batch_size设置为1,这样也更符合上面推到的MER优化目标,
另外一个也类似只有一个大的batch,不过对于当前的样本学习率做了增强:
参数选择
从公式推导可以看出, s s s越大的情况下,模型越侧重于减少干扰(第二项),因此作者发现增加batch的数量对于性能提升效果显著。(必要时甚至可以减少每个batch的大小至1)
实验结果
作者在监督学习和强化学习的数据上进行了实验,这里只展示监督学习。下表中RA表示训练完成后所有任务的准确性,LA表示任务刚刚学完的准确性,BTI(backward transfer and inference)为所有任务在最后经过了多少性能下降(或提升),可以看到等于前两者之差。所有数据在任务间取平均。
Online指的是简单等一个个样本地学,Independent为各个任务不同输出层,TaskInput为不同输入层。
同时作者还发现在不同的缓存大小下MER稳定超过另一个使用了缓存的方法GEM:
接下来作者提升了任务难度,数据量更少任务更多,本文选择了基于MNIST变换的Many Permutations数据集和Omniglot数据集。对于Online和EWC,作者还尝试了各种变体增强模型对于单个样本的学习能力,但最终也没有让RA超过5.5%。另外,GEM方法在buffer显著小于类数目式不收敛。
除此之外,为了验证作者关于迁移和干扰的猜想,作者在ER和MER的学习过程中记录了每个样本和随机选择的过去五个样本的梯度的点积,可以发现MER促进了知识的迁移:
Few-Shot Lifelong Learning, AAAI2021
本文结合实际学习场景,将few-shot learning和lifelong learning(这里用来表示持续学习)结合起来提出了自己的方法,具体而言包括两个方面:
- 对于每一个人物,只选择不重要的参数进行更新从而避免灾难性遗忘。
- 对于新任务和旧任务的特征最小化余弦相似度(通过损失函数),从而减少干扰。
模型没有使用任何存储样本进行回放,也不需要知道获得正在进行的任务的学习(class-incremental)。
模型结构&任务定义&基础训练
模型包括特征提取网络
Θ
F
\Theta_F
ΘF和分类网络
Θ
C
\Theta_C
ΘC。
任务被一个个数据集
D
(
1
)
,
D
(
2
)
.
.
.
D^{(1)},D^{(2)}...
D(1),D(2)...定义,数据集彼此之间没有重叠,其中
D
(
1
)
D^{(1)}
D(1)代表了一个比较大的数据集用于基础训练。
作者直接采用Cross Entropy进行训练,并对各个类提取Prototype用于后续参考,方法为将每一个类的所有样本的特征进行平均。如下式所示:
对于之后的任务(或称Session)t>1,则要使用之前提到的两个思路进行训练,确保持续学习。
训练方法
选择特征更新&&Triplet Loss
对于每一个任务,作者认为激活幅度小的特征是不重要的特征,因此对于特征提取网络 Θ F \Theta_F ΘF的每一层选择一个阈值,低于阈值的激活的神经元被用于训练,构成该任务的可训练参数 P S T t P^t_{ST} PSTt(Session Trainable Parameters),其数量为 N p t N_p^t Npt,其余的则为知识保留参数 P K R t P^t_{KR} PKRt(Knowledge Retention Parameters)。(这里不确定激活的计算是用当前任务还是什么)
对于输入的任务,采用Triplet Loss函数进行训练,该函数可以最小化类内距离并最大化类间距。下式中
y
i
=
y
j
y_i=y_j
yi=yj而
y
i
≠
y
k
y_i\neq y_k
yi=yk。
另外,为了避免更新过大,作者还施加了一个L1正则化损失:
减小任务间重合
用之前同样的方式,还可以计算出当前任务所有分类的Prototype,作者将这些Prototype和之前任务的所有Prototype做余弦相似度计算并最小化之,从而减少任务之间的相互干扰:
其中
N
P
r
t
N^t_{Pr}
NPrt代表了当前任务的分类数,
N
P
r
p
r
e
v
N^{prev}_{Pr}
NPrprev代表了之前所有的分类。
整体损失函数为上面三者结合:
测试阶段
对于当前任务的测试,直接按照之前的公式计算出所有分类的Prototype,然后对于新样本,通过最近邻匹配的方式分类即可。
实验结果
作者再CIFAR100,miniImageNet和CUB200数据集上做了实验。在训练阶段,对于前两者选择了60类的所有样本作为
D
(
1
)
D^{(1)}
D(1)(类似预训练或元训练的阶段),其余类则按照5-way-5shot的方式(也就是说只有一点点样本)形成了8个任务。对于CUB选择前100类预训练,后100类进行10-way-5-shot。测试阶段选择所有类的所有测试样本进行测试。结果如下图:
Joint-CNN表示对于所有类别的样本混合在一起训练,而Ft-CNN在第一个Session后就只finetune分类层。
超参数选择上,对于FSLL,每个Session作者选择10%的参数进行训练。FSLL*表示使用更好的优化器,FSLL-SS表示在Session1阶段增加一个预测旋转的自监督任务。
作者还对于可训练参数的比例,是否进行正则化,是否加入任务间cosine相似度损失,超参数选择等做了消融实验。
感觉作者的方法挺简单直接的,效果还挺好。但我觉得似乎主要是Triplet Loss的功劳,但是这不算创新所以作者没写也没做消融吧。