word2vec 中的数学原理详解
- 格式:pdf
- 大小:13.37 MB
- 文档页数:40


继上次分享了经典统计语言模型,最近公众号中有很多做NLP朋友问到了关于word2vec的相关内容,本文就在这里整理一下做以分享。
本文分为概括word2vec相关工作模型结构Count-based方法 vs. Directly predict几部分,暂时没有加实验章节,但其实感觉word2vec一文中实验还是做了很多工作的,希望大家有空最好还是看一下~概括word2vec要解决的问题:在神经网络中学习将word映射成连续(高维)向量,其实就是个词语特征求取。
特点:1. 不同于之前的计算cooccurrence次数方法,减少计算量2. 高效3. 可以轻松将一个新句子/新词加入语料库主要思想:神经网络语言模型可以用两步进行训练:1. 简单模型求取word vector; 在求取特征向量时,预测每个词周围的词作为cost 2. 在word vector之上搭建N-gram NNLM,以输出词语的概率为输出进行训练。
相关工作在传统求取word的空间向量表征时,LSA将词和文档映射到潜在语义空间,从而去除了原始向量空间中的一些“噪音”,但它无法保存词与词之间的linear regularities;LDA是一个三层贝叶斯概率模型,包含词、主题和文档三层结构。
文档到主题服从Dirichlet分布,主题到词服从多项式分布,但是只要训练数据大了,计算量就一下飚了。
基于神经网络的词语向量表征方法在[Y. Bengio, R. Ducharme, P. Vincent. A neural probabilistic language model, JMLR 2003]中就有提出,名为NNLM,它是一个前向网络,同时学习词语表征和一个统计语言模型(后面具体讲)。
在Mikolov的硕士论文[1]和他在ICASSP 2009上发表的文章[2]中,用一个单隐层网络训练词语表征,然后将这个表征作为NNLM的输入进行训练。
Word2vec是训练词语表征工作的一个拓展。
word2vec和doc2vec词向量表⽰Word2Vec 词向量的稠密表达形式(⽆标签语料库训练)Word2vec中要到两个重要的模型,CBOW连续词袋模型和Skip-gram模型。
两个模型都包含三层:输⼊层,投影层,输出层。
1.Skip-Gram神经⽹络模型(跳过⼀些词)skip-gram模型的输⼊是⼀个单词wI,它的输出是wI的上下⽂wO,1,...,wO,C,上下⽂的窗⼝⼤⼩为C。
举个例⼦,这⾥有个句⼦“I drive my car to the store”。
我们如果把”car”作为训练输⼊数据,单词组{“I”, “drive”, “my”, “to”, “the”, “store”}就是输出。
所有这些单词,我们会进⾏one-hot编码2.连续词袋模型(Continuos Bag-of-words model)CBOW模型是在已知当前词w(t)的上下⽂w(t-2),w(t-1),w(t+1),w(t+2)的前提下预测当前词w(t)Hierarchical Softmax 实现加速。
3.传统的神经⽹络词向量语⾔模型DNN,⾥⾯⼀般有三层,输⼊层(词向量),隐藏层和输出层(softmax层:要计算词汇表中所有词softmax概率)。
⾥⾯最⼤的问题在于从隐藏层到输出的softmax层的计算量很⼤,因为要计算所有词的softmax概率,再去找概率最⼤的值。
word2vec也使⽤了CBOW与Skip-Gram来训练模型与得到词向量,但是并没有使⽤传统的DNN模型。
最先优化使⽤的数据结构是⽤霍夫曼树来代替隐藏层和输出层的神经元,霍夫曼树的叶⼦节点起到输出层神经元的作⽤,叶⼦节点的个数即为词汇表的⼩⼤。
⽽内部节点则起到隐藏层神经元的作⽤体如何⽤霍夫曼树来进⾏CBOW和Skip-Gram的训练我们在下⼀节讲,这⾥我们先复习下霍夫曼树。
霍夫曼树的建⽴其实并不难,过程如下:(节点权重可看作词频) 输⼊:权值为(w1,w2,...wn)的n个节点 输出:对应的霍夫曼树1)将(w1,w2,...wn)看做是有n棵树的森林,每个树仅有⼀个节点。
霍夫曼编码的原理2013年末,Google发布的word2vec引起了一帮人的热捧,各种兴奋。
时至今日,各地讨论的也不似如此频繁,也是时候写一下个人对它的理解,亦可避免被真正的有识之士鄙视。
在大量赞叹word2vec的微博或者短文中,几乎都认为它是深度学习在自然语言领域的一项了不起的应用,各种欢呼“深度学习在自然语言领域开始发力了”。
但实际上,简单看看代码就知道它实际上只是一个三层网络,压根算不上所谓的深层网络,学习过程也很简单,并未用太玄妙的东西,以至于在了解完整以后对它的简单叹为观止。
笔者其实也是门外汉,幸好周围有一些高人,几经指点,自认为大体了解,作此鄙文,记录一下。
首先,它的结构就是一个三层网络——输入层、隐层(也可称为映射层),输出层。
其次,代码中让人费解(没学过神经网络,是以费解)的主要是hierarchical softmax。
得同事J指导,和同事S讨论,终于弄明白其网络结果,如下图所示:word2vec层次softmax网络示意图输入层读入窗口内的词,将它们的向量(K维,初始随机)加和在一起,形成隐藏层K个节点。
输出层是一个巨大的二叉树,叶节点代表语料里所有的词(语料含有V个独立的词,则二叉树有|V|个叶节点)。
而这整颗二叉树构建的算法就是Huffman树。
这样,对于叶节点的每一个词,就会有一个全局唯一的编码,形如"010011"。
我们可以记左子树为1,右子树为0。
接下来,隐层的每一个节点都会跟二叉树的内节点有连边,于是对于二叉树的每一个内节点都会有K条连边,每条边上也会有权值。
这样,整体的结构就清晰了。
在训练阶段,当给定一个上下文,要预测后面的词(Wn)的时候(word2vec的CBOW和Skip-gram都不是预测后面的词,都是在中间的词上做文章,但是本文这么写并不影响理解),实际上我们知道要的是哪个词(Wn),而Wn是肯定存在于二叉树的叶子节点的,因此它必然有一个二进制编号,如"010011",那么接下来我们就从二叉树的根节点一个个地去便利,而这里的目标就是预测这个词的二进制编号的每一位!即对于给定的上下文,我们的目标是使得预测词的二进制编码概率最大。