前沿 | 通用句子语义编码器,谷歌在语义文本相似性上的探索

作者:Yinfei Yang

机器之心编译

参与:Pedro、蒋思源

近年来,基于神经网络的自然语言理解研究取得了快速发展(尤其是学习语义文本表示),这些深度方法给人们带来了全新的应用,且还可以帮助提高各种小数据集自然语言任务的性能。本文讨论了两篇关于谷歌语义表示最新进展的论文,以及两种可在 TensorFlow Hub 上下载的新模型。

语义文本相似度

在「Learning Semantic Textual Similarity from Conversations」这篇论文中,我们引入一种新的方式来学习语义文本相似的句子表示。直观的说,如果句子的回答分布相似,则它们在语义上是相似的。例如,「你多大了?」以及「你的年龄是多少?」都是关于年龄的问题,可以通过类似的回答,例如「我 20 岁」来回答。相比之下,虽然「你好吗?」和「你多大了?」包含的单词几乎相同,但它们的含义却大相径庭,所以对应的回答也相去甚远。

论文地址:https://arxiv.org/abs/1804.07754

如果句子可以通过相同的答案来回答,那么句子在语义上是相似的。否则,它们在语义上是不同的。

这项工作中,我们希望通过给回答分类的方式学习语义相似性:给定一个对话输入,我们希望从一批随机选择的回复中分类得到正确的答案。但是,任务的最终目标是学习一个可以返回表示各种自然语言关系(包括相似性和相关性)的编码模型。我们提出了另一预测任务(此处是指 SNLI 蕴含数据集),并通过共享的编码层同时推进两项任务。利用这种方式,我们在 STSBenchmark 和 CQA task B 等相似度度量标准上取得了更好的表现,究其原因,是简单等价关系与逻辑蕴含之间存在巨大不同,后者为学习复杂语义表示提供了更多可供使用的信息。

对于给定的输入,分类可以认为是一种对所有可能候选答案的排序问题。

通用句子编码器

「Universal Sentence Encoder」这篇论文介绍了一种模型,它通过增加更多任务来扩展上述的多任务训练,并与一个类似 skip-thought 的模型联合训练,从而在给定文本片段下预测句子上下文。然而,我们不使用原 skip-thought 模型中的编码器 - 解码器架构,而是使用一种只有编码器的模型,并通过共享编码器来推进预测任务。利用这种方式,模型训练时间大大减少,同时还能保证各类迁移学习任务(包括情感和语义相似度分类)的性能。这种模型的目的是为尽可能多的应用(释义检测、相关性、聚类和自定义文本分类)提供一种通用的编码器。

论文地址:https://arxiv.org/abs/1803.11175

成对语义相似性比较,结果为 TensorFlow Hub 通用句子编码器模型的输出。

正如文中所说,通用句子编码器模型的一个变体使用了深度平均网络(DAN)编码器,而另一个变体使用了更加复杂的自注意力网络架构 Transformer。

「Universal Sentence Encoder」一文中提到的多任务训练。各类任务及结构通过共享的编码层/参数(灰色框)进行连接。

随着其体系结构的复杂化,Transformer 模型在各种情感和相似度分类任务上的表现都优于简单的 DAN 模型,且在处理短句子时只稍慢一些。然而,随着句子长度的增加,使用 Transformer 的计算时间明显增加,但是 DAN 模型的计算耗时却几乎保持不变。

新模型

除了上述的通用句子编码器模型之外,我们还在 TensorFlow Hub 上共享了两个新模型:大型通用句型编码器通和精简版通用句型编码器。

  • 大型:https://www.tensorflow.org/hub/modules/google/universal-sentence-encoder-large/1
  • 精简:https://www.tensorflow.org/hub/modules/google/universal-sentence-encoder-lite/1

这些都是预训练好的 Tensorflow 模型,给定长度不定的文本输入,返回一个语义编码。这些编码可用于语义相似性度量、相关性度量、分类或自然语言文本的聚类。

大型通用句型编码器模型是用我们介绍的第二篇文章中提到的 Transformer 编码器训练的。它针对需要高精度语义表示的场景,牺牲了速度和体积来获得最佳的性能。

精简版模型使用 Sentence Piece 词汇库而非单词进行训练,这使得模型大小显著减小。它针对内存和 CPU 等资源有限的场景(如小型设备或浏览器)。

我们很高兴与大家分享这项研究以及这些模型。这只是一个开始,并且仍然还有很多问题亟待解决,如将技术扩展到更多语言上(上述模型目前仅支持英语)。我们也希望进一步地开发这种技术,使其能够理解段落甚至整个文档。在实现这些目标的过程中,很有可能会产生出真正的「通用」编码器。

原文发布于微信公众号 - 机器之心(almosthuman2014)

原文发表时间:2018-05-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逍遥剑客的游戏开发

实现一个同步的RenderApplication

1394
来自专栏跟着阿笨一起玩NET

从sql server 中读取二进制图片

391
来自专栏田超学前端

【微信小程序】c# 实现获取openid、session_key 服务端

4900
来自专栏Golang语言社区

GO语言 TCP传输实例

package main import ( "net" "fmt" ) var ( maxRead = 1100 msgStop = []byt...

3396
来自专栏王磊的博客

Net连接mysql的公共Helper类MySqlHelper.cs带MySql.Data.dll下载

MySqlHelper.cs代码如下: using System; using System.Collections.Generic; using System...

4399
来自专栏技术之路

sqlserver 的事务和c#的事务

sql的事务 1 sql 2 create database model 3 go 4 use model 5 go 6 create table ...

1919
来自专栏跟着阿笨一起玩NET

treeview 绑定文件夹和文件

451
来自专栏xingoo, 一个梦想做发明家的程序员

【插件开发】—— 6 SWT 复杂控件使用以及布局

前文回顾: 1 插件学习篇 2 简单的建立插件工程以及模型文件分析 3 利用扩展点,开发透视图 4 SWT编程须知 5 SWT简单控件的使用与布局搭...

2349
来自专栏木宛城主

曾今的代码系列——自己的分页控件+存储过程实现分页

项目里面的测试代码,仅供参考 LoginByAjax <title>Ajax登陆</title> <script src="Scripts/c...

1855
来自专栏hbbliyong

socket 通信 多线程调用窗体(委托)的几个知识点,记录在案,以备查阅

1.socket 通信传输汉字的方法:Encoding.GetEncoding("GB2312").GetString(Receivebyte) 发送接收都这样...

2737

扫码关注云+社区