Embeding技术:word2vec Parameter Learning Explained

参考链接

一、主要内容:

  • word2vec模型:
    • CBOW 模型:continuous bag-of-word
    • SG模型:skip-gram
  • 优化技术:
    • 分层softmax:hierarchical softmax
    • 负采样:negative sampling

二、CBOW 模型:

  • 1、One-word context 模型:
    • 模型图:
      Embeding技术:word2vec Parameter Learning Explained
    • 上图是一个全连接神经网络,在预测当前此时我们只使用前一个词作为上下文信息,就像一个二元模型(bigram model)一样。
    • 输入层是一个单词的one-hot表示,VV是词汇表的大小,隐藏层单元个数为NN
    • 输入层到隐藏层:连接矩阵为WV×NW_{V×N},隐藏层与输入层的连接是简单的线性连接(即没有**函数),两层的连接公式为:
      Embeding技术:word2vec Parameter Learning Explained
    • vwITv_{wI}^TWTW^T的列(即WW的行),wIw_I是输入的词。
    • 由于XX是单词的one-hot表示,若XX表示词汇表的第kk个单词,则XX列向量除了第kk个元素为1以外其他元素都是0,这样h=WTXh=W^TX,这相当于取出WTW^T的第kk列(即WW的第kk行)作为hh,实质这就是第kk个单词的embeding表示.
    • 隐藏到输出层:连接矩阵为WN×VW_{N × V}', 两层的连接公式为:U=WThU={W'}^T hUU是一个大小为VV的列向量,每个元素对于词汇表的一个词,我把每个元素称为其对应词的分数 (score),第jj个词的分数就是公式如下:
      Embeding技术:word2vec Parameter Learning Explained
      uju_j是词汇表中第jj个词的得分也是输出层每个单元的输入,vwjT{{v_{wj}}'}^TWW'的第jj列。
    • 然后将UU经过一softmax层(softmax:一个对数线性分类模型)得到每个单词的后验分布(即概率值),softmax层表达式(第jj个词的后验概率):
      Embeding技术:word2vec Parameter Learning Explained
      上式的含义是输入词汇表的第II个单词输出第jj个词的概率,即第jj个词在第II个词后面的概率,其中yjy_j是输出层第jj个单元的输出,对应于词汇表的第jj个词。
    • 注意:vwv_wvwv_w'是对应单词ww的两表示,我们将他们分别称为ww输入向量与输出向量,输入向量vwv_w是输入层到隐藏层连接矩阵WW的行,输出向量是隐藏层到输出层连接矩阵WW'的列
    • 隐藏层到输出层参数WW'更新:
      • 优化的目标函数如下
        Embeding技术:word2vec Parameter Learning Explained
        wIw_I是当前输入词,wow_o是目标预测词(实际输出词),jj^*是词wow_o在词汇表的下标。
      • 损失函数为:E=logp(wowI)E=-logp(w_o |w_I)目标函数就是最小化该损失函数
      • 损失函数EE关于uju_j的导数:
        Embeding技术:word2vec Parameter Learning Explained
        uju_j是输出层第jj个单元的输入,eje_j是输出层的误差,tjt_jj=jj=j^*时为1,其他情况为0,相当于wow_o的one-hot表示。
      • EE对参数矩阵WW^*的导数:
        Embeding技术:word2vec Parameter Learning Explained
      • 使用梯度下降算法我们得到WW'的更新公式
        Embeding技术:word2vec Parameter Learning Explained
        注意: 按照上面的式子更新WW'是我们要计算词汇表每个词的误差eje_j,所以计算量比较大.
    • 输入层到隐藏层的参数WW更新:
      • EE对隐藏层输出hih_i的导数:

        Embeding技术:word2vec Parameter Learning Explained
        令:e=[e1,e2,,eV]Te=[e_1,e_2,…,e_V ]^TW=[vw1,vw2,,vwV]W'=[v_{w1}',v_{w2}',…,v_{wV}']矩阵形式为:EH=eTW=j=1VejvwjEH=e^T W'=∑_{j=1}^V e_j v_{wj}' EHEH是输出向量vwjv_{wj}'的加权和权重就是其对应词的预测误差ee

      • EEWW的导数:

        • 首先我们上面说过,输入层到隐藏层是简单的线性链接:
          Embeding技术:word2vec Parameter Learning Explained
        • 这样EE关于WW的导数为:
          Embeding技术:word2vec Parameter Learning Explained
        • 矩阵形式为:
          Embeding技术:word2vec Parameter Learning Explained
        • 上式的结果是一个与WW大小一样的矩阵,由于xx是one-hot编码,所以中间只有一个1其余都是0,所以结求导矩阵中只有一行是非零的其余行都是0,非零行就是EHTEH^T.所以最后跟新的只是W中的一行,即输入词WIW_I对应的行,所有更新公式为:
          Embeding技术:word2vec Parameter Learning Explained
          EHEH是词汇表每个词的输出向量的误差加权和,所以上式可以理解为:将词汇表的每个词的输出向量按照一定比例加入到词wIw_I的输入向量中去。
  • 2、Multi-word context 模型:
    • 模型图:
      Embeding技术:word2vec Parameter Learning Explained
    • 该模型是用多个上下词的信息来预测当前词,用上下文词的one-hot编码的平均值作为输入产生隐藏层的输出,公式如下:
      Embeding技术:word2vec Parameter Learning Explained
      C是上下文词的数量。
    • 模型的损失函数是:
      Embeding技术:word2vec Parameter Learning Explained
      该公式除了hh与one-word-context model公式不同以外其他都是相同的。
    • 隐藏层到输出层权重WW'更新公式为:
      Embeding技术:word2vec Parameter Learning Explained
      与one-word-context model是一样
    • 输出层到隐藏层权重WW更新公式为
      Embeding技术:word2vec Parameter Learning Explained
      vwI,cv_{w_{I,c}}是输入的上下文中第cc个词的的输入向量。

