RNNで時系列に逆伝播するのはなぜですか?


14

リカレントニューラルネットワークでは、通常、いくつかのタイムステップを順方向に伝播し、ネットワークを「展開」してから、入力シーケンス全体に逆方向に伝播します。

シーケンスの個々のステップごとに重みを更新しないのはなぜですか?(切り捨ての長さ1を使用するのと同じで、展開するものは何もありません)これにより、消失勾配の問題が完全に排除され、アルゴリズムが大幅に簡素化され、おそらくローカルミニマムで動けなくなる可能性が低くなり、最も重要なことにはうまく機能するようです。この方法でモデルをトレーニングしてテキストを生成しましたが、結果はBPTTトレーニングモデルで見た結果に匹敵するようでした。混乱しているのは、これまで見たRNNに関するすべてのチュートリアルが、BPTTを使用するように言っているからです。まるで適切な学習に必要であるかのように、そうではありません。

更新:回答を追加しました


この研究を行うための興味深い方向は、あなたがあなたの問題で達成した結果を標準的なRNN問題に関する文献で公開されているベンチマークと比較することです。それは本当にクールな記事になるでしょう。
シコラックスは、モニカを

「更新:回答を追加しました」は、以前の編集内容をアーキテクチャの説明と図に置き換えました。意図的ですか?
アメーバは、モニカの復活を

はい、それは実際の問題に関連していないようでしたので、私は実際にそれを取り出し、それは多くのスペースを取り上げたが、それは場合に役立ちます私は戻って、それを追加することができます
Frobot

まあ、人々はあなたのアーキテクチャを理解する上で大きな問題を抱えているようですので、追加の説明は役に立つと思います。必要に応じて、質問の代わりに回答に追加できます。
アメーバは

回答:


4

編集:2つの方法を比較するときに大きな間違いを犯し、答えを変更する必要があります。現在のタイムステップに戻るだけで、実際の学習が早くなります。クイックアップデートは、最も基本的なパターンを非常にすばやく学習します。しかし、より大きなデータセットとより長いトレーニング時間では、BPTTが実際にトップになります。私はほんの数エポックで小さなサンプルをテストしていましたが、レースに勝ち始めた人が勝者になると思いました。しかし、これは興味深い発見に私を導きました。単一のタイムステップだけを伝播してトレーニングを開始し、次にBPTTに変更し、伝播する範囲をゆっくりと増加させると、収束が速くなります。


更新していただきありがとうございます。では、ソースその最後の画像の彼はについてはこちらを言う一から一設定:「RNNのない処理のバニラモード、固定サイズの入力から固定サイズの出力(例えば画像分類)に」それが私たちが言っていたことです。説明したとおりの場合、状態はなく、RNNでもありません。「後方伝播する前に単一の入力を介して前方伝播する」-私はそれをANNと呼びます。しかし、これらはテキストではあまりうまく機能しないので、何かが起きています。コードを持っていないので、私は何がわからないのですか
ragulpr

私はその部分を読みませんでした、そしてあなたは正しいです。私が使用しているモデルは、実際には右端の「多対多」です。「1対1」のセクションでは、これらのすべてが実際に接続されており、図面では省略されていると想定していました。しかし、それは実際、私が気付かなかった右端のオプションの1つです(RNNについてのブログでその1つがあるのは奇妙なので、それらはすべて再発していると仮定しました)。回答のその部分を編集して、より意味のあるものにします
-Frobot

私はそれが事実だと想像しました、それが私があなたの損失関数を見ることを主張した理由です。それは多くに多くのなら、あなたの損失がに似ている、それは全体のシーケンスを入力環境/同一のRNNしている伝播するのですが、その後ちょうどBPTTは「あなた、すなわち切り捨てd投稿の赤い部分を計算しますが、それ以上再帰しません。error=tyty^t2
ラグルプル

私の損失関数は時間の経過とともに合計しません。1つの入力を取得し、1つの出力を取得してから損失を計算し、重みを更新してからt + 1に進みます。したがって、合計するものはありません。元の投稿に正確な損失関数を追加します
-Frobot

コードを投稿するだけで、もう推測することはありません。これはばかげています。
ラグルプル

2

RNNはディープニューラルネットワーク(DNN)であり、各レイヤーは新しい入力を取得できますが、同じパラメーターを持ちます。BPTは、このようなネットワークでのBack Propagationの凝った言葉であり、それ自体はGradient Descentの凝った言葉です。

言うRNN出力すなわちY Tの各ステップとにおける E R R O 、R T = Y T - Y T 2y^t

errort=(yty^t)2

重みを学習するには、「パラメーターの変更が損失関数にどの程度影響するか」という質問に答える関数の勾配が必要です。そして、次のように指定された方向にパラメーターを移動します。

