查看原文
其他

【源头活水】Zero-Shot Learning in Modern NLP 现代NLP中的零样本学习

“问渠那得清如许,为有源头活水来”,通过前沿领域知识的学习,从其他研究领域得到启发,对研究问题的本质有更清晰的认识和理解,是自我提高的不竭源泉。为此,我们特别精选论文阅读笔记,开辟“源头活水”专栏,帮助你广泛而深入的阅读科研文献,敬请关注。

译者:知乎—小黄

地址:https://www.zhihu.com/people/xiao-huang-15-75

来源:https://joeddav.github.io/blog/2020/05/29/ZSL.html

其中*为译者自己加入的内容。

无标注数据的文本分类任务的SOTA NLP模型

NLP现在是一个非常令人兴奋的领域,近些年,大家开始研究针对互联网上巨量可用的未标注数据的一些行之有效的机器学习方法。无监督模型(*如BERT)的迁移学习帮助我们超越了所有下游需要监督学习的任务的基线。我们现在仍致力于研究新的模型架构和无监督学习的方法,对于有大量标注的任务来说,SOTA模型仍是一个快速发展的目标。
模型发展的一个显著优势是,我们看到了对下游任务大量标注数据的依赖正在逐渐降低。本周(*原文发布时间为2020.3月底),OpenAI预发布了他们最大的模型GPT-3,1750亿的参数量。该论文的标题是"Language Models are Few-Shot Learners"[1],并且表明,超大型语言模型仅需远少于小型模型的已标注任务数据量,就可以在下游任务表现得更好。
GPT-3随着参数量增长的小样本学习效果
尽管如此,这种参数量的超大型模型在现实任务中仍然不切实际。例如,最大参数量版本的GPT-3甚至必须分区分布在数十个GPU内存中。但是在许多场景中,带标注的数据要么稀缺要么完全不可用。比GPT-3小得多的BERT,被证明其权重中也是有大量的信息编码的[2]。似乎,如果我们对此有所了解,便能够找出一些技术,将模型的潜在信息应用于下游任务,而无需使用太多任务特定的标注数据。
当然,这个领域实际上已经有一些研究应用了。这篇文章,将介绍一部分此类技术,包括已发表的研究和我们在Hugging Face进行的实验,这些技术将SOTA NLP模型用于无大量标注的训练集的序列分类任务。

01

什么是零样本学习(zero-shot learning)?
传统上来说,零样本学习(ZSL)最常指的是一种特定类型的任务:在一组数据上训练一个分类器,然后让分类器预测另一组没见过的、不同源的数据。但是最近,尤其在NLP领域,它是广义上的让模型执行它没学习过的任务。GPT-2的论文[3]就是一个例子,论文中,作者在一些没有直接微调过的下游任务(比如机器翻译)中评估语言模型。这个定义并不是那么重要,但是了解到ZSL有各种方式的应用十分重要,我们也应该在比较不同的方法时注意理解它们的实验条件。举个例子,传统的零样本学习为了让模型能够预测没有训练数据的类别,需要为没见过的类别提供某种描述信息(descriptor)[4](比如一组视觉属性或者简单的类名)。所以交流各种方法的时候,我们需要了解,不同的ZSL会采用不同的规则来定义哪些类别描述信息来表示上下文。

02

