質問

現在、確率的勾配降下法の実装に取り​​組んでいます。 SGD, 、バックプロパゲーションを使用するニューラルネットの場合、その目的は理解していますが、学習率の値を選択する方法についていくつか質問があります。

  • 学習率は誤差勾配の形状に関係していますか?それは降下率を決定するのでしょうか?
  • もしそうなら、値に関する決定を伝えるためにこの情報をどのように使用しますか?
  • そうでない場合は、どのような値をどのように選択すればよいでしょうか。
  • オーバーシュートを避けるために小さな値を選択する必要があるように見えますが、極小値に引っかかったり、下降に時間がかかりすぎたりしないように、どのように値を選択すればよいでしょうか?
  • 学習率を一定にするのは意味があるのでしょうか、それとも勾配の最小値に近づくにつれて何らかのメトリックを使用してその値を変更する必要があるのでしょうか?

要するに:SGD の学習率はどのように選択すればよいですか?

役に立ちましたか?

解決

  • 学習率は、降下率を指示するため、エラー勾配の形状に関連していますか?

    • 単純な SGD では、答えはノーです。誤差勾配とは無関係なグローバル学習率が使用されます。ただし、あなたが得た直感は、SGD 更新ルールのさまざまな変更を引き起こしました。
  • もしそうなら、値に関する決定を伝えるためにこの情報をどのように使用しますか?

    • Adagrad はこれらの中で最も広く知られており、世界的な学習率をスケールします。 η 誤差勾配の履歴の l2 ノルムに基づく各次元で GT 各次元について:

      enter image description here

    • アダデルタ これは、adagrad のような誤差勾配履歴と重み更新履歴の両方を使用する別のトレーニング アルゴリズムであり、次の利点があります。 学習率をまったく設定する必要がない.

  • そうでない場合は、どのような値をどのように選択すればよいでしょうか。

    • ニューラルネットでのプレーンSGDの学習率の設定は、通常、0.01などの正気な値から始まり、最適な値を見つけるために相互検証を行うプロセスです。典型的な値は、0.0001から1までの数桁の範囲です。
  • オーバーシュートを避けるために小さな値を望んでいるように思えますが、ローカルミニマに閉じ込められたり、下降するのに時間がかかりすぎないように、どのように選択しますか?学習率を一定にするのは意味があるのでしょうか、それとも勾配の最小値に近づくにつれて何らかのメトリックを使用してその値を変更する必要があるのでしょうか?

    • 通常、最適な値は、最高の安定した学習率と学習率の減衰/アニーリング(線形または指数)に近いものであり、トレーニングの過程で使用されます。この背後にある理由は、初期には明確な学習シグナルがあるため、積極的な更新によって探索が促進される一方、後半では学習率が小さくなり、ローカル エラー サーフェスをより繊細に活用できるようになるためです。

他のヒント

以下は、Andrew Ng によるニューラル ネット (逆伝播) の学習率に関する非常に優れたメモ (12 ページ) です。学習率に関する詳細が表示されます。

http://web.stanford.edu/class/cs294a/sparseAutoencoder_2011new.pdf

4 番目の点については、通常はオーバーシュートしたり収束が遅すぎたりしない「バランスのとれた」学習率を選択する必要があるというのは正しいです。学習率をグラフ化できます。診断/微調整するためのコスト関数の降下。実際、Andrew は通常、L-BFGS アルゴリズム (12 ページで説明) を使用して、「十分な」学習率を取得します。

学習率の選択は、次のように知られる「メタ問題」の一例です。 ハイパーパラメータの最適化. 。最高の学習率は、当面の問題だけでなく、最適化されているモデルのアーキテクチャ、さらには現在の最適化プロセスにおけるモデルの状態によっても異なります。次のようなハイパーパラメータの最適化専用のソフトウェア パッケージもあります。 スペアミント そして ハイパーオプト (ほんの数例です。他にもたくさんあります!)。

本格的なハイパーパラメータの最適化とは別に、これまで言及されていなかった、学習率を選択するための非常に一般的な手法の 1 つについて触れておきたいと思いました。 焼き鈍し法 モデルを最適化するための手法であり、大きな学習率から始めて、最適化が進むにつれて学習率を徐々に下げます。一般に、大きな学習率 (0.1 程度) でモデルを最適化し、その後、この学習率を徐々に (多くの場合は 1 桁ずつ) 下げていきます (0.01、次に 0.001、0.0001 など)。

これと組み合わせることができます 早期停止 進捗が進んでいる限り 1 つの学習率でモデルを最適化し、進捗が遅いと思われる場合はより小さい学習率に切り替えます。学習率が大きいほど、モデルが一般的な大規模な最適化の領域を特定するのに役立ち、学習率が小さいほど、モデルが 1 つの特定の局所最適に焦点を当てるのに役立ちます。

