AdamWとは?重みの減衰を勾配から分離し、モデルの汎化性能を改善する学習技術

AdamWは、Adamの適応的な勾配更新と重みの減衰を分ける最適化手法です。L2正則化との違い、モーメントと更新式、画像分類の実験条件から、専用モデルの学習設定やファインチューニングへの応用と注意点を解説します。

参考文献

Decoupled Weight Decay Regularization

Ilya Loshchilov, Frank Hutter

論文を見る

今回の論文

今回取り上げるのは、Ilya Loshchilov、Frank Hutterによる「Decoupled Weight Decay Regularization」です。arXiv初版は2017年11月14日公開、会議発表はICLR 2019です。公開元はarXivおよびICLR、研究分野はニューラルネットワークの最適化と正則化です。書誌情報と論文URL、原論文v3の本文を参照します。初版のタイトルは「Fixing Weight Decay Regularization in Adam」でした。

選んだ理由は、学習設定の小さな違いが、未知データへの性能を変える仕組みを理解できるためです。モデルを大きくする前に、既存の学習ループで「重みを小さくする処理」がどこを通っているかを点検する、実践的な視点が得られます。

どんな技術か

AdamWは、データから計算した勾配による更新と、重みをゼロへ近づける減衰を分けて実行する学習手法です。モデル構造や入力データの形式を変える技術ではありません。

Adamは、過去の勾配を記憶し、パラメータごとに更新の大きさを調整します。ところが、損失へL2ペナルティを足すと、重みを縮める信号まで、その適応的な調整を受けます。AdamWはこの経路を分け、データへの適合にはAdamの更新を使い、減衰には重みへ直接同じ比率を掛ける処理を使います。

例えば、学習中だけこの更新を使って画像分類器を育てた場合、配備するのは通常の分類モデルです。推論時にAdamWを動かしたり、複数の予測を平均したりする必要はありません。

課題

学習データに合わせるだけでは、新しい入力への精度は保証されません。そこで重みが大きくなりすぎることを抑える正則化を使います。よくある方法は、損失に重みの二乗和を足すL2正則化です。

モーメンタムのない通常のSGDでは、L2正則化による更新は、係数を学習率に合わせて換算すれば、重みを一定比率で減衰させる更新と一致します。この関係から、両者を同じ意味で扱いがちです。しかしAdamでは、勾配の履歴に基づくパラメータ別の補正が入り、一つの係数の換算では同じ更新にできません。

その結果、同じ「weight decay」という設定名でも、実際にはL2勾配をAdamへ渡しているのか、独立した減衰なのかで挙動が変わります。原論文が問題にしたのは、Adamの画像分類での汎化性能を考える際に、この違いを見落としていたことです。原論文2節・命題1〜2

実際の開発でも、分類器の学習損失は下がるのに検証精度が伸びない場面や、別の学習コードへ設定を移したら結果が変わる場面で関係します。正則化係数の数値だけでなく、その数値が更新式のどこへ入るかを確認する必要があります。

用語解説

勾配と学習率
勾配は、重みを動かすと損失がどちらへ変化するかを表します。学習率は更新量の尺度です。この記事では、データから来る勾配と、重みの減衰を分けて追うことが重要になります。
L2正則化
損失へ重みの二乗和に比例したペナルティを足す方法です。その微分は重みに比例するため、重みを縮める信号になります。ただしAdamへ渡すと、その信号も勾配履歴の計算に含まれます。
Weight decay(重み減衰)
更新前の重みへ、1より小さい係数を掛ける処理です。AdamWではこの処理を勾配の適応的な補正から切り離します。同じ減衰率でも、絶対的な変化量は元の重みの大きさに比例します。
一次・二次モーメント
Adamが保持する、勾配の移動平均と勾配の二乗の移動平均です。更新方向をならし、大きさを調整します。AdamWでは減衰用の信号を、これらの状態へ直接足し込みません。
汎化と検証集合
学習に使っていないデータでも予測できる性質と、設定選択に使う別のデータ集合です。学習損失が小さいだけでは汎化の改善とは言えず、学習率や減衰係数は検証集合で選ぶ必要があります。

