Word2Vec原理、训练与优化
徐徐 抱歉选手

如何量化一个词

方法总的来说又两种,分别是one-hot representation与distributional representation。

one-hot表示方法虽然十分直观,但问题在于如果词汇量很大,每一个单词用向量来表示的dimension就十分大,所有词汇的one-hot向量组成的矩阵是sparse的。

distributional representation的方法在于它通过在每一个dimension上都有取值,从而实现词向量dimension的降低。并且单词变成词向量后,可以通过向量的加减法来实现词意的变化。

词向量的算法有skip-gram与Continuous Bag of Words(CBOW)两种。训练方法主要有hierarchical softmax与negative sampling两种。

给定词的上下文词的概率公式

自然语言处理当中的原始概率计算公式为:

其中来表center word的vector representation,代表context word(outside word)的vector representation。V代表整个文章的所有词汇。整个式子就是求在已知center word的条件下哦,求context word出现的概率。

这个式子有何数学含义?分母是两个向量的点积。有,结果越大说明两个向量u和v越相似,单词u和v越有关联。点积的结果使用exp是为了保证分子为正。整个式子结合分子分母来看是一个softmax,它的作用是将数字转化为概率分布。

Softmax function: Standard map from to a probability distribution

softmax为什么叫softmax?soft+max,max因为它将大的值更强化了比重,soft因为它仍然考虑较小的值而不知和max函数一样直接抹去它的存在。它的作用类似于max函数,式子的形式有点像求一个数的exp占总体比例的大小。分母的求和是normalize to give probability。

参数说明

V/vocabulary:词表中的词数量,代表词表中所有词的个数。

d/dimension:每个词表示为多少维度的向量。

m:代表window size,每一个center word向前向后考虑m个单词。

CBOW

CBOW是用window outside word来预测center word的模型。模型的输入是one-hot context word vector ,输出是一个one-hot center word vector 。这是已知的量。

未知的量的定义如下。首先是两个矩阵,其中d是一个定义了embedding space的大小。是input word matrix,的第列就是词表中的第个单词的词向量,它的大小是。同样的是output word matrix,的第行就是词表中的第个单词的词向量。从这里就可以看出,我们实际上为每个单词学习到了两个embeded vector,一个是input word vector ,另一个是output word vector

模型架构

第一步,为落在window size中的context word生成one-hot word vector ,共2m个,维度为

第二步,将input word matrix与one-hot context word vector相乘获得embedded word vectors,如单个词的结果为

这就是Keras等框架中所谓的embedding层,以one-hot为输入、中间层节点维字向量维数的全连接层,全连接层的参数就是一个字向量表。

因为one-hot型矩阵与其他矩阵相乘,操作就相当于查表,而不是真正的矩阵运算,所以运算量很低。

如果我们把2m个one-hot向量放在一起组成一个维度为的矩阵来考虑,就可以获得

第三步,将所有第二步获得的vectors求平均,,维度为

第四步,生成一个score vector,

第五步,将score vector中的每一个cell值用softmax变为probability,

第六步,将中对应为,就是把最大值所在的cell变为1,其余小值全变为0,这样子变换后输出也是一个one-hot vector。

如何训练

现在我们已经知道了在拥有input word matrix和output word matrix的情况下,模型如何运作了。但是如何获得这两个矩阵,如何学习到这些参数呢?通常我们希望从一个实际存在的概率分布中学习到一个概率分布模型,我们通过减小实际分布与概率分布模型的距离来找到最优解。这里使用cross entropy 来measure the distance between two probability distribution。

对于这个例子,我们输出的向量是一个one-hot向量,可以去掉sum符号。在下面这个式子中,我们用代表我们希望模型的结果是1的正确的单词。如果预测的对应到了应该出现的单词,那么。带入下面这个式子,交叉熵就是0,这种情况没有loss或penalty。但是如果模型预测的很糟糕,假设正确的词所在输出向量的概率为,那么带入下面的式子交叉上就会为4.6左右。

因此我们的目标函数就是:

skip-gram

skip-gram是用center word来预测window outside word的模型,和CBOW的区别是,CBOW中的输入现在是Skip-Gram的输出。对于skip-gram的输入,我们用来表示,因为center word只有一个,依然是one-hot vector;输出向量用来表示,有多个。同样定义两个矩阵

模型架构

第一步,生成输入的center word的one-hot vector

第二步,将input word matrix 与输入向量相乘,获得embedded word vectors。

第三步,由于输入向量只有一个,不像CBOW一样需要averaging,直接令

第四步,用input word matrix 与$vcu=W^{‘}v_cu{c-m},…,u{c-1},u{c+1},…,u_{c+m}$。

第五步,使用softmax将score转为概率

第六步,我们希望产生的中概率最大的位置和真实位置相对应。

image-20210316140454912

如何训练

首先定义两种类型的单词,一个是center word ,另一个是context words。

以skip-gram为例,我们希望从center word 推导出他的前后的单词个数。设定一个窗口大小m,窗口的大小决定了我们从center word 分别向前向后看多少个单词。例如,对于center word 的前一个位置的单词出现的概率为 。我们要预测的准,就希望前后窗口的所有单词的概率之积最大。即

这里的就是我们要求的word2vec的向量表示。

用log把乘积转变为和,并把max转换成min。

结合原始概率计算公式,对目标函数的求导,暂时不考虑前面的两个求和,从对数函数开始考虑。

