Word2vec Gensim mengalami kerugian 0 dari epoch 1?

Aug 21 2020

Saya menggunakan modul Word2vec dari pustaka Gensim untuk melatih penyematan kata, datasetnya adalah 400k kalimat dengan 100k kata unik (bukan bahasa Inggris)

Saya menggunakan kode ini untuk memantau dan menghitung kerugian:

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)

Masalahnya adalah dari epoch 1 kerugiannya adalah 0 dan vektor dari kata-kata yang dipantau tidak berubah sama sekali!

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

jadi apa masalahnya disini? Apakah ini normal? tokenized corpus adalah daftar daftar yang mirip dengan tokenized_corpus [0] = ["word1", "word2", ...]

Saya mencari di Google dan sepertinya beberapa versi lama gensim bermasalah dengan fungsi penghitungan kerugian, tetapi mereka berasal dari hampir setahun yang lalu dan sepertinya itu harus diperbaiki sekarang?

Saya mencoba kode yang diberikan dalam jawaban pertanyaan ini juga tetapi tetap saja kerugiannya 0:

Kerugian tidak berkurang selama pelatihan (Word2Vec, Gensim)

EDIT1: setelah menambahkan compute_loss = True, kerugian muncul, tetapi terus semakin tinggi, dan kata-kata paling mirip dan kesamaannya tidak berubah sama sekali:

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

Jawaban

1 gojomo Aug 21 2020 at 00:16

Masalah teratas dengan kode Anda adalah Anda belum menggunakan Word2Vecparameter inisialisasi yang diperlukan untuk mengaktifkan pelacakan kerugian:compute_loss=True

(Lihat bagian 'parameter' dari https://radimrehurek.com/gensim/models/word2vec.html#gensim.models.word2vec.Word2Vec )

Bahkan dengan perbaikan itu, pelaporan kerugian masih cukup bermasalah (pada gensim-3.8.3& tulisan ini pada Agustus 2020):

  • itu bukan total per epoch, atau rata-rata per contoh, yang mungkin diharapkan. (Jadi jika Anda membutuhkannya, sebagai solusinya, callback Anda harus mengingat nilai terakhir dan menghitung delta, atau menyetel ulang penghitung internal ke 0.0, setiap akhir zaman.)
  • itu pasti kehilangan ketepatan dalam latihan yang lebih besar, akhirnya menjadi tidak berguna. (Ini mungkin tidak menjadi masalah bagi Anda.)
  • mungkin kehilangan beberapa penghitungan karena penimpaan nilai multithread. (Ini mungkin bukan masalah praktis bagi Anda, tergantung mengapa Anda berkonsultasi dengan nilai kerugian.)