zoukankan      html  css  js  c++  java
  • Word2Vec实现原理(Hierarchical Softmax)

    由于word2vec有两种改进方法,一种是基于Hierarchical Softmax的,另一种是基于Negative Sampling的。本文关注于基于Hierarchical Softmax的改进方法,在下一篇讨论基于Negative Sampling的改进方法。

    1. 基于Hierarchical Softmax的模型概述

    我们先回顾下传统的神经网络词向量语言模型,里面一般有三层,输入层(词向量),隐藏层和输出层(softmax层)。里面最大的问题在于从隐藏层到输出的softmax层的计算量很大,因为要计算所有词的softmax概率,再去找概率最大的值。这个模型如下图所示。其中V是词汇表的大小.

    word2vec对这个模型做了改进,首先,对于从输入层到隐藏层的映射,没有采取神经网络的线性变换加激活函数的方法,而是采用简单的对所有输入词向量求和并取平均的方法。比如输入的是三个4维词向量:(1,2,3,4),(9,6,11,8),那么我们word2vec映射后的词向量就是(5,6,7,8).

    第二个改进就是从隐藏层到输出的softmax层这里的计算量个改进。为了避免要计算所有词的softmax概率,word2vec采样了霍夫曼树来代替从隐藏层到输出softmax层的映射。我们在上一节已经介绍了霍夫曼树的原理。如何映射呢?这里就是理解word2vec的关键所在了。

    由于我们把之前所有都要计算的从输出softmax层的概率计算变成了一颗二叉霍夫曼树,那么我们的softmax概率计算只需要沿着树形结构进行就可以了。如下图所示,我们可以沿着霍夫曼树从根节点一直走到我们的叶子节点的词w_2处.

     

    和之前的神经网络语言模型相比,我们的霍夫曼树的所有内部节点就类似之前神经网络隐藏层的神经元,其中,根节点的词向量对应我们的投影后的词向量,而所有叶子节点就类似于之前神经网络softmax输出层的神经元,叶子节点的个数就是词汇表的大小。在霍夫曼树中,隐藏层到输出层的softmax映射不是一下子完成的,而是沿着霍夫曼树一步步完成的,因此这种softmax取名为"Hierarchical Softmax"。

    如何“沿着霍夫曼树一步步完成”呢?在word2vec中,我们采用了二元逻辑回归的方法,即规定沿着左子树走,那么就是负类(霍夫曼树编码1),沿着右子树走,那么就是正类(霍夫曼树编码0)。判别正类和负类的方法是使用sigmoid函数,即:

    $P(+) = sigma(x_w^T heta) = frac{1}{1+e^{-x_w^T heta} }$

    其中$x_w$是当前内部节点的词向量,而θ则是我们需要从训练样本求出的逻辑回归的模型参数。

    使用霍夫曼树有什么好处呢?首先,由于是二叉树,之前计算量为$V$,现在变成了$log_2V$.第二,由于使用霍夫曼树是高频的词靠近树根,这样高频词需要更少的时间会被找到,这符合我们的贪心优化思想。

    容易理解,被划分为左子树而成为负类的概率为$P(-)=1-P(+)$.在某一个内部节点,要判断是沿左子树还是右子树走的标准就是看$P(-),P(+)$谁的概率值大.而控制$P(-),P(+)$谁的概率值大的因素一个是当前节点的词向量,另一个是当前节点的模型参数$ heta$的值了对于上图中的$w_2$,如果它是一个训练样本的输出,那么我们期望对于里面的隐藏节点$n(w_2,1)$的P(-)概率大,$n(w_2,2)$的P(-)概率大,$n(w_2,3)$的P(+)概率大

    回到基于Hierarchical Softmax的word2vec本身,我们的目标就是找到合适的所有节点的词向量和所有内部节点θ, 使训练样本达到最大似然。那么如何达到最大似然呢?

    2. 基于Hierarchical Softmax的模型梯度计算

    我们使用最大似然法来寻找所有节点的词向量和所有内部节点$ heta$,先拿上面的$w_2$例子来看,我们期望最大化下面的似然函数:

    $prod_{i=1}^3P(n(w_i),i) = (1- frac{1}{1+e^{-x_w^T heta_1}})(1- frac{1}{1+e^{-x_w^T heta_2}})frac{1}{1+e^{-x_w^T heta_3}}$

    对于所有的训练样本,我们期望最大化所有样本的似然函数乘积。

    为了便于我们后面一般化的描述,我们定义输入的词为$w$,其从输入层词向量求和平均后的霍夫曼树根节点词向量为$x_w$,从根节点到$w$所在的叶子节点,包含的节点总数为$l_w$,w在霍夫曼树中从根节点开始,经过的第i个节点表示为$P_i^w$,对应的霍夫曼编码

    为$d_i^win{0,1}$,其中i=2,3.....$l_w$.而该节点对应的模型参数表示为$ heta_i^w$,其中i=1,2....$l_w$-1,没有i=$l_w$是因为模型参数仅仅针对于霍夫曼树的内部节点。

    定义w经过的霍夫曼树某一个节点j的逻辑回归概率为$P(d_j^w|x_w, heta_{j-1}^w)$,其表达式为:

    $P(d_j^w|x_w, heta_{j-1}^w)= egin{cases}  sigma(x_w^T heta_{j-1}^w)& {d_j^w=0}\ 1-  sigma(x_w^T heta_{j-1}^w) & {d_j^w = 1} end{cases}$

    那么对于某一个目标输出词w,其最大似然为:

    $prod_{j=2}^{l_w}P(d_j^w|x_w, heta_{j-1}^w) = prod_{j=2}^{l_w} [sigma(x_w^T heta_{j-1}^w)] ^{1-d_j^w}[1-sigma(x_w^T heta_{j-1}^w)]^{d_j^w}$

    在word2vec中,由于使用的是随机梯度上升法,所以并没有把所有样本的似然乘起来得到真正的训练集最大似然,仅仅每次只用一个样本更新梯度,这样做的目的是减少梯度计算量。这样我们可以得到w大的对数似然函数L如下:

    $L= log prod_{j=2}^{l_w}P(d_j^w|x_w, heta_{j-1}^w) = sumlimits_{j=2}^{l_w} ((1-d_j^w) log [sigma(x_w^T heta_{j-1}^w)]  + d_j^w log[1-sigma(x_w^T heta_{j-1}^w)])$

    要得到模型中w词向量和内部节点的模型参数$ heta$,我们使用梯度上升法即可.首先我们求出模型参数$ heta_{j-1}^w$的梯度:$egin{align} frac{partial L}{partial heta_{j-1}^w} & = (1-d_j^w)frac{(sigma(x_w^T heta_{j-1}^w)(1-sigma(x_w^T heta_{j-1}^w)}{sigma(x_w^T heta_{j-1}^w)}x_w - d_j^w frac{(sigma(x_w^T heta_{j-1}^w)(1-sigma(x_w^T heta_{j-1}^w)}{1- sigma(x_w^T heta_{j-1}^w)}x_w  \ & =  (1-d_j^w)(1-sigma(x_w^T heta_{j-1}^w))x_w -  d_j^wsigma(x_w^T heta_{j-1}^w)x_w \& = (1-d_j^w-sigma(x_w^T heta_{j-1}^w))x_w end{align}$

    同样的方法,可以求出$x_w$的梯度表达式如下:

    $frac{partial L}{partial x_w} = sumlimits_{j=2}^{l_w}(1-d_j^w-sigma(x_w^T heta_{j-1}^w)) heta_{j-1}^w$

    有了梯度表达式,我们就可以用梯度上升法进行迭代来一步步的求解我们需要的所有的$ heta_{j-1}^w$和$x_w$.

    3. 基于Hierarchical Softmax的CBOW模型

    ...

  • 相关阅读:
    filter和listener
    JSP、EL和JSTL
    cookie和session
    xml添加约束和解析
    测试用例设计的原则是什么?目前主要的测试用例设计方法有哪些?
    您是否了解以往所工作的企业的软件开发过程?如果了解,请试述一个完整的开发过程需要完成哪些工作?分别由哪些不同的角色来完成这些工作?您在以往的测试工作中都曾经具体从事过哪些工作?其中最擅长哪部分工作?
    HttpWatch
    URL
    什么是渲染引擎
    一份测试计划应该包括哪些内容?
  • 原文地址:https://www.cnblogs.com/tsdblogs/p/9995018.html
Copyright © 2011-2022 走看看