主动学习(Active Learning)综述以及在文本分类和序列标注应用

0.引言

在机器学习(Machine learning)领域,监督学习(Supervised learning)、非监督学习(Unsupervised learning)以及半监督学习(Semi-supervised learning)是三类研究比较多,应用比较广的学习技术,wiki上对这三种学习的简单描述如下:

  • 监督学习:通过已有的一部分输入数据与输出数据之间的对应关系,生成一个函数,将输入映射到合适的输出,例如分类。
  • 非监督学习:直接对输入数据集进行建模,例如聚类。
  • 半监督学习:综合利用有类标的数据和没有类标的数据,来生成合适的分类函数。

其实很多机器学习都是在解决类别归属的问题,即给定一些数据,判断每条数据属于哪些类,或者和其他哪些数据属于同一类等等。这样,如果我们上来就对这一堆数据进行某种划分(聚类),通过数据内在的一些属性和联系,将数据自动整理为某几类,这就属于非监督学习。
如果我们一开始就知道了这些数据包含的类别,并且有一部分数据(训练数据)已经标上了类标,我们通过对这些已经标好类标的数据进行归纳总结,得出一个
“数据–>类别” 的映射函数,来对剩余的数据进行分类,这就属于监督学习。
而半监督学习指的是在训练数据十分稀少的情况下,通过利用一些没有类标的数据,提高学习准确率的方法。

我们使用一些传统的监督学习方法做分类的时候,往往是训练样本规模越大,分类的效果就越好。但是在现实生活的很多场景中,标记样本的获取是比较困难的,这需要领域内的专家来进行人工标注,所花费的时间成本和经济成本都是很大的。而且,如果训练样本的规模过于庞大,训练的时间花费也会比较多。那么有没有办法,能够使用较少的训练样本来获得性能较好的分类器呢?主动学习(Active Learning)为我们提供了这种可能。主动学习通过一定的算法查询最有用的未标记样本,并交由专家进行标记,然后用查询到的样本训练分类模型来提高模型的精确度。

1.主动学习简介

  1. 主动学习是指对需要标记的数据进行优先排序的过程,这样可以确定哪些数据对训练监督模型产生最大的影响。

  2. 主动学习是一种学习算法可以交互式查询用户(teacher 或 oracle),用真实标签标注新数据点的策略。主动学习的过程也被称为优化实验设计。

  3. 主动学习的动机在于认识到并非所有标有标签的样本都同等重要

主动学习是一种策略/算法,是对现有模型的增强。而不是新模型架构。主动学习背后的关键思想是,如果允许机器学习算法选择它学习的数据,这样就可以用更少的训练标签实现更高的准确性。——Active Learning Literature Survey, Burr Settles。通过为专家的标记工作进行优先级排序可以大大减少训练模型所需的标记数据量。降低成本,同时提高准确性。

主动学习不是一次为所有的数据收集所有的标签,而是对模型理解最困难的数据进行优先级排序,并仅对那些数据要求标注标签。然后模型对少量已标记的数据进行训练,训练完成后再次要求对最不确定数据进行更多的标记。

通过对不确定的样本进行优先排序,模型可以让专家(人工)集中精力提供最有用的信息。这有助于模型更快地学习,并让专家跳过对模型没有太大帮助的数据。这样在某些情况下,可以大大减少需要从专家那里收集的标签数量,并且仍然可以得到一个很好的模型。这样可以为机器学习项目节省时间和金钱!

1.1 active learning的基本思想

主动学习的模型如下:

A=(C,Q,S,L,U),

其中 C 为一组或者一个分类器,L是用于训练已标注的样本。Q 是查询函数,用于从未标注样本池U中查询信息量大的信息,S是督导者,可以为U中样本标注正确的标签。学习者通过少量初始标记样本L开始学习,通过一定的查询函数Q选择出一个或一批最有用的样本,并向督导者询问标签,然后利用获得的新知识来训练分类器和进行下一轮查询。主动学习是一个循环的过程,直至达到某一停止准则为止
这个准则可以是迭代次数,也可以是准确率等指标达到设定值

在这里插入图片描述

在各种主动学习方法中,查询函数的设计最常用的策略是:不确定性准则(uncertainty)和差异性准则(diversity)。 不确定性越大代表信息熵越大,包含的信息越丰富;而差异性越大代表选择的样本能够更全面地代表整个数据集。

对于不确定性,我们可以借助信息熵的概念来进行理解。我们知道信息熵是衡量信息量的概念,也是衡量不确定性的概念。信息熵越大,就代表不确定性越大,包含的信息量也就越丰富。事实上,有些基于不确定性的主动学习查询函数就是使用了信息熵来设计的,比如熵值装袋查询(Entropy query-by-bagging)。所以,不确定性策略就是要想方设法地找出不确定性高的样本,因为这些样本所包含的丰富信息量,对我们训练模型来说就是有用的。

