勾配降下法 ── 勾配を使って損失を最小化する手法
深層学習の心臓部。 線形回帰、 ロジスティック回帰、 ニューラルネットすべてのパラメータ最適化はこれが基本。
山下りの比喩:
歩幅 = 学習率。 大き過ぎると崖を越えて反対側に行く、 小さ過ぎると永遠に着かない。
1次元の例:$L(\theta) = (\theta - 3)^2$
最小限のスニペットで動作確認できる例。 公的データ(SSDSE 等)を想定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import numpy as np # シンプルな勾配降下 def gd(theta=0.0, lr=0.2, n_steps=20): for _ in range(n_steps): grad = 2 * (theta - 3) theta -= lr * grad return theta print(gd()) # 約 3.0 # PyTorch の SGD import torch theta = torch.zeros(1, requires_grad=True) optim = torch.optim.SGD([theta], lr=0.2) for _ in range(20): loss = (theta - 3) ** 2 optim.zero_grad(); loss.backward(); optim.step() print(theta.item()) |
| 名前 | 特徴 |
|---|---|
| SGD | 素朴。 学習率調整が肝 |
| Momentum | 慣性で停滞回避 |
| Nesterov | 先読み付き慣性 |
| AdaGrad | 頻度の低い特徴を強調 |
| RMSProp | AdaGradの忘却付き |
| Adam | Momentum+RMSProp、 標準 |
| AdamW | Adam + 重み減衰の分離 |
| Lion | 2023年。 メモリ効率良い |
| 名前 | 特徴 |
|---|---|
| SGD | 素朴。 学習率調整が肝 |
| Momentum | 慣性で停滞回避 |
| Nesterov | 先読み付き慣性 |
| AdaGrad | 頻度の低い特徴を強調 |
| RMSProp | AdaGradの忘却付き |
| Adam | Momentum+RMSProp、 標準 |
| AdamW | Adam + 重み減衰の分離 |
| Lion | 2023年。 メモリ効率良い |
この用語『勾配降下法』を理解するうえで併せて押さえたい関連キーワード群です。 クリック(ホバー)で関連用語ページに飛べます。
勾配降下法は『目的関数 $L(\theta)$ を最小化するため、 $\theta$ を勾配 $\nabla L$ の逆方向に少しずつ動かす』最適化アルゴリズム。 機械学習の学習はほぼすべてこの方法か、 その発展形(SGD, Adam, AdamW 等)で行われる。 一度に全データを使う Batch GD、 ランダム 1 サンプルの SGD、 中間の Mini-batch GD があり、 後者が深層学習の標準。
勾配降下法(Gradient Descent)は単独で覚えるものではなく、 最適化 という大きな枠組みの中での位置づけを理解することで応用範囲が広がります。 本ページの『🌐 関連手法』『🔗 関連用語』『📚 グループ教材』を順に辿ると、 関連概念のネットワークが見えてきます。
特に SSDSE-B のような実データに当てはめてみると、 教科書では抽象的に語られる概念が『47 都道府県の現実』に紐付き、 数字の意味が腑に落ちやすくなります。 次の『🧮 実値で計算してみる』セクションでは、 公開統計データを使って手を動かす例を紹介します。
都道府県データで線形回帰モデル『就業者数 = w × 人口 + b』を勾配降下で学習。 SSDSE-B の人口(A1101)と就業者数(C3301)を使い、 ミニバッチ(10 県ずつ)で w, b を更新していく。
| 項目 | 条件 / 入力 | 結果 / 解釈 |
|---|---|---|
| 学習率 α=0.001 | 10 epoch | loss 0.85 → 0.41 |
| 学習率 α=0.01 | 10 epoch | loss 0.85 → 0.12 |
| 学習率 α=0.1 | 10 epoch | loss 0.85 → 発散 |
| Momentum β=0.9 | α=0.01 | より速い収束 |
| Adam α=0.001 | デフォルト | ロバスト |
| SGD + warmup | 5 epoch warmup | 学習安定 |
※ 数値は SSDSE-B-2026.csv から抽出した実値、 もしくは典型的な学習設定での目安値です。 細部の数値は前処理・乱数 seed・実装により変動します。
公的データ SSDSE-B(47 都道府県社会・人口統計)を読み込み、 勾配降下法 を実際に動かす最小コードです。 引数のパスは平易さ優先で直書きしています。
import pandas as pd
import numpy as np
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', header=1, encoding='utf-8')
X = df[['A1101', 'A4101']].astype(float).values
y = df['C3301'].astype(float).values
# 正規化
X = (X - X.mean(0)) / X.std(0)
y = (y - y.mean()) / y.std()
w = np.zeros(2)
b = 0.0
lr = 0.01
for ep in range(300):
pred = X @ w + b
err = pred - y
grad_w = 2 * X.T @ err / len(y)
grad_b = 2 * err.mean()
w -= lr * grad_w
b -= lr * grad_b
if ep % 50 == 0:
print(f'ep {ep}: loss={(err**2).mean():.4f}')
print('最終 w:', w, 'b:', b)
※ 上記スニペットは Python 3.10+ / pandas 2.x / numpy / scikit-learn を想定。 環境構築は『conda create -n ds python=3.11 pandas scikit-learn matplotlib』で十分です。
勾配降下法。 $\eta$ は学習率、 $L$ は損失関数。
数式の各記号が『何の量で、 どの空間に住み、 どんな単位を持つか』を意識すると、 暗記でなく構造として理解できます。 SSDSE-B の都道府県データに当てはめて、 各シンボルが何に対応するかを上の Python 実装で確認しましょう。
まずは本ページの『💡 30 秒で分かる結論』と『🎨 直感で掴む』で全体像を掴み、 次に『🧮 実値で計算してみる』を 手を動かして追体験するのが最短です。 数式や深い理論はその後で十分。
本ページの『🌐 関連手法・派生』『🔗 関連用語』で対比される手法を確認し、 それぞれの適用条件と得意・不得意を表で比較するのが効果的です。 SSDSE-B のような共通データセットで両方走らせて結果を見ると違いが体感できます。
サンプル数 n、 特徴次元 d、 反復回数 T のどれに対して、 計算量が線形 / 二乗 / 指数のどれかを必ず把握してください。 47 都道府県(n=47)程度では問題にならなくても、 n=10^6 ではメモリや時間で破綻することがよくあります。
『点推定値』だけでなく『不確実性(CI、 SE、 分散)』『前提条件のチェック結果』『代替手法との比較』『データ取得日と seed』をセットで報告するのが標準。 査読・レビューで問われる典型ポイントです。
『勾配降下法』は『最適化』カテゴリに属する重要概念で、 以下の関連概念群と密接につながっています。
最適化
├── 前提
│ └── 数学・統計の基礎
├── 勾配降下法 ← このページ
│ ├── 派生 1
│ ├── 派生 2
│ └── 応用
└── 並列・対比される手法
├── 別アプローチ A
└── 別アプローチ B
完全な概念マップは 🗺 概念マップ で確認できます。
Cauchy (1847) の最急降下法に起源。 ニューラルネットでは Rosenblatt (1958), Rumelhart (1986) で確立。 SGD (Robbins-Monro 1951), Momentum (Polyak 1964), AdaGrad (Duchi 2011), RMSProp (Tieleman 2012), Adam (Kingma 2014) と派生多数。 近年は LION (2023) など二次情報を擬似的に使う手法も。
『誰が、 いつ、 何のために提唱したか』を知ると、 用語が単なる記号ではなく 研究者たちの努力と発見の連鎖 として血の通った概念になります。 関連論文の原典に当たることで、 教科書では削られた『なぜそうしたか』のニュアンスが分かります。