ニューラルネットワークのハッカーガイド。 実際の値のスキーム。 戦略3:分析勾配

内容:

第1章:実際の価値の図
パート1:

  :        №1:   
      
      





パート2:

   №2:  
      
      





パート3:

   №3:  
      
      





パート4:

         
      
      





パート5:

    «»   " "
      
      





パート6:

      
      
      







第2章:機械学習
パート7:

   
      
      





パート8:

         (SVM)
      
      





パート9:

   SVM   
      
      





パート10:

    :  
      
      









前のセクションでは、各初期値の回路の出力値を個別に調べて、勾配を推定しました。 この手順により、数値勾配と呼ばれるものが得られます。 ただし、このアプローチは、各初期値がわずかな数だけ変化するときに回路の結果を計算する必要があるため、依然としてかなり問題があると考えられています。 したがって、勾配の推定の難しさは、初期値の数に比例します。 しかし実際には、数百、数千、または(ニューラルネットワークの場合)数千から数億の初期値があり、スキームには乗算の論理要素が1つだけでなく、計算が非常に難しい巨大な式も含まれます。 もっと良いものが必要です。



幸いなことに、勾配を計算するためのより簡単ではるかに速い方法があります。直接式の導関数の計算方法を使用できます。これは、回路の出力値と同じくらい簡単に評価できます。 これを分析勾配と呼び、何かを置き換える必要はありません。 おそらく、ニューラルネットワークをトレーニングする他の人々が、巨大で、率直に言って、恐ろしく複雑な数学方程式を使用して勾配の導関数をどのように取るかを見たことがあるでしょう(数学が特に強くない場合)。 しかし、それは必要ではありません。 ニューラルネットワーク用に大量のコードを記述し、2行より長い数学的導関数を使用する必要はほとんどありません。95%の場合、何も書かなくてもこれを実行できます。 これはすべて、非常に小さく単純な式に対して勾配の導関数を使用する可能性が低いためです(これを基本的なケースと考えてください)。次に、チェーンルールを使用してこのような式を非常に単純に構成して勾配全体を評価する方法を示します(この帰納的と考えてください) /再帰的なケース)。



分析導関数は、初期値の置換を必要としません。 この導関数は、数学(微分計算)の助けを借りて取得できます。




製品の規則、べき乗の規則、商の規則(微分の規則またはウィキペディアのページを参照)を覚えている場合、x * yのような小さな式についてはxとyに関して微分を書くだけです。 しかし、微分計算のルールを覚えていないとします。 定義に戻ることができます。 たとえば、xに関する導関数の式は次のとおりです。



画像








(技術的には、ゼロになる傾向のあるhの形式で制限を記述しません。数学者を許してください)。 いいね 次に、式に関数(f(x、y)= xy)を含めます。 この記事で最も難しい数学の準備はできましたか? ここにあります:



画像








これは面白いです。 xに関する導関数は単純にyに等しくなります。 前のセクションとの一致に気づきましたか? xをx + hに変更し、x_derivative = 3.0を計算しました。実際、この例ではyの値になります。 これは偶然ではないことが判明しました。これは、分析勾配の意見では、f(x、y)= x * yの微分xは次のように見えるはずだからです。 しかし、yに関する導関数はxと等しいことが判明しましたが、これは驚くことではありません。 したがって、何も置き換える必要はありません! 数学の力を利用して、導関数の計算を次のコードに変換できます。



 var x = -2, y = 3; var out = forwardMultiplyGate(x, y); //  : -6 var x_gradient = y; //      ,   var y_gradient = x; var step_size = 0.01; x += step_size * x_gradient; // -2.03 y += step_size * y_gradient; // 2.98 var out_new = forwardMultiplyGate(x, y); // -5.87.  !
      
      





勾配を計算するために、スキームを数百回列挙する( ストラテジーNo. 1 )から、初期値の2倍の反復回数( ストラテジーNo. 2 )に移行しました。 そして、より費用のかかる戦略(No. 1およびNo. 2)はおおよその勾配のみを提供し、No。3(現時点で最速の方法)は正確な勾配を提供するため、より良くなっています。 おおよその値はありません。 唯一のマイナスは、差分コンピューティングに自信を持っている必要があるということです。



学んだことを簡単に繰り返しましょう。



元の値:回路、いくつかの初期値が与えられ、出力値を計算する必要があります。



出力値:出力値を高くすることができる各初期値への小さな変化を見つけることに興味があります。



戦略#1 :初期値の小さな変化をランダムに検索し、どの値が結果の最大の増加につながるかを追跡する1つの簡単な方法。



戦略#2 :勾配の計算に関してより多くのことができることがわかりました。 回路がどれほど複雑であるかに関係なく、数値勾配は計算では非常に単純ですが(比較的時間がかかります)。 初期値を一度に1つずつ置き換えながら、回路の出力値をプローブして計算します。



戦略#3:最終的に、よりスマートになり、分析的に勾配を得るために直接表現の導関数を分析的に取得できることに気付きました。 これは数値勾配に似ていますが、現時点では最速であり、値の置換を必要としません。



実際には、ちなみに(これについては後で説明します)、ニューラルネットワークのすべてのライブラリは常に分析勾配を計算しますが、数値勾配と比較することで正確性をチェックします。 これは、数値勾配は推定が非常に簡単であるためです(ただし、計算には少し時間がかかる場合があります)が、分析勾配には誤差が含まれることがありますが、通常は計算が非常に効率的です。 後で見るように、勾配の推定値(すなわち、エラーの逆伝播または逆通過を実行する過程で)は、直接通過の推定値と同じ値になります。



All Articles