gensimのword2vec/doc2vecで学習ロスを出力しつつ学習率alphaの値を変えて学習する


概要

gensimを使ったword2vec/doc2vecの実行は、下記のようにモデルを作成して学習させるだけで簡潔に実現できます。

# https://rare-technologies.com/word2vec-tutorial/
model = gensim.models.Word2Vec(iter=1)  # an empty model, no training yet
model.build_vocab(some_sentences)  # can be a non-repeatable, 1-pass generator
model.train(other_sentences) 

ただ、細かな学習の管理等はgensimにおまかせになってしまうので、なるべく丁寧なチューニングができるように、この記事では

  • 学習時に学習ロスを出力する
  • 学習率alphaの値を変えながら学習させる

の2つの方法を解説します。

ちなみにデフォルトでは学習率alphaの値はmin_alphaに向かって線形に落ちていくので、通常ならば今回のような方法を取らなくてもalphaおよびmin_alphaを指定すれば問題ありません。

alpha is the initial learning rate (will linearly drop to min_alpha as training progresses).
https://radimrehurek.com/gensim/models/word2vec.html

方法

学習時のロスを出力する

学習のロスを出力するためには、モデルにcompute_loss=Trueを指定の上でget_latest_training_loss()で取得できます。

model = word2vec.Word2Vec(min_count=1, compute_loss=True)
model.build_vocab(texts)
model.train(texts, total_examples=model.corpus_count, epochs=model.iter)

model.get_latest_training_loss()

alphaの値を変えながら学習させる

学習を繰り返す中で、学習率alphaを都度指定するようにします。なお、min_alphaが設定されているとalphaの値が小さくなっていくので、alphaと同じ値を入れて変化しないようにしています。

alpha = 0.025
alpha_delta = 0.001
passes = 20

loss_val_list = []
for epoch in range(passes):
    model.alpha, model.min_alpha = alpha, alpha
    model.train(texts, total_examples=model.corpus_count, epochs=model.iter)

    alpha -= alpha_delta
    loss_val_list.append(model.get_latest_training_loss())

また、上記で説明した学習ロスを出力してリストに格納しておくと、以下のように学習ロスを可視化することができます。

参考