通用句子向量漫谈

本文涉及的产品
文本翻译,文本翻译 100万字符
文档翻译,文档翻译 1千页
语种识别,语种识别 100万字符
简介: 句子向量漫谈 # 背景 ​ 近期业务需要使用文本上下文语义特征,而将文本进行编码和表征是NLP最核心的技术之一,于是调研了表征文本的相关技术,总结如下, 以飨后人。 ## 混沌未开 ​ 在word2vec诞生之前,NLP中并没有一个统一的方法去表示一段文本。

背景

​ 近期业务需要使用文本上下文语义特征,而将文本进行编码和表征是NLP最核心的技术之一,于是调研了表征文本的相关技术,总结如下, 以飨后人。

混沌未开

​ 在word2vec诞生之前,NLP中并没有一个统一的方法去表示一段文本。从one-hot表示一个词到用bag-of-words来表示一段文本,从k-shingles把一段文本切分成一些文字片段到汉语中用各种序列标注方法将文本按语义进行分割,从tf-idf中用频率的手段来表征词语的重要性到text-rank中借鉴了page-rank的方法来表征词语的权重,从基于SVD纯数学分解词文档矩阵的LSA,到pLSA中用概率手段来表征文档形成过程并将词文档矩阵的求解结果赋予概率含义,再到LDA中引入两个共轭分布从而完美引入先验,句子表征走过了漫长的黑暗时期。

一丝曙光

​ 2003年Bengio的经典论文《A Neural Probabilistic Language Model》打开了一丝曙光, 经网络语言模型(NNLM)的第一层参数当做词的分布式表征时,能够很好的获取词语之间的相似度,从而构造句子表征。自NNLM于2003年被提出后,后面又出现了很多类似和改进的工作,诸如LBL, C&W和RNNLM模型等等,这些方法主要从两个方面去优化NNLM的思想,其一是NNLM只用了左边的n-1个词,如何利用更多的上下文信息便成为了很重要的一个优化思路(如Mikolov等人提出的RNNLM);其二是NNLM的一个非常大的缺点是输出层计算量太大,如何减小计算量使得大规模语料上的训练变得可行,这也是工程应用上至关重要的优化方向(如Mnih和Hinton提出的LBL以及后续的一系列模型)。

​ 2013年, Tomas Mikolov 于论文《Efficient estimation of word representations in vector space》提出CBOW和Skip-gram模型,模型使用了Hierarchical Softmax或者Negative Sampling等优化方法, 并开源成为word2vec工具。其后又出现了考虑词共现的GloVe, 基于监督训练信号的fastText。至此为止,大多数NLP任务均为先预训练词向量,然后对词向量求均值获得句子表征 (通过监督信号使用TextCNN/RNN等也可以获得任务相关句子表征,本文只探讨通用句子表征)。

​ 除了简单的求平均之外, 在word2vec开源随后的第一年,即2014年,Mikolov在他和另一位作者合作的一篇论文《Distributed Representations of Sentences and Documents》中,提出了可以借鉴word2vec思想的两种结构:PV-DM和PV-DBOW,分别对应word2vec中的CBOW和Skip-gram。 2015年,多伦多大学的Kiros等人提出了一个很有意思的方法叫Skip-thoughts,同样也是借鉴了Skip-gram的思想。Skip-thoughts直接在句子间进行预测,也就是将Skip-gram中以词为基本单位,替换成了以句子为基本单位,具体做法就是选定一个窗口,遍历其中的句子,然后分别利用当前句子去预测和输出它的上一句和下一句。2018年,Google Brain在Skip-thoughts的基础上将这一思想做了进一步改进,把Skip-thoughts的生成任务改进成为了一个分类任务,具体说来就是把同一个上下文窗口中的句子对标记为正例,把不是出现在同一个上下文窗口中的句子对标记为负例。 此外,在ICLR 2017 上论文《A Simple but Tough-to-Beat Baseline for Sentence Embeddings》是一个很好句子表征算法,算法的大致描述如下:选择一个流行的词嵌入方法,通过词向量的线性的加权组合对一个句子进行编码,并且删除共有的部分(删除它们的第一个主成分上的投影)。

​ 除了Skip-thoughts和Quick-thoughts这两种不需要人工标记数据的模型之外,2017年Facebook提出的InferSent框架,先设计一个模型在斯坦福的SNLI数据集上训练,之后将训练好的模型当做特征提取器获得句子向量, 此外2018年ICLR论文《Learning General Purpose Distributed Sentence Representations via Large Scale Multi-task Learning》提出了利用四种不同的监督任务来联合学习句子的表征, Google 在 《Universal Sentence Encoder》利用Transformer和DAN提取通用句子表征。

