ディープニューラルネットワーク-ReLUによる逆伝播


17

ReLUで逆伝播を導き出すのに多少の困難があり、いくつかの作業を行いましたが、正しい軌道に乗っているかどうかはわかりません。

コスト関数:ここで、は実数値で、は予測値です。また、 > 0は常に仮定します。 Y X12yy^2yy^バツ


1層ReLU、1番目の層の重みはw1

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

dCdw1=dCdRdRdw1

dCw1=yReLうんw1バツバツ


2層の番目の層の重みはで、2番目の層は、1番目の層を更新したかったw2w1w2

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

dCdw2=dCdRdRdw2

dCw2=yReLうんw1ReLうんw2バツw1バツ

以降ReLうんw1ReLうんw2バツ=w1w2バツ


3層ReLU、1番目の層の重みは番目の層および3番目の層w3w2w1

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

dCdw3=dCdRdRdw3

dCw3=(yReLU(w1ReLU(w2(ReLU(w3)))(w1w2x)

以降ReLU(w1ReLU(w2(ReLU(w3))=w1w2w3x

シグモイドと比較して、チェーンルールは2つの導関数でのみ持続するため、層の長さになる可能性があります。n


3つのレイヤーの重みをすべて更新したいとしますは3番目のレイヤー、は2番目のレイヤー、は3番目のレイヤーですw1w2w1

dCw1=(yReLU(w1x))(x)

dCw2=(yReLU(w1ReLU(w2x))(w1x)

dCw3=(yReLU(w1ReLU(w2(ReLU(w3)))(w1w2x)

この導出が正しい場合、これはどのように消失を防ぎますか?シグモイドと比較すると、方程式に0.25を乗じているのに対し、ReLUには定数値の乗算はありません。レイヤーが数千ある場合、重みのために多くの乗算がありますが、これは勾配の消失または爆発を引き起こしませんか?


@NeilSlaterお返事ありがとうございます!詳しく説明してもらえますか?
user1157751

ああ、私はあなたの意味を知っていると思う。さて、この質問を提起した理由は、派生が正しいと確信しているからですか?私はあちこち検索しましたが、完全にゼロから派生したReLUの例を見つけられませんでしたか?
user1157751

回答:


15

ReLU関数とその派生物の作業定義:

ReLU(x)={0,if x<0,x,otherwise.

ddxReLU(x)={0,if x<0,1,otherwise.

導関数は単位ステップ関数です。これは、勾配が厳密に定義されていないx=0問題を無視しますが、それはニューラルネットワークにとって実際的な問題ではありません。上記の式では、0での微分は1ですが、ニューラルネットワークのパフォーマンスに実際の影響を与えることなく、0または0.5として同等に扱うことができます。


簡素化されたネットワーク

これらの定義を使用して、サンプルネットワークを見てみましょう。

コスト関数C = 1で回帰を実行していますC=12(yy^)2。あなたは、定義したR人工ニューロンの出力として、がありますが、入力値を定義していません。Iは、完全性のためにことを追加します-それを呼び出すz、層によっていくつかの索引付けを追加し、私は、ベクトルと行列の大文字ため小文字を好むので、r(1)第一の層の出力、z(1)のためにニューロンをその入力xに接続する重みの入力およびW(0)(より大きなネットワークでは、より深いrに接続する場合があります)xr代わりに値)。また、重み行列のインデックス番号も調整しました。これは、大規模なネットワークで明らかになる理由です。NB今のところ、各層にニューロン以上のものがあることを無視しています。

単純な1層、1ニューロンネットワークを見ると、フィードフォワード方程式は次のとおりです。

z(1)=W(0)x

y^=r(1)=ReLU(z(1))

推定の例に対するコスト関数の導関数は次のとおりです。

Cy^=Cr(1)=r(1)12(yr(1))2=12r(1)(y22yr(1)+(r(1))2)=r(1)y

z

Cz(1)=Cr(1)r(1)z(1)=(r(1)y)Step(z(1))=(ReLU(z(1))y)Step(z(1))

Cz(1)

W(0)

CW(0)=Cz(1)z(1)W(0)=(ReLU(z(1))y)Step(z(1))x=(ReLU(W(0)x)y)Step(W(0)x)x

z(1)=W(0)xz(1)W(0)=x

これが最も単純なネットワークの完全なソリューションです。

ただし、階層化されたネットワークでは、同じロジックを次の層に持ち込む必要もあります。また、通常、レイヤーには複数のニューロンがあります。


より一般的なReLUネットワーク

より一般的な用語を追加すると、2つの任意のレイヤーを操作できます。それらをレイヤー呼ぶ(k) indexed by i, and Layer (k+1) indexed by j. The weights are now a matrix. So our feed-forward equations look like this:

zj(k+1)=iWij(k)ri(k)

rj(k+1)=ReLU(zj(k+1))

In the output layer, then the initial gradient w.r.t. rjoutput is still rjoutputyj. However, ignore that for now, and look at the generic way to back propagate, assuming we have already found Crj(k+1) - just note that this is ultimately where we get the output cost function gradients from. Then there are 3 equations we can write out following the chain rule:

First we need to get to the neuron input before applying ReLU:

  1. Czj(k+1)=Crj(k+1)rj(k+1)zj(k+1)=Crj(k+1)Step(zj(k+1))

We also need to propagate the gradient to previous layers, which involves summing up all connected influences to each neuron:

  1. Cri(k)=jCzj(k+1)zj(k+1)ri(k)=jCzj(k+1)Wij(k)

And we need to connect this to the weights matrix in order to make adjustments later:

  1. CWij(k)=Czj(k+1)zj(k+1)Wij(k)=Czj(k+1)ri(k)

You can resolve these further (by substituting in previous values), or combine them (often steps 1 and 2 are combined to relate pre-transform gradients layer by layer). However the above is the most general form. You can also substitute the Step(zj(k+1)) in equation 1 for whatever the derivative function is of your current activation function - this is the only place where it affects the calculations.


Back to your questions:

If this derivation is correct, how does this prevent vanishing?

Your derivation was not correct. However, that does not completely address your concerns.

The difference between using sigmoid versus ReLU is just in the step function compared to e.g. sigmoid's y(1y), applied once per layer. As you can see from the generic layer-by-layer equations above, the gradient of the transfer function appears in one place only. The sigmoid's best case derivative adds a factor of 0.25 (when x=0,y=0.5), and it gets worse than that and saturates quickly to near zero derivative away from x=0. The ReLU's gradient is either 0 or 1, and in a healthy network will be 1 often enough to have less gradient loss during backpropagation. This is not guaranteed, but experiments show that ReLU has good performance in deep networks.

If there's thousands of layers, there would be a lot of multiplication due to weights, then wouldn't this cause vanishing or exploding gradient?

Yes this can have an impact too. This can be a problem regardless of transfer function choice. In some combinations, ReLU may help keep exploding gradients under control too, because it does not saturate (so large weight norms will tend to be poor direct solutions and an optimiser is unlikely to move towards them). However, this is not guaranteed.


Was a chain rule performed on dCdy^?
user1157751

@ user1157751:いいえ、 Cy^=Cr(1) because y^=r(1). The cost function C is simple enough that you can take its derivative immediately. The only thing I haven't shown there is the expansion of the square - would you like me to add it?
Neil Slater

だが C12(yy^)2, don't we need to perform chain rule so that we can perform the derivative on y^? dCdy^=dCdUdUdy^, where U=yy^. Apologize for asking really simple questions, my maths ability is probably causing trouble for you : (
user1157751

If you can make things simpler by expanding. Then please do expand the square.
user1157751

@user1157751: Yes you could use the chain rule in that way, and it would give the same answer as I show. I just expanded the square - I'll show it.
Neil Slater
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.