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回の更新に使うデータ | 特徴 |
|---|---|---|
| バッチ勾配降下法 | 全データ | 安定だが遅い |
| SGD | 1件 | 速いがノイジー |
| ミニバッチSGD | 数十〜数百件 | バランスが良く最もよく使われる |
| SGD+モメンタム | ミニバッチ | 慣性を加えて振動を抑制 |
関連用語
- Adam — SGDを改良した適応的学習率最適化アルゴリズム
- ミニバッチ学習 — SGDで使われるデータの分割方法
- 学習率スケジューリング — 学習率を動的に変える技法
- 勾配消失 / 勾配爆発 — SGD学習時に起きる問題
- 勾配クリッピング — 勾配爆発への対処法