ニューラル ネットワークの改善 - 最適化アルゴリズム (ミニバッチ、運動量勾配降下法、Adam 最適化アルゴリズム)

最適化アルゴリズムを使用すると、ニューラル ネットワークの実行を高速化できます。機械学習の適用は、経験に大きく依存するプロセスです。反復回数が多いため、適切なモデルを見つけるために多くのモデルをトレーニングする必要があります。したがって、最適化アルゴリズムは、モデルをすばやくトレーニングします。

問題点の 1 つは、ディープ ラーニングがビッグ データの分野で最大の効果を発揮していないことです。ニューラル ネットワークのトレーニングには膨大なデータ セットを使用できますが、膨大なデータ セットに基づくトレーニングは非常に時間がかかります。したがって、高速な最適化アルゴリズムと使いやすい最適化アルゴリズムを使用すると、あなたとあなたのチームの効率が大幅に向上することがわかります。

勾配降下法

機械学習では、最も単純なのは最適化を行わない勾配降下法 (GD、勾配降下法) です。各サイクルでトレーニング セット全体を学習します。これはバッチ勾配降下法 (バッチ勾配降下法) と呼ばれます。記事「機械学習 - —勾配」を参照してください。降下アルゴリズム。

勾配降下法アルゴリズムを使用する場合、m 個のサンプルが計算され、トレーニング サンプルが巨大な行列XXに拡大されると仮定します。Xのうち、 X = [ x ( 1 ) x ( 2 ) x ( 3 ) . . . x ( m ) ] X=[x^{(1)}x^{(2)}x^{(3) } ...x^{(m)}]バツ=[ ×( 1 ) ×( 2 ) ×( 3 ) ...×( m ) ]YYYも同様です、Y = [ y ( 1 ) y ( 2 ) y ( 3 ) 。y ( m ) ] Y=[y^{(1)}y^{(2)}y^{(3)}...y^{(m)}]Y=[ y( 1 ) y( 2 ) y( 3 ) ...y( m ) ] の場合、ベクトル化により、m 個のサンプルすべてを比較的高速に処理できます。mが大きいとやはり処理速度は遅くなります。たとえば、m が 500 万、5,000 万、またはそれ以上の数値の場合、トレーニング セット全体で勾配降下法を実行する場合、ワンステップ勾配を実行する前にトレーニング セット全体を処理する必要があります。次に、勾配降下法の次のステップに進む前に、500 万のトレーニング サンプルを再処理する必要があります。したがって、500 万サンプルのトレーニング セット全体の一部を勾配降下法で処理してから処理すると、アルゴリズムが高速になります。

ミニバッチ勾配降下法

トレーニング セットをトレーニング用に小さなサブセットに分割します。これらのサブセットはミニバッチと呼ばれます。

勾配降下法アルゴリズムは、確率的勾配降下法(SGD) アルゴリズムとミニバッチ勾配降下法アルゴリズム(ミニバッチ勾配降下法) に進化しました。確率的勾配降下法はミニバッチ勾配降下法と同等ですが、ミニバッチとは異なり、各ミニバッチには 1 つのサンプルしかありません。勾配降下法とは異なり、一度に 1 つのトレーニング サンプルのみを計算できます。トレーニングセット全体にわたる勾配。

確率的勾配降下法では、勾配を更新する前にトレーニング サンプルが 1 つだけ使用されます。トレーニング セットが大きい場合、確率的勾配降下法は高速化できますが、パラメーターはスムーズに収束せず、最小値に向かって変動します。比較図を見てみましょう。実際には、より良いアプローチはミニバッチを使用することです
ここに画像の説明を挿入します
(ミニバッチ勾配降下法とは、勾配降下法と確率的勾配降下法を組み合わせた手法であり、反復ごとに学習対象の全データを選択したり、学習対象のサンプルを選択したりすることはありません。学習の代わりに、すべてのデータセットを小さな部分に分割して学習し、ランダムに小さな部分 (ミニバッチ) を選択します。ブロック サイズは通常、n の 2 倍です。

各サブセットにサンプルが 1000 個しかないと仮定すると、x (1) x^{(1)}バツ( 1 )からx (1000) x^{(1000)}バツ( 1000 )が取り出され、それを最初のサブトレーニング セット (ミニバッチとも呼ばれます) と呼び、次にx (1001) x^{(1001)}バツ( 1001 )からx (2000) x^{(2000)}バツ( 2000 )、さらに 1000 個のサンプルを取得する、というように続きます。

トレーニング サンプル m = 500 万、各ミニバッチには 1,000 個のサンプルがある、つまり 5,000 個のミニバッチがあると仮定します。x ( 1 ) x^{(1)}を入れますバツ( 1 )からx (1000) x^{(1000)}バツ( 1000 )は X { 1 } X^{\{1\}}と呼ばれますバツ{ 1 }x ( 1001 ) x^{(1001)}バツ( 1001 )からx (2000) x^{(2000)}バツ( 2000 )は X { 2 } X^{\{2\}}と呼ばれますバツ{ 2 }など、X (5000) X^{(5000)}バツ( 5000 )、对YYY も同様のプロセスを経ます。ミニバッチの数 t はX { t } X^{\{t\}}バツ{ t }Y { t } Y^{\{t\}}Y{ t }。X{ t } X^{\{t\}}バツ{ t }の次元は(nx, 1000) (n_{x},1000)( n×1000 )nx n_{x}n×はサンプル入力ユニットの数です、Y { t } Y^{\{t\}}Y{ t }の次元は( 1 , 1000 ) (1,1000)( 1 1000 )

以前は、トレーニング セット内の値を表すために上山括弧 (i) を使用していたため、x (i) x^{(i)}バツ( i )は i 番目のトレーニング サンプルです。上角括弧 [ l ] を使用して、ニューラル ネットワークの層数z [ l ] z^{[l]}z[ l ] はニューラル ネットワークの l 番目の層の z 値を表します。さまざまなミニバッチを表すために中括弧 t を導入します。そのため、X { t } X^{\{t\}}バツ{ t }Y { t } Y^{\{t\}}Y{ t }

トレーニング セットでミニバッチ勾配降下法を実行するには、t=1...5000 に対して実行します。これは、それぞれ 1000 個のサンプルを持つ 5000 個のグループがあり、for ループで行う必要があるのは、基本的に X を計算することです。 { t } X^{\{t\}}バツ{ t }Y { t } Y^{\{t\}}Y{ t }は 1 ステップの勾配降下法を実行します。

ここに画像の説明を挿入します

バッチ勾配降下法を使用する場合、各反復はトレーニング セット全体を実行する必要があり、反復ごとにコストが減少することが期待できるため、コスト関数 J が反復数の関数である場合、コスト関数 J は次のように減少するはずです。各反復で、特定の反復で J が増加する場合は、明らかに何かが間違っており、学習率が高すぎる可能性があります。

ミニバッチ勾配降下法を使用して、プロセス全体を通じてコスト関数のグラフを描画する場合、すべての反復が下降しているわけではありません。特に各反復では、対処する必要があるのは X { t } X ^ {\{ t \}}バツ{ t }Y { t } Y^{\{t\}}Y{ t }、コスト関数をJ { t } J^{\{t\}}J{ t }のグラフは X { t } X^{\{t\}}にのみ関連しますバツ{ t }Y { t } Y^{\{t\}}Y{ t }コスト関数 J のプロットの結果は下向きになりますが、ノイズが増えます。これは、反復ごとに異なるサンプル セットまたは異なるミニバッチをトレーニングしているためです。

ミニバッチ勾配降下法を使用する場合、決定する必要がある変数の 1 つはミニバッチのサイズです。m はトレーニング セットのサイズです。極端な場合、ミニバッチのサイズがm に等しい場合、これは実際にはバッチ勾配降下法です。ミニバッチ サイズが 1 であると仮定すると、これは確率的勾配降下法です。

確率的勾配降下法では、特定の点から開始して、開始点を再選択します。各反復では、1 つのサンプルに対してのみ勾配降下法を実行します。ほとんどの場合、グローバル最小値に向かって移動しますが、場合によってはグローバル最小値から遠ざかることもあります。最小値です。そのサンプルがたまたま間違った方向を指しているため、確率的勾配降下法には多くのノイズが含まれています。平均すると、最終的には最小値に近くなりますが、場合によっては間違った方向に進むこともあります。確率的勾配降下法は決して収束せず、常に最小値の周囲で変動しますが、最小値には到達せず、そこに留まります。

さらに、確率的勾配降下法の主な欠点は、一度に 1 つのトレーニング サンプルのみが処理されるため、ベクトル化によってもたらされる加速度がすべて失われることです。これはあまりにも非効率であるため、実際には、媒体を選択するのが最善です。 -size ミニバッチ サイズは実際に最速の学習速度を達成します。一方で、大量のベクトル化が可能になります。ミニバッチ サイズが 1000 サンプルの場合、複数のサンプルを一度に処理するよりもはるかに高速に 1000 サンプルをベクトル化できます。一方、作業を開始する前に、トレーニング セット全体が処理されるのを待つ必要はありません。

指数加重平均

移動平均としても知られる指数加重平均は、その名前からわかるように、実際には平均化アルゴリズムであり、後でモメンタム、RMSProp、および Adam を紹介するときに使用されます。

計算 指数
加重平均の計算式:
vt = β vt − 1 + ( 1 − β ) θ t v_t = \beta v_{t-1} + (1- \beta)\theta _tv=bv _t 1+( 1b )
其中 β \beta β は通常 0.9 をとる係数を指します、vn v_nv現在の指数加重平均θ \thetaを表します。θは電流値を表します。これを例を使って紹介しましょう。
ここに画像の説明を挿入します
上の図はイギリス、ロンドンの 1 年間の気温の散布図で、このデータは気温の移動平均を計算するために使用されます。
あなたがしなければならないことは、まずv 0 = 0 v_0=0v0=0の場合、毎日、加重値 0.9 を使用して、前の値をその日の気温の 0.1 倍に加算する必要があります。つまり、v 1 = 0.9 v 0 + 0.1 θ 1 v_1=0.9v_0+0.1\theta_1v1=0.9v_ _0+0.1i _1, ということで、初日の気温の値がこちらです。

翌日、加重平均を取得できます。前の値に 0.9 を乗算し、その日の気温の 0.1 倍を加えます。つまり、v 2 = 0.9 v 0 + 0.1 θ 2 v_2=0.9v_0+0.1\theta_2 となります。v2=0.9v_ _0+0.1i _2、 等々。

このように計算して赤い線でプロットすると、下図のような結果が得られます。
ここに画像の説明を挿入します
計算時に表示されるvt v_tvおそらく1 1 − β \frac{1}{1-\beta}1 b1毎日の平均気温 ( β \betaの場合)βは 0.9、vt v_tv上の写真の赤いハートの部分の10日間の平均になります。

β \βの場合βを 0.98 などの 1 に近い値に設定し、1 1 − 0.98 = 50 \frac{1}{1-0.98}=50 を1 0.981=過去50日間の気温のおおよその平均である 50 をグラフに描くと、下図に示す緑色の線が得られます。β = 0.98 \beta=0.98
ここに画像の説明を挿入します
の場合b=0.98では、注意すべき点がいくつかあります。得られる曲線はより平坦になるはずです。その理由は、さらに数日間の気温を平均したため、この曲線は変動が小さく、より平坦になっています。欠点は、曲線がβ が変化するとき、一定の遅延が発生します。= 0.98 \ベータ=0.98b=0.98は、前日の値に重みを付けすぎることに相当します。当日の値には 0.02 だけの重みが与えられているため、気温が変化すると、温度が上昇したり下降したりしますβが大きい場合、指数加重平均はよりゆっくりと適応します。

β \βの場合βを 0.5 に設定すると、2 日間の気温のみが平均されます。
ここに画像の説明を挿入します
わずか 2 日間の気温を平均しているため、平均データが少なすぎるため、得られた曲線にはノイズが多くなり、外れ値が含まれる可能性がありますが、この曲線は気温の変化により速く適応できます。

このパラメータを調整することで ( β \betaβ は後続の学習アルゴリズムで非常に重要なパラメーターになります) があり、わずかに異なる効果を達成することができます。多くの場合、中間の値が最も効果的です (β \beta)βが中間値の場合に得られる赤色の曲線は、

指数加重平均式の利点の 1 つは、使用するメモリが非常に少ないことです。コンピュータ メモリ内の数値の 1 行のみを占有するだけです。その後、式に最新のデータを代入し、上書きし続けることができます。このため、 、その効率は基本的に、コードの 1 行のみを使用し、指数加重平均の計算には 1 行の数値のストレージとメモリのみが使用されます。

バイアス補正
ここに画像の説明を挿入します
実際の計算過程では、β \betaβが 0.98 の場合これは、移動平均を計算するときに、v 0 = 0 v_0=0v0=0v 1 = 0.9 v 8 0 + 0.02 θ 1 v_1=0.9v8_0+0.02\theta_1v1=0.9v8 _ _0+0.02i _1ただし、v 0 = 0 v_0=0v0=0なので、計算はv 1 = 0.02 θ 1 v_1=0.02\theta_1 とv1=0.02i _1, そのため、得られる値はかなり小さくなります。初日の気温の推定値は不正確です。また、v 2 v_2を代入します。v2計算式を取得します、v 2 v_2v2年の最初の 2 日間の気温を正確に推定することもできません。

特に推定の初期段階では、 vt v_tを使用せずに、この推定をより適切かつ正確にするために修正する方法があります。v代わりにvt 1 − β t \frac{v_t}{1-\beta^t}を使用してください。1 btv

たとえば、t = 2 の場合、t=2t=2の場合、1 − β t = 1 − 0.9 8 2 = 0.0396 1-\beta^t=1-0.98^2=0.03961bt=10.9 82=0.0396であるため、翌日の気温の推定値はv 2 0.0396 = 0.0196 θ 1 + 0.02 θ 2 0.0396 \frac{v_2}{0.0396}=\frac{0.0196\theta_1+0.02\theta_2}{0.0396} となります。0.0396v2=0.03960.0196i _1+ 0.02i _2、つまり、θ 1 \theta_11 θ 2 \theta_2 2バイアスを除去した加重平均。ttでそれがわかりますt が増加すると、β t \beta^tbtは 0 に近いので、tttが非常に大きい場合、バイアス補正はほとんど効果がありません。tが大きい場合、紫色の線は基本的に緑色の線と一致します。

勢いのある勾配降下

通常の勾配降下法では、より複雑な状況に遭遇すると、学習率が大きすぎると、振れが大きすぎて誤差が大きくなり、学習率が小さすぎると、反復回数が減少するということが起こります。増加すると、学習時間が非常に長くなります。上記のような状況はニューラル ネットワーク モデルでよく発生しますが、解が狭い範囲で振動し、最適解を得ることが困難な状況が常に発生します。

運動量勾配を使用すると、上記の問題をより適切に回避できます。そのプロセスは、関数曲線上を転がり落ちる質量を持つ小さなボールに似ています。最下点に到達すると、ボールは慣性でしばらく上昇を続け、その後転がり、最下点を通って上昇し…最後にボールは最下点で止まります。また、ボールには慣性があるため、関数曲線や表面が急峻で複雑な場合、ボールはこれらを通過してできるだけ早く最下点に到達することができます。

運動量勾配降下法アルゴリズムは、勾配降下法アルゴリズムに基づいていくつかの最適化を行い、勾配降下法アルゴリズムの収束を次の図に示します。
ここに画像の説明を挿入します
黒い点は開始点を表し、赤い点は終了点を表します。勾配降下法アルゴリズムを継続的に反復することで、黒い点から赤い点までゆっくりと移動します。上の図から、黒い点の移動軌跡が y 方向に上下に変動していることがわかります。黒い点が赤い点に移動するための位置です。図に示すように、この不要な計算を減らして X 軸方向の移動のペースを加速したいため、 の位置は役に立ちませんが、時間の無駄です。下図 勾配ダウンホールアルゴリズムのパラメータ更新式: w
ここに画像の説明を挿入します
= w − α ∗ dww=w-\alpha*dw

w=wあるd w
b = b − α ∗ dbb=b-\alpha*dbb=bあるd b
運動量勾配降下アルゴリズムのパラメータ更新式:
vw = β vw + ( 1 − β ) dw v_w = \beta v_w + (1- \beta)dwv=bv _+( 1b ) d w
vb = β vb + ( 1 − β ) db v_b = \beta v_b + (1- \beta)dbvb=bv _b+( 1β ) d b
w = w − α ∗ vww=w-\alpha*v_ww=wあるv
b = b − α ∗ vbb=b-\alpha*v_bb=bあるvb

上の式では、α \alphaαは学習率を表します。上の式から、運動量勾配降下アルゴリズムはパラメータを更新するときに勾配を直接使用しないことがわかります。また、以前の勾配も使用し、特定の量は β \ ベータに関連しますそれはββ \betaβが大きいほど、以前の勾配がより多く使用されます。β\betaβが小さいほど、以前のより小さい勾配が使用されます。

y 軸方向の傾きは正または負であるため、平均値はほぼ 0、つまり y 軸方向にはあまり変化しません。x 軸方向の勾配は一貫しているため、x 軸方向の加速された運動量の更新を提供できます。運動量勾配降下アルゴリズムにより、パラメータを更新する際には現在の勾配だけでなく、前回の勾配の平均値も運動量として使用され、極小値(勾配が 0 に近い)に陥った場合、運動量勾配降下法が実行されます。アルゴリズムはパラメーターを更新するときに引き続きそれを使用します。以前の勾配の平均を使用して極小値から飛び出すことができますが、勾配降下法アルゴリズムは極小値にのみ落ちます。

RMSprop アルゴリズム

RMSprop アルゴリズムの正式名は、二乗平均平方根プロップです。RMSprop アルゴリズムの考え方は、モーメント アルゴリズムの考え方と一致しています。どちらも、y 軸方向のジッターを削減し、x 軸方向の移動ステップを増加します。軸方向。実装は少し異なります。モーメントは主に以前の勾配の累積を使用して加速を実現しますが、RMSprop アルゴリズムの考え方は、勾配降下法アルゴリズムを使用して y 軸方向に比較的大きな勾配を持たせることです。 x 軸方向の勾配が比較的小さい、小さい。パラメータを更新する際、y軸方向の勾配を持たせます( db dbd b ) は大きな数で除算されるため、y 軸の更新の大きさは小さくなります。そして、x 軸方向の勾配 (dw dwd w ) を小さな数で割ると、x 軸の更新が大きくなります。したがって、y 軸方向の更新ステップ サイズが減少し、x 軸方向の更新ステップ サイズが増加するため、アルゴリズムの収束が速くなります。更新式は次のとおりです。

S dw = β S dw + ( 1 − β ) dw 2 S_{dw} = \beta S_{dw} + (1- \beta)dw^2S=βS _+( 1β ) dw _2
S db = β S db + ( 1 − β ) db 2 S_{db} = \beta S_{db} + (1- \beta)db^2Sdb _=βS _db _+( 1b ) d b2
w = w − α ∗ dw S dw + ε w=w-\alpha*\frac{dw}{\sqrt{S_{dw}}+\varepsilon }w=wあるS + e
b = b − α ∗ dw S db + ε b=b-\alpha*\frac{dw}{\sqrt{S_{db}}+\varepsilon};b=bあるSdb _ + e

パラメーターを更新するときに分母が 0 になるのを避けるために、非常に小さな数ε \varepsilonを分母に追加する必要があります。ε、通常は1 0 − 8 10^{-8}1 08dw 2 dw^22 はパラメータwwwの勾配の 2 乗は、微分の 2 乗とも呼ばれます。

縦軸方向、横軸方向をそれぞれbbとする。b w w w、表示の便宜のためです。実際には、パラメータの高次元空間にいるため、ウィグルの垂直方向の次元を削除する必要があり、実際にはパラメータ w 1 、 w 2 w_1、w_2 であるウィグルを削除する必要がありますw1w2など、水平方向の寸法はw 3、w 4、w_3、w_4になります。w3w4待って、bbを入れてくださいb w w wの区切りは便宜上のものです。実際のdw dwd wは高次元パラメータ ベクトル、db dbも高次元パラメータベクトルである。

アダムアルゴリズム

Adam アルゴリズムの正式名は Adaptive Moment Estimation で、主にモーメント アルゴリズムと RMSprop アルゴリズムを組み合わせたものです。式は次のとおりです。

vdw = 0 、 vdb = 0 、 S dw = 0 、 S db = 0 v_{dw}=0、v_{db}=0、S_{dw}=0、S_{db}=0v=0 vdb _=0 S=0 Sdb _=0
vdw = β 1 vdw + ( 1 − β 1 ) dw v_{dw} = \beta_1 v_{dw} + (1- \beta_1)dwv=b1v+( 1b1) d w
vdb = β 1 vdb + ( 1 − β 1 ) db v_{db} = \beta_1 v_{db} + (1- \beta_1)dbvdb _=b1vdb _+( 1b1) d b
S dw = β 2 S dw + ( 1 − β ) dw 2 S_{dw} = \beta_2 S_{dw} + (1- \beta)dw^2S=b2S+( 1β ) dw _2
S db = β 2 S db + ( 1 − β ) db 2 S_{db} = \beta_2 S_{db} + (1- \beta)db^2Sdb _=b2Sdb _+( 1b ) d b2

パラメータの更新:

w = w − α ∗ vdw S dw + ε w=w-\alpha*\frac{v_{dw}}{\sqrt{S_{dw}}+\varepsilon }w=wあるS + ev
b = b − α ∗ vdb S db + ε b=b-\alpha*\frac{v_{db}}{\sqrt{S_{db}}+\varepsilon }b=bあるSdb _ + evdb _

指数加重平均アルゴリズムを使用する場合、初期化の偏差が比較的大きくなる場合がありますが、次の方法で偏差を修正できます。

vdwcorrected = vdw 1 − β 1 t v_{dw}^{corrected}=\frac{v_{dw}}{1-\beta_{1}^{t}}v修正まし=1 b1vvdbcorrected = vdb 1 − β 1 t v_{db}^{corrected}=\frac{v_{db}}{1-\beta_{1}^{t}}vdb _修正まし=1 b1vdb _

S dwcorrected = S dw 1 − β 2 t S_{dw}^{corrected}=\frac{S_{dw}}{1-\beta_{2}^{t}}S修正まし=1 b2SS dbcorrected = S db 1 − β 2 t S_{db}^{corrected}=\frac{S_{db}}{1-\beta_{2}^{t}}Sdb _修正まし=1 b2Sdb _

w = w − α ∗ vdwcorrected S dwcorrected + ε w=w-\alpha*\frac{v_{dw}^{corrected}}{\sqrt{S_{dw}^{corrected}}+\varepsilon }w=wあるS修正まし + ev修正ましb = b − α ∗ vdbcorrected S dbcorrected + ε b=b-\alpha*\frac{v_{db}^{corrected}}{\sqrt{S_{db}^{corrected}}+\varepsilon }b=bあるSdb _修正まし + evdb _修正まし

上式のttt は反復回数、β 1 \beta_1b1Momentum のハイパーパラメータです。通常は 0.9、β 2 \beta_2b2RMSprop のハイパーパラメータです。通常は 0.999、ε \varepsilonε は、分母が 0 で1 0 − 8 10^{-8} と1 08

参考記事
https://blog.csdn.net/weixin_36815313/article/details/105432576
https://blog.csdn.net/sinat_29957455/article/details/88088720

おすすめ

転載: blog.csdn.net/Luo_LA/article/details/132291294