勾配問題と最適化アルゴリズム

勾配消失・プラトー・SGD・モメンタム・Adam・AMSGrad・AdaBound
🔰 初心者

ディープラーニングで「勾配消失問題」ってよく聞きますが、どういう問題なんですか?

🎓 上級者

層を深くすると起きる代表的な問題だよ。誤差逆伝播法では勾配が掛け算で伝わるから、層が深いと勾配がどんどん小さくなって入力に近い層が学習できなくなるんだ。

📉 勾配消失問題(Vanishing Gradient Problem)
なぜ起きるか?

シグモイド関数の勾配が最大でも0.25。1層通るたびに勾配が最大1/4になる。

10層通ると → 0.25^10 ≒ 0.00000095... → ほぼ消滅!

🔰 初心者

どうやって解決するんですか?

🎓 上級者

ReLU関数を使うことで大幅に改善できるんだ。ReLUは正の領域では微分値が常に1だから、勾配がそのまま伝わるよ。

シグモイド vs ReLU
シグモイドReLU
正の領域の微分値0〜0.25常に1
10層通ったあとの勾配0.25^10 ≒ 0.0000011^10 = 1
勾配消失起きる起きにくい
勾配消失の可視化 — シグモイド vs ReLU シグモイド関数の場合(勾配が消失する) 出力層 勾配 = 1.0 ×0.25 隠れ層4 勾配 = 0.25 ×0.25 隠れ層3 勾配 = 0.0625 ×0.25 隠れ層2 勾配 = 0.0156 ×0.25 隠れ層1 ≈ 0 ❌ 入力に近い層ほど勾配が消滅し、学習が進まない! ReLU関数の場合(勾配が維持される) 出力層 勾配 = 1.0 ×1.0 隠れ層4 勾配 = 1.0 ×1.0 隠れ層3 勾配 = 1.0 ×1.0 隠れ層2 勾配 = 1.0 ×1.0 隠れ層1 1.0 ✓ 全ての層で勾配が維持され、均等に学習できる! シグモイド: 微分最大0.25 → 層が深いと勾配消滅 ReLU: 正の領域で微分=1 → 勾配がそのまま伝わる
図1: 勾配消失の可視化 — シグモイドでは勾配が各層で0.25倍に減衰し消滅するが、ReLUでは1.0のまま維持される
🔧 ReLUの弱点と改良版
Dying ReLU問題

入力が0以下のとき微分値が0なので、一度死んだノードは二度と復活しない

改良版仕組み
Leaky ReLU0以下でも微分値を0.01など小さい値にする
PReLU0以下の傾きも学習で決める
ELU0以下を滑らかな曲線にする
🎓 上級者

基本的にはReLUで十分うまくいくことが多いよ。改良版が必要になるのは特殊なケースだね。

🛡️ 勾配消失問題のその他の対策
対策仕組み
重みの初期値の工夫Xavierの初期値(シグモイド・tanh向け)、Heの初期値(ReLU向け)
バッチ正規化各層の入力を正規化して勾配の流れを安定させる
残差接続(ResNet)勾配が層をスキップして直接伝わるショートカットを作る
勾配爆発(逆の問題)

勾配が逆にどんどん大きくなりすぎる問題。重みが更新されすぎてモデルが壊れる。
対策:勾配クリッピング(勾配が一定値を超えたら切り詰める)

🏔️ 局所最適解問題
🎓 上級者

勾配降下法が浅い谷にハマる問題だけど、実は高次元ではそこまで深刻でないんだ。パラメータが何百万・何億もある高次元空間では、真の局所最適解は少なく、代わりに鞍点が多い。局所最適解があっても大域最適解と性能差が小さいことが多いよ。

実は...

実際には勾配消失問題のほうがより深刻と言われている。

📊 勾配消失問題 vs 局所最適解問題
勾配消失問題局所最適解問題
何が起きる勾配が小さくなりすぎて学習が進まない浅い谷にハマって最適解に行けない
原因シグモイド等の活性化関数、層が深い損失関数の複雑な形状
影響する場所入力に近い層ほど深刻モデル全体
主な対策ReLU、バッチ正規化、残差接続SGD、モメンタム、学習率調整
深刻度非常に深刻(DL最大の課題だった)高次元では比較的軽微
🏜️ プラトー(Plateau)
🔰 初心者

プラトーって何ですか?局所最適解とは違うんですか?

🎓 上級者

損失関数の広く平坦な領域のことだよ。勾配がほぼ0になり、学習がほとんど進まなくなる。局所最適解(谷底にハマる)や鞍点(峠で止まる)とは異なる現象なんだ。

