如果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的对应的数组)
可以看出这里面的第(3),(11),(14),(16)发生了相应的变化,其余内容未发生相应的
变化,因为input_labels = [11,14,3,16]
接下来看对应的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的对应库
训练之前的矩阵
训练之后的对应矩阵
可以看出来,model.wv.vectors相当于前面的input_embed,model.trainables.syn1neg相当于前面的output_embed矩阵