word2vec简要教程

来源:互联网 发布:ammo.js 编辑:程序博客网 时间:2024/06/08 02:37

一、 Word2Vec Tutorial

1.discrete representation(one-hot)的缺点

one-hot vector 不能够表示词之间的相似性,例子如下,motel和hotel是意思相近的两个词,可是两个词的one-hot vector却是正交的。



所以我们考虑使用一种维度较低并且有递推关系的向量来表示词,相似的词具有相似的向量。比如语料库有1W个词,如果用one-hot来表示,那么我们就用1w维的向量来表示它们,但是如果用了word2vec下面这种方法,我们只需要几百维就可以表示所有的词。
 



2.word2vec的简介

两种算法
1.Skip-grams (SG)
给定某个位置的单词,预测左右两边的词

2.Continuous Bag of Words (CBOW)
从该单词左右两边的词预测中间的词

两种训练的算法(为了加快训练速度)
1.Hierarchical softmax
2.Negative sampling

3. Skip-grams与Continuous Bag of Words (CBOW)

下面是Skip-grams 的演示图,CBOW应该也很容易想出来



$
Figure 1. Skip-grams 的演示图

4.以CBOW为例介绍Hierarchical softmax算法

接下来介绍一下Hierarchical softmax算法

  Hierarchical softmax就是以词表中的所有单词,例如维基百科中所有出现的词,以词频为权重来构建哈夫曼树,不懂哈夫曼树的可以百度或者看这篇文章。叶子节点就代表每一个词,而非叶子节点代表了一类词(有点抽象,后面会看到每个词在经过非叶子节点时都做了类似逻辑归回的分类,把词归类于左右子节点可以看做是归于不同类, 如下图中的9结点可以代表关于足球的一类词,14结点代表一种人的状态)。

  从根节点出发,到达指定叶子节点的路径是唯一的。Hierarchical Softmax正是利用这条路径来计算指定词的概率,而非用softmax来计算。



Figure 2. 哈弗曼树图 图片来源[1]

  图中的叶子节点假如有V个,那么非叶子节点肯定是|V|-1个。以足球为例,从根节点到该叶子节点要经过的路径长度为L(西)=4, 各个节点标记为n(w2,1),n(w2,2),n(w2,3),n(w2,L(西)) 其中的每个n(w,j)非叶子结点都要表示成一个向量。

  每经过一次非叶子结点,就相当于对词进行一次分类,所以从根节点出发,要到达巴西叶子节点,需要经过L(西)1词分类。我们在这里做一个定义,当词被归于左孩子节点就说词属于负类,被归于右孩子节点就说词属于正类。当然你也可以翻过来,不过好像google的文档是按照前者分类的。

  整个模型分三层,首先输入层是所有其他附近的词向量,记为v̂ t, 隐藏层是所有其他附近的词向量之和,如果window size 是2,对于“我喜欢观看巴西足球世界杯”那么输入就是“喜欢”,“观看”,“足球”,“世界杯“四个词的词向量之和,输出层就是哈弗曼树。 用二项Logistic回归模型对每一次分类过程建模:从当前节点 n(w,j)走到下一节点,其中走到左孩子节点的概率可以记为σ(uTn(w,j)v̂ t), 走到右孩子节点的概率就是1σ(uTn(w,j)v̂ t), 可以将这两个式子合并成一个式子


σ(uTn(w,j)v̂ t)1d(w,j)(1σ(uTn(w,j)v̂ t))d(w,j)

其中d(w,j)=0代表负类, d(w, j)=1代表正类
所以在给定context的情况下输出词为w的概率就相当于从根节点一直被分类到叶子节点的过程。假设window_size为m,用式子表示如下
               P(w|wtm,...,wt1,wt+1,...,wt+m)
               = L(w)1j=1σ(uTn(w,j)v̂ t)1d(w,j)(1σ(uTn(w,j)v̂ t))d(w,j)
     
  模型对语料中的全部词串计算概率值做连乘得到似然函数,再取对数得到对数似然 L, 假设语料库是有S个句子组成的一个句子序列(顺序不重要),整个语料库有V个词,对数似然函数就会构建成下面的样子

L(θ)=sj=1(Tjij=1p(wij|Contextij))

   然后我们便可以对上式用最大似然法来求取参数。一般是使用随机梯度下降法来进行参数的更新。具体解法可参考文献[2]. 还有不明白为什么用哈夫曼树算出的结果跟条件概率相同的话,也可以参考文献[2]

5.以CBOW为例介绍Negative sampling

  Negative sampling我个人的理解就是对于一篇文章中的词,我们先计算出每个词的词频(词出现的次数/文章的字数),然后将这些词根据词频的大小用一条0-1的线段来表示,词频大的占据的长度就较长,词频小的占据的长度就小。接下来将M个点均匀分布到这条线段上。这时候我们开始生成一个1-M的随机数,假设抽到3,我们就看3对应的位置属于哪一个词,如果是‘足球’,我们就忽略,如果不是那我们就记录下来,定义为负类,一般选5个即可。



  接下来就是如何训练了,首先我们把足球上下文的词向量和求出来记为xw,定义θw为该上下文对应的辅助向量表示出来,每一个词对应于一个vc,也需要在训练中更新。根据下面这个公式,我们会获得一个似然函数,加上随机梯度下降法,我们可以不断地更新上下文的词向量和辅助向量。


g(w)=σ(xTwθw)uNEG(w)[1σ(xTwθu)]

关于这个式子的随机梯度推导,可以看这篇文章:word2vec 中的数学原理详解(五)基于 Negative Sampling 的模型。

参考文献

[1] 深度学习word2vec笔记之算法篇 falao_beiliu
[2] [Word2Vec学习笔记(四)——Negative Sampling 模型] Kevin_Duan
[3] DL4NLP——词表示模型(三)word2vec(CBOW/Skip-gram)的加速
[4] word2vec 中的数学原理详解 皮果提

原创粉丝点击