確率的勾配降下法とは

著者

Anna Gutowska

AI Engineer, Developer Advocate

IBM

確率的勾配降下法とは

確率的勾配降下法(SGD)は、機械学習モデルの性能を向上させるために一般的に使用される最適化アルゴリズムです。これは従来の勾配降下アルゴリズムの派生ですが、重要な変更点が1つあります。各ステップで勾配を計算するためにデータセット全体に依存するのではなく、SGDでは一度に1つのデータ・サンプルを使用します。

勾配降下法

勾配降下法(GD)は、目的関数を反復的に最小化する最適化アルゴリズムです。機械学習(ML)の文脈において、勾配降下法は教師あり学習モデルのパフォーマンス向上の基礎となります。ニューラル・ネットワークなどの機械学習モデルは複雑で非線形かつ高次元です。そのため、線形回帰とは異なり、最適な重みを計算できる正規方程式は存在しません。代わりに、勾配降下法、ニュートン法、期待最大化などの近似手法を使用できます。

すべてのモデルには損失関数(コスト関数と呼ばれることもあります)があります。この関数は、モデルの予測が真のデータ・ポイントからどの程度離れているかを測定します。これは、モデルの予測がどの程度「間違っているか」を考察する尺度だと考えてください。たとえば、平均二乗誤差は、回帰問題の損失関数として機能することがよくあります。モデルトレーニング・フェーズは、この損失を最小限に抑えるパラメータ値を見つけるように設計されています。このような理由から、勾配降下法がトレーニングでよく使用される最適化手法です。このアルゴリズムは、モデルのパラメーターに関する損失の勾配、つまり傾きを計算します。この勾配では、損失を減らすために逆方向に一歩進みます。学習率(ステップ・サイズまたはアルファとも呼ばれる)はステップのサイズであり、すべてのモデル・パラメーターに対して固定されています。このプロセスを、モデルが最小値に近い収束を達成するまで繰り返します。

収束のグラフィック表示 収束のグラフィック表示

収束は、理想的にはグローバル最小値で発生します。次の視覚化では、損失値が直近の周囲領域よりも局所最小値において低いことがわかりますが、全体では必ずしも最も低い値ではありません。大域最小値は、ドメイン全体にわたる損失関数の絶対値が低い値であり、問題に対する最良の解を表します。

3次元空間における局所最小値とグローバル最小値 3次元空間における局所最小値とグローバル最小値

学習率が十分に小さくない場合、アルゴリズムは極小値に収束することがよくあります。損失関数を最小化し、大域最小値で収束を達成するには、適切に選択されたレートが不可欠です。

学習率が収束する効果 学習率が収束する効果

この視覚化は、収束に対する学習率の影響を示しています。学習率が小さいと安定した収束が実現(左)し、学習率が大きいとオーバーシュートや不安定性が生じる可能性があります(右)。

GDからSGDへ

従来の勾配降下法と確率的勾配降下法の主な差別化要因は、SGDが一度に1つのトレーニング例を使用してモデルの重みを更新することです。この例は、反復ごとにランダムに選択されます。1 勾配降下法では、トレーニング・データセット全体を使用して、各パラメーターの更新前に勾配を計算します。このデータ使用量の違いにより、SGDの計算コストが大幅に低く、大規模なデータセットの拡張が容易になっています。あるいは、SGDの収束動作は、GDのノイズよりもノイズが多くなります。これは、1つの例のデータ・ポイントがデータセットを適切に表していない可能性があるためです。この誤った表現により、ポイントはわずかに「間違った」方向に更新されます。ただし、このランダム性により、浅い局所的最小値、つまり鞍点から逃れることができるため、SGDは高速になり、非凸最適化問題に対してより適している場合があります。

厳密に言えば、SGDは当初、一度に1つのトレーニング・サンプルを使用してパラメーターを更新するように定義されました。現代の使用法では、「SGD」という用語は、一度に少量のトレーニング・データを使用するGDのバリエーションである「ミニバッチ勾配降下法」を意味するために大まかに使用されます。単一サンプルではなくデータのサブセットを使用する主な利点は、勾配がミニバッチからの損失の平均に等しいため、ノイズ・レベルが低くなることです。このため、ミニバッチ勾配降下法はディープラーニングのデフォルトとなっています。逆に、厳密なSGDは実際にはほとんど使用されません。これらの用語は、PyTorchやTensorFlowなどのほとんどの機械学習ライブラリーでも混同されており、オプティマイザーは通常ミニバッチを使用するにもかかわらず、「SGD」と呼ばれることがよくあります。

