1、CBOW模型与Skip-gram模型
1.1 CBOW模型
1.2 Skip-gram模型
2、优化技巧
2.1 Hierarchical Softmax
标准的Softmax中,要计算y=j时的概率,我们需要对所有的K个概率做归一化,这在|y|很大时非常耗时。于是,分层Softmax诞生了,它的基本思想是使用树的层级结构替代扁平化的标准Softmax,使得在计算概率时,只需计算一条路径上的所有节点的概率值,无需在意其它的节点,计算量从
O
(
V
)
O(V)
O(V)降到
O
(
l
o
g
V
)
O(logV)
O(logV)。如下图所示:
白色结点为词典中的词,深色是非叶子结点。图中画出了从根结点到词w2的唯一路径,路径长度L(w2)=4,而n(w,j)表示从根结点到词w2的路径上的的第j个结点。在层次Softmax模型中,叶子节点的词没有直接输出的向量,而非叶子节点其实都有响应的输出向量。
在模型的训练过程中,通过Huffman编码,构造了一颗庞大的Huffman树,同时会给非叶子结点赋予向量。我们要计算的是目标词w的概率,这个概率的具体含义,是指从root结点开始随机走,走到目标词w的概率。因此在途中路过非叶子结点(包括root)时,需要分别知道往左走和往右走的概率。例如到达非叶子节点n的时候往左边走和往右边走的概率分别是:
p
(
n
,
l
e
f
t
)
=
σ
(
θ
n
T
⋅
h
)
p(n,left)=\sigma(\theta_{n}^{T} \cdot h)
p(n,left)=σ(θnT⋅h)
p
(
n
,
r
i
g
h
t
)
=
1
−
σ
(
θ
n
T
⋅
h
)
=
σ
(
−
θ
n
T
⋅
h
)
p(n,right)=1- \sigma(\theta_{n}^{T} \cdot h)=\sigma(-\theta_{n}^{T} \cdot h)
p(n,right)=1−σ(θnT⋅h)=σ(−θnT⋅h)
以上图中目标词为w2为例:
p
(
w
2
)
=
p
(
n
(
w
2
,
1
)
,
l
e
f
t
)
⋅
p
(
n
(
w
2
,
2
)
,
l
e
f
t
)
⋅
p
(
n
(
w
2
,
3
)
,
r
i
g
h
t
)
=
σ
(
θ
n
(
w
2
,
1
)
T
⋅
h
)
⋅
σ
(
θ
n
(
w
2
,
2
)
T
⋅
h
)
⋅
σ
(
−
θ
n
(
w
2
,
3
)
T
⋅
h
)
p(w_{2})=p(n(w_{2},1),left)\cdot p(n(w_{2},2),left)\cdot p(n(w_{2},3),right)=\sigma(\theta_{n(w_{2},1)}^{T} \cdot h)\cdot \sigma(\theta_{n(w_{2},2)}^{T} \cdot h)\cdot \sigma(-\theta_{n(w_{2},3)}^{T} \cdot h)
p(w2)=p(n(w2,1),left)⋅p(n(w2,2),left)⋅p(n(w2,3),right)=σ(θn(w2,1)T⋅h)⋅σ(θn(w2,2)T⋅h)⋅σ(−θn(w2,3)T⋅h)
其中
θ
n
(
w
,
j
)
T
\theta_{n(w,j)}^{T}
θn(w,j)T是非叶子结点
n
(
w
,
j
)
n(w,j)
n(w,j)的向量表示(即输出向量);
h
h
h是隐藏层的输出值,从输入词的向量中计算得来;
s
i
g
n
(
x
,
j
)
sign(x,j)
sign(x,j)是一个特殊函数,定义如下:
s
i
g
n
(
w
,
j
)
=
{
1
若n(w,j+1)是n(w,j)的左孩子
−
1
若n(w,j+1)是n(w,j)的右孩子
sign(w,j)= \begin{cases} 1& \text{若n(w,j+1)是n(w,j)的左孩子}\\ -1& \text{若n(w,j+1)是n(w,j)的右孩子} \end{cases}
sign(w,j)={1−1若n(w,j+1)是n(w,j)的左孩子若n(w,j+1)是n(w,j)的右孩子
Hierarchical softmax通过构造一棵二叉树将目标概率的计算复杂度从最初的V降低到了logV的量级。但是却增加了词与词之间的耦合性。比如一个word出现的条件概率的变化会影响到其路径上所有非叶子节点的概率变化。间接地对其他word出现的条件概率带来影响。
2.2 Negative Sampling
训练一个神经网络意味着使用一个训练样本就要稍微调整一下所有的神经网络权重,这样才能够确保预测训练样本更加精确。换句话说,每个训练样本都会改变神经网络中的权重。
负采样通过使每一个训练样本仅仅改变一小部分的权重而不是所有权重,从而解决这个问题。下面介绍它是如何进行工作的。
当通过(”fox”, “quick”)词对来训练神经网络时,我们回想起这个神经网络的“标签”或者是“正确的输出”是一个one-hot向量。也就是说,对于神经网络中对应于”quick”这个单词的神经元对应为1,而其他上千个的输出神经元则对应为0。使用负采样,我们通过随机选择一个较少数目(比如说5个)的“负”样本来更新对应的权重。(在这个条件下,“负”单词就是我们希望神经网络输出为0的神经元对应的单词)。并且我们仍然为我们的“正”单词更新对应的权重(也就是当前样本下”quick”对应的神经元)。回想一下,我们模型的输出层有大约n*|V|维度的权重矩阵。所以我们只需要更新正确的输出单词”quick”的权重,加上额外的5个其他应该输出为0的单词的权重。也就是总共6个输出神经元,和总共6*n个的权重值。
从本质上来说,选择一个单词来作为负样本的概率取决于它出现频率,对于更经常出现的单词,我们将更倾向于选择它为负样本。在使用C语言实现的词转向量(word2vec)中,你可以看到这个概率公式。每个单词都被给予一个等于它频率的权重(单词出现的数目)的3/4次方。选择某个单词的概率就是它的权重除以所有单词权重之和。公式如下:
P
(
w
i
)
=
f
(
w
i
)
3
/
4
∑
j
=
0
n
f
(
w
j
)
3
/
4
P(w_i)=\frac{f(w_i)^{3/4}}{\sum_{j=0}^nf(w_j)^{3/4}}
P(wi)=∑j=0nf(wj)3/4f(wi)3/4
2.3 Subsamplingof Frequent words
频繁词的二次采样,根据论文描述在大的语料库中,频繁词如容易出现很多次的the\in\a提供的信息量远没有罕见词提供的信息量多,因此在后续的训练中频繁词无法提供更多的信息甚至会将网络带偏,因此提出了频繁词二次采样方式:即在每次训练时按照如下公式对训练集的单词wi进行丢弃:
P
(
w
i
)
=
1
−
t
f
(
w
i
)
P(w_i)=1-\sqrt{\frac{t}{f(w_i)}}
P(wi)=1−f(wi)t
t是提前设定好的值
3、cbow与skip-gram的比较
在cbow方法中,是用周围词预测中心词,从而利用中心词的预测结果情况,使用GradientDesent方法,不断的去调整周围词的向量。要注意的是, cbow的对周围词的调整是统一的:求出的gradient的值会同样的作用到每个周围词的词向量当中去。可以看到,cbow预测行为的次数跟整个文本的词数几乎是相等的(每次预测行为才会进行一次backpropgation, 而往往这也是最耗时的部分),复杂度大概是O(V)。
而skip-gram是用中心词来预测周围的词。在skip-gram中,会利用周围的词的预测结果情况,使用GradientDecent来不断的调整中心词的词向量,可以看出,skip-gram进行预测的次数是要多于cbow的,时间的复杂度为O(KV),训练时间要比cbow要长。
但是在skip-gram当中,每个词都要受到周围的词的影响,每个词在作为中心词的时候,都要进行K次的预测、调整。因此, 当数据量较少,或者词为生僻词出现次数较少时, 这种多次的调整会使得词向量相对的更加准确。因为尽管cbow从另外一个角度来说,某个词也是会受到多次周围词的影响(多次将其包含在内的窗口移动),进行词向量的跳帧,但是他的调整是跟周围的词一起调整的,grad的值会平均分到该词上, 相当于该生僻词没有收到专门的训练,它只是沾了周围词的光而已。
因此cbow快而skip-gram慢,但是skip-gram更适用于处理生僻字且精度更高
4、word embedding的优势
word2vec词向量与传统的one-hot词向量相比,主要有以下两个优势:
- 低维稠密
- 蕴含语义信息