技術の仕組み

L2ペナルティを足すと、何がAdamへ入るのでしょうか

データに対する損失をL、重みをw、L2係数をcとすると、正則化した損失は次の形です。1/2は微分を簡単にするための表記です。

正則化した損失 = L(w) + (c / 2) × ||w||²
Adamへ渡る勾配 = grad L(w) + c × w

Adamは、この合計から一次・二次モーメントを更新します。したがって、減衰に相当するc×wも移動平均へ蓄積され、二乗平均を使う除算の影響を受けます。「Adamの更新が終わった後で、一律に重みを縮める」処理とは異なります。

直感をつかむため、適応的な除算の分母を固定した簡略例を考えます。同じ重みと同じcでも、ある成分の分母が別の成分の10倍なら、L2由来の更新は10分の1になります。実際のAdamでは分母やモーメント自体も変化するため、これは違いを説明する例であり、Adamの全挙動を表すものではありません。

データの勾配だけを記憶し、減衰を別に加えます

原論文Algorithm 2のAdamWを、表記を整理して示します。alphaは基準学習率、etaは時刻ごとの共通スケジュール倍率、dは論文での減衰係数です。演算は成分ごとに行います。

g = grad L(w_old)
m = beta1 × m + (1 - beta1) × g
v = beta2 × v + (1 - beta2) × g²
m_hat = m / (1 - beta1^t)
v_hat = v / (1 - beta2^t)

w_new = (1 - eta × d) × w_old
        - eta × alpha × m_hat / (sqrt(v_hat) + epsilon)

m_hatとv_hatは、初期値をゼロにしたことによる偏りを補正した値です。epsilonはゼロに近い値での除算を安定させます。重要なのは、gにはL2のc×wを足していないことです。

減衰はmやvを通さず、更新前の重みへ直接作用します。なお、減衰によって次のステップの重みが変われば、その後のデータ勾配は変わります。「分離」は、将来の学習まで完全に独立するという意味ではありません。原論文2節・Algorithm 2

ライブラリと論文では係数の定義をそろえます

PyTorchのAdamWでは、学習率をlr、設定値をweight_decayとして、減衰項に両方を掛けます。

w_new = (1 - lr × weight_decay) × w_old
        - lr × Adamの補正済み更新方向

同じ時点の更新を原論文の表記に対応させるなら、lr=eta×alpha、d=alpha×weight_decayです。論文のdとAPIのweight_decayへ同じ数値を入れても、同じ減衰にはなりません。 これは仕組みの違いではなく、係数の定義の違いです。PyTorch AdamWの公式更新式

例えばlr=0.001、weight_decay=0.01なら、減衰部分は重みへ0.99999を掛けます。これは説明用の計算例であり、推奨設定ではありません。勾配更新を無視すれば、繰り返し掛けることで効果が累積するため、更新回数や学習率スケジュールも最終的な縮み方に関係します。

学習期間に合わせた正規化も検討しています

原論文の付録B.1では、バッチサイズb、学習例数B、エポック数Tに対し、d=d_norm×sqrt(b/(B×T))とする正規化も提案します。長く学習して更新回数が増えるほど、生の減衰係数を小さくする発想です。

これはAdamWの中心である分離処理に加えた工夫であり、すべての実装に自動で入るものではありません。著者らも、この平方根による規則を少数の実験に基づく一つの選択肢として扱っています。学習率や更新回数を変えても、減衰の設定を永久に固定してよいという結論ではありません。原論文付録B.1・D

実験と結果

同じ構造で、学習率スケジュールを変えて比較しています

主な評価はCIFAR-10と、約120万枚を32×32画素へ縮小したImageNet32x32の画像分類です。バッチサイズは128で、CIFAR向けの通常のデータ拡張を使います。基本モデルは26層・2残差枝のResNetで、幅64と96の構成はそれぞれ約1,160万、2,560万パラメータです。

