返回介绍

数学基础

统计学习

深度学习

工具

Scala

四、GloVe

发布于 2023-07-17 23:38:25 字数 484363 浏览 0 评论 0 收藏 0

3.1 CBOW 模型

  1. CBOW 模型(continuous bag-of-word):根据上下文来预测下一个单词。

3.1.1 一个单词上下文

  1. 在一个单词上下文的CBOW 模型中:输入是前一个单词,输出是后一个单词,输入为输出的上下文。

    由于只有一个单词作为输入,因此称作一个单词的上下文。

  2. 一个单词上下文的CBOW 模型如下:

    其中:

    • N$ N $ 为隐层的大小,即隐向量h=(h1,h2,,hN)TRN$ \mathbf{\vec h} = (h_1,h_2,\cdots,h_N)^T\in \mathbb R^N $ 。

    • 网络输入x=(x1,x2,,xV)TRV$ \mathbf{\vec x}=(x_1,x_2,\cdots,x_V)^T \in \mathbb R^V $ ,它是输入单词(即上下文单词)的 one-hote 编码,其中只有一位为 1,其他位都为 0 。

    • 网络输出y=(y1,y2,,yV)TRV$ \mathbf{\vec y}=(y_1,y_2,\cdots,y_V)^T \in \mathbb R^V $ ,它是输出单词为词汇表各单词的概率。

    • 相邻层之间为全连接:

      • 输入层和隐层之间的权重矩阵为WRV×N$ \mathbf W \in \mathbb R^{V\times N} $

      • 隐层和输出层之间的权重矩阵为WRN×V$ \mathbf W^\prime\in \mathbb R^{N\times V} $

  3. 假设没有激活函数,没有偏置项。给定输入xRV$ \mathbf{\vec x} \in \mathbb R^V $ ,则其对应的隐向量hRN$ \mathbf{\vec h}\in \mathbb R^N $ 为:h=WTx$ \mathbf{\vec h}=\mathbf W^T\mathbf{\vec x} $ 。

    令:

    (15)W=[w1Tw2TwVT]

    由于x$ \mathbf{\vec x} $ 是个one-hot编码,假设它为词表V$ \mathbb V $ 中第j$ j $ 个单词wordj$ \text{word}_j $ ,即:

    (16)x1=0,x2=0,,xj1=0,xj=1,xj+1=0,,xV=0

    则有:h=wj$ \mathbf{\vec h}=\mathbf{\vec w}_j $ 。

    即:W$ \mathbf W $ 的第j$ j $ 行wjT$ \mathbf{\vec w}_j ^T $ 就是词表V$ \mathbb V $ 中第j$ j $ 个单词wordj$ \text{word}_j $ 的表达,称作单词wordj$ \text{word}_j $ 的输入向量。

  4. 给定隐向量h$ \mathbf {\vec h} $ ,其对应的输出向量uRV$ \mathbf{\vec u} \in \mathbb R^V $ 为:u=WTh$ \mathbf{\vec u}=\mathbf W^{\prime T}\mathbf{\vec h} $ 。令:

    (17)W=[w1,w2,,wV]

    则有:uj=wjh$ u_j=\mathbf{\vec w}^{\prime}_j\cdot \mathbf{\vec h} $ 。

    • uj$ u_j $ 表示词表V$ \mathbb V $ 中,第j$ j $ 个单词wordj$ \text{word}_j $ 的得分。

    • wj$ \mathbf{\vec w}_j^{\prime } $ 为矩阵W$ \mathbf W^\prime $ 的第j$ j $ 列,称作单词wordj$ \text{word}_j $ 的输出向量。

  5. u$ \mathbf{\vec u} $ 之后接入一层 softmax 层,则有:

    (18)yj=p(wordjx)=exp(uj)j=1Vexp(uj),j=1,2,,V

    yj$ y_j $ 表示词汇表V$ \mathbb V $ 中第j$ j $ 个单词wordj$ \text{word}_j $ 为真实输出单词的概率。

    假设输入单词为wordI$ \text{word}_I $ (它称作上下文) ,观测到它的下一个单词为wordO$ \text{word}_O $ 。令输入单词的对应的网络输入为x$ \mathbf{\vec x} $ ,其隐向量为wI$ \mathbf{\vec w}_I $ ,输入输出单词对应的输出单元为j$ j^* $ ,则采用交叉熵的损失函数为:

    (19)E(wordI,wordO)=logexp(uj)j=1Vexp(uj)=wjh+logj=1Vexp(wjh)=wjwI+logj=1Vexp(wjwI)

    考虑语料库D$ \mathbb D $ 中所有的样本,则整体经验损失函数为:

    (20)L=(wordI,wordO)DE(wordI,wordO)

    则网络的优化目标为:

    (21)minL=minW,W(wordI,wordO)D(wjwI+logj=1Vexp(wjwI))

    设张量A$ \mathbf A $ 为某个网络参数,则有:

    (22)AL=(wordI,wordO)AE

    则该参数的单次更新AAηAL$ \mathbf A \leftarrow \mathbf A -\eta\nabla_{\mathbf A} \mathcal L $ ,可以表示为单个样本的多次更新:

    (23)for(wordI,wordO)D:AAηAE

    因此本节的参数更新推导是关于单个样本的更新:AAηAE$ \mathbf A \leftarrow \mathbf A -\eta\nabla_{\mathbf A} E $ 。

3.1.2 参数更新

  1. 定义tj=I(j=j)$ t_j=\mathbb I(j=j^*) $ ,即第j$ j $ 个输出单元对应于真实的输出单词wordO$ \text{word}_O $ 时,它为1;否则为0。定义:

    (24)ej=Euj=yjtj

    它刻画了每个输出单元的预测误差:

    • j=j$ j=j^* $ 时:ej=yj1<0$ e_j=y_j-1\lt 0 $ ,它刻画了输出概率 (yj$ y_j $ ) 与真实概率1$ 1 $ 之间的差距。小于 0 表示预测不足。

    • jj$ j\ne j^* $ 时:ej=yj>0$ e_j=y_j \gt 0 $ ,它刻画了输出概率 (yj$ y_j $ ) 与真实概率0$ 0 $ 之间的差距。大于 0 表示预测过量。

  2. 根据:uj=wjhujwj=h$ u_j=\mathbf{\vec w}^{\prime}_j\cdot \mathbf{\vec h}\quad \rightarrow \quad \frac{\partial u_j}{\partial \mathbf{\vec w}_j^\prime}= \mathbf{\vec h} $ ,则有:

    (25)Ewj=Euj×ujwj=ejh

    wj$ \mathbf{\vec w}_j^\prime $ 更新规则为:

    (26)wj(new)=wj(old)ηejh

    其物理意义为:

    • 当估计过量 (ej>0yj>tj$ e_j\gt 0 \rightarrow y_j\gt t_j $ ) 时,wj$ \mathbf{\vec w}^{\prime}_{j } $ 会减去一定比例的h$ \mathbf{\vec h} $ 。 这发生在第j$ j $ 个输出单元不对应于真实的输出单词时。

    • 当估计不足 (ej<0yj<tj$ e_j\lt 0 \rightarrow y_j\lt t_j $ ) 时,wj$ \mathbf{\vec w}^{\prime}_{j } $ 会加上一定比例的h$ \mathbf{\vec h} $ 。这发生在第j$ j $ 个输出单元刚好对应于真实的输出单词时。

    • yjtj$ y_j\simeq t_{j} $ 时,更新的幅度将非常微小。

  3. 定义:

    (27)EH=Eh=(uh)TEu

    根据:u=WTh(uh)T=W$ \mathbf{\vec u}=\mathbf W^{\prime T}\mathbf{\vec h} \quad \rightarrow \quad \left(\frac{\partial \mathbf{\vec u}}{\partial \mathbf{\vec h}} \right)^T= \mathbf W^\prime $ ,则有:EH=We=j=1Vejwj$ \mathbf{\overrightarrow {EH}} = \mathbf W^\prime \mathbf{\vec e} =\sum_{j=1}^Ve_j \mathbf{\vec w}^{\prime }_j $ 。

    EH$ \mathbf{\overrightarrow {EH}} $ 的物理意义为:词汇表V$ \mathbb V $ 中所有单词的输出向量的加权和,其权重为ej$ e_j $ 。

  4. 考虑到h=WTx$ \mathbf{\vec h}=\mathbf W^T\mathbf{\vec x} $ ,则有:

    (28)Ewk,i=Ehi×hiwk,i=EHi×xk

    写成矩阵的形式为:EW=xEH$ \frac{\partial E}{\partial \mathbf W}=\mathbf{\vec x}\otimes \mathbf{\overrightarrow {EH}} $ ,其中$ \otimes $ 为克罗内克积。

    由于x$ \mathbf{\vec x} $ 是one-hote 编码,所以它只有一个分量非零,因此EW$ \frac{\partial E}{\partial \mathbf W} $ 只有一行非零,且该非零行就等于EH$ \mathbf{\overrightarrow {EH}} $ 。因此得到更新方程:

    (29)wI(new)=wI(old)ηEH

    其中wI$ \mathbf{\vec w}_I $ 为x$ \mathbf{\vec x} $ 非零分量对应的W$ \mathbf W $ 中的行,而W$ \mathbf W $ 的其它行在本次更新中都保持不变。

  5. 考虑更新W$ \mathbf W $ 第I$ I $ 行的第k$ k $ 列,则:

    (30)wI,k(new)=wI,k(old)ηj=1Vejwj,k
    • yjtj$ y_j\simeq t_{j} $ 时,ej$ e_j $ 趋近于 0 ,则更新的幅度将非常微小。

    • yj$ y_j $ 与tj$ t_{j} $ 差距越大,ej$ e_j $ 绝对值越大, 则更新的幅度越大。

  6. 当给定许多训练样本(每个样本由两个单词组成),上述更新不断进行,更新的效果在不断积累。

    • 根据单词的共现结果,输出向量与输入向量相互作用并达到平衡。

      • 输出向量w$ \mathbf{\vec w}^{\prime} $ 的更新依赖于输入向量wI$ \mathbf{\vec w}_I $ :wj(new)=wj(old)ηejh$ \mathbf{\vec w}^{\prime(new)}_{j } =\mathbf{\vec w}^{\prime(old)}_{j }-\eta e_j\mathbf{\vec h} $ 。

        这里隐向量h$ \mathbf{\vec h} $ 等于输入向量wI$ \mathbf{\vec w}_I $ 。

      • 输入向量wI$ \mathbf{\vec w}_I $ 的更新依赖于输出向量w$ \mathbf{\vec w}^{\prime} $ :wI(new)=wI(old)ηEH$ \mathbf{\vec w}_I^{(new)}=\mathbf{\vec w}_I^{(old)}-\eta\mathbf{\overrightarrow{EH}} $ 。

        这里EH=j=1Vejwj$ \mathbf{\overrightarrow{EH}} = \sum_{j=1}^Ve_j \mathbf{\vec w}^{\prime }_j $ 为词汇表V$ \mathbb V $ 中所有单词的输出向量的加权和,其权重为ej$ e_j $ 。

    • 平衡的速度与效果取决于单词的共现分布,以及学习率。