潜在信息嵌入方法(latent embedding)
计算机视觉领域中,零样本学习的一种常见方法是,利用现有的特征提取器将图像和任何可能的类名嵌入它们相应的潜在表示中。[5]然后模型接收部分训练集和仅一部分可用标签的子集,便可以学习到对齐图像和标签向量的线性投影。测试时,该框架允许将任何标签(可见或不可见)和任何图像嵌入到相同的潜在空间中并测量它们之间的距离。
文本领域的优势在于,我们可以轻松地使用单个模型将数据和类名都嵌入到同一空间中,省去了缺乏数据的对齐步骤。这并不是一项新技术——研究人员和从业人员以类似的方式使用池化的词向量有一段时间了。[6]但是近期,句子嵌入模型的质量有了显着提高。因此,我们决定使用Sentence-BERT进行一些实验,Sentence-BERT为了增加语义丰富度在BERT的序列表征上做了微调,可以获得序列和标签向量。
假设我们有个序列嵌入模型  和一组可能的类名  ,我们对给定的序列  进行分类:
其中  指余弦相似度。
示例代码片段如下,展示如何将Sentence-BERT作为嵌入模型  :
# load the sentence-bert model from the HuggingFace model hub!pip install transformersfrom transformers import AutoTokenizer, AutoModelfrom torch.nn import functional as Ftokenizer = AutoTokenizer.from_pretrained('deepset/sentence_bert')model = AutoModel.from_pretrained('deepset/sentence_bert')
sentence = 'Who are you voting for in 2020?'labels = ['business', 'art & culture', 'politics']
# run inputs through model and mean-pool over the sequence# dimension to get sequence-level representationsinputs = tokenizer.batch_encode_plus([sentence] + labels, return_tensors='pt', pad_to_max_length=True)input_ids = inputs['input_ids']attention_mask = inputs['attention_mask']output = model(input_ids, attention_mask=attention_mask)[0]sentence_rep = output[:1].mean(dim=1)label_reps = output[1:].mean(dim=1)
# now find the labels with the highest cosine similarities to the sentencesimilarities = F.cosine_similarity(sentence_rep, label_reps)closest = similarities.argsort(descending=True)for ind in closest: print(f'label: {labels[ind]} \t similarity: {similarities[ind]}')
label: politics similarity: 0.21561521291732788
label: business similarity: 0.004524140153080225
label: art & culture similarity: -0.027396833524107933
⚠️代码片段中所用 deepset/sentence_bert 是最小参数量版本的Sentence-BERT模型。我们的实验使用的是较大的模型,目前仅在sentence-transformers(https://github.com/UKPLab/sentence-transformers)中可用,我们希望不久后可以在Hugging Face model hub中使用。
这种方法存在一个问题,就是Sentence-BERT模型关注的是句子级的语义,而不是像类名那种单字或词语级别的语义(*意味着类名的向量不准确)。因此可以合理地假设,标签的向量不像流行的词级别的向量抽取方法那么准确(比如word2vec)。在下面的t-SNE可视化图像中可以看到,数据点似乎准确地按照类别(颜色)聚类在了一起,但是类别名称十分不准确。如果我们要使用词向量当作标签的表示,那就需要标注数据去学习怎样对齐Sentence-BERT的序列向量和word2vec的词向量表示。

t-SNE可视化:Yahoo Answers数据集的Sentence-BERT向量。其中,十字点代表数据点,文本框对应标签。尽管某些标签(如‘Computers & Internet’)确实和数据点对应上了,但是大多数标签对应不上。

在我们自己的一些内部实验中,我们通过以下过程解决了此问题:
1. 在word2vec模型的词表中取出top K个出现频率最高的单词V;
2. 用word2vec获得每个词的词向量  ;
3. 用Sentence-BERT获得每个词的词向量  ;
4. 学习带L2正则化的从  到  的最小二乘线性投影矩阵 
(*大概是这种最小二乘法)https://developer.aliyun.com/article/242069
由于这个投影矩阵仅学习了单个单词的向量,因此我们不能指望它学到了一个有效的从Sentence-BERT的序列向量到word2vec的词向量的映射。相反,我们仅在分类中使用  作为对序列和标签的Sentence-BERT向量的转换:
该过程可以被认为是一种降维。从下面的t-SNE可视图中可以看出,这种投影使标签向量与其对应的数据簇能更好地对齐,同时也保持了Sentence-BERT与的优越效果。重要的是,此过程除了按单词频率排序的word2vec词典之外,不需要任何其他的数据。
在Yahoo Answer主题分类任务中,无投影步骤的F1值为31.2,而有投影步骤的F1值为46.9。该数据集的数据一共分为10个类别,有监督的模型可以达到的准确率为75上下。[7]

t-SNE可视化:将Sentence-BERT投影至word2vec。这一投影步骤和之前相比,使标签向量更接近其对应的数据簇。

当有一些可用的标注数据时
此技术非常灵活,可以轻松地应对以下情况:有限数量的可用标注数据(小样本学习few-shot learning),或者仅有一部分感兴趣数据的子集已标注(传统的零样本学习)。
可以简单地学习一个最小二乘投影矩阵,将任何可用标注数据的向量投影到其对应的数据簇向量中。但是,最重要的是我们采用的方式不能过拟合有限的数据。我们的向量在其自身上表现良好,因此需要在它们之间找到一个投影,在学习训练数据的同时,可以利用到这些表示的语义丰富性。
为此,我们添加了L2正则化的变体,该变体将权重推向单位矩阵,而不是降低其范数。定义  为训练数据,  为训练标签,  为上述嵌入函数,那正则化目标则为 
等价于以单位矩阵为中心的权重和由  控制的方差采用高斯先验的贝叶斯线性回归。我们想通过推动  靠近单位矩阵,有效地将投影嵌入  推向  。通俗来讲,我们的先验知识是,最能表示我们的数据的是嵌入函数  ,并且我们只在拿到更多训练数据时,才会更新该知识。

03

NLI(Natural Language Inference)分类
现在我们探索一种可代替的方法,这种方法不仅能将序列和标签映射到同一空间以测量它们之间的距离,还能告诉我们两个不同序列之间的一致性。
简略来看,NLI[8]将两个句子当作:一个“前提”和一个“假设”。其任务是确定在给定的“前提”下,这个“假设”是正确的(蕴含)还是错误的(矛盾)。

官方示例

当使用BERT类似的transformer架构时,NLI数据集是一个很经典的对一对序列进行分类的任务。也就是我们会将“前提”和“假设”当作一对不同的切片喂给模型,训练一个分类器预测是[蕴含,中立,矛盾]中的哪一类。
Yin et al. (2019)[9]用了预训练的MNLI(Multi-genre NLI)序列对分类模型作为开箱即用的零样本学习模型,事实上效果还不错。它的想法是将我们感兴趣的标签序列作为“前提”,并将每个候选标签变成一个“假设”。如果NLI模型预测前提蕴含假设,那么我们就认为标签是正确的。下面的代码片段展示了用HuggingFace Transformers能够轻易做到:
# load model pretrained on MNLIfrom transformers import BartForSequenceClassification, BartTokenizertokenizer = BartTokenizer.from_pretrained('facebook/bart-large-mnli')model = BartForSequenceClassification.from_pretrained('facebook/bart-large-mnli')
# pose sequence as a NLI premise and label (politics) as a hypothesispremise = 'Who are you voting for in 2020?'hypothesis = 'This text is about politics.'
# run through model pre-trained on MNLIinput_ids = tokenizer.encode(premise, hypothesis, return_tensors='pt')logits = model(input_ids)[0]
# we throw away "neutral" (dim 1) and take the probability of# "entailment" (2) as the probability of the label being true entail_contradiction_logits = logits[:,[0,2]]probs = entail_contradiction_logits.softmax(dim=1)true_prob = probs[:,1].item() * 100print(f'Probability that the label is true: {true_prob:0.2f}%')
Probability that the label is true: 99.04%
论文的作者称,最少参数版本的BERT仅在MNLI语料库上微调,就能在Yahoo Answer上达到标签加权F1:37.9。我们简单地把更大更新的Bart模型在MNLI语料库上预训练后,能把分数提高到53.7。
尝试一下我们的Demo!(http://35.208.71.201:8000/) 输入要分类的序列和任何感兴趣的标签,观看Bart实时进行魔术操作。
当有一些可用的标注数据时
用少量带标注的数据微调此模型没什么效果,所以它不适合小样本学习。但是在传统的零样本学习中,对于有限数量的类,我们有足够的数据,该模型是非常出色的。可以通过给模型输入两次序列来进行训练:一次使用正确的标签,一次使用随机选择的错误标签,以优化交叉熵。
微调后出现的一个问题是,模型预测的时候,它见过的标签的概率要比没见过的标签高得多。为了减轻这个问题,作者引入了一种在测试时对训练时见过的标签进行惩罚的方法。详见论文[10]和作者Github(https://github.com/yinwenpeng/BenchmarkingZeroShot)。

04

完形填空式分类
一种有效的方法可以吸引你的注意,那就是PET(Pattern-Exploiting Training)的预发布[11]。这篇论文中,作者将文本分类任务重构为一个完型填空任务。完形填空问题考虑了被部分掩盖的序列,并且需要根据上下文预测缺失值。PET需要人工构建几个适合该任务的完形填空模板,在主题分类的情况下,类似于下面的样式:
主题分类的完形填空样例。a是Yahoo Answers中的问题,b是Yahoo Answers中的答案,____是模型要预测的类别名称。
此后一个预训练遮蔽模型的任务是,从每个完形填空句子的可能类别名称中为遮蔽(空白)的单词选择最可能的值。
结果就是每个数据点都有一组嘈杂的类别预测。仅此过程即可作为基本的零样本分类器。另外,作者还介绍了一种知识提取方法。在完形填空任务中生成了一组预测答案后,这些预测值将被当作代理标签(*伪标签),重新训练新的分类器。我的直觉是,此步骤之所以有效,是因为它使我们能够对整个测试集进行集体推断,从而使模型能够从其预测的集合中学习,而不是独立地对待每个测试点。我怀疑这一步骤在新领域数据时会特别有用因为它不像MLM的训练语料库。
在论文的最新版本中,作者还讨论了基于PET的迭代式自我训练过程,该过程在Yahoo Answers上报告了令人印象深刻的70.7%的准确率,几乎接近了SOTA监督分类模型的效果。让我们回顾一下前面的观点,在比较不同方法时要考虑实验参数。尽管PET的性能明显优于本文所述的其他方法,但它也利用了其他方法无法获取的数据:在分发/自学习步骤中,需要多个任务特定的人工制定的完形填空语句和大量未标记的数据。我说这些并不是要以任何方式敲打PET,作者也不会与我这里概述的方法进行比较,而只是强调在比较不同方法时小心谨慎的重要性,“ 零样本”。
当有一些可用的标注数据时
作者提出了一种在有一些训练数据可用的情况下使用PET的先进方法,可以有效地根据训练数据优化完形填空预测与标准MLM损失之间的联合损失。细节部分如果有兴趣,我强烈建议查看它的预发布(https://arxiv.org/abs/2001.07676),YouTube(https://www.youtube.com/watch?v=01jRE9noSWw)或GitHub库(https://github.com/timoschick/pet)。

低资源语言

NLP中一种非常重要的数据稀疏设置是使用低资源语言。幸运的是,这是一个非常活跃的研究领域,并且已经有很多相关的文章。对于那些对此领域感兴趣的人,我强烈建议您查看Graham Neubig最近发布的Low Resource NLP Bootcamp(https://github.com/neubig/lowresource-nlp-bootcamp-2020)。这是一个很棒的资源,以GitHub库的形式提供,其中包含8种针对数据稀缺语言的NLP的讲座(以及练习)。另外,建议查看Sebastian Ruder的著作,包括:"A survey of cross-lingual word embedding models"(https://ruder.io/cross-lingual-embeddings/)。

参考

1.《Language Models are Few-Shot Learners》 https://arxiv.org/abs/2005.14165

2.《Language Models as Knowledge Bases?》Petroni et al. 2019 https://arxiv.org/abs/1909.01066

3.https://pdfs.semanticscholar.org/9405/cc0d6169988371b2755e573cc28650d14dfe.pdf

4.《An embarrassingly simple approach to zero-shot learning》 http://proceedings.mlr.press/v37/romera-paredes15.pdf

5.《Zero-Shot Learning Through Cross-Modal Transfer》 https://arxiv.org/abs/1301.3666

6.《Using Semantic Similarity for Multi-Label Zero-Shot Classification of Text Documents》 https://www.elen.ucl.ac.be/Proceedings/esann/esannpdf/es2016-174.pdf

7.Yahoo Answers 结果 https://paperswithcode.com/sota/text-classification-on-yahoo-answers

8.Natural Language Inference http://nlpprogress.com/english/natural_language_inference.html

9.https://arxiv.org/abs/1909.00161

10.《Benchmarking Zero-shot Text Classification: Datasets, Evaluation and Entailment Approach》 https://www.aclweb.org/anthology/D19-1404/

11.《Exploiting Cloze Questions for Few Shot Text Classification and Natural Language Inference》 https://arxiv.org/abs/2001.07676

本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。


“源头活水”历史文章


更多源头活水专栏文章,

请点击文章底部“阅读原文”查看



分享、在看,给个三连击呗!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存