ニューラルネットワークのトレーニング

次に、ニューラルネットワークをトレーニングする方法を学習します。また、Pythonディープラーニングでバックプロパゲーションアルゴリズムとバックワードパスについても学習します。

目的の出力を得るには、ニューラルネットワークの重みの最適値を見つける必要があります。ニューラルネットワークをトレーニングするには、反復勾配降下法を使用します。最初に、重みのランダムな初期化から始めます。ランダムな初期化の後、順伝播プロセスを使用してデータのサブセットを予測し、対応するコスト関数Cを計算し、各重みwをdC / dwに比例する量で更新します。つまり、コスト関数の導関数を重量。比例定数は学習率として知られています。

勾配は、バックプロパゲーションアルゴリズムを使用して効率的に計算できます。後方伝搬または後方プロップの重要な観察は、微分の連鎖律のために、ニューラルネットワークの各ニューロンでの勾配はニューロンでの勾配を使用して計算できることです。したがって、勾配を逆方向に計算します。つまり、最初に出力レイヤーの勾配を計算し、次に最上位の非表示レイヤー、次に前の非表示レイヤーというように、入力レイヤーで終了します。

バックプロパゲーションアルゴリズムは、主に計算グラフのアイデアを使用して実装されます。この場合、各ニューロンは計算グラフ内の多くのノードに展開され、加算、乗算などの単純な数学演算を実行します。計算グラフには、エッジに重みがありません。すべての重みがノードに割り当てられるため、重みは独自のノードになります。次に、逆伝播アルゴリズムが計算グラフで実行されます。計算が完了すると、重みノードの勾配のみが更新に必要になります。残りのグラデーションは破棄できます。

最急降下法の最適化手法

発生したエラーに応じて重みを調整する、一般的に使用される最適化関数の1つは、「最急降下法」と呼ばれます。

勾配は勾配の別名であり、xyグラフの勾配は、2つの変数が互いにどのように関連しているかを表します。つまり、実行中の上昇、時間の変化に対する距離の変化などです。この場合、勾配は次のようになります。ネットワークのエラーと単一の重みの比率。つまり、重みが変化するとエラーはどのように変化しますか。

より正確に言えば、どの重みが最小のエラーを生成するかを見つけたいと思います。入力データに含まれる信号を正しく表す重みを見つけて、それらを正しい分類に変換する必要があります。

ニューラルネットワークが学習すると、信号を意味に正しくマッピングできるように、多くの重みをゆっくりと調整します。ネットワークエラーとこれらの各重みの比率は、重みのわずかな変化がエラーのわずかな変化を引き起こす程度を計算する導関数dE / dwです。

それぞれの重みは、多くの変換を伴う深いネットワークの1つの要素にすぎません。重みの信号はアクティベーションを通過し、いくつかのレイヤーで合計されるため、微積分の連鎖律を使用して、ネットワークのアクティベーションと出力を処理します。これにより、問題の重みと、全体的なエラーとの関係がわかります。

エラーと重みの2つの変数が与えられると、3番目の変数によって媒介されます。 activation、重量が通過する。最初に、アクティブ化の変更がエラーの変更にどのように影響するか、および重みの変更がアクティブ化の変更にどのように影響するかを計算することにより、重みの変更がエラーの変更にどのように影響するかを計算できます。

ディープラーニングの基本的な考え方は、それ以上のものではありません。エラーを減らすことができなくなるまで、モデルが生成するエラーに応じてモデルの重みを調整します。

深いネットは、勾配値が小さい場合はゆっくりとトレーニングし、値が大きい場合は速くトレーニングします。トレーニングの不正確さは、不正確な出力につながります。ネットを出力から入力にトレーニングするプロセスは、バックプロパゲーションまたはバックプロパゲーションと呼ばれます。順伝播は入力から始まり、順方向に機能することがわかっています。バックプロップは、右から左への勾配を計算する逆/反対を行います。

勾配を計算するたびに、その時点までの以前のすべての勾配を使用します。

出力層のノードから始めましょう。エッジはそのノードのグラデーションを使用します。隠しレイヤーに戻ると、さらに複雑になります。0と1の間の2つの数値の積は、より小さな数値を与えます。勾配値は小さくなり続け、その結果、バックプロップはトレーニングに多くの時間がかかり、精度が低下します。

ディープラーニングアルゴリズムの課題

