[ハイブリッド機器]循環ニューラルネットワーク:LSTM、GRUユニット


[独自学習の機械学習+深さ学習]本に基づく整理文章
次のGithubリンクは、完全なソースコードを提供します.
Githubリンク
0.概要
一般的に、基本循環層は長詩皇后を学ぶのは難しい.距離が遠い単語情報は認識しにくいかもしれないが,これは時間が経つにつれてループの隠匿状態に含まれる情報が徐々に希釈されるためである.このため、LSTMおよびGRUユニットが発明された.
本編では,高度なループ層LSTMとGRUユニットを用いて多様なループニューラルネットワークを構築する.
1.トレーニングデータ、ダウンジャケットの準備
まず訓練に必要なデータを準備し,訓練グループと検証グループに分けた.
from tensorflow.keras.datasets import imdb
from sklearn.model_selection import train_test_split

(train_input, train_target), (test_input, test_target) = imdb.load_data(num_words=500)
train_input, val_input, train_target, val_target = train_test_split(train_input, train_target, test_size=0.2, random_state=42)
各サンプルの長さをケラスのpad_sequences()関数で100に調整した.
from tensorflow.keras.preprocessing.sequence import pad_sequences

train_seq = pad_sequences(train_input, maxlen = 100)
val_seq = pad_sequences(val_input, maxlen=100)
2. LSTM
LSTM(Long Short-term Memory)は、短期記憶を長時間記憶するために設計されている.複数の構造を持ち、入力と重み付け、スライスを加えて関数をアクティブにします.これらの計算結果は次の時間ステップで繰り返し使用されます.
2-1. LSTMユニットを使用した循環層の作成
前回の簡単なRNNではなくLSTMを使用します.
from tensorflow import keras

model = keras.Sequential()
model.add(keras.layers.Embedding(500, 16, input_length=100))
model.add(keras.layers.LSTM(8))
model.add(keras.layers.Dense(1,activation='sigmoid'))
RMSpropの学習率を0.0001に調整し、レイアウトサイズを64個、エポック回数を100に指定します.チェックポイントと早期終了も含まれています.
rmsprop = keras.optimizers.RMSprop(learning_rate = 1e-4)
model.compile(optimizer=rmsprop, loss='binary_crossentropy', metrics=['accuracy'])

checkpoint_cb = keras.callbacks.ModelCheckpoint('best-lstm-model.h5')
early_stopping_cb = keras.callbacks.EarlyStopping(patience=3, restore_best_weights=True)

history = model.fit(train_seq, train_target, epochs=100, batch_size=64, validation_data=[val_seq, val_target], callbacks=[checkpoint_cb, early_stopping_cb])
2-2. トレーニング損失と検証損失図の描画
import matplotlib.pyplot as plt
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()
グラフからLSTMは過剰な適応を抑えながらもよく訓練されていることがわかる.
2-3. ループレイヤにドロップダウンメニューを適用するには
ループレイヤは、取り外し機能を提供します.SimpleRNNおよびLSTMクラスは、いずれもdropoutパラメータおよびrecurrent_dropoutパラメータを有する.dropoutパラメータはユニットの入力アプリケーションに配置され、recurrent_dropoutパラメータはループの非表示状態アプリケーションに配置される.しかし、recurrent_dropoutはGPUトレーニングモデルを使用できない.
ここではdropoutを0.3と指定します.
model2 = keras.Sequential()
model2.add(keras.layers.Embedding(500, 16, input_length=100))
model2.add(keras.layers.LSTM(8, dropout=0.3))
model2.add(keras.layers.Dense(1, activation='sigmoid'))

rmsprop = keras.optimizers.RMSprop(learning_rate = 1e-4)
model2.compile(optimizer=rmsprop, loss='binary_crossentropy', metrics=['accuracy'])

checkpoint_cb = keras.callbacks.ModelCheckpoint('best-drop-model.h5')
early_stopping_cb = keras.callbacks.EarlyStopping(patience=3, restore_best_weights=True)

history = model2.fit(train_seq, train_target, epochs=100, batch_size=64, validation_data=[val_seq, val_target], callbacks=[checkpoint_cb, early_stopping_cb])
訓練と検証損失をグラフで描く.
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()

訓練損失と検証損失の差が縮小していることがわかる.
2-4. 2層接続
ループ層の隠匿状態は,試料の最後の時間ステップの隠匿状態に対してのみ次の層に伝達される.ただし、ループレイヤを作成する場合は、すべてのループレイヤに順序データが必要です.
ケラスのサイクルレイヤですべての時間ステップの非表示状態を出力するには、最後を除いて、他のすべてのサイクルレイヤはreturn_sequencesパラメータをTrueと指定します.
model3 = keras.Sequential()
model3.add(keras.layers.Embedding(500, 16, input_length=100))
model3.add(keras.layers.LSTM(8, dropout=0.3, return_sequences=True))
model3.add(keras.layers.LSTM(8, dropout=0.3))
model3.add(keras.layers.Dense(1, activation='sigmoid'))
LSTM層を2つ積み上げ,0.3に落下することを指定した.
その後モデルを訓練する.
rmsprop = keras.optimizers.RMSprop(learning_rate = 1e-4)
model3.compile(optimizer=rmsprop, loss='binary_crossentropy', metrics=['accuracy'])

checkpoint_cb = keras.callbacks.ModelCheckpoint('best-2rnn-model.h5')
early_stopping_cb = keras.callbacks.EarlyStopping(patience=3, restore_best_weights=True)

history = model3.fit(train_seq, train_target, epochs=100, batch_size=64, validation_data=[val_seq, val_target], callbacks=[checkpoint_cb, early_stopping_cb])
損失図を描く.
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()

高適合性を制御しすぎると同時に損失が低減することが分かる.
3.GRUニューラルネットワークのトレーニング
このセルはLSTMの簡略化されたバージョンと見なすことができ,LSTMのようにセル状態を計算するのではなく,1つの非表示状態のみを含む.
GRUユニットの重みはLSTMよりも小さいため、計算量は小さいが、性能はLSTMに劣らない.
model4 = keras.Sequential()
model4.add(keras.layers.Embedding(500, 16, input_length=100))
model4.add(keras.layers.GRU(8))
model4.add(keras.layers.Dense(1, activation='sigmoid'))

rmsprop = keras.optimizers.RMSprop(learning_rate = 1e-4)
model4.compile(optimizer=rmsprop, loss='binary_crossentropy', metrics=['accuracy'])

checkpoint_cb = keras.callbacks.ModelCheckpoint('best-gru-model.h5')
early_stopping_cb = keras.callbacks.EarlyStopping(patience=3, restore_best_weights=True)

history = model4.fit(train_seq, train_target, epochs=100, batch_size=64, validation_data=[val_seq, val_target], callbacks=[checkpoint_cb, early_stopping_cb])
出力損失図.
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()

ジャンプシュートは使用されていないため、訓練と検証の損失は以前より異なるが、訓練過程がうまく収束していることが確認された.