2017-04-16 7 views
3

私はNNにはかなり新しいので、何かをコピーする代わりにLSTMで自分の "Hello World"をやっています。私は次のような簡単なロジックを選択しました:LSTMトレーニングパターン

入力は3タイムステップです。最初は1または0のいずれかであり、残りの2つは乱数です。期待される出力は、入力の最初のタイムステップと同じです。データフィードは次のようになります。

_X0=[1,5,9] _Y0=[1] _X1=[0,5,9] _Y1=[0] ... 200 more records like this. 

この単純な(?)ロジックは100%正確に訓練できます。私は多くのテストを実行しました。最も効率的なモデルは3つのLSTMレイヤーで、それぞれ15個の隠しユニットがありました。これは、22エポック後に100%の精度を返した。

しかし、最初の12エポックでは、モデルは正確性(0.5のまま)で測定されても全く進展せず、カテゴリクロスエントロピー(0.69-0.65 )。その後、エポック12からエポック22までは、精度1.0まで非常に速く訓練されます。問題は、なぜこのようなトレーニングが行われるのでしょうか?なぜ最初の12個のエポックが進展していないのですか?12-22個のエポックがずっと効率的なのはなぜですか?それは多くの要因に依存する

from keras.models import Sequential 
from keras.layers import Input, Dense, Dropout, LSTM 
from keras.models import Model 
import helper 
from keras.utils.np_utils import to_categorical 

x_,y_ = helper.rnn_csv_toXY("LSTM_hello.csv",3,"target") 
y_binary = to_categorical(y_) 

model = Sequential() 
model.add(LSTM(15, input_shape=(3,1),return_sequences=True)) 
model.add(LSTM(15,return_sequences=True)) 
model.add(LSTM(15, return_sequences=False)) 
model.add(Dense(2, activation='softmax', kernel_initializer='RandomUniform')) 

model.compile(optimizer='adam', 
       loss='categorical_crossentropy', 
       metrics=['acc']) 
model.fit(x_, y_binary, epochs=100) 
+0

使用しているKerasのバージョンは?トレーニングログを投稿できますか? – nemo

+0

Keras 2.0.3を使用します – Manngo

答えて

1

これに対する具体的な答えを与えることは困難である:

は、ここに私の全体のコードです。ニューラルネットワークをトレーニングする際に重要な要因の1つは、選択したオプティマイザの学習率です。

あなたのコードでは、特定の学習率は設定されていません。 Keras 2.0.3のAdamのデフォルト学習率は0.001です。アダムはbeta_2beta_1の値は一般に、それぞれ0.9990.9のデフォルト値のままにさ

lr_t = lr * (sqrt(1. - beta_2**t)/(1. - beta_1**t)) . 

として定義された初期学習率(0.001)と現在のタイムステップに基づいて、動的学習率lr_tを使用します。あなたは、この学習率をプロットした場合、あなたはこのような何かの絵を得る:

Adam dynamic learning rate for epoch 1 to 22

それはちょうど、これは(おそらくグローバル)最小ローカルを見つけるためにあなたの重みを更新するためのスイートスポットであることかもしれません。学習率が高すぎると、エラーを減らす領域をスキップするだけでよく、学習率が低いほどエラーの位置が小さくなり、エラーの低い領域を見つけることができます。

確率的勾配降下(SGD)などの前提があまりないオプティマイザを使用し、この仮説を低い学習率でテストすることをお勧めします。