過剰適合や計算時間など、浅いニューラルネットワークと深いニューラルネットワークの両方に特定の課題があります。DNNは、トレーニングデータ内のまれな依存関係をモデル化できるようにする追加の抽象化レイヤーを使用するため、過剰適合の影響を受けます。

Regularization過剰適合と戦うために、トレーニング中にドロップアウト、早期停止、データ拡張、転送学習などの方法が適用されます。ドロップアウト正則化は、トレーニング中に非表示レイヤーからユニットをランダムに省略します。これは、まれな依存関係を回避するのに役立ちます。DNNは、サイズ、つまり、レイヤーの数とレイヤーごとのユニットの数、学習率、初期の重みなど、いくつかのトレーニングパラメーターを考慮に入れます。時間と計算リソースに高いコストがかかるため、最適なパラメータを見つけることは必ずしも実用的ではありません。バッチ処理などのいくつかのハックは、計算を高速化できます。GPUの大きな処理能力は、必要な行列とベクトルの計算がGPUで適切に実行されるため、トレーニングプロセスに大きく役立ちました。

脱落

ドロップアウトは、ニューラルネットワークで一般的な正則化手法です。ディープニューラルネットワークは、特に過剰適合しがちです。

ドロップアウトとは何か、そしてそれがどのように機能するかを見てみましょう。

ディープラーニングのパイオニアの1人であるGeoffreyHintonの言葉によると、「ディープニューラルネットがあり、それが過剰適合していない場合は、おそらくより大きなものを使用し、ドロップアウトを使用する必要があります」。

ドロップアウトは、勾配降下の各反復中に、ランダムに選択されたノードのセットをドロップする手法です。これは、いくつかのノードが存在しないかのようにランダムに無視することを意味します。

各ニューロンは確率qで保持され、確率1-qでランダムにドロップされます。値qは、ニューラルネットワークの各層で異なる場合があります。非表示レイヤーの値は0.5、入力レイヤーの値は0で、さまざまなタスクで適切に機能します。

評価および予測中、ドロップアウトは使用されません。次の層への入力が同じ期待値を持つように、各ニューロンの出力にqが乗算されます。

ドロップアウトの背後にある考え方は次のとおりです。ドロップアウトの正規化がないニューラルネットワークでは、ニューロンは相互に共依存関係を発達させ、過剰適合につながります。

実装のトリック

ドロップアウトは、ランダムに選択されたニューロンの出力を0に保つことにより、TensorFlowやPytorchなどのライブラリに実装されます。つまり、ニューロンは存在しますが、その出力は0として上書きされます。

早期打ち切り

勾配降下法と呼ばれる反復アルゴリズムを使用してニューラルネットワークをトレーニングします。

早期打ち切りの背後にある考え方は直感的です。エラーが増加し始めると、トレーニングを停止します。ここで、エラーとは、ハイパーパラメーターの調整に使用されるトレーニングデータの一部である検証データで測定されたエラーを意味します。この場合、ハイパーパラメータが停止基準です。

データ拡張

私たちが持っているデータの量を増やす、または既存のデータを使用してそれにいくつかの変換を適用することによってデータを増やすプロセス。使用される正確な変換は、達成しようとしているタスクによって異なります。さらに、ニューラルネットを支援する変換は、そのアーキテクチャに依存します。

たとえば、オブジェクト分類などの多くのコンピュータビジョンタスクでは、効果的なデータ拡張手法は、元のデータのトリミングまたは変換されたバージョンである新しいデータポイントを追加することです。

コンピューターが画像を入力として受け入れると、ピクセル値の配列を受け取ります。画像全体が15ピクセル左にシフトしているとしましょう。さまざまな方向にさまざまなシフトを適用し、元のデータセットの何倍ものサイズの拡張データセットを作成します。

転移学習

事前にトレーニングされたモデルを取得し、独自のデータセットを使用してモデルを「微調整」するプロセスは、転移学習と呼ばれます。これを行うにはいくつかの方法があります。いくつかの方法を以下に説明します-

  • 事前にトレーニングされたモデルを大規模なデータセットでトレーニングします。次に、ネットワークの最後のレイヤーを削除し、ランダムな重みを持つ新しいレイヤーに置き換えます。

  • 次に、他のすべてのレイヤーの重みをフリーズし、ネットワークを通常どおりトレーニングします。ここで、レイヤーをフリーズしても、勾配降下法または最適化中に重みが変更されることはありません。

この背後にある概念は、事前にトレーニングされたモデルが特徴抽出器として機能し、最後のレイヤーのみが現在のタスクでトレーニングされるというものです。