MNIST LSTMの例では、「隠しレイヤー」の意味がわかりません。時間をかけて展開されたRNNを表すときに形成される想像上の層ですか?
ほとんどの場合、num_units = 128
はなぜですか?
これを理解するにはcolahのブログを詳細に読む必要があることは知っていますが、その前に、私が持っているサンプル時系列データで動作するコードを取得したいだけです。
隠れユニットの数は、ニューラルネットワークの学習能力の直接的な表現です-これは、学習されたパラメーターの数を反映しています。値128
は、任意または経験的に選択された可能性があります。その値を実験的に変更し、プログラムを再実行して、トレーニングの精度にどのように影響するかを確認できます(隠しユニットが少ない少ないことで、テストの精度が90%を超えることができます)。より多くのユニットを使用すると、トレーニングセット全体を完全に記憶する可能性が高くなります(ただし、時間がかかるため、過剰適合のリスクがあります)。
理解すべき重要なことは、有名な Colahのブログ投稿 (find "find(===)"各行にベクトル全体が含まれています ")では多少微妙ですが、それはX
は、データのarrayです(最近では tensorと呼ばれます) )-scalar値であることを意図したものではありません。たとえば、tanh
関数が表示されている場合、その関数が配列全体でbroadcastであることを暗黙に示しています(暗黙のfor
ループ)- -タイムステップごとに1回だけ実行されるわけではありません。
そのため、hidden unitsはネットワーク内の有形のストレージを表します。これは主にweights配列のサイズに現れます。また、LSTMには実際に学習したモデルパラメーターとは別の内部ストレージが少しあるため、ユニットの数を知る必要があります。これは最終的にウェイトのサイズと一致する必要があります。最も単純なケースでは、RNNには内部ストレージがありません。そのため、RNNが適用されている「隠しユニット」の数を事前に知る必要さえありません。
サイドノート: この表記法 は、統計や機械学習、および一般的な式で大量のデータを処理する他のフィールドで非常に一般的です(3Dグラフィックスは別の例です)。 for
ループが明示的に書き出されるのを期待する人には少し慣れる必要があります。
引数n_hidden
of BasicLSTMCell
は、LSTMの非表示ユニットの数です。
あなたが言ったように、LSTMを理解するにはColahの ブログ投稿 を実際に読んでください。
形状[T, 10]
の入力x
がある場合、LSTMにt=0
からt=T-1
までの値のシーケンスを、それぞれサイズ10
で供給します。
各タイムステップで、入力に形状[10, n_hidden]
の行列を乗算し、n_hidden
ベクトルを取得します。
LSTMは各タイムステップで取得しますt
:
h_{t-1}
、サイズn_hidden
(t=0
で、前の状態は[0., 0., ...]
)n_hidden
に変換された入力h_t
の次の非表示状態n_hidden
を生成しますコードを機能させたいだけの場合は、n_hidden = 128
をそのままにしておけば大丈夫です。
LSTMは、時間とともに伝播する2つの情報を保持します。
hidden
状態;これは、LSTMが(forget, input, and output)
ゲートを使用して時間とともに蓄積するメモリであり、以前のタイムステップ出力です。
Tensorflowのnum_units
は、LSTMの非表示状態のサイズです(投影が使用されない場合の出力のサイズでもあります)。
名前num_units
をより直感的にするには、LSTMセル内の非表示ユニットの数、またはセル内のメモリユニットの数と考えることができます。
this の投稿を見て、より明確に
TFユーザーにとっては、「num_hidden」という用語で混乱を招くと思います。実際には、展開されたLSTMセルとは何の関係もありません。それはテンソルの次元であり、時間ステップ入力テンソルからLSTMセルに変換されて入力されます。
さまざまなソースからの情報を組み合わせるのにいくつかの問題があったので、ブログ投稿( http://colah.github.io/posts/2015-08-Understanding-LSTMs / )and( https://jasdeep06.github.io/posts/Understanding-LSTM-in-Tensorflow-MNIST/ )ここで、グラフィックは非常に役立つが、説明に誤りがあると思うnumber_units。
複数のLSTMセルが1つのLSTM層を形成します。これを次の図に示します。ほとんどの場合、非常に広範囲のデータを扱うため、すべてを1つのモデルに組み込むことはできません。したがって、データはバッチとして小片に分割され、最後の部分を含むバッチが読み込まれるまで次々に処理されます。図の下の部分では、バッチが読み込まれる入力(暗い灰色)を確認できます。バッチ1からバッチbatch_sizeまで次々と。上記のセルLSTMセル1からLSTMセルtime_stepは、LSTMモデルの記述されたセルを表します( http://colah.github.io/posts/2015-08-Understanding-LSTMs/ )。セルの数は、固定タイムステップの数に等しくなります。たとえば、合計150文字のテキストシーケンスを取得する場合、それを3(batch_size)に分割し、バッチごとに長さ50のシーケンス(time_stepsの数、したがってLSTMセルの数)を持つことができます。その後、各文字をワンホットでエンコードすると、各要素(入力の濃い灰色のボックス)は、語彙の長さ(特徴の数)を持つベクトルを表します。これらのベクトルは、それぞれのセルのニューロンネットワーク(セル内の緑の要素)に流れ込み、その次元を隠れユニットの数の長さに変更します(number_units)。したがって、入力には次元(batch_size x time_step x features)があります。長時間メモリ(セル状態)と短時間メモリ(非表示状態)のディメンションは同じです(batch_size xnumber_units)。セルから生じる明るい灰色のブロックは、ニューラルネットワーク(緑の要素)の変換が非表示の単位(batch_size x time_step xnumber_units)。出力はどのセルからでも返すことができますが、前のタイムステップからのすべての情報が含まれているため、ほとんどの場合、最後のブロック(黒い境界線)からの情報のみが関連します(すべての問題ではありません)。
この用語num_units
またはnum_hidden_units
は、実装で変数名nhid
を使用して表記される場合があり、LSTMセルへの入力は次元nhid
(またはバッチ実装では、形状のマトリックスbatch_size
x nhid
)になります。その結果、RNN/LSTM/GRUセルは入力ベクトルまたは行列の次元を変更しないため、(LSTMセルからの)出力も同じ次元になります。
先に指摘したように、この用語はフィードフォワードニューラルネットワーク(FFN)の文献から借用されており、RNNのコンテキストで使用すると混乱を引き起こしています。しかし、考え方は、RNNでさえ、各タイムステップでFFNとしてviewedできるです。このビューでは、この図に示されているように、非表示レイヤーには実際にnum_hidden
ユニットが含まれます。
ソース: nderstanding LSTM
より具体的には、以下の例では、num_hidden_units
またはnhid
はになります。これは非表示状態のサイズ(中間層)が- Dベクトル。