からコピー&ペースト 私の修士論文:

  • 損失が数エポックにわたって減少しない場合は、学習率が低すぎる可能性があります。最適化プロセスが極小値に陥る可能性もあります。
  • NAN での損失は、学習率が高すぎることが原因である可能性があります。別の理由は、ゼロまたはゼロの対数を取得することによる分割です。
  • 体重更新の追跡:Andrej Karpathyは、CS231Nの第5回講義で、学習率が適切に選択されているかどうかを確認するために重量の更新を追跡するために提案しました。彼は、重量の更新が10-3の順にあるべきだと示唆しています。重みの更新が高すぎる場合は、学習率を下げる必要があります。重量の更新が低すぎる場合、学習率を上げる必要があります。
  • 一般的な学習率は [0.1, 0.00001] です。

反復プロセス中に「ステップ サイズ」として変換される学習率は、長年にわたってホットな問題であり、今後も続くでしょう。

私が懸念しているステップ サイズには 3 つのオプションがあります。

  • 1つは「」に関連するものです。時間「そして、各寸法は同じステップサイズを共有するものとします。次のようなことに気付いたかもしれません

$\it\huge\bf\frac{\alpha}{\sqrt{t}}$

t は現在の反復番号を示し、alpha はハイパーパラメータです

  • 次に繋がるのは 勾配 、そして各寸法には独自のステップサイズがあります。次のようなことに気付いたかもしれません

$ it gage frac {1} { frac { alpha} { beta + sqrt { sum_ {s = 1}^{t -1} {g_ {s}^2}}} - frac { alpha} { beta + sqrt { sum_ {s = 1}^{t} {g_ {s}^2}}}}} $

alpha と beta はハイパーパラメータですが、g は勾配を示します

  • 最後のものは 時間と勾配の組み合わせ 、そしてそれはようなものでなければなりません

$\it\huge\frac{1}{\frac{\alpha}{\beta + \sqrt{\sum_{s = 1}^{t - 1}{g_{s}^2}}} -\frac {\alpha}{\beta + \sqrt{\sum_{s = 1}^{t}{g_{s}^2}}}} + \frac{\gamma}{\sqrt{t}}$

または

$\it\huge\frac{1}{\frac{\alpha}{\beta + \sqrt{\sum_{s = 1}^{t - 1}{g_{s}^2}}} - \frac {\alpha}{\beta + \sqrt{\sum_{s = 1}^{t}{g_{s}^2}}}} * \frac{\gamma}{\sqrt{t}}$

これがお役に立てば幸いです、頑張ってください -)

ニューラル ネットワークは、重みの勾配降下法によってトレーニングされることがよくあります。これは、各反復でバックプロパゲーションを使用して各重みに関する損失関数の導関数を計算し、その重みからそれを減算することを意味します。ただし、実際にそれを試してみると、反復ごとに重みが大幅に変化するため、重みが「過剰修正」され、損失が実際に増加/発散します。したがって、実際には、通常、各微分値に「学習率」と呼ばれる小さな値を乗算してから、対応する重みから減算します。

ニューラル ネットワークの損失関数を表面として考えることもできます。この表面では、移動できる各方向が重みの値を表します。勾配降下は現在の斜面の方向に飛躍するようなもので、学習率は飛躍する長さに似ています。

David の答えに追加すると、fastai では、特定のアーキテクチャを使用してそのデータの最適な学習率を見つけるという概念を見つけました。

しかし、それはfastai/pytorchにのみ存在します。最近誰かがケラスを作りました 実装.

これらは次の論文に基づいています。

お役に立てれば。

Jeremy Howard の著書に基づいて、学習率の選択に関する別のアプローチを簡単に紹介します。 ディープラーニング コース1。さらに深く掘り下げたい場合は、 このブログ投稿.

Jeremy Howard のコースで提案されている学習率は、さまざまな学習率を試し、損失関数が最も低下する学習率を選択する体系的な方法に基づいています。これは、多くのバッチをミニバッチ勾配降下法にフィードし、メソッドに新しいバッチをフィードするたびに学習率を高めることによって行われます。学習率が非常に小さい場合、損失関数は非常にゆっくりと減少します。学習率が非常に大きいと、損失関数が増加します。これら 2 つの領域の間には、損失関数が最も早く減少する最適な学習率が存在します。これは次の図でわかります。

enter image description here

学習率が約 $10^{-3}$ になると損失が非常に早く減少することがわかります。このアプローチを使用すると、ネットワークに最適な一定学習率の近似値を選択する一般的な方法が得られます。

ライセンス: CC-BY-SA帰属
所属していません datascience.stackexchange
scroll top