確率的勾配降下法(SGD)は、機械学習やディープラーニングにおいてモデルのパラメータを最適化するための基本的なアルゴリズムです。訓練データの中からランダムに1つのデータを選び、そのデータに対する損失関数の勾配を計算してパラメータを更新します。これにより、全データを使用する手法に比べて計算コストを大幅に削減し、高速な学習を可能にします。
確率的勾配降下法 (SGD)とは
確率的勾配降下法(SGD)とは、機械学習モデルの訓練において、損失関数を最小化するためにパラメータを更新する最適化アルゴリズムの一種です。データセット全体ではなく、ランダムに選択した1つのデータ(サンプル)ごとに勾配を計算してパラメータを微調整していく手法です。
詳しく解説
ニューラルネットワークをはじめとする機械学習モデルの学習では、予測値と正解データの誤差を示す損失関数を最小化するように重みやバイアスといったパラメータを調整します。この調整プロセスにおいて、最も基本的な手法が勾配降下法です。しかし、大規模なデータセットに対してすべてのデータを一度に処理するバッチ勾配降下法は、計算量やメモリ消費が膨大になり実用的ではありません。これに対し、SGDは1ステップごとにランダムに選ばれた1つのデータのみを用いて勾配を計算し、即座にパラメータを更新します。このアプローチにより、計算コストが劇的に抑えられ、データが次々と追加されるオンライン学習にも適応できるという大きなメリットがあります。一方で、1つのデータに基づく更新はノイズが多く、パラメータの更新軌道が激しく振動しながら最適値に向かうという特徴があります。この振動(確率的な揺らぎ)が、局所最適解(ローカルミニマ)から抜け出す手助けになるという側面も持っています。
具体例・使われ方
SGDの具体的な動作イメージは、霧が立ち込める山の中で最も低い谷底(最適値)を探索する状況に例えられます。バッチ勾配降下法が「山全体の正確な地形図を毎回作ってから一歩進む」のに対し、SGDは「足元の傾斜だけを頼りに、目隠しをしながらクイックに一歩ずつ進む」ようなものです。一歩一歩は不正確で蛇行しますが、圧倒的に速いペースで歩みを進めることができるため、最終的には効率よく谷底の近くに到達できます。実際のディープラーニングのフレームワーク(PyTorchやTensorFlowなど)では、画像認識モデルや自然言語処理モデルをトレーニングする際の最も基本的なオプティマイザ(最適化手法)として実装されており、他の発展的なアルゴリズム(Adamなど)の基礎となっています。
似た用語との違い
SGDと混同されやすい最適化手法として、「バッチ勾配降下法」と「ミニバッチ勾配降下法」があります。まず、バッチ勾配降下法はデータセット内のすべてのデータを使用して勾配を計算します。更新は非常に正確ですが、データ数が多い場合にメモリ不足や計算時間の増大が課題となります。次に、SGD(本手法)はランダムに選んだ「1つのデータ」のみを使用して勾配を計算します。計算は高速ですが、ノイズが大きく挙動が不安定になる傾向があります。最後に、ミニバッチ勾配降下法はこれら2つの折衷案であり、データを数十から数百程度の小さなグループ(ミニバッチ)に分割し、そのグループごとに勾配を計算してパラメータを更新します。現在のディープラーニングでは、このミニバッチを用いた手法が最も広く使われており、文脈によってはこのミニバッチ手法自体を広義の「SGD」と呼ぶことも一般的です。
注意点
SGDを適用する際にはいくつかの注意点があります。1つ目は、学習率(1回の更新で進む歩幅)の調整が非常に難しい点です。学習率が大きすぎると最適値を通り過ぎて発散してしまい、小さすぎると学習が全く進まなくなります。2つ目は、1つのデータごとに更新を行うため、現代の計算機(GPUなど)が得意とする並列計算の恩恵を十分に受けられない点です。3つ目は、鞍点(サドルポイント:ある方向からは極小だが別の方向からは極大となる点)や、平坦なプラトーと呼ばれる領域で学習が停滞しやすい点です。これらの課題を解決するために、慣性を取り入れたMomentum SGDや、学習率を自動調整するAdamなどの発展型アルゴリズムが考案されました。