没有合适的资源?快使用搜索试试~ 我知道了~
首页深度学习word2vec学习笔记pdf版.pdf
资源详情
资源评论
资源推荐

1
深度学习 word2vec 笔记之基础篇
by 北流浪子
博客地址:http://blog.csdn.net/mytestmy/article/details/26969149
基础篇:http://blog.csdn.net/mytestmy/article/details/26961315
一.前言
伴随着深度学习的大红大紫,只要是在自己的成果里打上 deep learning 字样,总会有
人去看。深度学习可以称为当今机器学习领域的当之无愧的巨星,也特别得到工业界的青睐。
在各种大举深度学习大旗的公司中,Google 公司无疑是旗举得最高的,口号喊得最响
亮的那一个。Google 正好也是互联网界璀璨巨星,与深度学习的联姻,就像影视巨星刘德
华和林志玲的结合那么光彩夺目。
巨星联姻产生的成果自然是天生的宠儿。2013 年末,Google 发布的 word2vec 工具引起
了一帮人的热捧,互联网界大量 google 公司的粉丝们兴奋了,从而 google 公司的股票开始
大涨,如今直逼苹果公司。
在大量赞叹 word2vec 的微博或者短文中,几乎都认为它是深度学习在自然语言领域的
一项了不起的应用,各种欢呼“深度学习在自然语言领域开始发力了”。
互联网界很多公司也开始跟进,使用 word2vec 产出了不少成果。身为一个互联网民工,
有必要对这种炙手可热的技术进行一定程度的理解。
好在 word2vec 也算是比较简单的,只是一个简单三层神经网络。在浏览了多位大牛的
博客,随笔和笔记后,整理成自己的博文,或者说抄出来自己的博文。
二.背景知识
2.1 词向量
自然语言处理(NLP)相关任务中,要将自然语言交给机器学习中的算法来处理,通常
需要首先将语言数学化,因为机器不是人,机器只认数学符号。向量是人把自然界的东西抽
象出来交给机器处理的东西,基本上可以说向量是人对机器输入的主要方式了。
词向量就是用来将语言中的词进行数学化的一种方式,顾名思义,词向量就是把一个词
表示成一个向量。
主要有两种表示方式,下面分别介绍,主要参考了@皮果提在知乎上的问答,也就是参
考文献【2】。

2
2.1.1 One-Hot Representation
一种最简单的词向量方式是 one-hot representation,就是用一个很长的向量来表示一个
词,向量的长度为词典的大小,向量的分量只有一个 1,其他全为 0, 1 的位置对应该词
在词典中的位置。举个例子,
“话筒”表示为 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ...]
“麦克”表示为 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ...]
每个词都是茫茫 0 海中的一个 1。
这种 One-hot Representation 如果采用稀疏方式存储,会是非常的简洁:也就是给每个
词分配一个数字 ID。比如刚才的例子中,话筒记为 3,麦克记为 8(假设从 0 开始记)。
如果要编程实现的话,用 Hash 表给每个词分配一个编号就可以了。这么简洁的表示方法配
合上最大熵、SVM、CRF 等等算法已经很好地完成了 NLP 领域的各种主流任务。
但这种词表示有两个缺点:(1)容易受维数灾难的困扰,尤其是将其用于 Deep Learning
的一些算法时;(2)不能很好地刻画词与词之间的相似性(术语好像叫做“词汇鸿沟”):任
意两个词之间都是孤立的。光从这两个向量中看不出两个词是否有关系,哪怕是话筒和麦克
这样的同义词也不能幸免于难。
所以会寻求发展,用另外的方式表示,就是下面这种。
2.1.2 Distributed Representation
另一种就是 Distributed Representation 这种表示,它最早是 Hinton 于 1986 年提出的,
可以克服 one-hot representation 的缺点。其基本想法是直接用一个普通的向量表示一个词,
这种向量一般长成这个样子:[0.792, −0.177, −0.107, 0.109, −0.542, ...],也就是普通的向量表
示形式。维度以 50 维和 100 维比较常见。
当然一个词怎么表示成这么样的一个向量是要经过一番训练的,训练方法较多 ,
word2vec 是其中一种,在后面会提到,这里先说它的意义。还要注意的是每个词在不同的
语料库和不同的训练方法下,得到的词向量可能是不一样的。
词向量一般维数不高,很少有人闲着没事训练的时候定义一个 10000 维以上的维数,所
以用起来维数灾难的机会现对于 one-hot representation 表示就大大减少了。
由于是用向量表示,而且用较好的训练算法得到的词向量的向量一般是有空间上的意义
的,也就是说,将所有这些向量放在一起形成一个词向量空间,而每一向量则为该空间中的
一个点,在这个空间上的词向量之间的距离度量也可以表示对应的两个词之间的“距离”。
所谓两个词之间的“距离”,就是这两个词之间的语法,语义之间的相似性。
一个比较爽的应用方法是,得到词向量后,假如对于某个词 A,想找出这个词最相似的
词,这个场景对人来说都不轻松,毕竟比较主观,但是对于建立好词向量后的情况,对计算
机来说,只要拿这个词的词向量跟其他词的词向量一一计算欧式距离或者 cos 距离,得到距
离最小的那个词,就是它最相似的。
这样的特性使得词向量很有意义,自然就会吸引比较多的人去研究,前有 Bengio 发表
在 JMLR 上的论文《A Neural Probabilistic Language Model》,又有 Hinton 的层次化 Log-Bilinear
模型,还有 google 的 Tomas Mikolov 团队搞的 word2vec,等等。
词向量在机器翻译领域的一个应用,就是 google 的 Tomas Mikolov 团队开发了一种词典
和术语表的自动生成技术,该技术通过向量空间,把一种语言转变成另一种语言,实验中对

