机器学习已经成功地在数据密集型任务上得以应用,但通常却不能够处理数据很少的情况。最近,小样本学习(Few-shot Learning,FSL)被提出用于解决这个问题。在先验知识的基础上,FSL可以有效的涵盖一个只有极少监督信息数量样本的新任务。本文,我们将对小样本学习FSL进行一个系统的梳理。首先给出FSL一个形式化的定义,其次根据相关机器学习的问题进行分类,同时指出一个核心的关键问题即小样本学习不能依赖于传统的经验风险最小化的优化目标。基于如何将先验知识辅助解决小样本问题,本文从数据(Data)、模型(Model) 和 算法(Algorithm) 三个方面进行分析:
(1)数据:使用先验知识增强监督信息;
(2)模型:使用先验知识降低假设空间;
(3)算法:使用先验知识来更改对给定假设空间中最佳假设的搜索。
本文所使用的标记符号如下表:
标记 | 名称 |
---|---|
T T T | 给定的某一个学习任务 |
I I I | 训练集的个数 |
D = { D t r a i n , D t e s t } D=\{D_{train}, D_{test}\} D={ Dtrain,Dtest} | 数据集,分别对应训练集和测试集 |
D t r a i n = { ( x i , y i ) } 1 I D_{train} = \{(x_i, y_i)\}_{1}^{I} Dtrain={ (xi,yi)}1I | 训练集 |
p ( x , y ) p(x, y) p(x,y) | 真实样本的联合概率分布 |
h ^ \hat{h} h^ | FSL模型学习到的 x x x 到 y y y 的假设关系 |
θ \theta θ | 模型训练的参数 |
h ∗ ∈ H h^{*}\in\mathcal{H} h∗∈H | 假设空间 H \mathcal{H} H 中最优的假设 |
FSL任务的目标是学习一个最优策略 h ∗ ∈ H h^{*}\in\mathcal{H} h∗∈H ,损失函数记作 l ( y ^ , y ) l(\hat{y}, y) l(y^,y), 预测结果为 y ^ = h ( x ; θ ) \hat{y} = h(x; \theta) y^=h(x;θ), 其中 θ \theta θ 表示参数。
小样本学习属于机器学习的范畴内,在机器学习中,通常定义为给定一组经验及对应的标签,通过计算机程序实现从经验到标签的映射关系。机器学习则是提高某一项指标,试图提升模型学习的效果。 例如在图谱分类任务中,给定一个训练和测试集合,我们设计一个模型,企图让模型学习到图像到标签对应的映射关系,并以准确率为评价指标。再例如,近些年来比较火的AlphaGo,通过自学习的方法与真人进行了多大3000多万次挑战交互后,才真正在胜率上超越人类。
经典的机器学习方法,通常需要大量的训练数据,正如前面所说的,这在某些应用上是无法做到的。因此我们需要引入一种小样本学习的方法。小样本学习的定义为:
假设一组经验数据 E E E 以及对应的标签 T T T, 小样本学习是指给定经验数据非常少的 E E E 的情况下,让模型学习其到 T T T 的映射 P P P 。
小样本学习包含如下几种类型:
(1)Few-shot Classification (小样本分类):这是一个有监督的问题。给定小样本数据 D t r a i n = { ( x i , y i ) } 1 I D_{train} = \{(x_i, y_i)\}_{1}^{I} Dtrain={ (xi,yi)}1I 来学习一个分类器 h h h 。通常小样本的分类定义为 N N N-way K K K-shot 分类,即指训练集包含 N N N 个类,每个类包含 K K K 个样本,因此训练集只有 I = N K I=NK I=NK 个;
(2)Few-shot Regression(小样本回归):这依然属于有监督的问题,输入数据为相互独立的变量 x x x, 输出的是连续的数值 y y y, 目标则是学习一个回归函数 h h h ;
(3)Few-shot Reinforcement(小样本强化学习) 强化学习输入弱监督类任务,其建立在少量的经验数据(通常称为轨迹trajectory)的基础上学习一个最优的策略(policy)。关于强化学习的概念,可参考强化学习(一):概述 。
小样本的几个经典的场景:
(1)像人类一样去学习(Learn Like Human):我们更希望我们学习的模型能够更好的像人类一样在给非常少的样本的前提下,能够很好的识别和分类。例如幼儿只需要看几张猫的图片后,就可以在许多动物中找到所有猫的图片,但现有的机器学习模型却需要大量的图片才能取得较高的效果。另外,我们也希望计算机能够像人类一样做知识的“迁移”,就想人类一样,在学习一样新的知识是,通常不是从零开始,而是根据先验知识 (Prior Knowledge)来进行学习。而现如今的机器学习,不论什么任务都是从头开始学习。因此如像人类一样利用先验知识,则可以在非常少的样本条件下获得很好的效果。
(2)处理稀少的样例(rare case):在一些无法获取大量数据的场景下,例如医疗中的病毒发现、自动驾驶中的事故预测等,而小样本学习则可以利用先验知识来辅助完成这些稀少样本的学习和预测;
(3)减少数据收集工作量和计算成本:这一场景并非是在数据获取难才使用的场景,通常有一些任务可以获得大量的数据,但数据获取的成本很高,或者数据运算占用的数据资源和时间成本高,则可以通过对数据削减后使用FSL来学习。
因此,在这些场景下,我们可以利用的通常是先验知识,而先验知识通常可以从预训练的模型、或相似的其他标签的数据、或通过数据增强的方法等。在数理统计学中,最能够想到的便是以贝叶斯学派的贝叶斯估计,通常目标预测的是一个后验概率 p ( y ∣ x ) p(y|x) p(y∣x), 但可以通过贝叶斯公式引入先验 p ( x ∣ y ) p(x|y) p(x∣y):
贝叶斯估计通常是一种在含有先验知识下的估计,相比频率学派的极大似然估计,其不同点在于贝叶斯估计是经验+先验的结合,而极大似然估计则完全以经验为准。例如在抛硬币实验中,根据历史经验,正面朝上的先验知识是0.5,而如果硬币质地不均匀,则可能正面朝上的概率更大或更低,则会受到经验数据的影响。
小样本学习还有两个特殊情况:当经验 E E E 中只有一个样本时,FSL则为单样本学习(One-shot Learning),如果一个样本都没有,则称为零样本学习(Zero-shot Learning)。特别说明的是,如果一个任务是零样本学习,则只能通过其他任务的信息进行迁移。
FSL通常不是独立存在的,我们在解决小样本训练的问题时,通常会采用一些现有的工具,我们列出一些相关的研究问题:
(1)弱监督学习(Weakly Supervision Learning):弱监督通常指在给定的经验 E E E 中,并非所有的数据都含有标签信息,或存在大量的噪声。例如在远程监督关系抽取任务中,通过启发式的数据标注虽然带来丰富的标签,但绝大多数是噪声。这就导致了弱监督学习中,只有少部分的样本包含有效的监督信息。
通常弱监督分为半监督学习和主动学习。半监督学习(Semi Supervision Learning) 则是指给定的经验数据中,只有一小部分包含监督信息,而另一部分则是无标注的数据;主动学习(Active Learning) 则是指显式地从无标注的数据中选择(query)一部分数据,并让专家进行标注,以渐渐扩充数据的方法。
小结:如果一个小样本学习(FSL)中所给的先验知识是无标签(unlabeled)的数据时,此时的小样本学习即为弱监督学习任务。
(2)非均衡学习(Imbalance Learning):非均衡问题通常指的是不同标签类对应的经验数据不平衡。这一类在现实生活中十分常见。例如癌症检测,通常给定的数据集中,只有数量极少的样本标签为阳性,而其他大多数的样本均为阴性。因此可行的方案是,我们可以将样本数量富余的标签作为一种先验,来辅助预测那些数量少的标签。非均衡在某些场景下还可以称为长尾问题,例如在远程监督关系抽取任务上,有先关工作通过分层注意力机制来缓解长尾关系的预测,他们的做法则是将data-rich的关系标签数据迁移到data-poor的关系预测上,这便是解决非均衡的具体体现。
小结:如果一个小样本学习任务(FSL),先验知识是取自样本数量多的标签(或标签之间相关性更高的),则属于非均衡学习。
(3)迁移学习(Transfer Learning):迁移学习是最能够直观想到的方法,因为其是显式的从其他任务或领域上的数据直接迁移到小样本的任务上。在自然语言处理任务中,则通常采用预训练的语言模型作为先验知识,迁移到许多上层任务上,例如文本分类、机器翻译、阅读理解等;
小结:如果一个小样本学习任务(FSL),先验知识是取自其他任务或领域的数据,或通过预训练的方法获得,则属于迁移学习。
(4)元学习(Meta-Learning):元学习是另一种利用先验知识来学习的任务,是一种教会计算机学习的方法,即利用以往的知识经验来指导新任务的学习,具有学会学习的能力。元学习在许多任务中成功应用。例如学习优化问题、推荐冷启动问题等。
小结:如果一个小样本学习任务(FSL),先验知识是用于“教会”模型在一个具体的任务上如何进行学习,则属于元学习。
在《统计学习方法》中我们知道传统的机器学习的三种优化目标是:期望风险最小化、经验风险最小化和结构风险最小化。期望风险最小化是一种理想状态,但我们通常无法知道一个任务的期望值,所以只能通过采样方法获得一系列的经验数据(即训练集),则目标为经验风险最小化。如果考虑到模型的复杂度以及过拟合问题,则称为结构风险最小化。我们以经验风险最小化为例,损失函数通常为:
R I ( h ) = 1 I ∑ i = 1 I l ( h ( x i ) , y i ) R_{I}(h) = \frac{1}{I}\sum_{i=1}^{I}l(h(x_i), y_i) RI(h)=I1i=1∑Il(h(xi),yi)
一般经验风险最小化可以分解为两个期望的求和:
其中前一项表示通过大量数据学习的最优的经验 R ( h ∗ ) R(h^*) R(h∗)与理想状态下的最优 R ( h ^ ) R(\hat{h}) R(h^) 差的期望,记做 E a p p ( H ) \mathcal{E}_{app}(\mathcal{H}) Eapp(H);后一项则表示在有限的经验数据条件下学习与大量数据经验学习的差,记做 E e s t ( H , I ) \mathcal{E}_{est}(\mathcal{H, I}) Eest(H,I) 。因此,通常如果想要降低后一项,可以使用大量的样本,此时则会逼近大量经验数据条件下两者的差。然而,在FSL中, 样本数 I I I 非常少,因此经验风险通常不可能实现最小化的目标,因此不能将经验风险最小化作为小样本学习的目标。
例如下图展示了样本充足以及样本稀少条件下,使用经验风险最小化对参数空间 H \mathcal{H} H 进行搜索的过程。
可知,当样本数量多时(左图),则可以有效地减少 E e s t ( H , I ) \mathcal{E}_{est}(\mathcal{H, I}) Eest(H,I)。而当样本数量不足时, E e s t ( H , I ) \mathcal{E}_{est}(\mathcal{H, I}) Eest(H,I) 不易降低。
因此解决这个问题,我们必须引入先验知识。那么先验知识如何应用到小样本学习中去呢?根据相关工作,我们从数据、模型和算法三个方面引入先验:
(1)数据:如上图(a),可以通过显式地引入额外的数据做数据增强。在搜索空间中进行搜索时,可以通过额外的数据来辅助完成优化问题。基于此,可以使用经验风险最小化;
(2)模型:如上图(b),通过使用先验知识来降低搜索空间,使得优化的维度和空间得以降低。灰色部分即是被缩减的部分,而胜于白色的区域则是更小的搜索空间;通常模型可以使用预训练的模型;
(3)算法:如上图(c),这一类则是引入先验知识来优化搜索策略的算法,即使用先验知识来寻找一个最优的搜索策略。
通过一个树状图对三种先验知识的引入进行小结:
前面讲过,使用先验知识来显式地扩充训练数据 D t r a i n D_{train} Dtrain是一种有效的方法,基于充分的训练集,可以得到相应可靠的学习模型。传统的数据增强方法是根据数据特性进行一些预处理和变换。例如对于图像类任务,为了扩充图像数量,可以通过图像转置、裁剪、旋转、投影等操作,通过人工和规则来生成相似的图像。然而这种方法通常需要较高的时间和资源消耗,且很难应用到所有类型的数据,因此人工的对数据进行扩充不是鲜明之举。
因此我们根据先前的工作,总结了三种比较常用的数据扩增方法,包括:
下面分别做简单的描述:
这种策略是将训练集中每一个样本 ( x i , y i ) (x_i, y_i) (xi,yi) 均通过一系列的变换转变为新的数据,而所使用的变换程序则包含先验知识。另外,有相关方法使用自编码器(Auto-encoder)来根据相似的标签生成对应的数据。另外也有人为每一个原始数据 x i x_i xi 学习多个相互独立的属性增强回归器(Attribute Strength Regressor),并以此生成多个相同标签的数据。
该策略通过从弱监督或无监督的大数据集中选择带有目标标记的样本来增强 D t r a i n D_{train} Dtrain 。例如,在用监视摄像机拍摄的照片中,有人,汽车和道路,但没有一个被标记。 另一个例子是长篇视频。 它包含说话者的一系列手势,但是没有一个被明确注释。 由于此类数据集包含样本的较大变化,因此将其增加到 D t r a i n D_{train} Dtrain 有助于描绘更清晰的样本分布情况 p ( x , y ) p(x,y) p(x,y)。 此外,由于不需要人工来标记,因此收集这样的数据集更加容易。 但是,尽管收集成本很低,其主要问题是如何选择带有目标标签的样本。先前的方法一种是使用支持向量机(SVM)为每一个带有标签的原始训练集 D t r a i n D_{train} Dtrain 进行训练,并为那些弱监督数据进行预测,并将预测正确的加入到 D t r a i n D_{train} Dtrain 中。另外,标签传播(Label Propagation)则直接被用于为无标注的数据进行自动标注等。
该策略通过汇总和改编来自相似但较大数据集的输入输出对来增强 D t r a i n D_{train} Dtrain 。 聚集权重通常基于样本之间的某种相似性度量。 有人从辅助文本语料库中提取聚合权重。 由于这些样本可能不是来自目标FSL类,因此直接将汇总样本增加到Dtrain可能会产生误差。 因此,生成对抗网络(GAN)被设计为从许多样本的数据集中生成不可区分的合成数据。 它有两个生成器,一个生成器将小规模类的样本映射到大规模类,另一个生成器将大规模类的样本映射到少规模类(以补偿GAN中缺少样本训练)。
上述三种数据增强的方法,如何选择取决于具体的应用和数据的情况。如果说某一类任务包含大量的无标注或半监督的数据,而如果对其全部进行人工标注将会消耗大量精力的,可以使用第二种方法,即通过一些工具启发式地标注,或使用算法来预测未知的标签,以扩增数据集;如果无标注的数据很难获取,则可以选择相似的数据转换为目标任务下的数据;如果前面两个都不满足,则只能从原始的数据进行一些变换操作了。但事实上,上述的三种方法均涉及到对数据的一些生成和变换,通常并不使用于所有领域或类型的数据,现阶段基于数据增强的FSL比较适用于图像类数据,而对于文本、语音等基于语法的序列模式数据则比较困难。
如果在小样本数据上训练一个简单的模型,通常来说,模型的优化空间更小,可以缓解小样本学习的问题,可是模型太过于简单(例如简单的线性回归),根本无法有效表征复杂的数据特征;然而如果使用较为复杂的模型,则将会面临过拟合(Overfitting)问题。因此,基于模型的小样本学习方法,旨在通过先验知识来进一步缩减假设空间 H \mathcal{H} H 的大小,即使使用较为复杂的模型,也可以在很少的经验样本的基础上快速靠近最优解。因此,本节关注的是如何使用先验知识来达到这个目的,下标列出了常用的四种学习方法:
学习策略 | 先验知识 | 如何缩减 H \mathcal{H} H |
---|---|---|
多任务学习(Multi-Task Learning) | 先验知识来源于其他任务 T T T 以及对应的数据 D D D | 参数共享或绑定 |
嵌入学习(Embedding Learning) | 根据其他任务学习得到的Embedding信息 | 将数据映射到低维度连续空间,保存语义信息 |
记忆信息(External Memory) | 通过Embedding保存(记忆)其他任务交互得到的语义信息 | 使用Key-Value进行保存 |
生成模型 | 由其他任务 T T T 学习得到的先验知识 | 限制分布的形式 |
在多任务学习中,通常有多个不同的任务 T T T 及对应的数据同时参与训练,通过多任务学习可以任务本身及任务之间的信息交互和共享。假设给定 C C C 个任务,分别为 T 1 , T 2 , . . . , T C T_1, T_2, ..., T_C T1,T2,...,TC 。每个任务 T c T_c Tc 对应数据集 D c = { D t r a i n c , D t e s t c } D_c=\{D_{train}^{c}, D_{test}^{c}\} Dc={ Dtrainc,Dtestc} 。我们将小样本任务作为目标任务(Target Task),其他任务作为资源任务(Source Tasks),因此多任务学习目标是通过某一个任务 T c T_c Tc 在对应数据 进行学习,并得到对应的参数 θ c \theta_c θc,因此可以当前任务的参数可以对其他任务产生一定的约束。参数的约束可分为两种类型:参数共享以及参数绑定
嵌入学习的目标是将样本映射到低维度的连续空间中,因此其可以通过降低向量的维度来降低参数的假设空间,相似的样本对应的向量空间内更加靠近,而不相关的样本对应的向量空间内更加远,因此可以有效解决小样本学习。嵌入学习包含几个主要部分:(1)函数 f f f 用于将测试集 x t e s t ∈ D t e s t x_{test}\in D_{test} xtest∈Dtest 映射到低维度空间 Z \mathcal{Z} Z;(2)函数 g g g 用于将测试集 x i ∈ D t r a i n x_{i}\in D_{train} xi∈Dtrain 映射到低维度空间 Z \mathcal{Z} Z;(3)相似度函数 s s s 用于评估 f ( x t e s t ) f(x_{test}) f(xtest) 和 g ( x i ) g(x_i) g(xi) 的相似度。
通常训练嵌入向量均使用先验知识,因此根据函数 f f f 和 g g g 是否有交叉使用,可以大致分为三个小类,一种是根据具体任务来训练embedding(task-specific),一种是在先验知识上训练embedding(task-invariant),一种是混合两种方法训练embedding(hybrid)。
解决这一类的方法主要有MatchNet、PrototypeNet等。主要思路都是围绕学习一个映射函数和相似度函数,然后在测试集上寻找最相关的训练样本,并预测为对应的标签。
先通过task-invariant方法学习得到的先验知识,然后根据具体任务学习得到函数 g g g 。不同于task-invariant的是,其将训练集学习的信息加入到测试集中,因此这一部分则显示将task-specific和task-invariant相结合的效果。
事实上,通俗的讲,第一种task-specific方法即是只将小样本训练集进行训练,第二种则是用大规模的其他数据事先训练好embedding后,直接训练小样本训练集的训练函数 f f f 的参数,第三种则是将小样本数据也加入到了先验知识中。
通过引入记忆机制将训练集中的信息抽取出并形成键值对格式,因此在测试时,只需要寻找最相关的键值对即可。因此key-value是比较常用的记忆机制。假设记忆即为 M ∈ R b × n M\in\mathbb{R}^{b\times n} M∈Rb×n,其中 b b b 表示记忆单元的个数,每个记忆单元表示为 M ( i ) ∈ R m M(i)\in\mathbb{R}^{m} M(i)∈Rm, 其包含key-value键值对 M ( i ) = ( M k e y ( i ) , M v a l u e ( i ) ) M(i) = (M_{key}(i), M_{value}(i)) M(i)=(Mkey(i),Mvalue(i)) 。因此在训练之后,即可保存这些记忆单元,每个记忆的键可以是向量,值则可以是对应的标签或回归值等。在测试阶段,只需要一个相似度函数 s ( f ( x t e s t ) , M k e y ( i ) ) s(f(x_{test}), M_{key}(i)) s(f(xtest),Mkey(i)) 寻找最相近的key即可预测对应的结果value,这里相似度函数可以选择点乘或者余弦相似度函数。通常记忆单元数量是有限的,因此如果记忆单元已满,则可以通过设计一些策略用于替换先前的记忆,可分为两小类:
在生成模型中,通过先验知识来生成更加丰富的信息时生成式方法。通常包含两种方法:
下面总结一下基于模型(model-based)的小样本学习方法。通过对模型的改造,来将先验知识引入到小样本任务中,从而在语义层面上降低了搜索空间。基于模型的小样本学习主要有四大类:
(1)如果先验知识来源于多个任务,则可以使用多任务学习框架。小样本任务(目标任务)作为优化的目标,而其他任务则作为类似正则化项起到对目标的约束作用,从而在语义层面上降低搜索空间大小;
(2)如果存在大规模的数据集,其包含充分的多种类别的样本时,可以使用基于嵌入的方法,通过学习一个低维度连续空间的向量,从而降低向量空间大小,降低搜索空间大小;
(3)如果可以使用记忆单元,则可以基于此训练一个简单的分类器,给定一个测试样本从记忆中选择最相似的记忆作为预测结果。但这一种方法需要考虑如何保留和遗忘过去的记忆,同时可能会遭受内存消耗的问题;
(4)如果可以使用生成模型,则可以从其他数据集中学习先验,并基于自编码、对抗网络等模型生成多样化的数据,以扩充原始数据。当然,生成模型通常难以训练,因此需要取决于具体任务的情况;
未完待续…
参考文献:Generalizing from a Few Examples: A Survey on Few-Shot Learning