论文学习:基于Hierarchical Softmax的CBOW模型

看到一篇写的非常好的关于 word2vec 文章《word2vec中的数学原理详解》[1],本来想着看完之后按自己对知识的整理做一下记录,但是觉得原文作者(peghoty)写的太好了,这里按作者写作逻辑记录一下个人的学习笔记吧。

目录

一、统计语言模型

(一)贝叶斯公式

(二)统计语言模型

二、n-gram 模型

(二)大数定理

(二)n-gram

三、基于Hierarchical Softmax的CBOW 模型

(一)网络结构

(二)梯度计算


一、统计语言模型

(一)贝叶斯公式

贝叶斯公式应该都熟悉:

  • p(A|B)=\frac{p(A,B)}{p(B)}=\frac{p(B|A)p(A)}{p(B)}

(二)统计语言模型

例:借助于贝叶斯公式给出了在语音识别系统中,给定语音段 Voice ,找到使得概率 p(Text|Voice) 最大的文本 Text ,公式如下:

  • p(Text|Voice)=\frac{p(Voice,Text)}{p(Voice)}=\frac{p(Voice|Text)p(Text)}{p(Voice)}

这里 p(Voice|Text)声学模型p(Text)语言模型,这里我们只关注于语言模型的计算。

简单来说,统计语言模型是构建一个基于语料库的用来计算句子概率的概率模型。假设 W=\omega _{1}^{T}:=(\omega _{1},\omega _{2},...,\omega _{T}) 表示 T 个词 \omega _{1},\omega _{2},...,\omega _{T} 按顺序构成的句子,则 \omega _{1},\omega _{2},...,\omega _{T} 的联合概率是:

  • p(W)=p(\omega _{1}^{T})=p(\omega _{1},\omega _{2},...,\omega _{T})

利用贝叶斯公式上式可被链式分解为:

  • p(W)=p(\omega _{1}^{T})=p(\omega _{1},\omega _{2},...,\omega _{T})=p(\omega _{\omega _{1},...,\omega _{T-1}})\cdot p(\omega _{T}|\omega _{1},...,\omega _{T-1})=p(\omega _{\omega _{1},...,\omega _{T-2}})\cdot p(\omega _{T-1}|\omega _{1},...,\omega _{T-2})\cdot p(\omega _{T-1}|\omega _{1}^{T-1})=p(\omega _{1})\cdot p(\omega _{2}|\omega _{1})\cdot p(\omega _{3}|\omega _{1}^{2}) \cdot \cdot \cdot p(\omega _{T}|\omega _{1}^{T-1})

用通用的白话说就是:长句的概率 =1 个词的概率 \times 第 1 个词出现的情况下第 2 个词的概率 \times 第 1 2 个词出现的情况下第 3 个词的概率 \times ...  \times 之前所有词出现的情况下第 T 个词的概率。

这种计算方式存在的问题是计算这些概率需要的成本太高。引用原作者的话:“假设语料库对应词典 D 的代销(即词汇量)为 N ,那么,如果考虑长度为 T 的任意句子,理论上就有 N^{T} 种可能,而每种可能都要计算 T 个概率,总共就需要计算 TN^{T} 个概率”。针对该问题,常见的方法有 n-gram 模型和神经网络两种方法。

二、n-gram 模型

(二)大数定理

不失一般性地,我们从上述利用贝叶斯公式链式分解的 p(W)=p(\omega _{1})\cdot p(\omega _{2}|\omega _{1})\cdot p(\omega _{3}|\omega _{1}^{2}) \cdot \cdot \cdot p(\omega _{T}|\omega _{1}^{T-1}) 中抽取一个概率 p(\omega _{T}|\omega _{1}^{T-1}) ,利用贝叶斯公式,有:

  • p(\omega _{T}|\omega _{1}^{T-1})=\frac{p(\omega _{1}^{T})}{p(\omega _{1}^{T-1})}=\frac{count(\omega _{1}^{T})}{count(\omega _{1}^{T-1})}

这里,count(\omega _{1}^{T}) 和 count(\omega _{1}^{T-1}) 分别是当语料库足够大时,根据大数定理表示的 \omega _{1}^{T} 和 \omega _{1}^{T-1} 在语料中出现的次数,当 T 很大时,计算 count(\omega _{1}^{T}) 和 count(\omega _{1}^{T-1}) 所耗的时间很长( count(\omega _{1}^{T}) 表示语料库中同时包含词 \omega _{1},\omega _{2},...,\omega _{T} 的语料数量,这意味着在计数过程中需要对每条语料进行判断 T 次)。

(二)n-gram

首先得提一下马尔科夫假设:下一个词的出现仅依赖于它前面的 n-1 个词。现在我们可以把概率 p(\omega _{T}|\omega _{1}^{T-1}) 近似表示:

  • p(\omega _{T}|\omega _{1}^{T-1})\approx p(\omega _{T}|\omega _{T-n+1}^{T-1})=\frac{count(\omega _{T-n+1}^{T})}{count(\omega _{T-n+1}^{T-1})}

该方法可显著降低计算复杂度,实际应用中最常采用的是 n=3三元模型(即依赖于该词之前的两个词)。

三、基于Hierarchical Softmax的CBOW 模型

(一)网络结构

论文Exploiting Similarities among Languages for Machine Translation[2]给出了 CBOW 模型的网络结构,如下图1

