2. 基于Hierarchical Softmax的模型
从上一小节 相比神经概率语言模型的改进 的内容可以了解到,Word2vec提出了两种优化Softmax计算过程的方法,分别对应Word2vec的两种框架:Hierarchical Softmax 和 Negative Sampling。
而Word2vec中存在两种重要模型:CBOW模型(Continuous Bag-of-Words Model)和Skip-gram模型,分别可以基于上述两种框架进行实现。
本节将介绍基于Hierarchical Softmax框架的两种模型。
2.1 CBOW模型
CBOW模型(Continuous Bag-of-Words Model),输入层到投影层的操作由「拼接」变成了「叠加」。
对于「叠加」而言,无所谓词的顺序,所以称为词袋模型(Bag-of-Words)。
模型结构如下图所示:
其中,
上下文
C
o
n
t
e
x
t
(
w
)
Context(w)
Context(w):由
w
w
w前后各
c
c
c个词构成。
输入层:包含
2
c
2c
2c个词的词向量。
投影层:将输入层的
2
c
2c
2c个词做「累加求和」。
X w = ∑ i = 1 2 c v ( C o n t e x t ( w i ) ) ∈ R m X_w= \sum_{i=1}^{2c}v(Context(w_i)) \in \Bbb R^m Xw=i=1∑2cv(Context(wi))∈Rm
输出层:输出层对应一棵Huffman树。该Huffman树以语料中出现的词为叶子节点,以各词在语料中出现的次数为权值。该树中,叶子节点共有 N N N个( N = ∣ D ∣ N=|D| N=∣D∣)。
2.1.1 梯度计算
- 相关符号含义
p w p^w pw:从根节点到对应叶子节点的路径。
l w l^w lw:路径上包含的节点个数。
p 1 w , p 2 w , . . . , p l w w p^w_1,p^w_2,...,p^w_{l^w} p1w,p2w,...,plww:路径上对应的节点。
d 1 w , d 2 w , . . . , d l w w ∈ { 0 , 1 } d^w_1,d^w_2,...,d^w_{l^w} \in \{0,1\} d1w,d2w,...,dlww∈{0,1}:路径上的节点对应的Huffman编码(根节点不对应编码)。
θ 1 w , θ 2 w , . . . , θ l w w ∈ R m \theta^w_1,\theta^w_2,...,\theta^w_{l^w} \in \Bbb R^m θ1w,θ2w,...,θlww∈Rm:路径上的「非叶子节点」对应的词向量。
从根节点出发到某个叶子节点的路径上,每个分支都可视作进行了一次「二分类」。
默认左子树(Huffman编码为1)为负类,右子树(Huffman编码为0)为正类,有:
- 分为正类的概率: σ ( X w T θ ) = 1 1 + e x p ( − X w T θ ) \sigma(X^T_w\theta)=\frac{1}{1+exp({-X^T_w\theta)}} σ(XwTθ)=1+exp(−XwTθ)1
- 分为负类的概率: 1 − σ ( X w T θ ) 1-\sigma(X^T_w\theta) 1−σ(XwTθ)
其中, θ \theta θ为当前「非叶子结点」的对应的词向量。
Hierarchical Softmax的思想
对于词典
D
D
D中的任意词
w
w
w,Huffman树中必存在一条从根节点到词
w
w
w对应叶子节点的路径
p
w
p^w
pw,路径
p
w
p^w
pw上存在
l
w
−
1
l^w-1
lw−1个分支。
将每个分支看做一次二分类,则每次分类会产生一个概率。将这些概率连乘,即得到
p
(
w
∣
C
o
n
t
e
x
t
(
w
)
)
p(w|Context(w))
p(w∣Context(w))。
p ( w ∣ C o n t e x t ( w ) ) = ∏ j = 2 l w p ( d j w ∣ X w , θ j − 1 w ) 其 中 p ( d j w ∣ X w , θ j − 1 w ) = { σ ( X w T θ j − 1 w ) d j w = 0 1 − σ ( X w T θ j − 1 w ) d j w = 1 = [ σ ( X w T θ j − 1 w ) ] 1 − d j w ⋅ [ 1 − σ ( X w T θ j − 1 w ) ] d j w p(w|Context(w))=\prod_{j=2}^{l^w}p(d^w_j|X_w,\theta^w_{j-1}) \\ \text{} \\ 其中 \\ \text{} \\ p(d^w_j|X_w,\theta^w_{j-1})=\begin{cases} \sigma(X^T_w\theta^w_{j-1}) & \text {$d^w_j=0$} \\ 1-\sigma(X^T_w\theta^w_{j-1}) & \text{$d^w_j=1$} \end{cases} \\ \text{} \\ =[ \sigma(X^T_w\theta^w_{j-1})]^{1-d^w_j} \cdot [1-\sigma(X^T_w\theta^w_{j-1})]^{d^w_j} p(w∣Context(w))=j=2∏lwp(djw∣Xw,θj−1w)其中p(djw∣Xw,θj−1w)={σ(XwTθj−1w)1−σ(XwTθj−1w)djw=0djw=1=[σ(XwTθj−1w)]1−djw⋅[1−σ(XwTθj−1w)]djw
带入最大似然公式,有:
L = ∑ w ∈ c l o g ∏ j = 2 l w { [ σ ( X w T θ j − 1 w ) ] 1 − d j w ⋅ [ 1 − σ ( X w T θ j − 1 w ) ] d j w } = ∑ w ∈ c ∑ j = 2 l w { ( 1 − d j w ) ⋅ l o g [ σ ( X w T θ j − 1 w ) ] + d j w ⋅ l o g [ 1 − σ ( X w T θ j − 1 w ) ] } L= \sum_{w \in c}log\prod_{j=2}^{l^w}\{[ \sigma(X^T_w\theta^w_{j-1})]^{1-d^w_j} \cdot [1-\sigma(X^T_w\theta^w_{j-1})]^{d^w_j}\} \\ =\sum_{w \in c}\sum_{j=2}^{l^w}\{(1-d^w_j) \cdot log[ \sigma(X^T_w\theta^w_{j-1})]+d^w_j \cdot log[1-\sigma(X^T_w\theta^w_{j-1})]\} L=w∈c∑logj=2∏lw{[σ(XwTθj−1w)]1−djw⋅[1−σ(XwTθj−1w)]djw}=w∈c∑j=2∑lw{(1−djw)⋅log[σ(XwTθj−1w)]+djw⋅log[1−σ(XwTθj−1w)]}
令:
L ( w , j ) = ( 1 − d j w ) ⋅ l o g [ σ ( X w T θ j − 1 w ) ] + d j w ⋅ l o g [ 1 − σ ( X w T θ j − 1 w ) ] L(w,j)=(1-d^w_j) \cdot log[ \sigma(X^T_w\theta^w_{j-1})]+d^w_j \cdot log[1-\sigma(X^T_w\theta^w_{j-1})] \\ \text{} \\ L(w,j)=(1−djw)⋅log[σ(XwTθj−1w)]+djw⋅log[1−σ(XwTθj−1w)]
求最大似然,采用「随机梯度上升法」。
首先对 θ \theta θ求导:
∂ L ( w , j ) ∂ θ j − 1 w = ∂ ∂ θ j − 1 w { ( 1 − d j w ) ⋅ l o g [ σ ( X w T θ j − 1 w ) ] + d j w ⋅ l o g [ 1 − σ ( X w T θ j − 1 w ) ] } 利 用 [ l o g σ ( x ) ] ′ = 1 − σ ( x ) , [ l o g ( 1 − σ ( x ) ) ] ′ = − σ ( x ) 得 = ( 1 − d j w ) [ 1 − σ ( X w T θ j − 1 w ) ] X w − d j w [ σ ( X w T θ j − 1 w ) ] X w = { ( 1 − d j w ) [ 1 − σ ( X w T θ j − 1 w ) ] − d j w [ σ ( X w T θ j − 1 w ) ] } X w = [ 1 − d j w − σ ( X w T θ j − 1 w ) ] X w \frac{\partial L(w,j)}{\partial \theta^w_{j-1}}=\frac{\partial }{\partial \theta^w_{j-1}}\{(1-d^w_j) \cdot log[ \sigma(X^T_w\theta^w_{j-1})]+d^w_j \cdot log[1-\sigma(X^T_w\theta^w_{j-1})]\} \\ \text{} \\ 利用 [log\sigma(x)]'=1-\sigma(x), [log(1-\sigma(x))]'=-\sigma(x) 得 \\ \text{} \\ =(1-d^w_j) [1-\sigma(X^T_w\theta^w_{j-1})]X_w-d^w_j [\sigma(X^T_w\theta^w_{j-1})]X_w \\ \text{} \\ =\{(1-d^w_j) [1-\sigma(X^T_w\theta^w_{j-1})]-d^w_j [\sigma(X^T_w\theta^w_{j-1})]\}X_w \\ \text{} \\ =[1-d^w_j-\sigma(X^T_w\theta^w_{j-1})]X_w ∂θj−1w∂L(w,j)=∂θj−1w∂{(1−djw)⋅log[σ(XwTθj−1w)]+djw⋅log[1−σ(XwTθj−1w)]}利用[logσ(x)]′=1−σ(x),[log(1−σ(x))]′=−σ(x)得=(1−djw)[1−σ(XwTθj−1w)]Xw−djw[σ(XwTθj−1w)]Xw={(1−djw)[1−σ(XwTθj−1w)]−djw[σ(XwTθj−1w)]}Xw=[1−djw−σ(XwTθj−1w)]Xw
由于 X w X_w Xw在 L ( w , j ) L(w,j) L(w,j)的表达式中与 θ \theta θ是对称的,因此有:
∂ L ( w , j ) ∂ X w = [ 1 − d j w − σ ( X w T θ j − 1 w ) ] θ j − 1 w \frac{\partial L(w,j)}{\partial X_w}=[1-d^w_j-\sigma(X^T_w\theta^w_{j-1})]\theta^w_{j-1} ∂Xw∂L(w,j)=[1−djw−σ(XwTθj−1w)]θj−1w
在对词向量进行更新时,由于 X w X_w Xw表示 C o n t e x t ( w ) Context(w) Context(w)中各词词向量的叠加,因此 X w X_w Xw的更新也要贡献到 C o n t e x t ( w ) Context(w) Context(w)中的每个词的词向量上:
v ( w ‾ ) : = v ( w ‾ ) + η ∑ j = 2 l w ∂ L ( w , j ) ∂ X w , w ‾ ∈ C o n t e x t ( w ) v(\overline w):=v(\overline w)+\eta\sum_{j=2}^{l^w}\frac{\partial L(w,j)}{\partial X_w}, \overline w \in Context(w) v(w):=v(w)+ηj=2∑lw∂Xw∂L(w,j),w∈Context(w)
2.1.2 伪码
CBOW模型的伪码如下:
其中,步骤3.3和3.4不能交换位置, θ \theta θ需要等 e e e更新后再更新。
2.2 Skip-gram模型
Skip-gram模型是已知当前词 w w w,对其上下文 C o n t e x t ( w ) Context(w) Context(w)中的词进行预测。
模型结构如下图所示:
其中,
输入层:当前样本的中心词
w
w
w的词向量。
投影层:无作用。
输出层:类似于CBOW模型,同样为一颗Huffman树。
2.2.1 梯度计算
p ( C o n t e x t ( w ) ∣ w ) = ∏ u ∈ C o n t e x t ( w ) p ( u ∣ w ) 基 于 前 文 所 述 的 H i e r a r c h i c a l S o f t m a x 思 想 p ( u ∣ w ) = ∏ j = 2 l u p ( d j u ∣ v ( w ) , θ j − 1 u ) = [ σ ( v ( w ) T θ j − 1 u ) ] 1 − d j u ⋅ [ 1 − σ ( v ( w ) T θ j − 1 u ) ] d j u p(Context(w)|w)=\prod_{u \in Context(w)}p(u|w) \\ \text{} \\ 基于前文所述的 Hierarchical \, Softmax 思想 \\ \text{} \\ p(u|w)=\prod_{j=2}^{l^u}p(d^u_j|v(w),\theta^u_{j-1}) \\ \text{} \\ =[ \sigma(v(w)^T\theta^u_{j-1})]^{1-d^u_j} \cdot [1-\sigma(v(w)^T\theta^u_{j-1})]^{d^u_j} p(Context(w)∣w)=u∈Context(w)∏p(u∣w)基于前文所述的HierarchicalSoftmax思想p(u∣w)=j=2∏lup(dju∣v(w),θj−1u)=[σ(v(w)Tθj−1u)]1−dju⋅[1−σ(v(w)Tθj−1u)]dju
带入最大似然公式,有:
L = ∑ w ∈ c l o g ∏ w ∈ C o n t e x t ( w ) ∏ j = 2 l u { [ σ ( v ( w ) T θ j − 1 u ) ] 1 − d j u ⋅ [ 1 − σ ( v ( w ) T θ j − 1 u ) ] d j u } = ∑ w ∈ c l o g ∑ w ∈ C o n t e x t ( w ) ∑ j = 2 l u { ( 1 − d j u ) ⋅ l o g [ σ ( v ( w ) T θ j − 1 u ) ] + d j u ⋅ l o g [ 1 − σ ( v ( w ) T θ j − 1 u ) ] } L= \sum_{w \in c}log\prod_{w \in Context(w)}\prod_{j=2}^{l^u}\{[ \sigma(v(w)^T\theta^u_{j-1})]^{1-d^u_j} \cdot [1-\sigma(v(w)^T\theta^u_{j-1})]^{d^u_j}\} \\ =\sum_{w \in c}log\sum_{w \in Context(w)}\sum_{j=2}^{l^u}\{(1-d^u_j) \cdot log[ \sigma(v(w)^T\theta^u_{j-1})]+d^u_j \cdot log[1-\sigma(v(w)^T\theta^u_{j-1})]\} L=w∈c∑logw∈Context(w)∏j=2∏lu{[σ(v(w)Tθj−1u)]1−dju⋅[1−σ(v(w)Tθj−1u)]dju}=w∈c∑logw∈Context(w)∑j=2∑lu{(1−dju)⋅log[σ(v(w)Tθj−1u)]+dju⋅log[1−σ(v(w)Tθj−1u)]}
令:
L ( w , u , j ) = ( 1 − d j u ) ⋅ l o g [ σ ( v ( w ) T θ j − 1 u ) ] + d j u ⋅ l o g [ 1 − σ ( v ( w ) T θ j − 1 u ) ] L(w,u,j)=(1-d^u_j) \cdot log[ \sigma(v(w)^T\theta^u_{j-1})]+d^u_j \cdot log[1-\sigma(v(w)^T\theta^u_{j-1})] \\ \text{} \\ L(w,u,j)=(1−dju)⋅log[σ(v(w)Tθj−1u)]+dju⋅log[1−σ(v(w)Tθj−1u)]
求最大似然,对上式采用「随机梯度上升法」。
首先对 θ \theta θ求导:
∂ L ( w , u , j ) ∂ θ j − 1 u = ∂ ∂ θ j − 1 u { ( 1 − d j u ) ⋅ l o g [ σ ( v ( w ) T θ j − 1 u ) ] + d j u ⋅ l o g [ 1 − σ ( v ( w ) T θ j − 1 u ) ] } 利 用 [ l o g σ ( x ) ] ′ = 1 − σ ( x ) , [ l o g ( 1 − σ ( x ) ) ] ′ = − σ ( x ) 得 = ( 1 − d j u ) [ 1 − σ ( v ( w ) T θ j − 1 u ) ] v ( w ) − d j u [ σ ( v ( w ) T θ j − 1 u ) ] v ( w ) = { ( 1 − d j u ) [ 1 − σ ( v ( w ) T θ j − 1 u ) ] − d j u [ σ ( v ( w ) T θ j − 1 u ) ] } v ( w ) = [ 1 − d j u − σ ( v ( w ) T θ j − 1 u ) ] v ( w ) \frac{\partial L(w,u,j)}{\partial \theta^u_{j-1}}=\frac{\partial }{\partial \theta^u_{j-1}}\{(1-d^u_j) \cdot log[ \sigma(v(w)^T\theta^u_{j-1})]+d^u_j \cdot log[1-\sigma(v(w)^T\theta^u_{j-1})]\} \\ \text{} \\ 利用 [log\sigma(x)]'=1-\sigma(x), [log(1-\sigma(x))]'=-\sigma(x) 得 \\ \text{} \\ =(1-d^u_j) [1-\sigma(v(w)^T\theta^u_{j-1})]v(w)-d^u_j [\sigma(v(w)^T\theta^u_{j-1})]v(w) \\ \text{} \\ =\{(1-d^u_j) [1-\sigma(v(w)^T\theta^u_{j-1})]-d^u_j [\sigma(v(w)^T\theta^u_{j-1})]\}v(w) \\ \text{} \\ =[1-d^u_j-\sigma(v(w)^T\theta^u_{j-1})]v(w) ∂θj−1u∂L(w,u,j)=∂θj−1u∂{(1−dju)⋅log[σ(v(w)Tθj−1u)]+dju⋅log[1−σ(v(w)Tθj−1u)]}利用[logσ(x)]′=1−σ(x),[log(1−σ(x))]′=−σ(x)得=(1−dju)[1−σ(v(w)Tθj−1u)]v(w)−dju[σ(v(w)Tθj−1u)]v(w)={(1−dju)[1−σ(v(w)Tθj−1u)]−dju[σ(v(w)Tθj−1u)]}v(w)=[1−dju−σ(v(w)Tθj−1u)]v(w)
由于 v ( w ) v(w) v(w)在 L ( w , u , j ) L(w,u,j) L(w,u,j)的表达式中与 θ \theta θ是对称的,因此有:
∂ L ( w , u , j ) ∂ v ( w ) = [ 1 − d j u − σ ( v ( w ) T θ j − 1 u ) ] θ j − 1 u \frac{\partial L(w,u,j)}{\partial v(w)}=[1-d^u_j-\sigma(v(w)^T\theta^u_{j-1})]\theta^u_{j-1} ∂v(w)∂L(w,u,j)=[1−dju−σ(v(w)Tθj−1u)]θj−1u
梯度更新公式如下:
θ j − 1 u : = θ j − 1 u + η [ 1 − d j u − σ ( v ( w ) T θ j − 1 u ) ] v ( w ) \theta^u_{j-1}:=\theta^u_{j-1}+\eta[1-d^u_j-\sigma(v(w)^T\theta^u_{j-1})]v(w) θj−1u:=θj−1u+η[1−dju−σ(v(w)Tθj−1u)]v(w)
v ( w ) : = v ( w ) + η ∑ w ∈ C o n t e x t ( w ) ∑ j = 2 l u [ 1 − d j u − σ ( v ( w ) T θ j − 1 u ) ] θ j − 1 u v(w):=v(w)+\eta\sum_{w \in Context(w)}\sum_{j=2}^{l^u}[1-d^u_j-\sigma(v(w)^T\theta^u_{j-1})]\theta^u_{j-1} v(w):=v(w)+ηw∈Context(w)∑j=2∑lu[1−dju−σ(v(w)Tθj−1u)]θj−1u
2.2.2 伪码
Skip-gram模型的伪码如下:
在Word2vec源码中,并非等 C o n t e x t ( w ) Context(w) Context(w)中所有词都处理完后才更新 v ( w ) v(w) v(w),而是每处理完 C o n t e x t ( w ) Context(w) Context(w)中的一个词就更新一次。伪码如下: