数値勾配チェック:どれくらい近いですか?


8

たたみ込みニューラルネットワークを作成し、数値勾配チェックを使用して勾配が正しく計算されていることを確認したいと思いました。問題は、どれだけ近いかということです。

私のチェック機能は、計算された導関数、数値的に近似された導関数、2つの値の差、および2つの値が同じ符号を持っているかどうか(1つは正でもう1つは負であるかどうか)重量。

私の主な懸念は、完全に接続されたすべてのレイヤーと最初のレイヤーを除くすべての畳み込みレイヤーの違いが似ていることです。2つの数字の最初の9〜13文字が一致します。いいですね。しかし、最初の畳み込み層の重みでは、一致する小数点以下の桁数が最大で12になる場合がありますが、3の場合もあります。それで十分ですか、それともエラーの可能性がありますか?

注意すべき1つの良い点は、2つの値の符号が常に一致していることです。これは、動きの大きさが少しずれていても、ネットワークは常に正しい方向に動きます。しかし、それが問題です...それがオフになっている可能性はありますか?

回答:


9

私がこれに対処するのに最も近いのは、softmax 回帰セクションの Stanford UFLDLチュートリアルでした。キーステートメントのコピー:

数値勾配と分析勾配の間の差のノルムは、オーダーで小さくなければなりません。109

Pythonでは、コードは次のようになります。

norm(gradients - numericalGradients)/norm(gradients + numericalGradients)

ここでgradients、導関数の結果でnumericalGradientsあり、近似された勾配です。


ありがとう、私のグラデーションが2D配列行列に保存されている場合はどうなりますか?2つの行列を互いに減算した後、結果の「差分」行列のノルムをどのように評価すればよいですか?
カリ

1
@Kariそれらをベクトルにフラット化し、上記と同じコードを使用します。たとえば、numpy配列がある場合は、このflattenメソッドを使用できます。
cdeterman 2018

7

役立つ背景理論

数値導関数が正しく計算されているかどうかを理解するために使用できる1つの小さな事実は、テイラー展開のコーシー剰余です。あれは、

ξ[XX+H]f(x+h)=f(x)+hf(x)+h22f(ξ)ξ[x,x+h]

これは便利です。おそらく、1次導関数を次のように近似しているからです。

f(x)f(x+h)f(xh)2h

少し(通常は使用しますが、いつかそれが適切でない場合に出くわすと確信しています)。10 4h104

少し代数の後、コーシーの剰余を使用して、数値近似が理論的にのます。F 'X hf(ξ),ξ[xh,x+h]f(x)

実際、実際にはでバインドできます。ここで、および ...これは、と同等です。ξ 1[ X - H X ] ξ 2[ X X + H ] H 2 F ξ ξ [ X - H x + h ]h(f(ξ1)f(ξ2))ξ1[xh,x]ξ2[x,x+h]h2f(ξ)ξ[xh,x+h]

実際の問題

さて、数値微分の誤差を制限する素晴らしい理論があります。しかし、これらの結果を直接使用しようとすると、2つの穴があります。

1.)私たちは知りません(そして、それを概算するのに時間をかけたくないでしょう)f(x)

2.)として、は数値の不安定性の影響を受けますf x + h f x h h0f(x+h)f(xh)2h

したがって、分析導関数チェックする方法(これが最善の方法ではない可能性があります)を以前から知っていることを使用して、数値導関数を関数として記述します。数値導関数と分析導関数の違いがコーディングの間違いによるものなのか、数値近似によるものなのかわからない場合は、を減らして、数値不安定性が発生する前に数値導関数が分析導関数に近づくかどうかを確認できます(これが発生した場合、あなたの数値近似はなります以下のように一貫性のある小さくなります)。ことを注意項は二次的に消えてしなければならないので、私の誤差はおよそであればとh h f ξ 0.01 h = 10 4 0.0001 h = 10 5hhhf(ξ)0.01h=104、それが周りにあるべきであると数値不安定性を仮定がまだで蹴られていません0.0001h=105

残念ながら、これらのことを常に判断するための厳格で迅速なガイドラインはありません。それは、関数がどれほど安定しているかに非常に依存します(そして、数値の安定性と高次導関数の両方の観点から意味します)。しかし、私の経験では、からのエラーが確実に0にならない(つまり、を使用すると、実質的に)からの数値の不安定性が始まるまでに。h = 10 4 h = 10 5 h 0h2f(ξ)h=104h=105h0


5

このチュートリアルhttp://cs231n.github.io/neural-networks-3/#ensembleを参照してください。「グラデーションチェック」セクションは非常に詳細で役に立ちます。

gungが示唆しているように、私はこのリンクの主要なポイントを含めます。

  • 利用近似、。f(w+h)f(wh)2hh105

  • 分数監視ここで、あります分析勾配とは数値的に近似された勾配です。通常、この割合の推奨範囲はです。 fawfnw<102|fa(w)fn(w)|max(|fa(w)|,|fn(w)|)fa(w)fn(w)<102

  • 浮動小数点数の代わりに倍精度を使用します。

  • 活性化関数におけるキンクの心。たとえば、ReLUを使用する場合は。キンクがある場合は、および値を監視する必要があります。これらの2つの値がキンクの両側にある場合、この勾配チェックを除外する必要があります。x - h x + hx=0xhx+h

  • 少数のデータポイントを使用します。

  • トレーニングプロセスの最初の段階では勾配チェックを行わないでください。

  • 最初に、正規化なしのモデルをチェックし、次にそれをチェックします。

  • 勾配チェックを行うときは、ドロップアウトと反転ドロップアウトをオフにします。

  • ランダムに少数の次元のみをチェックします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.