勾配降下法は、微分可能な関数を最小化するためのアルゴリズムで、局所的に最も値が減る方向へ何度も進むことで解を探します。「勾配降下法とは」と調べているなら、基本の考え方はシンプルです。傾きを計算し、少しだけ下り、これを繰り返します。
この方法は、微積分に基づく最適化や機械学習で広く使われています。導関数や勾配を計算でき、しかも学習率を、安定性を保てる程度に小さく、かつ前進できる程度には大きく選べるときに特にうまく機能します。
1変数では、更新式は
となり、多変数では
となります。ここで は学習率です。学習率は各ステップでどれだけ進むかを決めるので、アルゴリズムが収束するか、停滞するか、行き過ぎるかに直接影響します。
勾配降下法の直感
勾配は上り方向を指します。最小化が目的なら、自然な局所的な動きはその反対方向へ進むことです。
ただし、この局所ルールだけで、どんな問題でも最良の答えが保証されるわけではありません。凸関数では、勾配降下法は大域最小値へ到達することがあります。非凸関数では、局所最小値、平坦な領域、あるいは別の停留点に落ち着くことがあります。
勾配降下法のアルゴリズムはどう動くか
各反復では、現在の傾きの情報を使い、点を更新し、続けるべきかどうかを確認します。
- 初期値 または を決めます。
- 現在の点で導関数または勾配を計算します。
- その導関数または勾配に を掛けたものを引いて更新します。
- 勾配が小さくなる、更新量がごく小さくなる、またはあらかじめ決めた反復回数の上限に達したら停止します。
標準的な更新式は、適用する点で目的関数が微分可能であることを前提にしています。滑らかでない問題では劣勾配を使う最適化手法もありますが、それは別の設定です。
勾配降下法で学習率が重要な理由
学習率 はステップ幅です。
が小さすぎると、勾配降下法はたいてい正しい方向には進みますが、非常に遅くなることがあります。 が大きすぎると、更新が最小値を飛び越えたり、行ったり来たりしたり、場合によっては発散したりします。
このトレードオフは、二次関数で特にはっきり見えます。最小値から離れるほど傾きが急になるからです。ある場所では安全に見えるステップ幅でも、別の場所では攻めすぎになることがあります。
例題:二次関数に対する勾配降下法
次を考えます。
この関数は で最小値をとります。導関数は
です。学習率 、初期値 として勾配降下法を使います。
すると更新式は
となります。 から始めると、
次に
さらに
となります。各ステップで に近づき、関数値も毎回小さくなっています。ここで注目すべき基本パターンは、勾配降下法は答えに一気に飛ぶのではないということです。局所的な修正を繰り返して推定値を改善していきます。
勾配降下法の代表的な種類
バッチ勾配降下法
バッチ勾配降下法では、各更新のたびにデータセット全体を使って計算します。目的関数が固定されていれば決定論的なステップになりますが、データセットが大きいと計算コストが高くなります。
確率的勾配降下法
確率的勾配降下法は、1サンプルずつ使って更新します。各ステップは安く済みますが、ノイズが大きくなります。そのノイズによって動き続けやすくなることもありますが、経路は滑らかではなくなります。
ミニバッチ勾配降下法
ミニバッチ勾配降下法では、各ステップで少数のサンプル群を使います。純粋な確率的更新よりノイズを減らしつつ、フルバッチ更新よりはるかに低コストに保てるため、実用的な折衷案になることが多いです。
これらの違いが特に重要になるのは機械学習です。そこでは目的関数が、多数の訓練例に対する平均損失になっていることがよくあります。
勾配降下法でよくある間違い
学習率を見た目だけの設定だと思う
を変えると、アルゴリズムそのものの振る舞いが変わります。ある学習率では収束する方法でも、別の学習率では失敗することがあります。
勾配降下法は必ず大域最小値を見つけると思い込む
その結論には条件が必要です。たとえば、凸性があると、一般的な非凸の地形よりずっと強い保証が得られます。
応用問題で特徴量のスケールを無視する
スケールの悪い変数を含む最適化問題では、ある方向は別の方向よりずっと速く変化することがあります。その場合、問題をより適切にスケーリングしたり定式化し直したりしないと、勾配降下法はジグザグに進んで収束が遅くなります。
勾配が厳密にゼロでないことだけを理由に止めない
数値アルゴリズムは、完全なゼロを待つことはほとんどありません。実際の停止条件では、勾配ノルム、パラメータの変化量、または目的関数の変化量が十分小さいかどうかを確認するのが普通です。
勾配降下法はいつ使われるか
勾配降下法は、数値最適化、統計学、機械学習で使われます。特に、厳密な閉形式解が存在しない場合や、直接計算するにはコストが高すぎる場合によく用いられます。
小さな問題で式が単純なら、微積分によって最小値を厳密に求められることもあります。勾配降下法がより有用になるのは、パラメータ空間が大きいとき、目的関数に多くの変数があるとき、あるいは損失が大規模データセットから生じるときです。
似た問題に挑戦してみよう
、初期値 で自分でも試してみましょう。 の場合と の場合をそれぞれ実行してみてください。安定するケースと不安定になるケースを1つずつ見ると、学習率の役割が式だけの場合よりずっとはっきり理解できます。