3
英语和西班牙语间的翻译准确率高达 90%。
介绍算法工作原理的时候举了一个例子:考虑英语和西班牙语两种语言,通过训练分别
得到它们对应的词向量空间 E 和 S。从英语中取出五个词 one,two,three,four,five,
设其在 E 中对应的词向量分别为 v1,v2,v3,v4,v5,为方便作图,利用主成分分析(PCA)
降维,得到相应的二维向量 u1,u2,u3,u4,u5,在二维平面上将这五个点描出来,如下
图左图所示。类似地,在西班牙语中取出(与 one,two,three,four,five 对应的) uno,
dos,tres,cuatro,cinco,设其在 S 中对应的词向量分别为 s1,s2,s3,s4,s5,用 PCA 降
维后的二维向量分别为 t1,t2,t3,t4,t5,将它们在二维平面上描出来(可能还需作适当
的旋转),如下图右图所示:
观察左、右两幅图,容易发现:五个词在两个向量空间中的相对位置差不多,这说明两
种不同语言对应向量空间的结构之间具有相似性,从而进一步说明了在词向量空间中利用距
离刻画词之间相似性的合理性。
2.2 语言模型
2.2.1 基本概念
语言模型其实就是看一句话是不是正常人说出来的。这玩意很有用,比如机器翻译、语
音识别得到若干候选之后,可以利用语言模型挑一个尽量靠谱的结果。在 NLP 的其它任务
里也都能用到。
语言模型形式化的描述就是给定一个 T 个词的字符串 s,看它是自然语言的概率
P(w1,w2,…,wt)。w1 到 wT 依次表示这句话中的各个词。有个很简单的推论是:
(1)
上面那个概率表示的意义是:第一个词确定后,看后面的词在前面的词出现的情况下出
现的概率。如一句话“大家喜欢吃苹果”,总共四个词“大家”,“喜欢”,“吃”,“苹果”,怎
么分词现在不讨论,总之词已经分好,就这四个。那么这句话是一个自然语言的概率是:
P(大家,喜欢,吃,苹果)=p(大家)p(喜欢|大家)p(吃|大家,喜欢)p(苹果|大家,喜欢,吃)
p(大家)表示“大家”这个词在语料库里面出现的概率;
p(喜欢|大家)表示“喜欢”这个词出现在“大家”后面的概率;
p(吃|大家,喜欢)表示“吃”这个词出现在“大家喜欢”后面的概率;
p(苹果|大家,喜欢,吃)表示“苹果”这个词出现在“大家喜欢吃”后面的概率。
把这些概率连乘起来,得到的就是这句话平时出现的概率。

