在 Gensim word2vec 模型中跟踪损失和嵌入

mel*_*wgs 4 gensim word2vec

我对 Gensim 很陌生,我正在尝试使用 word2vec 模型训练我的第一个模型。我看到所有参数都非常简单易懂,但是我不知道如何跟踪模型的损失以查看进度。此外,我希望能够在每个 epoch 之后获得嵌入,以便我还可以证明预测在每个 epoch 之后也变得更加合乎逻辑。我怎样才能做到这一点?

或者,每次训练iter=1并在每个 epoch 之后保存损失和嵌入是否更好?听起来效率不高。

代码不多,但仍将其发布在下面:

model = Word2Vec(sentences = trainset, 
             iter = 5, # epoch
             min_count = 10, 
             size = 150, 
             workers = 4, 
             sg = 1, 
             hs = 1, 
             negative = 0, 
             window = 9999)
Run Code Online (Sandbox Code Playgroud)

Mik*_*nov 11

gensim允许我们为此目的使用回调

例子:

from gensim.models.callbacks import CallbackAny2Vec

class MonitorCallback(CallbackAny2Vec):
    def __init__(self, test_words):
        self._test_words = test_words

    def on_epoch_end(self, model):
        print("Model loss:", model.get_latest_training_loss())  # print loss
        for word in self._test_words:  # show wv logic changes
            print(model.wv.most_similar(word))

"""
prepare datasets etc.
... 
...
"""

monitor = MonitorCallback(["word", "I", "less"])  # monitor with demo words
model = Word2Vec(sentences = trainset, 
             iter = 5, # epoch
             min_count = 10, 
             size = 150, 
             workers = 4, 
             sg = 1, 
             hs = 1, 
             negative = 0, 
             window = 9999, 
             callbacks=[monitor])
Run Code Online (Sandbox Code Playgroud)
  • 现在有一些问题get_latest_training_loss-可能是它的不正确(坏运气,现在github上是下降,无法查询)。我已经测试了这段代码并且损失增加了 - 看起来很奇怪。
  • 也许你更喜欢logging- gensim适合它。

  • 在当前的 gensim 版本(至少到 3.7.0)中,running-loss-tally 没有完全意义 - 它仅在每次调用 `train()` 时重置,而不是每个时期。有关如何解释损失增量(每个时期/回调)的更多信息,请参阅此线程,以及其他针对过度解释损失的注意事项:https://groups.google.com/d/msg/gensim/ZcxHCuPzksE /g7gUH5p4AgAJ (2认同)