在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时代~模型详解&代码实现

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

  • 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://www.google.com/search?client=firefox-b-d&q=InferSent
  9. https://www.google.com/search?client=firefox-b-d&q=Fastsent
  10. https://ai.googleblog.com/2018/05/advances-in-semantic-textual-similarity.html
  11. https://tfhub.dev/google/universal-sentence-encoder/1
  12. https://zhuanlan.zhihu.com/p/50443871
  13. https://amitness.com/2020/06/universal-sentence-encoder/

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

  1. 探索Linux通用SCSI驱动器

    通过 SCSI 命令管理计算机上的数据,并将数据传输到 SCSI 设备.在本文中,作者介绍了一些 SCSI 命令,以及在 Linux® 中使用 SCSI API 时执行 SCSI 命令的方法.他介绍了 ...

  2. 无所不能的embedding 3. word2vec->Doc2vec[PV-DM/PV-DBOW]

    这一节我们来聊聊不定长的文本向量,这里我们暂不考虑有监督模型,也就是任务相关的句子表征,只看通用文本向量,根据文本长短有叫sentence2vec, paragraph2vec也有叫doc2vec的. ...

  3. 无所不能的Embedding4 - Doc2vec第二弹[skip-thought & tf-Seq2Seq源码解析]

    前一章Doc2Vec里提到,其实Doc2Vec只是通过加入Doc_id捕捉了文本的主题信息,并没有真正考虑语序以及上下文语义,n-gram只能在局部解决这一问题,那么还有别的解决方案么?依旧是通用文本 ...

  4. 无所不能的Embedding5 - skip-thought的兄弟们[Trim/CNN-LSTM/quick-thought]

    这一章我们来聊聊skip-thought的三兄弟,它们在解决skip-thought遗留问题上做出了不同的尝试[Ref1-4], 以下paper可能没有给出最优的解决方案(对不同的NLP任务其实没有最 ...

  5. 重磅︱R+NLP:text2vec包——New 文本分析生态系统 No.1(一,简介)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 词向量的表示主流的有两种方式,一种当然是耳熟能 ...

  6. 用深度学习(CNN RNN Attention)解决大规模文本分类问题 - 综述和实践

    https://zhuanlan.zhihu.com/p/25928551 近来在同时做一个应用深度学习解决淘宝商品的类目预测问题的项目,恰好硕士毕业时论文题目便是文本分类问题,趁此机会总结下文本分类 ...

  7. 《Convolutional Neural Networks for Sentence Classification》 文本分类

    文本分类任务中可以利用CNN来提取句子中类似 n-gram 的关键信息. TextCNN的详细过程原理图见下: keras 代码: def convs_block(data, convs=[3, 3, ...

  8. 文本相似度分析(基于jieba和gensim)

    基础概念 本文在进行文本相似度分析过程分为以下几个部分进行, 文本分词 语料库制作 算法训练 结果预测 分析过程主要用两个包来实现jieba,gensim jieba:主要实现分词过程 gensim: ...

  9. [转] 用深度学习(CNN RNN Attention)解决大规模文本分类问题 - 综述和实践

    转自知乎上看到的一篇很棒的文章:用深度学习(CNN RNN Attention)解决大规模文本分类问题 - 综述和实践 近来在同时做一个应用深度学习解决淘宝商品的类目预测问题的项目,恰好硕士毕业时论文 ...

随机推荐

  1. Microsoft Exchange远程代码执行漏洞(CVE-2020-16875)

    Microsoft Exchange远程代码执行漏洞(CVE-2020-16875) 漏洞信息: 由于对cmdlet参数的验证不正确,Microsoft Exchange服务器中存在一个远程执行代码漏 ...

  2. (12)Linux文件系统层次结构

    在 Linux 操作系统中,所有的文件和目录都被组织成以一个根节点"/"开始的倒置的树状结构 文件系统的最顶层是由根目录开始的,系统使用"/"来表示根目录,在根 ...

  3. Flink-v1.12官方网站翻译-P012-Stateful Stream Processing

    有状态的流处理 什么是状态? 虽然数据流中的许多操作一次只看一个单独的事件(例如事件解析器),但有些操作会记住多个事件的信息(例如窗口操作符).这些操作被称为有状态操作.一些有状态操作的例子. - 当 ...

  4. 提升NginxTLS/SSL HTTPS 性能的7条优化建议

    自2018年7月起,谷歌浏览器开始将" HTTP"网站标记为"不安全".在过去的几年中,互联网已经迅速过渡到HTTPS,Chrome浏览器的流量超过70%,并且 ...

  5. Codeforces Round #683 (Div. 2, by Meet IT) D. Catching Cheaters (DP)

    题意:给你两个字符串,每次取它们的子串C和D,然后求LCS,得到的贡献为\(4*LCS(C,D)-|C|-|D|\),求最大贡献. 题解:首先应该了解\(O(n^2)\)的LCS的dp写法,然后在此基 ...

  6. [Golang]-1 Slice与数组的区别

    目录 数组 1.创建数组: 2.数组是值拷贝传递: 切片(slice) 1.首先看看slice的源码结构: 2.slice的创建: 3.slice使用make创建 4.切片作为参数传递 5.Golan ...

  7. 如何自己绘制fcitx4输入法皮肤?

    先来给大家看看我自己修改后的结果 当然你可以自己设计,自己定义喜欢的颜色和样式 但是注意,这个教程仅仅针对使用fcitx皮肤面板的输入法,例如rime.sunpinyin等. 搜狗输入法.讯飞输入法. ...

  8. hdu2333-贪心,如何去后效性,背包太大怎么办,如何最大化最小值,从无序序列中发掘有序性质

    补充一下我理解的中文题意.. 你要重新组装电脑..电脑有一些部件..你的预算有b,b(1~1e9),有n个部件..每个部件有类型和名称以及价钱和质量现在你要在不超过预算b的情况下..每个类型都买一个部 ...

  9. 深入理解gradle中的task

    目录 简介 定义task tasks 集合类 Task 之间的依赖 定义task之间的顺序 给task一些描述 task的条件执行 task rule Finalizer tasks 总结 深入理解g ...

  10. TypeScript & Canvas 实现可视化白板

    TypeScript & Canvas 实现可视化白板 https://excalidraw.com/ https://github.com/excalidraw/excalidraw ref ...