赞
踩
发现了一篇总结的比较好的文章如下,向博主致敬
http://blog.csdn.net/l18930738887/article/details/54177938
声明:
1)本参考了博客、文献及寒小阳深度学习的视频。本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。
2)本人才疏学浅,整理总结的时候难免出错,还望各位前辈不吝指正,谢谢。
文章结构:
一、什么是Word2vec?
二、历史的做法有哪些及一些简单的介绍?
三、最常用的Word2vec模型:NNLM的原理
四、Word2vec工具的使用
五、对word2vec(NNLM)思想的想法(只是个人观点)
正文:
一、什么是Word2vec?
像图像处理一样,我们如果想要让计算机处理文本信息,那么我们就需要把文本信息转换成数字符号。我们最简单的方法就是使用One-hot编码把一个个词变为一个向量的形式输入给计算机进行计算。比如:“我 爱 你”,在一个40W的词典中可以表示成这样:“我”[1 0 0 0 0 0 0 ...] “爱”[0 0 0 1 0 0 ...] "你"[0 1 0 0 0 0 0 ...] , 然后可以使用Hash表配合上算法已经很好地完成了 NLP 领域的各种主流任务。
但是如果使用这样的表示有几个重要的问题:
1)任意两个词之间都是孤立的。比如“爱”和“喜欢” 这2个次没有层级或“近义词”的意思。
2)词表维度随着语料库增长膨胀。
3)数据稀疏问题。
为了避免以上问题,Deep Learning 中一般用到的词向量并不是刚才提到的用 One-hot Representation 表示的那种很长很长的词向量,而是用 Distributed Representation表示的一种低维实数向量。这种向量一般长成这个样子:[0.792, −0.177, −0.107, 0.109, −0.542, …]。维度以 50 维和 100 维比较常见。如此一来我们就可以计算每个词的相似度。(个人认为每个维度就像是主题模型中系数类似)
回答:
Word2vec就是文字翻译成机器语言的一串向量,只不过它可能有好几种不同的表达方式。
二、历史的做法有哪些及一些简单的介绍?
a) LSA矩阵分解模型
采用线性代数中的奇异值分解方法,选取前几个比较大的奇异值所对应的特征向量将原矩阵映射到低维空间中,从而达到词矢量的目的。
具体方法步骤:
1、构建同现矩阵2、矩阵分解3、提取前N维信息。
同现矩阵如图所示:
图1-1:构建同现矩阵
图1-2:SVD分解及选择前2维特征。
从结果中我们会发现:
i 到 like 和enjoy的距离应该是差不多。如果样本量增大的情况下,理论上like应该与enjoy的距离会越变越小。
SVD最大的问题是计算复杂度是O(n^3),所以有了PLSA。
b) PLSA 潜在语义分析概率模型
从概率学的角度重新审视了矩阵分解模型,并得到一个从统计,概率角度上推导出来的和LSA相当的词矢量模型。
c) LDA 文档生成模型
按照文档生成的过程,使用贝叶斯估计统计学方法,将文档用多个主题来表示。LDA不只解决了同义词的问题,还解决了一次多义的问题。目前训练LDA模型的方法有原始论文中的基于EM和 差分贝叶斯方法以及后来出现的Gibbs Samplings 采样算法。(LDA是另一个较大的话题,请听下回分解)
d) Word2Vector 模型
2013年火起来的算法,通过神经网络机器学习算法来训练N-gram 语言模型,并在训练过程中求出word所对应的vector的方法。本文将详细阐述此方法的原理。
三、最常用的Word2vec模型:NNLM的原理
NNLM(Neural Network Language model) 神经网络语言模型
a)我们来上一张最最最重要的图NNLM的结构
图1-3:NNLM的结构图
W为输入的变量,C就是训练的词向量,output就是预测文字。注意:我们最终是希望获得C矩阵!
为了简单起见,我们假设有这样一句话“我 爱 北京 天安门”。(假设词典就4个词)输入为one-hot编码 假设为:
“我”[1 0 0 0]
“爱”[0 1 0 0]
“北京”[0 0 1 0]
“天安门”[0 0 0 1]
输入为:我 爱 北京
输出为:天安门
每个词的词向量为:10维
其中输入与输出如图所示:(整体流程从下至上看)
图1-4:NNLM的运行
其实上面就是一个神经网络的迭代过程,最终通过降低损失函数获得最佳的C~
b) 模型的优化
但是上面的算法计算量还是比较大的,如图所示:
图1-5:NNLM的网络复杂度
N是输入的词数量,D是每个词的词向量维度,H隐层单元,V是需要预测词的总量。
它所对应的时间复杂度为N * D + N * D * H + N *D * V + H * V。其中D和H大约在100和500之间,N是3到8,而V则高达几百万数量级。因此该模型的瓶颈在后面两项。接下来我们要讨论的问题就是如何解决这个时间复杂度的问题。
其中最主要的2点改进为:softmax层的Huffman编码及结果集的负例采样问题。具体可以看参考文献,这边就直接上2张图:
图1-6:Huffman tree 改造softmax输出层
图1-7:负例采样的方法
根据上面的加速方法的改进,目前开源的结构如图所示:
图1-8:CBOW模型
图1-9:Skip-Gram模型
CBOW模型是用N个词推出1个词,Skip-Gram模型是1个词推出N个的模型
加速方法总结
1、删除隐藏层
2、使用Hierarchical softmax 或negative sampling
3、去除小于minCount的词
4、根据一下公式算出每个词被选出的概率,如果选出来则不予更新。此方法可以节省时间而且可以提高非频繁词的准确度。
其中t为设定好的阈值,f(w) 为w出现的频率。
5、选取邻近词的窗口大小不固定。有利于更加偏重于离自己近的词进行更新。
6、 多线程,无需考虑互斥。
c)NNLM的缺点:
1、一词多义的问题没办法解决,因为一个词用的是同一个词向量。比如苹果,可能是吃的苹果也可能是手机。(个人保留这个观点,我认为词向量应该是类似主题模型能够完成一词多义的训练,但目前无法验证。)
2、因为是local context window 单独训练,没有利用包含在global co-currence矩阵中的统计信息。
四、word2vec工具的使用:
word2vec工具使用代码 https://www.zybuluo.com/hanxiaoyang/note/472184 。 spark上面也有word2vec,算法使用的是Skip-gram模型。等空了也可以调用那个试试。
使用的是中文维基百科,模型结果:
(男人第五个相近的词是谎言。。。)
五、对word2vec(NNLM)思想的想法(只是个人观点):
在写本文的时候看了一些资料背景,最早我们使用SVD、PCA这样的思想去获取一个词的词向量,其实就像是提取一个词的主成分一样。只不过用传统的方法计算量大,且较难并行优化,所以就使用了神经网络。那为什么神经网络也能完成这个工作呢?因为神经网络也可以做主成分(曾经看过一篇论文,但已经忘了名字了),而NNLM中的C矩阵其实就是对应的主成分分析。这样巧妙的设计让我们能够更深刻的理解神经网络。(此处不是深度学习)
参考文献:
王琳 word2vec原理介绍 http://blog.sina.com.cn/s/blog_4bec92980102v7zc.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。