首页 > 编程知识 正文

word2vec的作用,word2vec论文解析

时间:2023-05-04 14:01:58 阅读:23151 作者:3953

word2vec是谷歌2013年推出的NLP工具,以量化所有单词为特征,可以定量测量单词和单词之间的关系,挖掘单词之间的联系。 源代码是开源的,但谷歌的代码库在国内是无法访问的,因此本文的说明中word2vec的原理以Github上的word2vec代码为准。 本文关注word2vec的基础知识。

1 .用词向量的基础词向量表示词不是word2vec的第一个,而是很久以前出现的。 第一个单词向量是冗长的,单词向量的维度大小是词汇表整体的大小,对于各个具体词汇表中的单词,使用对应的位置为1。 例如,如果有由以下5个单词构成的词汇表,单词' Queen '的编号为2,则该单词向量为(0、1、0、0、0 ) )。 同样,词“Woman”的词向量是(0,0,0,1,0 )。 这种词向量的编码方式一般被称为1-of-N representation或one hot representation。

One hotrepresentation对于表示单词向量非常简单,但存在很多问题。 最大的问题是我们的词汇表一般都非常大。 例如,达到百万级,所有的词都由百万维向量表示,这是内存的灾难。 这样的向量其实除了一个位置都是0,表现效率不高,能缩小词向量的维度吗?

分布式预测可以解决One hotrepresentation的问题,考虑通过训练将各个词映射为短单词向量。 的这些词向量都构成向量空间,进而可以采用一般的统计学方法研究词与词的关系。 这个短语向量的维度是多少? 这一般需要在我们训练的时候自己指定。

例如,在下图中,词汇表中的词由四个维表示:“Royalty”、“Masculinity”、“Femininity”和“age”。 与xsdzc一词相对应的词的向量可能是(0.99,0.99,0.05,0.7 )。 当然,实际上,不能很好地解释单词向量的各个维度。

有了以“分布式re presentation”表示的短单词向量,就可以很容易地分析单词之间的关系。 例如,如果将某个词的维降低到二维,则在下图中的单词向量中表示该词,您将看到:

如果得到词汇表中所有词对应的词向量,你就会发现我们可以做很多有趣的事情。 但是,如何训练得到合适的词向量呢? 一种常见的方法是使用神经网络语言模型。

2. CBOW和Skip-Gram用于神经网络语言模型。 word2vec出现之前,利用神经网络DNN训练单词向量,处理单词和单词的关系。 的方法一般是三层神经网络结构,当然也可以是多层。 分为输入层、隐藏层、输出层(softmax层)。

该模型如何定义数据的输入和输出? 一般分为连续窗口和Skip-Gram两种模式。

CBOW模型的训练输入是与某个特征词的上下文相关联的词相对应的词向量,输出是该特定词的词向量。 例如,下面的语句假设我们上下文的大小为4,特定的这个词是“Learning”,即我们需要的输出词的向量。 上下文对应的词有8个,前后各4个,这8个词是我们模型的输入。 因为CBOW使用的是词袋模型,所以这八个词是平等的,也就是说,只要在我们的上下文中就可以,而不用考虑他们和我们关注的词之间的距离的大小。

这样在我们的CBOW例子中,我们的输入是8个词向量,输出是所有词的softmax概率。 (训练的目标是希望训练样本中特定词对应的softmax概率达到最大。 )相应的CBOW神经网络模型输入层有8个神经元,输出层有词汇表大小的神经元。 隐藏层的神经元数量可以自己指定。 通过DNN的反向传播算法,可以求出DNN模型的参数,同时获得与所有词对应的词向量。 这样,如果有新的需求,需要与某8个词相对应的最有可能的输出中心词,只要执行一次DNN前向传播算法,在softmax激活函数中找到与概率最高的词相对应的神经元即可。

Skip-Gram模型和CBOW的想法相反,输入是特定单词的词向量,输出是与特定单词对应的上下文词向量。 同样在上面的例子中,我们的上下文大小取4,特定的这个词“Learning”是我们的输入,这八个上下文词是我们的输出。

因此在我们的Skip-Gram示例中,我们的输入是特定的词,输出是softmax概率前8位词,相应的Skip-Gram神经网络模型的输入层有一个神经元,输出层有词汇表大小的神经隐藏层的神经元数量可以自己指定。 通过DNN的反向传播算法,可以求出DNN模型的参数,同时获得与所有词对应的词向量。 这样,在有新的需求,需要与某一个词相对应的最有可能的8个上下文词的情况下,只要能够用一次DNN前向传播算法得到与概率大小排在前8位的softmax概率相对应的神经元相对应的词即可。

以上是神经网络语言模型中使用CBOW和Skip-Gram训练模型和获取单词向量的大致过程。 但是这个和w

ord2vec中用CBOW与Skip-Gram来训练模型与得到词向量的过程有很多的不同。

    word2vec为什么 不用现成的DNN模型,要继续优化出新方法呢?最主要的问题是DNN模型的这个处理过程非常耗时。我们的词汇表一般在百万级别以上,这意味着我们DNN的输出层需要进行softmax计算各个词的输出概率的的计算量很大。有没有简化一点点的方法呢?

3. word2vec基础之zjdxb树

    word2vec也使用了CBOW与Skip-Gram来训练模型与得到词向量,但是并没有使用传统的DNN模型。最先优化使用的数据结构是用zjdxb树来代替隐藏层和输出层的神经元,zjdxb树的叶子节点起到输出层神经元的作用,叶子节点的个数即为词汇表的小大。 而内部节点则起到隐藏层神经元的作用。

    具体如何用zjdxb树来进行CBOW和Skip-Gram的训练我们在下一节讲,这里我们先复习下zjdxb树。

    zjdxb树的建立其实并不难,过程如下:

    输入:权值为的nn个节点

    输出:对应的zjdxb树

    1)将看做是有nn棵树的森林,每个树仅有一个节点。

    2)在森林中选择根节点权值最小的两棵树进行合并,得到一个新的树,这两颗树分布作为新树的左右子树。新树的根节点权重为左右子树的根节点权重之和。

    3) 将之前的根节点权值最小的两棵树从森林删除,并把新树加入森林。

    4)重复步骤2)和3)直到森林里只有一棵树为止。

    下面我们用一个具体的例子来说明zjdxb树建立的过程,我们有(a,b,c,d,e,f)共6个节点,节点的权值分布是(20,4,8,6,16,3)。

    首先是最小的b和f合并,得到的新树根节点权重是7.此时森林里5棵树,根节点权重分别是20,8,6,16,7。此时根节点权重最小的6,7合并,得到新子树,依次类推,最终得到下面的zjdxb树。

    那么zjdxb树有什么好处呢?一般得到zjdxb树后我们会对叶子节点进行zjdxb编码,由于权重高的叶子节点越靠近根节点,而权重低的叶子节点会远离根节点,这样我们的高权重节点编码值较短,而低权重值编码值较长。这保证的树的带权路径最短,也符合我们的信息论,即我们希望越常用的词拥有更短的编码。如何编码呢?一般对于一个zjdxb树的节点(根节点除外),可以约定左子树编码为0,右子树编码为1.如上图,则可以得到c的编码是00。

    在word2vec中,约定编码方式和上面的例子相反,即约定左子树编码为1,右子树编码为0,同时约定左子树的权重不小于右子树的权重。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。