以下のようなダイアログコーパスがあります。そして、システムアクションを予測する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)」モデルです。モデルがユーザー入力を受け取ると、システムアクションを出力する必要があります。 しかし、理解できないreturn_sequences
オプションおよびLSTM後のTimeDistributed
レイヤー。 「多対多(2)」を実現するには、return_sequences==True
およびLSTMが必要な後にTimeDistributed
を追加しますか?それらの説明をもっとお願いします。
return_sequences:ブール値。出力シーケンスの最後の出力を返すか、完全なシーケンスを返すか。
TimeDistributed:このラッパーを使用すると、入力のすべての一時スライスにレイヤーを適用できます。
return_sequence
オプション。しかし、TimeDistributed
についてはまだわかりません。 LSTMの後にTimeDistributed
を追加した場合、モデルは以下の「多対多(2)」と同じですか?したがって、出力ごとに密なレイヤーが適用されると思います。
LSTMレイヤーとTimeDistributedラッパーは、必要な「多対多」の関係を得るための2つの異なる方法です。
ご覧のとおり、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)
_。
より明確ですか? :-)
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というラッパーレイヤーを使用する必要があります。このレイヤーは出力の形状を維持するのに役立ち、最終的に出力としてシーケンスを実現できます。