studylog/北の雲

chainer/python/nlp

chainerメモ8 後からEmbedIDの数を増やしたい

functions.EmbedID(in_size, out_size)

  • in_size (int) – Number of different identifiers (a.k.a. vocabulary size).
  • out_size (int) – Size of embedding vector.

RNN/LSTMでよく使うこれ。
EmbedID(単語の数, その単語のベクトル次元数)
みたいに使う。
これ後から単語のボキャブラリーが増えちゃう場合どうするんだろう。サンプル見るとだいたい最初に学習用の全文章を読み込んで全単語の数を計算してからEmbedIDに投げてるけど、後から追加の文章を読み込ませようとして未知の単語が来ちゃう場合はどうするのか。何か公式のやり方があるのかもしれないけどドキュメント見てもわからんかった。


なので自力で増やすコードを書いてみる。EmbedIDのソースからinitと似た感じで、
10単語追加、ベクトルが1000次元なら

embed=F.EmbedID(30, 1000) #これが元 30単語 1000次元

#追加するコード
def add_embed(embed , add_counts , dimension):
    add_W = numpy.random.randn(add_counts, dimension).astype(numpy.float32)
    add_gW = numpy.empty((add_counts,dimension)).astype(numpy.float32)

    embed.W = np.r_[embed.W , add_W]
    embed.gW = np.r_[embed.gW, add_gW]
    return embed

#これで追加
embed = add_embed(embed , 10 , 1000) #10単語追加

一応見た目上はちゃんと動いてると思うけれど自信は無い。