errort=2yty^ty^t

つまり、各レイヤーで予測がどれほど優れているかについてフィードバックを得るDNNがあります。パラメーターの変更はDNNのすべてのレイヤー(タイムステップ)を変更するため、すべてのレイヤーが今後の出力に貢献するため、これを考慮する必要があります。

単純な1ニューロン1層ネットワークを使用して、これを半明示的に確認します。

y^t+1=f(a+bxt+cy^t)ay^t+1=f(a+bxt+cy^t)cay^tby^t+1=f(a+bxt+cy^t)(xt+cby^t)cy^t+1=f(a+bxt+cy^t)(y^t+ccy^t)y^t+1=f(a+bxt+cy^t)([0xty^t]+cy^t)

学習率1つのトレーニングステップがある: [ A B C ][ B C ] + δ Y T - Y TY Tδ

[a~b~c~][abc]+δ(yty^t)y^t

y^t+1y^tt

error=t(yty^t)2

おそらく、各ステップは集約に十分な粗雑な方向性に貢献するでしょうか?これはあなたの結果を説明するかもしれませんが、私はあなたの方法/損失関数についてもっと聞いてみたいです!また、2つのタイムステップでウィンドウ化されたANNとの比較にも興味があります。

edit4:コメントを読んだ後、あなたのアーキテクチャはRNNではないようです。

ht ステートフル

モデル:ステートレス-各ステップで再構築された非表示の状態 ステートレス edit2:DNNに参照を追加edit3:gradstepと表記法を修正edit5:回答/明確化後のモデルの解釈を修正


1
ご回答ありがとうございます。あなたは私がやっていることを誤解しているかもしれないと思います。前方伝播では1つのステップのみを実行するため、後方伝播でも1ステップのみです。トレーニングシーケンスの複数の入力にフォワードプロパゲートしません。集約で学習を可能にするのに十分な大まかな方向についてあなたが言っていることはわかりますが、数値的に計算された勾配で勾配を確認し、小数点以下10桁以上に一致しています。バックプロップは正常に動作します。クロスエントロピー損失を使用しています。
Frobot

1
私は、明確な比較のために、同じモデルを取り、BPTTで再トレーニングすることに取り組んでいます。また、この「ワンステップ」アルゴリズムを使用して翌日株価が上昇するか下降するかを予測するモデルをトレーニングしました。これによりまともな精度が得られるため、BPTTとシングルステップバックプロップを比較する2つの異なるモデルがあります。
Frobot

y^t+1=f(xt,xt1)

1
サイズ1のスライディングウィンドウを使用していますが、結果は、入力(xt、xt-1)でサイズ2のスライディングウィンドウを作成する場合とは大きく異なります。膨大なテキストを学習するときに意図的にオーバーフィットさせ、エラーなしでテキスト全体を再現できます。これには、入力として(xt、xt-1)しかなければ不可能な長期的な依存関係を知る必要があります。私が残した唯一の質問は、BPTTを使用することで依存関係を長くできるかどうかですが、正直なところそうではありません。
Frobot

y^t2y^t=0

1

dF(g(x),h(x),m(x))dx=Fgdgdx+Fhdhdx+Fmdmdx

tHtθxtHt1HttLθ

θxtθa(xt,θ)θHt1θθHt1の関数でした、バツt1θ そして Ht2。だがHt2 の関数でもありました θ。等々。


従来のRNNで時を経て伝播する理由を理解しています。従来のRNNがトレーニングに一度に複数の入力を使用する理由を見つけようとしていますが、一度に1つだけを使用する方がはるかに簡単で
効果的です-Frobot

RNNに複数の入力を一度に入力できる唯一の意味は、バッチの一部として複数のトレーニングサンプルを入力することです。バッチサイズは任意であり、どのサイズでも収束が保証されていますが、バッチサイズを大きくすると、勾配推定がより正確になり、収束が速くなる場合があります。
マシューハンプシー

「一度に複数の入力」という意味ではありません。あまり上手に言いませんでした。通常、トレーニングシーケンスの複数の入力を順方向に伝播し、次にそれらすべてを逆方向に伝播してから、重みを更新します。疑問は、なぜ全体のシーケンスを介して伝搬が一度にただ1つの入力を行っているとき、そんなに簡単で、まだ動作します
Frobot

ここでいくつかの説明が必要だと思います。「入力」と言うとき、あなたは複数のトレーニング例を参照していますか、それとも単一のトレーニング例内の複数の時間ステップを参照していますか?
マシューハンプシー

1
今日の終わりまでにこの質問に対する回答を投稿します。BPTTバージョンの作成を終了しました。トレーニングと比較が必要です。その後、まだコードを見たい場合は、見たいものを教えてください。まだ投稿できると思います
-Frobot
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.