timm documentation
最適化
最適化
このページには、timmに含まれるオプティマイザーのAPIリファレンスドキュメントと、オプティマイザーファクトリを通じてそれらがどのように選択・設定されるかの概要が含まれています。
使用方法
オプティマイザーは、create_optimizer_v2 によって名前を指定して作成されます。モデルが与えられると、ファクトリはオプティマイザーを構築する前に、パラメータグループ(ウェイトディケイの除外、任意のレイヤーごとの学習率減衰)を構築します。オプティマイザー固有の引数は、キーワード引数としてそのまま渡されます。
import timm
from timm.optim import create_optimizer_v2, list_optimizers
model = timm.create_model('vit_base_patch16_224')
# AdamW. 1D params (biases, norm scales) and params in model.no_weight_decay() are excluded from weight decay.
optimizer = create_optimizer_v2(model, opt='adamw', lr=1e-3, weight_decay=0.05)
# Layer-wise learning rate decay (fine-tuning), per-layer lr scales from the model's group_matcher().
optimizer = create_optimizer_v2(model, opt='adamw', lr=1e-3, weight_decay=0.05, layer_decay=0.75)
# Optimizer specific arguments are passed through.
optimizer = create_optimizer_v2(model, opt='lamb', lr=5e-3, weight_decay=0.02, trust_clip=True)
# A list of params or param groups can be passed instead of a model, weight decay grouping is then up to the caller.
optimizer = create_optimizer_v2(model.parameters(), opt='sgd', lr=0.1, momentum=0.9)
# All registered names, optionally with a description.
print(list_optimizers(with_description=True))学習スクリプト(train.py)は、これらのフラグを通じて同じものを公開しています:
--optは、オプティマイザーを選択します。--lrは学習率を設定します。--weight-decayは、ウェイトディケイを設定します。--momentumはモーメンタムを設定します。--opt-epsは epsilon (eps) を設定します。--opt-betasはベータ係数(betas)を設定します。--layer-decayは、レイヤーごとの学習率の減衰を設定します。--opt-kwargs key=value ...は、その他のオプティマイザー引数を渡します。
命名規則
登録名は小文字で、ベースのオプティマイザー名に修飾子が付加された形式です:
| 修正 | 意味 | 例 |
|---|---|---|
cプレフィックス | 慎重なバリアントでは、更新の符号が勾配と一致しない箇所では、更新がマスクされます(Cautious Optimizers) | cadamw, clion, cmars, cadopt |
wサフィックス | デカップル(AdamW スタイル)の重み減衰。デフォルトで結合型 L2 減衰を使用するオプティマイザー向け | sgdw, lambw, adoptw, novogradw, rmsproptfw |
cサフィックス | 修正されたウェイトディケイでは、減衰がlrではなくlr² / max_lrによってスケーリングされます(なぜ学習の終盤で勾配が急激に増加するのか) | adamc, nadamc, sgdc, lionc, adoptc, kronc |
nプレフィックス | Nesterov momentum(SGD、LARS、Muonファミリー) | nesterov, nlars, nmuon, nadamuon |
lookahead_プレフィックス | オプティマイザーをLookaheadでラップします | lookahead_adamw |
fusedプレフィックス | NVIDIA Apex による融合実装(apex が必要) | fusedadamw, fusedlamb |
bnbプレフィックス | bitsandbytes 実装、8ビット状態用の 8bit サフィックス(bitsandbytes が必要) | bnbadamw, bnbadamw8bit |
いくつかの名称は慣例より先に存在しています: lambc と larc は信頼比クリッピング付きの LAMB / LARS です (修正された減衰 LAMB 変種は lambcd です)。momentum は古典的モーメンタム付き SGD、sgd は Nesterov モーメンタム付き SGD です。
以下の表にある legacy 実装は、PyTorch に組み込まれる前に存在していました。
オプティマイザーファミリー
| 名前 | 実装 | 注記 |
|---|---|---|
adamw, adam, nadam, radam, radamw, adamax, adadelta, adagrad, rmsprop, sgd, momentum, nesterov | torch.optim | |
adamwlegacy, adamc, cadamw, cadamc | AdamWLegacy | 注意してAdamWを使用、修正された減衰、更新のクリッピング、capturable |
nadamw, nadamc, cnadamw, cnadamc | NAdamW | Nesterovモーメンタム付きAdamW(MLCommonsアルゴリズム効率形式) |
adopt, adoptw, adoptc, cadopt, cadoptw, cadoptc | Adopt | 任意のβ2で収束するAdamのバリアント |
adan, adanw, cadan, cadanw | Adan | 適応型ネステロフモーメンタム |
adabelief, radabelief | AdaBelief | radabelief は RAdam 形式の修正を追加します |
adafactor, cadafactor | Adafactor | fairseq Adafactor、lr=None 時の相対ステップサイズ |
adafactorbv, adafactorbvc, cadafactorbv, cadafactorbvc | AdafactorBigVision | Big Vision Adafactor、ファクター化された2次モーメント、低精度モーメンタム、更新クリッピング |
adamp, cadamp, sgdp, csgdp | AdamP, SGDP | スケール不変な重みの更新の射影 |
adahessian | Adahessian | 2階、クロージャが必要です(is_second_order) |
kron, kronw, kronc | Kron | Kronecker分解された前処理器を用いたPSGD |
lamb, lambc, lambw, lambcw, lambcd, clamb, clambw | Lamb | レイヤーごとの適応モーメント、trust_clip 変種(lambc、lambcw) |
laprop, lapropc, claprop | LaProp | モーメンタムと適応性の分離 |
lars, larc, nlars, nlarc | Lars | レイヤーごとの適応型レートスケーリング、trust_clip 変種(larc、nlarc) |
lion, lionc, clion, clionc | Lion | 進化した符号モーメンタム |
madgrad, madgradw | MADGRAD | モーメンタムベースのデュアルアベレージング |
mars, cmars | Mars | 分散の低減、AdamWまたはLionスタイルの更新 |
muon, nmuon, adamuon, nadamuon | Muon | 2D以上の重みにはNewton-Schulz直交化モーメンタムを、1DのパラメータにはAdamW / NAdamWのフォールバックを使用 |
novograd, novogradw, novogradc | NvNovoGrad | レイヤーごとの正規化されたモーメント |
rmsproptf, rmsproptfw, rmsproptfc, crmsproptf | RMSpropTF | TensorFlowのオペレーション順序およびepsの処理、lrをモーメンタムバッファに折り込み |
sgdw, nesterovw, sgdc, csgdw, csgdc | SGDW | 重み減衰を分離したSGD |
nadamlegacy, radamlegacy | NAdamLegacy, RAdamLegacy | torch.optim に置き換えられた参照実装 |
fused*, bnb* | NVIDIA Apex、bitsandbytes | パッケージのインストール時に登録されます |
一般的なオプション
ほとんどのtimmオプティマイザーは、一般的なlr、weight_decay、betas、epsに加えて、共通のオプションセットを共有しています。どのオプティマイザーがどのオプションを受け入れるかは、以下のクラスのシグネチャで確認できます。サポートされていない引数を指定すると、ファクトリーが例外を発生させます。
cautionは、cプレフィックス付きのレジストリ名に相当する慎重な更新マスクを適用します。corrected_weight_decayは、lr(c接尾辞付きの名称)ではなくlr² / max_lrによって decoupled weight decay をスケーリングするため、実効的な減衰が学習率スケジュールに従います。max_lrは、オプティマイザーが構築された際の学習率であり、ピークスケジュールの lr(train.pyが行っているように)で構築してください。これは各パラメータグループ(max_lr_snapshot)に保持され、オプティマイザー状態とともに保存 / 復元されます。decoupled_decay(またはdecoupled)は、デフォルトで結合型 L2 減衰を使用するオプティマイザーを、AdamW 型の減衰(w接尾辞付きの名称)に切り替えます。foreachはマルチテンソル実装を選択します。デフォルト (None) では、CUDA および他の foreach カーネルをサポートするデバイスで、torch.optimと同じく使用されます (設定がサポートしていない場合を除きます。テンソルlrにcapturableが付いていない場合、または必要な_foreach_maximum_オーバーロードがない PyTorch バージョンでcautionが設定されている場合など)。マルチテンソルステップは、各チャンクのワーキングセットが GPU の L2 キャッシュに収まるようにパラメータをチャンク化して実行されます。これは、大規模モデルにおいて各オペレーションごとにすべてのパラメータをメモリを一度だけストリーミングするよりも高速です。チャンクサイズはデバイスの L2 キャッシュサイズ (PyTorch >= 2.5) から導出され、結果として得られるチャンクが 4M 要素未満になるデバイスではチャンク化がスキップされます。TIMM_FOREACH_CHUNK_SIZE=<elements>でチャンクサイズをオーバーライドでき、0でチャンク化を無効にできます。capturable(AdamWLegacy、NAdamW、Adopt、Muon) は、ステップ数をデバイス上に保持することで、CUDA グラフ内でステップをキャプチャできるようにします。すべてのオプティマイザーは、torch.compileおよび CUDA グラフでの使用を目的として、スケジュールによってインプレースで更新される 0 次元テンソルとして与えられたlrを受け入れます。clipping_threshold(AdamWLegacy、NAdamW、AdafactorBigVision) は、更新量をその RMS でクリップします。クリップ後の更新量はupdate / max(1, rms / threshold)であり、rmsはテンソルごとに計算される、2 次モーメントで正規化された勾配の RMS です (StableAdamW、Adafactor)。論文と同様に1.0です。Adafactor と同様に、(デカップルされた) 重み減衰はクリップされませんが、StableAdamW では減衰もクリップされた学習率でスケーリングされます。maximizeは、最小化ではなく目的関数を最大化します。
低精度パラメータ(bfloat16、float16)が全体でサポートされています:
- AdaBelief、RAdamLegacy、Adafactorは、低精度のパラメータに対して、その状態を
float32で保持します。 - AdafactorBigVisionは、モーメンタムを低精度(
momentum_dtype)で保持します。 - Kronには、
mu_dtype/precond_dtypeという個別のオプションがあります。
これらの state dtype は load_state_dict によって保持されます(PyTorch のデフォルトのローダーは、state を param の dtype にキャストします)。
ステップ関数はホスト同期を回避します(デバイス上のテンソルに対するデータ依存の Python 分岐)。例外は、AdamP / SGDP の射影チェックです。
パラメータグループ
モデルが与えられた場合、create_optimizer_v2 は、param_groups_weight_decay(1次元パラメータおよびモデルの no_weight_decay() セットには減衰を適用しない)または、layer_decay が設定されている場合は param_groups_layer_decay を使用してパラメータをグループ化します。後者は、モデルの group_matcher() を使用して、レイヤーごとに layer_decay ** (num_layers - layer_id) の学習率スケールを割り当てます。group_matcher() を持たないモデルは、auto_group_layers にフォールバックします。これは、ヘッドを分離するためにモデルの pretrained_cfg['classifier'] が必要です。ハイブリッドオプティマイザー(Muon)の場合、fallback_list および fallback_no_weight_decay 引数により、パラメータがフォールバック(AdamW)オプティマイザーにルーティングされます。
API
ファクトリ関数
timm.optim.create_optimizer_v2
< source >( model_or_params: typing.Union[torch.nn.Module, torch.optim.optimizer.ParamsT]opt: str = 'sgd'lr: typing.Optional[float] = Noneweight_decay: float = 0.0momentum: float = 0.9foreach: typing.Optional[bool] = Nonefilter_bias_and_bn: bool = Truefallback_list: typing.Collection[str] = ()fallback_no_weight_decay: bool = Falselayer_decay: typing.Optional[float] = Nonelayer_decay_min_scale: float = 0.0layer_decay_no_opt_scale: typing.Optional[float] = Noneparam_group_fn: typing.Optional[typing.Callable[[torch.nn.Module], torch.optim.optimizer.ParamsT]] = None**kwargs: typing.Any )
パラメータ
- model_or_params — PyTorchモデル、またはパラメータ/パラメータグループのイテラブル。 モデルが指定された場合、他の引数に基づいて、パラメータが自動的に抽出され、グループ化されます。
- opt — 作成するオプティマイザーの名前(例: ‘adam’, ‘adamw’, ‘sgd’)。 利用可能なオプションを確認するには、list_optimizers() を使用してください。
- lr — 学習率。None の場合、オプティマイザーのデフォルト値が使用されます。
- weight_decay — 重み減衰係数。model_or_params がモデルの場合、パラメータグループの作成に使用されます。
- momentum — モメンタムをサポートするオプティマイザー用のモメンタム係数。選択したオプティマイザーがモメンタムパラメータを受け入れる場合のみ使用されます。
- foreach — 利用可能な場合、foreach(マルチテンソル)実装を有効/無効にします。 None の場合、オプティマイザー固有のデフォルト値が使用されます。
- filter_bias_and_bn — True の場合、bias および norm レイヤーのパラメータ(すべての 1 次元パラメータ)には weight decay が適用されません。model_or_params がモデルであり、weight_decay > 0 の場合にのみ使用されます。
- fallback_list — ハイブリッドオプティマイザー(例: Muon 用の AdamW)でフォールバックオプティマイザーを使用するパラメータ名パターンのコレクション。ワイルドカードマッチングをサポートします。
- fallback_no_weight_decay — True の場合、モデルの no_weight_decay() リストに含まれるパラメータは、ハイブリッドオプティマイザー(例: Muon における AdamW)のフォールバックオプティマイザーを使用します。
- layer_decay — 任意のレイヤーごとの学習率減衰係数。指定された場合、学習率は layer_decay^(max_depth - layer_depth) 倍にスケーリングされます。model_or_params がモデルである場合にのみ使用されます。
- param_group_fn — カスタムなパラメータグループを作成するための任意の関数。 指定された場合、他のパラメータグループ化オプションは無視されます。
- **kwargs — オプティマイザ固有の追加引数(例: Adamのbetas)。
timm のレジストリ経由でオプティマイザーのインスタンスを作成します。
適切なパラメータグループと設定を備えたオプティマイザーを作成・設定します。 重み減衰やレイヤー別学習率のためのパラメータグループの自動作成、およびカスタムなパラメータグループ化をサポートします。
例:
モーメンタムと重み減衰付きSGD:
optimizer = create_optimizer_v2(model, 'sgd', lr=0.1, momentum=0.9, weight_decay=1e-4)カスタムパラメータグループ:
def group_fn(model):
return [
{'params': model.backbone.parameters(), 'lr': 1e-4},
{'params': model.head.parameters(), 'lr': 1e-3},
]
optimizer = create_optimizer_v2(model, 'sgd', param_group_fn=group_fn)注: パラメータグループの処理優先順位:
- param_group_fn が指定されている場合、それのみが使用されます
- layer_decay が指定されている場合、レイヤーごとのグループが作成されます
- weight_decay > 0 かつ filter_bias_and_bn が True の場合、weight decay グループが作成されます
- それ以外の場合、すべてのパラメータは1つのグループにまとめられます。
timm.optim.list_optimizers
< source >( filter: typing.Union[str, typing.List[str]] = ''exclude_filters: typing.Optional[typing.List[str]] = Nonewith_description: bool = False ) → If with_description is False
パラメータ
- filter — ワイルドカード形式のフィルター文字列、またはフィルター文字列のリスト (例: ‘adam’ で Adam のすべてのバリアント、または [‘adam’, ‘*8bit’] で Adam のバリアントと 8 ビットオプティマイザー)。空文字列はフィルタリングなしを意味します。
- exclude_filters — 除外するワイルドカードパターンを指定する任意のリスト。例えば、[’8bit’, ‘fused’] とすると、8ビットおよびfusedの実装が除外されます。
- with_description — True の場合、名前だけでなく、(name, description) のタプルを返します。description は、オプティマイザーの特性を簡潔に説明します。
戻り値
with_description が False の場合
文字列としてのオプティマイザー名のリスト(例: [‘adam’, ‘adamw’, …]) with_descriptionがTrueの場合: (name, description)のタプルのリスト(例: [(‘adam’, ‘Adaptive Moment…’), …])
利用可能なオプティマイザーの名前を、必要に応じてフィルタリングして一覧表示します。
ワイルドカードパターンによる任意のフィルタリングを伴い、登録されているすべてのオプティマイザーをリスト表示します。 オプティマイザーは、includeおよびexcludeパターンを使用してフィルタリングでき、必要に応じて各オプティマイザー名とともに説明を返すこともできます。
例:
>>> list_optimizers()
['adam', 'adamw', 'sgd', ...]
>>> list_optimizers(['la*', 'nla*']) # List lamb & lars
['lamb', 'lambc', 'larc', 'lars', 'nlarc', 'nlars']
>>> list_optimizers('*adam*', exclude_filters=['bnb*', 'fused*']) # Exclude bnb & apex adam optimizers
['adam', 'adamax', 'adamp', 'adamw', 'nadam', 'nadamw', 'radam']
>>> list_optimizers(with_description=True) # Get descriptions
[('adabelief', 'Adapts learning rate based on gradient prediction error'),
('adadelta', 'torch.optim Adadelta, Adapts learning rates based on running windows of gradients'),
('adafactor', 'Memory-efficient implementation of Adam with factored gradients'),
...]timm.optim.get_optimizer_class
< source >( name: strbind_defaults: bool = True ) → If bind_defaults is False
デフォルト引数をバインドするオプション付きで、名前からオプティマイザークラスを取得します。
オプティマイザーのクラス、またはデフォルト引数がバインドされた部分関数を取得します。 これにより、完全なファクトリを経由せずに、デフォルト設定でオプティマイザーを直接インスタンス化できます。
例:
timm.optim.get_optimizer_info
< source >( name: str )
オプティマイザーのOptimInfoを取得します。
パラメータグループ関数
timm.optim.param_groups_weight_decay
< source >( model: Moduleweight_decay: typing.Optional[float] = 1e-05weight_decay_exclude_1d: bool = Trueno_weight_decay_list: typing.Collection[str] = ()fallback_list: typing.Collection[str] = ()fallback_no_weight_decay: bool = False )
timm.optim.param_groups_layer_decay
< source >( model: Moduleweight_decay: float = 0.05no_weight_decay_list: typing.Collection[str] = ()fallback_list: typing.Collection[str] = ()fallback_no_weight_decay: bool = Falseweight_decay_exclude_1d: bool = Truelayer_decay: float = 0.75min_scale: float = 0.0no_opt_scale: typing.Optional[float] = Noneverbose: bool = False )
レイヤーごとのlr減衰およびweight decay用のパラメータグループ BEiTに基づいています: https://github.com/microsoft/unilm/blob/master/beit/optim_factory.py#L58
オプティマイザークラス
class timm.optim.AdaBelief
< source >( paramslr = 0.001betas = (0.9, 0.999)eps = 1e-16weight_decay = 0amsgrad = Falsedecoupled_decay = Truefixed_decay = Falserectify = Truedegenerated_to_sgd = Trueforeach: typing.Optional[bool] = None )
パラメータ
- params (iterable) — 最適化対象のパラメータのイテラブル、またはパラメータグループを定義する辞書
- lr (float, 任意) — 学習率 (デフォルト: 1e-3)
- betas (Tuple[float, float], optional) — 勾配とその二乗の移動平均を計算するために使用される係数(デフォルト: (0.9, 0.999))
- eps (float, 任意) — 数値の安定性を高めるために分母に追加される項 (デフォルト: 1e-16)
- weight_decay (float, 任意) — ウェイトディケイ(L2ペナルティ)(デフォルト: 0)
- amsgrad (boolean, 任意) —
On the Convergence of Adam and Beyond_ の論文にあるこのアルゴリズムの AMSGrad 変種を使用するかどうか (デフォルト: False) - decoupled_decay (boolean, 任意) — (デフォルト: True) True に設定すると、オプティマイザーは AdamW と同様に decoupled weight decay を使用します。
- fixed_decay (boolean, 任意) — (デフォルト: False) weightdecouple が True に設定されている場合に使用されます。 fixed_decay == True の場合、重み減衰は $W{new} = W{old} - W{old} \times decay$ として実行されます。 fixeddecay == False の場合、重み減衰は $W{new} = W{old} - W{old} \times decay \times lr$ として実行されます。この場合、 重み減衰の比率は学習率 (lr) に応じて減少することに注意してください。
- rectify (boolean, 任意) — (デフォルト: True) True に設定すると、RAdam に似た rectified アップデートを実行します
- degenerated_to_sgd (boolean, optional) (デフォルト —True) True に設定すると、勾配の分散が高い場合に SGD 更新を実行します
- foreach (boolean, 任意) — デフォルトでは (None) として使用されますが、サポートされていない場合は使用されません。foreach (マルチテンソル) 実装を使用します。
AdaBeliefアルゴリズムを実装します。PyTorchのAdamから変更を加えたものです。
reference: AdaBelief Optimizer, 観測された勾配に対する信頼度に応じてステップサイズを適応させる手法, NeurIPS 2020
推奨ハイパーパラメータの完全な表については、https://github.com/juntang-zhuang/Adabelief-Optimizer’を参照してください。例えば、EfficientNetのtrain/argsについては、これらのgistを参照してください。
- train_scriptへのリンク: https://gist.github.com/juntang-zhuang/0a501dd51c02278d952cf159bc233037
- args.yamlへのリンク: https://gist.github.com/juntang-zhuang/517ce3c27022b908bb93f78e4f786dc3
単一の最適化ステップを実行します。
クラス timm.optim.Adafactor
< source >( params: ParamsTlr: typing.Optional[float] = Noneeps: float = 1e-30eps_scale: float = 0.001clip_threshold: float = 1.0decay_rate: float = -0.8betas: typing.Optional[typing.Tuple[float, float]] = Noneweight_decay: float = 0.0scale_parameter: bool = Truewarmup_init: bool = Falsemin_dim_size_to_factor: int = 16caution: bool = False )
Adafactorアルゴリズムを実装します。
この実装は、Adafactor: Adaptive Learning Rates with Sublinear Memory Cost(https://arxiv.org/abs/1804.04235を参照)に基づいています。
このオプティマイザーは、scale_parameter、relative_step、warmup_initのオプションに基づいて、内部で学習率を調整することに注意してください。
lrが設定されている場合(その場合relative_stepはFalseになります)、手動(外部)の学習率スケジュールが使用されます。
なお、この実装では、fairseq / HF Transformersとは異なり、scale_parameterとwarmup_initは相対ステップの学習率(lr=None)にのみ適用され、パラメータRMSスケーリングは外部の学習率には適用されません。
Ags: params: 最適化対象のパラメータのイテラブル、またはパラメータグループを定義する辞書 lr: 外部の学習率 eps: 二乗勾配およびパラメータスケールに対する正則化定数 eps_scale: パラメータスケールに対する正則化定数 clip_threshold: 最終的な勾配更新の二乗平均平方根の閾値 decay_rate: 二乗勾配の移動平均を計算するために使用される係数 beta1: 勾配の移動平均を計算するために使用される係数 weight_decay: 重み減衰 scale_parameter: True の場合、相対ステップの学習率がパラメータの二乗平均平方根によってスケーリングされます warmup_init: 時間依存の学習率の計算は、ウォームアップ初期化が使用されているかどうかによって異なります
単一の最適化ステップを実行します。
クラス timm.optim.AdafactorBigVision
< source >( params: ParamsTlr: float = 1.0min_dim_size_to_factor: int = 16decay_rate: float = 0.8decay_offset: int = 0beta2_cap: float = 0.999momentum: typing.Optional[float] = 0.9momentum_dtype: typing.Union[str, torch.dtype] = torch.bfloat16eps: typing.Optional[float] = Noneweight_decay: float = 0.0clipping_threshold: typing.Optional[float] = Noneunscaled_wd: bool = Falsecaution: bool = Falsecorrected_weight_decay: bool = False )
PyTorchによるBigVisionのAdafactorバリアントの実装。単一テンソルおよび複数テンソルの両方の実装を提供します。
Ross Wightman 氏による https://github.com/google-research/big_vision を改変
クラス timm.optim.Adahessian
< source >( paramslr = 0.1betas = (0.9, 0.999)eps = 1e-08weight_decay = 0.0hessian_power = 1.0update_each = 1n_samples = 1avg_conv_kernel = False )
パラメータ
- params (iterable) — 最適化対象のパラメータのイテラブル、またはパラメータグループを定義する辞書
- lr (float, 任意) — 学習率(デフォルト: 0.1)
- betas ((float, float), optional) — 勾配および二階導関数トレースの移動平均を計算するために使用される係数(デフォルト: (0.9, 0.999))
- eps (float, 任意) — 数値の安定性を高めるために分母に追加される項 (デフォルト: 1e-8)
- weight_decay (float, 任意) — ウェイトディケイ(L2ペナルティ)(デフォルト: 0.0)
- hessian_power (float, 任意) — ヘッセ行列のトレースの指数(デフォルト: 1.0)
- update_each (int, 任意) — 時間節約のため、このステップ数ごとにヘッシアン行列のトレース近似を計算する (デフォルト: 1)
- n_samples (int, 任意) — ヘッセ行列のトレースの近似のために
zをサンプリングする回数 (デフォルト: 1)
Implements the AdaHessian algorithm from “ADAHESSIAN: An Adaptive Second OrderOptimizer for Machine Learning”
勾配を持つすべてのparam_groups内のすべてのパラメータを取得します
HessianのトレースのHutchinson近似を計算し、各学習可能なパラメータについて累積します。
ステップ
< source >( closure = None )
単一の最適化ステップを実行します。
蓄積されたヘッセ行列のトレースをゼロにします。
クラス timm.optim.AdamP
< source >( paramslr = 0.001betas = (0.9, 0.999)eps = 1e-08weight_decay = 0delta = 0.1wd_ratio = 0.1nesterov = Falsecaution = False )
クラス timm.optim.AdamWLegacy
< source >( params: ParamsTlr: float = 0.001betas: typing.Tuple[float, float] = (0.9, 0.999)eps: float = 1e-08weight_decay: float = 0.01amsgrad: bool = Falsecaution: bool = Falsecorrected_weight_decay: bool = Falsemaximize: bool = Falseforeach: typing.Optional[bool] = Nonecapturable: bool = Falseclipping_threshold: typing.Optional[float] = None )
パラメータ
- params — 最適化対象のパラメータのイテラブル、またはパラメータグループを定義する辞書
- lr — 学習率
- betas — 勾配とその二乗の移動平均を計算するために使用される係数
- eps — 数値の安定性を高めるために分母に追加される項
- weight_decay — 重み減衰係数
- amsgrad — 論文
On the Convergence of Adam and BeyondのAMSGradバリアントを使用するかどうか - caution — AdamW を使用する際は注意してください
- corrected_weight_decay — 補正済みウェイトディケイ(lr**2 / max_lr)を適用します
- maximize — 最小化ではなく、目的関数に基づいてパラメータを最大化します
- foreach — whether foreach implementation of optimizer is used. If unspecified by the user (so foreach is None), we will try to use foreach over for-loop implementation on CUDA, since it is faster in general.
- capturable — このインスタンスが CUDA グラフでキャプチャしても安全かどうかを指定します。True を渡すと、グラフ化されていない場合のパフォーマンスが低下する可能性があるため、このインスタンスをグラフキャプチャする予定がない場合は、False のままにしてください。
- clipping_threshold — RMS 更新クリッピングの閾値 (StableAdamW, https://arxiv.org/abs/2304.13013)。更新量は 1 / max(1, rms / clipping_threshold) 倍にスケーリングされます。ここで rms は grad / (sqrt(v_hat) + eps) の RMS です。2 階モーメント推定値に対する勾配の急激な増加に対して、パラメータの更新を減衰させます。論文に従い 1.0、None (デフォルト) で無効化します。Adafactor と同様に、デカップルされた重み減衰はクリッピングされません (StableAdamW は減衰もクリッピングされた lr でスケーリングします)。
AdamWアルゴリズムを実装します。
NOTE: この実装はtorch.optim.AdamWに置き換えられ、参考用として残されています
参考文献:
- Adam: A Method for Stochastic Optimization: https://arxiv.org/abs/1412.6980
- Decoupled Weight Decay Regularization: https://arxiv.org/abs/1711.05101
- Adamの収束とそれについて: https://openreview.net/forum?id=ryQu7f-RZ
単一の最適化ステップを実行します。
class timm.optim.Adan
< source >( paramslr: float = 0.001betas: typing.Tuple[float, float, float] = (0.98, 0.92, 0.99)eps: float = 1e-08weight_decay: float = 0.0no_prox: bool = Falsecaution: bool = Falseforeach: typing.Optional[bool] = None )
PyTorch版のAdanを実装します。
Adan は、Adan: Adaptive Nesterov Momentum Algorithm for Faster Optimizing Deep Models https://arxiv.org/abs/2208.06677 で提案されました。
単一の最適化ステップを実行します。
クラス timm.optim.Adopt
< source >( params: ParamsTlr: typing.Union[float, torch.Tensor] = 0.001betas: typing.Tuple[float, float] = (0.9, 0.9999)eps: float = 1e-06clip_exp: typing.Optional[float] = 0.333weight_decay: float = 0.0decoupled: bool = Falsecorrected_weight_decay: bool = Falsecaution: bool = Falseforeach: typing.Optional[bool] = Nonemaximize: bool = Falsecapturable: bool = Falsedifferentiable: bool = False )
ADOPT: 最適なレートで任意のβ2に対して収束する修正版Adam: https://arxiv.org/abs/2411.02853
単一の最適化ステップを実行します。
class timm.optim.kron.Kron
< source >( params: ParamsTlr: float = 0.001momentum: float = 0.9weight_decay: float = 0.0preconditioner_update_probability: typing.Union[typing.Callable, float, NoneType] = Nonemax_size_triangular: int = 2048min_ndim_triangular: int = 2memory_save_mode: typing.Optional[str] = Nonemomentum_into_precond_update: bool = Trueprecond_lr: float = 0.1precond_init_scale: float = 1.0mu_dtype: typing.Optional[torch.dtype] = Noneprecond_dtype: typing.Optional[torch.dtype] = Nonedecoupled_decay: bool = Falsecorrected_weight_decay: bool = Falseflatten: bool = Falseflatten_start_dim: int = 2flatten_end_dim: int = -1stochastic_weight_decay: bool = Falsedeterministic: bool = False )
パラメータ
- params — 最適化対象のパラメータのイテラブル、またはパラメータグループを定義する辞書。
- lr — 学習率。
- momentum — モメンタムパラメータ。
- weight_decay — 重みの減衰。
- preconditioner_update_probability — 事前条件付き行列を更新する確率。 None の場合、4000 ステップで 1.0 から 0.03 へ減衰するスケジュールがデフォルトとして使用されます。
- max_size_triangular — dim の事前条件付け子が三角行列となる最大サイズ。
- min_ndim_triangular — 層が三角事前条件付き変換を持つために必要な最小の次元数。
- memory_save_mode — ‘one_diag’、‘smart_one_diag’、または ‘all_diag’。デフォルトは None です。すべてのプリコンディショナーを三角行列に設定するには、‘one_diag’ は各レイヤーの最大または最後の次元を対角行列に設定し、‘all_diag’ はすべてのプリコンディショナーを対角行列に設定します。
- momentum_into_precond_update — 生の勾配ではなく、モーメンタムを事前条件付けの更新に送るかどうか。
- mu_dtype — 運動量アクセルレータの Dtype。
- precond_dtype — 前処理子の Dtype。
- decoupled_decay — AdamW 形式のデカップルされた重み減衰
- corrected_weight_decay — decoupled_decay を使用する場合に、補正されたウェイトディケイ (lr**2 / max_lr) を適用します
- flatten — 高ランクのパラメータに対して式に完全に依存するのではなく、次元をフラットにします
- flatten_start_dim — フラット化範囲の開始位置。デフォルトは 2 です。ConvNets に対して良いトレードオフのようです。
- flatten_end_dim — フラット化範囲の終了位置。デフォルトは -1 です。
- stochastic_weight_decay — 重み減衰のランダムな変調を有効にします
- deterministic — 保存/読み込み(再開)時の決定論的な動作。FIXME 遅く、改善が必要
https://github.com/lixilinx/psgd_torch の PSGD Kron を実装します。
クラス timm.optim.Lamb
< source >( params: ParamsTlr: float = 0.001bias_correction: bool = Truebetas: typing.Tuple[float, float] = (0.9, 0.999)eps: float = 1e-06weight_decay: float = 0.01grad_averaging: bool = Truemax_grad_norm: typing.Optional[float] = 1.0trust_clip: bool = Falsealways_adapt: bool = Falsecaution: bool = Falsedecoupled_decay: bool = Falsecorrected_weight_decay: bool = Falseforeach: typing.Optional[bool] = None )
パラメータ
- params — 最適化対象のパラメータのイテラブル、またはパラメータグループを定義する辞書。
- lr — 学習率
- betas — 勾配とそのノルムの移動平均を計算するために使用される係数。
- eps — 数値の安定性を高めるために分母に追加される項。
- weight_decay — 重み減衰
- grad_averaging — グラディエントの移動平均を計算する際に、grad に (1-beta2) を適用するかどうか。
- max_grad_norm — グローバルな勾配ノルムをクリップするために使用される値。
- trust_clip — LAMBCの信頼度比のクリッピングを有効にします。
- always_adapt — 0.0のweight decayパラメータに適応型学習率を適用します。
- caution — 注意してください。
- decoupled — 分離型ウェイトディケイを適用します
- corrected_weight_decay — decoupled_decay を使用する場合、修正されたウェイトディケイ (lr**2 / max_lr) を適用します
- foreach — foreach(マルチテンソル)実装を使用します。デフォルト(None)では、サポートされていない場合を除き、これを使用します
apex.optimizers.FusedLAMB の FuseLAMB (NvLamb 変種) オプティマイザーの純粋な PyTorch 実装です。 参考: https://github.com/NVIDIA/DeepLearningExamples/blob/master/PyTorch/LanguageModeling/Transformer-XL/pytorch/lamb.py
LAMBは次の論文で提案されました:
- 深層学習のための大バッチ最適化 - 76分でBERTをトレーニングする: https://arxiv.org/abs/1904.00962
- Adamの収束とそれについて: https://openreview.net/forum?id=ryQu7f-RZ
単一の最適化ステップを実行します。
class timm.optim.LaProp
< source >( params: ParamsTlr: float = 0.0004betas: typing.Tuple[float, float] = (0.9, 0.999)eps: float = 1e-15weight_decay: float = 0.0caution: bool = Falsecorrected_weight_decay: bool = Falseforeach: typing.Optional[bool] = None )
LaProp Optimizer
論文: LaProp: Separating Momentum and Adaptivity in Adam, https://arxiv.org/abs/2002.04839
単一の最適化ステップを実行します。
class timm.optim.Lars
< source >( paramslr = 1.0momentum = 0dampening = 0weight_decay = 0nesterov = Falsetrust_coeff = 0.001eps = 1e-08trust_clip = Falsealways_adapt = Falseforeach: typing.Optional[bool] = None )
パラメータ
- params (iterable) — 最適化対象のパラメータのイテラブル、またはパラメータグループを定義する辞書のリスト。
- lr (float, 任意) — 学習率(デフォルト: 1.0)。
- momentum (float, 任意) — モメンタム係数 (デフォルト: 0)
- weight_decay (float, 任意) — ウェイトディケイ(L2ペナルティ)(デフォルト: 0)
- dampening (float, 任意) — モメンタムの減衰係数 (デフォルト: 0)
- nesterov (bool, 任意) — Nesterovモーメンタムを有効にします(デフォルト: False)
- trust_coeff (float) — 適応 lr / trust_ratio を計算するための信頼係数(デフォルト: 0.001)
- eps (float) — 除算の分母に使用される eps (デフォルト: 1e-8)
- trust_clip (bool) — LARCの信頼比クリッピングを有効にします(デフォルト: False)
- always_adapt (bool) — LARS LR adapt を常に適用します。False の場合、group の weight_decay が 0 以外の場合にのみ適用されます(デフォルト: False)
- foreach (bool, 任意) — デフォルトでは (None) として使用されますが、サポートされていない場合は使用されません。foreach (マルチテンソル) 実装を使用します。
PyTorch用LARS
論文: Large batch training of Convolutional Networks - https://arxiv.org/pdf/1708.03888.pdf
単一の最適化ステップを実行します。
class timm.optim.Lion
< source >( params: ParamsTlr: float = 0.0001betas: typing.Tuple[float, float] = (0.9, 0.99)weight_decay: float = 0.0caution: bool = Falsecorrected_weight_decay: bool = Falsemaximize: bool = Falseforeach: typing.Optional[bool] = None )
Lionアルゴリズムを実装します。
単一の最適化ステップを実行します。
クラス timm.optim.MADGRAD
< source >( params: typing.Anylr: float = 0.01momentum: float = 0.9weight_decay: float = 0eps: float = 1e-06decoupled_decay: bool = False )
MADGRAD_: 確率的最適化のためのモーメンタム化・適応型・デュアル平均化勾配法
.. _MADGRAD: https://arxiv.org/abs/2101.11075
MADGRADは汎用オプティマイザーであり、SGDやAdamの代わりに使用できます。収束が速く、汎化性能が向上する可能性があります。現在、GPUのみ対応しています。 通常、SGDやAdamで使用されるのと同じ学習率スケジュールを使用できます。ただし、全体の学習率はどちらの方法とも比較できず、ハイパーパラメータの探索によって決定する必要があります。
MADGRADは他の手法よりも少ないウェイトディケイで済むことが多く、ゼロで十分な場合もあります。SGDやAdamのbeta1に使用されるモーメンタムの値が、ここでも機能します。
スパースな問題では、weight_decayとmomentumの両方を0に設定する必要があります。
ステップ
< source >( closure: typing.Optional[typing.Callable[[], float]] = None )
単一の最適化ステップを実行します。
class timm.optim.Mars
< source >( params: ParamsTlr: float = 0.003betas: typing.Tuple[float, float] = (0.9, 0.99)eps: float = 1e-08weight_decay: float = 0.0gamma: float = 0.025mars_type: str = 'adamw'optimize_1d: bool = Falselr_1d_factor: float = 1.0betas_1d: typing.Optional[typing.Tuple[float, float]] = Nonecaution: bool = False )
MARS Optimizer
論文: MARS: 大規模モデルのトレーニングにおける分散削減の力を解き放つ https://arxiv.org/abs/2411.10438
単一の最適化ステップを実行します。
クラス timm.optim.Muon
< source >( params: ParamsTlr: float = 0.02weight_decay: float = 0momentum: float = 0.95nesterov: bool = Falsens_steps: int = 5ns_coefficients: typing.Union[str, typing.Tuple[float, float, float], typing.List[typing.Tuple[float, float, float]]] = 'quintic'eps: float = 1e-07safety_factor: float = 1.0adjust_lr_fn: typing.Optional[str] = 'match_rms_adamw'conv_mode: str = 'flatten'normalize_spatial: bool = Trueadamw_lr: typing.Optional[float] = Nonefallback_lr_scale: float = 1.0betas: typing.Tuple[float, float] = (0.9, 0.95)algo: str = 'muon'scale_eps: bool = Falsecapturable: bool = Falseverbose: bool = False )
Muon - Newton-schulzによるモーメンタムの直交化
2D以上のパラメータ(重み行列)にはMuonを、1Dのパラメータ(バイアス、ノーム)および‘use_fallback=True’が設定されている(互換性のために‘use_muon=False’)パラメータグループにはAdamWを組み合わせます。
2つのアルゴリズムをサポートします:
- “muon”: モメンタムと直交化を備えた標準的なMuonアルゴリズム
- “adamuon”: 直交化された方向に対して要素ごとの2次モーメント推定を追加し、Adam同様の適応的スケーリングを行うAdaMuonアルゴリズム
単一の最適化ステップを実行します。
クラス timm.optim.NAdamLegacy
< source >( paramslr = 0.002betas = (0.9, 0.999)eps = 1e-08weight_decay = 0schedule_decay = 0.004 )
パラメータ
- params (iterable) — 最適化対象のパラメータのイテラブル、またはパラメータグループを定義する辞書
- lr (float, 任意) — 学習率 (デフォルト: 2e-3)
- betas (Tuple[float, float], optional) — 勾配とその二乗の移動平均を計算するために使用される係数
- eps (float, 任意) — 数値の安定性を高めるために分母に追加される項 (デフォルト: 1e-8)
- weight_decay (float, 任意) — ウェイトディケイ(L2ペナルティ)(デフォルト: 0)
- schedule_decay (float, 任意) — モメンタムスケジュールの減衰(デフォルト: 4e-3)
Nadamアルゴリズム(Nesterovモーメンタムに基づくAdamのバリアント)を実装します。
NOTE: この実装はtorch.optim.NAdamに置き換えられ、非推奨となりました。参考として残されています。
Incorporating Nesterov Momentum into Adam__ で提案されています。
http://cs229.stanford.edu/proj2015/054_report.pdf http://www.cs.toronto.edu/~fritz/absps/momentum.pdf
元の出典: https://github.com/pytorch/pytorch/pull/1408 注: 潜在的な問題がある可能性がありますが、一部の課題では良好に動作します。
単一の最適化ステップを実行します。
クラス timm.optim.NAdamW
< source >( params: ParamsTlr: float = 0.001betas: typing.Tuple[float, float] = (0.9, 0.999)eps: float = 1e-08weight_decay: float = 0.01caution: bool = Falsecorrected_weight_decay: bool = Falsemaximize: bool = Falseforeach: typing.Optional[bool] = Nonecapturable: bool = Falseclipping_threshold: typing.Optional[float] = None )
パラメータ
- params — 最適化対象のパラメータのイテラブル、またはパラメータグループを定義する辞書
- lr — 学習率
- betas — 勾配とその二乗の移動平均を計算するために使用される係数
- eps — 数値の安定性を高めるために分母に追加される項
- weight_decay — 重み減衰係数
- caution — 注意を有効にする
- corrected_weight_decay — 補正済みウェイトディケイ(lr**2 / max_lr)を適用します
- maximize — 最小化ではなく、目的関数に基づいてパラメータを最大化します
- foreach — オプティマイザーの foreach 実装が使用されるかどうか。未指定(None)の場合、CUDA(foreach カーネルを持つデバイス)では、一般的に高速であるため、foreach 実装が使用されます。
- capturable — このインスタンスが CUDA グラフ内でキャプチャしても安全かどうか
- clipping_threshold — RMS 更新クリッピングの閾値 (StableAdamW, https://arxiv.org/abs/2304.13013)。更新量は 1 / max(1, rms / clipping_threshold) 倍にスケーリングされます。ここで rms は grad / (sqrt(v_hat) + eps) の RMS です。2 階モーメント推定値に対する勾配の急激な増加に対して、パラメータの更新を減衰させます。論文に従い 1.0、None (デフォルト) で無効化します。Adafactor と同様に、デカップルされた重み減衰はクリッピングされません (StableAdamW は減衰もクリッピングされた lr でスケーリングします)。
NAdamWアルゴリズムを実装します。
NAdamアルゴリズムの実装については、https://arxiv.org/abs/1910.05446のTable 1を参照してください(コード内には、NAdamWとAdamWの唯一の違いを強調するコメントも記載されています)。
アルゴリズムの詳細については、
- Decoupled Weight Decay Regularization: https://arxiv.org/abs/1711.05101
- Adamの収束とそれについて: https://openreview.net/forum?id=ryQu7f-RZ
単一の最適化ステップを実行します。
クラス timm.optim.NvNovoGrad
< source >( paramslr = 0.001betas = (0.95, 0.98)eps = 1e-08weight_decay = 0grad_averaging = Falseamsgrad = Falsedecoupled_decay = Falsecorrected_weight_decay = False )
パラメータ
- params (iterable) — 最適化対象のパラメータのイテラブル、またはパラメータグループを定義する辞書
- lr (float, 任意) — 学習率 (デフォルト: 1e-3)
- betas (Tuple[float, float], optional) — 勾配とその二乗の移動平均を計算するために使用される係数(デフォルト: (0.95, 0.98))
- eps (float, 任意) — 数値の安定性を高めるために分母に追加される項 (デフォルト: 1e-8)
- weight_decay (float, 任意) — ウェイトディケイ(L2ペナルティ)(デフォルト: 0)
- grad_averaging — グラディエント平均
- amsgrad (boolean, 任意) —
On the Convergence of Adam and Beyond_ の論文にあるこのアルゴリズムの AMSGrad 変種を使用するかどうか (デフォルト: False) - decoupled_decay — モメンタム更新の前に正規化された勾配に重み減衰を加えるのではなく(論文の手法)、重み減衰を重みに直接適用します(ステップごとに lr * weight_decay)。
- corrected_weight_decay — apply corrected weight decay (lr**2 / max_lr) when decoupled_decay is True
Novogradアルゴリズムを実装します。
単一の最適化ステップを実行します。
クラス timm.optim.RAdamLegacy
< source >( paramslr = 0.001betas = (0.9, 0.999)eps = 1e-08weight_decay = 0 )
PyTorch RAdamオプティマイザー
NOTE: この実装はtorch.optim.AdamWに置き換えられ、参考用として残されています
クラス timm.optim.RMSpropTF
< source >( params: ParamsTlr: float = 0.01alpha: float = 0.9eps: float = 1e-10weight_decay: float = 0momentum: float = 0.0centered: bool = Falsedecoupled_decay: bool = Falsecorrected_weight_decay: bool = Falselr_in_momentum: bool = Truecaution: bool = Falseforeach: typing.Optional[bool] = None )
パラメータ
- params — 最適化対象のパラメータのイテラブル、またはパラメータグループを定義する辞書
- lr — 学習率
- momentum — モメンタム係数
- alpha — スムージング(減衰)定数
- eps — 数値の安定性を高めるために分母に追加される項
- centered —
Trueの場合、中央値を基準としたRMSPropを計算し、勾配はその分散の推定値で正規化されます - weight_decay — ウェイトディケイ(L2ペナルティ)(デフォルト: 0)
- decoupled_decay — https://arxiv.org/abs/1711.05101 に従う decoupled weight decay
- corrected_weight_decay — apply corrected weight decay (lr**2 / max_lr) when decoupled_decay is True
- lr_in_momentum — Tensorflow のデフォルトに従い、モーメンタムバッファの更新に学習率のスケーリングが含まれます
- caution — 注意
- foreach — foreach (マルチテンソル) 実装を使用します。デフォルトでは (None) が使用されますが、サポートされていない場合は除きます (rmsprop_tf() を参照)
RMSpropアルゴリズムを実装します(TensorFlowスタイルのepsilon)
NOTE: これは、PyTorchのRMSpropをそのままコピーし、sqrtの前にepsを適用するなどの、Tensorflowのハイパーパラメータに近づけるためのいくつかの修正を加えたものです。
主な変更点は以下の通りです:
- 平方根の内部に適用されるEpsilon
- square_avg は 1 で初期化
- モーメンタムバッファに蓄積された更新のLRスケーリング
G. Hinton によるコースで提案されました。
中央揃えのバージョンは、Recurrent Neural Networksによるシーケンス生成で初めて登場します。
単一の最適化ステップを実行します。
class timm.optim.SGDP
< source >( paramslr = torch.optim.optimizer.requiredmomentum = 0dampening = 0weight_decay = 0nesterov = Falseeps = 1e-08delta = 0.1wd_ratio = 0.1caution = False )
クラス timm.optim.SGDW
< source >( params: ParamsTlr: float = 0.001momentum: float = 0.0dampening: float = 0.0weight_decay: float = 0.0nesterov: bool = Falsecaution: bool = Falsecorrected_weight_decay: bool = Falsemaximize: bool = Falseforeach: typing.Optional[bool] = Nonedifferentiable: bool = False )
単一の最適化ステップを実行します。