skip-gram-负采样中的神经网络操作过程详解

如果batch_size = 128,正采样的单词左右各采样相应的3个单词,共采样6个单词
负采样共采样对应的60个相应的单词,则输入的矩阵中input_embedding = [128]
pos_embedding = [128,6],neg_embedding = [128,60](注意这里面的batch=128的
情况下,每一次输入单词的维度应该一致)
然后使用扩充维度的操作使得input_embedding = [128,100],pos_embedding =
[128,6,100],neg_embedding = [128,60,100]
接下来使用input_embedding.unsqueeze(2)使得input_embedding.unsqueeze(2) =
[128,100,1],然后将操作log_pos = pos_embedding ∗ * input_embedding.unsqueeze(2) =
[128,6,100] ∗ * [128,100,1] = [128,6,1] (这里只有后面的两个维度进行相应的乘法操作)
所以log_pos = [128,6,1],接下来使用log_pos = log_pos.squeeze()使得log_pos = [128,6]
log_neg = neg_embedding ∗ * (-input_embedding.unsqueeze(2))(因为这里是负采样,所以
需要对neg_embedding进行相应的负号操作)
log_neg = [128,60,100] ∗ * [128,100,1] = [128,60,1]
然后使用log_pos = F.logsigmoid(log_pos).sum(1),log_pos = [batch_size]
log_neg = F.logsigmoid(log_neg).sum(1),log_neg = [batch_size]
loss = log_pos+log_neg 返回-loss
然后我们观察每次迭代过程中其中的input_embedding与output_embedding内容的比较,每次迭代的过程如下:
每次迭代的过程

过程中输出的对应的input_embedding以及output_embedding的相应的数组如下
(这是一个简化过的batch = 20,维度为5的对应的数组)
input_embedding内容的比较可以看出这里面的第(3),(11),(14),(16)发生了相应的变化,其余内容未发生相应的
变化,因为input_labels = [11,14,3,16]
接下来看对应的output_labels发生的相应的变化
output_labels数组发生的变化可以看到其中的(0),(1),(2),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(16)发生了相应的变化,(3),(17),(18),(19)未发生相应的变化,
回过头来看pos_labels以及neg_labels的对应的信息
pos_labels = ([[10,12],[13,15],[2,4],[15,0]])
neg_labels = ([[9,16,4,8,7,14],[6,13,8,8,15,2],[1,2,14,5,16,11],[4,14,0,11,1,10]])
可以看出pos_labels以及neg_labels之中未包含[3,17,18,19]的相应的内容,所以[3,17,18,19]未发生变化
接下来我们实际调用一下python之中已有的相应的word2Vec的对应库
word2Vec对应的库
训练之前的矩阵
训练之前的对应矩阵训练之后的对应矩阵
训练之后的对应权重矩阵训练之后的对应的负采样矩阵可以看出来,model.wv.vectors相当于前面的input_embed,model.trainables.syn1neg相当于前面的output_embed矩阵

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值