【初心者向け】確率的勾配降下法(SGD)とは?仕組み・特徴・活用例までやさしく解説!
機械学習やディープラーニングの学習アルゴリズムでよく登場するのが、**確率的勾配降下法(Stochastic Gradient Descent, SGD)**です。
名前は少し難しそうに見えますが、実は非常にシンプルかつ効果的な最適化手法なんです✨
この記事では、SGDの基本から数式、通常の勾配降下法との違い、そして実際の活用例までをわかりやすく解説します📘
確率的勾配降下法(SGD)とは?
SGDは、最適化問題を解くための反復的なアルゴリズムです。
特に機械学習モデルの損失関数(Loss Function)を最小化するために使われます。
θ=θ−η⋅∇L(θ)\theta = \theta - \eta \cdot \nabla L(\theta)
この式が基本形ですが、通常の勾配降下法(Batch Gradient Descent)との違いは「データの使い方」にあります。
通常の勾配降下法 vs 確率的勾配降下法
種類 | 特徴 | メリット | デメリット |
---|---|---|---|
通常(Batch) | 全データを使って1回更新 | 安定した収束 | 計算コスト大 |
確率的(SGD) | 1データごとに更新 | 高速・リアルタイム対応 | ノイズが多く振動しやすい |
SGDでは、毎回ランダムに1つのサンプルを選び、それに基づいてパラメータを更新していきます🔁
この「確率的」な部分が、収束を早める一方で振動しやすくなる原因にもなります。
なぜSGDが使われるのか?💡
✅ 大規模データに強い!
全データを使わずに更新するので、計算が軽くて高速です🚀
✅ オンライン学習に向いている!
1データごとの処理が可能なので、リアルタイム処理にも使えます📈
✅ ローカルミニマムを避けやすい!
ランダム性のおかげで、局所解にハマるリスクが減ります。
実際の更新式(例)
SGDでは以下のように、毎回異なるサンプルxix_iで更新を行います:
θt+1=θt−η⋅∇L(θt;xi)\theta_{t+1} = \theta_t - \eta \cdot \nabla L(\theta_t; x_i)
-
θ\theta:パラメータ
-
η\eta:学習率(learning rate)
-
xix_i:ランダムに選ばれたデータ点
-
∇L\nabla L:損失関数の勾配
SGDの改良版:Mini-Batch SGD
SGDの「ノイズが多い」という欠点を補うのがミニバッチSGDです。
これは、少数(例:32個など)のデータを1つのバッチとして更新する方法。
-
通常のSGDよりも安定して
-
バッチ法よりも高速
というバランスの良い手法として、実務でもよく使われています✨
PythonでのSGD(例:PyTorch)
import torch
import torch.nn as nn
import torch.optim as optim
model = nn.Linear(10, 1)
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
for x, y in dataloader:
optimizer.zero_grad()
outputs = model(x)
loss = criterion(outputs, y)
loss.backward()
optimizer.step()
上記のように、optimizer.step()
のたびに1バッチ分のSGDが行われています。
よくある課題と対処法
🔹 学習率が大きすぎる → 振動して収束しない
→ 学習率を徐々に下げる「学習率スケジューラ」がおすすめ📉
🔹 ロスが下がらない → 局所解?
→ モメンタムやAdamなどの改良アルゴリズムを検討!
まとめ🌟
-
SGDは、データ1件ずつパラメータを更新する効率的な手法
-
大規模データやリアルタイム処理に最適
-
学習率やミニバッチの工夫でさらに性能UP!
機械学習における最重要アルゴリズムの1つなので、しっかり理解しておくと後々とても役立ちます💪
さらに知りたい方には、以下の発展記事もおすすめです👇
-
SGDとAdamの違い
-
学習率スケジューリングの具体例
-
PyTorchでの最適化アルゴリズム比較
ご希望があれば、それらのブログも作成可能です📘お気軽にどうぞ!