4
如果这个概率特别低,说明这句话不常出现,那么就不算是一句自然语言,因为在语料
库里面很少出现。如果出现的概率高,就说明是一句自然语言。
看到了上面的计算,看有多麻烦:只有四个词的一句话,需要计算的是 p(大家),p(喜
欢|大家),p(吃|大家,喜欢),p(苹果|大家,喜欢,吃)这四个概率,这四个概率还要预先计算好,
考虑词的数量,成千上万个,再考虑组合数,p(吃|大家,喜欢)这个有“大家”、“喜欢”和“吃”
的组合,总共会上亿种情况吧;再考虑 p(苹果|大家,喜欢,吃)这个概率,总共也会超过万亿
种。
从上面的情况看来,计算起来是非常麻烦的,一般都用偷懒的方式。
为了表示简单,上面的公式(1)用下面的方式表示
其中,如果 Contexti 是空的话,就是它自己 p(w),另外如“吃”的 Context 就是“大家”、
“喜欢”,其余的对号入座。
符号搞清楚了,就看怎么偷懒了。
2.2.2 N-gram 模型
接下来说怎么计算
,上面看的是跟据这句话前面的所有词来计算,那么
就得计算很多了,比如就得把语料库里面 p(苹果|大家,喜欢,吃)这种情况全部
统计一遍,那么为了计算这句话的概率,就上面那个例子,都得扫描四次语料库。这样一句
话有多少个词就得扫描多少趟,语料库一般都比较大,越大的语料库越能提供准确的判断。
这样的计算速度在真正使用的时候是万万不可接受的,线上扫描一篇文章是不是一推乱七八
糟的没有序列的文字都得扫描很久,这样的应用根本没人考虑。
最好的办法就是直接把所有的
提前算好了,那么根据排列组上面的来算,
对于一个只有四个词的语料库,总共就有 4!+3!+2!+1!个情况要计算,那就是 24 个情况要计
算;换成 1000 个词的语料库,就是
个情况需要统计,对于计算机来说,计算这些东
西简直是开玩笑。
这就诞生了很多偷懒的方法,N-gram 模型是其中之一了。N-gram 什么情况呢?上面的
context 都是这句话中这个词前面的所有词作为条件的概率,N-gram 就是只管这个词前面的
n-1 个词,加上它自己,总共 n 个词,计算
只考虑用这 n 个词来算,换成数
学的公式来表示,就是
这里如果 n 取得比较小的话,就比较省事了,当然也要看到 n 取得太小,会特别影响效
果的,有可能计算出来的那个概率很不准。怎么平衡这个效果和计算就是大牛们的事情了,
据大牛们的核算,n 取 2 效果都还凑合,n 取 3 就相当不错了,n 取 4 就顶不住了。看下面
的一些数据,假设词表中词的个数 |V| = 20,000 词,那么有下面的一些数据。

5
照图中的数据看去,取 n=3 是目前计算能力的上限了。在实践中用的最多的就是 bigram
和 trigram 了,而且效果也基本够了。
N-gram 模型也会有写问题,总结如下:
1、n 不能取太大,取大了语料库经常不足,所以基本是用降级的方法
2、无法建模出词之间的相似度,就是有两个词经常出现在同一个 context
后面,但是模型是没法体现这个相似性的。
3、有些 n 元组(n 个词的组合,跟顺序有关的)在语料库里面没有出现过,
对应出来的条件概率就是 0,这样一整句话的概率都是 0 了,这是不对的,
解决的方法主要是两种:平滑法(基本上是分子分母都加一个数)和回
退法(利用 n-1 的元组的概率去代替 n 元组的概率)
2.2.3N-pos 模型
当然学术是无止境的,有些大牛觉得这还不行,因为第 i 个词很多情况下是条件依赖于
它前面的词的语法功能的,所以又弄出来一个 n-pos 模型,n-pos 模型也是用来计算
的,但是有所改变,先对词按照词性(Part-of-Speech,POS)进行了分类,具体
的数学表达是
其中 c 是类别映射函数,功能是把 V 个词映射到 K 个类别(1=<K<=V)。这样搞的话,
原来的 V 个词本来有
种 n 元组减少到了
种。
其他的模型还很多,不一一介绍了。
2.2.4 模型的问题与目标
如果是原始的直接统计语料库的语言模型,那是没有参数的,所有的概率直接统计就得
到了。但现实往往会带一些参数,所有语言模型也能使用极大似然作为目标函数来建立模型。
下面就讨论这个。
假设语料库是一个由 T 个词组成的词序列 s(这里可以保留疑问的,因为从很多资料看
来是不管什么多少篇文档,也不管句子什么的,整个语料库就是一长串词连起来的,或许可
剩余30页未读,继续阅读















安全验证
文档复制为VIP权益,开通VIP直接复制

评论30