Re Reference AI

技術

勾配降下法とは

Gradient Descent

損失関数の勾配の逆方向へパラメータを少しずつ更新し、損失を最小化する最適化アルゴリズム

学習最適化

ひとことで言うと

AIが「もっと正解に近づくにはどちらに調整すればよいか」を繰り返し計算しながら、少しずつ賢くなっていく方法。

概要

勾配降下法は、損失関数(モデルの予測と正解のずれ)をパラメータで微分した勾配を求め、その勾配が指す方向と逆向きにパラメータを少しずつ動かすことで、損失を反復的に小さくしていく最適化アルゴリズム。 1回の更新でどれだけ動かすかは学習率というハイパーパラメータで制御され、大きすぎると発散し、小さすぎると収束が遅くなる。 全データを使って勾配を計算するバッチ勾配降下法、1件ずつ計算する確率的勾配降下法(SGD)、少数のまとまり(ミニバッチ)ごとに計算するミニバッチ勾配降下法があり、深層学習では計算効率と学習の安定性のバランスからミニバッチ方式が広く使われる。 SGDに慣性や適応的な学習率を加えたAdamなどの改良版最適化アルゴリズムが、現在の深層学習モデルの学習で標準的に使われている。

背景

損失関数を最小化するパラメータを解析的に求めることは、パラメータ数が膨大な深層学習モデルでは現実的でない。 勾配降下法は、損失関数の傾きを手がかりに反復的にパラメータを改善していくことで、この最適化問題を近似的に解く。

歴史

19世紀: Cauchyが最急降下法の原型を提案。 1950年代: Robbins と Monro が確率的近似法を発表し、確率的勾配降下法(SGD)の理論的基盤に。 2014年: Adamオプティマイザが提案され、適応的学習率を持つ勾配降下法が深層学習の標準手法に。

ワークフロー

現在のパラメータで損失を計算 → 誤差逆伝播法で各パラメータに対する勾配を求める → 学習率を掛けた分だけ勾配と逆方向にパラメータを更新 → 損失が十分小さくなるか、指定したエポック数に達するまでこれを繰り返す。

コード例

NumPyでの勾配降下法(線形回帰)

import numpy as np

X = np.array([1.0, 2.0, 3.0, 4.0])
y = np.array([2.0, 4.0, 6.0, 8.0])
w, b = 0.0, 0.0
lr = 0.01

for _ in range(1000):
    y_pred = w * X + b
    grad_w = ((y_pred - y) * X).mean()
    grad_b = (y_pred - y).mean()
    w -= lr * grad_w
    b -= lr * grad_b

print(w, b)  # おおよそ w=2, b=0 に収束

利点

  • 微分可能な損失関数であれば、モデルの構造によらず汎用的に適用できる
  • ミニバッチ化やGPU並列化と相性がよく、大規模データ・大規模モデルにも対応できる
  • Adamなど改良版と組み合わせることで、学習率の手動調整の手間を減らせる

欠点

  • 学習率の設定が不適切だと、発散したり収束が非常に遅くなったりする
  • 損失関数が非凸な場合、局所最適解や鞍点で学習が停滞し大域的最適解へ到達しないことがある
  • 特徴量ごとにスケールが大きく異なると、収束が不安定になりやすい

比較

  • 誤差逆伝播法勾配降下法はパラメータを更新する最適化手法で、誤差逆伝播法はその更新に使う勾配を計算する手法
  • 損失関数勾配降下法は損失関数の値を最小化するようにパラメータを調整する
  • 学習率勾配降下法における1回の更新幅は学習率というハイパーパラメータで決まる

関連用語

誤差逆伝播法損失関数学習率深層学習ニューラルネットワークAdam勾配消失問題

よくある質問

SGDとバッチ勾配降下法の違いは?

バッチ勾配降下法は全データで1回の勾配を計算するのに対し、SGDは1件(またはミニバッチ)ごとに勾配を計算して頻繁にパラメータを更新する。SGDは計算コストが低く、深層学習ではミニバッチ版が主流。

学習率はどう決めればよいか?

小さすぎると収束が遅く、大きすぎると発散する。一般には学習率スケジューリングやAdamのような適応的最適化アルゴリズムを使い、経験的に探索して決める。

参考文献

関連Zenn記事