Caffe は現在、6 種類の最適化アルゴリズムを提供しています:
- 確率的勾配降下法 (type: SGD)
- AdaDelta (type: AdaDelta)
- 適応勾配法 (type: AdaGrad)
- Adam (type: Adam)
- Nesterov の加速勾配法 (type: Nesterov)
- RMSprop (type: RMSPorp)
Solver は Caffe のコアです。その役割は、前向き計算を交互に行い、loss を求め、後向き計算でパラメータを更新し、loss を最小化することです。これは反復最適化アルゴリズムの一種です。
あるデータセットがあり、そのデータ総量を D とすると、この全データセットの loss の平均値は次のようになります:
ここで、前の部分はすべてのデータの損失値の平均を求めるもので、後の部分は正則項で、lamda は正則項係数であり、過学習を防ぐために使用されます。
データ量が非常に少ない場合は、上記の式を使用して計算できます。しかし、データ量 D が非常に大きい場合、Loss を一度計算するのに長い時間がかかります。
そのため、この時にバッチ(batch)という概念が提案され、すべてのデータセット D を多くの小さなバッチに分割し、N と呼びます。
一度の前向き計算と後向き計算の中で、私たちは 1 つのバッチ数のデータを抽出し、そのバッチデータの loss のみを更新します。
その後、私たちは繰り返し、何度も 1 つのバッチデータを抽出して計算を行うことができます。
** Caffe では、デフォルトの最適化アルゴリズムは SGD、すなわち確率的勾配降下法です。 **
一。確率的勾配降下法 (SGD)#
確率的勾配降下法は、勾配降下法を基に発展したもので、勾配降下法は最速降下法とも呼ばれます。
SGD の原理を簡単に説明すると、現在のパラメータ W (t+1) は、前回更新後のパラメータ Wt と現在の重み更新値の線形結合に等しいということです。
実際に Caffe で使用する際には、モーメンタム法が加えられます。
ここで、α は学習率(base_lr)、μ は前回の勾配値の重み、すなわちモーメンタムです。
学習率は常に減少させる必要があり、モデルを最適化するために重要です。学習率はステップサイズとして理解でき、最適化モデルは最も急な方向から最低谷を探すことに相当します。もしステップが大きすぎると、最低谷を越えてしまう可能性があり、逆に小さすぎると、探すのが遅くなり、他の非最低谷に陥ってしまうことがあります。solver ファイル内では、学習率の減少戦略 lr_policy が多くあり、後で詳しく説明しますので、知っておいてください。
上記で述べた最も急な方向は、実際には負の勾配方向です。
モーメンタムは、loss が安定している場合に、できるだけその下降を加速させることです。** SGD の場合、これは一般的に 0.9 に設定され、特定の状況では、学習率が非常に小さくなったときにモーメンタムを 0.99 に設定して、トレーニング効果を向上させることができます。 **
二. AdaDelta#
Paper アドレス: https://arxiv.org/pdf/1212.5701.pdf
AdaDelta は適応的な学習率法であり、勾配降下法に基づいて発展したものです。このアルゴリズムは手動で学習率を調整する必要がなく、ノイズに対して非常に良いロバスト性を持っています。
以下はこの方法のいくつかの利点です:
-
手動で学習率を設定する必要がない。
-
ハイパーパラメータの初期化に敏感でない。
-
各次元ごとに動的な学習率がある。
-
大きな勾配、ノイズ、および構造選択に対して非常に良いロバスト性を持つ。
-
ローカルおよび分散環境への適応性が非常に良い。
原作者は最初に勾配降下法に多くの変更を加えようとし、最大のアイデアはニュートン法を適用し、二次導関数のコスト関数、すなわちヘッセ行列を使用することでした:
ここで Δxt はパラメータの変化量、Ht はヘッセ行列で、学習率に相当します。gt は勾配で、下降方向を決定します。この時、学習率はヘッセ行列によって決定されるため、手動で学習率を設定する必要はありません。
しかし、ヘッセ行列の計算は非常に複雑で面倒であるため、著者はヘッセ行列のこの考えを借りて、一階導関数の使用を強化するか、ヘッセ行列の結果を推定する方法を考えました。
最終的には、一階導関数の使用を強化する方法を選択し、二次ニュートン法を近似的にシミュレートしました。
基本的な考え方は SGD と同じで、実際の変化量はモーメンタムと前回の変化量の積から基礎学習率と現在の勾配値を掛けたものを引いたものです(ここで基礎学習率は 1.0 であり、変わりません)。
AdaDelta のモーメンタムは一般的に 0.95 に設定されます。
solver 内の delta は一般的に 1e-6 に設定されます。
** base_lr は必ず 1.0 に設定する必要があります。 **
** lr_policy は必ず fixed に設定する必要があります。
**
------------------------- 以下は具体的なアルゴリズム実装手順 --------------------------------------------------------------------------------------------------------------
論文の著者は AdaGrad 法と多くの比較を行い、AdaDelta 法は主に AdaGrad の 2 つの欠点を解決することを提案しました。一つは、トレーニングが進むにつれて学習率が持続的に減衰する問題を解決しました。著者が表現したかったのは、トレーニングが進むにつれて学習率が持続的に低下すると、後期に最適化への影響が非常に低くなり、最適化が不完全になるということです。二つ目は、初期学習率を手動で設定する必要がある問題を解決しました。
2012 年、Schaul&S. Zhang&LeCun は AdaGrad-like アルゴリズムを提案しました。ここでこのアルゴリズムに言及するのは、AdaDelta アルゴリズムと類似点があるからです。
ここで、diag (Ht) はヘッセ行列の対角行列で、E [gt-w] は現在の t から前 w 回の反復勾配の期待値であり、分母は現在の t から前 w 回の反復勾配の二乗の期待値です。
このように前 w 回の勾配を取る利点は、勾配が消失しないことです。
さて、AdaDelta に戻ります。この方法は単に前 w 回の反復勾配を取るのではなく、すべての反復の勾配を取ります。
ここで、** ρ は減衰定数で、Caffe ではモーメンタムを設定することでこのパラメータを設定します。 ** この公式を使用して、現在のイテレーションでのすべての勾配の二乗の期待値を計算します。
私たちは上記の結果の二乗をパラメータ更新に使用する必要があります。ここでは RMS(root mean square、均方根)で表します:
ここで、RMS [g] t は現在のイテレーションでの勾配 g の均方根値であり、** ε は定数(solver 内のパラメータ delta)です。 ** 平滑項であり、出力結果がゼロにならないようにするために使用されます。なぜなら、この結果は後で分母として使用されるからです。
最後に、パラメータの変化量の公式:
上記の方法は Tieleman&Hinton の RMSProp です。
その後、Zeiler はユニットの問題を考慮し、Δx はパラメータ x を更新するために使用されるため、彼らのユニットは一致する必要があります。
私の理解を述べると、上記の公式において、gt のユニットは x と正の相関があるべきです。RMS [g] t のユニットも x と正の相関があります。
しかし、一度割り算をすると、無次元の状況になります。
したがって、以下の公式を見て、分子に前回の反復のパラメータ変化量の RMS を加えることで、ユニットを再び取り戻しました。
** このユニットをどう理解するかにはまだ混乱がありますが、「単位」と理解できると思います。 **
また、前回の反復を加えることで、最終結果のロバスト性が増し、突発的な変化が起こらないようになります。
分子分母の RMS 内の ε は同じ値を取ります。
実際のステップサイズは、学習率とも考えられ、現在の勾配と前回のパラメータ変化量に関連しています。
したがって、異なる層、異なる次元のパラメータの学習率も異なります。「人それぞれ」と表現できます。
SGD のようにすべてのパラメータの学習率が同じであるわけではありません。
AdaDelta はトレーニングの初期と中期に速度が非常に速いですが、後期には局所最適に陥りやすいです。この点では SGD の方が効果的です。
三. AdaGrad#
Adaptive Gradient 自適応勾配アルゴリズムは、L2 正則化を参考にしています。
ここで、分母は 1 から t までのすべての勾配和の平方根で、η は基礎学習率です。
重みの初期化は AdaGrad に敏感であり、重みの初期化が大きすぎると、勾配が大きくなり、調整幅が非常に小さくなります。
トレーニングの後期には、勾配が簡単に 0 に近づき、トレーニングが早期に終了します。
疎な勾配を処理するのに適しています。
実際の使用公式は:
** solver 内の base_lr は一般的に大きく設定せず、0.01 を参考にできます。 **
** lr_policy は必ず「fixed」に設定する必要があります。 **
momentum は対応する公式の中の ε です。
四. Adam#
Adaptive Moment Estimation
同様に、勾配に基づく最適化方法です。
一階の勾配情報のみが必要で、非常に少ないメモリを占有します。
勾配の一階モーメントと二階モーメントを推定することによって、各パラメータの学習率を動的に調整します。
ここで、mt は勾配の一階モーメントの推定、nt は勾配の二階モーメントの推定です。上記の曲がった部分は自身の補正です。
u は一般的に 0.9 を取ります。
v は一般的に 0.999 を取ります。
ε は一般的に 1e-8 を取ります。
五. NAG#
Nesterov の加速勾配法
Nesterov の改良は、以前のモーメントが現在のモーメントに直接影響を与えることです。
ここで、η は基礎学習率、μ はモーメント(衝量)です。
モーメントはまず勾配を計算し、短い青いベクトルを得ます。その後、加速更新の方向に大きなジャンプを行います。長い青いベクトルです。
nesterov 項は以前の加速勾配の方向に大きなジャンプを行い、茶色のベクトルです。
最後に勾配を計算し、補正を行います。緑のベクトルです。
** solver 内の base_lr は一般的に 0.01、gamma は 0.1 です。 **
** lr_policy は一般的に「step」で、stepsize は状況に応じて異なります。 **
** momentum は一般的に 0.95 です。 **
**
**
六. RMSprop#
このアルゴリズムの公式は上記の AdaDelta で既に書かれています。RMSprop は AdaDelta の中間形式です。
** solver 内の base_lr は状況に応じて 1.0 または 0.001 です。 **
** ** lr_policy は一般的に「fixed」です。 ** **
** ** rms_decay は一般的に 0.98 です。 ** **
** ** momentum は一般的に 0.95 です。 ** **
七。最適化方法と最適化戦略の選択#
-
RMSprop は AdaGrad のトレーニング後期における勾配消失の問題を解決しました。
-
AdaDelta のパラメータの学習率は初期学習率に依存しません。一方、RMSprop のパラメータの学習率は初期学習率に依存します。
-
Adam は RMSprop にバイアス補正とモーメントを追加しました(注意:RMSprop のパラメータ momentum の数値は期待値を求める過程で作用し、モーメントとは見なされません)。
-
入力データが疎である場合は、適応学習率の最適化方法(AdaGrad、AdaDelta、RMSprop、Adam)を使用するのが最良です。なぜなら、最適化の過程で自動的に学習率を調整するからです。
-
最適化速度を重視する場合、適応学習率法は比較的速いです。** Adam は現在最良の最適化方法かもしれませんが、多くの専門家は依然として元の SGD を使用し、モーメント項を使用しません。 **
-
シャッフル:各イテレーションでデータサンプルの順序をランダムにシャッフルします。
-
カリキュラム学習:トレーニングサンプルを何らかの意味のある方法で並べ替えることで、徐々に困難な問題を解決するのに役立ちます。
-
パラメータ初期値の正規化。
-
早期停止、これは可視化技術と組み合わせて行います。過学習前のモデルを使用します。
-
損失関数に正則化項を追加します。
-
ドロップアウト、テスト段階ではドロップアウトを使用しないでください。
-
並列および分散最適化方法: Hogwild、Downpour SGD、Delay-tolerant Algorithms for SGD、Elastic Averaging SGD、ツール使用 Tensor Flow。