那么差异性怎么来理解呢?之前说到或查询函数每次迭代中查询一个或者一批样本。我们当然希望所查询的样本提供的信息是全面的,各个样本提供的信息不重复不冗余,即样本之间具有一定的差异性。在每轮迭代抽取单个信息量最大的样本加入训练集的情况下,每一轮迭代中模型都被重新训练,以新获得的知识去参与对样本不确定性的评估可以有效地避免数据冗余。但是如果每次迭代查询一批样本,那么就应该想办法来保证样本的差异性,避免数据冗余。

在这里插入图片描述

从上图也可以看出来,在相同数目的标注数据中,主动学习算法比监督学习算法的分类误差要低。这里注意横轴是标注数据的数目,对于主动学习而言,相同的标注数据下,主动学习的样本数>监督学习,这个对比主要是为了说明两者对于训练样本的使用效率不同:主动学习训练使用的样本都是经过算法筛选出来对于模型训练有帮助的数据,所以效率高。但是如果是相同样本的数量下去对比两者的误差,那肯定是监督学习占优,这是毋庸置疑的。

1.2active learning与半监督学习的不同

很多人认为主动学习也属于半监督学习的范畴了,但实际上是不一样的,半监督学习和直推学习(transductive learning)以及主动学习,都属于利用未标记数据的学习技术,但基本思想还是有区别的。

如上所述,主动学习的“主动”,指的是主动提出标注请求,也就是说,还是需要一个外在的能够对其请求进行标注的实体(通常就是相关领域人员),即主动学习是交互进行的。

而半监督学习,特指的是学习算法不需要人工的干预,基于自身对未标记数据加以利用。

2.主动学习基础策略(小试牛刀)

2.1常见主动学习策略

在未标记的数据集上使用主动学习的步骤是:

  • 首先需要做的是需要手动标记该数据的一个非常小的子样本。
  • 一旦有少量的标记数据,就需要对其进行训练。该模型当然不会很棒,但是将帮助我们了解参数空间的哪些领域需要首标记。
  • 训练模型后,该模型用于预测每个剩余的未标记数据点的类别。
  • 根据模型的预测,在每个未标记的数据点上选择分数
  • 一旦选择了对标签进行优先排序的最佳方法,这个过程就可以进行迭代重复:在基于优先级分数进行标记的新标签数据集上训练新模型。一旦在数据子集上训练完新模型,未标记的数据点就可以在模型中运行并更新优先级分值,继续标记。
  • 通过这种方式,随着模型变得越来越好,我们可以不断优化标签策略。

在这里插入图片描述

2.1.1基于数据流的主动学习方法

基于流(stream-based)的主动学习中,未标记的样例按先后顺序逐个提交给选择引擎,由选择引擎决定是否标注当前提交的样例,如果不标注,则将其丢弃。

在基于流的主动学习中,所有训练样本的集合以流的形式呈现给算法。每个样本都被单独发送给算法。算法必须立即决定是否标记这个示例。从这个池中选择的训练样本由oracle(人工的行业专家)标记,在显示下一个样本之前,该标记立即由算法接收。

在这里插入图片描述

于基于流的算法不能对未标注样例逐一比较,需要对样例的相应评价指标设定阈值,当提交给选择引擎的样例评价指标超过阈值,则进行标注,但这种方法需要针对不同的任务进行调整,所以难以作为一种成熟的方法投入使用。

2.1.2基于数据池的主动学习方法

基于池(pool-based)的主动学习中则维护一个未标注样例的集合,由选择引擎在该集合中选择当前要标注的样例。

在基于池的抽样中,训练样本从一个大的未标记数据池中选择。从这个池中选择的训练样本由oracle标记。

在这里插入图片描述

2.1.3 基于查询的主动学习方法

这种基于委员会查询的方法使用多个模型而不是一个模型。

委员会查询(Query by Committee),它维护一个模型集合(集合被称为委员会),通过查询(投票)选择最“有争议”的数据点作为下一个需要标记的数据点。通过这种委员会可的模式以克服一个单一模型所能表达的限制性假设(并且在任务开始时我们也不知道应该使用什么假设)。

有两个假设前提:

  1. 所有模型在已标注数据上结果一致
  2. 所有模型对于未标注结果样本集存在部分分歧

2.2 不确定性度量

识别接下来需要标记的最有价值的样本的过程被称为“抽样策略”或“查询策略”。在该过程中的评分函数称为“acquisition function”。该分数的含义是:得分越高的数据点被标记后,对模型训练后的产生价值就越高。有很多中不同的采样策略,例如不确定性抽样,多样性采样等,在本节中,我们将仅关注最常用策略的不确定性度量。

不确定性抽样是一组技术,可以用于识别当前机器学习模型中的决策边界附近的未标记样本。这里信息最丰富的例子是分类器最不确定的例子。模型最不确定性的样本可能是在分类边界附近的数据。而我们模型学习的算法将通过观察这些分类最困难的样本来获得有关类边界的更多的信息。

让我们以一个具体的例子,假设正在尝试建立一个多类分类,以区分3类猫,狗,马。该模型可能会给我们以下预测:

{
    "Prediction": {
        "Label": "Cat",
        "Prob": {
            "Cat": 0.9352784428596497,
            "Horse": 0.05409964170306921,
            "Dog": 0.038225741147994995,
        }
    }
}

这个输出很可能来自softmax,它使用指数将对数转换为0-1范围的分数。

在这里插入图片描述

2.2.1最小置信度:(Least confidence)

最小置信度=1(100%置信度)和每个项目的最自信的标签之间的差异。

在这里插入图片描述

虽然可以单独按置信度的顺序进行排名,但将不确定性得分转换为0-1范围,其中1是最不确定的分数可能很有用。因为在这种情况下,我们必须将分数标准化。我们从1中减去该值,将结果乘以N/(1-N),n为标签数。这时因为最低置信度永远不会小于标签数量(所有标签都具有相同的预测置信度的时候)。

让我们将其应用到上面的示例中,不确定性分数将是:(1-0.9352) *(3/2)= 0.0972。

最小置信度是最简单,最常用的方法,它提供预测顺序的排名,这样可以以最低的置信度对其预测标签进行采样。

2.2.2置信度抽样间距(margin of confidence sampling)

不确定性抽样的最直观形式是两个置信度做高的预测之间的差值。也就是说,对于该模型预测的标签对比第二高的标签的差异有多大?这被定义为:

不确定性抽样的最直观形式是两个置信度做高的预测之间的差值。也就是说,对于该模型预测的标签对比第二高的标签的差异有多大?这被定义为:

在这里插入图片描述

同样我们可以将其转换为0-1范围,必须再次使用1减去该值,但是最大可能的分数已经为1了,所以不需要再进行其他操作。

让我们将置信度抽样间距应用于上面的示例数据。“猫”和“马”是前两个。使用我们的示例,这种不确定性得分将为1.0 - (0.9352–0.0540)= 0.1188。

2.2.3抽样比率 (Ratio sampling)

置信度比是置信度边缘的变化,是两个分数之间的差异比率而不是间距的差异的绝对值。

在这里插入图片描述

2.2.4 熵抽样(Entropy Sampling)

应用于概率分布的熵包括将每个概率乘以其自身的对数,然后求和取负数:

在这里插入图片描述

让我们在示例数据上计算熵:

在这里插入图片描述

得到 0 - sum(–0.0705,–0.0903,–0.2273)= 0.3881

除以标签数的log得到0.3881/ log2(3)= 0.6151

3.主动学习方法归类

3.1 基于不确定性的主动学习方法

基于不确定性的主动学习方法将最小化条件熵作为寻找判定函数的依据。

Bayesian Active Learning for Classification and Preference Learning(论文 2011年)通过贪婪地找到一个能使当前模型熵最大程度减少的数据点x,但由于模型参数维度很高,直接求解困难,因此在给定数据D和新增数据点x条件下,模型预测和模型参数之间的互信息。

Deep Bayesian Active Learning with Image Data(论文代码 2017年)中实现了这一思路,过程如下:

(1)从整体的数据中选一个子集作为初始训练集,来训练任务模型(分类,分割等等)

(2)用训好的模型在剩余未标注的图像上以train模式跑多组预测,记录对每个样本的输出。

(3)计算对每个样本的熵作为不确定性分数。

(4)从大到小依次选择下一组数据标注好后加入训练集,更新训练模型(在上一代模型上fine-tuning),直到满足停止条件。

考虑到深度学习中,不能每次选一个数据样本就重新训练一次模型,而是以批数据的形式进行训练,BatchBALD: Efficient and Diverse Batch Acquisition for Deep Bayesian Active Learning(论文 2019年)中,把原来的一个样本变成了一批样本。

3.2基于最近邻和支持向量的分类器的方法

基于不确定性的主动学习方法依赖模型预测的分类概率来确定模型对该样本的不确定性,但这个概率并不可靠,因为使用softmax分类器的神经网络并不能识别分布外样本,且很容易对OOD样本做出过度自信的预测。

