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)来近似条件概率。这样反向传播时就只会更新这些词对应的权重。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值