ひとことで言うと
勾配降下法は、損失関数をパラメータで微分し、損失が減る向きへパラメータを少しずつ更新する最適化手法です。勾配は増える向きを示すので、符号を反転して使います。逆伝播法が勾配を計算する手順、勾配降下法がその勾配で値を更新する規則です。
山の斜面に立っているとき、足元の傾きだけを測り、最も下る向きへ一定の歩幅で進むイメージです。傾きが急でも歩幅を決めるのは学習率なので、急斜面だから大股でよいとは限りません。
なぜ必要か
ニューラルネットワークでは、重みとバイアスを含む多数のパラメータを、予測誤差が小さくなる値へ同時に動かします。損失を 、パラメータ全体を とすると、現在地点での傾きは です。微分が正の成分はその成分を増やすと損失が増えるため、減らす方向へ動かします。
この局所的な情報で更新を繰り返せることが、複雑な非凸関数を扱う実用上の理由です。ただし、勾配が示すのは現在地点の傾きだけで、全体で最も低い地点を保証しません。したがって「損失が下がらない」状態を見たとき、局所最小だけでなく、平坦な領域や鞍点、学習率の設定も候補に残します。
| 観測される状態 | まず切り分ける候補 |
|---|---|
| 損失が振動・発散する | 学習率が大きすぎる |
| 損失がほぼ変わらない | 学習率が小さい、または平坦な領域・鞍点 |
| 勾配が小さく損失も低い | 局所最小のほか、鞍点でないかを確認 |
仕組み
基本の更新則は次です。 は時刻 のパラメータ、 は学習率、 はその時点の損失の勾配です。
学習率 は勾配の大きさをそのまま使わず、1回の更新幅を調整する係数です。大きすぎると最小点を飛び越え、反対側へ振動したり損失が発散したりします。小さすぎると更新が安定していても、平坦な領域から抜けるまでの反復回数が増えます。勾配が小さいことと学習率が小さいことは別なので、ログでは勾配ノルムと更新幅を分けて見ます。
データ全体の損失を使って毎回勾配を計算し、更新する方法を最急降下法(バッチ勾配降下法)と呼びます。データ1件ごとに更新する方法が確率的勾配降下法(SGD)、複数件をまとめる方法がミニバッチ勾配降下法です。名前の違いは、1回の勾配をどのデータ集合から作るかにあります。ミニバッチのサイズや勾配の分散は別の論点で、ここでは更新則の区別だけ押さえます。
損失の地形が非凸なら、勾配がゼロでも局所最小とは限りません。局所最小は近傍のどの方向へ動いても損失が増える点ですが、鞍点は方向によって増える方向と減る方向がある停留点です。高次元の問題では、局所最小より鞍点が多く、周囲の平坦な領域が学習を遅くすることが主要な問題になり得ます。実装で勾配ノルムが小さいからといって、局所最小に到達したと即断しません。学習率を調整しても停滞が続くなら、初期値や更新の軌跡を変えて同じ損失へ進むかを確認します。
| 手法 | 1回の勾配に使うデータ | 更新の特徴 |
|---|---|---|
| 最急降下法 | 全データ | 勾配は安定するが、1回の計算が重い |
| 確率的勾配降下法 | 1件 | 更新頻度が高く、軌跡が揺れる |
| ミニバッチ | 複数件 | 計算をまとめて更新する |
試験でどう問われるか
| 問われ方 | 正解に寄る条件 | 引っかけ |
|---|---|---|
| 更新式の穴埋め | 勾配の前にマイナス、学習率は正の係数 | 勾配をそのまま足す |
| 学習率の大小の判断 | 大きすぎると発散・振動、小さすぎると収束が遅い | 大きいほど常に速く学習できる |
| 手法の名称の区別 | 全データ・1件・複数件で区別する | SGDをミニバッチと同義に固定する |
| 勾配ゼロの解釈 | 局所最小だけでなく鞍点も候補 | 勾配ゼロなら必ず最小値 |
実装で確かめる
1変数の二次関数で、学習率だけを変えたときの更新を確認します。 の勾配は です。
import numpy as np
def train(rate, steps=20):
w = 0.0
for _ in range(steps):
grad = 2.0 * (w - 3.0)
w -= rate * grad
return w, (w - 3.0) ** 2
for rate in (0.1, 1.1):
print(rate, train(rate))
学習率 では は3へ近づきます。 では更新の係数が になり、符号を反転しながら大きくなって損失が発散します。実際のネットワークでは曲率が方向ごとに違うため、同じ学習率でも急な方向では飛び越し、平坦な方向では進みが遅くなります。
損失が下がらないとき、まず学習率を下げるだけでは不十分です。更新前後の損失、勾配ノルム、パラメータの更新ノルムを記録し、発散なのか停滞なのかを分けます。勾配ノルムが小さくても鞍点や平坦な領域の可能性は残ります。
取り違えやすいもの
| 用語 | 勾配降下法との切り分け |
|---|---|
| 最急降下法 | 全データの勾配で更新する勾配降下法。広義の勾配降下法と区別して使う |
| SGD | 1件の勾配を計算するたびに更新する確率的な変種 |
| ミニバッチ勾配降下法 | 複数件の勾配をまとめて1回更新する変種 |
| 逆伝播法 | 勾配を求める計算手順。パラメータの更新則ではない |
| Adamなどの適応的手法 | 勾配から更新量を作る別の最適化手法。基本則の学習率とは役割が異なる |
想起チェック
基本の更新式で、勾配の前にマイナスを置く理由は何か
勾配は損失が増える方向を示すため、その反対方向へ動かすためです。 は更新幅を調整する正の学習率です。
学習率が大きすぎると小さすぎるとき、何が起きるか
大きすぎると最小点を飛び越して振動・発散し、小さすぎると収束までの反復が増えます。
勾配ゼロなら局所最小に到達したと言い切れるか
言い切れません。鞍点でも勾配はゼロになります。高次元では局所最小より鞍点が問題になる場合があります。