ディープラーニングで「勾配消失問題」ってよく聞きますが、どういう問題なんですか?
層を深くすると起きる代表的な問題だよ。誤差逆伝播法では勾配が掛け算で伝わるから、層が深いと勾配がどんどん小さくなって入力に近い層が学習できなくなるんだ。
シグモイド関数の勾配が最大でも0.25。1層通るたびに勾配が最大1/4になる。
10層通ると → 0.25^10 ≒ 0.00000095... → ほぼ消滅!
どうやって解決するんですか?
ReLU関数を使うことで大幅に改善できるんだ。ReLUは正の領域では微分値が常に1だから、勾配がそのまま伝わるよ。
| シグモイド | ReLU | |
|---|---|---|
| 正の領域の微分値 | 0〜0.25 | 常に1 |
| 10層通ったあとの勾配 | 0.25^10 ≒ 0.000001 | 1^10 = 1 |
| 勾配消失 | 起きる | 起きにくい |
入力が0以下のとき微分値が0なので、一度死んだノードは二度と復活しない。
| 改良版 | 仕組み |
|---|---|
| Leaky ReLU | 0以下でも微分値を0.01など小さい値にする |
| PReLU | 0以下の傾きも学習で決める |
| ELU | 0以下を滑らかな曲線にする |
基本的にはReLUで十分うまくいくことが多いよ。改良版が必要になるのは特殊なケースだね。
| 対策 | 仕組み |
|---|---|
| 重みの初期値の工夫 | Xavierの初期値(シグモイド・tanh向け)、Heの初期値(ReLU向け) |
| バッチ正規化 | 各層の入力を正規化して勾配の流れを安定させる |
| 残差接続(ResNet) | 勾配が層をスキップして直接伝わるショートカットを作る |
勾配が逆にどんどん大きくなりすぎる問題。重みが更新されすぎてモデルが壊れる。
対策:勾配クリッピング(勾配が一定値を超えたら切り詰める)
勾配降下法が浅い谷にハマる問題だけど、実は高次元ではそこまで深刻でないんだ。パラメータが何百万・何億もある高次元空間では、真の局所最適解は少なく、代わりに鞍点が多い。局所最適解があっても大域最適解と性能差が小さいことが多いよ。
実際には勾配消失問題のほうがより深刻と言われている。
| 勾配消失問題 | 局所最適解問題 | |
|---|---|---|
| 何が起きる | 勾配が小さくなりすぎて学習が進まない | 浅い谷にハマって最適解に行けない |
| 原因 | シグモイド等の活性化関数、層が深い | 損失関数の複雑な形状 |
| 影響する場所 | 入力に近い層ほど深刻 | モデル全体 |
| 主な対策 | ReLU、バッチ正規化、残差接続 | SGD、モメンタム、学習率調整 |
| 深刻度 | 非常に深刻(DL最大の課題だった) | 高次元では比較的軽微 |
プラトーって何ですか?局所最適解とは違うんですか?
損失関数の広く平坦な領域のことだよ。勾配がほぼ0になり、学習がほとんど進まなくなる。局所最適解(谷底にハマる)や鞍点(峠で止まる)とは異なる現象なんだ。
| 局所最適解 | 鞍点 | プラトー | |
|---|---|---|---|
| 形 | 谷底(V字) | 峠(方向で上下が逆) | 広い平原(なだらか) |
| 勾配 | ちょうど0 | ちょうど0 | ほぼ0(≒0) |
| 先に良い解が? | ある(大域最適解) | ある(抜ければ下がる) | ある(平原の先に下り坂) |
| 特徴 | 谷から登り返す必要がある | 方向を見つければ抜けられる | どちらに行っても変わらず停滞 |
勾配≒0 → どの方向に進めばいいかわからない
学習がまるで止まったように見えるが、実は最適解に達していない
学習率が小さいと永遠に抜け出せない
| 対策 | 仕組み |
|---|---|
| モメンタム | 過去の勢い(慣性)で平原を突っ切る |
| Adam | モメンタム+学習率の自動調整で効率的に脱出 |
| 学習率スケジューリング | 停滞を検知して学習率を変化させる |
SGD以外にも最適化の手法はあるんですか?
SGDの弱点(学習率を自分で固定しないといけない)を克服するために、学習率の調整を工夫した手法がどんどん発展したんだ。
SGD → モメンタム(勢いを追加) → AdaGrad(学習率を自動調整) → RMSProp → Adam(全部入り)
| 手法 | 特徴 | 弱点 |
|---|---|---|
| SGD | 基本。学習率は固定 | 学習率の設定が難しい。収束が遅い |
| モメンタム | SGD+過去の勢い(慣性)を加える | 学習率は手動設定のまま |
| AdaGrad | パラメータごとに学習率を自動調整。よく更新されるパラメータは学習率を小さく | 学習が進むと学習率が小さくなりすぎて止まる |
| RMSProp | AdaGradの改善。過去の勾配を徐々に忘れる | |
| Adam | モメンタム+RMSPropの組み合わせ | 収束しないケースがある。SGDより汎化性能が劣る場合も |
| AMSGrad | Adamの修正版。過去の勾配2乗の最大値を保持 | 実用上の改善は限定的な場合も |
| AdaBound | 初期はAdam、後半はSGDに近づくように学習率を制限 |
Adamが最強ならそれだけ使えばいいのでは?弱点はないんですか?
実はAdamには「収束しないケースがある」という理論的な問題が指摘されているんだ。また、SGDのほうが最終的な汎化性能が高い場合もある。それを改善するために派生手法が提案されたよ。
Adamの弱点①:理論的に収束が保証されないケースがある → AMSGradで修正
Adamの弱点②:SGDと比べて汎化性能が劣る場合がある → AdaBoundでSGDの良さを取り込む