【深度学习】word2vec 中的数学原理详解

 

 https://www.cnblogs.com/peghoty/p/3857839.html

推荐度max,word2vec 中的数学原理详解。

 

https://cloud.tencent.com/developer/article/1010918

Tensorflow实现word2vec

 

 https://www.cnblogs.com/pinard/p/7278324.html

 gensim 有个word2vec API,你可以直接用人家的word2vec。(pip install jieba & gensim. 已经实战过了gensim_word2vector)

 

  word2vec是2013年Google开源的一个word embedding工具。word2vec工具主要包含两个模型:跳字模型(skip-gram)和连续词袋模型(continuous bag of words,简称CBOW),以及两种高效训练的方法:负采样(negative sampling)和层序softmax(hierarchical softmax)。

 

CBOW输出层对应的一棵二叉树。Huffman树。叶子节点N个,对应词典的N个词语,非叶子节点N-1个

Hierarchical softmax 是提高性能的一项关键技术。要了解一下huffman树编码,根据词频,高频的一般会短。上文中例子,“足球”编码是1001。(图11)

从根节点出发到叶子节点,经历4次二分类。约定左边是负类,右边是正类。

即然是一个二分类问题,通过逻辑回归,

 

 

 

然后你就可以推似然函数(4.4)

如何优化,如何最大化这个函数,用随机梯度上升法。

 

后来又提出了个negative sampling。不用huffman树啦,能大幅提高性能。随机负采样是NCE的一个简化版本。

 看看Hierarchical Softmax的的缺点。的确,使用霍夫曼树来代替传统的神经网络,可以提高模型训练的效率。但是如果我们的训练样本里的中心词𝑤是一个很生僻的词,那么就得在霍夫曼树中辛苦的向下走很久了。能不能不用搞这么复杂的一颗霍夫曼树,将模型变的更加简单呢?

通过负采样,我们得到了neg个负例(𝑐𝑜𝑛𝑡𝑒𝑥𝑡(𝑤),𝑤𝑖)𝑖=1,2,..𝑛𝑒𝑔。为了统一描述,我们将正例定义为𝑤0

 

 

 

和Hierarchical Softmax类似,我们采用随机梯度上升法,仅仅每次只用一个样本更新梯度,来进行迭代更新得到我们需要的𝑥𝑤𝑖,𝜃𝑤𝑖,𝑖=0,1,..𝑛𝑒𝑔

 

负样本那么多,怎么选择呢?用词频加权,高频词选为负样本的概率就比较大。

 

 

word2vector对高频词和低频词都做了一定的处理,

低频词:不会把语料小于min_count的词收录到词典里。

高频词:“的”“是”,这些词对应的词向量训练不会发生显著改变。用subsampling技巧,高频词按照一定概率被舍弃。公式(6.2)。

 

模型训练按照行的,语料文件每行存一个句子。太长(超过MAX SENTENCE LENGTH 默认100)会被截断。

 

 

源码里采用了自适应学习率。默认初始0.025,每处理完10000个词,会变小。小于10-4,就不会继续小了。

参数初始化问题,逻辑回归对应0初始化,词向量采用随机初始化。

 

 word2vec的代码实现和文章有一些出入。

每个单词有两个向量:

1.一个表示这个词作为中心词 (Focus Word)时的向量。syn0数组,负责某个词作为中心词时的向量。是随机初始化的。所以word2vec其实并没有用one-hot编码。

2.一个表示它作为另一个中心词的上下文(Context Word)时的向量。syn1neg数组,负责这个词作为上下文时的向量。是零初始化的。

 

 

网上一些简化版的直观理解:

 

首先Wordvec的目标是:将一个词表示成一个向量

假设语料库有10个词: 【今天,我,你,他,小明,玩,北京,去,和,好】

今天 我 和 小明 去 北京 玩

 

对于小明而言,选择他的前三个词和后三个词作为这个词的上下文。 将这6个向量作为输入,即

X = [1, 1, 0, 0, 0, 1, 1, 1, 1, 0]

输出层期望的数据实际就是小明这个词构成的向量(可以认为是训练数据的标签) 即

小明 :[0, 0, 0, 0, 1, 0, 0, 0, 0, 0]

 

 

 

 

这样最终的输出层的维度1*10 = (1*10) * (10*m) * (m*10) 

为了加快训练速度,可以一个批次一起训练,将多个句子的损失函数求和来训练

 

最终训练结束后,就要将一个词表示成一个向量,那么怎么表示呢?

输入X中第一个元素的值为1, 这表示的其实就是“今天” 这个词,那么“今天”就用它对应的连线上的权重参数来表示

 

今天 =  [w11, w12... w1m]

我   =  [w21, w22... w2m]

 

其实理解了CBOW模型后,要理解Skip-gram模型就非常简单了,CBOW模型是用词的前后几个词来预测这个词,而Skip-gram模型则是用一个词来预测他周围的词。

Skip-gram模型最终的结果是将小明表示成一个向量,而CBOW模型是将“小明”前后三个词表示成向量。

 

posted @ 2020-03-14 22:33  SENTIMENT_SONNE  阅读(342)  评论(0编辑  收藏  举报