web-dev-qa-db-ja.com

Kerasでreturn_sequencesオプションとTimeDistributedレイヤーを使用する方法は?

以下のようなダイアログコーパスがあります。そして、システムアクションを予測するLSTMモデルを実装したいと思います。システムアクションはビットベクトルとして記述されます。また、ユーザー入力は、ビット埋め込みでもあるワード埋め込みとして計算されます。

t1: user: "Do you know an apple?", system: "no"(action=2)
t2: user: "xxxxxx", system: "yyyy" (action=0)
t3: user: "aaaaaa", system: "bbbb" (action=5)

したがって、私が実現したいのは、「多対多(2)」モデルです。モデルがユーザー入力を受け取ると、システムアクションを出力する必要があります。 enter image description here しかし、理解できないreturn_sequencesオプションおよびLSTM後のTimeDistributedレイヤー。 「多対多(2)」を実現するには、return_sequences==TrueおよびLSTMが必要な後にTimeDistributedを追加しますか?それらの説明をもっとお願いします。

return_sequences:ブール値。出力シーケンスの最後の出力を返すか、完全なシーケンスを返すか。

TimeDistributed:このラッパーを使用すると、入力のすべての一時スライスにレイヤーを適用できます。

2017/03/13 17:40に更新

return_sequenceオプション。しかし、TimeDistributedについてはまだわかりません。 LSTMの後にTimeDistributedを追加した場合、モデルは以下の「多対多(2)」と同じですか?したがって、出力ごとに密なレイヤーが適用されると思います。 enter image description here

34
jef

LSTMレイヤーとTimeDistributedラッパーは、必要な「多対多」の関係を得るための2つの異なる方法です。

  1. LSTMは文の単語を1つずつ食べます。「return_sequence」を使用して、各ステップで(各Wordが処理された後)何か(状態)を出力するか、最後のWordが食べられた後にのみ出力するかを選択できます。したがって、return_sequence = TRUEの場合、出力は同じ長さのシーケンスになり、return_sequence = FALSEの場合、出力は1つのベクトルになります。
  2. TimeDistributed。このラッパーを使用すると、1つのレイヤー(たとえば、高密度)をシーケンスのすべての要素に適用できます独立して。そのレイヤーは、すべての要素に対してまったく同じ重みを持ち、各単語に適用されるものと同じです。もちろん、独立して処理された単語のシーケンスを返します。

ご覧のとおり、2つの違いは、LSTMが「シーケンスを介して情報を伝播し、1つのWordを消費し、その状態を更新してから返すかどうかです。その後、情報を保持しながら次のWordに進みます。 TimeDistributedの場合と同様に、単語はサイロ内にあり、すべての単語に同じレイヤーが適用されるかのように、単語自体が同じ方法で処理されます。

したがって、LSTMとTimeDistributedを連続して使用する必要はありません。必要なことは何でもできます。それぞれの機能を念頭に置いてください。

私はそれがより明確であることを願っていますか?

編集:

あなたの場合、分散時間は、LSTMによって出力されたすべての要素に密なレイヤーを適用します。

例を見てみましょう。

Emb_sizeディメンションに埋め込まれた一連のn_wordsワードがあります。したがって、入力は形状の2Dテンソル_(n_words, emb_size)_

最初に、出力次元= _lstm_output_および_return_sequence = True_のLSTMを適用します。出力はまだシーケンスであるため、形状_(n_words, lstm_output)_の2Dテンソルになります。したがって、長さlstm_outputのn_wordsベクトルがあります。

ここで、Denseのパラメーターとして、たとえば3次元の出力を持つTimeDistributed高密度レイヤーを適用します。したがって、TimeDistributed(Dense(3))。これにより、シーケンスのサイズlstm_outputのすべてのベクトルに独立してDense(3)n_words回適用されます...それらはすべて長さ3のベクトルになります。出力はシーケンスなので、形状は現在_(n_words, 3)_。

より明確ですか? :-)

39
Nassim Ben
    return_sequences=True parameter:

通常のニューラルネットワークで行ったような単一のベクトルではなく、出力用のシーケンスが必要な場合は、return_sequencesをTrueに設定する必要があります。具体的には、形状(num_seq、seq_len、num_feature)の入力があるとします。 return_sequences = Trueを設定しない場合、出力は形状(num_seq、num_feature)になりますが、設定する場合、形状(num_seq、seq_len、num_feature)で出力を取得します。

    TimeDistributed wrapper layer:

LSTMレイヤーでreturn_sequences = Trueを設定したため、出力は3次元ベクトルになりました。これを密なレイヤーに入力すると、密なレイヤーは2次元の入力のみを受け入れるため、エラーが発生します。 3次元ベクトルを入力するには、TimeDistributedというラッパーレイヤーを使用する必要があります。このレイヤーは出力の形状を維持するのに役立ち、最終的に出力としてシーケンスを実現できます。

5
naaviii