DLノート:勾配降下法

改善結果 『DLノート:勾配降下法について』

ニューラルネットワークの「学習」方法

写真: Rohit Tandon / Unsplash

人工ニューラルネットワーク(ANN)は「万能関数近似器」です。十分なデータが提供され、適切なアーキテクチャがあり、十分な時間で訓練されている場合、複雑な関数を近似することができます。

しかし、ネットワークを「訓練」するとは具体的にどういう意味なのでしょうか?

以前のフィードフォワードプロセスに関する記事では、ネットワークを訓練するとは、近似しようとする関数により適したフィットを得るために重みの値を調整することを指していました。

この記事では、ANNの重みを調整するために使用される勾配降下法のアルゴリズムについて説明します。

基本的な概念から始めましょう。

山から下りる

山の頂上にいて、隣の谷の最低点に行く必要があると想像してください。

私たちには地図がありません。霧が立ち込め、暗くなってしまいました。私たちは道を失い、急いで谷底に向かわなければなりません。素敵なシナリオではありませんが、この問題の「境界」を示しています。

安全のために、山には急な尾根がないと仮定しましょう。つまり、微分可能な関数に似ています。

Monviso peak からの下降。Oncino近くの小さな谷。画像: 作者

暗くなると、進んでいる方向がわかりません。下降する唯一の方法は、小さなステップを踏みながら、高度が下がったかどうかを確認することです。

もし上に進んだと気づいたら、逆の方向に進みます。下に進んだ場合はそのまま進みます。このプロセスを繰り返し、やがて谷底に辿り着きます。

ご覧の通り、これは必ずしも最善の方法ではありません。小さな谷にたどり着いたり、高原で長時間を費やす可能性があります。

これは勾配降下法の基本的な作業原理を示しており、同時にその主な課題も示しています。この例に戻ることにしましょうが、まずはより形式的な説明を見てみましょう。

勾配とは何か

勾配とは、関数の変化率を表すものです。最大の増加または減少の方向を示します。直感的には、勾配は局所的な最大値または局所的な最小値でゼロになります。

変数(または座標軸)に依存する関数の場合、勾配は、与えられた点で評価される関数の偏微分を成分とするベクトルです。これはベクトル微分演算子を表す記号∇(ナブラ)で示されます。

ここで数式で説明します。n次元の関数fがあるとしましょう。

この関数の点p(n個の座標によって決まる)での勾配は次のようになります:

山の例に戻ると、山の斜面のように地形が険しい場所や谷や高原のようにほとんど平坦な場所があります。谷や高原は通常、局所的な最小値を表し、通常は臨界点です。

勾配降下法

多くの最適化問題では、最も正確な結果を得るために損失関数を最小化することを目指しています。

ディープラーニングと人工ニューラルネットワークでは、使用する損失関数は微分可能です。つまり、領域全体を滑らかに通過し、不連続点がありません。

これにより、損失関数の独立変数に関する導関数を使用して、解(グローバルミニマム)に向かって移動しているかどうかの指標とすることができます。

導関数に対するステップの大きさは、導関数に比例してどれだけ大きくするかを示すステップサイズパラメータη(ディープラーニングの場合は「学習率」)によって決まります。ステップサイズを決定するために、勾配に乗じることでスケーリングします。

この方法では、より急な勾配はより大きなステップを生成します。局所的な最小値に近づくにつれて、傾き(勾配)はゼロに近づきます。

次に、1D関数を最適化する際にこれがどのように機能するかを示すために、以下の図を見てみましょう。

1次元問題の勾配降下法の簡略例。画像作者提供。

ご覧の通り、私たちは最小値を「探索」を任意の点で初期化します(AとBの2つの例を示しました)。スロープに比例して、最寄りの最小値に向けて徐々にステップを踏みます。

このイラストは、次の擬似コードのアルゴリズムを表しています[1]:

θ(0) = θ_init       # 最適化変数の初期化η = 0.02            # 任意のステップサイズパラメータЄ = 0.01            # 最適化の精度k = 0               # イテレーションカウンタwhile |f(θ(k+1) - f(θ(k))| > Є: θ(k+1) = θ(k) - η ∇f(θ(k)) k = k + 1

ここでの損失関数は、山の例で暗くて地図がないようなものです。どのような形状をしているかはわかりません。最小化されるJの値が、すべての可能な入力θに対してどのようになるか、最適化アルゴリズムはわかりません。

これが、最適化アルゴリズムを任意の値θで初期化する理由です。たとえば、図の点Aと点Bは、2つの異なる初期化値を表しています。

勾配降下法の潜在的な問題

勾配降下法は、どの凸関数に対しても近似的な解を得るのに有効です。

関数が凸であるならば、任意のϵの値に対して真の最適なθからϵ以内にθ*に収束するようなステップサイズηが存在します。[1]