三、skip-gram 模型:

  • 模型图:
    Embeding技术:word2vec Parameter Learning Explained
  • 目标词在输入层,上下文词在输出层。那么输入层到隐藏层的含义与One-word context模型是一样的,如下公式:
    Embeding技术:word2vec Parameter Learning Explained
  • 在输出层上,我们将输出CC个多项式分布,而不是输出一个多项式分布。 每个输出都是使用相同的隐藏层到输出层的矩阵WW'进行计算:
    Embeding技术:word2vec Parameter Learning Explained
    由于WW'是共享的,所以虽然模型图上画了CC个是输出向量,但他们都是相等的即:
    Embeding技术:word2vec Parameter Learning Explained
  • 损失函数为:
    Embeding技术:word2vec Parameter Learning Explained
    jcj_c^*是是第CC个输出词在词汇表的索引号,EE是是C个上下文输出词的概率的乘积。
  • 计算E对ucju_{cj}的导数为:
    Embeding技术:word2vec Parameter Learning Explained
    令:EI=[EI1,EI2,,EIV]TEI=[EI_1,EI_2,…,EI_V ]^TEIj=c=1Cec,jEI_j=∑_{c=1}^Ce_{c,j} EIEICC个误差向量([e1,e2,...,eC][e_1,e_2,...,e_C])之和
  • 计算E对WW'的导数为:
    Embeding技术:word2vec Parameter Learning Explained
    是C个导数的累加,则更新公式为:
    Embeding技术:word2vec Parameter Learning Explained
  • WW的更新公式为:
    Embeding技术:word2vec Parameter Learning Explained
    其中EHEHNN维向量,公式如下:
    Embeding技术:word2vec Parameter Learning Explained
  • 注意: 上面的推到公式与One-word context模型是非常相似的,不同的是误差:EIjEI_jeje_jEIjEI_jCC个输出误差的累加

四、优化技术:

  • 对于词汇表的每个词ww都有一个对应的输入向量vwv_w和一个输出向量vwv_w',他们分别是输出层到隐藏层连接矩阵WW的行与隐藏层到输出层链接矩阵WW'的列。由上面的更新公式可知,更新vwv_w计算量是比较小的,更新vwv_w'计算量是比较大的。因为我们更新vwv_w'需要计算整个词汇表的全部词的误差EIjEI_jeje_j,这样在模型训练时对于每个样本我们都必须计算每个词的误差,这个计算量是非常大的。
  • 为了解决这个问题,我们可以每次必须更新的输出向量vwv_w'的数量,具体的方法是:分层softmax(hierarchical softmax)和采样法(sampling)