OOD(Out of Distribution(OOD) detection指的是模型能够检测出 OOD 样本,而 OOD 样本是相对于 In Distribution(ID) 样本来说的。传统的机器学习方法通常的假设是模型训练和测试的数据是独立同分布的(IID, Independent Identical Distribution),这里训练和测试的数据都可以说是 In Distribution(ID) 。在实际应用当中,模型部署上线后得到的数据往往不能被完全控制的,也就是说模型接收的数据有可能是 OOD样本,也可以叫异常样本(outlier, abnormal)。

基于深度模型的Out of Distribution(OOD)检测相关方法介绍

在主动学习中,初始阶段使用非常少的标注样本训练模型,意味着大量的未标注样本可能都是OOD样本,若模型过早的给这部分样本一个过度自信的预测概率,就可能使我们错失一些有价值的OOD样本。如图所示,初始训练阶段,模型缺乏虚线框以外的区域的训练数据,但softmax分类器仍然会对这些区域给出很自信的预测,导致选择新的待标注样本时,图中的q点会被忽略,而若q点正好不是class B,则会影响主动学习的性能。

在这里插入图片描述

3.2.1 NNClassifier

针对这个问题NNclassifier中设计了一个基于最近邻和支持向量的分类器来取代softmax, 使模型能对远离已有训练数据的区域产生较高的不确定性。

具体而言,每类训练学习N个支持向量,基于样本特征与各类的支持向量之间的距离,就可以定义分类概率为与这N个支持向量的核函数的最大距离:

p c ( f x ) = max ⁡ n δ ( − d ( f x , m c , n ) ) p_c\left(f_x\right)=\max _n \delta\left(-d\left(f_x, m_{c, n}\right)\right) pc(fx)=maxnδ(d(fx,mc,n))

定义了新的可以意识到OOD样本的分类器之后,作者给出了对应的主动学习策略:

Rejection confidence,用于度量远离所有支持向量的样本,如图(b)所示;
confusion confidence,用于度量远离支持向量以及同时靠近多个不同类支持向量的样本,如图©所示。

M rejection  ( x ) = ∑ c ( 1 − p c ( f x ) ) M confusion  ( x ) = ∑ c ( 1 + p c ( f x ) − max ⁡ c p c ( f x ) ) \begin{aligned} &M_{\text {rejection }}(x)=\sum_c\left(1-p_c\left(f_x\right)\right) \\ &M_{\text {confusion }}(x)=\sum_c\left(1+p_c\left(f_x\right)-\max _c p_c\left(f_x\right)\right) \end{aligned} Mrejection (x)=c(1pc(fx))Mconfusion (x)=c(1+pc(fx)cmaxpc(fx))

在这里插入图片描述

3.2.2 RBF network + Gradient Penalty

AmersfoortRBF神经网络来促使网络具有良好的OOD样本不确定性,同时给出了基于梯度范数的双边正则来削弱特征崩溃(feature collapse)的问题。与NNClassifier相同,本文的作者也定义了一个与各类特征距离的函数K来帮助检测OOD样本,损失函数同样定义成逐类的二值交叉熵。不同于NNClassifier的是,这里的距离是每个样本与该类样本的指数滑动平均得到的。
K c ( f θ ( x ) , e c ) = exp ⁡ ( − ∥ W c f θ ( x ) − e c ∥ 2 2 / ( 2 n σ 2 ) ) K_c\left(f_\theta(x), e_c\right)=\exp \left(-\left\|W_c f_\theta(x)-e_c\right\|_2^2 /\left(2 n \sigma^2\right)\right) Kc(fθ(x),ec)=exp(Wcfθ(x)ec22/(2nσ2))

另一个不同点在于本文加入了一个双边梯度正则项。
max ⁡ ( 0 , ∥ grad ⁡ z ∑ c K c ∥ F 2 − 1 ) \max \left(0,\left\|\operatorname{grad}_z \sum_c K_{\mathrm{c}}\right\|_F^2-1\right) max(0,gradzcKcF21)

这个正则项的作用有两个,一个是保证平滑性,也就是相似的输入有相似的输出,这个是由max()中的梯度部分保证的,而梯度-1则起到避免特征崩溃的作用,也就是相比单纯的使用特征范数正则,-1能够避免模型将很多不同的输入映射到完全相同的特征,也就是feature collapse。

3.3基于特征空间覆盖的方法

接下来主要介绍基于特征空间覆盖的主动学习代表性工作:coreset。coreset的主要贡献:给出了基于特征空间覆盖的主动学习算法的近似损失上界;证明了新添加的样本在能够缩小标注样本对剩余样本的覆盖半径时,才能提高近似效果。

coreset认为主动学习目标就是缩小核心集误差,即主动学习选出的样本损失与全体样本损失之间的差别。

我们在主动学习挑选新样本时,并不知道样本的标签,也就没法直接求核心集损失。作者把核心集损失的上界转换做剩余训练样本与挑选出的标注样本间的最大距离。因此,主动学习问题等价于选择添加一组标注样本,使得其他样本对标注样本集的最大距离 δ s \delta_s δs 最小,也就是k-center集覆盖问题。如图所示,蓝色为挑选出的标注样本,红色为其他样本。

在这里插入图片描述

3.4 基于对抗学习的方法

3.4.1VAAL

Variational Adversarial Active Learning(地址 2019年)描述了一种基于池的半监督主动学习算法,它以对抗的方式(关于对抗学习的详细介绍参见这里)隐式地学习了这种采样机制。与传统的主动学习算法不同,VAAL与任务无关,也就是说,它不依赖于试图获取标注数据的任务的性能。VAAL使用变分自编码器(VAE)和训练好的对抗网络来学习潜在空间,以区分未标注和标注的数据。

核心思想
本文的出发点可以理解如下:之前很多方法的uncertainty都是基于模型的,也就是说需要有个分割/分类等模型计算预测结果,然后从结果的好坏去分析相应的被预测样本的价值。而本文的uncertainty是基于数据本身的,也就是说并非基于预测结果本身去分析,而是直接基于样本自身的特征去处理

核心思想:利用VAE对已标注的数据和未标注的数据进行编码。因此,对于一个未标注的数据,如果其编码向量与潜在空间中向量的差异足够大,那么我们就认为该样本是有价值的。

而对于样本的选择,是通过一个对抗网络来实现的,该对抗网络被用来区分一个样本是已标注还是未标注。因此上文的VAE还有一个额外的任务,即他的编码要让判别器难以区分已经标注还是没有标注。

网络结构
VAE和对抗网络之间的最大最小博弈是这样进行的:VAE试图欺骗对抗网络去预测,所有的数据点都来自已标注池;对抗网络则学习如何区分潜在空间中的不相似性。其结构如下:

VAE和对抗网络之间的最大最小博弈是这样进行的:VAE试图欺骗对抗网络去预测,所有的数据点都来自已标注池;对抗网络则学习如何区分潜在空间中的不相似性。其结构如下:

在这里插入图片描述

主动学习策略

  1. 一开始随机选择10%的图像开始训练,此时记训练的网络为版本1。对于版本1,训练会迭代max_iterations次,与一般网络训练过程的差别在于每个iteration除了训练"任务模型"外,还得去训练VAE与判别器。而当迭代结束后,训练得到的"任务模型"其实与直接随机抽取10%的图像训练没有区别,因为VAE与判别器只对下一个网络版本有贡献。
  2. 利用VAE与判别器内包含的经验,一次性抽取5%的新数据加入训练集,此时开始训练网络版本2。而这里特别关键的一点是,版本2仍然是从预训练VGG开始从头训练的(而非在版本1的基础上继续finetune)。至此一直迭代到选取50%的数据结束。

模型特点
本文的强化学习有点"离线"的味道,即最后选取出的50%数据可以很轻松的迁移至其他模型中,选择的过程只依赖VAE与判别器,而与具体的任务无关。

此外该模型训练十分耗时——从10%逐步提升5%至50%,相当于顺序训练了9个相同的模型,再考虑训练VAE与判别器的耗时,训练该主动学习框架的所需时间可能高达原有基础网络的10倍。

3.4.2SRAAL

SRAAL(论文 https://openaccess.thecvf.com/content_CVPR_2020/html/Zhang_State-Relabeling_Adversarial_Active_Learning_CVPR_2020_paper.html)是VAAL的一个改进版。在VAAL中,判别器的训练的时候只有两种状态,标注/未标注。SRAAL的作者认为这样忽略了一些信息,有时候任务模型已经能很确信的对某个未标注样本做预测了,就应该降低选择这个样本的优先级。

为了实现这个思路,作者给出了一个任务模型预测不确定度的计算函数用这个函数的输出结果作为生成对抗网络的判别器训练过程中,无标注样本的标签,而不用简单的个一个二值变量

在这里插入图片描述

3.4.3ARAL

VAAL有效的一个关键的因素实际上是同时利用标注/无标注的样本共同训练产生特征映射,而不像之前基于特征的coreset等主动学习方法,仅用标注数据训练产生特征

ARAL(https://arxiv.org/abs/1912.09720 2019.11)更进一步,也用这些个无标注样本来训练任务模型(如分类器)本身,整体仍然是在VAAL基础上做的,只是增加了cgan的判别器来实现半监督训练任务模型。整体来说,基于池的主动学习用标注样本来训练任务模型,合成的主动学习标注合成的样本来训练任务模型。

相比之下,VAAL用标注数据训练任务模型,用所有数据来训练产生特征;ARAL用所有的训练数据,合成数据来训练任务模型、产生特征映射。相当于使用了半监督的学习方法,与和之前纯基于监督训练的主动学习方法比较自然有所提升。

在这里插入图片描述

4.融合不确定性和多样性的学习方法☆

之前介绍了基于不确定性的方法,以及基于多样性的方法。接下来我们来看看融合两者的方法。就动机而言,如果只用不确定性标准来选样本,在批量选择的场景中,很容易出现选到冗余样本的问题。而在深度学习中,由于训练开销的缘故,通常都采用批主动学习,所以为了提高主动学习的效率,就得考虑批量选择高不确定性样本时的多样性问题。而从多样性样本选择方法的角度来说,单纯的特征空间覆盖算法不能区分模型是否已经能很好预测某部分样本,会限制这类方法所能达到的上限。

融合不确定性和多样性的思路主要有三种:

  1. 完全延续信息论的分析思路,也就是batchBALD,在批量选择的过程中不采取每个样本互信息直接相加,而用求并的方法来避免选到冗余样本;
  2. 先用不确定性标准选出大于budget size的候选集,再用集覆盖的思路来选择特征差异大的样本;
  3. 是2的扩展,通过在梯度嵌入空间聚类来选样本,从而避开人工给定候选样本集大小的问题

4.1信息论思路

第一种从理论上来看很优雅,从信息论的角度推出怎么在批量选择的场景里选到对模型参数改善最有效的一组样本。但计算复杂度很高,可能并不是很实用,该论文中的实验部分也都是在很小的数据集上完成的。

4.2 构建候选集+大差异样本——SA

这类方法实现起来最简单,非常启发式。整个主动学习分两步来做,第一步先用不确定性(熵,BALD等)选超出主动学习budget size的候选样本集,在用多样性的方法,选择能最好覆盖这个候选集的一组样本。

SA 2017 用Bootstrapping训练若干个模型,用这些模型预测的variance来表示不确定性,之后再用候选集中样本特征相似度来选取与已经选到的样本差异最大的样本,就类似coreset-greedy的做法。

CoreLog 2021 基于Proper Scoring Rules给了表示不确定性的度量,先选出不确定性大的前k%个样本,再用kmeans聚类来选择多样的样本。

这种结合的方式没毛病,但有个小的问题,很难说清咋确定这个候选集大小,到底多大能算作高不确定性,能丢到候选集里。

4.3 梯度嵌入空间——badge☆

badge:https://arxiv.org/abs/1906.03671 2020 和第二类方法的思路很像,不确定性的用模型参数就某个样本的梯度大小来表示,多样性用kmeans++来保证。但这个方法很巧妙的地方在于,通过把这个问题丢到梯度嵌入空间来做(而不像第二类方法在样本的特征空间保证多样性),使样本的多样性和不确定性能同时得到保证。

梯度范数大小表示不确定性很好理解,和之前用熵之类的指标来表示不确定性类似,模型预测的概率小,意味着熵大,也意味着如果把这样本标了,模型要有较大的变化才能拟合好这个样本,也就是求出来的梯度大。梯度表示多样性,是这类方法的独特之处,用梯度向量来聚类,选到的差异大的样本就变成:让模型参数的更新方向不同的样本,而不是样本特征本身不同。

在用梯度表示了不确定性和多样性之后,怎么来选一批既有高不确定性,又不同的样本呢?badge的做法是Kmeans++聚类,第一个样本选梯度范数最大的样本,之后依据每个样本梯度与选到的样本梯度的差的范数来采样新的样本。这里注意这个差是两个向量的差,所以自然的避免了重复的选到梯度方向接近且范数都比较大的一组样本。

5. 基于变化最大的方法

这一类方法核心的观点是,不管不确定性或多样性,而是希望选出的样本能使模型产生的变化最大。变化最大可以着眼于loss最大,也可以关注梯度的情况,比如梯度范数大小。

learning loss 2019 在任务模型上加一个小的附属子网络用来学习预测样本的损失值。训练任务模型的时候,也同时训练这个预测损失模块,之后就用这个模块来预测对哪个未标注样本的损失大,就选他。整个算法的流程图如下

在这里插入图片描述

损失预测模块的结构和损失计算方法如下:

在这里插入图片描述

6.文心ERNIE大模型做主动学习训练

文心提供的主动学习策略

目前文心共提供三种主动学习策略如下前面知识点都详细介绍过:

Least Confident (LC):

模型预测概率最大但是可信度较低的样本数据,即对未标注数据进行预测,若该样本的最大概率比其余样本的最大概率要小,则认为该样本比其余样本更值得标注

x L C ∗ = argmin ⁡ x P θ ( y ^ ∣ x ) = argmax ⁡ x ( 1 − P θ ( y ^ ∣ x ) ) , 其中  y ^ = argmax ⁡ y P θ ( y ∣ x ) x_{L C}^*=\operatorname{argmin}_x P_\theta(\hat{y} \mid x)=\operatorname{argmax}_x\left(1-P_\theta(\hat{y} \mid x)\right) \text {, 其中 } \hat{y}=\operatorname{argmax}_y P_\theta(y \mid x) xLC=argminxPθ(y^x)=argmaxx(1Pθ(y^x))其中 y^=argmaxyPθ(yx)

Margin:

该策略筛选的目标:极容易被判定成两类的样本数据,或者说该样本的最大概率和第二大概率的差值较小,则认为该样本更值得标注。

x Margin  ∗ = argmin ⁡ x ( P θ ( y ^ 1 ∣ x ) − P θ ( y ^ 2 ∣ x ) ) x_{\text {Margin }}^*=\operatorname{argmin}_x\left(P_\theta\left(\hat{y}_1 \mid x\right)-P_\theta\left(\hat{y}_2 \mid x\right)\right) xMargin =argminx(Pθ(y^1x)Pθ(y^2x))

Discriminative Active Learning (DAL): https://arxiv.org/abs/1907.06347

思想:假设大量的未标注数据可反映或者近似反映真实的数据分布,我们希望有标注数据也能尽可能的反映真实的数据分布,那就意味着希望有标注数据和未标注数据可表示同一个数据分布。

做法:DAL对有标注的样本打上标签0,未标注的样本打上标签1,使用二分类模型对标注好的样本进行训练,训练后对未标注样本进行预测,若未标注集样本以高置信度分为未标注集,意味该未标注样本和标注样本区别大,该样本信息多,标注集应该加入这个样本促使两者分布相似。其中可利用有标注数据学习到的样本的embedding作为二分类模型样本的输入特征。

其中序列标注任务中的LC和Margin策略的置信度为各token的置信度平均值(即结果不受序列长度的影响)

#安装Ernie套件
!git clone https://github.com/PaddlePaddle/ERNIE.git
# 提示Syntax error: end of file unexpected (expecting "then") 提示错误
#这是因为我在windows下些的脚本,windows和linux的回车换行时不一样的字符,所以脚本在解释时会出现问题。
#在windows里,换行用的两个符号,回车换\r行符号\n,在linux下只需一个符号\n就可以了. 
#通过命令把换行符转换一下就可以了.
# !sed -i 's/\r$//' download_ernie_3.0_base_ch.sh
# !sed -i 's/\r$//' download_ernie_3.0_x_base_ch.sh

# download_ernie_3.0_base_ch.sh 模型下载
# 进入models_hub目录下
# 运行下载脚本
# %cd ./ERNIE/applications/models_hub
# !sh download_ernie_3.0_base_ch.sh
# !sh download_ernie_3.0_x_base_ch.sh
#进入文本分类任务文件夹
# !cd ./applications/tasks/text_classification/
#查看文本分类任务自带数据集
# !ls ./data
#在text_classification目录下运行训练模型的脚本,其中json配置文件为./examples/cls_ernie_fc_ch_with_active_learning.json。
#查看 ERNIE3.0预训练模型的配置文件
# !cat ./examples/cls_ernie_fc_ch_with_active_learning.json

Windows文件dos与Unix格式相互转换方法总结: https://www.zhangqiongjie.com/2034.html

https://zhuanlan.zhihu.com/p/348730259

#安装代码迁移工具
# !pip install paddle_upgrade_tool
#其中,若采用LC或Margin策略,则is_dal设为0,若采用DAL策略,该值设为1。 然后执行命令:
# %cd ../text_classification
%cd ERNIE/applications/tasks/text_classification
!python run_trainer-Copy1.py --param_path ./examples/cls_ernie_fc_ch_with_active_learning.json

部分结果展示:

INFO: 10-27 17:42:33: base_cls.py:88 * 140481921693440 phase = training loss = 0.0006749355816282332 acc = 1.0 precision = 1.0 step = 160 time_cost = 1.6639
INFO: 10-27 17:42:35: custom_dynamic_trainer.py:95 * 140481921693440 epoch 6 progress 400/400 current learning rate: 3.31e-05
INFO: 10-27 17:42:35: base_cls.py:88 * 140481921693440 phase = training loss = 0.0005494607612490654 acc = 1.0 precision = 1.0 step = 170 time_cost = 1.7768
INFO: 10-27 17:42:36: custom_dynamic_trainer.py:95 * 140481921693440 epoch 7 progress 161/400 current learning rate: 3.21e-05
INFO: 10-27 17:42:36: base_cls.py:88 * 140481921693440 phase = training loss = 0.0004135131021030247 acc = 1.0 precision = 1.0 step = 180 time_cost = 1.4724
INFO: 10-27 17:42:38: custom_dynamic_trainer.py:95 * 140481921693440 epoch 7 progress 321/400 current learning rate: 3.11e-05
INFO: 10-27 17:42:38: base_cls.py:88 * 140481921693440 phase = training loss = 0.0004306816263124347 acc = 1.0 precision = 1.0 step = 190 time_cost = 1.8483
INFO: 10-27 17:42:40: custom_dynamic_trainer.py:95 * 140481921693440 epoch 8 progress 81/400 current learning rate: 3.01e-05
INFO: 10-27 17:42:40: base_cls.py:88 * 140481921693440 phase = training loss = 0.0005759032210335135 acc = 1.0 precision = 1.0 step = 200 time_cost = 1.7387
INFO: 10-27 17:42:41: base_cls.py:93 * 140481921693440 phase = test acc = 0.895 precision = 0.8946 time_cost = 1.2796 step = 25

训练运行的日志会自动保存在./log/test.log文件中;

训练中以及结束后产生的模型文件会默认保存在./output/目录下,其中save_inference_model/文件夹会保存用于预测的模型文件,save_checkpoint/文件夹会保存用于热启动的模型文件。

#遇到版本问题,转换一下代码
paddle_upgrade_tool --inpath /home/aistudio/ERNIE/applications/tasks/text_classification/trainer/custom_dynamic_trainer.py --write
paddle_upgrade_tool --inpath /home/aistudio/ERNIE/erniekit/controller/dynamic_trainer.py --write
paddle_upgrade_tool --inpath /home/aistudio/ERNIE/erniekit/common/jit_wenxin.py --write

模型预测

根据预测策略的不同,各预测配置文件不同,具体如下:

LC/Margin策略 需未标注样本的各类别的预测概率值。 其中json配置文件: cls_ernie_fc_ch_infer_with_active_learning.json

  "inference": {
    "type": "CustomInference",
    "output_path": "./output/predict_result.txt",
    "PADDLE_PLACE_TYPE": "cpu",
    "num_labels": 2,
    "thread_num": 2,
    "inference_model_path": "./output/cls_ernie_3.0_base_fc_ch_dy/save_inference_model/inference_step_126/",
    "active_learing":
    {
      "is_dal":0
    },
    "extra_param": {
      "meta":{
        "job_type": "text_classification"
      }

DAL策略 需已标注样本和未标注样本的样本特征(embedding),为此需分别对未标注数据和训练数据进行预测
a. 未标注数据预测配置 上述active_learning字段修改为:


   "active_learning":
    {
      "is_dal": 1,
      "emb_size": 768
    },

b. 训练数据预测配置 可参考: cls_ernie_fc_ch_train_with_dal_infer.json

其中和未标注数据的预测配置文件的区别在于

i. reader中加入label字段的配置;

ii. 待预测数据为训练集;

iii. 预测结果输出文件。

3.开始预测:

a. LC/Margin策略

b.DAL策略

!python run_infer_with_active_learning.py --param_path ./examples/cls_ernie_fc_ch_infer_with_active_learning.json
# 对未标注数据进行预测
!python run_infer_with_active_learning.py --param_path ./examples/cls_ernie_fc_ch_infer_with_active_learning.json
# 对标注数据进行预测
!python run_infer_with_active_learning.py --param_path ./examples/cls_ernie_fc_ch_train_with_dal_infer.json

主动学习查询待标注数据,这个部分文心开源的v1.0版本没有需要申请旗舰版

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2b5y299j-1667638374997)(https://ai-studio-static-online.cdn.bcebos.com/da7361530e214c12ab0d0524c550e7b7c9f4a0978257436ab52c388a66c46104)]

进入主动学习目录:
代码结构:


├── config                           ## 主动学习策略配置文件
│   ├── sequence_labeling.yml       ## 序列标注任务配置文件
│   └── text_classification.yml     ## 文本分类任务配置文件 
├── hard_sample_job.py               ## 主动学习策略的入口脚本
├── __init__.py
└── strategies                       ## 主动学习策略代码
    ├── dal_strategy.py              ## DAL策略
    ├── hard_sample_strategy.py      ## 主动学习策略基类
    ├── __init__.py
    ├── lc_strategy.py               ## LC策略
    ├── margin_strategy.py           ## Margin策略
    └── sequence_label_strategy.py   ## 序列标注策略(调用LC和Margin策略)

开始查询

修改配置文件 以./config/text_classification.yml进行字段说明:


hard_sample_num_config:             ## 待挑选难例样本的个数设置
  mode: num                         ## 分别有num模式和ratio模型,num模式为返回value值个数的最值得标注的数据,ratio模式返回的样本个数为总未标注样本数*value。
  value: 200
 
DAL:                                ## DAL二分类网络配置
  iteration: 5         
  mlp_hidden_layer_sizes:
    - 256
    - 256
    - 256
  mlp_max_iter: 10

执行主动学习策略进行查询


python hard_sample_job.py [--task] [--fun] [--predict_file] [--train_predict_file]

脚本接口参数说明


usage: hard_sample_job.py   [--task] [--fun] [--predict_file] [--train_predict_file]
## task: 任务名称
## fun: 主动学习策略
## predict_file: 待挑选数据的预测文件
## train_predict_file: 若为DAL策略需提供训练数据的预测文件    

主动学习策略结果保存在./hard_sample_result目录下,结果共三列,以\t分割,分别为文本、难例的权重(权重越大越值得标注,结果已排好序)和训练模型预测出的标签,具体如下所示:

在这里插入图片描述

效果评估

文本分类序列标注
数据集chnsenticorpMSRA-NER
启动条件每个标签的样本数为50每个标签的标注数至少为500
新增数量每次采用主动学习策略新增200条数据每次采用主动学习策略新增200条数据

效果:DAL策略效果较差,LC/Margin策略可实现只需标注30%左右的数据可达到全量数据的效果。

5.注意事项
因Margin默认加入阈值限制,认为如果top1标签的概率值大于0.65时则不认为是难例,因此在模型较好的情况下的难例分值多为0,与随机效果无区别,可删掉该阈值限制进行评测,具体可参考tools/data/hard_sample/strategies/margin_strategy.py。

%cd ./tools/data/hard_sample/

参考链接:https://ai.baidu.com/ai-doc/ERNIE-Ultimate/Fl5815s6r

请申请旗舰版 or 使用 BML 全功能AI开发平台

https://ai.baidu.com/bml/app/annotate/interactive?branch=nlp

在这里插入图片描述

7.总结

在这里插入图片描述

获得有用是标注数据在训练时是非常重要的,但是标注数据可能很非常的费事费力,并且如果标注的质量不佳也会对训练产生很大的影响。主动学习是解决这个问题的一个方向,并且是一个非常好的方向。

个人博客:https://blog.csdn.net/sinat_39620217?spm=1001.2100.3001.5343

部分参考链接:知乎作者温文关于主动学习的详细总结,供参考

budget size有关的"相变"(Cluster-Margin, TypiClust)

主动学习(十一)——采样偏差真的重要吗?active learning bias vs overfitting bias(ICLR2021)

深度主动学习综述(Deep Active Learning)

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