しかし、おわかりの通り、これは完璧ではありません。アルゴリズムが収束するかもしれませんが、必ずしもグローバルミニマムを見つけるわけではありません。

勾配降下法の主な課題は、以下の通りです:

任意の初期化は結果に影響を与える

異なる初期化値を使用すると、グローバルミニマムではなく、局所的な最小値に到達する可能性があります。

たとえば、前述の図で点Aではなく点Bから始めた場合です。

または、青い線が示すように、台地(勾配消失問題)へ収束する場合など、一見は分かりにくい場合もあります。

鞍面上のバニラ勾配降下法。アニメーションは異なる初期化点で異なる結果が生じることを示しています。画像作者提供。</figcaption></figure><h2 id=適切なステップサイズの選択は収束速度と安定性のトレードオフが必要です

ステップサイズまたは学習率と正確な結果を得るために使用するエポック数の間には相互作用があります。

たとえば、以下に示すパラメトリック実験の結果を見てみましょう。これらの画像は、Mike X Cohen氏によるオンラインコース「A Deep Understanding of Deep Learning」から取得したもので、Deep LearningとPyTorchの使用に興味を持つ人に強くお勧めします。科学的なアプローチに従います。

この場合、Mikeは、学習率と学習エポック数を独立して変更した場合の勾配降下法の結果をテストする方法を示しました(異なる値のグリッド上での1つのパラメータの時間的な変更)。これらのパラメータがこの特定のケースにどのように結果に影響を与えるかを見ることができます。

これらの画像は、Mike X Cohen氏によるオンラインコース「A Deep Understanding of Deep Learning」から取得したものです。

関数の真のグローバル最小値は約-1.4です。学習率が小さい場合、その結果に収束するまでにより多くの学習エポックが必要であることがわかります。したがって、より大きな学習率を使用するだけで計算時間を短縮できるかのように思えます。

しかし、実際には、これは単純な収束速度の問題ではありません。

大きなステップサイズは、非常に遅い収束を引き起こしたり、アルゴリズムが収束しない(ずっと最小値の周りを振動する)ことを防いだり、発散の振る舞いを引き起こす可能性があります。

次の図は、異なる学習率が最適化の結果にどのように影響するかを示しています。ただし、アルゴリズムを同じ位置x = 2で初期化した場合です。

異なるステップサイズを使用したf(x)= x2の確率的勾配降下法の例。すべての場合において、アルゴリズムはx = 2で初期化されます。著者による画像で、Saraj Rivalのノートブックからの基本コードを使用しました。

ここでは、大きなステップサイズが収束速度を向上させることが明らかですが、ある程度までです。

学習率を1桁増やすと、アルゴリズムが停滞することがあります。η = 1の場合の結果は、x = 2とx = -2の間を振動していることが左の図の青い水平線で示されています。

いくつかの場合では、大きなステップサイズが実際には結果を無限大に「射出」し、プログラムの数値オーバーフローを引き起こす可能性があります。

一方、小さすぎるステップサイズは非常に遅い収束または収束しない場合があります。

ニューラルネットワークのトレーニングのための勾配降下法

Deep Learningの文脈では、最適化しようとしている関数は損失関数Jです。トレーニングロスは、トレーニングデータセット全体の損失の平均として定義されます:

ただし、Dtrainはトレーニングデータセット中のサンプル数です。

したがって、次のアルゴリズムに基づいて勾配降下法を実装できます。これにより、一定のエポック数の間、トレーニングロスの重みに対する勾配を計算し、モデルの重みを更新します[2]

w = [0, ... ,0]    # 重みを初期化しますfor k = 1,..., num_epochs:       # 必要なイテレーション回数分くり返す  grad = ∇w TrainLoss(w)         # トレーニングロスの勾配   w[k] <-- w[k-1] - η * grad     # モデルの重みを更新します

上記の擬似コードで示される勾配降下法の問題は、速度が遅いことです。

数点と単純な関数のおもちゃの例ではうまく機能するかもしれませんが、ANNを開発し、訓練するために100万のデータポイントがあると想像してください。

勾配降下法を使用してモデルの重みを更新する場合、モデルの重みを1回更新するために訓練データのすべてのサンプルを参照する必要があります。収束するまで、繰り返し行います。エポックあたり1回の重みの更新。

この問題を克服するために、いわゆる確率的勾配降下法(Stochastic Gradient Descent)アルゴリズムを使用することができます。

確率的勾配降下法

「バニラ」勾配降下法の収束が遅い問題を克服するために、訓練セットの各サンプルを基にモデルの重みを更新することができます。利点は、すべてのサンプルをループするまでウェイトを更新する必要がないことです。

トレーニングロスの代わりに個々のサンプルごとに損失関数を使用するため、エポックごとにウェイトを複数回更新することができます。

これが確率的勾配降下法(SGD)アルゴリズムの見た目です。