次の図は、トレーニング・データのサンプル・サイズを増やすと、振動と「ノイズ」がどのように減少するかをより明確に示しています。

勾配降下法のバリアント

GDには他にもいくつかのバリエーションがあります。こちらは、基本的な勾配降下法をベースに、速度、安定性、収束性を向上させるメカニズムを追加しています。

モメンタムベースの方法:

一貫した勾配を持つ次元では運動量を蓄積し、勾配が変化する次元では更新を減衰させることで、運動量はSGDの収束を速め、振動を少なくするのに役立ちます。2

モメンタムを実行するSGDおよび実行しないSGD
  • 運動量勾配降下:「速度」項を取り入れ、過去の勾配の平均をとり、最近の勾配をより重要視します。このアプローチにより、ジグザグ(振動)が減少し、アルゴリズムが正しい方向に速く動きます。

  • NAG(ネステロフ加速勾配):勾配を計算する前にパラメータがどこに向かうかを「先読み」することで、収束を早め滑らかにする改良された運動量法。つまり、将来の勾配を予測し、その情報を現在の更新ステップに反映させます。3

適応型学習レート法:

AdaGradやRMSPropなどの適応学習率手法は、各パラメーターの学習率を個別に適応させるという点で独自です。このアプローチは、すべてのパラメータに固定された学習率を使用するSGD方法とは対照的です。

  • AdaGrad(適応勾配アルゴリズム):各パラメータの学習率を過去の勾配に基づいて適応します。頻繁に表示されない機能では学習率が高く、頻繁に表示されない特徴では学習率が低くなります。このアプローチは、低頻度の主要な機能がSGDよりも迅速に学習されることを意味します。この適応学習率は、主要な機能頻度に大きな差異があるスパース・データを扱う自然言語処理(NLP)や推奨システムに最適な手法であることを意味します。2

  • RMSProp(Root Mean Square Propagation):最近の2乗勾配の移動平均を用いて各パラメータの学習率をスケーリングする、もう1つの適応的学習率最適化手法。過去の勾配の知識は破棄され、現在の勾配の知識のみが保存されます。4学習率は、勾配が小さいパラメーターでは大きく、勾配が大きいパラメーターでは小さくなります。この方法により、AdaGradにおける学習率の低下の問題が解消されます。RMSPropは、特にリカレント・ニューラル・ネットワークなどのモデルにおいて、ディープラーニングでのトレーニングを安定させるのに役立ち、強化学習 など、目的が絶えず変化する問題にも効果的に機能します。

ハイブリッド方式:

  • Adam(適応型モーメント推定):過去の勾配と二乗勾配の平均の両方を追跡することにより、勢いベースのGDとRMSPropを組み合わせます。4この組み合わせにより、ノイズが多く、スパースなデータセットであっても、迅速な収束率が実現します。3さらに、多くのフレームワークでは、学習率0.001などのデフォルトのハイパーパラメータがすぐに適切に機能します。しかし、非常に大規模なデータセットの場合、勢いのあるSGDがより良い一般化につながる可能性があります。Adamのパラメーターごとの積極的な調整は、トレーニング・データの過剰適合や、あまり一般化されない厳密最小値にします。

SGDやその他のGDのバリエーションは、トレーニング時間がボトルネックになる場合に有効です。5

バリアントステップごとに使用されるデータ主な機能一般的な用途
GDすべてのデータ安定しているが遅い小規模データセット
SGDクラシックSGDの1つのサンプルノイズが多いが高速オンライン学習
ミニバッチGD少数のサンプルバランスが取れてスケーラブルディープラーニング(深層学習)
Momentumバッチ/ミニ・バッチ正しい方向に加速ニューラル・ネット
NAGバッチ/ミニ・バッチ将来を見越したモメンタムより高速な収束
AdaGradミニ・バッチ適応型学習率スパース・データ
RMSPropミニ・バッチAdaGrad減衰の修正RNN、ディープ・ネット
Adamミニ・バッチモメンタム + RMSProp現在選択されているデフォルト

数学的理解を深める

SGDの目標は、θモデルの予測が真の値に可能な限り近づくパラメーターを見つけることですy。言い換えれば、損失関数を最小化し、L(θ) .

線形回帰の場合、パラメータはw (weight)とb(bias)です。つまりこの場合、L(θ)を最小化することは、以下を最小化することと同様です:L(w,b) .

 yi^=w·xi+b

