バッチ勾配降下法と確率的勾配降下法

トレーニングセット $(x _ {(i)}、 y _ {(i)})$ for $ i = 1、\ dots、m $ 。また、トレーニングセットである種の教師あり学習アルゴリズムを実行するとします。仮説は、 $ h _ {\ theta}(x _ {(i)})= \ theta_0 + \ theta_ {1} x _ {(i)1} + \ cdots + \ theta_ {として表されます。 n} x _ {(i)n} $ $ y _ {(i)間の「距離」を最小化するパラメータ $ \ mathbf {\ theta} $ を見つける必要があります。 )} $ および $ h _ {\ theta}(x _ {(i)})$ 。 $$ J(\ theta)= \ frac {1} {2} \ sum_ {i = 1} ^ {m}(y _ {(i)}-h _ {\ theta }(x _ {(i)})^ {2} $$

次に、 $ \ theta $ を見つけます。 $ J(\ theta)$ を最小化します。勾配降下法では、各パラメーターを初期化し、次の更新を実行します。 $$ \ theta_j := \ theta_j- \ alpha \ frac {\ partial} {\ partial \ theta_ {j}} J(\ theta)$$

バッチ最急降下法と確率的最急降下法の主な違いは何ですか?

どちらも上記の更新ルールを使用しますが、どちらが優れているのでしょうか。

回答

バッチまたは確率的勾配降下法の適用可能性は、予想されるエラー多様性に実際に依存します。

バッチ勾配降下法は、データセット全体を使用して勾配を計算します。これは、凸状または比較的滑らかなエラーマニホールドに最適です。この場合、いくつか移動します。ローカルまたはグローバルのいずれかで、最適なソリューションを直接目指します。さらに、アニーリングされた学習率が与えられると、バッチ勾配降下法は最終的にその引力の盆地にある最小値を見つけます。

確率的勾配降下法(SGD)は、単一のサンプルを使用して勾配を計算します。 SGDは、後で説明する理由により、実際にはいくつかのサンプルのミニバッチを使用します。SGDは、極大値/最小値が多いエラーマニフォールドに対して適切に機能します(よくない、と思いますが、バッチ勾配降下法よりも優れています)。この場合、サンプル数を減らして計算されたややノイズの多い勾配は、モデルを極小値から最適な領域にジャークする傾向があります。単一のサンプルは実際にノイズが多く、ミニバッチは平均してノイズをわずかに出力する傾向があります。 、ミニバッチを使用すると、ジャークの量が減少します。ミニバッチのサイズが、ローカル最小値の一部を回避するのに十分小さいが、グローバル最小値またはパフォーマンスの向上を回避できないほど大きい場合、バランスが取れます。眼の最小値。 (ちなみに、これは、最良の最小値がより大きく、より深い引力の盆地を持っていることを前提としているため、陥りやすいです。)

SGDの利点の1つは、計算がはるかに高速になることです。多くの場合、データセットをRAMに保持できないため、ベクトル化の効率が大幅に低下します。むしろ、各サンプルまたはサンプルのバッチは、ロード、処理、結果の保存などを行う必要があります。一方、ミニバッチSGDは通常、計算上扱いやすいように意図的に小さくされています。

通常、この計算上の利点は、SGDの反復をさらに実行することで活用され、従来のバッチ勾配降下法よりもはるかに多くのステップを実行します。 。これにより、通常、バッチ勾配降下法で検出されるモデルに非常に近い、またはそれ以上のモデルが得られます。

SGDがどのように機能するかを考える方法は、1つのポイントがあると想像することです。私の入力分布を表します。私のモデルは、その入力分布を学習しようとしています。入力分布を囲むのは、サンプリングできるすべての可能なミニバッチの入力分布を表す影付きの領域です。通常、ミニバッチ入力分布が真の入力分布に近接していることは公正な仮定です。バッチ勾配降下法は、すべてのステップで、真の入力分布に到達するために最も急なルートを取ります。一方、SGDは影付きの領域内のランダムなポイントであり、このポイントに向かって最も急なルートを取ります。ただし、各反復で新しいポイントが選択されます。これらすべてのステップの平均は、通常は非常によく、実際の入力分布に近似します。

コメント

  • 実際には、バッチ勾配降下法を使用する人は誰もいません。'は、計算コストが高すぎてそれほど多くはありません。 (利益は、'実際に" true "勾配。)非常に非凸の損失関数がある場合は、ほとんど正しい方向に進む必要があり、'最終的に収束しますo n極小値。したがって、ミニバッチSGD。
  • @Jason_L_Bensこれらのアルゴリズムについて詳しく読むことができる参考資料(論文またはオンラインテキスト)はありますか?
  • @ user110320頭から離れていませんが、いいえ。 'は非常に一般的なアルゴリズムであるため、少し検索するだけで、このトピックに関する大量のリソースを利用できるはずです。 '一般的なアプローチをお探しの場合は、'ヨシュアベンジオの一部を読むことをお勧めします' sAIのディープアーキテクチャの学習。 '私が始めた場所です。

回答

他の回答が示唆しているように、SGDを使用する主な理由は、多くのミニバッチまたはサンプルで平均したときに勾配の方向を大幅に維持しながら、勾配の計算コストを削減することです。これにより、確実に極小値に到達できます。

  1. ミニバッチが機能する理由

