Gensimのword2vecはエポック1から0の損失がありますか?

Aug 21 2020

GensimライブラリのWord2vecモジュールを使用して単語の埋め込みをトレーニングしています。データセットは400kの文で、100kの一意の単語が含まれています(英語ではありません)。

私はこのコードを使用して損失を監視および計算しています:

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))


monitor = MonitorCallback(["MyWord"])  # monitor with demo words

w2v_model = gensim.models.word2vec.Word2Vec(size=W2V_SIZE, window=W2V_WINDOW, min_count=W2V_MIN_COUNT  , callbacks=[monitor])

w2v_model.build_vocab(tokenized_corpus)

words = w2v_model.wv.vocab.keys()
vocab_size = len(words)
print("Vocab size", vocab_size)

print("[*] Training...")

# Train Word Embeddings
w2v_model.train(tokenized_corpus, total_examples=len(tokenized_corpus), epochs=W2V_EPOCH)

問題は、エポック1からの損失が0であり、監視対象の単語のベクトルがまったく変化しないことです。

[*] Training...
Model loss: 0.0
Model loss: 0.0
Model loss: 0.0
Model loss: 0.0

それで、ここでの問題は何ですか?これは正常ですか?トークン化されたコーパスは、tokenized_corpus [0] = ["word1"、 "word2"、...]のようなリストのリストです。

グーグルで検索したところ、古いバージョンのgensimの一部で損失関数の計算に問題があったようですが、それらはほぼ1年前のものであり、今すぐ修正する必要があるようです。

私はこの質問の答えで提供されたコードも試しましたが、それでも損失は0です:

トレーニング中に損失が減少しない(Word2Vec、Gensim)

EDIT1:compute_loss = Trueを追加した後、損失は表示されますが、それはどんどん高くなり続け、上位の類似した単語とそれらの類似性はまったく変わりません:

Model loss: 2187903.5
Model loss: 3245492.0
Model loss: 4103624.5
Model loss: 4798541.0
Model loss: 5413940.0
Model loss: 5993822.5
Model loss: 6532631.0
Model loss: 7048384.5
Model loss: 7547147.0

回答

1 gojomo Aug 21 2020 at 00:16

コードの最大の問題は、Word2Vec損失追跡をオンに切り替えるために必要な初期化パラメーターを使用していないことです。compute_loss=True

(の「パラメータ」セクションを参照してください https://radimrehurek.com/gensim/models/word2vec.html#gensim.models.word2vec.Word2Vec )。

その修正があっても、損失報告はまだかなりバグがあります(gensim-3.8.32020年8月のこの記事の執筆時点):

  • これは、エポックごとの合計、または例ごとの平均ではありません。(したがって、それが必要な場合は、回避策として、コールバックで最後の値を記憶してデルタを計算するか、内部カウンターを0.0各エポックの終わりにリセットする必要があります。)
  • 大規模なトレーニング実行では確実に精度が低下し、最終的には役に立たなくなります。(これはあなたにとって問題ではないかもしれません。)
  • マルチスレッドの値の上書きにより、一部の集計が失われる可能性があります。(損失額を調べている理由によっては、これは実際的な問題ではない場合があります。)