Gensim 3.8.3 Word2Vec 不更新玩具数据集的权重/参数

问题描述

我正在尝试在一个包含 4 个句子的简单玩具数据集上训练 word2vec 模型。 我需要的 Word2vec 版本是:

  • Skip-gram 模型
  • 无负抽样
  • 无分层 soft-max
  • 不会删除或缩减常用词
  • 单词的向量大小为 2
  • 窗口大小 4,即句子中的所有单词都被视为彼此的上下文单词。
  • epochs 可以从 1 到 500 不等

我面临的问题是:无论我如何改变上述参数,词向量都没有被更新/学习。 epochs=1 和 epochs=500 的词向量是相同的。

from gensim.models import Word2Vec
import numpy as np
import matplotlib.pyplot as plt
import nltk

# toy dataset with 4 sentences
sents = ['what is the time','what is the day','what time is the meeting','cancel the meeting']

sents = [nltk.word_tokenize(string) for string in sents]

# model initialization and training
model = Word2Vec(alpha=0.5,min_alpha =0.25,min_count = 0,size=2,window=4,workers=1,sg = 1,hs = 0,negative = 0,sample=0,seed = 42)

model.build_vocab(sents)
model.train(sents,total_examples=4,epochs=500)

# getting word vectors into array
vocab = model.wv.vocab.keys()
vocab_vectors = model.wv[vocab]
print(vocab)
print(vocab_vectors)

#plotting word vectors
plt.scatter(vocab_vectors[:,0],vocab_vectors[:,1],c ="blue")
for i,word in enumerate(vocab):
    plt.annotate(word,(vocab_vectors[i,vocab_vectors[i,1]))

print(vocab)输出如下

['what','is','time','cancel','the','meeting','day']

print(vocab_vectors)输出如下

[[ 0.08136337 -0.05059118]
 [ 0.06549312 -0.22880174]
 [-0.08925873 -0.124718  ]
 [ 0.05645624 -0.03120007]
 [ 0.15067646 -0.14344342]
 [-0.12645201  0.06202405]
 [-0.22905378 -0.01489289]]

绘制的二维向量

Here!

为什么我认为没有学习向量?我将 epochs 值更改为 1、10、50、500...并运行整个代码以检查每次运行的输出.对于 epochs = #any_value ,所有运行的输出(vocab、vocab_vectors 和绘图)都相同。

解决方法

通过提供参数 negative=0,hs=0,您已禁用两种训练模式,并且没有进行任何训练。

您应该保留默认的非零 negative 值,或者在禁用负采样(使用 hs=1,negative=0)的同时启用非默认的分层 softmax 模式。

其他想法:

  • 在 INFO 级别启用日志记录通常很有帮助,并且可能会显示进度输出,这更好地向您暗示没有进行真正的培训
  • Etill 使用一个很小的玩具数据集,最大的暗示是所有训练都被禁用了——可疑地立即完成了训练——几乎与少量训练无法区分。通常,对于小数据集(和小向量大小),很多事情会很奇怪或令人失望,因为 word2vec 通常的好处实际上取决于大量文本。
  • 降低 min_count 对于任何现实数据集通常都是一个坏主意,因为 word2vec 需要多个不同的单词用法示例来训练有用的向量 - 通常忽略稀有单词比混合不完整的信息要好。
  • 更改默认值 alpha/min_alpha 通常也是一个坏主意 - 尽管在这里您可能只是尝试使用极端值来触发任何更改。