web-dev-qa-db-ja.com

Tensorflow 2.0で単純なLSTMレイヤーの上に注意を向ける

私は1つのLSTMと2つの密な層の単純なネットワークを持ちます。

model = tf.keras.Sequential()
model.add(layers.LSTM(20, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(layers.Dense(20, activation='sigmoid'))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(loss='mean_squared_error')
 _

分類を目的として、3つの入力(正規化0から1.0)と1出力(バイナリ)のデータを訓練しています。データは、時間ステップ間の関係がある時系列データである。

    var1(t)   var2(t)   var3(t)  var4(t)
0  0.448850  0.503847  0.498571      0.0
1  0.450992  0.503480  0.501215      0.0
2  0.451011  0.506655  0.503049      0.0
 _

モデルはそのように訓練されています。

history = model.fit(train_X, train_y, epochs=2800, batch_size=40, validation_data=(test_X, test_y), verbose=2, shuffle=False)
model.summary()
 _

モデルの概要を与える:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm (LSTM)                  (None, 20)                1920      
_________________________________________________________________
dense (Dense)                (None, 20)                420       
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 21        
=================================================================
Total params: 2,361
Trainable params: 2,361
Non-trainable params: 0
 _

モデルは合理的にうまく機能します。今、私は密な(20)層を注意層と交換しようとしています。すべての例、チュートリアルなどのオンライン(TFドキュメントを含む)は、入力層に埋め込み層を持つSEQ2SEQモデル用です。 TF v1.xのSEQ2SEQ実装を理解していますが、やろうとしていることについての文書を見つけることができません。私は新しいAPI(v2.0)を信じています。

lstm = layers.LSTM(20, input_shape=(train_X.shape[1], train_X.shape[2]), return_sequences=True)
lstm = tf.keras.layers.Bidirectional(lstm)
attention = layers.Attention() # this does not work

model = tf.keras.Sequential()
model.add(lstm)
model.add(attention)
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(loss='mean_squared_error')
 _

そしてもちろん、私はエラーを取得します注意層を入力リストのリスト、すなわち[照会、value]、[照会、値、キー]

この場合、この場合はこの場合(固定長入力の時系列データ)の解決策を理解していません。このタイプの問題に注意を向けるという考えは大歓迎です。

10
greco.roamin

私は最終的に問題に対する2回の回答を見つけました.pypi.orgのライブラリからの両方からです。最初は 自己注意 、以下のようにKeras(Pre TF 2.0統合版Keras)で実装できます...

        model = keras.models.Sequential()
        model.add(keras.layers.LSTM(cfg.LSTM, input_shape=(cfg.TIMESTEPS,
                  cfg.FEATURES),
                  return_sequences=True))
        model.add(SeqSelfAttention(attention_width=cfg.ATTNWIDTH,
                attention_type=SeqSelfAttention.ATTENTION_TYPE_MUL,
                attention_activation='softmax',
                name='Attention'))
        model.add(keras.layers.Dense(cfg.DENSE))
        model.add(keras.layers.Dense(cfg.OUTPUT, activation='sigmoid'))
 _

それを行う2つ目は、 より一般的な解決策 それは次のようにPost TF 2.0統合カーラスで動作します...

        model = tf.keras.models.Sequential()
        model.add(layers.LSTM(cfg.LSTM, input_shape=(cfg.SEQUENCES,
                  train_X.shape[2]),
                  return_sequences=True))
        model.add(Attention(name='attention_weight'))
        model.add(layers.Dense(train_Y.shape[2], activation='sigmoid'))
 _

彼らはそれぞれ少し違う振舞い、そして非常に異なる結果を生み出します。セルフアテンションライブラリは、3から2の寸法を縮小し、入力ベクトルごとに予測を予測します。一般的な注意メカニズムは3Dデータと出力3Dを維持し、予測しているときに一括あたりの予測だけを受けます。入力ベクトルごとに予測が必要な場合は、1のバッチサイズを持つように予測データを再設定することでこれを解決できます。

結果については、自己注意はLSTMのみに優れた結果を生み出しましたが、ドロップアウトやより密集した層などの他の機能強化よりも優れていません。一般的な注意は、LSTMモデルに利益を追加していないようです。事件は物事を悪化させますが、私はまだ調査しています。

いずれにせよ、それはできますが、これまでのところそれが行われるべきであるならば疑わしいです。

0
greco.roamin