Kerasを使用したLSTM-RNNのハイパーパラメーター検索(Python)


18

Keras RNNチュートリアルから:「RNNには注意が必要です。バッチサイズの選択が重要であり、損失とオプティマイザーの選択が重要です。いくつかの構成は収束しません。」

したがって、これはKeras上のLSTM-RNNのハイパーパラメーターのチューニングに関するより一般的な質問です。RNNに最適なパラメーターを見つけるためのアプローチについて知りたいです。

KerasのGithubでIMDBの例から始めました。

メインモデルは次のようになります。

(X_train, y_train), (X_test, y_test) = imdb.load_data(nb_words=max_features,
                                                      test_split=0.2)

max_features = 20000
maxlen = 100  # cut texts after this number of words (among top max_features most common words)
batch_size = 32

model = Sequential()
model.add(Embedding(max_features, 128, input_length=maxlen))
model.add(LSTM(128))  
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

# try using different optimizers and different optimizer configs
model.compile(loss='binary_crossentropy',
          optimizer='adam',
          class_mode="binary")

print("Train...")
model.fit(X_train, y_train, batch_size=batch_size, nb_epoch=3,
      validation_data=(X_test, y_test), show_accuracy=True)
score, acc = model.evaluate(X_test, y_test,
                        batch_size=batch_size,
                        show_accuracy=True)

print('Test accuracy:', acc)
Test accuracy:81.54321846

81.5は公平なスコアであり、さらに重要なことは、モデルが完全に最適化されていなくても機能することを意味しています。

私のデータは時系列であり、タスクはバイナリ予測であり、例と同じです。そして今、私の問題は次のようになります。

#Training Data
train = genfromtxt(os.getcwd() + "/Data/trainMatrix.csv", delimiter=',', skip_header=1)
validation = genfromtxt(os.getcwd() + "/Data/validationMatrix.csv", delimiter=',', skip_header=1)

#Targets
miniTrainTargets = [int(x) for x in genfromtxt(os.getcwd() + "/Data/trainTarget.csv", delimiter=',', skip_header=1)]
validationTargets = [int(x) for x in genfromtxt(os.getcwd() + "/Data/validationTarget.csv", delimiter=',', skip_header=1)]

#LSTM
model = Sequential()
model.add(Embedding(train.shape[0], 64, input_length=train.shape[1]))
model.add(LSTM(64)) 
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

# try using different optimizers and different optimizer configs
model.compile(loss='binary_crossentropy',
          optimizer='adam',
          class_mode="binary")

model.fit(train, miniTrainTargets, batch_size=batch_size, nb_epoch=5,
      validation_data=(validation, validationTargets), show_accuracy=True)
valid_preds = model.predict_proba(validation, verbose=0)
roc = metrics.roc_auc_score(validationTargets, valid_preds)
print("ROC:", roc)
ROC:0.5006526

モデルは基本的にIMDBのモデルと同じです。結果は何も学んでいないことを意味しますが。ただし、バニラMLP-NNを使用すると、同じ問題は発生しません。モデルが学習し、スコアが増加します。エポックの数を増やしてLTSMユニットの数を増減しようとしましたが、スコアは上がりません。

理論上、アルゴリズムはこの時系列データ用の多層パーセプトロンネットワークよりも優れたパフォーマンスを発揮するはずなので、ネットワークをチューニングする標準的なアプローチを知りたいと思います。


1
どのくらいのデータがありますか?シーケンスの長さは?LSTMは、大量のデータと長期的な依存関係の問題でのみ本当に役立ちます。
pir

ランダム検索またはベイズ最適化は、ハイパー
パラメーター

1
埋め込み層が必要ですか?多くの時系列データセットでは必要ありません。
pir

IMDBの例のほぼ10万のデータポイントと2倍の機能があるので、それが問題だとは思いません。埋め込みレイヤーについては、LSTMレイヤーを入力にどの程度正確に接続しますか?ドキュメントによると、keras.io / layers / recurrent /#lstm KerasのLSTMは、引数として初期化、アクティベーション、およびoutput_dimのみを取ります。それがエラーの原因である場合、埋め込み層を削除する方法を説明するコードは大歓迎です。
wacax

私の答えをご覧ください。埋め込みレイヤーは必要ないようです。
-pir

回答:


5

埋め込みレイヤーは、正の整数(インデックス)を固定サイズの密なベクトルに変換します。たとえば、[[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]。この表現変換は、Kerasの埋め込みレイヤーで自動的に学習されます(ドキュメントを参照)。

ただし、変換を実行するためにデータにこのような埋め込みレイヤーは必要ないようです。不必要な埋め込み層があると、LSTMを適切に機能させることができない場合があります。その場合は、埋め込みレイヤーを単に削除する必要があります。

ネットワークの最初のレイヤーにinput_shapeは、データの次元に関する情報を含む引数を追加する必要があります(例を参照)。この引数は任意のレイヤーに追加できることに注意してください-特定のレイヤーのドキュメントには存在しません。


ところで、ハイパーパラメータは、ランダム検索またはベイジアン最適化を使用して調整されることがよくあります。RMSPropを使用して、バッチサイズ(32、64、128、256、512などのサイズ)、勾配クリッピング(0.1〜10の間隔)、ドロップアウト(0.1〜0.6の間隔)の調整に焦点を当てます。もちろん、詳細はデータとモデルのアーキテクチャに依存します。


埋め込みレイヤーを何に置き換えることを提案しますか?埋め込みレイヤーを単に削除しようとしましたが、うまくいきません。
wacax

1
他の例を見てください-例えば、高密度レイヤーから直接始めてください。input_shapeパラメーターを忘れずに設定してください。
pir

5

ハイパーパラメーター検索にはベイジアン最適化をお勧めしますが、スペアミントでは良い結果が得られました。https://github.com/HIPS/Spearmint商用利用には古いバージョンを使用する必要がある場合があります。


2

hyperopt(https://github.com/hyperopt/hyperopt)を使用することをお勧めします。これは、目的関数を与えられたハイパーパラメーターの最適値を検索するためのベイズ最適化の一種を使用します。スペアミントよりも直感的に使用できます。

PS:keras、hyperas(https://github.com/maxpumperla/hyperas)専用のhyperoptのラッパーがあります。使用することもできます。


2

タロスはまさにあなたが探しているものです。Kerasモデルのハイパーパラメーターの組み合わせを検索するための自動化されたソリューション。私は著者であるため、客観的ではないかもしれませんが、Kerasの機能を完全に公開しつつ、学習曲線を可能な限り低くした代替手段を提供することを意図しています。

別の方法として、すでに述べたように、Hyperas、またはSKlearnまたはAutoKerasを調べることができます。執筆時点では、これら4つはKerasユーザー向けのオプションです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.