図1では幅64のモデルを100エポック学習し、固定学習率、段階的に下げる方式、コサイン減衰を比較します。いずれもAdamWがL2正則化付きAdamより良好で、コサイン減衰を使うと結果がさらに改善しています。Adamが成分別の更新量を調整しても、全体の学習率スケジュールは不要にはならないことを示します。原論文4.1節・図1

「誤り率が相対15%改善」の意味を分けて読みます

図3では幅96のモデルを1,800エポック学習し、初期学習率0.001でAdamとAdamWを比較します。AdamのL2係数は12設定、AdamWの正規化減衰係数は7設定を調べています。学習損失が同程度の地点でもAdamWのテスト誤り率が低く、単に学習損失を速く下げただけではない改善を報告しています。

4.4節では、初期学習率0.001の条件で、CIFAR-10とImageNet32x32の両方について、AdamWはAdamよりテスト誤り率を相対15%改善したと述べています。図4で使う指標は、CIFAR-10がTop-1誤り率、ImageNet32x32がTop-5誤り率です。

これは正解率が15パーセントポイント増えたという意味ではありません。仮に誤り率10%から8.5%へ下がれば相対15%減、正解率は90%から91.5%になります。この数値例は指標の説明用で、論文の実測値ではありません。原論文4.3〜4.4節・図3〜4

再始動による改善はAdamW自体と区別します

論文は、学習率を周期的に上げ直すwarm restartsを加えたAdamWRも評価しています。最初の再始動付近では、ある性能に到達するまでのエポック数を大きく減らしていますが、これはスケジュールを追加した変種の結果です。AdamWへ変更するだけで、1更新の実行時間や推論時間が10倍速くなるという意味ではありません。

また、主要実験は画像分類で、1,800エポックの探索は小規模開発には重い条件です。原論文の比較からは分離処理の有効性を学べますが、任意のLLM調整や日本語分類で相対15%改善すると予測することはできません。原論文4.4節・結論

何に使える?

以下は更新式と実験を踏まえた応用案です。原論文が、各業務のデータや費用対効果を直接検証したものではありません。

商品・設備写真の専用分類器

自社画像で分類モデルを学習する場合に、L2正則化付きAdamと比較できます。配備するモデル構造は保ちながら、学習時の汎化を改善できる可能性があるためです。撮影日や撮影場所を分けた検証集合で比べると、同じ画像の類似例を覚えた効果と区別しやすくなります。

問い合わせ分類や文書モデルの調整

重みを更新できる文章モデルでも、データへの適合と重みの減衰を分ける考え方を利用できます。ラベルが少ない専用分類では、学習損失だけを追わず、検証性能に応じて減衰を調整する設計が候補になります。ただし、画像実験の係数や改善率は移植せず、日本語データで検証します。

学習レシピを比較する社内基盤

顧客ごとにモデルを調整するSaaSでは、オプティマイザ名、係数、スケジュール、減衰対象のパラメータ群まで保存すると、結果を再現しやすくなります。同じweight_decayというキーの数値だけを記録するより、学習コード間の違いを追いやすくなります。

開発や事業へのヒント

モデル構造を変える前に、学習の基準条件を整えます

構造変更、データ拡張、学習率変更を一度に行うと、何が効いたか分からなくなります。まずモデルとデータ分割を固定し、Adam+L2とAdamWのそれぞれで学習率・減衰係数を検証集合から選ぶ比較が考えられます。同じ係数を一つだけ与える比較では、片方の定義へ有利になる可能性があります。

ConvNeXtの学習方法と構造を分けた比較も、この視点を具体化しています。AdamWを含む学習方法の改善と、畳み込みブロックの改善を分けることで、構造だけに成果を帰属させる誤りを避けられます。

「何から分離したか」を実装で確かめます

AdamWの分離対象は、重みの減衰と、勾配の適応的な補正です。PyTorch形式では減衰にlrも掛かるため、学習率と減衰の効果が完全に無関係になるわけではありません。学習率、更新回数、減衰係数を一緒に記録して比較します。

