日々のAIモデル開発において、オプティマイザ(最適化アルゴリズム)の選択に迷うことはありませんか?
実際の開発現場では、「とりあえず torch.optim.Adam をデフォルト設定で」というコードから書き始めることが習慣になっているケースは珍しくありません。
もちろん、Adamは素晴らしいアルゴリズムです。初期の学習進捗は速いですし、ハイパーパラメータの調整にそこまで神経質にならなくても、ある程度の解には到達してくれます。リソースや納期が限られた実務のプロジェクトにおいて、まずはベースラインを作るには最適の選択肢と言えるでしょう。
けれど、もし今、モデルの精度向上に停滞感を感じているなら。あるいは、ほんの数パーセントの精度改善がビジネスインパクトに直結するシビアなAI導入プロジェクトに直面しているなら、その「とりあえずAdam」こそが、見えない壁になっている可能性があります。
「なぜ画像認識のSOTA(State-of-the-Art:最高水準)モデルでは、依然としてSGD(確率的勾配降下法)が使われることが多いのでしょうか?」
「なぜTransformerモデル(BERTやGPT系)では、AdamではなくAdamWが必須とされるのでしょうか?」
この問いは、開発環境の最新動向を踏まえるとさらに重要性を増しています。例えば、Hugging Face Transformersの最新バージョンでは内部設計が刷新され、PyTorchを中心とした最適化が行われました。それに伴い、TensorFlowやFlaxのサポートが終了しています。この大きな変化により、開発現場ではPyTorchベースの環境への移行が求められており、torch.optim などのPyTorchネイティブなオプティマイザの挙動や選択基準を、これまで以上に深く理解することが必要になっています。
これらの問いに、経験則ではなく「数理的な理由」で答えることはできるでしょうか。
最適化アルゴリズムの世界は、単なる「パラメータ更新の計算式」ではありません。それは、高次元の損失曲面という荒野を探索し、最も汎化性能(未知のデータに対する予測能力)の高い「平坦な谷」を見つけ出すための羅針盤です。ここには、確率論、統計力学、そして幾何学的な直感が複雑に絡み合っています。
既存のライブラリを使うだけでは見えてこない、最適化アルゴリズムの深層部を紐解いていきましょう。数式の意味を直感的な言葉で噛み砕きながら、モデルが本来持っているポテンシャルを最大限に引き出し、実務で使えるAIを構築するための「理論的指針」を分かりやすく解説します。
「とりあえずAdam」からの脱却:最適化の不都合な真実
深層学習のモデル開発において、長らく議論の的となってきたテーマがあります。「適応的学習率(Adaptive Learning Rate)を用いた手法は、本当に万能なのだろうか?」という問いです。
Adamに代表される適応的手法は、パラメータごとに学習率を自動で調整する仕組みを持っています。そのため、勾配がスパース(疎)なデータセットを扱う場合や、スケールが大きく異なるパラメータが混在する複雑な状況下でも、極めて高速に収束に向かうという強力な特性を備えています。
しかし、2017年にWilsonらが発表した論文『The Marginal Value of Adaptive Gradient Methods in Machine Learning』は、当時のAIコミュニティに一石を投じました。彼らの分析結果はシンプルでありながら示唆に富むものでした。「画像認識や言語モデリングなどの主要なタスクにおいて、Adamなどの適応的手法は、従来のSGD(確率的勾配降下法)に比べて汎化性能(Generalization Performance)が劣るケースが多い」という指摘です。
収束速度と汎化性能のトレードオフ
この現象を正確に理解する上で重要な指標となるのが、「学習データに対する損失(Training Loss)」と「未知のテストデータに対する精度(Test Accuracy)」の違いです。
確かに、Adamは学習データに対する損失を低下させる速度において非常に優れています。学習曲線をグラフに描画すると、初期段階で垂直に落下するように損失が減少していく様子が確認できるでしょう。しかし、学習のエポックを重ねるにつれてSGDが徐々に追いつき、最終的なテスト精度においては、SGDがAdamのスコアを上回るという逆転現象がしばしば観測されます。
なぜ、初期の収束が遅いSGDが、最終的な精度で勝るのでしょうか。
その鍵は、到達する「解の質」に隠されています。最適化アルゴリズムの真の目的は、単に手元の学習データに対する損失関数 $L(w)$ の値をゼロに近づけることではありません。未知のデータが入力された際にも低い損失を維持できること、すなわち「高い汎化能力を獲得すること」にあります。実務においてAIを導入する際、この未知のデータへの対応力こそが最も重要になります。
「平坦な解」と「鋭い解」
この汎化能力の違いを直感的に捉えるために、損失関数の形状、いわゆる「損失曲面(Loss Landscape)」を想像してみてください。
損失関数が最小値をとる場所(局所解)は、その地形の起伏によって大きく二つのタイプに分類されます。
- 鋭い解(Sharp Minima): 谷底が非常に狭く、切り立った崖のように尖っている状態。
- 平坦な解(Flat Minima): 谷底の面積が広く、なだらかな盆地のように広がっている状態。
数学的な観点から見ると、鋭い解に陥ったモデルは汎化性能が低下する傾向にあります。現実の運用環境では、学習データとテストデータとの間に必ず統計的な分布のズレ(共変量シフトなど)が生じます。もしモデルのパラメータが鋭い解の底に位置している場合、入力データがわずかに変化しただけで損失曲面上の相対的な位置がずれ、谷底から一気に急斜面を駆け上がってしまい、結果として損失が急増(精度が急落)してしまうのです。
一方で、平坦な解に到達していれば状況は異なります。入力データの変動によってパラメータの最適値が多少ずれたとしても、依然としてなだらかな盆地の底付近に留まることができます。つまり、平坦な解を見つけ出すことこそが、モデルのロバスト性(堅牢性)を高め、良好な汎化性能を引き出す条件となります。
多くの研究と実験データが示唆しているのは、Adamは鋭い解に収束しやすく、SGDは平坦な解を見つけやすいという興味深い傾向です。Adamの卓越した収束スピードは、最も近くにある鋭い谷底へ一直線に駆け込むような挙動を引き起こしがちです。対してSGD(特にモメンタムを適用したSGD)は、勾配計算に含まれる適度な「ノイズ」と慣性の力によって、狭く鋭い谷を飛び越え、より広大でなだらかな平坦な谷へと安住する特性を持っています。
タスク特性に応じたアルゴリズム選定
ただし、これは「いかなる場合でもSGDを採用すべきである」という単純な結論を意味するものではありません。扱うタスクやアーキテクチャによって、損失曲面の性質は大きく異なります。
- 画像認識(CNN系): CNN(畳み込みニューラルネットワーク)を用いた画像認識タスクでは、一般的にSGDの方が高い最終精度を出力する傾向があります。例えば、2015年に発表されたResNetは、現在でも画像分類や医療画像診断における標準的なベースラインとして広く継続使用されています。PyTorchなどのフレームワークにおいて、提供されている事前学習済みモデル(例:
models.resnet50(weights=models.ResNet50_Weights.DEFAULT))を読み込んでファインチューニングを行う従来の手順においても、CNN特有の比較的滑らかな損失曲面に対しては、SGDの持つ探索能力が極めて有効に機能します。 - 自然言語処理(Transformer系): 一方で、大規模言語モデルに代表されるTransformerアーキテクチャは、パラメータ数が膨大であり、損失曲面が複雑かつ悪条件(Ill-conditioned)になりがちです。このような環境下では、SGDによる学習は極めて不安定に陥りやすく、Adam(より正確には後述するAdamW)の採用がデファクトスタンダードとなっています。
「計算が速いからAdamを選ぶ」という思考停止から抜け出し、「現在のモデルとデータセットにおいて、どのような解の形状を求めているのか」という一段高い視点からアルゴリズムを選定する。これが、最適化の不都合な真実を乗り越え、より精度の高いモデルを構築し、業務で確実に機能するAIを導入するための重要なアプローチとなります。
進化の系譜と「L2正則化」の罠:AdamWが生まれた必然性
さて、ここから少し数式的な話に入りますが、複雑な展開は避けて直感的に解説します。ここで理解していただきたいのは、長年多くのエンジニア(そして主要なライブラリの実装者さえも)が混同していた、「L2正則化」と「Weight Decay(重み減衰)」の違いについてです。
「L2正則化とWeight Decayは同じ意味ではないのか?」と思われるかもしれません。SGDにおいては、この二つは数学的に等価であるため、その感覚は間違いではありません。
SGDにおける等価性の証明
少しだけ数式を見てみましょう。
損失関数を $L(w)$、学習率を $\eta$、正則化係数を $\lambda$ とします。
L2正則化は、損失関数に重みの二乗和(L2ノルム)を加える手法です。
$$L_{reg}(w) = L(w) + \frac{\lambda}{2} |w|^2$$
これを勾配降下法で微分すると、
$$\nabla L_{reg}(w) = \nabla L(w) + \lambda w$$
更新式は以下のようになります。
$$w_{t+1} = w_t - \eta (\nabla L(w_t) + \lambda w_t)$$
$$w_{t+1} = w_t - \eta \nabla L(w_t) - \eta \lambda w_t$$
一方、Weight Decayは、更新式の段階で重みを直接少しだけ減衰させる手法です。
$$w_{t+1} = (1 - \lambda') w_t - \eta \nabla L(w_t)$$
$$w_{t+1} = w_t - \lambda' w_t - \eta \nabla L(w_t)$$
見ての通り、$\lambda' = \eta \lambda$ と置けば、両者は全く同じ式になります。だからこそ、SGDの文脈では「L2正則化 = Weight Decay」として扱われてきました。
Adamにおける致命的な欠陥
しかし、Adamのような適応的学習率手法では、話が全く変わってきます。
Adamは、過去の勾配の二乗平均(分散)の平方根で、勾配を割ることで学習率を調整します。これを $M_t$ としましょう。
もしL2正則化として実装した場合(つまり損失関数に項を足した場合)、勾配 $\nabla L$ に $\lambda w$ が加算され、その全体が適応的学習率 $M_t$ でスケーリングされます。
更新式(概念的):
$$w_{t+1} = w_t - \frac{\eta}{M_t} (\nabla L + \lambda w)$$
$$w_{t+1} = w_t - \frac{\eta}{M_t} \nabla L - \frac{\eta \lambda}{M_t} w$$
ここで問題になるのが、第2項の正則化部分 $-\frac{\eta \lambda}{M_t} w$ です。$M_t$ は勾配が大きいパラメータほど大きくなります。つまり、勾配が大きい(頻繁に更新される)パラメータほど、正則化の効果(重みの減衰)が小さくなってしまうのです。
本来、L2正則化やWeight Decayの目的は「過学習を防ぐために、重みが大きくなりすぎないように一様に抑制すること」です。しかしAdamでL2正則化を行うと、抑制したいはずの大きな勾配を持つパラメータほど抑制が効かないという、意図しない挙動を引き起こしてしまいます。
AdamW:Decoupled Weight Decayの革新
この問題を見事に指摘し、解決策を提示したのが、Ilya LoshchilovとFrank Hutterによる2017年の論文『Decoupled Weight Decay Regularization』です。彼らが提案したのがAdamWです。
AdamWのアイデアは非常にシンプルかつ本質的です。「Weight Decayを、適応的勾配の計算から切り離そう(Decouple)」というものです。
AdamWの更新式(概念的):
$$w_{t+1} = w_t - \frac{\eta}{M_t} \nabla L - \eta \lambda w_t$$
違いがわかりますか? 重みの減衰項 $\eta \lambda w_t$ が、$M_t$ によるスケーリングを受けずに、直接引かれています。これにより、勾配の大きさに関わらず、全ての重みに対して設定通りの減衰効果が適用されます。
これが、BERTやGPTなどのTransformerモデルでAdamではなくAdamWが使われる最大の理由です。Transformerはパラメータ数が多く過学習しやすいため、適切な正則化が不可欠です。しかし、従来のAdam実装(L2正則化)では正則化が正しく機能せず、汎化性能が出なかったのです。
「Adamを使っているのに精度が上がらない」と感じた時、それはアルゴリズムのせいではなく、正則化が効いていない(L2正則化の罠にはまっている)可能性が高いのです。
ダイナミクスの解剖:SGDの「ノイズ」はバグか機能か
次に、SGDの挙動についてもう少し深く見ていきましょう。SGD(確率的勾配降下法)の「S(Stochastic:確率的)」とは、全データの勾配ではなく、ミニバッチごとの勾配を使って更新することを指します。
ミニバッチごとの勾配は、全データの真の勾配に対する「近似」であり、そこには必ずノイズが含まれます。一見すると、このノイズは学習の邪魔をする「バグ」のように思えるかもしれません。しかし、深層学習において、このノイズはむしろ必須の「機能」として働いています。
異方性ノイズによる探索
SGDのノイズは、単なるランダムな雑音ではありません。勾配の共分散行列に関連した構造を持つ「異方性(Anisotropic)ノイズ」であることが知られています。
簡単に言えば、「曲率が高い(鋭い)方向にはノイズが大きく、曲率が低い(平坦な)方向にはノイズが小さい」という性質があります。
これが何を意味するかというと、探索が「鋭い谷」に入り込んだ時、SGDは大きなノイズによってそこから弾き出されやすくなります。逆に「平坦な谷」に入り込んだ時は、ノイズの影響が相対的に小さくなり、そこに留まりやすくなります。
つまり、SGDの確率的な挙動そのものが、鋭い解を回避し、平坦な解(汎化性能の高い解)へとモデルを誘導する「暗黙の正則化(Implicit Regularization)」として機能しているのです。
バッチサイズと学習率の相関関係
このノイズの大きさは、学習率 $\eta$ とバッチサイズ $B$ の比率 $\eta / B$ に依存します。
- 学習率 $\eta$ を大きくする: ノイズが大きくなる。
- バッチサイズ $B$ を小さくする: ノイズが大きくなる。
ここから、「バッチサイズを大きくする場合は、学習率も比例して大きくしなければならない」という経験則(Linear Scaling Rule)の理論的根拠が生まれます。バッチサイズを大きくすると勾配の推定精度が上がり、ノイズが減ってしまいます。その分、学習率を上げてノイズ(攪乱効果)を補ってやらないと、鋭い解にトラップされやすくなり、汎化性能が落ちてしまうのです。
一方、Adamのような適応的手法は、勾配の分散(ノイズの大きさ)に合わせてステップ幅を正規化してしまうため、この「ノイズによる探索効果」が薄れてしまう傾向があります。これが、画像認識などでSGDに勝てない一因とされています。
アーキテクチャ別・選定とチューニングの理論的指針
ここまでの理論を踏まえて、実践的な選定指針を整理しましょう。モデルのアーキテクチャによって、推奨されるオプティマイザと設定は明確に異なります。現場でのAI導入を成功させるためには、こうした技術的な裏付けに基づいた選定が不可欠です。
ResNet / CNN系モデルの場合
- 推奨: SGD with Momentum
- 理由: 画像データの損失曲面は比較的素直であり、SGDの持つ「平坦な解への誘導能力」を最大限に活かすべきです。
- 設定のコツ:
- Momentumは0.9が標準。
- Weight Decayは必須($10^{-4}$程度)。
- 学習率は初期値を高め(例えば0.1)に設定し、エポックが進むにつれて1/10ずつ減衰させる「Step Decay」や「Cosine Annealing」が効果的です。
Transformer / BERT / GPT系モデルの場合
- 推奨: AdamW
- 理由: Attention機構を持つTransformerは、勾配が消失・爆発しやすく、またパラメータごとの更新頻度の差が激しいため、適応的学習率を持つAdam系が必須です。さらに、過学習抑制のためにDecoupled Weight Decay(AdamW)が必要です。
- 設定のコツ:
- $\beta_1=0.9, \beta_2=0.999$ が標準ですが、大規模モデルでは $\beta_2=0.98$ など少し下げることもあります。
- Weight Decayは少し強め(0.01〜0.1)に設定するのが一般的です。
- Warmupが不可欠です。
なぜTransformerにはWarmupが必要なのか?
Transformerの学習では、初期の数千ステップで学習率を0から徐々に上げていく「Warmup」が定石です。なぜでしょうか?
Adam系は、学習初期において勾配の分散(分母の $M_t$)の推定が不安定です。特に学習開始直後は、少数のサンプルによる勾配だけで分散を見積もるため、値が極端に小さくなることがあり、結果として更新ステップが異常に大きくなってしまうリスクがあります。
これにより、パラメータが初期位置から大きく飛ばされ、最適解から遠ざかる「発散」を引き起こします。Warmupを入れることで、分散の推定値が安定するまでの間、更新ステップを強制的に小さく抑え、学習軌道を安定させるのです。
これは「おまじない」ではなく、適応的学習率アルゴリズムの統計的な初期不安定性を補正するための必須処理なのです。
結論:エンジニアが持つべき「最適化の羅針盤」
最適化アルゴリズムの選択に、「銀の弾丸(Silver Bullet)」は存在しません。しかし、進むべき方向を示す「羅針盤」を持つことは可能です。
ここでは、多くのプロジェクトや実務で推奨される、意思決定のフレームワークを共有します。
ベースラインの構築:
- まずは AdamW で始めることを推奨します。初期学習率 $10^{-3}$ 〜 $10^{-4}$、Weight Decay $0.01$、Cosine Annealing with Warmup という設定が一般的です。
- これは「大外ししない」ための安全策です。特にTransformerアーキテクチャや、未知のモデル構造を扱う場合に有効です。
- 注記: 以前は時系列データ処理の主流であったRNN(Recurrent Neural Network)は、機械学習の基本アーキテクチャであり、特定のソフトウェアのようなバージョンアップは存在しません。しかし、勾配消失問題などの課題から、現在ではより高度なアーキテクチャへの移行が推奨されています。時系列データ処理の際は、勾配消失対策が施された LSTM(Long Short-Term Memory)やGRU(Gated Recurrent Unit) を優先的に検討してください。さらに、長文処理や高度な並列処理が求められるタスクでは、RNNの逐次処理を並列化して処理速度と精度を向上させた Transformerベースのモデル(Attention機構) を採用することが現代のスタンダードです。タスクの性質に応じて、これらの代替手段から適切なベースラインを構築してください。
SOTAへの挑戦(特に画像系):
- モデルがCNN(畳み込みニューラルネットワーク)ベースであれば、SGD with Momentum に切り替えて比較実験を行います。
- 初期学習率を $0.1$ 程度まで上げ、バッチサイズとのバランスを調整します。
- ここで精度が向上すれば、そのモデルの損失曲面がSGD向き(平坦な解を探すことが重要)である可能性が高いと判断できます。
ファインチューニング時:
- 事前学習済みモデルを微調整する場合は、学習率を極端に小さく($10^{-5}$ 〜 $10^{-6}$)設定します。
- この場合、破壊的なパラメータ更新を避けるため、SGDよりも挙動がマイルドで制御しやすいAdamWが好まれるケースが多く報告されています。
リソース制約がある場合:
- Adam系はSGDに比べて、勾配の1次・2次モーメントを保存する必要があるため、メモリ消費量が約3倍になります(パラメータ数 $N$ に対し、SGDは $N$、Adamは $3N$ のメモリを消費)。
- VRAMに余裕がない場合は、SGDを選択するか、Adafactorのようなメモリ効率の良いオプティマイザ、あるいは8-bit Optimizerなどの量子化技術の活用を検討します。限られたリソースの中で最大限のパフォーマンスを引き出す工夫が求められます。
次世代オプティマイザへの展望:
- Googleの研究チームが提案した「Lion(Evolved Sign Momentum)」など、AdamWよりメモリ効率が良く、収束が速いとされる新しいオプティマイザも登場しています。
- ただし、これらはまだ「枯れた技術」ではないため、実戦投入には慎重な検証が必要です。まずはAdamWで確実なベースラインを作ってから比較することをお勧めします。
「とりあえずAdam」で止まっていた思考を、一歩先へ進めることが重要です。
なぜそのアルゴリズムを選ぶのか。なぜそのハイパーパラメータなのか。その背後にある数理的なダイナミクスを理解したとき、単なる「ライブラリの利用者」から、モデルの挙動を真に理解し制御できる「エキスパート」へと進化できるはずです。
理論の理解は深まりましたか?
次は、これらの知識を実際のプロジェクトで活用し、検証サイクルを回していく段階です。PyTorchなどのフレームワークにおける実装テンプレートや、学習率スケジューラの選び方を整理し、自身のプロジェクトに適した「最適化戦略」を構築してみてください。
理論を武器にすることで、モデルを「最適解」へと導き、業務プロセス自動化などの実務課題を解決する強力なAIを導入することが可能になります。
コメント