rnnlmを作ってみる その2 誤差について
入力された単語に対して何が出力されるのか、ということは前回やりました。
今回は、rnnlmの学習でどのような誤差を評価するかについてです。
早速ですが、tensorflowのチュートリアル Recurrent Neural Networks | TensorFlow では下記のように書かれています
We want to minimize the average negative log probability of the target words:
N は文(書)中の単語の数、 は i番目の出力( これは語彙がM個だったらM個の単語それぞれが次に出現する確率となっている) のうちの正解の単語に対応する要素となります
学習データが、"今日 は 良い 天気 ですね" で、学習が "今日 は 良い" まで進んだとき、rnnlmの出力としては各単語の出現確率になるので、語彙が [今日, 昨日, は, 良い, 天気, ですね, カレーライス] だけであれば、これと同じ長さのベクトル(的なもの)が出力されるはずです。 これが [0.1, 0.1, 0.1, 0.1, 0.4, 0.1, 0.1] だとします。 学習データで "今日 は 良い" のあとに続くのは"天気" なので は この例だと0.4 となる、みたいな感じです。
チュートリアル本文ではこの計算は sequence_loss_by_example でできる、と書いてますがdeprecatedだったので少し前に tf.contrib.seq2seq.sequence_loss を利用するように書き換えられたようです。
チュートリアルのサンプルコードでこの誤差を計算しているのが下記です。
models/ptb_word_lm.py at master · tensorflow/models · GitHub
# Use the contrib sequence loss and average over the batches loss = tf.contrib.seq2seq.sequence_loss( logits, input_.targets, tf.ones([self.batch_size, self.num_steps], dtype=data_type()), average_across_timesteps=False, average_across_batch=True)
これで、理論的なところについてはだいたい準備できた感じだと思います。
次回から実装を進めていきます。