この背後にある数学はつまり、コスト関数の" true "勾配(一般化エラーまたは無限に大きいサンプルセットの勾配)が期待値です。真のデータ生成分布 $ p_ {data} $ に対する勾配 $ g $ の影響;サンプルのバッチに対して計算された実際の勾配 $ \ hat {g} $ は、常に経験的データ分布 $ \ hat {p} _ {data} $ $$ \ hat {g} = E _ {\ hat {p} _ {data}}({\ partial J(\ theta)\ over \ partial \ theta})$$ バッチ勾配降下法は、すべてのデータサンプルで"最適な"勾配をもたらす可能性があります。

true "グラデーション。小さいバッチ(つまり、ミニバッチ)は、おそらく完全なバッチほど最適ではありませんが、どちらも近似値です。単一サンプルのミニバッチ(SGD)も同様です。

の間に依存関係がないと仮定します。 1つのミニバッチ内のspanclass = “math-container”> $ m $ サンプル、計算された $ \ hat {g}(m)$ は偏りがありません真の勾配の推定。異なるミニバッチサイズでの推定値の(二乗)標準誤差は、ミニバッチのサイズに反比例します。つまり、 $$ {SE({\ hat {g}(n)})\ over SE({\ hat {g}(m)})} = {\ sqrt { m \ over n}} $$ つまり、標準誤差の減少は、サンプルサイズの増加の平方根です。つまり、ミニバッチサイズが小さい場合、大きな分散に対して安定性を実現するには、学習率も小さくする必要があります。サンプルが独立していない場合、不偏推定の特性は維持されなくなります。サンプルのシーケンスが十分にランダムでない場合は、トレーニングの前にサンプルをシャッフルする必要があります。

  1. ミニバッチが使用される理由

まず、ミニバッチを使用すると、バッチサイズが小さくなり、計算量が減るため、技術的に扱いにくいものから扱いにくいものへと学習上の問題が発生します。

次に、バッチサイズを小さくしても、必ずしもグラジエントの精度が低下するわけではありません。トレーニングサンプルの多くには、ノイズ、外れ値、またはバイアスがたくさんあります。ランダムにサンプリングされたミニバッチは、元の完全なバッチよりも優れた(または悪くない)分布を生成する真のデータを反映する場合があります。ミニバッチ勾配更新のいくつかの反復でより良い推定が得られる場合、1つのエポックの全体的な平均結果は、完全なバッチから計算された勾配よりも優れている可能性があります。

第3に、ミニバッチは不快な処理に役立つだけではありません。データサンプルだけでなく、多くの極小値を持つ不快なコスト関数の処理にも役立ちます。 Jason_L_Bensが言及しているように、エラー多様体は、通常の勾配を極小値にトラップするのが簡単な場合がありますが、ミニバッチで計算された一時的にランダムな勾配をトラップするのは難しい場合があります。

最後に、勾配降下法では、そうではありません。 1つのステップでグローバル最小値に到達しますが、エラー多様体を反復処理します。グラデーションは主に、反復する方向のみを示します。ミニバッチを使用すると、はるかに高速に反復できます。多くの場合、反復回数が多いほど、到達できるポイントが高くなります。あなたは本当にすべての天気を気にしません。ポイントはグローバルに、あるいはローカルでさえ最適です。許容できる汎化誤差をもたらす合理的なモデルに到達したいだけです。ミニバッチを使用すると、それが簡単になります。

IanGoodfellow他による"ディープラーニング"という本を見つけることができます。注意深く読むと、このトピックについてかなり良い議論があります。

コメント

  • 凸最適化問題の場合、あなたが言ったことは問題ありません。しかし、非凸関数で勾配法を使用するには、SGDがバッチGDよりも優れているという非常に重要な理由を見逃していました。私の回答をご覧ください datascience.stackexchange.com/questions/16807/ …
  • @horaceTご意見ありがとうございます。あなたが言及した点は上記のJason_L_Bensによって詳細に説明されているので、私はわざわざ繰り返すのではなく、最後の3番目の段落で彼の答えを十分に尊重して参照しました。最急降下法の最適化問題では、非凸は鞍点を含む極小値に反映されます(最後の3番目の段落を参照)。説明のために、私の答えはSGDをミニバッチとして説明していますが、バッチサイズは1です(3番目の段落を参照)。
  • なぜ*最後に1つのエポックで仮想的に言ったのですか、仮想的に計算しています与えられたすべてのサンプルに基づく勾配の平均。*? '各ステップで重みを更新しているため、この主張が間違っていると思いませんか?
  • @Mediaその通りです。 '最後の段落を削除しました。ありがとう。

回答

私にとって、バッチグラデーションはリーングラデーションに似ています。リーングラジエントでは、バッチサイズが選択されるため、更新されるすべてのパラメーターも独立して変化しますが、必ずしも直交する必要はありません。たとえば、バッチに10個の実験、10行が含まれている場合、$ 2 ^ {10-1} = 512 $の独立した列を形成できます。 10行を使用すると、512個のパラメーターを独立して更新できますが、直交ではありません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です