图1:CBOW模型

 该网络结构包括三层:输入层、投影层和输出层。模型是在已知当前词 \omega _{t} 的上下文 \omega _{t-2},\omega _{t-1},\omega _{t+1},\omega _{t+2}  的前提下预测当前词 \omega _{t} ,即计算 p(\omega_{t} |Context(\omega_{t} )) ,这里 Context(\omega_{t} )  表示词 \omega _{t} 的上下文集合{}\left \{ \omega _{t-2},\omega _{t-1},\omega _{t+1},\omega _{t+2}\right \}

  1. 输入层:当前词 \omega _{t}上下文 \omega _{t-2},\omega _{t-1},\omega _{t+1},\omega _{t+2}  对应的词向量 v(\omega _{t-2}),v(\omega _{t-1}),v(\omega _{t+1}),v(\omega _{t+2})\in \mathbb{R}^{m}。这里 m 表示词向量的长度\mathbb{R}^{m} 表示词向量空间
  2. 投影层:将输入层的 4 个向量做求和累加,即 x_{\omega } = v(\omega _{t-2})+v(\omega _{t-1})+v(\omega _{t+1})+v(\omega _{t+2})\in \mathbb{R}^{m}
  3. 输出层:输出层对应一棵二叉树,它是以语料中出现过的词当叶子结点,以各词在语料中出现的次数当权值构造出来的 Huffman 树。在这棵 Huffman 树中,叶子结点共 N(=|D|) 个,分别对应 D 中的词,非叶子结点 N-1 个(叶子结点两两合并得到的新结点数)。(具体内容见另一篇博客[3]

图2 给出一个特殊的 CBOW 网络结构

图2:CBOW网络结构

(二)梯度计算

 原作者给出了若干相关记号,这里稍微修改一下,就上图2 ,我们考虑词 \omega 为“夏天”的情况,记:

  1. p :从根结点出发到达 \omega 对应叶子结点的路径(38→23→9→4→3)
  2.  l :路径 p 中包含结点的个数(5 个:38,23,9,4,3)
  3.  p_{1},p_{2},...,p_{l} :路径 p 中的第 l 个节点,其中 p_{1} 表示根结点,p_{l} 表示词 \omega 对应的结点p_{1} 表示 38 对应的结点)
  4.  d_{2},d_{3},...,d_{l}\in \left \{ 0,1 \right \} :词 \omega 的 Huffman编码,根结点不对应编码,故没有 d_{1}d_{2}=1 )。
  5.  \theta _{1},\theta _{2},...,\theta _{l-1}\in \mathbb{R}^{m} :路径 p 中非叶子结点对应的向量(以“夏天”为例,共有 l-1=4 个非叶子结点)

为什么用 Huffman 树作为 CBOW 的输出呢?原作者的原话如下:

        以图2 中词 \omega 是“夏天”为例,从根结点出发到“夏天”这个叶子结点,中间共经历了 4 词分支(每天红色的边对于一次分支),而每次分支都可视为进行了一次二分类

        既然是从二分类的角度来考虑问题,那么对于每一个非叶子结点,就需要为其左右子结点制定一个类别,即哪个是正类(标签为 1 ),哪个是负类(标签为 0 )。碰巧,除根结点以外,数中每个结点都对应了一个取值为 0 或 1 的 Huffman 编码。因此,一种最自然的做法就是将 Huffman 编码为 1 的结点定义为正类,编码为 0 的结点定义为负类。当然,这只是个约定而已,你也可以将编码为 1 的结点定义为负类,而将编码为 0 的结点定义为正类。事实上, word2vec 选用的就是后者,即约定:

Lable(p_{i})=1-d_{i},i=2,3,...,l

 简而言之,将一个结点进行分类时,分到左边就是负类,分到右边就是正类

使用 sigmoid 激活函数,一个结点被分为正类的概率是:

  • \sigma (x_{w}^{T}\theta )=\frac{1}{1+exp(-x_{w}^{T}\theta )}

 被分为负类的概率也就是:

  • 1-\sigma (x_{w}^{T}\theta )

最后,对于词典 D 中的任意词 \omegaHuffman 树中必存在一条从根结点到词 \omega 对应结点的路径 p (且唯一)。 路径 p 上存在 l-1 个分支,将每个分支看做一次二分类,每一次分类就产生一个概率,将这些概率乘起来,就是所需的 p(\omega |Context(\omega ))

 注意到这里的 \theta 是路径 p 中非叶子结点对应的向量,熟悉 BP 神经网络(不懂的可以看我的另一篇博客[4])的读者应该就知道使用随机梯度下降法需要优化的参数了。

BP 神经网络中,输出层的结果与真实值计算均方误差MSE),并通过误差的反向传播方式来降低误差,从而优化神经网络中的权重矩阵;在 CBOW 模型中,输出层的结果与真实值之间的均方误差被替换为概率 p(\omega |Context(\omega )) ,我们的目标变为提高概率,故通过随机梯度上升法来对非叶子结点向量集 \left \{ \theta _{1},\theta _{2},...,\theta _{l-1} \right \} 进行优化。继而对词 \omega词向量进行优化。

公式有:

  • \theta _{j-1}:=\theta _{j-1}+\eta [1-d_{j}-\sigma (x^{T}\theta _{j-1})]x
  • v(\tilde{\omega })}:=v(\tilde{\omega })}+\eta \sum_{j=2}^{l}[1-d_{j}-\sigma (x^{T}\theta _{j-1})]\theta _{j-1}

[1] https://www.cnblogs.com/peghoty/p/3857839.html

[2] Mikolov T , Le Q V , Sutskever I . Exploiting Similarities among Languages for Machine Translation[J]. computer science, 2013.

[3] https://blog.csdn.net/qq_41297934/article/details/105169804

[4] https://blog.csdn.net/qq_41297934/article/details/104863418

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章