无所不能的Embedding7 - 探索通用文本表达[FastSent/InferSent/GenSen/USE]
在4/5章我们讨论过用skip-thought,quick-thought任务来进行通用文本向量提取,当时就有一个疑问为什么用Bookcorpus这种连续文本,通过预测前一个和后一个句子的方式得到的文本向量,能在下游任务里取得比较好的效果呢?这一章我们来聊聊都有哪些SOTA通用文本框架,或许直接使用它们的场景已经不多,但你依旧能在各个前沿方法中看到它们的影子。我们会主要聊聊以下内容
- 通用性:为啥需要通用文本表达?通用具体指什么?如何评价?
- 为什么部分监督模型得到的文本表达不通用?
- 哪些模型结构和训练任务可以得到更通用的文本向量?
通用性
人类语言有有近乎无限的统计复杂度,但可以在低维度上得到很好的近似。对通用文本表达的探索,都是希望能找到更优的语言模型框架,去尽可能全面地从文本中提取信息。
NLP任务往往很难拿到大量标注样本,通用文本表达通过特征迁移把预训练模型得到的文本向量,作为下游任务的模型输入,帮助模型跳过从文本中提取信息的步骤,信息已经在文本向量中,模型只需要从向量中抽取用于当前任务的信息即可,这样可以大大降低对标注数据的需求,使很多缺乏样本的不可能任务成为可能。
以下paper多选择了特征迁移的方式,即把预训练模型得到的文本表达作为下游任务的输入来评价通用性。下游任务主要包括分类任务和文本语义相似度任务,其中分类任务有
评价文本向量在分类问题中的表现,一般会采用最简单的logistic classifier,输入是文本向量,输出是分类结果,这样最小化模型结构带来的影响,只去评价文本向量本身是否包含该分类问题所需的信息。
文本语义相似度任务(STS Benchmark)包括
评价文本相似度,一般直接计算文本向量的cosine距离,然后计算和标注label的pearson correlation。
针对以上任务也有一些文本评估的开源library可以直接用,例如SentEval,GLUE 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的主要区别有两个
- 多目标任务选择不同,USE虽然依旧是通用文本,但它选择的目标任务训练方式导致文本表达更加Semantically Meaningful,通常预训练模型就能在各类文本相似度任务中拿到非常好的结果。3个目标任务分别是Skip-thought类前后句子预测任务,Input-response对话任务,以及NLI推理任务。因此Semantic Similar的文本可能会有相似的上下文语境,相似的提问或回答,相似的推理内容,如下图所示
- 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
- [FastSent|DVAE] Learning Distributed Representations of Sentences from Unlabelled Data (2016)
- [InferSent] Supervised Learning of Universal Sentence Representations from Natural Language Inference Data (2017)
- [GenSen] LEARNING GENERAL PURPOSE DISTRIBUTED SENTENCE REPRESENTATIONS VIA LARGE SCALE MULTITASK LEARNING (2018)
- [USE] Universal Sentence Encoder (Google 2018)
- [SentEval] An Evaluation Toolkit for Universal Sentence Representations
- [GLUE]A MULTI-TASK BENCHMARK AND ANALYSIS PLATFORM FOR NATURAL LANGUAGE UNDERSTAND- ING
- https://github.com/Maluuba/gensen
- https://www.google.com/search?client=firefox-b-d&q=InferSent
- https://www.google.com/search?client=firefox-b-d&q=Fastsent
- https://ai.googleblog.com/2018/05/advances-in-semantic-textual-similarity.html
- https://tfhub.dev/google/universal-sentence-encoder/1
- https://zhuanlan.zhihu.com/p/50443871
- https://amitness.com/2020/06/universal-sentence-encoder/
无所不能的Embedding7 - 探索通用文本表达[FastSent/InferSent/GenSen/USE]的更多相关文章
- 探索Linux通用SCSI驱动器
通过 SCSI 命令管理计算机上的数据,并将数据传输到 SCSI 设备.在本文中,作者介绍了一些 SCSI 命令,以及在 Linux® 中使用 SCSI API 时执行 SCSI 命令的方法.他介绍了 ...
- 无所不能的embedding 3. word2vec->Doc2vec[PV-DM/PV-DBOW]
这一节我们来聊聊不定长的文本向量,这里我们暂不考虑有监督模型,也就是任务相关的句子表征,只看通用文本向量,根据文本长短有叫sentence2vec, paragraph2vec也有叫doc2vec的. ...
- 无所不能的Embedding4 - Doc2vec第二弹[skip-thought & tf-Seq2Seq源码解析]
前一章Doc2Vec里提到,其实Doc2Vec只是通过加入Doc_id捕捉了文本的主题信息,并没有真正考虑语序以及上下文语义,n-gram只能在局部解决这一问题,那么还有别的解决方案么?依旧是通用文本 ...
- 无所不能的Embedding5 - skip-thought的兄弟们[Trim/CNN-LSTM/quick-thought]
这一章我们来聊聊skip-thought的三兄弟,它们在解决skip-thought遗留问题上做出了不同的尝试[Ref1-4], 以下paper可能没有给出最优的解决方案(对不同的NLP任务其实没有最 ...
- 重磅︱R+NLP:text2vec包——New 文本分析生态系统 No.1(一,简介)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 词向量的表示主流的有两种方式,一种当然是耳熟能 ...
- 用深度学习(CNN RNN Attention)解决大规模文本分类问题 - 综述和实践
https://zhuanlan.zhihu.com/p/25928551 近来在同时做一个应用深度学习解决淘宝商品的类目预测问题的项目,恰好硕士毕业时论文题目便是文本分类问题,趁此机会总结下文本分类 ...
- 《Convolutional Neural Networks for Sentence Classification》 文本分类
文本分类任务中可以利用CNN来提取句子中类似 n-gram 的关键信息. TextCNN的详细过程原理图见下: keras 代码: def convs_block(data, convs=[3, 3, ...
- 文本相似度分析(基于jieba和gensim)
基础概念 本文在进行文本相似度分析过程分为以下几个部分进行, 文本分词 语料库制作 算法训练 结果预测 分析过程主要用两个包来实现jieba,gensim jieba:主要实现分词过程 gensim: ...
- [转] 用深度学习(CNN RNN Attention)解决大规模文本分类问题 - 综述和实践
转自知乎上看到的一篇很棒的文章:用深度学习(CNN RNN Attention)解决大规模文本分类问题 - 综述和实践 近来在同时做一个应用深度学习解决淘宝商品的类目预测问题的项目,恰好硕士毕业时论文 ...
随机推荐
- 将插件绑定在某个phase执行,推送镜像
文章目录 将插件绑定在某个phase执行 推送镜像 将插件绑定在某个phase执行 需求:在执行mvn clean package 时,插件自动为构建Docker镜像. 实现:将插件的的goal绑定在 ...
- 跟着Vimtutor学习Vim
跟着Vimtutor学习Vim Lesson 1 1.1 移动光标 在Vim中移动光标,分别使用h.j.k.l键代表左.下.上.右方向. 1.2 退出VIM :q! <ENTER> 退出V ...
- 小程序navigateTo和redirectTo跳转的区别与应用
最近在做小程序的跳转,发现navigateTo的跳转无法满足业务需求,所以特地记录下 业务需求 类似一个淘宝的在订单界面选择地址的功能,从A页面点击跳转到B页面的地址列表页面,B页面可以选择已有的地址 ...
- Java排序算法(一)冒泡排序
一.测试类SortTest import java.util.Arrays; public class SortTest { private static final int L = 20; pub ...
- 用Python修改本机适配器信息
主要参考来自[用Python干实事(一)自动修改Windows的IP.网关和DNS设置]. 使用_winreg模块来操作注册表实现相关信息的修改,它是python的内置模块.也可以通过Win32 Ex ...
- 【uva 753】A Plug for UNIX(图论--网络流最大流 Dinic)
题意:有N个插头,M个设备和K种转换器.要求插的设备尽量多,问最少剩几个不匹配的设备. 解法:给读入的各种插头编个号,源点到设备.设备通过转换器到插头.插头到汇点各自建一条容量为1的边.跑一次最大流就 ...
- Educational Codeforces Round 89 (Rated for Div. 2) A Shovels and Swords B、Shuffle
题目链接:A.Shovels and Swords 题意: 你需要一个木棍和两个钻石可以造出来一把剑 你需要两个木棍和一个钻石可以造出来一把铁锹 你现在有a个木棍,b个钻石,问你最多可以造出来几件东西 ...
- ZYB loves Xor I HDU - 5269 字典树
题意: T组样例,给你n个数.你要找出来这n个数中任意两个数的二进制位中 最低位不同 的位置(假设是k),然后让所有2^k加起来就是结果 什么意思? 例如4 和 2 4的二进制是(100),2的二 ...
- C- c常见问题分析
一.遇到undefined symbol怎么办: (1)首先解析未定义符号是什么:[利用c++filt命令] c++filt _ZN4Json5ValueixERKNSt7__cxx1112basic ...
- 创建AVL树,插入,删除,输出Kth Min
https://github.com/TouwaErioH/subjects/tree/master/C%2B%2B/PA2 没有考虑重复键,可以在结构体内加一个int times. 没有考虑删除不存 ...