Embedding7如何通过通用文本进行表达

发布时间:2021-12-27 15:19:03 作者:柒染
来源:亿速云 阅读:129

这篇文章给大家介绍Embedding7如何通过通用文本进行表达,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

下面我们来聊聊都有哪些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中提到的另外两种文本向量的生成方式:

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

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

Embedding7如何通过通用文本进行表达

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

Embedding7如何通过通用文本进行表达

这里并非其他向量没有学到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的模式,它对语法结构是否相同,是否包含相同或同义词没有非常一致的要求。

Embedding7如何通过通用文本进行表达

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

Embedding7如何通过通用文本进行表达

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

Embedding7如何通过通用文本进行表达

之后的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在下游任务的表现

Embedding7如何通过通用文本进行表达

最右侧的\(\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的文本可能会有相似的上下文语境,相似的提问或回答,相似的推理内容,如下图所示

Embedding7如何通过通用文本进行表达

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

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

关于Embedding7如何通过通用文本进行表达就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

推荐阅读:
  1. jQuery通过文本找到元素的方法
  2. 如何通过Java添加Word文本框

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:Python与数据库的交互怎么实现

下一篇:Swing中Look&Feel怎么用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》