ResNet経由の勾配バックプロパゲーションは接続をスキップします


22

ResNetモジュール/スキップ接続を使用してニューラルネットワークを介して勾配がどのように逆伝播されるかについて興味があります。ResNetに関するいくつかの質問(スキップレイヤー接続のニューラルネットワークなど)を見てきましたが、これは特にトレーニング中の勾配の逆伝播について尋ねています。

基本的なアーキテクチャは次のとおりです。

ここに画像の説明を入力してください

この論文「画像認識のための残差ネットワークの研究」を読み、セクション2で、ResNetの目標の1つが、勾配がベースレイヤーに逆伝播するためのより短い/より明確なパスを可能にすることについて話します。

勾配がこのタイプのネットワークをどのように流れているのか説明できますか?加算操作、および加算後のパラメーター化されたレイヤーの欠如が、より良い勾配伝播を可能にする方法をよく理解していません。加算演算子を介して流れるときに勾配が変化せず、乗算なしで何らかの形で再配布される方法と関係がありますか?

さらに、グラデーションがウェイトレイヤーを通過する必要がない場合、消失するグラデーションの問題がどのように軽減されるかを理解できますが、ウェイトを通るグラデーションフローがない場合、逆方向パス後にどのように更新されますか?


ちょうどばかげた質問、なぜxをスキップ接続として渡し、inverse(F(x))を計算してxを最後に取得しないのですか?それは計算の複雑さの原因ですか?
ヤシュクマールアトリ

私はあなたのポイントthe gradient doesn't need to flow through the weight layersを得ることができませんでした、あなたはそれを説明できますか?
anu

回答:


13

[追加]は、グラデーションを両方の入力に均等に送り返します。次をtensorflowで実行することで、これを納得させることができます。

import tensorflow as tf

graph = tf.Graph()
with graph.as_default():
    x1_tf = tf.Variable(1.5, name='x1')
    x2_tf = tf.Variable(3.5, name='x2')
    out_tf = x1_tf + x2_tf

    grads_tf = tf.gradients(ys=[out_tf], xs=[x1_tf, x2_tf])
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        fd = {
            out_tf: 10.0
        }
        print(sess.run(grads_tf, feed_dict=fd))

出力:

[1.0, 1.0]

したがって、勾配は次のようになります。

  • スキップレイヤー接続を介して、変更されずに前のレイヤーに渡される
  • 重み付きでブロックに渡され、それらの重みを更新するために使用されます

編集:質問があります:「高速道路接続とニューラルネットブロックが再び結合するポイントでの操作は、図2の下部にありますか?」

答えは次のとおりです。それらは合計されます。これは、図2の式からわかります。

出力Fバツ+バツ

これが言うことは:

  • バス内の値()バツ
  • バス値をネットワーク経由で渡した結果、つまり追加されますバツFバツ
  • ここでというラベルを付けた残差ブロックからの出力を提供します出力

編集2:

わずかに異なる単語で書き換える:

  • 順方向では、入力データはバスを流れます
    • バスに沿ったポイントで、残留ブロックはバスベクトルに値を追加/削除することを学習できます。
  • 逆方向では、勾配はバスを逆流します
    • 道に沿って、勾配はそれらが過去に移動する残余ブロックを更新します
    • 残りのブロック自体が勾配をわずかに変更します

残差ブロックは逆方向に流れる勾配を修正しますが、勾配が流れる「押しつぶす」または「活性化」機能はありません。'squashing' / 'activation'関数は、勾配の爆発/消滅の問題を引き起こすものであるため、これらをバス自体から削除することにより、この問題を大幅に軽減します。

編集3:個人的には、次の図のように頭の中でresnetを想像します。トポロジー的には図2と同じですが、おそらくバスがネットワークをまっすぐ流れるのをより明確に示し、残りのブロックはそこから値をタップし、バスに対して小さなベクトルを追加/削除します:

ここに画像の説明を入力してください


1
(通常のネットワークのように)勾配が重みブロックにも渡される場合、resnetの利点はどこから来ますか?確かに、グラデーションをベース入力に直接スキップできますが、他のパスが通常どおり訓練されている場合、どのようにパフォーマンスが向上しますか?
サイモン

3
そうですか。そのため、1つの勾配はxにまっすぐスキップして戻り、もう1つの勾配は重みを介してxに戻ります。xが2つのパスに分割されたためにxに達したときに合計されますか?もしそうなら、グラデーションがこれらのレイヤーを通って戻るときに変化していませんか?
サイモン

1
勾配は、スタックを下ってずっと変化せずに流れます。ただし、各ブロックは、重みの更新を適用し、独自のグラデーションのセットを生成した後、独自のグラデーションの変更をスタックに反映します。各ブロックには入力と出力の両方があり、勾配は入力から流れ出て勾配「ハイウェイ」に戻ります。
ヒュー・パーキンス

1
@RonakAgrawalは、図2の合計演算子を示す編集を追加し、それを説明します
ヒューパーキンス

1
私の説明を少し言い換える2番目の編集を追加しました:)
ヒュー・パーキンス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.