勾配降下法 -- 最も急な方向に沿って山を下りる
この章では勾配降下法をゼロから実装し、それを使って線形回帰にフィッティングします。これがAIトレーニングループ全体の数学的原型です。
概念解析
核心公式
\[ \theta_{t+1} = \theta_t - \eta \nabla J(\theta_t) \]トレーニングの4ステップループ
順伝播
予測出力
損失の計算
差の測定
勾配の計算
逆伝播
パラメータの更新
θ -= η·∇J
学習率の影響
| 学習率 | 効果 |
|---|---|
| 小さすぎる | 収束が極めて遅く、多くのステップが必要 |
| 適度 | 安定して速く収束する |
| 大きすぎる | 振動したり発散したりする |
生活での例
濃霧の中で山を下りる
手のひらも見えないほどの濃霧の日、あなたは山を下りなければならない。一歩ごとの戦略:
足元の最も急な方向を感じる → 最も急な下り坂の方向に小さく一歩進む → 止まる → 再び感じる → また小さく一歩進む → 繰り返す。
これが勾配降下法です:感じる = 勾配を計算する、小さく一歩進む = パラメータ更新、止まる = 次の反復。
Python で実践
実例
# 生成数据 y = 3x + 2 + noise
np.random.seed(42)
X = np.linspace(0, 10, 100)
y = 3 * X + 2 + np.random.normal(0, 2, 100)
# ゼロから勾配降下法を実装する
w, b = 0.0, 0.0
lr, n_iter = 0.01, 200
losses = []
for i in range(n_iter):
y_pred = w * X + b
loss = np.mean((y_pred - y) ** 2)
losses.append(loss)
# 梯度
dw = 2 * np.mean((y_pred - y) * X)
db = 2 * np.mean(y_pred - y)
# 更新
w -= lr * dw
b -= lr * db
print(f"サンプル 梯度下降结果:")
print(f"真实: w=3.0, b=2.0")
print(f"拟合: w={w:.4f}, b={b:.4f}")
print(f"初始损失: {losses)
サンプル 梯度下降结果: 真实: w=3.0, b=2.0 拟合: w=2.9874, b=2.2835 初始损失: 79.69 → 最终损失: 3.91
損失下降曲線
AI での応用シーン
PyTorch トレーニングループの数学的原型
すべてのディープラーニングのトレーニングループは同じパターンに従います。そのパターンとは勾配降下法です:
① optimizer.zero_grad() → 勾配キャッシュをゼロにする;② loss = model(x) → 順伝播;③ loss.backward() → 逆伝播で勾配を計算;④ optimizer.step() → パラメータ更新 θ -= η·∇J を実行。
この4ステップループを理解すれば、すべてのディープラーニングフレームワークの核心的なトレーニングロジックを理解したことになります。
学習率は最も重要なハイパーパラメータである
学習率が大きすぎる → 損失が振動し、発散することもある;学習率が小さすぎる → 収束が極めて遅く、局所最適に陥る可能性がある。学習率スケジューリング(Step、Cosine Annealing、Warmup)は大規模モデルのトレーニングに不可欠な技術です——GPT-3 のトレーニングでは線形 warmup + cosine decay 戦略が使われました。
SGD のバッチサイズのトレードオフ
全量 GD:全データを使って正確な勾配を計算する。遅いが安定;SGD(batch_size=1):毎回1つのサンプルだけを見る。速いが勾配推定のノイズが大きい;ミニバッチ SGD:折衷案(batch_size=32/64/128)。ノイズが適度で、むしろ局所最適から抜け出すのに役立つ——これが実際のトレーニングでの標準的なやり方です。
勾配降下法の限界
勾配降下法が見つけるのは勾配がゼロになる点——それは大域的最適解、局所的最適解、または鞍点かもしれません。高次元空間では、鞍点は局所的最適解よりもはるかに一般的です:ある点は一部の方向では極小値ですが、他の方向では極大値です。Adam などの適応的オプティマイザは鞍点からより効果的に脱出できます。
その他の拡張