《Adversarial Active Learning for Sequence Labeling and Generation》阅读笔记

本文主要是针对序列型任务(即输出为一个序列的任务,例如图片描述、机器翻译、序列标注等)提出了一种基于对抗的主动学习算法框架。

主动学习(active learning)介绍

主动学习(active learning)是一种解决监督学习中标记数据不足这一问题的方法。

在实际的监督学习任务中,往往会面临的情况就是:能够获取到大量的未标注数据,但是限于人力、物力,能做标注的数据量则十分有限(对于序列型任务更加棘手,因为序列型任务的标注往往还需要专业领域的知识,无法通过众包给大众的方式进行标注)。比如能够获取到10000条未标注数据,但可能只能标注其中的10%,1000条,这时如何选择这1000条就显得尤为关键,因为不同的标注数据带给模型的提升是不同的。原文中举了一个图片分类的例子:假设现在标注的数据池中包含了sports类别的各种图片(例如足球、篮球、羽毛球等),模型已经基于这些标注数据进行了训练。现在给定了两张未标注的图片,一张是关于swimming,另一张是关于a plate of food,作者认为选择后者进行标注、学习能够带给模型的提升更大,因为它相比前者为模型引入了更多的知识。

所以主动学习想要解决的问题就是:在庞大的未标注的数据集中,如何选取有限量的数据进行标注(称为query sample selection),使得模型能够获得最优的性能。由于这些待标注的数据相当于是由模型“主动”选择出来,提出进行标注的,所以就被称为“主动学习”。

传统的主动学习算法

传统的主动学习方法一般都基于目前的分类器(模型),为unlabeled集合中的每一条unlabeled sample进行预测,然后对模型此次预测的不确定性作一个评价。得分最高(模型最不确定)的若干个sample就作为下一步需要标注的样本。

从分类器中导出的不确定性评价有如下几种:

  1. 根据预测的置信度(confidence score)进行的评价
    confidence score
    表示需要选出模型预测的置信度最低的若干条未标注样本进行标注。
    margin between the best and the second best
    公式(2)则采用了margin的形式,对于每一条未标注样本,选出最优和次优的两个预测序列,选择两者置信度的差值最相近(表示模型不确定是y1*还是y2*)的未标注样本进行标注。

  2. 根据模型的熵(sequence entropy)进行的评价
    sequence entropy
    公式(3)枚举所有可行的序列(类别),使用模型对每个序列的评分算出一个熵值,作为不确定性的评价指标。
    sequence entropy of N best sequences
    公式(4)相比公式(3)则使用了分值最高的N个序列去计算熵值,而不是所有可行序列。

序列型任务相比于分类任务的难点

  1. 冷启动问题:当开始标注的序列样本较少时,模型对于序列的预测可能很不准,那么基于这种不准的模型去导出预测的不确定性,从而去未标注的数据集中选择下一步要标注的样本,这个过程本身也会不准。
  2. 预测序列的空间过于庞大,对于长度为k的预测序列,每个token可能有p种,那么总共的序列就有p^k种,基于上面说的传统的不确定性评价方法,其复杂度会基于序列长度k呈指数级别上升。因此很将传统的应用于分类任务的主动学习方法引入到序列任务中。

本文提出的模型

本文提出的主动学习模型

本文提出了一个基于对抗的主动学习算法框架,结合encoder-decoder框架,去处理主动学习过程中的query sample selection的问题。

模型的结构如上图所示,根据不同的功能相当于可以分成两条线:

其一是针对于序列任务的encoder-decoder框架,encoder(图中的M())负责对样本进行特征提取和编码,将其转换成一个中间向量Z,随后这个中间向量交由decoder(图中的C())进行解码,形成预测的序列。这里的encoder和decoder可以整体视为一个黑箱,论文并不关心encoder/decoder具体采用怎样的模型。

其二是为了解决主动学习中的query sample selection问题(也就是从未标注的样例集合中怎样选取下一步要标注的样例)。本文的模型是基于对抗的,就是图中特征编码器M()和分类器D()的对抗。分类器D()相当于需要做一个二分类任务,目标是判别出某个具体的样本采样自labeled pool还是unlabeled pool。而特征编码器M()除了要学习出样本的特征,获得更好的样本编码供decoder使用以外,还需要使得encoder能够迷惑分类器D(),使之无法判别出该样本采样自labeled pool还是unlabeled pool。

训练时采用的损失函数如下:

  1. M()的损失函数为:
    编码器M()的损失
    其中的前两项表示和判别器D()对抗的损失(可理解为迷惑判别器D()所获得的奖励),而最后一项针对已标注的数据,预测序列与真实序列之间的损失,具体为:

    其中的L(·)可以是任意的评价两个序列相似程度的损失函数
  2. D()的损失函数为:
    判别器D()的损失
    即正确区分出样本labeled or unlabeled所获得的奖励。

对抗的训练过程如下图所示:
对抗训练算法流程

当每一次的模型训练完毕后,一方面M()C()能够相互配合,生成和真实序列相近的预测序列;另一方面,可以使用判别器D()去评价:未标注的样本集中的样本与当前模型的匹配程度。如果D(M(x_unlabeled))得分较高,则说明D()认为这条样本大概率来自labeled pool,也就可以认为这条样本与现有已标注样本集的覆盖程度较高;相反,如果D(M(x_unlabeled))得分较低,说明这条样本和已标注样本集的覆盖程度较低,其包含当前模型没有学到的知识的程度较大,因此适合选出来进行标注。

实验

本文提出的模型分别在两个序列任务:slot-filling和image-captioning上进行了实验,这里只介绍对第一个任务(slot-filling)的实验。

数据集

采用的是ATIS(预定机票)的数据集。

采用模型

  • 编码器:采用了双向LSTM,64个隐层结点。word-embedding维度为128。最后得到的中间表示向量的维度为128(2 * 64)维。
  • 解码器:本文分别尝试了两种解码器:1. 标准的LSTM解码器;2. 加了attention机制的LSTM解码器。
  • 判别器D():三层全连接:128 - 64 - 1,输入和中间层使用relu作为激活函数,输出层会过一个sigmoid函数,得到0-1之间的得分,表示属于labeled pool的概率。

结果

训练时每次选取数据中的10%进行训练(视为由主动学习框架选出的下一步要标注的数据),最后得出模型效果随标注数据百分比的变化情况如下:
实验结果:F-score随标注数据量变化
其中两张图分别对应上面提到的使用的两个解码器(上图为标准LSTM,下图为加了attention机制)。

每张图中的不同颜色的折线表示对不同的主动学习方法之间的比较:Random表示随机从未标注数据集中选取10%的数据进行标注;LC/NSE分别为上文提到过对于query sample selection的几种传统的不确定性评价方法;ALISE则是本文提出的这个方法;而ALISE+NSE表示本文提出的方法和NSE方法的综合评价。

可以看到,在标注的数据量占全部数据百分比一定时,ALISE方法所获得的模型效果基本上领先于其他的主动学习评价方法。而综合ALISE和NSE的评价方法则更为优秀。

References

Author: yym6472
Link: https://yym6472.github.io/2019/04/08/《Adversarial-Active-Learning-for-Sequence-Labeling-and-Generation》阅读笔记/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.