L(w,b)=1ni=1n(yi-yi^)2

勾配降下法を教える際によく使用される例えは、「GD は谷に届くまで(最小損失)まで山を降りるようなもの」ということです。次の損失関数の勾配を想像してみてください: L上方を指しながら下降するには、反対方向に足を踏み出さなければなりません。

パラメーターの一般的な更新ルールθは、以下の通りです:

θ:=θ-η·θL(θ)

以下について学習率がηであり、かつθL(θ)が損失の勾配である場合:θ .

SGDは、ランダムに1つ選択されたサンプル(xi,yi)のみを使用し、勾配を近似させます:

θL(θ)θ(xi,yi;θ)

メモ、小文字(xi,yi;θ)は、1つのトレーニング例の損失を表します。一方、大文字L(θ)は、全体的な損失関数(データセット全体にわたるすべての個別の損失の平均)です。このグローバル・エラーこそ、私たちがトレーニングで最小限に抑えようとしているものです。

例:SGDを使用した線形回帰

SGDを使用した線形回帰の例について最後に見ていきましょう。

1つのサンプル(xi,yi)について、予測は次のとおりです:

 yi^=w·xi+b

局所損失は、1つのサンプルの2乗誤差です。

 (xi,yi;w,b)=(yi-(wxi+b))2

バックプロパゲーション中に、各パラメータに関する損失関数の勾配を計算するチェーンルールを使用して、モデルのパラメータが更新されます。5勾配(派生)は次のとおりです:

 w=-2xi(yi-(wxi+b))

 b=-2(yi-(wxi+b))

SGDでは、これらの各パラメーターを更新します。wおよびb)を更新し、これは以下のルールを使用して行います:

 w:=w-η·(-2xi(yi-(wxi+b)))

 b:=b-η·(-2(yi-(wxi+b)))

SGDは、データ・セット全体にわたる重い平均勾配を計算する代わりに、軽量のランダム推定を使用します。

SGDのシンプルなPython実装

機械学習フレームワークを扱う場合、使用できるSGDオプティマイザークラスが組み込まれています。たとえば、torch.optim.SGDPyTorchの場合で、tf.keras.optimizers.SGD がTensorFlow内に構築されているKerasの場合で、SGDRegressorScikit-learnの場合です。

学習のために、PythonにおけるSGDの簡単な実装を最初から順に説明します。

繰り返しになりますが、私たちの目的は、損失関数(予測がどの程度間違っているかの尺度)を最小化する最適なパラメーター(モデルの重み)を見つけることです。一度に1つのサンプルを更新するか、非常に小さいバッチ・サイズで更新します。

まず、パラメータ値(重み)をランダムに初期化します。次に、ランダムなデータ・ポイント(x,y)を選択できます。そこから、予測と誤差を計算します。このシンプルなデモンストレーションでは、シンプルな線をはめてみましょう:y=mx+b。プロセスの次のステップはバックプロパゲーションです。バックプロパゲーションでは、パラメータに対する損失関数の勾配が計算されます。これらの勾配 (導関数)は、 SGD最適化プロセス中にパラメーターを更新するために使用されます。勾配は損失関数の増加方向を示しているため、SGDはそれぞれの現在のパラメーター値から各勾配を差し引きます。これは、損失関数が減少するために勾配の逆方向に移動することを考察することができます。したがって、確率的勾配降下法における「降下法」となります。一定のエポック数に達するか、損失が許容範囲を下回るまで、これらのステップを繰り返します。後者は、損失がほとんど変わっておらず、目的関数を改善しているわけではないことを意味します。言い換えれば、アルゴリズムが収束すると停止します。

import numpy as np 
 
