无所不能的Embedding7 - 探索通用文本表达[FastSent/InferSent/GenSen/USE]

在4/5章我们讨论过用skip-thought,quick-thought任务来进行通用文本向量提取,当时就有一个疑问为什么用Bookcorpus这种连续文本,通过预测前一个和后一个句子的方式得到的文本向量,能在下游任务里取得比较好的效果呢?这一章我们来聊聊都有哪些SOTA通用文本框架,或许直接使用它们的场景已经不多,但你依旧能在各个前沿方法中看到它们的影子。我们会主要聊聊以下内容

  • 通用性:为啥需要通用文本表达?通用具体指什么?如何评价?
  • 为什么部分监督模型得到的文本表达不通用?
  • 哪些模型结构和训练任务可以得到更通用的文本向量?

通用性

人类语言有有近乎无限的统计复杂度,但可以在低维度上得到很好的近似。对通用文本表达的探索,都是希望能找到更优的语言模型框架,去尽可能全面地从文本中提取信息。

NLP任务往往很难拿到大量标注样本,通用文本表达通过特征迁移把预训练模型得到的文本向量,作为下游任务的模型输入,帮助模型跳过从文本中提取信息的步骤,信息已经在文本向量中,模型只需要从向量中抽取用于当前任务的信息即可,这样可以大大降低对标注数据的需求,使很多缺乏样本的不可能任务成为可能。

以下paper多选择了特征迁移的方式,即把预训练模型得到的文本表达作为下游任务的输入来评价通用性。下游任务主要包括分类任务和文本语义相似度任务,其中分类任务有

  • MR 判断影评的正/负面
  • CR: 产品客户评论,评价正/负面
  • MRPC 判断两个句子是否同义
  • SUBJ 判断句子是主观/客观
  • MPQA 意见立场分类问题
  • TREC 问题的所属分类

评价文本向量在分类问题中的表现,一般会采用最简单的logistic classifier,输入是文本向量,输出是分类结果,这样最小化模型结构带来的影响,只去评价文本向量本身是否包含该分类问题所需的信息。

文本语义相似度任务(STS Benchmark)包括

  • SICK 文本对标注了相关和包含
  • STS 文本对标注了0-5的相似度打分

评价文本相似度,一般直接计算文本向量的cosine距离,然后计算和标注label的pearson correlation。

针对以上任务也有一些文本评估的开源library可以直接用,例如SentEvalGLUE Benchmark

模型框架

下面我们会分别介绍4种模型架构,以及它们在以上benchmark数据集上的表现。不过个人感觉不用太过在意每个新架构在Benchmark上的表现提升,之前看到有调侃刷榜现象的评论说:新模型一定使用grid-search进行超参搜索直到它超越已有的SOTA方法,但绝不会对进行对比的其他方法也做调优,感觉虽不中亦不远矣。所以我们只关注架构中有意思的创新点和它背后的逻辑就好~

FastSent|SDAE(Hill 2016)

Take Away:不同的下游信息提取方式会从相同的文本中提取出不同信息, log-bilinear类文本表达在文本相似度任务中表现更好

先简单过下paper中提到的另外两种文本向量的生成方式:

  • FastSent: 快速版Skip-thought,其实就是忽略语序用词向量加和作为句子向量,任务不变依旧是用中间句子来预测前后句子
  • SDAE: skip-thought训练依赖像小说一类的连续文本,SADE是针对像twitter一样没有上下文只有单一句子的训练方案。先对句子本身进行随机删除单词,替换顺序,之后过autoencoder来预测原始句子本身。其实和Bert的MLM完形填空任务有些相似了,只不过Bert是只预测Mask的单词,而SDAE是预测整个句子。

这里我们关注的重点不在这两种算法,而在于paper对比了skip-thought, Fastsent,SDAE, DBOW, BOW,DictRep用字典解释的BOW或者RNN来拟合解释的词向量,CaptionRep用标题向量拟合图片向量,以及NMT翻译任务,得到不同文本表达在下游任务中的表现,有一些比较有意思的结论。

文本分类的下游任务没啥说的,skip-thought整体表现最优(2016年)~

而文本相似度任务结果比较有趣,整体上log-bilinear类的模型包括Fastsent,DickRep, 以及直接对CBOW词向量求平均得到的文本向量表达在STS和SICK数据集上有更好的表现。

这里并非其他向量没有学到Semantic Similarity信息,而是信息并不能简单通过cosine距离被提取出来。因此不仅如何生成通用文本很重要,如何从文本中提取信息也很重要。log-bilinear类的模型例如CBOW,在梯度更新时本就通过向量加/减进行计算,隐含了距离计算在内,因此更适用于cosine距离计算。想得到Semantically meaningful的文本表达,另一种解决思路就是在训练embedding的过程中加入向量距离计算,下面的Infersent就用了类似的操作。

InferSent(Facebook 2017)

Take Away: 并非所有监督模型得到的通用表达都不好,NLI标注数据就可以!

在InfeSent之前,通用文本表达以Skip-thought/FastSent这类无监督模型为主,不是没有其他监督模型的文本表达,但效果都不太好。文章指出监督模型文本表达通用性差的原因在于NN很容易学到特定监督任务的特殊性(Inductive Bias),例如判断正负面的任务可能主要关注和正负面有关的关键词信息,翻译更注重相同语法结构和词之间的对应关系等等,从而忽视文本的整体语义。非监督任务例如自己预测自己的SDAE,预测前/后句子的NSP类任务因为没啥特殊性,反而会得到包含更完整语义信息的文本表达。但paper指出并非所有监督任务都不好,NLI就可以呀!

