摘要
在前面的文章里面已经非常粗略的介绍过Word2Vec的原理,因为网上关于W2V的学习材料已经足够多了,写的也非常的好。但是大部分的文章也是只是介绍了整个W2V的原理,对于里面一些计算的细节,似乎并没有文章分析,另一方面,可能对于部分人来说,读完了原理之后非常想有一个真真切切的例子把整个Word2Vec的流程算一遍,所以,本文参照前面对GBDT,XGBOOST的文章,把整个W2V的计算过程演示一遍,希望大家能结合论文和本文的例子,对W2V有一个进一步的把握,同时也帮想自己造W2V轮子的读者理一理脉络。
前言:
在本文里面,我先会介绍Word2Vec在Skipgram&Hierarchical SoftMax(层级SoftMax)下的训练过程,之后会介绍Skipgram在Negative Sampling的训练过程。最后一部分是CBOW的训练过程。
另外,本文假设你已经阅读一些关于W2V的学习材料,知道一些基本的概念(哈夫曼树、SkipGram、CBOW、Negative Sampling、基本参数等)
训练参数
为了方便说明整个计算的流程,先做一下参数的设定。
学习的预料如下(3个句子)
(句子乱敲的,别在意细节)
SkipGram & Hierarchical SoftMax 训练过程
预备工作:
从上面的语料,我们知道,我们一共有6个单词。而且设定了embedding之后的词向量长度为了5,所以,我们先给每个词向量做一个初始化,具体如下:
然后,我们来构造一下我们的训练数据,SkipGram的核心思想就是利用中心词 w w 去预测中心词
的上下文 Content(w) C o n t e n t ( w ) ,所以,很自然,在窗口为5的情况下我们有如下全部的训练数据:
之后,我们再根据预料中单词出现的频次建一个哈夫曼树,具体如下:
可以看到,对于出现次数最多的单词’cat’编码为0(最短),其余单词出现次数均为1,这个时候剩余单词的编码就无所谓了。
值得注意的是,其实在层级SoftMax中并非一定要使用哈夫曼树,用这种数据结构是为了性能,使得训练的速度加快,后面代码分析部分会简单说明说这个问题。
另外,我们把每个词的编码,以及每个词从根结点到其叶子结点路径上所经过的 θ θ 编号整理成如下表(后面会用到)
在完成上面的准备工作后,是时候给出SkipGram下的 Hierarchical SoftMax的伪代码了。这个伪代码的推导过程参考文章。
这里先简单的解释一下算法流程图中的一些变量。
σ(x)是sigmoid函数,即σ(x)=11+e−x σ ( x ) 是 s i g m o i d 函 数 , 即 σ ( x ) = 1 1 + e − x
η η 为学习率,在此处我们初始化为0.95(注意,这里初始化为0.95是纯粹是为了后面计算的结果的数值稍微大点)
Context(w) C o n t e x t ( w ) 指的是中心词w的上下文集合,比如说对于第二个句子中词dog在窗口大小为5的情况下其上下文集合有 { woof,cat} { w o o f , c a t }
V(w) V ( w ) 是中心词w的词向量,初始化为上图中的数据。
θj θ j 是非叶子结点的向量,其维度与 V(w)