这是我用于学习 Skip-gram 的笔记。
文中会有一些公式,如果 github 出现公式乱码问题,请通过我的博客查看:https://zhuanlan.zhihu.com/p/275899732。
下面废话不多说,教你手把手实现 Skip-gram。
CBOW 和 Skip-gram 是两种训练得到词向量的方法。其中 CBOW 是从上下文字词推测目标字词,而 Skip-gram 则是从目标字词推测上下文的字词。在大型数据集上,CBOW 比 Skip-gram 效果好;但是在小的数据集上,Skip-gram 比 CBOW 效果好。本文使用 PyTorch 来实现 Skip-gram 模型,主要的论文是:Distributed Representations of Words and Phrases and their Compositionality
以“the quick brown fox jumped over the lazy dog”这句话为例,我们要构造一个上下文单词与目标单词的映射关系,以quick
为目标单词,假设滑动窗口大小为 1,也就是左边和右边各取 1 个单词作为上下文,这里是the
和brown
,可以构造映射关系:(the, quick),(brown, quick),这样我们就构造出两个正样本。
此外,对于这个滑动窗口外的其他单词,我们需要构造负样本,但是负样本可以是滑动窗口之外的所有单词。为了减少训练的时间,我们对负样本进行采样 k 个,称为 Negative Sampling。如 k=2,就是对每个正样本,分别构造两个负样本;例如对于(the, quick)
,采样两个负样本 (lazy , quick),(dog, quick)。Negative Sampling 的损失函数表示如下: arg max θ log σ ( v w O ′ ⊤ w I ) + ∑ i = 1 k E w i ∼ P n ( w ) [ log σ ( − v w i ′ T w I ) ] \underset{\theta}{\arg \max }\log \sigma\left(v_{w_{O}}^{\prime} \top_{w_{I}}\right)+\sum_{i=1}^{k} \mathbb{E}_{w_{i} \sim P_{n}(w)}\left[\log \sigma\left(-v_{w_{i}}^{\prime} T_{w_{I}}\right)\right] θargmaxlogσ(vwO′⊤wI)+∑i=1kEwi∼Pn(w)[logσ(−vwi′TwI)]。其中 σ ( x ) \sigma(x) σ(x) 表示 sigmoid 函数, w I w_{I} wI 表示目标单词, w o w_{o} wo 表示正样本的上下文单词,