​ 对中文而言, 腾讯于NAACL2018发表论文《Directional Skip-Gram: Explicitly Distinguishing Left and Right Context for Word Embeddings》对Skipgram增加词共现和方向信息(窗口中词在左边还是右边), 并发布号称最大的中文词向量。作为类比推理论文《Analogical Reasoning on Chinese Morphological and Semantic Relations》的副产品,学者们也发布了100+各种中文语料各种模型预训练的词向量。此外,也有蚂蚁的同学发表在AAAI2018的高分论文《cw2vec: Learning Chinese Word Embeddings with Stroke n-gram Information》,提出基于笔画的词向量训练方法见一笔一画之间的奥秘,针对此方法也有不同声音见是否需要一笔一画。 类似的, 香侬科技发表论文《Glyce: Glyph-vectors for Chinese Character Representations》提出在深度学习的框架下使用中文字形信息。 然而 针对此方法也有很多不同的声音。

​ 词向量,句子表征五花八门,是不是最新的就是最好的呢,如何选择呢,Facebook 在EMNLP2018 发表论文《Dynamic Meta-Embeddings for Improved Sentence Representations》允许NLP模型动态选择在给定环境中表现最佳的字嵌入算法 (其实这个算法并不能)。

巨人肩膀

ELMo

​ AllenNLP发表论文《Deep contextualized word representations》(NAACL2018 best paper)首次提出了ELMo,ELMo的基本框架便是2-stacked biLSTM + Residual的结构,不过和普通RNN结构的不同之处在于,ELMo借鉴了2016年Google Brain的Rafal Jozefowicz等人发表的一篇论文《Exploring the Limits of Language Modeling》,其主要改进在于输入层和输出层不再是word,而是变为了一个char-based CNN结构。ELMo并没有本质上的创新,连模型也基本是引用和拼接别人的工作。

ULMFit

​ ELMo同期,有另一个来自FastAI的非常惊艳的工作。在论文《Universal Language Model Fine-tuning for Text Classification》中,他们提出了ULMFit结构,基本的思路也是预训练完成后去具体任务上进行finetune。ULMFit主要可以分为三个阶段,分别是在大规模语料集上先预训练,然后再将预训练好的模型在具体任务的数据上重新利用语言模型来finetune一下(这是第一次finetune,叫做LM finetune),尔后再根据具体任务设计的一个模型上,将预训练好的模型当做这个任务模型的多层,再一次finetune。所使用的模型也非原始的LSTM而是AWD-LSTM。此方法来自Salseforce 论文《Regularizing and Optimizing LSTM Language Models》。

GPT1.0

​ OpenAI于2018年6月发布论文《Improving Language Understanding by Generative Pre-Training》,核心思想为: 1) 预训练阶段采用“单向语言模型”作为训练任务,把语言知识编码到Transformer里。2) 在第一阶段训练好的模型基础上,通过Finetuning来做具体的NLP任务。GPT 1.0本身效果就很好,因为不会PR,默默无闻。

gpt1.0.png

BERT

​ 获得NAACL2019 best paper的BERT模型不亚于NLP的明星, BERT站在无数巨人之上, 具有以下特点1)利用了真双向的Transformer2)改进了普通语言模型成为完形填空式的Mask-LM3)利用Next Sentence Prediction任务学习句子级别信息4)进一步完善和扩展了GPT中设计的通用任务框架。由于BERT模型过于庞大,针对BERT训练出现了若干优化方案 1) 谷歌的LAMB 优化器将 BERT 预训练的批量大小扩展到 64K,且不会造成准确率损失。2 )阿里云的Perseus-BERT, 采用统一分布式通信框架、混合精度、XLA编译器优化等技术。

bert.png

GPT2.0

​ 号称能续写红楼梦后40回, OpenAI (CloseAI)发布的GPT2.0 模型。 本质上,GPT2.0做了两件事。首先把Transformer模型参数扩容,其次找更大数量的无监督训练数据。同BERT相比,最大的差异在于它是单向的。

屏幕快照 2019-04-24 上午2.29.07.png

MT_DNN

