Python-deep-learning-training-a-neural-network

提供:Dev Guides
移動先:案内検索

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

ここで、ニューラルネットワークをトレーニングする方法を学習します。 また、Python Deep Learningで逆伝播アルゴリズムと後方パスを学習します。

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

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

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

勾配降下最適化手法

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

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

より正確に言えば、どの重みが最小の誤差を生じるかを見つけたいです。 入力データに含まれる信号を正しく表し、それらを正しい分類に変換する重みを見つけたいです。

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

各重みは、多くの変換を伴うディープネットワークの1つの要素にすぎません。重みの信号はアクティベーションを通過し、複数のレイヤーで合計されるため、計算のチェーンルールを使用してネットワークのアクティベーションと出力を処理します。これにより、問題の重みと全体的なエラーとの関係が導き出されます。

エラーと重みの2つの変数は、重みが渡される3番目の変数 activation によって仲介されます。 重量の変化がエラーの変化にどのように影響するかを計算するには、まずアクティベーションの変化がエラーの変化にどのように影響し、重量の変化がアクティベーションの変化にどのように影響するかを計算します。

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

勾配値が小さい場合、ディープネットはゆっくりとトレインし、値が高い場合は高速でトレインします。 トレーニングに不正確があると、出力が不正確になります。 出力から入力に戻るネットをトレーニングするプロセスは、逆伝播または逆プロップと呼ばれます。 順伝播は入力から始まり、順方向に進むことを知っています。 バックプロップは、右から左への勾配を逆方向/逆方向に計算します。

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

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

深層学習アルゴリズムの課題

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

トレーニング中にドロップアウト、早期停止、データ増強、転送学習などの*正規化*メソッドが適用され、過剰適合に対処します。 正規化をドロップアウトすると、トレーニング中に非表示のレイヤーからユニットがランダムに除外され、まれな依存関係を回避できます。 DNNは、サイズなどのいくつかのトレーニングパラメーター、つまり、レイヤー数とレイヤーあたりのユニット数、学習率、初期重みを考慮します。 時間と計算リソースのコストが高いため、最適なパラメーターを見つけることは常に実用的ではありません。 バッチ処理などのいくつかのハックは、計算を高速化できます。 必要なマトリックスとベクトルの計算はGPUで十分に実行されるため、GPUの大きな処理能力はトレーニングプロセスを大幅に支援しました。

脱落

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

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

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

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

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

評価と予測の間、ドロップアウトは使用されません。 各ニューロンの出力はqで乗算されるため、次の層への入力は同じ期待値を持ちます。

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

実装のトリック

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

早期停止

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

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

データ増強

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

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

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

転移学習

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

  • 大規模なデータセットで事前に訓練されたモデルを訓練します。 次に、ネットワークの最後のレイヤーを削除し、ランダムな重みを持つ新しいレイヤーに置き換えます。
  • 次に、他のすべてのレイヤーの重みをフリーズし、ネットワークを通常どおりトレーニングします。 ここで、レイヤーの凍結は、勾配降下または最適化中に重みを変更しません。

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