Word2vec 的基本思想是给每个单词初始化向量,使得其与出现在相似上下文中的单词向量相似。

算法:

损失函数推导

举如下图例,计算 P(wt+j|wt)

对于语料库中的每个位置 t=1,...,T,设窗口大小为 m,给定中心词 wt

那么我们就可以得到似然函数:

L(θ)=t=1TmjmP(wt+j|wt;θ)

目标就是要求该函数取极值时 θ 的值

为了进行计算,我们需要对这个函数取对数,并加上负号来转化为求极小化问题,于是得到损失函数

J(θ)=1TlogL(θ)=1Tt=1TmjmlogP(wt+j|wt;θ)

现在要解决的问题:如何表示 P(wt+j|wt;θ)

首先,对于每一个词 w,使用两个向量表示:

那么对于中心词 c 和上下文 o

用两者向量的点积衡量它们的相似程度,点积越大则越相似。由于概率不能为负,所以将点积取幂,由于概率和要为 1,应归一化处理,于是就得到了如下概率表示:

P(o|c)=exp(uoTvc)wVexp(uwTvc)

其实也就是点积的 softmax 函数

假设每个向量有 d 维,那么最后计算出来的 θ 就是一个包含了所有单词的中心词向量和上下文向量的矩阵,它有 2V 行,d

首先初始化 uwvw,然后使用梯度下降法更新

求对 vc 的偏导:

u0 表示观察到的上下文词向量,它减去所有预测的上下文词向量,梯度下降法更新即可

两种算法

CBOW 模型

首先,对于每一个词 w,使用两个向量表示:

V 为输入词矩阵,其第 i 列为 wi 的输入向量,U 为输出词矩阵,其第 j 行为 wi 的输入向量

模型步骤如下:

CBOW 是要用上下文词预测中心词,接下来的问题是要把上下文词向量融合起来表示中心词向量,融合可有很多种办法,原论文中很朴素地采用直接相加,于是下一步是:

最后,每个单词的 one-hot 与输入词矩阵相乘就得到了词向量

结构如图:

那么如何学习 UV 呢,考虑我们最后得到了概率 y^,并将其与 one-hot 比较,而信息论提供了一个度量两个概率分布的距离的方法:交叉熵 H(y^,y)

得损失函数为:

H(y^,y)=j=1|V|yilog(yj^)

由于 y 为 one-hot 向量,其它部分均为 0,故公式可以写为:

H(y^,y)=yilog(yj^)

y^j 越接近 1 时,表示预测越精确,这个值也就越小

从而优化目标函数公式为:

minimizeJ=logP(wc|wcm,...,wc+m)=logP(uc|v^)=hcTv^+logj=1|V|exp(ujTv^)

使用梯度下降法更新即可

Skip-Gram 模型

该模型与前者逻辑一样,只不过步骤刚好相反,前者是根据上下文向量求中心词概率并于 one-hot 比较,而该模型是根据中心词求上下文向量然后与 one-hot 向量比较

过程简要如下:

结构如图:

求目标函数时有些许差异,给定中心词时,假定输出的上下文的词间是独立的

minimizeJ=logP(wcm,...,wc+m|wc)=logj=0,jm2mP(ucm+j|vc)

同样使用梯度下降法更新 UV 即可

计算优化

让我们回到目标函数上。注意对 |V| 的 softmax 计算量是非常大的,每次计算的时间复杂度都为 O(|V|),这里介绍两种经典的方法来进行训练:

Negative Sampling

不去遍历整个词汇表,而仅仅是抽取一些负样例做优化

考虑一对中心词和上下文词 (w,c),用 P(D=1|w,c) 表示其来自语料库,P(D=0|w,c) 表示其不是来自语料库

现在考虑建立新的目标函数,如果两者确实来自语料库,就最大化概率 P(D=1|w,c) 否则最大化概率 P(D=0|w,c),采用极大似然估计法

先令:

P(D=1|w,c,θ)=σ(vcTvw)=11+e(vcTvw)

则:

取对小对数似然:

负样本按如下分布抽取:

P(wi)=f(wi)0.75j=0n(f(wj))0.75

四分之三是信息检索领域里的一个经典参数,这个参数只是因为实际效果好而试出来的,比如如下计算:

低频词 "Bombastic" 现在被抽样的概率是之前的三倍,而 "is" 只提高了一点点,它能够较大提升低频词的抽取概率

Hierarchical Softmax

Hierarchical softmax 使用一个哈夫曼树来降低训练的成本。树中的每个叶节点都是一个单词。每个叶节点到根节点的路径是唯一确定的,我们考虑不直接优化单词的向量,而是优化所有非叶节点的向量,那么代价就能从原来的 O(|V|) 降为 O(log|V|)

具体计算如下:

则 Hierarchical softmax 可定义为:

p(w|wI)=j=1L(w)1σ([[n(w,j+1)=ch(n(w,j))n(w,j+1)=ch(n(w,j))]]vn(w,j)TvwI)

详细解释

也就是说,非叶节点的向量起到一个“导航”的作用,我们要优化它们使得最终能“走到”概率最大的叶节点。

虽然这种方法在后面的工作就不再使用了,但思想非常巧妙,值得学习,也是面试高频考察点。