​ 微软的MT-DNN 通过整合BERT扩展了微软在 2015 年提出的多任务深度神经网络模型。MT-DNN 模型较低层在所有任务中共享,而顶层是针对任务特定的。首先,输入 X(一个句子或一对句子)在 l_1 层中被表示为嵌入向量序列,每个单词都对应一个嵌入向量序列。然后,基于变换器的编码器捕获每个单词的上下文信息,并在 l_2 层中生成共享的上下文嵌入向量。最后,额外的特定任务层针对每个任务生成特定任务表示,随后是分类、相似性评分或相关性排序所必需的操作。MT-DNN 使用 BERT 将其共享层初始化,然后通过 MTL 对其进行优化。一句话来说,MT_DNN就是多任务学习加BERT。

屏幕快照 2019-04-24 上午2.30.00.png

ERINE

​ 百度改进了BERT,提出ERNIE模型通过建模海量数据中的实体概念等先验语义知识,学习真实世界的语义关系。具体来说,ERNIE模型通过对词、实体等语义单元的掩码,使得模型学习完整概念的语义表示。相较于 BERT 学习原始语言信号,ERNIE直接对先验语义知识单元进行建模,增强了模型语义表示能力。ERINE实际效果(中文问答)也比BERT稍好。

屏幕快照 2019-04-24 上午2.29.33.png

其他

2018年至今NLP领域产出了非常多成果。 如谷歌针对超长上下文句子的Tranformer XL, 斯坦福和谷歌的新型自训练算法 Cross-View Training (CVT),结合了预训练词向量和自训练算法。Facebook提出跨语言预训练模型XLM, 其实就是跨语言的BERT。 此外,引入图像等跨模态数据也是增强句子表征的一个方向。论文《Image-Enhanced Multi-Level Sentence Representation Net for Natural Language Inference》通过将图像信息引入到自然语言推理中,利用额外补充的信息对句子语义进行增强,从而更加准确地理解句子语义。然而,此文章对图像的利用、图像的有效性分析等都值得改进。

小结

2018年以来NLP取得的诸多突破是站在巨人的肩膀依托海量的数据资源上取得的, MT_DNN 和ERINE是在BERT基础上的进一步改进。以上预训练模型标志NLP进入ImageNet时代,带来的优势如下:

  1. 近乎无限量的优质数据
  2. 无需人工标注,非监督/半监督
  3. 一次学习多次复用,多任务学习
  4. 学习到的表征可在多个任务中进行快速迁移,迁移学习

展望未来

机会与挑战并存

  1. OOV (字级别不存在OOV)及新词Embedding获取。现实NLP场景中很可能会由于词表不够大出现OOV或新词不在词表中,如何获取此类词的Embedding进而获取句子表征仍然是一个值得研究的问题,现有的方案多采用随机初始化或语义相近的字向量拼接加噪声等方式,也许可以通过挖掘词之间的关联结合GCN等方式。
  2. 很多词在不同的场景或不同的时间会有不同的含义,甚至相同的上下文下,相同的词在不同的时间都具有不同的含义,也会影响句子都表征,词表征的演化也是一个挑战,也许可以对句子加入时间编码。
  3. Finetune真的是万能的吗,从零开始训练句子表征也许也不错。 现实NLP问题,有监督的模型大多都比非监督模型效果好,那是否真的需要预训练呢? 从零开始训练是否就一定比Finetune差呢,在CV领域何恺明发表论文《Rethinking ImageNet Pre-training》质疑ImageNet 预训练, NLP又是怎么样呢?
  4. 句子表征缺乏常识信息,ERNIE在某些程度加入了额外的信息,如何更加显式的加入语义/句法等信息(BERT等模型隐式得到了语义语法信息)降低模型训练成本 (预训练和Finetune成本非常高)仍是严峻挑战。
  5. 新模型复杂模型并不定是最优的,某些简单的模型如GLoVe在一些特殊的任务中可以获得媲美于BERT的效果,no free lunch, 对不同的问题需要使用相应的句子表征,Meta-Embedding也许是解决之道。

