美文网首页
Word2vec原理详细解读

Word2vec原理详细解读

作者: zuomeng844 | 来源:发表于2020-08-19 23:08 被阅读0次

    0. 预备知识

    Softmax函数:S_{i} =\frac{e^{V_i} }{\Sigma_j(e^{V_j} ) }

    哈夫曼树(Huffman Tree)

    1.Skip-gram

    图1. Skip-gram示意图

         从图1可以看出Skip-gram就是用当前中心词w_t(banking)预测附近的词,图1中将窗口大小设为2,即需要预测左边的2个词和右边的2个词。

         对于每个位置t\in {1,2,..,T},预测窗口大小为m的上下文,设当前中心词为w_t,那么目标为最大化:

                L(\theta )=\prod_{t=1}^T \prod_{-m\leq j\leq m\\j\neq 0}P(w_{t+j}|w_t;\theta )                                                                  (1)

    其中\theta 为模型的参数。

         为了将最大化转为最小化,可对L(\theta )取负数,为了简化计算,可取对数:

           J(\theta )=-\frac{1}{T}logL(\theta ) =-\frac{1}{T}\sum_{t=1}^T \sum_{-m\leq j\leq m\\j\neq 0} logP(w_{t+j}|w_t;\theta )                       (2)  

          现在问题的关键是如何计算P(w_{t+j}|w_t;\theta ),我们使用两个向量表示:v_w为中心词的表示,u_w为上下文词的表示。那么,计算中心词c和上下文词o的出现概率为:

                  P(o|c)=\frac{exp(u_{o}^Tv_c )}{\sum\nolimits_{w\in V}exp(u_{w}^Tv_c)}                                                                         (3)

    其中,V为整个词表大小,v_c为中心词向量表示。其实式3就是softmax函数。

    图2. Skip-gram计算示意图

          图2展示了Skip-gram的计算过程,从图中可以看出Skip-gram预测的是p(w_{t-2}|w_t)p(w_{t-1}|w_t),p(w_{t+1}|w_t),p(w_{t-2}|w_t),由于只预测前后两个单词,因此窗口大小为2。

    输入层到隐藏层:输入层的中心词w_t用one-hot向量表示(维度为V*1,V为整个词表大小),输入层到隐藏层的权重矩阵为中心词矩阵W(维度为V*d,d为词向量维度),设隐含向量为v(维度为d*1),那么:

                               v=W^Tw_t                                                                                 (4)

    隐藏层到输出层:隐藏层到输出层的上下文权重矩阵为U(维度为d*V),输出层为y(维度为V*1),那么:

                              y=softmax(U^Tv)                                                               (5)

    注意,输出层的向量y与输出层的向量w_t虽然维度一样,但是y并不是one-hot向量,并且向量y的每一个元素都是有意义的。如,假设训练样本只有一句话”I like to eat apple”,此时我们正在使用eat去预测to,输出层结果如图3所示。

    图3 输出向量y

         向量y中的每个元素表示用 I、like、eat、apple 四个词预测出来的词是对应的词的概率,比如是like的概率为0.05,是to的概率是0.80。由于我们想让模型预测出来的词是to,那么我们就要尽量让to的概率尽可能的大,所以我们将式子(1)作为最大化函数。

    CBOW

    图4CBOW计算示意图

    Continuous Bag-of-Words(CBOW),的计算示意图如图4所示。从图中可以看出,CBOW模型预测的是p(w_t|w_{t-2},w_{t-1},w_{t+1},w_{t+2}),由于目标词w_t只取前后的两个词,因此窗口大小为2。假设目标词w_t前后各取k个词,即窗口大小为k,那么CBOW模型为:

            p(w_t|w_{t-k},w_{t-(k-1)},...,w_{t-1},w_{t+1},...,w_{t+(k-1)},w_{t+k};\theta )                (6)

    输入层到隐藏层:如图4所示,输入层为4个词的one-hot向量表示,分别为w_{t-2},w_{t-1},w_{t+1},w_{t+2}(维度都为V*1,V为整个词表大小),记输入层到隐藏层的上下文词的权重矩阵为W(维度为V*d,d是词向量维度),隐藏层的向量h(维度为d*1),那么:

                h=\frac{W^Tw_{t-2}+W^Tw_{t-1}+W^Tw_{t+1}+W^Tw_{t+2}}{4}                              (7)

    这里就是把各个上下文词的向量查找出来,再进行简单的加和平均。

    隐藏层到输出层:记隐藏层到输出层的中心词权重矩阵为U(维度d*V),输出层的向量y(维度V*1),那么:

                             y=softmax(U^Th)                                                                          (8)

    注意,输出层的向量y与输入层的w_t虽然维度一样,但是y并不是one-hot向量,并且向量y的每个元素都是有意义的。CBOW的目标是最大化函数:

    L(\theta )=\prod_{t=1}^T P(w_t|w_{t-k},w_{t-(k-1)},...,w_{t-1},w_{t+1},...,w_{t+(k-1)},w_{t+k})     (9)

    层次softmax和负采样

    由于softmax的分母部分计算代价很大,在实际应用时,一般采用层次softmax或者负采样替换掉输出层,降低计算复杂度。

    层次softmax

    层次softmax(Hierarchical Softmax)是一棵哈夫曼树,树的叶子节点是训练文本中所有的词,非叶子节点是一个逻辑回归二分类器,每个逻辑回归分类器的参数都不同,分别用\theta _*表示,假定分类器的输入为向量h,记逻辑回归分类器输出的结果为\sigma (\theta _*h)将向量h传递给节点的左孩子概率为\sigma (\theta _*h),否则传递给节点的右孩子概率为1-\sigma (\theta _*h)。重复这个传递流程直到叶子节点。

    图5 基于层次softmax的CBOW 图6 基于层次softmax的skip-gram

    从图5和图6可以看出,我们就是将隐藏层的向量h直接传递到了层次softmax,层次softmax的复杂度为O(log(V)),层次softmax采样到每个词的概率如下:

    对于CBOW或者skip-gram模型,如果要预测的词是to,那么我们就让p(to|context)尽量大,所以我们将任务转换成训练V-1个逻辑分类器。CBOW模型和skip-gram模型训练目标函数和之前形式一样,为:

                         L_{skip-gram}(\theta )=\prod_{t=1}^T \prod_{-m\leq j\leq m\\j\neq 0}P(w_{t+j}|w_t )                                       (10)

    L_{CBOW}(\theta )=\prod_{t=1}^T P(w_t|w_{t-k},w_{t-(k-1)},...,w_{t-1},w_{t+1},...,w_{t+(k-1)},w_{t+k})  (11)

    3.2 负采样

    负采样实际上是采样负例来帮助训练的手段,其目的与层次softmax一样,是用来提升模型的训练速度。我们知道,模型对正例的预测概率是越大越好,模型对负例的预测概率是越小越好。负采样的思路就是根据某种负采样的策略随机挑选一些负例,然后保证挑选的这部分负例的预测概率尽可能小。所以,负采样策略是对模型的效果影响很大,word2vec常用的负采样策略有均匀负采样、按词频率采样等等。

    A.CBOW

    以“I like to eat apple”为例子,假设窗口的大小是2,当中心词为like时,即我们会用 I to 来预测like,所以在这里我们就认为(I,like)和(to,like)都是正例,而(I,apple)、(to,apple)就是负例,因为(I,apple)、(to,apple)不出现在当前正例中。用NEG(w)表示负样本,有:

             P(w|context(w)) = \sigma (\theta^wh^{contex(w)})                                                         (12)

    P(NEG(w)|context(w))=\prod_{u\in NEG(w)}(1-\theta^{NEG(w)}h^{context(w)})                (13)

    这里的\theta^*是词*的中心词向量表示,h为隐藏层的输出向量。我们只需要最大化目标函数:

        L(\theta )=\prod_{t=1}^TP(w_t|context(w_t)) ^*P(NEG(w_t)|context(w_t))                 (14)

    这个损失函数的含义就是让正例概率更大,负例的概率更小。

    B.Skip-gram

    以“I like to eat apple”为例子,假设窗口的大小是1,即我们会用 like 来预测 I to,所以在这里我们就认为(like,I)和(like,to)都是正例,而(like,apple)就是负例,因为(like,apple)不会出现在正例中。那么,对于给定的正样本(w,context(w))和采样出的负样本(w,NEG(w)),有:

                                  P(contex(w)|w)=\sigma (\theta ^uh^w)                                                   (15)

                       P(NEG(w)|w)=\prod_{u\in NEG(w)}(1-\sigma (\theta ^uh^w))                                    (16)

    这里的\theta ^*是词*的中心词向量表示,h为隐藏层的输出向量。我们只需要最大化目标函数:

                    L(\theta )=\prod_{t=1}^T P(context(w_t)|w_t)*P(NEG(w_t)|w_t)                        (17)

    C.采样方法

    word2vec常用的负采样策略有均匀负采样、按词频率采样等等。比较常用的采样方法是一元分布模型的3/4次幂。该方法中,一个词被采样的概率,取决于这个词在语料中的词频 ,其满足一元分布模型(Unigram Model).

                                       P(w_i)=\frac{f(w_i)^{3/4}}{\sum\nolimits_{k=0}^V f(w_k)^{3/4}}                                                      (18) 

    其中V为整个词表大小,   f(w_i)为词w_i的词频。

    至于为什么选择3/4呢?其实是由论文作者的经验所决定的。

    假设由三个词,,”我“,”和平“,”觊觎“ 权重分别为 0.9 ,0.01,0.003;经过3/4幂后:

    我: 0.9^3/4 = 0.92

    和平:0.01^3/4 = 0.03

    觊觎:0.003^3/4 = 0.012

    对于”觊觎“而言,权重增加了4倍;”和平“增加3倍;”我“只有轻微增加。

    可以认为:在保证高频词容易被抽到的大方向下,通过权重3/4次幂的方式,适当提升低频词、罕见词被抽到的概率。如果不这么做,低频词,罕见词很难被抽到,以至于不被更新到对应的Embedding。

    Question&Answer

    Question1: 如图7中,skip-gram模型中,从隐藏层到输出层,因为使用权值共享,所以会导致输出的几个上下文词向量总是完全一样,但网络的目的是要去预测上下文会出现的词,而实际中给定中心词的情况下上下文的词会五花八门。怎么解释skip gram的这种输出形式?

    图7.  skip-gram前向传播过程

    Answer1: 网络的目的不是要预测上下文会出现啥词,这只是一个fake task。实际上这个loss就是降不下来的,所以本来就不能用于真正预测上下文,而初衷也不是用于预测上下文,只是利用上下文信息去实现嵌入。

           如果你的100W个句子都是”I really love machine learning and deep learning“,加上权值共享,结果就是给定machine以后,它输出really,love,learning,and这四个词的概率完全相同,这就意味着这四个词的词向量也是差不多的。正因为这样,语义相近的词,他们在空间上的映射才会接近。

    Question2: Word2Vec哪个矩阵是词向量?

    Answer2:如图7所示,中心词矩阵W,上下文矩阵W' 可以任意选一个作为词向量矩阵。但是,如果采用优化后(层次softmax)的模型,那么将不存在W',这种情况下只能选矩阵W。

    三千多字,码字不易,如果大家发现我有地方写得不对或者有疑问的,麻烦评论,我会回复并改正。对于重要问题,我会持续更新至Question&Answer。

    参考:

    [1]skip-gram的关键术语与详细解释

    [2]一篇浅显易懂的word2vec原理讲解

    [3]CS224n:深度学习的自然语言处理(2017年冬季)1080p

    [4]Stanford CS224N: NLP with Deep Learning | Winter 2019 | Lecture 2 – Word Vectors and

    Word Senses

    [5]关于skip gram的输出?

    [6] Le, Quoc V , and T. Mikolov . "Distributed Representationsof Sentences and Documents." (2014).

    [7] Mikolov, T. . "Distributed Representations of Words andPhrases and their Compositionality." Advances in Neural InformationProcessing Systems 26(2013):3111-3119.

    [8] Mikolov, Tomas , et al."Efficient Estimation of Word Representations in Vector Space." Computerence (2013).

    [9] Goldberg, Yoav , and O. Levy . "word2vec Explained:deriving Mikolov et al.'s negative-sampling word-embedding method." arXiv(2014).

    相关文章

      网友评论

          本文标题:Word2vec原理详细解读

          本文链接:https://www.haomeiwen.com/subject/lpxjjktx.html