主要内容
本篇论文的主要内容为对skip-gram模型的优化扩展,主要内容包括以下三点
- 对高频词重采样
- negative sampling(负采样)
- 从基于单词的模型扩展到基于短语的模型
不熟悉skip-gram模型的可以看看我写的上一篇文章,对skip-gram模型有个比较完整的介绍,点这里。
高频词重采样
在语料库非常大的时候,一些高频词很容易出现上百万甚至上亿次,然而这些高频词能提供的信息一般都比那些低频次要来的少。所以为了平衡高频词和低频词的样本数量,本文提出了二次采样的方法,在二次采样中,每个词语都有一定几率会被丢弃,概率计算公式如下:
P
(
w
i
)
=
1
−
t
f
(
w
i
)
P(w_i) = 1 - \sqrt{\frac{t}{f(w_i)}}
P(wi)=1−f(wi)t
其中,
w
i
w_i
wi为单词,
f
(
w
i
)
f(w_i)
f(wi)为词出现的次数,t则为超参数(一般设为
1
0
−
5
10^{-5}
10−5左右)
这是一个启发式的式子,根据这个式子我们可以看出,词语出现的次数越多,他被迭起的概率就越大。因此,通过二次采样平衡数据之后,我们可以更好地对低频词进行学习。
negative sampling负采样
skip-gram模型由于采用softmax多分类处理,每次进行参数优化都需要进行大量的计算,因此,本文提出了一种负采样的方法,对skip-gram的计算量进行优化处理。
负采样的方法借鉴于NCE(noise contrastive estimation)噪声对比估计,NCE假设一个好的模型可以通过逻辑回归来区分正常数据和噪声。
负采样的本质是把skip-gram的多分类问题变成了二分类问题。我们不再给定一个词,让他去预测上下文的词,而是每次拿两个词,其中的一个词作为已知,判断另一个词是否是其上下文,如果是则输出1,不是则输出0。
举个例子,假设目前的滑动窗口中包含5个词,其中一个为中心词,我们需要利用中心词预测其他四个词,这时候其他的四个词,每一个词都视为一个正样本,负采样会针对每一个正样本,采集n个负样本(小数据集一般取5-20,大数据集一般取2-5),这些负样本是从那些与中心词无上下文关系的词中采样的。
所以在此模型中,词向量和词库中的每一个词都会进行一次而分类,来判断这个词是否是中心词的上下文,每次迭代只涉及n+1个单元,比起不采取负采样的skip-gram的V个单元(词库大小)要小得多。
由此,我们的优化目标就变成了如下形式:
log
σ
(
v
w
t
′
⊤
v
w
c
)
+
∑
i
=
1
k
E
w
i
∼
P
n
(
w
)
[
log
σ
(
−
v
w
i
′
⊤
v
w
c
)
]
\log\sigma({v'_{w_t}}^\top v_{w_c})+\sum_{i=1}^k\mathbb{E}_{w_i}\sim P_n(w)[\log\sigma(-{v'_{w_i}}^\top v_{w_c})]
logσ(vwt′⊤vwc)+i=1∑kEwi∼Pn(w)[logσ(−vwi′⊤vwc)]
其中
P
n
(
w
)
P_n(w)
Pn(w)是词n周围的噪声词分布,公式的前半部分是对正样本的判别,这个概率要尽可能高,后半部分则是对负样本的判别,所以加上一个符号。
我们可以看出,模型所做的就是用逻辑回归从k个负例中去别处目标词汇
w
t
w_t
wt。
从基于单词的模型扩展到基于短语的模型
这一部分比较简单,大致的问题就是有很多词的含义并不是完全由单个单词的含义组成的。例如new york和time,组成在一起就变成了杂志名。
对此论文提出的方法是修改词库部分,把短语放入词库。论文采用了数据驱动的方法来寻找短语,具体公式如下:
s
c
o
r
e
(
s
i
,
w
j
)
=
c
o
u
n
t
(
w
i
,
w
j
)
−
δ
c
o
u
n
t
(
w
i
)
×
c
o
u
n
t
(
w
j
)
score(s_i,w_j) = \frac{count(w_i,w_j)-\delta}{count(w_i)\times count(w_j)}
score(si,wj)=count(wi)×count(wj)count(wi,wj)−δ
其中
δ
\delta
δ是一个惩罚项,用来避免太多无关的词组合到一起。
用这个公式算出来的两个词的score一旦大于某个阈值,那么这两个词就被视为一个短语来进行训练
感想
- 通过描述skip-gram,自己对这个模型有了更好的认识。。
- 模型的架构是固定的,但是我们可以不断地通过改进模型来让它打到更好的效果。