未来方向

  1. 引入领域知识、语法句法知识、业务知识、常识,训练更好的句子表征。领域知识包含知识图谱等结构化数据,给定一个知识图谱和一个自然语言问题,如何将该问题转化为机器能够理解和执行的语义表示,受到了来自全世界研究者的广泛关注和深入探索。
  2. Meta-learning。对于低资源的语言或长尾问题,样本稀缺,Meta-learning作为解决Few-shot问题的方法之一已在CV领域取得了诸多进展,而在NLP领域仍存在广阔的空间。
  3. 图神经网络。图作为一个可推理,研究人员开始研究如何将卷积神经网络迁移到图数据上,涌现出ChevNet、MoNet、GCN、GAT等一系列方法,在基于图的半监督分类和图表示学习等任务中表现出很好的性能。句子本身是具有语法结构信息的,基于图神经网络的句子表征已经在一些特定的任务如事件抽取、关系抽取取得了不错的效果,是否有进一步的扩展空间值得研究。
  4. 多模态。婴儿在掌握语言功能前,首先通过视觉、听觉和触觉等感官去认识并了解外部世界。语言并不是人类在幼年时期与外界进行沟通的首要手段。因此,构建通用人工智能也应该充分地考虑自然语言和其他模态之间的互动,并从中进行学习,这就是多模态学习。
  5. 可解释性。词、句子表征一直都是大黑盒,虽然存在一些学者对向量维度进行可解释信性研究,然而如何平衡可解释和性能,如何将NLP模型预测结果解释给客户是一个方向。

P.S.

本文未覆盖任务相关句子表征训练,NLP方法太多,有所遗漏见谅

有用的github链接: https://github.com/Separius/awesome-sentence-embedding

中文词向量:https://github.com/Embedding/Chinese-Word-Vectors

BERT:https://github.com/google-research/bert/

ERINE: https://github.com/PaddlePaddle/LARK/tree/develop/ERNIE

MT_DNN: https://github.com/namisan/mt-dnn

感谢师兄: 王俞霖

感谢团队成员: 贾强槐、 杨起腾、张卫星、董良、高枫、

感谢各位老板: 华能威、王祥志

参考文献:

  1. https://zhuanlan.zhihu.com/p/50443871
  2. Rethinking ImageNet Pre-training
  3. Dynamic Meta-Embeddings for Improved Sentence Representations
  4. Improving Language Understanding by Generative Pre-Training
  5. Directional Skip-Gram: Explicitly Distinguishing Left and Right Context for Word Embeddings
  6. Analogical Reasoning on Chinese Morphological and Semantic Relations
  7. Image-Enhanced Multi-Level Sentence Representation Net for Natural Language Inference
  8. Efficient estimation of word representations in vector space
  9. A Neural Probabilistic Language Model
  10. Universal Sentence Encoder
  11. Universal Language Model Fine-tuning for Text Classification
相关文章
|
机器学习/深度学习 自然语言处理
论文赏析[ACL18]一个句子向量表示究竟可以塞进多少语言性质?
本文主要探究了不同encoder在不同任务上训练得到的句子向量表示,是否蕴含了各种语言性质。
157 0
论文赏析[ACL18]一个句子向量表示究竟可以塞进多少语言性质?
|
自然语言处理 算法 机器学习/深度学习
基于Doc2vec训练句子向量
目录 一.Doc2vec原理 二.代码实现 三.总结   一.Doc2vec原理 前文总结了Word2vec训练词向量的细节,讲解了一个词是如何通过word2vec模型训练出唯一的向量来表示的。
3578 0
|
7月前
|
Shell Android开发
Android系统 adb shell push/pull 禁止特定文件
Android系统 adb shell push/pull 禁止特定文件
613 1
|
7月前
|
Android开发 Python
Python封装ADB获取Android设备wifi地址的方法
Python封装ADB获取Android设备wifi地址的方法
169 0
|
开发工具 Android开发
Mac 安卓(Android) 配置adb路径
Mac 安卓(Android) 配置adb路径
889 0
|
4月前
|
Shell Linux 开发工具
"开发者的救星:揭秘如何用adb神器征服Android设备,开启高效调试之旅!"
【8月更文挑战第20天】Android Debug Bridge (adb) 是 Android 开发者必备工具,用于实现计算机与 Android 设备间通讯,执行调试及命令操作。adb 提供了丰富的命令行接口,覆盖从基础设备管理到复杂系统操作的需求。本文详细介绍 adb 的安装配置流程,并列举实用命令示例,包括设备连接管理、应用安装调试、文件系统访问等基础功能,以及端口转发、日志查看等高级技巧。此外,还提供了常见问题的故障排除指南,帮助开发者快速解决问题。掌握 adb 将极大提升 Android 开发效率,助力项目顺利推进。
124 0
|
7月前
|
Shell Android开发
ADB更改Android设备屏幕显示方向
ADB更改Android设备屏幕显示方向
385 5
|
7月前
|
Java Android开发
Android 对adb命令的拦截
Android 对adb命令的拦截
112 2
|
6月前
|
Shell 开发工具 Android开发
|
7月前
|
存储 安全 Shell
Android系统 adb shell auth授权使用
Android系统 adb shell auth授权使用
583 2