1、Hierarchical Softmax 技术:

  • 该模型使用一颗二叉树来表示整个词汇表的所有词,词汇表的所有词都在二叉树的叶节点,如下图所示:
    Embeding技术:word2vec Parameter Learning Explained
  • 根节点到每个词的路径用于估计单词的概率。用n(w,j)n(w,j)表示更节点到词ww路径上的第jj个节点。
  • 在分层softmax模型中,每个单词的输出向量vwv_w'。树中的V − 1个中间节点都有一个输出向量vn(w,j)v_{n(w,j)}',输出某个词的概率定义如下:
    Embeding技术:word2vec Parameter Learning Explained
    ch(n)ch(n)表示节点nn的左子树;vn(w,j)v_{n(w,j)}'表示叶节点ww路径上第jj个内部节点的向量表示;hh是隐藏层的输出向量,[][]函数定义如下:
    Embeding技术:word2vec Parameter Learning Explained
  • 现在假设我想计算输出页节点w2w_2的概率,我们将这个概率定义为从根节点随机走到叶节点w2w_2的概率,为此我们为每个内部节点定义一个向左和向右走的概率,下面是内部节点向左走的概率:
    Embeding技术:word2vec Parameter Learning Explained
    其中σσ是sigmoid函数定义如下:
    Embeding技术:word2vec Parameter Learning Explained
    则向右走的概率为:
    Embeding技术:word2vec Parameter Learning Explained
  • 于是我们得到输出词w2w_2的概率:
    Embeding技术:word2vec Parameter Learning Explained
    形式化的定义就是上面上式子:
    Embeding技术:word2vec Parameter Learning Explained
    并且有下面式子成立:
    Embeding技术:word2vec Parameter Learning Explained
  • 下面推导树内部节点向量的更新公式:
    • 首先令(为了简化公式):
      Embeding技术:word2vec Parameter Learning Explained
    • 损失函数为:
      Embeding技术:word2vec Parameter Learning Explained
    • E对vjhv_j' h的导数为:
      Embeding技术:word2vec Parameter Learning Explained
      [.]=1[.]=1tj=1t_j=1其他情况都为0,可以理解为当前词的表示为其对应节点的哈夫曼编码。
    • E对vjv_j'的导数为:
      Embeding技术:word2vec Parameter Learning Explained
    • vjv_j'的更新等式为:
      Embeding技术:word2vec Parameter Learning Explained
    • 每个样本只需要更新其目标词路径上的内部节点的向量就可以了,这就大大减少更新向量的数目;我们可以将σ(vjTh)tjσ(v_j'^T h)-t_j视作内部节点n(w,j)n(w,j)的误差。
    • 对于CBOW可以直接使用该更新方程,对于skip-gram模型我们需要使用该方程到C个预测上下文词上。
    • E对隐藏层输出h的导数:
      Embeding技术:word2vec Parameter Learning Explained
      EH可以视作是当前样本预测词路径上每个内部节点对应向量vjv_j的误差加权和。对于CBOW模型直接使用上面等式求出EH向量,对于skip-gram模型我们需要计算每个上下文输出词的EI向量再相加的得到最终的EI向量。
    • 输入层到隐藏层链接矩阵WW更新公式为:
      Embeding技术:word2vec Parameter Learning Explained
    • 由上面的更新公式可以看出,我们预测每个词的更新参数复杂的由O(V)O(V)降低到O(logV)O(logV)这是一个巨大的提升。并且隐藏层到输出层的参数个数只减少了一个,从V(输出向量)个变成V-1(内部节点向量)个

2、 Negative Sampling 技术:

  • Negative Sampling比Hierarchical Softmax直接很多,它直接对词汇表中的词进行采样,得到一个采样集合,集合中的词是需要更新的词,显然,预测的目标词必须在该集合中,因此我们需要采样的是非目标词,因此叫做负采样法(负样本采样)。
  • 采样过程需要一个概率分布,我们称该分布为噪声分布,记为pn(w)p_n (w),该分布的依靠个人的经验进行设置。
  • 定义损失函数为:
    Embeding技术:word2vec Parameter Learning Explained
    其中w0w_0是目标输出词,vwov_{w_o}'是目标输出词对于的输出向量;hh是隐藏层输出向量;Wneg={wjj=1,2,,K}W_{neg}=\{w_j |j=1,2,…,K\}是根据分布pn(w)p_n (w)采样的集合。我们每次迭代都只更新与目标词和负采样集合中词对应的输出向量vwjv_{w_j}'
  • 求E对采样集合中词对应的输出层单元的输入vwjThv_{wj}'^T h的导数:
    Embeding技术:word2vec Parameter Learning Explained
    tjt_j相当于目标词在采样集合内的one-hot编码值。
  • 输出向量vwjv_{wj}'的更新等式:
    Embeding技术:word2vec Parameter Learning Explained
    其中wjw_j是负采样集合中的词,即{wjj=0,1,2,,K}={w0}{Wneg}\{w_j│j=0,1,2,…,K\}=\{w_0 \}∪\{W_{neg} \},即我们每次迭代只需更新负采样集合对应的部分的参数向量。该更新公式能够直接应用到CBOW模型中去,对于skip-gram模型中需要将上面过程应用到C输出的上下文词上去。
  • 求E对隐藏层输出向量hh的导数:
    Embeding技术:word2vec Parameter Learning Explained
    对于CBOW模型我们直接使用上式计算EI向量,对于skip-gram模型我们需要对每个输出词计算一个EI向量再相加得到总的EI。
  • 输出层到隐藏层链接矩阵WW的更新公式:
    Embeding技术:word2vec Parameter Learning Explained
  • 这样更新的复杂度由原来的O(V)变为O(K),K是负采样集合的大小。