局所最適解鞍点プラトー
谷底(V字)(方向で上下が逆)広い平原(なだらか)
勾配ちょうど0ちょうど0ほぼ0(≒0)
先に良い解が?ある(大域最適解)ある(抜ければ下がる)ある(平原の先に下り坂)
特徴谷から登り返す必要がある方向を見つければ抜けられるどちらに行っても変わらず停滞
損失ランドスケープ — 最適化の罠たち 大域最適解 全体で一番深い谷底 局所最適解 浅い谷にハマる プラトー(平原) 広く平坦で勾配≈0 鞍点 ある方向では谷、別方向では山 重みパラメータの空間 損失
図2: 損失ランドスケープ — 大域最適解・局所最適解・プラトー・鞍点の位置関係
なぜ困るのか

勾配≒0 → どの方向に進めばいいかわからない
学習がまるで止まったように見えるが、実は最適解に達していない
学習率が小さいと永遠に抜け出せない

対策仕組み
モメンタム過去の勢い(慣性)で平原を突っ切る
Adamモメンタム+学習率の自動調整で効率的に脱出
学習率スケジューリング停滞を検知して学習率を変化させる

🎯 G検定ポイント

🚀 最適化アルゴリズム
🔰 初心者

SGD以外にも最適化の手法はあるんですか?

🎓 上級者

SGDの弱点(学習率を自分で固定しないといけない)を克服するために、学習率の調整を工夫した手法がどんどん発展したんだ。

進化の流れ

SGD → モメンタム(勢いを追加) → AdaGrad(学習率を自動調整) → RMSProp → Adam(全部入り)

手法特徴弱点
SGD基本。学習率は固定学習率の設定が難しい。収束が遅い
モメンタムSGD+過去の勢い(慣性)を加える学習率は手動設定のまま
AdaGradパラメータごとに学習率を自動調整。よく更新されるパラメータは学習率を小さく学習が進むと学習率が小さくなりすぎて止まる
RMSPropAdaGradの改善。過去の勾配を徐々に忘れる
Adamモメンタム+RMSPropの組み合わせ収束しないケースがある。SGDより汎化性能が劣る場合も
AMSGradAdamの修正版。過去の勾配2乗の最大値を保持実用上の改善は限定的な場合も
AdaBound初期はAdam、後半はSGDに近づくように学習率を制限
最適化アルゴリズムの経路比較(等高線マップ) 最小値 開始点 SGD ジグザグ・遅い Momentum 揺れながらも速い Adam 最短・最速で到達 SGD: 勾配方向にそのまま進む→ジグザグ Momentum: 慣性で揺れを抑える Adam: 慣性+学習率自動調整で最も効率的な経路をたどる
図3: 最適化アルゴリズムの経路比較 — SGD(ジグザグ)、Momentum(滑らか)、Adam(最短経路)
🃏 各手法の特徴カード

SGD(確率的勾配降下法)

最も基本的な最適化手法。学習率は固定。
ミニバッチのランダムなブレが局所最適解からの脱出に役立つ。しかし学習率の設定が難しく収束が遅い。

モメンタム

SGDに「慣性」の概念を追加。過去の更新方向を一部引き継ぐ。
局所最適解・鞍点・プラトーを抜け出す力がある。ボールが坂を転がるように、勢いがあれば小さな丘を乗り越えられる。

AdaGrad

パラメータごとに学習率を自動で調整する手法。
よく更新されるパラメータは学習率を小さく、あまり更新されないパラメータは学習率を大きくする。しかし学習が進むと学習率がどんどん小さくなりすぎるという弱点がある。

RMSProp

AdaGradの改善版。過去の勾配を徐々に忘れる仕組みを導入。
AdaGradの「学習率が小さくなりすぎる」問題を、指数移動平均で過去の影響を減衰させることで解決。

Adam(Adaptive Moment Estimation)

モメンタム+RMSPropを組み合わせた「全部入り」。現在最もよく使われる。
モメンタムの「慣性」とRMSPropの「自動学習率調整」の両方を兼ね備え、多くのタスクでデフォルトの選択肢となっている。
🔄 Adamの派生手法
🔰 初心者

Adamが最強ならそれだけ使えばいいのでは?弱点はないんですか?

🎓 上級者

実はAdamには「収束しないケースがある」という理論的な問題が指摘されているんだ。また、SGDのほうが最終的な汎化性能が高い場合もある。それを改善するために派生手法が提案されたよ。

AMSGrad

Adamの収束性の問題を修正した手法(2018年)。
Adamでは過去の勾配の2乗の指数移動平均を使うが、この値が減少すると学習率が不適切に上がることがある。AMSGradは過去の最大値を保持することで学習率が上がりすぎないよう制限し、理論的な収束を保証する。

AdaBound

Adamの速さとSGDの汎化性能を両立させる手法(2019年)。
学習の初期はAdamのように動的な学習率で素早く学習し、後半はSGDのように学習率を一定範囲に制限する。学習率に上限と下限(bound)を設け、徐々にその範囲を狭めることでSGDに近づく。
Adamの弱点と派生手法の関係

Adamの弱点①:理論的に収束が保証されないケースがある → AMSGradで修正
Adamの弱点②:SGDと比べて汎化性能が劣る場合がある → AdaBoundでSGDの良さを取り込む

🎯 G検定ポイント