勾配降下法の基礎
🔥 Vibe プロンプト
「f(x,y)=x²+2y²における勾配降下法を可視化。等高線図とパラメータ軌道を表示。」
勾配降下法とは?
勾配降下法は、関数の最小値を見つけるための1次反復最適化アルゴリズムです。勾配の逆方向に進むことで谷底に到達します。
| 概念 | 意味 | |------|------| | 勾配 | 最も急な上昇方向(逆方向に進む) | | 学習率 (α) | ステップサイズ — 大きすぎると発散、小さすぎると低速 | | 収束 | 勾配 ≈ 0 になったら最小値に到達 | | 局所/大域 | 勾配降下法は局所最小値を発見(乱数再起動で大域探索) |
実装
import numpy as np
def gradient_descent(gradient_func, initial_w, lr=0.1, n_steps=100):
w = initial_w.copy().astype(float)
history = [w.copy()]
for i in range(n_steps):
grad = gradient_func(w)
w = w - lr * grad
history.append(w.copy())
if i % 10 == 0:
print(f"Step {i}: w={w}, f(w)={f(w):.4f}")
return w, history
def f(w):
return w[0]**2 + 2*w[1]**2
def grad(w):
return np.array([2*w[0], 4*w[1]])
w0 = np.array([3.0, 4.0])
w_final, history = gradient_descent(grad, w0, lr=0.1, n_steps=50)
print(f"\n最終: w = {w_final}")
print(f"f(w) = {f(w_final):.6f}")
print(f"解析的最小値: (0, 0), f=0")
学習率の比較
| 学習率 | 結果 | 判定 | |--------|------|------| | 0.01 | 収束が遅い(50ステップでも未収束) | ❌ 小さすぎ | | 0.10 | スムーズに収束 | ✅ 適切 | | 0.50 | 速いが振動する | ⚠️ やや大きい | | 1.00 | 発散する(値が増大) | ❌ 大きすぎ |
まとめ
| 項目 | 詳細 | |------|------| | 方向 | 勾配の逆方向(最急降下) | | 学習率 (α) | ステップサイズ — 最重要ハイパーパラメータ | | 収束条件 | 勾配の大きさ ≈ 0 | | 時間計算量 | O(k × d) k=ステップ数, d=次元数 | | 課題 | 適切な学習率の選択 | | 拡張 | Momentum, Adam, RMSProp(適応的学習率) |
章のまとめ
- コアコンセプトと原理を理解
- 実装方法とテクニックを習得
- 一般的な問題と解決策に精通
- 実際のプロジェクトに適用可能
さらに読む
- 公式ドキュメントとAPIリファレンス
- GitHubのオープンソース例
- 技術書とオンラインコース
- コミュニティディスカッションと技術ブログ
実装例
基本例
# 完全な実装例を提供します
手順
- セットアップ: 開発環境の設定
- データ: 必要なデータの準備
- 実装: コア機能の構築
- テスト: 動作確認
- 最適化: パフォーマンスの向上
よくあるエラー
| エラー種別 | 原因 | 解決方法 | |-----------|------|---------| | コンパイル | 構文 | コードの構文を確認 | | 実行時 | 環境 | 依存パッケージの確認 | | 論理 | アルゴリズム | ステップごとのデバッグ | | パフォーマンス | 効率 | プロファイラーの使用 |
コード例
import sys
def main():
print("Hello, World!")
if __name__ == "__main__":
main()
参考資料
- 公式ドキュメント
- APIリファレンス
- オープンソース例
- コミュニティディスカッション