元の LSTM ペーパーで説明されている実験 3a を解決しようとしました: http://deeplearning.cs.cmu.edu/pdfs/Hochreiter97_lstm.pdf tensorflow LSTM を使用して失敗しました
論文から: タスクは、入力シーケンスを観察してから分類することです。2 つのクラスがあり、それぞれが確率 0.5 で発生します。入力行は 1 つだけです。最初の N 個の実数値シーケンス要素だけが、クラスに関する関連情報を伝えます。位置 t > N のシーケンス要素は、平均がゼロで分散が 0.2 のガウス分布によって生成されます。
彼が論文で説明したネット アーキテクチャ: 「1 つの入力ユニット、1 つの出力ユニット、およびサイズ 1 の 3 つのセル ブロックを備えた 3 層ネットを使用します。出力層は、メモリ セルからのみ接続を受け取ります。メモリ セルとゲート ユニット入力ユニット、メモリ セル、ゲート ユニットから入力を受け取り、バイアスの重みを持ちます. ゲート ユニットと出力ユニットは、[0; 1] ではロジスティック シグモイド、[-1; 1] では h、[-2; 2] では g です。 "
T=100、N=3 の 3 つの隠れユニットを持つ LSTM で再現しようとしましたが失敗しました。
元の論文で説明されているように、オンライントレーニングを使用しました(つまり、各シーケンスの後に重みを更新します)
私のコードのコアは次のとおりです。
self.batch_size = batch_size = config.batch_size
hidden_size = 3
self._input_data = tf.placeholder(tf.float32, (1, T))
self._targets = tf.placeholder(tf.float32, [1, 1])
lstm_cell = rnn_cell.BasicLSTMCell(hidden_size , forget_bias=1.0)
cell = rnn_cell.MultiRNNCell([lstm_cell] * 1)
self._initial_state = cell.zero_state(1, tf.float32)
weights_hidden = tf.constant(1.0, shape= [config.num_features, config.n_hidden])
入力を準備する
inputs = []
for k in range(num_steps):
nextitem = tf.matmul(tf.reshape(self._input_data[:, k], [1, 1]) , weights_hidden)
inputs.append(nextitem)
outputs, states = rnn.rnn(cell, inputs, initial_state=self._initial_state)
最後の出力を使用する
pred = tf.sigmoid(tf.matmul(outputs[-1], tf.get_variable("weights_out", [config.n_hidden,1])) + tf.get_variable("bias_out", [1]))
self._final_state = states[-1]
self._cost = cost = tf.reduce_mean(tf.square((pred - self.targets)))
self._result = tf.abs(pred[0, 0] - self.targets[0,0])
optimizer = tf.train.GradientDescentOptimizer(learning_rate = config.learning_rate).minimize(cost)
なぜ学習できなかったのか、何か考えはありますか?
私の最初の本能は、クラスごとに 1 つずつ 2 つの出力を作成することでしたが、論文では、彼は具体的に 1 つの出力ユニットしか言及していませんでした。
ありがとう