また、AdamWへ変えても損失へ同じL2ペナルティを足し続ければ、分離した減衰と、Adamへ入るL2勾配の両方が作用します。意図した併用でなければ、二重に正則化を設定していないか確認します。凍結した重みと学習対象の重みも区別し、どのパラメータ群を減衰させるかを明示します。

推論予算と学習メモリを別の設計軸にします

AdamWによる学習設定の改善は、推論時に新しいネットワークを足さずに試せます。多数の顧客へ同じ専用モデルを配る製品では、この性質が役立つ可能性があります。

一方、Adamのモーメントを保持するメモリは残ります。メモリ不足が実験を止めているなら、GaLoreの勾配射影によるオプティマイザ状態の削減が別の検討軸になります。減衰の定義を改善することと、状態の保存量を減らすことは、解いている制約が異なります。

限界

第一に、AdamWはデータ品質やタスク設計の問題を解決しません。誤ラベルや分布のずれが強い場合、重みを縮める処理だけでは改善しないことがあります。減衰を強めすぎれば、必要な特徴を十分に学べず、過少適合する可能性もあります。

第二に、設定選択は残ります。原論文では分離によって探索空間が扱いやすくなる傾向がありますが、最適な値が全タスクで共通になる証明ではありません。現代のライブラリの係数定義や減衰対象の違いまで含めて検証する必要があります。

第三に、通常のAdamと同様に一次・二次モーメントを持つため、巨大モデルの学習メモリを大幅削減する技術ではありません。分離した減衰は重みに対する要素単位の処理で実装できますが、実機の速度やピークメモリはオプティマイザ実装にも依存します。

第四に、主要結果は特定のResNetと画像分類データで得られています。長期学習の曲線や係数探索が中心で、すべての差に複数シードの誤差範囲が示されているわけではありません。小さな精度差を採用判断に使う場合は、複数試行でのばらつきも確認します。

最後に、推論時の事実誤りや検索漏れを直接修正する方法ではありません。RAGの回答品質が目的なら、分類・生成モデルの学習改善に加えて、検索器や根拠利用の評価も必要です。

よくある質問

Q. Adamの損失へL2正則化を足せば、AdamWと同じですか?

A. 同じではありません。L2由来の勾配も一次・二次モーメントへ入り、適応的な補正を受けます。AdamWはデータ勾配だけでモーメントを更新し、減衰を重みへ直接適用します。

Q. AdamWなら学習率を変えてもweight_decayは固定でよいですか?

A. 自動的に固定できるわけではありません。PyTorchの更新式では、1ステップの縮小率にlr×weight_decayが入ります。学習率スケジュールや更新回数を変えたら、検証集合で減衰の効果も確認します。

Q. 事前学習済みモデルの推論にもAdamWが必要ですか?

A. 必要ありません。AdamWは重みを学習する際の更新方法です。得られた重みを通常どおりモデルへ読み込めば、推論時にモーメントや減衰処理を持ち込む必要はありません。

Q. 重みの減衰で、モデルサイズや学習メモリも小さくなりますか?

A. 通常は小さくなりません。重みの値を縮めても、要素数や保存する型は変わりません。一次・二次モーメントも保持します。圧縮や学習状態の削減には、別の手法を検討します。

Q. 原論文の相対15%改善を、自社モデルでも期待できますか?

A. そのままは期待できません。原論文はCIFAR-10とImageNet32x32の特定の学習条件で、異なる誤り率指標を使った報告です。自社データでは、係数を調整した基準モデルと比べ、業務上重要なクラスの精度と学習費用を測ります。

今日の学び

この論文は、AdamでL2正則化と重み減衰を同じものとして扱うと、期待した正則化にならない課題を扱いました。AdamWは、データ勾配から作る適応的な更新と、重みを直接縮める更新を分離して解決を図ります。

得られるヒントは、学習設定を名前と数値だけで理解せず、信号がどの処理を通るかまで追うことです。小さな専用モデルでも、更新式と評価条件をそろえることで、大きな構造変更の前に試せる改善が見つかります。