先来瞅一眼NLI数据集长啥样, SNLI是文字蕴含的推理任务(RTE),由5个标注同学标注文本和假设之间是正向蕴含,矛盾蕴含还是独立蕴含,最终major vote得到neutral, contradiction,entailment的分类标签。作者认为NLI需要真正理解文本才能做出判断,导致NLI更适合用来学习通用文本表达。。。这解释的好抽象。。。简直就像没解释一样。。。。不过从某种程度讲NLI相较文本相似任务,翻译任务确实更难抽象出task-specific的模式,它对语法结构是否相同,是否包含相同或同义词没有非常一致的要求。

InferSent模型用了siamese结构,两个句子共用一个encoder,分别得到u和v的文本向量表达。然后用3种计算方式,向量拼接\([u,v]\),相乘\(u \cdot v\),相减\(|u-v|\)(为了保证对称性取绝对值),来帮助后面的全连接层提取向量间的交互信息,最后跟一个3-class的分类器。

对于Encoder选择作者对比了GRU/LSTM/BiLSTM+max/avg pooling,以及self-attention和Hierarchical ConvNet,发现BiLSTM+max pooling得到的文本向量,在下游任务的评估中几乎全面超越了skip-thought,在CR等部分任务中和直接针对任务训练的监督模型几乎不相上下。

之后的Sentence-Bert也借鉴了InferSent的框架,只不过把encoder部分替换成了bert,这个留到Bert之后再说

GenSen(Microsoft 2018)

Take Away: 单一任务的文本表达存在inductive-bias,可以通过multi-task来融合

InferSent通过寻找相对抽象需要文本理解的监督任务来得到更通用的文本表达,而GenSen提出可以直接融合多个监督任务来提高通用性。GenSen总共选取了4大类任务,在满足多样性的前提下,每个任务本身要在文本表达上有不错的效果且有足够大的训练样本,包括Skip-thought,NMT翻译任务,NLI推理任务和parsing句法分析。

GenSen用了相对简单的针对不同数据源的multi-task训练方式,上述任务都是英文输入所以共用1个GRU Encoder,保证不同任务都在更新相同的信息提取方式,得到包含多个任务信息的文本表达。这里的Encoder沿用了Skip-though的conditional GRU,不熟悉的童鞋可以看这里无所不能的Embedding4 - skip-thought & tf-Seq2Seq源码解析。每个任务各自有不同的Decoder,每一轮等权随机选择一个任务,从该任务中取相同batch_size的样本进行梯度更新。以下是GenSen在下游任务的表现

最右侧的\(\Delta\)是相对InferSent的提升,会发现随着GenSen加入更多目标任务,相对Infsersent在10个任务上的平均表现会持续上升,虽然并非所有下游任务都是随训练目标增多而变得更好。之后很多预训练语言模型包括Bert都沿用了multi-task的思路,只不过选用的多目标任务各有不同而已。

USE (Google 2018)

Take Away: 同样通过multi-task生成通用文本向量

和GenSen同期,还有另一个multi-task的模型架构被提出就是universal-sentence-encoder。感觉USE名声更大些,大概是因为在hub上开源了Large,Lite和MultiLingual的模型[Ref9],可以很方便的开箱即用,或者在新的场景做finetune。和GenSen的主要区别有两个

  1. 多目标任务选择不同,USE虽然依旧是通用文本,但它选择的目标任务训练方式导致文本表达更加Semantically Meaningful,通常预训练模型就能在各类文本相似度任务中拿到非常好的结果。3个目标任务分别是Skip-thought类前后句子预测任务,Input-response对话任务,以及NLI推理任务。因此Semantic Similar的文本可能会有相似的上下文语境,相似的提问或回答,相似的推理内容,如下图所示

  1. Encoder选择不同,GenSen沿用了GRU Encoder,而USE给出了DAN和transformer两种计算复杂度不同的encoder。DAN是Lite版的Encoder不考虑词序只是词向量求和作为输入,Transfromer是Large版的Encoder复杂度更高,通常效果也更好。不熟悉transformer的同学看这里无所不能的Embedding6 - 跨入Transformer时代~模型详解&代码实现

USE最终输出的文本向量,是transformer最后一层输出的每个token的向量加和,是一个512的embedding,可以直接从hub上下载预训练模型来使用

通用文本框架就说这么多,最后的最后来给两大神器打个广告

  • Connected Paper 找paper神器,图结构让你不费吹灰之力就能扒出前后五百年
  • Paper with code 新增Dataset功能一键定位Benchmark数据集,妈妈再也不用担心我找不到数据啦

Reference

  1. [FastSent|DVAE] Learning Distributed Representations of Sentences from Unlabelled Data (2016)
  2. [InferSent] Supervised Learning of Universal Sentence Representations from Natural Language Inference Data (2017)
  3. [GenSen] LEARNING GENERAL PURPOSE DISTRIBUTED SENTENCE REPRESENTATIONS VIA LARGE SCALE MULTITASK LEARNING (2018)
  4. [USE] Universal Sentence Encoder (Google 2018)
  5. [SentEval] An Evaluation Toolkit for Universal Sentence Representations
  6. [GLUE]A MULTI-TASK BENCHMARK AND ANALYSIS PLATFORM FOR NATURAL LANGUAGE UNDERSTAND- ING
  7. https://github.com/Maluuba/gensen
  8. https://ai.googleblog.com/2018/05/advances-in-semantic-textual-similarity.html
  9. https://tfhub.dev/google/universal-sentence-encoder/1
  10. https://zhuanlan.zhihu.com/p/50443871
  11. https://amitness.com/2020/06/universal-sentence-encoder/
posted @ 2021-02-24 08:46  风雨中的小七  阅读(772)  评论(0编辑  收藏  举报