word2vec中关于词向量的阐述
来源:互联网 发布:联合证券股票交易软件 编辑:程序博客网 时间:2024/05/16 08:06
0. 词向量是什么
自然语言理解的问题要转化为机器学习的问题,第一步肯定是要找一种方法把这些符号数学化。
NLP 中最直观,也是到目前为止最常用的词表示方法是 One-hotRepresentation,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为0,只有一个维度的值为 1,这个维度就代表了当前的词。
举个栗子,
“话筒”表示为 [0 0 0
“麦克”表示为 [0 0 0 0 0 0 0 0
每个词都是茫茫 0 海中的一个 1。
这种 One-hot Representation 如果采用稀疏方式存储,会是非常的简洁:也就是给每个词分配一个数字ID。比如刚才的例子中,话筒记为 3,麦克记为 8(假设从 0 开始记)。如果要编程实现的话,用 Hash表给每个词分配一个编号就可以了。这么简洁的表示方法配合上最大熵、SVM、CRF 等等算法已经很好地完成了 NLP领域的各种主流任务。
当然这种表示方法也存在一个重要的问题就是“词汇鸿沟”现象:任意两个词之间都是孤立的。光从这两个向量中看不出两个词是否有关系,哪怕是话筒和麦克这样的同义词也不能幸免于难。
Deep Learning 中一般用到的词向量并不是刚才提到的用 One-hot Representation表示的那种很长很长的词向量,而是用
(个人认为)Distributed representation最大的贡献就是让相关或者相似的词,在距离上更接近了。向量的距离可以用最传统的欧氏距离来衡量,也可以用 cos夹角来衡量。用这种方式表示的向量,“麦克”和“话筒”的距离会远远小于“麦克”和“天气”。可能理想情况下“麦克”和“话筒”的表示应该是完全一样的,但是由于有些人会把英文名“迈克”也写成“麦克”,导致“麦克”一词带上了一些人名的语义,因此不会和“话筒”完全一致。
1. 词向量的来历
Distributed representation 最早是 Hinton 在 1986 年的论文《Learningdistributed representations of concepts》中提出的。虽然这篇文章没有说要将词做Distributed representation,(甚至我很无厘头地猜想那篇文章是为了给他刚提出的 BP网络打广告,)但至少这种先进的思想在那个时候就在人们的心中埋下了火种,到 2000 年之后开始逐渐被人重视。
Distributed representation 用来表示词,通常被称为“Word Representation”或“WordEmbedding”,中文俗称“词向量”。真的只能叫“俗称”,算不上翻译。半年前我本想翻译的,但是硬是想不出 Embedding应该怎么翻译的,后来就这么叫习惯了-_-||| 如果有好的翻译欢迎提出。Embedding一词的意义可以参考维基百科的相应页面(链接)。后文提到的所有“词向量”都是指用Distributed Representation 表示的词向量。
如果用传统的稀疏表示法表示词,在解决某些任务的时候(比如构建语言模型)会造成维数灾难[Bengio2003]。使用低维的词向量就没这样的问题。同时从实践上看,高维的特征如果要套用 DeepLearning,其复杂度几乎是难以接受的,因此低维的词向量在这里也饱受追捧。
同时如上一节提到的,相似词的词向量距离相近,这就让基于词向量设计的一些模型自带平滑功能,让模型看起来非常的漂亮。
2. 词向量的训练
要介绍词向量是怎么训练得到的,就不得不提到语言模型。到目前为止我了解到的所有训练方法都是在训练语言模型的同时,顺便得到词向量的。
这也比较容易理解,要从一段无标注的自然文本中学习出一些东西,无非就是统计出词频、词的共现、词的搭配之类的信息。而要从自然文本中统计并建立一个语言模型,无疑是要求最为精确的一个任务(也不排除以后有人创造出更好更有用的方法)。既然构建语言模型这一任务要求这么高,其中必然也需要对语言进行更精细的统计和分析,同时也会需要更好的模型,更大的数据来支撑。目前最好的词向量都来自于此,也就不难理解了。
这里介绍的工作均为从大量未标注的普通文本数据中无监督地学习出词向量(语言模型本来就是基于这个想法而来的),可以猜测,如果用上了有标注的语料,训练词向量的方法肯定会更多。不过视目前的语料规模,还是使用未标注语料的方法靠谱一些。
词向量的训练最经典的有 3 个工作,C&W 2008、M&H 2008、Mikolov2010。当然在说这些工作之前,不得不介绍一下这一系列中 Bengio 的经典之作。
2.0 语言模型简介
插段广告,简单介绍一下语言模型,知道的可以无视这节。
语言模型其实就是看一句话是不是正常人说出来的。这玩意很有用,比如机器翻译、语音识别得到若干候选之后,可以利用语言模型挑一个尽量靠谱的结果。在NLP 的其它任务里也都能用到。
语言模型形式化的描述就是给定一个字符串,看它是自然语言的概率
常用的语言模型都是在近似地求
顺便提一句,由于后面要介绍的每篇论文使用的符号差异太大,本博文里尝试统一使用 Bengio 2003的符号系统(略做简化),以便在各方法之间做对比和分析。
2.1 Bengio 的经典之作
用神经网络训练语言模型的思想最早由百度 IDL 的徐伟于 2000 提出。(感谢
训练语言模型的最经典之作,要数 Bengio 等人在 2001 年发表在 NIPS 上的文章《A NeuralProbabilistic Language Model》。当然现在看的话,肯定是要看他在 2003 年投到 JMLR上的同名论文了。
Bengio 用了一个三层的神经网络来构建语言模型,同样也是 n-gram 模型。如图1。
图1(点击查看大图)
图中最下方的
网络的第一层(输入层)是将
网络的第二层(隐藏层)就如同普通的神经网络,直接使用
网络的第三层(输出层)一共有
式子中的
式子中还有一个矩阵
现在万事俱备,用随机梯度下降法把这个模型优化出来就可以了。需要注意的是,一般神经网络的输入层只是一个输入值,而在这里,输入层
这样得到的语言模型自带平滑,无需传统 n-gram 模型中那些复杂的平滑算法。Bengio 在 APNews数据集上做的对比实验也表明他的模型效果比精心设计平滑算法的普通 n-gram 算法要好 10% 到 20%。
在结束介绍 Bengio 大牛的经典作品之前再插一段八卦。在其 JMLR论文中的未来工作一段,他提了一个能量函数,把输入向量和输出向量统一考虑,并以最小化能量函数为目标进行优化。后来 M&H工作就是以此为基础展开的。
他提到一词多义有待解决,9 年之后 Huang 提出了一种解决方案。他还在论文中随口(不是在 Future Work中写的)提到:可以使用一些方法降低参数个数,比如用循环神经网络。后来 Mikolov就顺着这个方向发表了一大堆论文,直到博士毕业。
大牛就是大牛。
- word2vec中关于词向量的阐述
- word2vec中关于词向量的阐述
- word2vec中关于词向量的阐述
- 基于word2vec的中文词向量训练
- word2vec 过程理解&词向量的获取
- 使用预训练的word2vec词向量
- 使用预训练的word2vec词向量
- word2vec 词向量
- word2vec 词向量
- word2vec 词向量训练
- word2vec 构建中文词向量
- word2vec 构建中文词向量
- Java中关于getInstance方法的阐述
- 秒懂词向量Word2vec的本质
- 秒懂词向量Word2vec的本质
- 词向量之word2vec(1)
- 词向量之word2vec(2)
- 词向量与word2vec分析
- 「深度神经网络」(deep&nbs…
- IntelliJ Idea编译报错:javacTask: 源发行版 1.7 需要目标发行版 1.7
- PCA的matlab程序
- 关于 activity 的四种模式 横竖屏 简介
- generative VS discrimi…
- word2vec中关于词向量的阐述
- java cpp py 实现 二分查找,如果没查找到,显示离代查找值最近的值
- weight decay (权值衰减)
- gcd lcm (最大公约数 最小公倍数)
- [转]Deep Learning(深度学…
- Sending SMS WAP Push messages using the ActiveXperts SMS and MMS Toolkit.
- (转)VirtualBox安装Mac OS 10.11——虚拟机安装黑苹果
- 神经网络来进行时间序列预测
- NET 阿里大于短信推送