3.1.3 多个单词上下文

  1. 考虑输入为目标单词前后的多个单词(这些单词作为输出的上下文),输入为C$ C $ 个单词:x1,x2,,xC$ \mathbf{\vec x}_1,\mathbf{\vec x}_2,\cdots,\mathbf{\vec x}_C $ 。对于每个输入单词,其权重矩阵都为W$ \mathbf W $ ,这称作权重共享。这里的权重共享隐含着:每个单词的表达是固定的、唯一的,与它的上下文无关。

    隐向量为所有输入单词映射结果的均值:

    (31)h=1CWT(x1+x2++xC)=1C(wI1+wI2++wIC)

    其中:Ii$ I_i $ 表示第i$ i $ 个输入单词在词汇表V$ \mathbb V $ 中的编号,wj$ \mathbf{\vec w}_j $ 为矩阵W$ \mathbf W $ 的第j$ j $ 行,它是对应输入单词的输入向量。

  2. 假设给定一个单词序列wordI1,wordI2,,wordIC$ \text{word}_{I_1},\text{word}_{I_2},\cdots,\text{word}_{I_C} $ (它称作上下文),观测到它的下一个单词为wordO$ \text{word}_O $ 。wordO$ \text{word}_O $ 对应的网络输出编号为j$ j^* $ 。

    定义损失函数为交叉熵:

    (32)E=uj+logj=1Vexp(uj)=wjh+logj=1Vexp(wjh)

    它的形式与一个单词上下文中推导的完全相同,除了这里的h$ \mathbf{\vec h} $ 不同。

    考虑语料库D$ \mathbb D $ 中所有的样本,则整体经验损失函数为:

    (33)L=(wordI1,wordI2,,wordIC,wordO)DE

    则网络的优化目标为:

    (34)minL=minW,W(wordI1,wordI2,,wordIC,wordO)D(wjwI+logj=1Vexp(wjwI))

    .

  3. 一个单词上下文中推导的结果相同,这里给出参数更新规则:

    • 更新W$ \mathbf W^\prime $ :

      (35)wj(new)=wj(old)ηejh,j=1,2,,V

      其中h=1C(wI1+wI2++wIC)$ \mathbf{\vec h}=\frac 1C (\mathbf{\vec w}_{I_1}+\mathbf{\vec w}_{I_2}+\cdots+\mathbf{\vec w}_{I_C}) $ 。

    • 更新W$ \mathbf W $ :

      (36)wIi(new)=wIi(old)1CηEH,i=1,2,,C

      其中 :

      • EH=We=j=1Vejwj$ \mathbf{\overrightarrow {EH}} = \mathbf W^\prime \mathbf{\vec e} =\sum_{j=1}^Ve_j \mathbf{\vec w}^{\prime }_j $ ,它是词汇表V$ \mathbb V $ 中所有单词的输出向量的加权和,其权重为ej$ e_j $ 。

      • Ii$ I_i $ 为第i$ i $ 个输入单词在词表V$ \mathbb V $ 中的编号。

  4. 在更新W$ \mathbf W $ 时,如果有相同的输入单词(如:x1=x2word100$ \mathbf{\vec x}_1=\mathbf{\vec x}_2 \rightarrow \text{word}_{100} $ ),则在参数更新时认为它们是不同的。最终的效果就是在wIi$ \mathbf{\vec w}_{I_i} $ 中多次减去同一个增量1CηEH$ \frac 1C\eta\mathbf{\overrightarrow{EH}} $ 。

    你也可以直接减去nvCηEH$ \frac {n_v}{C}\eta\mathbf{\overrightarrow{EH}} $ , 其中nv$ n_v $ 为词汇表中单词wordv$ \text{word}_v $ 在输入中出现的次数。

3.2 Skip-Gram

  1. Skip-Gram 模型是根据一个单词来预测其前后附近的几个单词(即:上下文)。

3.2.1 网络结构

  1. Skip-Gram 网络模型如下。其中:

    • 网络输入x=(x1,x2,,xV)TRV$ \mathbf{\vec x}=(x_1,x_2,\cdots,x_V)^T \in \mathbb R^V $ ,它是输入单词的 one-hot 编码,其中只有一位为 1,其他位都为 0 。

    • 网络输出y1,y2,,yC$ \mathbf{\vec y}_1,\mathbf{\vec y}_2,\cdots,\mathbf{\vec y}_C $ ,其中yc=(y1c,y2c,,yVc)TRV$ \mathbf{\vec y}_c =(y_1^c,y_2^c,\cdots,y_V^c)^T \in \mathbb R^V $ 是第c$ c $ 个输出单词为词汇表各单词的概率。

    • 对于网络的每个输出yc$ \mathbf{\vec y}_c $ ,其权重矩阵都相同,为W$ \mathbf W^\prime $ 。这称作权重共享。

      这里的权重共享隐含着:每个单词的输出向量是固定的、唯一的,与其他单词的输出无关。

  2. Skip-Gram 网络模型中,设网络第c$ c $ 个输出的第j$ j $ 个分量为ujc=wjh$ u_{j}^c=\mathbf{\vec w}^{\prime}_j\cdot \mathbf{\vec h} $ ,则有:

    (37)yjc=p(wordjcx)=exp(ujc)k=1Vexp(ukc);c=1,2,,C;j=1,2,,V

    yjc$ y_{j}^c $ 表示第c$ c $ 个输出中,词汇表V$ \mathbb V $ 中第j$ j $ 个单词wordj$ \text{word}_j $ 为真实输出单词的概率。

  3. 因为W$ \mathbf W^\prime $ 在多个单元之间共享,所以对于网络每个输出,其得分的分布uc=(u1c,u2c,,uVc)T$ \mathbf{\vec u}_c=(u_{1}^c,u_{2}^c,\cdots,u_{V}^c)^T $ 是相同的。但是这并不意味着网络的每个输出都是同一个单词。

    并不是网络每个输出中,得分最高的单词为预测单词。因为每个输出中,概率分布都相同,即:y1=y2==yC$ \mathbf{\vec y}_1=\mathbf{\vec y}_2=\cdots=\mathbf{\vec y}_C $ 。Skip-Gram 网络的目标是:网络的多个输出之间的联合概率最大

  4. 假设输入为单词wordI$ \text{word}_I $ ,输出单词序列为wordO1,wordO2,,wordOC$ \text{word}_{O_1},\text{word}_{O_2},\cdots,\text{word}_{O_C} $ 。定义损失函数为:

    (38)E=logp(wordO1,wordO2,,wordOCwordI)=logc=1Cexp(ujcc)j=1Vexp(ujc)

    其中j1,j2,,jC$ j_1^*,j_2^*,\cdots,j_C^* $ 为输出单词序列对应于词典V$ \mathbb V $ 中的下标序列。

    由于网络每个输出的得分的分布都相同,令uj=ujc=wjh$ u_j=u_{j}^c=\mathbf{\vec w}^{\prime}_j\cdot \mathbf{\vec h} $ ,则上式化简为:

    (39)E=c=1Cujcc+Clogj=1Vexp(uj)

    .