def stochastic_gradient_descent(X, y, lr=0.01, epochs=100, tol=1e-6): 
    “”” 
    Perform Stochastic Gradient Descent (SGD) to fit a line y = w*x + b 
     
    Parameters: 
        X (ndarray): Input features 
        y (ndarray): Target values 
        lr (float): Learning rate (step size for updates) 
        epochs (int): Number of iterations through the dataset 
     
    Returns: 
        w (float): Learned weight 
        b (float): Learned bias 
    “”” 
    # Initialize parameters randomly 
    w = np.random.randn() 
    b = np.random.randn() 
     
    n = len(X) 
 
    prev_loss = float(‘inf’) 
     
    for epoch in range(epochs): 
        # Shuffle the data for each epoch 
        indices = np.arange(n) 
        np.random.shuffle(indices) 
         
        for i in indices: 
            xi = X[i] 
            yi = y[i] 
             
            # Prediction 
            y_pred = w * xi + b 
             
            # Compute gradients (derivatives) 
            dw = -2 * xi * (yi - y_pred)   # derivative wrt w 
            db = -2 * (yi - y_pred)        # derivative wrt b 
             
            # Update parameters 
            w -= lr * dw 
            b -= lr * db 
         
        
        # Compute loss at the end of the epoch 
        loss = np.mean((y - (w*X + b))**2) 
         
        # Check stopping condition 
        if abs(prev_loss - loss) < tol: 
            print(f”Stopped early at epoch {epoch+1}”) 
            break 
                 
        prev_loss = loss 
             
    return w, b

SGDの応用

SGDは、ディープ・ニューラル・ネットワークをトレーニングするための最も一般的な最適化手法です。ディープラーニングは、データサイエンスの幅広い分野における機械学習のサブセットであり、その目的はコンピューターが人間の脳の複雑な意思決定のパワーをシミュレートすることです。従来のMLモデルでは、1層または2層で構成される単純なニューラル・ネットワークを使用します。一方、深層学習モデルは3つ以上の層を使用します。通常、モデルをトレーニングするには、数百または数千の層が必要です。SGDは大規模なトレーニングセットに簡単に拡張できるため、ディープ・ニューラル・ネットワークのトレーニングに最適なアプローチとして採用されることがよくあります。SGDトレーニングの他のアプリケーションとしてはリッジ回帰、正規化ロジスティック回帰、線形カーネルを備えたサポートベクターマシン(SVM)で使用されるヒンジ損失関数の最適化などがあります。

まとめ

SGDは、一度に1つのデータ・サンプルを使用して機械学習モデルの損失関数を最小化するGDのバリエーションです。このアプローチは、勾配を計算するために各ステップでのデータセット全体に依存するGDとは異なります。他にもいくつかのGDバリエーションがあり、勢いに基づく学習法または適応型学習法としてグループ化できます。運動量勾配降下法とネステロフ加速勾配は前者の例です。これらの方法では、一貫した勾配で次元に蓄積された運動量を活用し、変化する勾配で次元の更新を抑制します。そのため、SGDはより迅速に、より少ない振動で収束できます。AdaGradやRMSPropなどの適応学習率手法は、固定学習率を使用する従来のSGDとは異なり、各パラメーターの学習率を個別に適応させます。さらに、Adamのようなハイブリッド方式は、勢いベースのGDとRMSPropの強みを組み合わせることで、強力な代替手段を提供します。

関連ソリューション
IBM watsonx.ai

AI開発者向けの次世代エンタープライズ・スタジオであるIBM watsonx.aiを使用して、生成AI、基盤モデル、機械学習機能をトレーニング、検証、チューニング、導入しましょう。わずかなデータとわずかな時間でAIアプリケーションを構築できます。

watsonx.aiをご覧ください。
人工知能ソリューション

業界をリードするIBMのAI専門知識とソリューション製品群を使用すれば、ビジネスにAIを活用できます。

AIソリューションはこちら
AIコンサルティングとサービス

AIの導入で重要なワークフローと業務を再構築し、エクスペリエンス、リアルタイムの意思決定とビジネス価値を最大化します。

AIサービスはこちら
次のステップ

AI開発ライフサイクル全体にわたる機能にワンストップでアクセスできます。使いやすいインターフェース、ワークフロー、業界標準のAPIやSDKを利用して、強力なAIソリューションを構築できます。

watsonx.aiの詳細はこちら デモを予約
脚注

Bottou, L. (2010). Large-Scale Machine Learning with Stochastic Gradient DescentLechevallier, Y., Saporta, G. (eds) Proceedings of COMPSTAT’2010. Physica-Verlag HD. 

Ruder, S. (2016). An overview of gradient descent optimization algorithms

Tian, Y., Zhang, Y., & Zhang, H. (2023). Recent Advances in Stochastic Gradient Descent in Deep LearningMathematics, 11(3), 682. 

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.

Bottou, L. (2012). Stochastic Gradient Descent TricksMontavon, G., Orr, G.B., Müller, KR. (eds) Neural Networks: Tricks of the Trade. Lecture Notes in Computer Science, vol 7700. Springer, Berlin, Heidelberg.