https://www.douban.com/note/323504583
Google目前开源了一款深度学习工具word2vec,该工具有很多有意思的特性。
顾名思义,word2vec就是将词语转换为向量,通过转换为向量,复杂的自然语言处理就可以转换为简单的向量代数运算。
word2vec技术基于神经网络模型,可以简单地将神经网络模型分为三层,分别为输入层、隐含层和输出层。
神经网络模型经历了很长时期的发展,以03年为分界点,03年Bengio等人提出了著名的NNLM模型(http://machinelearning.wustl.edu/mlpapers/paper_files/BengioDVJ03.pdf),算是总结了前面的研究工作,因此,03年之前的关于神经网络在自然语言处理中的研究论文拿来翻翻就可以了,不用细看。03年之后神经网络模型有了较大的改进和发展,发展出的技术千奇百怪,但是,总的而言,所有的改进和提高都紧紧围绕神经网络三层结构,分别在各层进行改进。
在输入层,有RNNLM模型,改进的思想是缓存上一次计算完毕之后的状态,这样计算当前词时就不需要重新计算已经输入的词,节省了计算量。具体可参考文献:http://www.fit.vutbr.cz/research/groups/speech/servite/2010/rnnlm_mikolov.pdf
在隐含层,有CBOW技术和Skip-gram技术。这也是神经网络模型核心架构方面的改进。CBOW技术很好理解,就是利用上下文预测当前词出现的概率;Skip-gram技术比较难理解,顾名思义,Skip-gram就是允许某些词被“跳过”,而不像CBOW那样按照顺序来。被跳过的结果就是语料更加丰富了,因为允许跳过的组合更多,变相增加了语料。有关Skip-gram技术可参考文献:http://www.cs.brandeis.edu/~marc/misc/proceedings/lrec-2006/pdf/357_pdf.pdf
在输出层,或者可以理解为在训练算法方面,有分层softmax技术和负采样技术。分层softmax技术使用二叉树(例如哈夫曼树)将词典里的词编码,这样使得访问每一个词语的平均步长缩短,大大加快了训练速度,分层softmax技术可以参考文献:http://arxiv.org/abs/1310.4546;负采样技术原理同NCE,NCE的原理本质是使用已知的概率密度函数估计未知的概率密度函数,设未知的概率密度函数位x,已知的为y,如果求的了x和y的关系,y又已知,那么x也就不难求出来了,有关负采样技术可参考:
http://dl.acm.org/citation.cfm?id=2188396
最后一点,在神经网络模型中,如”the”、”a”等频繁词会降低训练的速度以及损害训练结果准确性,为了解决这个问题,引入了欠采样技术,技术原理很简单,就是以某个随机的概率舍弃词典中的词,越频繁的词被舍弃的概率越大,因此,在不改变词频排列顺序的前提下,大大减小了频繁词与非频繁词的比例,从而突出了非频繁词,训练结果更加准确,训练的速度也更快。欠采样技术请参考文献: http://arxiv.org/abs/1310.4546
word2vec工具是上述技术的合集,分别学习了解上述技术就能够很好地理解word2vec工具的原理,word2vec工具有很多有趣的、不可思议的地方,读者慢慢发掘吧。
https://blog.csdn.net/wangyueban/article/details/84934101
2013年,Google开源了一款用于词向量计算的工具——word2vec,引起了工业界和学术界的关注。首先,word2vec可以在百万数量级的词典和上亿的数据集上进行高效地训练;其次,该工具得到的训练结果——词向量(word embedding),可以很好地度量词与词之间的相似性。随着深度学习(Deep Learning)在自然语言处理中应用的普及,很多人误以为word2vec是一种深度学习算法。其实word2vec算法的背后是一个浅层神经网络。
#词向量的基础
##one-hot 表示
在很早之前就有用词向量表示词,但是词向量较为冗长,词向量的维度是整个词表大小,只有词对应的位置为一,其余都是0。词向量的维度过大,且构成的矩阵极其稀疏,并且one-hot表示会丢掉词于此之间的关系。
Dristributed representation可以解决One hot representation的问题,它的思路是通过训练,将每个词都映射到一个较短的词向量上来。所有的这些词向量就构成了向量空间,进而可以用普通的统计学的方法来研究词与词之间的关系。这个较短的词向量维度是多大呢?这个一般需要我们在训练时自己来指定。如下图所示,将“red mini van”这个单词映射到3维向量上,实际是对向量进行了降维处理。
因为使用disturbuted representation表示词向量,所以可以看出词于词之间的关系,有了向量就可以进行向量表示,
(KING)-(MAN)+(WOMAN)=(QUEE)
NNLM
鉴于Ngram等模型的不足,2003年,Bengio等人发表了一篇开创性的文章:A neural probabilistic language model[3]。在这篇文章里,他们总结出了一套用神经网络建立统计语言模型的框架(Neural Network Language Model,以下简称NNLM),并首次提出了word embedding的概念(虽然没有叫这个名字),从而奠定了包括word2vec在内后续研究word representation learning的基础。
nnlm模型输入,投影层,隐藏层和输出层:
输入层是有n个1-V编码的单词,v是词表的维度。将输入层首先进行映射,使用一个共享映射矩阵C,C是一个ND维的矩阵,D是映射层的维度,D是远远小于词表的维度的。
经过映射层后,nnlm有一个拥有一个隐藏层,通过tanh的激活函数,将权重矩阵和映射层相乘,通过softmax输出V维的中每个词的概率向量。我们可以通过最小化cross-entropy的损失函数最小化,从而来调整权重函数。
最后通过BP反向传播,求得的矩阵C(ND维的矩阵)和权重矩阵W,而C就是所谓的词向量!
为了降低nnlm的计算复杂度,也就是模型中的HxV,我们可以使用hierarchical softmax,将计算复杂度降低到log(V)。但是主要的复杂性实际是由于NDV造成的。NNLM模型在计算NDV上遇到了瓶颈,所以google在2013年,推出了无隐藏层的新模型,CBOW和skip-gram。
#Word2vec之CBOW
CBOW是从,上下context中预测中间值的一个过程,移除前向反馈神经网络中非线性的hidden layer,直接将中间层的embedding layer与输出层的softmax layer连接。
projection层实际词向量相加构成了一个词袋向量,从而比之nnlm模型的投影层更加的简单,降低了计算复杂性。
投影层到输出层是将词袋模型乘以一个embedding矩阵,从而得到一个连续的embedding向量。
#Word2vec的两个trick
因此,Skip-gram模型的本质是计算输入word的input vector与目标word的output vector之间的余弦相似度,并进行softmax归一化。我们要学习的模型参数正是这两类词向量。
然而,直接对词典里的v个词计算相似度并归一化,显然是一件极其耗时的impossible mission。为此,Mikolov引入了两种优化算法:层次Softmax(Hierarchical Softmax)和负采样(Negative Sampling)。
https://blog.csdn.net/lilong117194/article/details/82018008
论文
https://zhuanlan.zhihu.com/p/141270379?from_voters_page=true/
1.概览
在自然语言处理任务中,首先要将词语表示成向量的形式,这样计算机才能读懂文本。词向量(Word Vector)或称为词嵌入(Word Embedding)做的事情就是将词表中的词语映射为实数向量,这些向量能够体现词语之间的语义关系。
构建词向量的方式大体上分为以下几种方法:
one-hot模型:一种直观的方式是使用one-hot表示向量。以字典建立向量,词所处的位置用1表示,其余为0。
基于共现矩阵模型:考虑词与词之前的共现问题,定义一些显性隐性的关系,从而构建词向量。例如SVD,PCA等等。
语言模型:通过构建语言模型来实现对词向量的学习,如n-gram、NNLM、word2vec等。这也是目前最为广泛使用的构建词向量方法。
词向量在自然语言处理中有着重要的角色,它将抽象的词语之间的语义关系量化成向量形式。有了良好的词向量,我们可以使用机器学习、深度学习的模型完成更多的工作。
2.one-hot模型
one-hot是最简单的词向量表达方式。假设词表中共有n个词,将所有单词排序后,每个单词都会有一个位置信息,则对于单词[公式],可以使用n维向量来表示,其中向量的第i分量的值为1,其余值为0,向量记为[0,0,…,1,…,0,0]。
one-hot向量比较简单,易于理解。但是,问题在于:
词表的数量级通常在10^6级别,导致向量的维度非常高,不利于计算维护,同时向量的编码太稀疏,造成空间浪费。
这种编码无法体现单词之间的语义关系。任意两个单词在one-hot编码下的距离都是一样的。所以,我们无法从one-hot编码得知两个单词是否相关。
因此,一般情况下,one-hot向量很少被使用。
3.基于共现矩阵模型
通过考虑词和词的共现问题,可以反应词之间的语义关系。最简单的方法是使用基于文档的方式来表示词向量,其基本思想是如果两个词经常共同出现在多篇文档中,则说明这两个词在语义上紧密关联。基于文档的词向量可以反应出相关词的语义关系,但是随着文档规模的增大,向量的维度也相应增加,存在维度变化问题。
可以通过统计一个事先指定大小的窗口内单词的共现次数,来解决维度变化问题。这种方法以单词周边的共现词的次数做为当前的词向量。 比如,有以下四句话:
我\喜欢\摄影
我\爱\运动
我\爱\学习
我\喜欢\画画
假设考虑的窗口大小为1,也就是说一个词只与它前面及后面的词相关,比如"我 爱"共现次数为2,则共现矩阵如下所示:
这样,共现矩阵的行(或列)可表示为对应的词向量。如"我"的词向量为[0,2,2,0,0,0,0]。 同时可以知道"爱","喜欢"的词向量相似度较高,他们具有相近的意思。
上述矩阵是一个nxn的对称矩阵X,矩阵维数随着词典数量n的增大而增大,可以使用奇异值分解SVD、PCA将矩阵维度降低。但是仍存在问题:
矩阵X的维度经常改变
由于大部分词并不共现而导致的稀疏性
矩阵维度过高带来的高计算复杂度