勾配降下法(GD)は、目的関数を反復的に最小化する最適化アルゴリズムです。機械学習(ML)の文脈において、勾配降下法は教師あり学習モデルのパフォーマンス向上の基礎となります。ニューラル・ネットワークなどの機械学習モデルは複雑で非線形かつ高次元です。そのため、線形回帰とは異なり、最適な重みを計算できる正規方程式は存在しません。代わりに、勾配降下法、ニュートン法、期待最大化などの近似手法を使用できます。
すべてのモデルには損失関数(コスト関数と呼ばれることもあります)があります。この関数は、モデルの予測が真のデータ・ポイントからどの程度離れているかを測定します。これは、モデルの予測がどの程度「間違っているか」を考察する尺度だと考えてください。たとえば、平均二乗誤差は、回帰問題の損失関数として機能することがよくあります。モデルトレーニング・フェーズは、この損失を最小限に抑えるパラメータ値を見つけるように設計されています。このような理由から、勾配降下法がトレーニングでよく使用される最適化手法です。このアルゴリズムは、モデルのパラメーターに関する損失の勾配、つまり傾きを計算します。この勾配では、損失を減らすために逆方向に一歩進みます。学習率(ステップ・サイズまたはアルファとも呼ばれる)はステップのサイズであり、すべてのモデル・パラメーターに対して固定されています。このプロセスを、モデルが最小値に近い収束を達成するまで繰り返します。
収束は、理想的にはグローバル最小値で発生します。次の視覚化では、損失値が直近の周囲領域よりも局所最小値において低いことがわかりますが、全体では必ずしも最も低い値ではありません。大域最小値は、ドメイン全体にわたる損失関数の絶対値が低い値であり、問題に対する最良の解を表します。
学習率が十分に小さくない場合、アルゴリズムは極小値に収束することがよくあります。損失関数を最小化し、大域最小値で収束を達成するには、適切に選択されたレートが不可欠です。
この視覚化は、収束に対する学習率の影響を示しています。学習率が小さいと安定した収束が実現(左)し、学習率が大きいとオーバーシュートや不安定性が生じる可能性があります(右)。
従来の勾配降下法と確率的勾配降下法の主な差別化要因は、SGDが一度に1つのトレーニング例を使用してモデルの重みを更新することです。この例は、反復ごとにランダムに選択されます。1 勾配降下法では、トレーニング・データセット全体を使用して、各パラメーターの更新前に勾配を計算します。このデータ使用量の違いにより、SGDの計算コストが大幅に低く、大規模なデータセットの拡張が容易になっています。あるいは、SGDの収束動作は、GDのノイズよりもノイズが多くなります。これは、1つの例のデータ・ポイントがデータセットを適切に表していない可能性があるためです。この誤った表現により、ポイントはわずかに「間違った」方向に更新されます。ただし、このランダム性により、浅い局所的最小値、つまり鞍点から逃れることができるため、SGDは高速になり、非凸最適化問題に対してより適している場合があります。
厳密に言えば、SGDは当初、一度に1つのトレーニング・サンプルを使用してパラメーターを更新するように定義されました。現代の使用法では、「SGD」という用語は、一度に少量のトレーニング・データを使用するGDのバリエーションである「ミニバッチ勾配降下法」を意味するために大まかに使用されます。単一サンプルではなくデータのサブセットを使用する主な利点は、勾配がミニバッチからの損失の平均に等しいため、ノイズ・レベルが低くなることです。このため、ミニバッチ勾配降下法はディープラーニングのデフォルトとなっています。逆に、厳密なSGDは実際にはほとんど使用されません。これらの用語は、PyTorchやTensorFlowなどのほとんどの機械学習ライブラリーでも混同されており、オプティマイザーは通常ミニバッチを使用するにもかかわらず、「SGD」と呼ばれることがよくあります。
次の図は、トレーニング・データのサンプル・サイズを増やすと、振動と「ノイズ」がどのように減少するかをより明確に示しています。
GDには他にもいくつかのバリエーションがあります。こちらは、基本的な勾配降下法をベースに、速度、安定性、収束性を向上させるメカニズムを追加しています。
一貫した勾配を持つ次元では運動量を蓄積し、勾配が変化する次元では更新を減衰させることで、運動量はSGDの収束を速め、振動を少なくするのに役立ちます。2
AdaGradやRMSPropなどの適応学習率手法は、各パラメーターの学習率を個別に適応させるという点で独自です。このアプローチは、すべてのパラメータに固定された学習率を使用するSGD方法とは対照的です。
AdaGrad(適応勾配アルゴリズム):各パラメータの学習率を過去の勾配に基づいて適応します。頻繁に表示されない機能では学習率が高く、頻繁に表示されない特徴では学習率が低くなります。このアプローチは、低頻度の主要な機能がSGDよりも迅速に学習されることを意味します。この適応学習率は、主要な機能頻度に大きな差異があるスパース・データを扱う自然言語処理(NLP)や推奨システムに最適な手法であることを意味します。2
RMSProp(Root Mean Square Propagation):最近の2乗勾配の移動平均を用いて各パラメータの学習率をスケーリングする、もう1つの適応的学習率最適化手法。過去の勾配の知識は破棄され、現在の勾配の知識のみが保存されます。4学習率は、勾配が小さいパラメーターでは大きく、勾配が大きいパラメーターでは小さくなります。この方法により、AdaGradにおける学習率の低下の問題が解消されます。RMSPropは、特にリカレント・ニューラル・ネットワークなどのモデルにおいて、ディープラーニングでのトレーニングを安定させるのに役立ち、強化学習 など、目的が絶えず変化する問題にも効果的に機能します。
SGDやその他のGDのバリエーションは、トレーニング時間がボトルネックになる場合に有効です。5
| バリアント | ステップごとに使用されるデータ | 主な機能 | 一般的な用途 |
|---|---|---|---|
| GD | すべてのデータ | 安定しているが遅い | 小規模データセット |
| SGD | クラシックSGDの1つのサンプル | ノイズが多いが高速 | オンライン学習 |
| ミニバッチGD | 少数のサンプル | バランスが取れてスケーラブル | ディープラーニング(深層学習) |
| Momentum | バッチ/ミニ・バッチ | 正しい方向に加速 | ニューラル・ネット |
| NAG | バッチ/ミニ・バッチ | 将来を見越したモメンタム | より高速な収束 |
| AdaGrad | ミニ・バッチ | 適応型学習率 | スパース・データ |
| RMSProp | ミニ・バッチ | AdaGrad減衰の修正 | RNN、ディープ・ネット |
| Adam | ミニ・バッチ | モメンタム + RMSProp | 現在選択されているデフォルト |
SGDの目標は、モデルの予測が真の値に可能な限り近づくパラメーターを見つけることです。言い換えれば、損失関数を最小化し、 .
線形回帰の場合、パラメータは (weight)と(bias)です。つまりこの場合、を最小化することは、以下を最小化することと同様です: .
勾配降下法を教える際によく使用される例えは、「GD は谷に届くまで(最小損失)まで山を降りるようなもの」ということです。次の損失関数の勾配を想像してみてください: 上方を指しながら下降するには、反対方向に足を踏み出さなければなりません。
パラメーターの一般的な更新ルールは、以下の通りです:
以下について学習率がであり、かつが損失の勾配である場合: .
SGDは、ランダムに1つ選択されたサンプルのみを使用し、勾配を近似させます:
メモ、小文字は、1つのトレーニング例の損失を表します。一方、大文字は、全体的な損失関数(データセット全体にわたるすべての個別の損失の平均)です。このグローバル・エラーこそ、私たちがトレーニングで最小限に抑えようとしているものです。
SGDを使用した線形回帰の例について最後に見ていきましょう。
1つのサンプルについて、予測は次のとおりです:
局所損失は、1つのサンプルの2乗誤差です。
バックプロパゲーション中に、各パラメータに関する損失関数の勾配を計算するチェーンルールを使用して、モデルのパラメータが更新されます。5勾配(派生)は次のとおりです:
SGDでは、これらの各パラメーターを更新します。および)を更新し、これは以下のルールを使用して行います:
SGDは、データ・セット全体にわたる重い平均勾配を計算する代わりに、軽量のランダム推定を使用します。
機械学習フレームワークを扱う場合、使用できるSGDオプティマイザークラスが組み込まれています。たとえば、
学習のために、PythonにおけるSGDの簡単な実装を最初から順に説明します。
繰り返しになりますが、私たちの目的は、損失関数(予測がどの程度間違っているかの尺度)を最小化する最適なパラメーター(モデルの重み)を見つけることです。一度に1つのサンプルを更新するか、非常に小さいバッチ・サイズで更新します。
まず、パラメータ値(重み)をランダムに初期化します。次に、ランダムなデータ・ポイントを選択できます。そこから、予測と誤差を計算します。このシンプルなデモンストレーションでは、シンプルな線をはめてみましょう:。プロセスの次のステップはバックプロパゲーションです。バックプロパゲーションでは、パラメータに対する損失関数の勾配が計算されます。これらの勾配 (導関数)は、 SGD最適化プロセス中にパラメーターを更新するために使用されます。勾配は損失関数の増加方向を示しているため、SGDはそれぞれの現在のパラメーター値から各勾配を差し引きます。これは、損失関数が減少するために勾配の逆方向に移動することを考察することができます。したがって、確率的勾配降下法における「降下法」となります。一定のエポック数に達するか、損失が許容範囲を下回るまで、これらのステップを繰り返します。後者は、損失がほとんど変わっておらず、目的関数を改善しているわけではないことを意味します。言い換えれば、アルゴリズムが収束すると停止します。
SGDは、ディープ・ニューラル・ネットワークをトレーニングするための最も一般的な最適化手法です。ディープラーニングは、データサイエンスの幅広い分野における機械学習のサブセットであり、その目的はコンピューターが人間の脳の複雑な意思決定のパワーをシミュレートすることです。従来のMLモデルでは、1層または2層で構成される単純なニューラル・ネットワークを使用します。一方、深層学習モデルは3つ以上の層を使用します。通常、モデルをトレーニングするには、数百または数千の層が必要です。SGDは大規模なトレーニングセットに簡単に拡張できるため、ディープ・ニューラル・ネットワークのトレーニングに最適なアプローチとして採用されることがよくあります。SGDトレーニングの他のアプリケーションとしてはリッジ回帰、正規化ロジスティック回帰、線形カーネルを備えたサポートベクターマシン(SVM)で使用されるヒンジ損失関数の最適化などがあります。
SGDは、一度に1つのデータ・サンプルを使用して機械学習モデルの損失関数を最小化するGDのバリエーションです。このアプローチは、勾配を計算するために各ステップでのデータセット全体に依存するGDとは異なります。他にもいくつかのGDバリエーションがあり、勢いに基づく学習法または適応型学習法としてグループ化できます。運動量勾配降下法とネステロフ加速勾配は前者の例です。これらの方法では、一貫した勾配で次元に蓄積された運動量を活用し、変化する勾配で次元の更新を抑制します。そのため、SGDはより迅速に、より少ない振動で収束できます。AdaGradやRMSPropなどの適応学習率手法は、固定学習率を使用する従来のSGDとは異なり、各パラメーターの学習率を個別に適応させます。さらに、Adamのようなハイブリッド方式は、勢いベースのGDとRMSPropの強みを組み合わせることで、強力な代替手段を提供します。
AI開発者向けの次世代エンタープライズ・スタジオであるIBM watsonx.aiを使用して、生成AI、基盤モデル、機械学習機能をトレーニング、検証、チューニング、導入しましょう。わずかなデータとわずかな時間でAIアプリケーションを構築できます。
業界をリードするIBMのAI専門知識とソリューション製品群を使用すれば、ビジネスにAIを活用できます。
AIの導入で重要なワークフローと業務を再構築し、エクスペリエンス、リアルタイムの意思決定とビジネス価値を最大化します。
1 Bottou, L. (2010). Large-Scale Machine Learning with Stochastic Gradient Descent. Lechevallier, Y., Saporta, G. (eds) Proceedings of COMPSTAT’2010. Physica-Verlag HD.
2 Ruder, S. (2016). An overview of gradient descent optimization algorithms.
3 Tian, Y., Zhang, Y., & Zhang, H. (2023). Recent Advances in Stochastic Gradient Descent in Deep Learning. Mathematics, 11(3), 682.
4 Haji, S. H., & Abdulazeez, A. M. (2021). Comparison of optimization techniques based on gradient descent algorithm: A review. PalArch’s Journal of Archaeology of Egypt/Egyptology, 18(4), 2715-2743.
5 Bottou, L. (2012). Stochastic Gradient Descent Tricks. Montavon, G., Orr, G.B., Müller, KR. (eds) Neural Networks: Tricks of the Trade. Lecture Notes in Computer Science, vol 7700. Springer, Berlin, Heidelberg.