二次采样
文本数据中一般会出现一些高频词,如英文中的“the”“a”和“in”。通常来说,在一个背景窗口中,一个词(如“chip”)和较低频词(如“microprocessor”)同时出现比和较高频词(如“the”)同时出现对训练词嵌入模型更有益。因此,训练词嵌入模型时可以对词进行二次采样。 具体来说,数据集中每个被索引词
w
i
w_i
wi 将有一定概率被丢弃,该丢弃概率为
P
(
w
i
)
=
max
(
1
−
t
f
(
w
i
)
,
0
)
P(w_i)=\max(1-\sqrt{\frac{t}{f(w_i)}},0)
P(wi)=max(1−f(wi)t,0)
其中
f
(
w
i
)
f(w_i)
f(wi) 是数据集中词
w
i
w_i
wi 的个数与总词数之比,常数
t
t
t 是一个超参数(实验中设为
1
0
−
4
10^{−4}
10−4)。可见,只有当
f
(
w
i
)
>
t
f(w_i)>t
f(wi)>t 时,我们才有可能在二次采样中丢弃词
w
i
w_i
wi,并且越高频的词被丢弃的概率越大。
#使用二次采样算法(subsampling)处理语料,强化训练效果
def subsampling(corpus, word2id_freq):
#这个discard函数决定了一个词会不会被替换,这个函数是具有随机性的,每次调用结果不同
#如果一个词的频率很大,那么它被遗弃的概率就很大
def discard(word_id):
return random.uniform(0, 1) < 1 - math.sqrt(
1e-4 / word2id_freq[word_id] * len(corpus))
corpus = [word for word in corpus if not discard(word)]
return corpus