3.2.2 参数更新

  1. 定义tjc=I(jc=jc)$ t_{j}^c=\mathbb I(j_c=j_c^*) $ ,即网络第c$ c $ 个输出的第j$ j $ 个分量对应于第c$ c $ 个真实的输出单词wordjc$ \text{word}_{j_c^*} $ 时,它为 1;否则为0。

    定义:

    (40)ejc=Eujc=yjctjc

    它刻画了网络第c$ c $ 个输出的第j$ j $ 个分量的误差:

    • jc=jc$ j_c=j_c^* $ 时:ejc=yjc1$ e_{j}^c=y_{j}^c-1 $ ,它刻画了输出概率yjc$ y_{j}^c $ 与真实概率1$ 1 $ 之间的差距。小于 0 表示预测不足。

    • jcjc$ j_c\ne j_c^* $ 时:ejc=yjc$ e_{j}^c=y_{j}^c $ ,它刻画了输出概率yjc$ y_{j}^c $ 与真实概率0$ 0 $ 之间的差距。大于 0 表示预测过量。

  2. 根据:uj=wjhujwj=h$ u_j=\mathbf{\vec w}^{\prime}_j\cdot \mathbf{\vec h}\quad \rightarrow \quad \frac{\partial u_j}{\partial \mathbf{\vec w}_j^\prime}= \mathbf{\vec h} $ ,则有:

    (41)Ewj=c=1CEujc×ujcwj=c=1Cejch

    定义EIj=c=1Cejc$ EI_j=\sum_{c=1}^{C}e_{j}^c $ ,它为网络每个输出的第j$ j $ 个分量的误差之和。于是有:

    (42)Ewj=EIj×h

    则有更新方程:

    (43)wj(new)=wj(old)η×EIj×h,j=1,2,,V
  3. 定义:

    (44)EH=Eh=c=1C(uch)TEuc

    根据:

    (45)uc=WTh(uch)T=W

    则有:

    (46)EH=c=1CWec=j=1VEIjwj

    EH$ \mathbf{\overrightarrow {EH}} $ 的物理意义为:词汇表V$ \mathbb V $ 中所有单词的输出向量的加权和,其权重为EIj$ EI_j $ 。

  4. 考虑到h=WTx$ \mathbf{\vec h}=\mathbf W^T\mathbf{\vec x} $ ,则有:

    (47)Ewk,i=Ehi×hiwk,i=EHi×xk

    写成矩阵的形式为:EW=xEH$ \frac{\partial E}{\partial \mathbf W}=\mathbf{\vec x}\otimes \mathbf{\overrightarrow {EH}} $ ,其中$ \otimes $ 为克罗内克积。

    由于x$ \mathbf{\vec x} $ 是one-hote 编码,所以它只有一个分量非零,因此EW$ \frac{\partial E}{\partial \mathbf W} $ 只有一行非零,且该非零行就等于EH$ \mathbf{\overrightarrow {EH}} $ 。因此得到更新方程:

    (48)wI(new)=wI(old)ηEH

    其中wI$ \mathbf{\vec w}_I $ 为x$ \mathbf{\vec x} $ 非零分量对应的W$ \mathbf W $ 中的行,而W$ \mathbf W $ 的其它行在本次更新中都保持不变。

3.3 优化

  1. 原始的CBOW 模型和Skip-Gram 模型的计算量太大,非常难以计算。

    • 模型在计算网络输出的时候,需要计算误差 。对于CBOW 模型,需要计算V$ V $ 个误差(词汇表的大小),对于 Skip-Gram 模型,需要计算C×V$ C \times V $ 个误差。

      另外,每个误差的计算需要用到 softmax 函数,该 softmax 函数涉及到O(V)$ O(V) $ 复杂度的运算:j=1Vexp(uj)$ \sum_{j=1}^V \exp (u_j) $ 。

    • 每次梯度更新都需要计算网络输出。

    如果词汇表有 100万 单词,模型迭代 100 次,则计算量超过 1 亿次。

  2. 虽然输入向量的维度也很高,但是由于输入向量只有一位为 1,其它位均为 0,因此输入的总体计算复杂度较小。

  3. word2vec 优化的主要思想是:限制输出单元的数量。

    事实上在上百万的输出单元中,仅有少量的输出单元对于参数更新比较重要,大部分的输出单元对于参数更新没有贡献。

  4. 有两种优化策略:

    • 通过分层 softmax 来高效计算 softmax 函数。

    • 通过负采样来缩减输出单元的数量。

3.3.1 分层 softmax

  1. 分层 softmax 是一种高效计算 softmax 函数的算法。

    经过分层 softmax 之后,计算 softmax 函数的算法复杂度从O(V)$ O(V) $ 降低到O(logV)$ O(\log V) $ ,但是仍然要计算V1$ V-1 $ 个内部节点的向量表达 。

