最適化アルゴリズム

SGD(確率的勾配降下法) えすじーでぃー(かくりつてきこうばいこうかほう)

SGD確率的勾配降下法最適化勾配降下法損失関数ニューラルネットワーク
SGD(確率的勾配降下法)について教えて

簡単に言うとこんな感じ!

山の中を下って最低地点を目指す登山家を想像して。SGDは「ランダムに選んだ1〜数個のデータを使って少しずつ坂を下る」方法だよ。全部のデータを使う普通の勾配降下法より速くて、でもちょっとブレながら進む感じ!


SGD(確率的勾配降下法)とは

SGD(Stochastic Gradient Descent:確率的勾配降下法) は、ニューラルネットワーク損失関数を最小化するための最適化アルゴリズムです。ランダムにサンプリングしたデータを使って勾配(傾き)を計算し、パラメータを少しずつ更新します。

通常の勾配降下法がすべての学習データを使って1回更新するのに対し、SGDは一部(1件またはミニバッチ)のデータで更新を繰り返すため、大規模データセットでも高速に学習できます。ランダム性があるため局所最適解から抜け出しやすいという利点もあります。

更新式はシンプルで θ ← θ - η∇L(θ) と表されます。ここでηは学習率と呼ばれる更新幅を決めるハイパーパラメータです。


SGDの仕組み

ステップ内容
1. データサンプリング全学習データからランダムに1件(またはミニバッチ)を選ぶ
2. 損失計算選んだデータで損失関数の値を計算
3. 勾配計算損失関数の各パラメータに対する偏微分(勾配)を計算
4. パラメータ更新勾配の逆方向に学習率分だけパラメータを動かす
5. 繰り返し収束するまで1〜4を繰り返す
# SGDの疑似コード
learning_rate = 0.01
for epoch in range(num_epochs):
    for x_batch, y_batch in dataloader:  # ランダムサンプリング
        loss = model(x_batch, y_batch)   # 損失計算
        loss.backward()                  # 勾配計算(バックプロパゲーション)
        for param in model.parameters():
            param -= learning_rate * param.grad  # パラメータ更新

歴史と背景

  • 1951年:Herbert Robbinsらが確率的近似法を提案(SGDの原型)
  • 1980年代バックプロパゲーションの普及とともにSGDがニューラルネットの学習に使われ始める
  • 2012年AlexNetのImageNet優勝でSGD+モメンタムの有効性が広く知られる
  • 現在Adamなど改良版が主流だが、大規模言語モデルでもSGD系が使われる場面が多い

各勾配降下法の比較

手法1回の更新に使うデータ特徴
バッチ勾配降下法全データ安定だが遅い
SGD1件速いがノイジー
ミニバッチSGD数十〜数百件バランスが良く最もよく使われる
SGD+モメンタムミニバッチ慣性を加えて振動を抑制

関連用語