w = [0, ... ,0]    # ウェイトの初期化for k = 1,..., num_epochs:       for (x, y) ∈ Dtrain:                 grad = ∇w J(x,y,w)                w[k] <--  w[k-1] - η(k) * grad 

ステップサイズはトレーニングのイテレーション回数に依存することに注意してください。アルゴリズムが収束するためには、イテレーション回数が進むにつれてΗが減少する必要があります。MIT 6.036の講義ノート [1]で、次の定理が述べられています。

定理4.1:Jが凸形であり、η(t)が次の条件を満たす場合、SGDは確率1で最適なθに収束する。

人々はトレーニングの進行に応じてηの値を減らすためにさまざまなアプローチを取ります。これはしばしば「アニーリング」と呼ばれます:

  • 学習率をトレーニングエポックに比例して変更する(例:η(t) = 1/t)または特定の学習エポックに到達した後、それをより小さい値に設定する。この方法は良好な結果をもたらしますが、モデルパフォーマンスとは無関係です。これは「学習率の減衰」と呼ばれ、この問題を扱う業界の標準です。
  • 損失関数の勾配に学習率を乗算する:この方法は問題に適応的であるため、良い結果をもたらしますが、注意深いスケーリングが必要です。これは勾配降下のRMSpropやAdamバリエーションに組み込まれています。
  • 損失に学習率を乗算する:利点はこれも問題に適応的であることですが、スケーリングが必要です。

SGDは、データの一部のみを訪問した後でも良好なパフォーマンスを発揮する場合があります。これは比較的大きなデータセットに対して有用です。メモリ使用量を減らし、合計実行時間を「バニラ」勾配降下法の実装と比較して減らすことができます。

「バニラ」実装は、ウェイトを1回更新するために「バッチ」全体を実行する必要があるため、遅いと言えます。SGDは各サンプルで更新を行いますが、更新の品質は低くなります。ノイズのあるデータやANNでフィットさせようとしている非常に複雑な関数があるかもしれません。バッチサイズDtrainを使用することは遅くて正確ですが、サイズ1のバッチは速いですが少し精度が低いです。

その中間には「ミニバッチ」勾配降下法という用語があります。

ミニバッチ勾配降下法

Photo by Sebastian Herrmann on Unsplash

データを同じサイズの小さなバッチに分割すると、それらのミニバッチごとに「バニラ」勾配降下法を実行することができます。

データを100個の小さな部分に分割するとします。データを100ステップで進めることができます。各ステップでは、現在のミニバッチに含まれるデータのトレーニングロスのみを見て、モデルパラメータを改善します。これを繰り返し、再びサイクルを開始するまで続けます。各サイクルはエポックとして知られていますが、最適化中のイテレーション数を指すため、以前は用語をもう少し適用範囲が広い意味で使用していました。

これの利点は、データセット全体を見るのではなく、各ミニバッチでモデルのパラメータを更新することです。私が「バニラ」勾配降下法と呼んでいる手法は、バッチ勾配降下法とも呼ばれ、バッチサイズはトレーニングデータセットの総サンプル数です。ミニバッチ勾配降下法では、ミニバッチのサイズは通常2の累乗です:32サンプル、64、128、256などです。

SGDは、ミニバッチサイズがトレーニングデータセットの1つの例にまで低下した場合の極端なケースです。

最適化プロセスでミニバッチ勾配降下法を使用するデメリットは、変動性のレベルを組み込んでしまうことです。すべてのステップが理想的なパラメータ値に近づくわけではないことが保証されていませんが、一般的な方向性は最小値に向かっています。

この方法は、非常に大きなデータセットを扱う際に、速度と精度の折り合いを選ぶための妥協点を見つけるため、業界の標準の一つです。

お読みいただきありがとうございます!この記事がおもしろく、いくつかの概念をクリアにするのに役立ったことを願っています。また、この記事の執筆時に使用した情報源を共有していますので、より深くてより形式的な資料を参照する場合にご興味があるかもしれません。

次回の投稿では、勾配降下法のより高度な手法(実際のアプリケーションで人々が使用する手法)や、トレーニング中にモデルの重みをどのように更新するかについて、バックプロパゲーションの使用方法について書きます。勾配降下法は全体のストーリーの一部に過ぎません。

その間に、以前の記事(Feedforward Artificial Neural Networksについて)をお読みいただくことに興味があるかもしれません。

Feedforward Artificial Neural Networks

基本的なコンセプトの説明

VoAGI.com

参考文献

[1] MIT Open Learning Library: 6.036 Introduction to Machine Learning. Chapter 6: Gradient Descent

[2] Standford Online: Artificial Intelligence & Machine Learning 4 — Stochastic Gradient Descent | Stanford CS221 (2021)

[3] オンラインコース深層学習の深い理解、Mike X Cohen (sincxpress.com)

[4] Standford Online: CS231 Convolutional Neural Networks for Visual Recognition

元の記事:https://www.makerluis.com、2023年11月4日に公開されました。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more