分前后两个式子分别观察,可以看到log和exp是相互抵消的,对矩阵求微分。

对于第二个式子,对最外层的log函数使用链式法则,需要注意应用了链式法则的sum中参数由w变为x,因为已经不是同一个了。

现在单独考虑partial开始的式子,将partial符号放到sum符号后面,对每一项求partial,并且在此应用链式法则。

将这个结果放回第二个式子中,可以得到

注意到分母是一个常数,因此可以进一步化简为

我们发现eq2中sum的对象形似softmax,可以看作是所有context vector 与它出现在center word 前后的概率的乘积之和,就相当于expectation of all context vectors weighted by their likelihood of occurence.

总的求偏微分后的结果为

怎么理解这个式子?主要由两部分组成,第一项是正确的target word的positive reinforcement,第二项是词表中所有其他词汇的一个negative reinforcement,意义是服从分布的所有词向量的期望。这对接下来训练优化方式的的方向至关重要,很多训练优化都致力于让第二项negative reinforcement更容易计算。

训练优化方式

我们注意到是一个十分大的数,理论上来说,我们要获得词表的socre vectors,即每一个单词的score,还要做summation,这个步骤十分消耗资源。

下面所有的优化,都在尝试用其他方法逼近softmax的效果。大致有两种方向。第一种是在softmax的基础上改良,如hierarchical softmax。第二种是以sampling为基础的新方法,这种方法完全抛开了softmax层,但效果和softmax一样好,如negative sampling和noise contrastive sampling。

注意!sampling-based approach只能在训练的时候去使用,在验证的时候还是需要老老实实使用softmax。

While the approaches discussed so far still maintain the overall structure of the softmax, sampling-based approaches on the other hand completely do away with the softmax layer. They do this by approximating the normalization in the denominator of the softmax with some other loss that is cheap to compute.

nce loss/noise contrastive estimation

NCE loss的直观想法就是把多分类问题转化为二分类问题,词表中的每一个word都代表着一个class,随着词汇量的增多,就要求模型具备从好多个class判断的能力,计算量非常大。为了实现不计算所有class的probability,但同时能在训练时给予一个合理的loss,这就引入了NCE loss。

NCE做的就是让模型具备区分真实数据和噪声做出来的假数据的能力,和GAN有点相似。对于每一个单词$wic_iw{t-1}, …, w{t-n+1}\tilde{w}{ik}$。

我们要实现一个二分类的任务,因此需要需要给每一个正确的单词以及匹配的context 一个正确的label y=1,来自于训练数据集的真实分布;而噪声样本就是错误的lable y=0,来自于噪声分布。从这两个分布中进行采样。

NCE loss function

因此重新定义目标函数NCE loss function。为了避免计算每一个word的概率,使用蒙特卡洛近似用均值去代替原式子中的期望。

image-20210317141217819

接下来尝试表示损失函数中的概率P。因为label y可能来自两个分布,并且一个真实的(x,y)对会跟随k个噪声分布产生的虚假的(x, y’)。因此有如下式子:

于是,可以计算给定的条件下,一个采样从中获得的条件概率为:

由于是二分类问题,label y=0的概率就是

由于实际上我们并无法获得真实训练数据的分布,因此考虑用probability of our model 去替代。

因此,可得

注意到,就是文章最开始提到的给定词的上下文词的概率(the probability of a word given its context c),也是一个softmax公示。

将分母用代表,而要求分母意味着又要计算每一个单词的概率,如何简化?有两种方式,一种是将作为一个参数去学习,另一种是直接固定为值1。

固定为1后,重新写出

代入NCE loss function可以获得最终的结果。

image-20210317143731448

文章存疑?:It can be shown that as we increase the number of noise samples kk, the NCE derivative tends towards the gradient of the softmax function.

negative sampling/NEG

每一个训练阶段,不要遍历所有的词汇,而是采几个负样本。思想是We “sample” from a noise distribution whose probabilities match the ordering of the frequency of the vocabulary。负采样可以看作是NCE的一种再近似。

和NCE不同的是,在计算the probability that a word comes from the empirical training distribution given a context as

NEG直接把分母的,为

这么做的根据在哪里?第一,在极限情况为均匀分布/uniform distribution的时候,NEG就等于NCE;其他情况下NEG只是NCE的近似,这意味着NEG并不会直接最优化correct words的likelihood。第二,这种情况下这个条件概率可以上下同时除以exp,获得一个sigmoid形式的结果。并且求label为0的时候的概率表达式也会简单很多。

最终NEG loss function结果如下。

image-20210317145152405

参考

word2vec初步认识

莫烦 Python教学 Continuous Bag of Words (CBOW)

word2vec中的数学原理详解

word2vec架构解析

cs224d的note

word2vec训练词向量的转换过程

word2vec是如何得到词向量的? - crystalajj的回答 - 知乎

word2vec训练优化

Understanding tf.nn.nce_loss() in tensorflow

通俗易懂的NCE Loss

On word embeddings - Part 2: Approximating the Softmax

softmax与交叉熵的关系

CS231n课堂笔记sotmax讲解

word2vec、词向量、Embedding层

苏神博客-词向量与Embedding究竟怎么回事?

  • 本文标题:Word2Vec原理、训练与优化
  • 本文作者:徐徐
  • 创建时间:2021-03-16 13:47:16
  • 本文链接:https://machacroissant.github.io/2021/03/16/word2vec/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论