DATAWHALE-动手学深度学习PyTorch skip gram -- 训练数据的形式+负采样实践trick

对Skip gram模型一直都只是知道思想,就是由中心词预测窗口内的背景词,但是从来没有动手实现过。这次有机会从头开始实现,发现了许多实践上的问题。

重点一:训练样本的形式

一开始非常纠结的一个问题是:每个训练样本的形式是什么样的?
例如,{w1, w2, w3, w4, w5},以w3为中心词,window_size为2,得到context为{w1,w2,w4,w5}。那么此时的训练样本到底是input=w3,target=[w1,w2,w4,w5],还是形成了四个训练样本input=w3,target=w1;input=w3,target=w2;input=w3,target=w4;input=w3,target=w5呢?

后来想了一下,觉得实际上两种做法是一样的。因为本质上,skip gram的做法就是认为context中的词的出现是独立的,也就是说条件概率P([w1,w2,w4,w5] | w3) = P(w1|w3)P(w2|w3)P(w4|w3)P(w5|w3)是成立的。具体来说,将四个背景词放入一个训练样本中得到的损失函数是logP(w1|w3)+logP(w2|w3)+logP(w4|w3)+logP(w5|w3), 而分别放入四个训练样本中,最终得到的损失函数也是四个交叉熵相加。因此两种做法没有本质上的区别,但是在实践中应该是放入一个训练样本是更优的做法。

重点二:加入负采样 实践的trick

在加入负采样后,在构建网络时和普通的skip gram有些不同。不加入负采样是,网络其实就是简单的一层embedding + 一层linear layer。加入负采样后,就可以再用一个embedding来代替linear layer,也就是一层embedding + 一层embedding。因为此时我们不需要获得所有词表中的单词出现的概率,仅需要知道相关的context词和选取的负采样词出现的概率。因此用一层embedding来获取这些词的词向量,与经过第一层embedding的中心词词向量做点乘,经过sigmoid(而不是softmax)来近似条件概率。这样反向传播时就只会更新这些词对应的权重。

你可能感兴趣的:(Deep,Learning,深度学习,python,神经网络,人工智能,机器学习)