a) 网络结构

  1. 在分层softmax 中,字典V$ \mathbb V $ 中的V$ V $ 个单词被组织成二叉树。

    • 叶子结点值为某个具体单词的概率(如下图中的白色结点)

    • 中间节点值也代表一个概率(如下图中的灰色结点)。它的值等于直系子节点的值之和,也等于后继的叶子结点值之和,也等于从根节点到当前节点的路径的权重的乘积。

      之所以有这些性质,是由于结点值、权重都是概率,满足和为1的性质

    • 根据定义,根节点的值等于所有叶子结点的值之和,即为 1.0

    • 二叉树的每条边代表分裂:

      • 向左的边:表示选择左子节点,边的权重为选择左子节点的概率

      • 向右的边:表示选择右子节点,边的权重为选择右子节点的概率

  2. 对于任意一个中间节点t$ t $ , 假设其向量表达为vt$ \mathbf{\vec v}_t^\prime $ ,它是待求的参数。

    • 选择左子节点的概率为:

      (49)p(t,left)=σ(vth)σ(x)=11+ex,σ(x)=1σ(x)
    • 选择右子节点的概率为 :

      (50)p(t,right)=1σ(vth)=σ(vth)
    • 如果求得所有中间节点的向量表达,则根据每个中间节点的分裂概率,可以很容易的求得每个叶节点的值。

  3. 在分层softmax 中,算法并不直接求解输出向量{w1,w2,,wV}$ \{\mathbf{\vec w}_1^\prime,\mathbf{\vec w}_2^\prime,\cdots,\mathbf{\vec w}_V^\prime\} $ ,而是求解二叉树的V1$ V-1 $ 个中间节点的向量表达 。

    当需要计算某个单词的概率时,只需要记录从根节点到该单词叶子结点的路径。给定单词w$ w $ :

    • 定义n(w,j)$ n(w,j) $ 为从根节点到单词w$ w $ 的路径的第j$ j $ 个节点(从 1 计数)。

    • 定义L(w)$ L(w) $ 为从根节点到单词w$ w $ 的路径的长度。

    • 定义ch(t)$ ch(t) $ 表示节点t$ t $ 的左子节点。

    输出为单词w$ w $ 的概率为:

    (51)p(w)=j=1L(w)1σ(g(n(w,j+1)=ch(n(w,j)))×vn(w,j)h)

    其中:

    • n(w,j+1)=ch(n(w,j))$ n(w,j+1)=ch(n(w,j)) $ 表示:从根节点到单词w$ w $ 的路径上,第j+1$ j+1 $ 个节点是第j$ j $ 个节点的左子节点。

    • g(x)$ g(x) $ 是一个函数。当x$ x $ 是个事实时,其值为 1;当x$ x $ 不成立时,其值为 -1。

      (52)g(x)={1,ifxis true1,ifxis false
    • g(n(w,j+1)=ch(n(w,j)))$ g(n(w,j+1)=ch(n(w,j))) $ 表示:从根节点到单词w$ w $ 的路径上:

      • 当第j+1$ j+1 $ 个节点是第j$ j $ 个节点的左子节点时,函数值为 1

      • 当第j+1$ j+1 $ 个节点是第j$ j $ 个节点的右子节点时,函数值为 -1

    • vn(w,j)$ \mathbf{\vec v}^\prime_{n(w,j)} $ 表示:从根节点到单词w$ w $ 的路径上,第j$ j $ 个节点的向量表达

    • 对于从根节点到单词w$ w $ 的路径上,从第j$ j $ 个节点到第j+1$ j+1 $ 个节点的概率为:

      (53)p(j,j+1)={σ(vn(w,j)h),ifj+1is left child ofjσ(vn(w,j)h),ifj+1is right child ofj

      因此p(w)$ p(w) $ 刻画了:从根节点到单词w$ w $ 的路径上,每条边的权重(也就是分裂概率)的乘积。

  4. 对于所有的叶子节点,有i=1Vp(wi)=1$ \sum_{i=1}^Vp(w_i)=1 $ 。

    利用数学归纳法,可以证明:左子节点的值+右子节点的值=父节点的值。上式最终证明等于根节点的值,也就是 1.0 。

b) 参数更新

  1. 为了便于讨论,这里使用CBOW一个单词上下文模型。

    g(n(w,j+1)=ch(n(w,j)))$ g(n(w,j+1)=ch(n(w,j))) $ 为gn(w,j)$ g_{n(w,j)} $ , 定义损失函数对数似然:

    (54)E=logp(wx)=j=1L(w)1logσ(gn(w,j)vn(w,j)h)

    则有:

    (55)E(vn(w,j)h)=(σ(gn(w,j)vn(w,j)h)1)gn(w,j)={σ(vn(w,j)h)1ifgn(w,j)=1σ(vn(w,j)h)ifgn(w,j)=1=σ(vn(w,j)h)tn(w,j)

    其中:

    (56)tn(w,j)={1,if nodej+1at path , rootw, is left child of nodej0,if nodej+1at path , rootw, is right child of nodej

    定义:

    (57)en(w,j)=E(vn(w,j)h)=σ(vn(w,j)h)tn(w,j)
    • σ(vn(w,j)h)$ \sigma(\mathbf{\vec v}^\prime_{n(w,j)}\cdot \mathbf{\vec h}) $ 为预测选择j$ j $ 的左子节点的概率。

    • en(w,j)$ e_{n(w,j)} $ 的物理意义为:从根节点到单词w$ w $ 的路径上,第j$ j $ 个节点的选择误差:

      • 如果下一个节点选择第j$ j $ 个节点的左子节点,则tn(w,j)=1$ t_{n(w,j)}=1 $ , 此时en(w,j)$ e_{n(w,j)} $ 表示预测的不足。

      • 如果下一个节点选择第j$ j $ 个节点的右子节点,则tn(w,j)=0$ t_{n(w,j)}= 0 $ , 此时en(w,j)$ e_{n(w,j)} $ 表示预测的过量。

  2. 考虑内部节点n(w,j)$ n(w,j) $ ,其向量表达为vn(w,j)$ \mathbf{\vec v}^\prime_{n(w,j)} $ 。则有:

    (58)Evn(w,j)=E(vn(w,j)h)×(vn(w,j)h)vn(w,j)=en(w,j)×h

    得到向量表达为vn(w,j)$ \mathbf{\vec v}^\prime_{n(w,j)} $ 的更新方程:

    (59)vn(w,j)(new)=vn(w,j)(old)η×en(w,j)×h;j=1,2,,L(w)1
    • 对于每个单词w$ w $ ,由于它是叶节点,因此可以更新L(w)1$ L(w)-1 $ 个内部节点的向量表达。

    • 当模型的预测概率较准确,即σ(vn(w,j)h)tn(w,j)$ \sigma(\mathbf{\vec v}^\prime_{n(w,j)}\cdot \mathbf{\vec h}) \simeq t_{n(w,j)} $ 时,则en(w,j)$ e_{n(w,j)} $ 接近0 。此时梯度非常小,vn(w,j)$ \mathbf{\vec v}^\prime_{n(w,j)} $ 的更新幅度也会非常小。

      当模型的预测概率较不准,则en(w,j)$ e_{n(w,j)} $ 较大。此时梯度会较大,vn(w,j)$ \mathbf{\vec v}^\prime_{n(w,j)} $ 的更新幅度也会较大。

  3. 对于内部结点的向量表达vn(w,j)$ \mathbf{\vec v}^\prime_{n(w,j)} $ 的更新方程适用于 CBOW 模型和 Skip-Gram 模型。但是在 Skip-Gram 模型中,需要对C$ C $ 个输出的每一个单词进行更新。

  4. CBOW 输入参数更新:对于 CBOW 模型,定义:

    (60)EH=Eh=j=1L(w)1E(vn(w,j)h)×(vn(w,j)h)h=j=1L(w)1en(w,j)vn(w,j)

    EH$ \mathbf{\overrightarrow {EH}} $ 的物理意义为:二叉树中所有内部节点向量表达的加权和,其权重为en(w,j)$ e_{n(w,j)} $ 。

    考虑到h=1CWT(x1+x2++xC)$ \mathbf{\vec h}=\frac 1C \mathbf W^T(\mathbf{\vec x}_1+\mathbf{\vec x}_2+\cdots+\mathbf{\vec x}_C) $ ,则有:

    (61)Ewk,i=Ehi×hiwk,i=1CEHi×(x(1,k)+x(2,k)+,+x(C,k))

    写成矩阵的形式为:EW=1Cc=1CxcEH$ \frac{\partial E}{\partial \mathbf W}= \frac 1C \sum_{c=1}^C\mathbf{\vec x}_c\otimes \mathbf{\overrightarrow {EH}} $ ,其中$ \otimes $ 为克罗内克积。

    W$ \mathbf W $ 的更新分解为C$ C $ 次,每次对应于一个输入xc$ \mathbf{\vec x}_c $ 。因此得到W$ \mathbf W $ 的更新方程:

    (62)wIi(new)=wIi(old)1CηEH,i=1,2,,C

    其中Ii$ I_i $ 为第i$ i $ 个输入单词在词表V$ \mathbb V $ 中的编号。

  5. Skip-Gram 输入参数更新:对于 Skip-Gram 模型,定义:

    (63)EH=Eh=c=1Cj=1L(wc)1E(vn(wc,j)h)×(vn(wc,j)h)h=c=1Cj=1L(wc)1en(wc,j)×vn(wc,j)

    其中:wc$ w_c $ 表示网络第c$ c $ 个输出的输出单词。

    注意:由于引入分层softmax,导致更新路径因为输出单词的不同而不同。因此j=1L(wc)1$ \sum_{j=1}^{L(w_c)-1} $ 会因为c$ c $ 的不同而不同。

    Skip-Gram 中推导相同,W$ \mathbf W $ 的更新方程为:

    (64)wI(new)=wI(old)ηEH

    其中wI$ \mathbf{\vec w}_I $ 为x$ \mathbf{\vec x} $ 非零分量对应的W$ \mathbf W $ 中的行,而W$ \mathbf W $ 的其它行在本次更新中都保持不变。

3.3.2 负采样

a) 原理

  1. 在网络的输出层,真实的输出单词对应的输出单元作为正向单元,其它所有单词对应的输出单元为负向单元。

    • 正向单元的数量为 1,毋庸置疑,正向单元必须输出。

    • 负向单元的数量为V1$ V-1 $ ,其中V$ V $ 为词表的大小,通常为上万甚至百万级别。如果计算所有负向单元的输出概率,则计算量非常庞大。

      可以从所有负向单元中随机采样一批负向单元,仅仅利用这批负向单元来更新。这称作负采样。

  2. 负采样的核心思想是:利用负采样后的输出分布来模拟真实的输出分布。

    对于真实的输出分布,有:

    (65)yj=p(wordjx)=exp(uj)j=1Vexp(uj),j=1,2,,V

    对于负采样后的输出分布,假设真实输出单词wO$ w_O $ 对应于输出单元j$ j^* $ ,负采样的K$ K $ 个单词对应的输出单元Wneg={jneg1,,jnegK}$ \mathcal W_{neg}=\{j_{neg_1},\cdots,j_{neg_K}\} $ ,则有:

    (66)y^j=p^(wordjx)={exp(uj)j{j,jneg1,,jnegK}exp(uj),j{j,jneg1,,jnegK}0,j{j,jneg1,,jnegK}
    • 在参数的每一轮更新中,负采样实际上只需要用到一部分单词的输出概率。

    • 对于未被采样到的负向单元j$ j $ ,其输出单元的预测误差ej=0$ e_j = 0 $ , 则wj$ \mathbf{\vec w}^{\prime}_j $ 不会被更新。

    • EH=We=j=1Vejwj$ \mathbf{\overrightarrow {EH}} = \mathbf W^\prime \mathbf{\vec e} =\sum_{j=1}^Ve_j \mathbf{\vec w}^{\prime }_j $ 中仅有负采样的单元jneg1,,jnegK$ j_{neg_1},\cdots,j_{neg_K} $ 起作用,因此wI(new)$ \mathbf{\vec w}_I^{(new)} $ 的更新仅仅依赖于正向单元和负采样的单元。

    • 随着训练的推进,概率分布{y1,y2,,yV}$ \{y_1,y_2,\cdots,y_V\} $ 逐渐接近于真实的分布{0,,0,1,0,,0}$ \{0,\cdots,0,1, 0,\cdots,0\} $ (第j$ j^* $ 位为 1),其绝大部分概率接近 0 、yj$ y_{j^*} $ 接近 1 。

      而概率分布{y^1,,y^V}$ \{\hat y_1,\cdots,\hat y_V\} $ 也有类似的性质,因此用概率分布{y^1,,y^V}$ \{\hat y_1,\cdots,\hat y_V\} $ 去模拟概率分布{y1,y2,,yV}$ \{y_1,y_2,\cdots,y_V\} $ 效果较好。

  3. 负采样时,每个负向单元是保留还是丢弃是随机的。负向单元采样的概率分布称作noise 分布,记做Pn(w)$ P_n(w) $ 。

    Pn(w)$ P_n(w) $ 可以为任意的概率分布(通常需要根据经验来选择)。谷歌给出的建议是挑选 5~10 个负向单元,根据下面公式来采样:

    (67)Pn(w)=freq(w)3/4wjfreq(w)3/4

    其中:freq(w)$ freq(w) $ 为单词在语料库中出现的概率,分母仅考虑负向单元(不考虑正向单元)。

    Pn(w)$ P_n(w) $ 的物理意义为:单词在语料库中出现的概率越大,则越可能被挑中。

b) 参数更新

  1. 假设输出的单词分类两类:

    • 正类:只有一个,即真实的输出单词wO$ w_O $

    • 负类:从Pn(w)$ P_n(w) $ 采样得到的K$ K $ 个单词Wneg={jneg1,,jnegK}$ \mathcal W_{neg}=\{j_{neg_1},\cdots,j_{neg_K}\} $

    论文word2vec Explained: Deriving Mikolov et al.’s Negative-Sampling Word-Embedding Method 的作者指出:下面的训练目标能够得到更好的结果:

    (68)E=logσ(wwOh)jWneglogσ(wjh)

    其中:

    • wwO$ \mathbf{\vec w^\prime}_{w_O} $ 为真实的输出单词对应的输出向量,wj$ \mathbf{\vec w^\prime}_j $ 为负采样的单词得到的输出向量。

    • σ(wwOh)$ \sigma(\mathbf{\vec w^\prime}_{w_O}\cdot \mathbf{\vec h}) $ :在单词wO$ w_O $ 上输出为正类的概率;σ(wjh)$ \sigma(-\mathbf{\vec w^\prime}_{j}\cdot \mathbf{\vec h}) $ :在单词j$ j $ 上输出为负类的概率。

    该目标函数是一个经验公式,而不是采用理论上的交叉熵logexp(wwOh)j=1Vexp(wjh)$ -\log \frac{\exp(\mathbf{\vec w^\prime}_{w_O}\cdot \mathbf{\vec h})}{\sum_{j^\prime=1}^V \exp(\mathbf{\vec w^\prime}_{{j^\prime}}\cdot \mathbf{\vec h})} $ 。其物理意义为:在正类单词上取正类的概率尽可能大,在负类单词上取负类的概率尽可能大。

    它是从另一个角度考虑:输出为正向单元的概率 * 输出为负向单元的概率。

    (69)σ(wwOh)jwOσ(wjh)

    其负的对数似然为:

    (70)log(σ(wwOh)jwOσ(wjh))=logσ(wwOh)jwOlogσ(wjh)

    仅仅考虑负采样,则可得到:E=logσ(wwOh)jWneglogσ(wjh)$ E=-\log\sigma(\mathbf{\vec w^\prime}_{w_O}\cdot \mathbf{\vec h})-\sum_{j\in \mathcal W_{neg}}\log\sigma(-\mathbf{\vec w^\prime}_j\cdot \mathbf{\vec h}) $ 。

  2. 根据E$ E $ 的定义,有:

    (71)E(wjh)={σ(wjh)1,ifj=wOσ(wjh),ifjWneg=σ(wjh)tj

    其中tj$ t_j $ 标记了单词j$ j $ 的标签:

    (72)tj={1,ifj=wO0,esle
  3. ej=σ(wjh)tj$ e_{j} = \sigma(\mathbf{\vec w}^\prime_{j}\cdot \mathbf{\vec h})-t_j $ ,它刻画了网络在正类单词和负类单词上的预测误差。

    • j=wO$ j =w_O $ 时,ej$ e_{j} $ 表示对正类单词预测概率的不足。

    • jWneg$ j \in \mathcal W_{neg} $ 时,ej$ e_{j} $ 表示对负类单词预测概率的过量。

    根据:

    (73)Ewj=E(wjh)×(wjh)wwj=ej×h

    则有输出向量的更新方程:

    (74)wj(new)=wj(old)η×ej×h
  4. 给定一个样本,在更新输出向量时,只有K+1$ K+1 $ 个输出向量( 1 个输出单词wO$ w_O $ 、K$ K $ 个负采样单词对应的输出向量)得到更新,其中K$ K $ 通常数量很小。其它所有单词对应的输出向量未能得到更新。

    相比较而言:

    • 原始算法中,给定一个样本在更新输出向量时,所有输出向量(一共V$ V $ 个)都得到更新

    • 分层softmax 算法中,给定一个样本在更新输出向量时,L(w)1$ L(w)-1 $ 个内部节点的向量表达得到更新。

  5. 输出向量的更新方程可以用于CBOW 模型和 Skip-Gram 模型。

    若用于Skip-Gram 模型,则对每个输出依次执行输出向量的更新。

  6. CBOW 输入向量参数更新:对于 CBOW 模型,定义:

    (75)EH=Eh=j{wO}WnegE(wjh)×(wjh)h=j{wO}Wnegej×wj

    EH$ \mathbf{\overrightarrow {EH}} $ 的物理意义为:负采样单词、输出单词对应输出向量的加权和,其权重为ej$ e_{j} $ 。

    分层softmax: CBOW 输入向量参数更新 中的推导相同,W$ \mathbf W $ 的更新方程为:

    (76)wIi(new)=wIi(old)1CηEH,i=1,2,,C

    其中Ii$ I_i $ 为第i$ i $ 个输入单词在词表V$ \mathbb V $ 中的编号。

  7. Skip-Gram 输入向量参数更新:对于 Skip-Gram 模型,定义:

    (77)EH=Eh=c=1Cj{wOc}WnegcE(wjh)×(wjh)h=c=1Cj{wOc}Wnegcej×wj

    其中:wOc$ w_O^c $ 表示网络第c$ c $ 个输出的输出单词,Wnegc$ \mathcal W_{neg}^c $ 表示网络第c$ c $ 个输出的负采样单词集。

    注意:由于引入负采样,导致网络每个输出中,对应的输出单词有所不同,负采样单词也有所不同。因此{wOc}Wnegc$ \{w_O^c\}\bigcup \mathcal W_{neg}^c $ 会因为c$ c $ 的不同而不同。

    Skip-Gram 中推导相同,W$ \mathbf W $ 的更新方程为:

    (78)wI(new)=wI(old)ηEH

    其中wI$ \mathbf{\vec w}_I $ 为x$ \mathbf{\vec x} $ 非零分量对应的W$ \mathbf W $ 中的行,而W$ \mathbf W $ 的其它行在本次更新中都保持不变。

3.3.3 降采样

  1. 对于一些常见单词,比如 the,我们可以在语料库中随机删除它。这有两个原因(假设使用 CBOW ):

    • the 出现在上下文时,该单词并不会为目标词提供多少语义上的信息。

    • the 作为目标词时,该单词从语义上本身并没有多大意义,因此没必要频繁更新。

    降采样过程中,单词w$ w $ 被保留的概率为:

    Error: '_' allowed only in math mode

    其中z(w)$ z(w) $ 为单词w$ w $ 在语料库中出现的概率,Error: '_' allowed only in math mode$ \text{subsampling_rate} $ 为降采样率(默认为 0.001)。

    可以看到:随着单词在语料库中出现的词频越来越大,该单词保留的概率越来越低。

3.4 subword embedding

  1. 论文 《Enriching Word Vectors with Subword Information》 中,作者提出通过增加字符级信息来训练词向量。

    下图给出了该方法在维基百科上训练的词向量在相似度计算任务上的表现(由人工评估模型召回的结果)。sisg-sisg 模型均采用了 subword embedding,区别是:对于未登录词,sisg- 采用零向量来填充,而 sisg 采用 character n-gram embedding 来填充。

  2. 单词拆分:每个单词表示为一组 character n-gram 字符(不考虑顺序),以单词 wheren=3 为例:

    • 首先增加特殊的边界字符 < (单词的左边界)和 > (单词的右边界)。

    • 然后拆分出一组 character n-gram 字符:<wh, whe,her,ere,re>

    • 最后增加单词本身:<where>

    为了尽可能得到多样性的 character n-gram 字符,作者抽取了所有 3<= n <= 6character n-gram 。以单词 mistake 为例:

    
    <mi,mis,ist,sta,tak,ake,ke>,   // n = 3
    <mis,mist,ista,stak,take,ake>, // n = 4
    <mist,mista,istak,stake,take>, // n = 5
    <mista,mistak,istake,stake>,   // n = 6
    <mistake>                      // 单词本身

    注意:这里的 take<take> 不同。前者是某个character n-gram,后者是一个单词。

  3. 一旦拆分出单词,则:

    • 词典V$ \mathbb V $ 扩充为包含所有单词和 N-gram 字符。

    • 网络输入包含单词本身以及该单词的所有 character n-gram ,网络输出仍然保持为单词本身。

    模型采用 word2vec ,训练得到每个character n-gram embedding 。最终单词的词向量是其所有 character n-gram embedding包括其本身 embedding 的和(或者均值)。

    如:单词 where 的词向量来自于下面embedding 之和:

    • 单词 <where> 本身的词向量。

    • 一组 character n-gram 字符 <wh, whe,her,ere,re> 的词向量。

  4. 利用字符级信息训练词向量有两个优势:

    • 有利于低频词的训练。

      低频词因为词频较低,所以训练不充分。但是低频词包含的 character n-gram 可能包含某些特殊含义并且得到了充分的训练,因此有助于提升低频词的词向量的表达能力。

    • 有利于获取 OOV 单词(未登录词:不在词汇表中的单词)的词向量。

      对于不在词汇表中的单词,可以利用其 character n-gramembedding 来获取词向量。

3.5 应用

  1. 模型、语料库、超参数这三个方面都会影响词向量的训练,其中语料库对训练结果的好坏影响最大。

    根据论文 How to Generate a Good Word Embedding? ,作者给出以下建议:

    • 模型选择:所有的词向量都是基于分布式分布假说:拥有相似上下文的单词,其词义相似。根据目标词和上下文的关系,模型可以分为两类:

      • 通过上下文来预测目标词。这类模型更能够捕获单词之间的可替代关系。

      • 通过目标词来预测上下文。

      通过实验发现:简单的模型(Skip-Gram) 在小语料库下表现较好。复杂的模型在大语料库下略有优势。

    • 语料库:实际上语料库并不是越大越好,语料库的领域更重要。

      • 选择了合适的领域,可能只需要 1/10 甚至 1/100 的语料就能够得到一个大的、泛领域语料库的效果。

      • 如果选择不合适的领域,甚至会导致负面效果,比随机词向量效果还差。

    • 超参数:

      • 词向量的维度:

        • 做词向量语义分析任务时,一般维度越大,效果越好。

        • 做具体NLP 任务时(用作输入特征、或者网络初始化),50 维之后效果提升就比较少了。

      • 迭代次数:由于训练词向量的目标是尽可能精确地预测目标词,这个优化目标和实际任务并不一致。因此最好的做法是:直接用实际任务的验证集来挑选迭代次数。

        如果实际任务非常耗时,则可以随机挑选某个简单任务(如:情感分类)及其验证集来挑选迭代次数。

  2. word2vec 还有一些重要的超参数:

    • 窗口大小:该超参数通常和语料库中句子长度有关,可以统计句子长度分布来设置。

    • min-count:最小词频训练阈值,词频低于该阈值的词被过滤。

    • 降采样率 subsampling_rate:降采样率越低,高频词保留的越少低频词保留的越多。

  3. word2vec 结果评估:

    • 通过 kmeans 聚类,查看聚类的簇分布。

    • 通过词向量计算单词之间的相似度,查看相似词。

    • 通过类比来查看类比词:a 之于 b,等价于 c 之于 d

    • 使用 tsne 降维可视化查看词的分布。

  4. word2vec 中实际上存在两种类型的embedding 向量:WRV×N$ \mathbf W \in \mathbb R^{V\times N} $ 的第j$ j $ 行wjT$ \mathbf{\vec w}_j ^T $ 称作单词wordj$ \text{word}_j $ 的输入向量,WRN×V$ \mathbf W^\prime \in \mathbb R^{N\times V} $ 的第j$ j $ 列wj$ \mathbf{\vec w}_j^{\prime } $ 称作单词wordj$ \text{word}_j $ 的输出向量。

    大多数论文中都采用输入向量wj$ \mathbf{\vec w}_j $ 作为单词wordj$ \text{word}_j $ 的表达,而论文 Using the Output Embedding to Improve Language Models 综合了输入向量和输出向量。在该论文中,作者得出结论:

    • skip-gram 模型中,在常见的衡量词向量的指标上,输出向量略微弱于输入向量。

    • 在基于 RNN 的语言模型中,输出向量反而强于输入向量。

    • 通过强制要求WT=W$ \mathbf W^T = \mathbf W^\prime $ ,这可以使得输入向量等于输出向量。这种方式得到的词向量能够提升语言模型的困惑度perplexity

  5. word2vec 可以用于计算句子相似度。博客 Comparing Sentence Similarity Methods 总结了 6 种计算句子相似度的方法:

    • 无监督方法:

      • 对句子中所有的词的词向量求平均,获得sentence embedding

      • 对句子中所有的词的词向量加权平均,每个词的权重为 tf-idf ,获得sentence embedding

      • 对句子中所有的词的词向量加权平均,每个词的权重为 smooth inverse frequency:SIF ;然后考虑所有的句子,并执行主成分分析;最后对每个句子的词向量加权平均减去first principal componet,获得sentence embedding

        SIF 定义为:aa+p(w)$ \frac{a}{a+p(w)} $ ,其中a$ a $ 是一个超参数(通常取值为 0.001),p(w)$ p(w) $ 为数据集中单词w$ w $ 的词频。

      • 通过 Word Mover's Distance:WMD ,直接度量句子之间的相似度。

        WMD 使用两个句子中单词的词向量来衡量一个句子中的单词需要在语义空间中移动到另一个句子中的单词的最小距离。

    • 有监督方法:

      • 通过分类任务来训练一个文本分类器,取最后一个 hidden layer 的输出作为 sentence embedding

        其实这就是使用文本分类器的前几层作为 encoder

      • 直接训练一对句子的相似性,其优点是可以直接得到 sentence embeding

    最终结论是:简单加权的词向量平均已经可以作为一个较好的 baseline

3.6 SGNS vs 矩阵分解

  1. 论文 《NeuralWord Embedding as Implicit Matrix Factorization》 证明了带负采样的 SkipGram 模型 skip-gram with negative-sampling:SGNS 等价于隐式的矩阵分解。

  2. 给定语料库C={w1,w2,,wN},wiV$ \mathbb C = \{w_1,w_2,\cdots,w_N\},w_i \in \mathbb V $ 。对于单词wi$ w_i $ ,将其右侧两侧距离为L$ L $ 范围内单词cjNwi={wiL,,wi1,wi+1,,wi+L}$ c_j \in \mathcal N_{w_i} = \{ w_{i-L},\cdots,w_{i-1},w_{i+1},\cdots,w_{i+L}\} $ 作为上下文。定义:

    • 定义D={(wi,cj)wiC,cjNwi}$ \mathbb D = \{(w_i,c_j)\mid w_i \in \mathbf C,c_j\in \mathcal N_{w_i} \} $ 为所有观察到的 word-context 组合。

    • 定义VC={cjwiC,cjNwi}$ \mathbb V_C = \{ c_j \mid w_i \in \mathbf C,c_j\in \mathcal N_{w_i} \} $ 为所有 context 单词的词汇表,通常有VC=V$ \mathbb V_C = \mathbb V $ 。

    • 定义n(w,c)$ n(w,c) $ 为给定 word-context 组合在D$ \mathbb D $ 中出现的次数,n(w)$ n(w) $ 为单词wV$ w\in \mathbb V $ 在D$ \mathbb D $ 中出现的次数,n(c)$ n(c) $ 为上下文cVC$ c\in \mathbb V_C $ 在D$ \mathbb D $ 中出现的次数。

      其中:

      (79)n(w)=cVcn(w,c),n(c)=wVn(w,c)|D|=wV,cVcn(w,c)=wVn(w)=cVcn(c)
    • 定义单词wordi$ \text{word}_i $ 作为current wordembedding 向量为wiRd$ \mathbf{\vec w}_i\in \mathbb R^d $ ,作为contextembedding 向量为wiRd$ \mathbf{\vec w}_i^\prime\in \mathbb R^d $ 。

      定义单词的 representation 矩阵为WRV×d$ \mathbf W\in \mathbb R^{ V \times d} $ ,其每一行代表词汇表V$ \mathbb V $ 中每个单词的embeddign 向量。

      定义上下文的 representation 矩阵为WR|VC|×d$ \mathbf W^\prime \in \mathbb R^{ |\mathbb V_C| \times d} $ ,其每一行代表词汇表VC$ \mathbb V_C $ 中每个单词作为上下文时的embeddign 向量。

    给定一对 word-context(w,c)$ (w,c) $ ,假设单词w$ w $ 作为 current wordembeddingww$ \mathbf{\vec w}_w $ ,上下文c$ c $ 作为contextembeddingwc$ \mathbf{\vec w}_c^\prime $ 。定义(w,c)$ (w,c) $ 被观察到(即 postive )的概率为:

    (80)p(D=1w,c)=σ(wwwc)=11+exp(wwwc)

    其中ww,wc$ \mathbf{\vec w}_w,\mathbf{\vec w}_c^\prime $ 为模型需要学习的参数。

    SGNS 最大化观察到的 word-context 组合、最小化未观察到的 word-context 组合。由于D$ \mathbb D $ 中所有的 word-context 组合都是观察到的,属于postive 样本,因此SGNS 需要通过随机采样一些 word-context 作为负样本。这就是负采样名称的由来。

    • 理论而言只有随机采样的、未观察到的 word-context 才能作为负样本。这里直接使用随机采样的结果作为负样本有两个原因:

      • 便于理论上推导。但是二者并不影响 SGNS 等价于矩阵分解的性质。

      • 由于V×VC$ \mathbb V\times \mathbb V_C $ 的空间巨大,观察到的 word-context 集合仅仅占据很小的部分,因此采样得到的 word-context 组合是未观察到的概率几乎为 1

    • 理论而言未观察到的 word-context 组合不一定是负样本,某些word-context 组合是合理的,只是它们从未在语料库中出现过。

    对于每一对观察到的 word-context 组合(w,c)$ (w,c) $ ,SGNS 的损失函数为:

    (81)l(w,c)=logσ(wwwc)+k×EcNPD[logσ(wwwcN)]

    其中k$ k $ 为负采样的数量,cN$ c_N $ 为给定 current wordw$ w $ 进行负采样的上下文。PD$ P_D $ 为负采样中上下文的分布,有两种常见的分布:

    • 非均匀分布:

      (82)pD(c)=n(c)3/4cVCn(c)3/4

      这和前面介绍的一致。

    • 均匀分布:

      (83)pD(c)=n(c)|D|

      虽然非均匀分布在某些任务上能够产生更好的结果,但是这里采用均匀分布从而得到更好的理论推导。另外,二者并不影响 SGNS 等价于矩阵分解的性质。

    最终得到 SGNS 总的损失函数为:

    (84)L=(w,c)Dl(w,c)=wVcVCn(w,c)(logσ(wwwc)+k×EcNPD[logσ(wwwcN)])
  3. SGNS 的优化目标使得:

    • 观察到的 word-context(w,c)$ (w,c) $ 具有相似的 embedding,即p(D=1w,c)=logσ(wwwc)$ p(D=1 \mid w,c) = \log\sigma(\mathbf{\vec w}_w\cdot\mathbf{\vec w}_c^\prime) $ 较大。

    • 未观察到的 word-context(w,cN)$ (w,c_N) $ 具有不相似的 embedding,即p(D=1w,cN)=logσ(wwwcN)$ p(D=1 \mid w,c_N) = \log\sigma(\mathbf{\vec w}_w\cdot\mathbf{\vec w}_{c_N}^\prime) $ 较小。

  4. PD$ P_D $ 采用均匀分布时有:

    (85)EcNPD[logσ(wwwcN)]=cNVCn(cN)|D|logσ(wwwcN)

    因此有:

    (86)L=(w,c)Dl(w,c)=wVcVCn(w,c)(logσ(wwwc))+wVn(w)(k×EcNPD[logσ(wwwcN)])=wVcVCn(w,c)(logσ(wwwc))+wVcNVCn(w)(k×n(cN)|D|logσ(wwwcN))=wVcVC(n(w,c)logσ(wwwc)+k×n(w)n(c)|D|logσ(wwwc))

    因此样本空间V×VC$ \mathbb V\times \mathbb V_C $ 中每一对 word-context 组合(w,c)$ (w,c) $ 的损失为:

    (87)L(w,c)=n(w,c)logσ(wwwc)+k×n(w)n(c)|D|logσ(wwwc)

    由于样本空间V×VC$ \mathbb V\times \mathbb V_C $ 中的组合(w,c)$ (w,c) $ 之间是相互独立的,因此当每一对组合(w,c)$ (w,c) $ 的L(w,c)$ \mathcal L (w,c) $ 最小时L$ \mathcal L $ 最小。定义e=wwwc$ e= \mathbf{\vec w}_w\cdot \mathbf{\vec w}^\prime_{c} $ ,根据:

    (88)L(w,c)e=0

    解得:

    (89)e=wwwc=log(n(w,c)×|D|n(w)×n(c))logk
  5. 给定随机变量X,Y$ X,Y $ ,Pointwise Mutual Information :PMI 定义为

    (90)PMI(X,Y)=logP(X,Y)P(X)×P(Y)

    记单词w$ w $ 出现在D$ \mathbb D $ 中的概率为P(w)=n(w)|D|$ P(w) = \frac{n(w)}{|\mathbb D|} $ ,记上下文c$ c $ 出现在D$ \mathbb D $ 中的概率为P(c)=n(c)|D|$ P(c) = \frac{n(c)}{|\mathbb D|} $ ,记 word-context 组合(w,c)$ (w,c) $ 出现在D$ \mathbb D $ 中的概率为P(w,c)=n(w,c)|D|$ P(w,c) = \frac{n(w,c)}{|\mathbb D|} $ 。则有:

    (91)log(n(w,c)×|D|n(w)×n(c))=PMI(w,c)
  6. 定义矩阵M$ \mathbf M $ 为:

    (92)Mi,j=PMI(w=wordi,c=wordj)logk=log(n(w=wordi,c=wordj)×|D|n(w=wordi)×n(c=wordj))logk

    则有:

    (93)M=W(W)T
    • 这里的推导只有当维度d$ d $ 足够大时成立,因为如果d$ d $ 太小,则W$ \mathbf W $ 和W$ \mathbf W^\prime $ 容量太小表达能力太弱,无法完美的重建矩阵M$ \mathbf M $ 。

      设矩阵M$ \mathbf M $ 的秩为rM$ r_M $ ,则维度d$ d $ 应该满足drM$ d\ge r_M $ 。如果d<rM$ d \lt r_M $ ,则右侧W(W)T$ \mathbf W(\mathbf W^\prime)^T $ 的秩rd<rM$ r\le d\lt r_M $ ,这种分解难以成立。

    • 当负采样个数k=1$ k= 1 $ 时Mi,j=PMI(w=wordi,c=wordj)$ M_{i,j} = \text{PMI}(w = \text{word}_i,c = \text{word}_j) $ ,此时 SGNS 等价于分解 PMI 矩阵。

  7. 直接计算 PMI 矩阵非常具有挑战性:

    • 矩阵的维度|V|×|VC|$ |\mathbb V|\times |\mathbb V_C| $ 非常高。

    • 绝大多数组合(w,c)V×VC$ (w,c) \in \mathbb V\times \mathbb V_C $ 从未出现语料库中从而导致PMI(w,c)=log0=$ \text{PMI}(w,c) = \log 0 = -\infty $ 。

      这可以通过引入一些先验概率使得未见过的(w,c)$ (w,c) $ 的 PMI 为一个有效的数来解决。

    • PMI 矩阵是 dense 矩阵。

    一个解决方案是:当n(w,c)=0$ n(w,c) = 0 $ 时令PMI(w,c)=0$ \text{PMI}(w,c) = 0 $ ,这使得 PMI 矩阵成为一个巨大的稀疏矩阵,称作M0$ \mathbf M_0 $ 。

    事实上当P(w),P(c)$ P(w),P(c) $ 都很高、但是P(w,c)$ P(w,c) $ 很低时,这表明w$ w $ 和c$ c $ 分别单独出现的次数跟高,但是一起出现的次数很低。因此可以认为:

    • P(w,c)>P(w)×p(c)$ P(w,c) \gt P(w)\times p(c) $ 时PMI(w,c)>0$ \text{PMI}(w,c) \gt 0 $ ,表明观察到的 word-context(w,c)$ (w,c) $ 是相关的。

    • P(w,c)P(w)×p(c)$ P(w,c) \le P(w)\times p(c) $ 时PMI(w,c)0$ \text{PMI}(w,c) \le 0 $ ,表明观察到的 word-context(w,c)$ (w,c) $ 是不相关的。

    考虑到未观察到的 word-context(w,c)$ (w,c) $ 有PMI(w,c)=0$ \text{PMI}(w,c) = 0 $ ,因此可以将所有不相关 word-contextPMI 都设置为零,仅考虑正的PMI (即 PPMI):

    (94)PPMI(w,c)=max(PMI(w,c),0)

    这和人类的直觉相符:人们很容易联想到正的关联,如 “加拿大”“滑雪” ,但是很难关注一些无关的组合,如“加拿大”“沙漠” 。因此将无效的信息丢弃(PMI 置为零)而仅保留有效信息更符合经验和直觉。

  8. 如果继续在 PPMI 中考虑偏移,则得到 Shifted PPMI:SPPMI

    (95)SPPMIk(w,c)=max(PMI(w,c)logk,0)
  9. 可以直接将PMI 矩阵、PPMI 矩阵 或者 SPPMI 矩阵中,单词w$ w $ 对应的行作为其 representation,此时单词的 representatioin 是一个高维向量。对于 PPMI,SPPMI,该向量还是稀疏的。此时有:W=M,W=I$ \mathbf W = \mathbf M,\mathbf W^\prime = \mathbf I $ 。

    也可以通过降维获得单词的低维representatiion,如:可以通过 SVD 分解来求解W$ \mathbf W $ 和W$ \mathbf W^\prime $ 。

    首先将M$ \mathbf M $ 进行 SVD 分解:

(96)M=UΣVT

其中U,V$ \mathbf U,\mathbf V $ 均为正交矩阵,Σ$ \mathbf \Sigma $ 为所有奇异值从大到小排列的对角矩阵。

选择最大的d$ d $ 个奇异值组成对角矩阵Σd$ \mathbf\Sigma_d $ 、U$ \mathbf U $ 的前d$ d $ 列组成矩阵Ud$ \mathbf U_d $ 、V$ \mathbf V $ 的前d$ d $ 列组成矩阵Vd$ \mathbf V_d $ ,则有:

(97)MMd=UdΣd(Vd)T

可以选择W=UdΣd,W=Vd$ \mathbf W =\mathbf U_d\mathbf \Sigma_d , \mathbf W^\prime = \mathbf V_d $ 。但是实际应用中发现该方法求解的W$ \mathbf W $ 要比 SGNS 效果较差。注意到这种分解方法中,W$ \mathbf W^\prime $ 是正交矩阵而W$ \mathbf W $ 不是正交矩阵,这表明W$ \mathbf W $ 和W$ \mathbf W^\prime $ 的性质不对称。而在 SGNS 中,求解的这两个矩阵都不是正交矩阵,因此可以进行如下分解:

(98)W=UdΣd,W=VdΣd

虽然理论上无法证明这种方式的效果更好,但是实践中发现它确实表现更佳。

  1. 基于随机梯度下降的 SGNS 和基于矩阵分解的方式各有优点:

    • 基于矩阵分解的优点:

      • 无需精心调优学习率等超参数。

      • 可以按照 word-context 聚合之后的频次数据来训练,这种方式可以训练比 SGNS 大得多得语料库。

        与之相反,SGNS 中每个 word-context 出现一次就需要训练一次。

    • 基于 SGNS 的优点:

      • SGNS 可以区分观测值和未观测值,而 SVD 无法判断一个 word-context 为零是因为未观测还是因为 PMI 较低。这在 word-context 矩阵中非常常见。

      • SGNS 的目标函数对不同的(w,c)$ (w,c) $ 进行加权:越频繁出现的(w,c)$ (w,c) $ 权重越高,误差越低;越稀疏出现的(w,c)$ (w,c) $ 权重越低,因此允许其误差较大。

        SVD 分解中,无法区分(w,c)$ (w,c) $ 的重要性,对所有的(w,c)$ (w,c) $ 给与相同的权重,因此也无法使得权重较大的(w,c)$ (w,c) $ 的误差更低。

      • SGNS 仅仅关注于观测值,因此它不要求底层的矩阵是稀疏的,可以直接优化 dense 矩阵。

        因为 SVD 的求解困难,所以SVD 通常要求底层矩阵是稀疏的,因此它通常采用 PPMI/SPPMI

  2. noise-contrastive estimation:NCE 采用类似的推导过程可以分解为:

    (99)Mi,j=logP(w=wordic=wordj)logk=log(n(w=wordi,c=wordj)n(c=wordj))logk
  3. 实验:

    • 数据集:英文维基百科。经过清理非文本字符、句子拆分、词干化之后,数据集包含 7750万句子、15亿 token

      • 每个token 分别取左右两侧2token 作为上下文从而生成 word-context 集合D$ \mathbb D $ 。

      • 过滤掉D$ \mathbb D $ 中频次低于 100次的 word-context 组合。

      最终得到V$ \mathbb V $ 和VC$ \mathbb V_C $ 包含 189533 个单词。

    • 模型:SPPMISGNS 以及 SVD 。其中:

      • 所有模型评估当k=1,5,15$ k=1,5,15 $ 的结果

      • 对于 SPPMI,将该矩阵的各行作为对应单词的 representation

      • 对于 SVD 采用分解W=UdΣd,W=VdΣd$ \mathbf W =\mathbf U_d\sqrt{\mathbf \Sigma_d} ,\quad \mathbf W^\prime = \mathbf V_d \sqrt{\mathbf \Sigma_d} $

    • 我们根据训练目标函数和理论目标函数来评估各算法的优化算法效果。

      考虑目标函数:

      (100)L=wVcVCn(w,c)(logσ(wwwc)+k×EcNPD[logσ(wwwcN)])
      • 对于 SGNS 我们直接通过随机梯度下降结束时的目标函数值作为L^$ \hat{\mathcal L} $ 。

      • 对于 SVD 我们根据Mw,c=max(PMI(w,c)logk,0)$ M_{w,c} = \max(\text{PMI}(w,c) -\log k,0 ) $ 填充M$ \mathbf M $ ,然后根据矩阵分解的结果计算L$ \mathcal L $ 得到L^$ \hat{\mathcal L} $ 。

      • 对于 SPPMI,我们将它的各行作为对应单词的 representatioin,上下文采用 one-hot 向量的形式,因此有:wwwc=max(PMI(w,c)logk,0)$ \mathbf{\vec w}_w\cdot \mathbf{\vec w}^\prime_{c} = \max(\text{PMI(w,c)} - \log k,0) $ 。

      • 然后根据wwwc=PMI(w,c)logk$ \mathbf{\vec w}_w\cdot \mathbf{\vec w}^\prime_{c} = \text{PMI}(w,c) -\log k $ 求解目标函数的理论值LOPT$ \mathcal L_{OPT} $ 。

      然后我们评估优化目标函数值和理论目标函数值的相对误差:

      Error: '_' allowed only in math mode

      结果见下表。其中 PMI-log k 表示理论误差,SPPMI 表示采用wwwc=max(PMI(w,c)logk,0)$ \mathbf{\vec w}_w\cdot \mathbf{\vec w}^\prime_{c} = \max(\text{PMI}(w,c) -\log k,0 ) $ 直接计算得到(而不是矩阵分解)的SPPMI 理论值对应的误差。

      • 尽管 SPPMI 仅考虑非负元素而丢弃大量信息,它与最优解的理论值非常接近。

      • SVD 方法中,维度d$ d $ 越大效果越好。

      • 对于k=1$ k=1 $ :当d500$ d\le 500 $ 时 SVD 优化效果比 SGNS 更好;但是当维度更高时 SGNS 的优化误差比 SVD 的降低得多得多。

      • SVD 对于k$ k $ 值非常敏感,随着k$ k $ 值的增加优化误差迅速增长。作者猜测这是由于当k$ k $ 越大时M$ \mathbf M $ 中零元素数量也越多,这导致 SVD 的分解结果更接近零矩阵。因为 SVD 的目标函数是无权重的,它无法 “更关注” 那些观测结果。

    • 在四个数据集上评估 word similarity 单词相似任务和单词类比任务。

      • 在数据集 WordSim353MEN 上评估单词相似任务。这些数据集包含人工标注的 pair-wise 单词相似度得分。

      • 在数据集 SyntacticMixed 上评估单词类比任务。

      d=1000$ d=1000 $ 时结果如下图所示:

      • 在单词相似任务上 SVD 超越了SPPMI (采用随机梯度下降),而 SPPMI 超越了 SGNS

      • 在单词相似任务上对于 SGNS 任务k$ k $ 越大效果越好,但是对于 SPPMI,SVD 随着k$ k $ 的上升性能先上升后下降。

        这是因为SPPMI,SVD 中仅保留正的值,随着k$ k $ 越大信息丢失越多。

      • 在单词类比任务上 SGNS 超越了 SVD 。这是因为单词类比任务中更依赖于那些上下文中频繁出现的单词,如the,each,many 以及辅助动词 will,hadSGNS 训练过程会更关注于这些频繁出现的 word-context 组合,而 SVD 对所有的 word-context 是无权重的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文