pytorch-optimizer 3.6.1__tar.gz → 3.7.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/PKG-INFO +7 -4
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/README.md +5 -2
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pyproject.toml +20 -17
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/__init__.py +5 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/base/optimizer.py +8 -3
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/__init__.py +8 -1
- pytorch_optimizer-3.7.0/pytorch_optimizer/optimizer/emonavi.py +441 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/muon.py +256 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/psgd.py +2 -2
- pytorch_optimizer-3.7.0/pytorch_optimizer/optimizer/splus.py +215 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/LICENSE +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/base/__init__.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/base/exception.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/base/scheduler.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/base/type.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/loss/__init__.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/loss/bi_tempered.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/loss/cross_entropy.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/loss/dice.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/loss/f1.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/loss/focal.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/loss/jaccard.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/loss/ldam.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/loss/lovasz.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/loss/tversky.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/lr_scheduler/__init__.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/lr_scheduler/chebyshev.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/lr_scheduler/cosine_anealing.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/lr_scheduler/experimental/__init__.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/lr_scheduler/experimental/deberta_v3_lr_scheduler.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/lr_scheduler/linear_warmup.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/lr_scheduler/proportion.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/lr_scheduler/rex.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/lr_scheduler/wsd.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/a2grad.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adabelief.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adabound.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adadelta.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adafactor.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adagc.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adahessian.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adai.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adalite.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adam_mini.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adamax.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adamc.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adamg.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adamod.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adamp.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adams.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adamw.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adan.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adanorm.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adapnm.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adashift.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adasmooth.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/ademamix.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adopt.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/agc.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/aggmo.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/aida.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/alig.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/amos.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/apollo.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/avagrad.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/came.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/dadapt.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/demo.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/diffgrad.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/exadam.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/experimental/__init__.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/experimental/ranger25.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/fadam.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/fira.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/focus.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/fp16.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/fromage.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/ftrl.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/galore.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/galore_utils.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/gradient_centralization.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/grams.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/gravity.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/grokfast.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/kate.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/lamb.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/laprop.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/lars.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/lion.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/lomo.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/lookahead.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/madgrad.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/mars.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/msvag.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/nero.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/novograd.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/orthograd.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/padam.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/pcgrad.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/pid.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/pnm.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/prodigy.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/psgd_utils.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/qhadam.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/qhm.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/racs.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/radam.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/ranger.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/ranger21.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/rotograd.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/sam.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/schedulefree.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/scion.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/sgd.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/shampoo.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/shampoo_utils.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/sm3.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/snsm.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/soap.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/sophia.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/spam.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/srmm.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/swats.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/tam.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/tiger.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/trac.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/utils.py +0 -0
- {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/yogi.py +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: pytorch_optimizer
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.7.0
|
|
4
4
|
Summary: optimizer & lr scheduler & objective function collections in PyTorch
|
|
5
5
|
License: Apache-2.0
|
|
6
|
-
Keywords: pytorch,deep-learning,optimizer,lr scheduler,A2Grad,Alice,ASGD,AccSGD,AdaBelief,AdaBound,AdaDelta,AdaFactor,AdaGC,AdaMax,AdamG,AdaMod,AdaNorm,AdaPNM,AdaSmooth,AdEMAMix,Simplified-AdEMAMix,ADOPT,AdaHessian,Adai,Adalite,AdaLomo,AdamMini,AdamP,AdamS,Adan,AggMo,Aida,AliG,Amos,Apollo,APOLLO,AvaGrad,bSAM,CAME,DAdaptAdaGrad,DAdaptAdam,DAdaptAdan,DAdaptSGD,DAdaptLion,DeMo,DiffGrad,EXAdam,FAdam,Fira,FOCUS,Fromage,FTRL,GaLore,Grams,Gravity,GrokFast,GSAM,Kate,Lamb,LaProp,LARS,Lion,LOMO,Lookahead,MADGRAD,MARS,MSVAG,Muno,Nero,NovoGrad,OrthoGrad,PAdam,PCGrad,PID,PNM,Prodigy,PSGD,QHAdam,QHM,RACS,RAdam,Ranger,Ranger21,RotoGrad,SAM,GCSAM,LookSAM,ScheduleFreeSGD,ScheduleFreeAdamW,ScheduleFreeRAdam,SCION,SGDP,Shampoo,ScalableShampoo,SGDW,SignSGD,SM3,SOAP,SopihaH,SPAM,StableSPAM,SRMM,StableAdamW,SWATS,TAM,Tiger,TRAC,VSGD,WSAM,Yogi,BCE,BCEFocal,Focal,FocalCosine,SoftF1,Dice,LDAM,Jaccard,Bi-Tempered,Tversky,FocalTversky,LovaszHinge,bitsandbytes,WSD,QGaLore
|
|
6
|
+
Keywords: pytorch,deep-learning,optimizer,lr scheduler,A2Grad,Alice,ASGD,AccSGD,AdaBelief,AdaBound,AdaDelta,AdaFactor,AdaGC,AdaMax,AdaMuon,AdamG,AdaMod,AdaNorm,AdaPNM,AdaSmooth,AdEMAMix,Simplified-AdEMAMix,ADOPT,AdaHessian,Adai,Adalite,AdaLomo,AdamMini,AdamP,AdamS,Adan,AggMo,Aida,AliG,Amos,Apollo,APOLLO,AvaGrad,bSAM,CAME,DAdaptAdaGrad,DAdaptAdam,DAdaptAdan,DAdaptSGD,DAdaptLion,DeMo,DiffGrad,EmoFact,EmoLynx,EmoNavi,EXAdam,FAdam,Fira,FOCUS,Fromage,FTRL,GaLore,Grams,Gravity,GrokFast,GSAM,Kate,Lamb,LaProp,LARS,Lion,LOMO,Lookahead,MADGRAD,MARS,MSVAG,Muno,Nero,NovoGrad,OrthoGrad,PAdam,PCGrad,PID,PNM,Prodigy,PSGD,QHAdam,QHM,RACS,RAdam,Ranger,Ranger21,RotoGrad,SAM,GCSAM,LookSAM,ScheduleFreeSGD,ScheduleFreeAdamW,ScheduleFreeRAdam,SCION,SGDP,Shampoo,ScalableShampoo,SGDW,SignSGD,SM3,SOAP,SopihaH,SPAM,StableSPAM,SPlus,SRMM,StableAdamW,SWATS,TAM,Tiger,TRAC,VSGD,WSAM,Yogi,BCE,BCEFocal,Focal,FocalCosine,SoftF1,Dice,LDAM,Jaccard,Bi-Tempered,Tversky,FocalTversky,LovaszHinge,bitsandbytes,WSD,QGaLore
|
|
7
7
|
Author: kozistr
|
|
8
8
|
Author-email: kozistr@gmail.com
|
|
9
9
|
Maintainer: kozistr
|
|
@@ -48,7 +48,7 @@ Description-Content-Type: text/markdown
|
|
|
48
48
|
|
|
49
49
|
## The reasons why you use `pytorch-optimizer`.
|
|
50
50
|
|
|
51
|
-
* Wide range of supported optimizers. Currently, **
|
|
51
|
+
* Wide range of supported optimizers. Currently, **110 optimizers (+ `bitsandbytes`, `qgalore`, `torchao`)**, **16 lr schedulers**, and **13 loss functions** are supported!
|
|
52
52
|
* Including many variants such as `ADOPT`, `Cautious`, `AdamD`, `StableAdamW`, and `Gradient Centrailiaztion`
|
|
53
53
|
* Easy to use, clean, and tested codes
|
|
54
54
|
* Active maintenance
|
|
@@ -253,7 +253,10 @@ get_supported_optimizers(['adam*', 'ranger*'])
|
|
|
253
253
|
| RACS & Alice | *Towards Efficient Optimizer Design for LLM via Structured Fisher Approximation with a Low-Rank Extension* | | <https://arxiv.org/pdf/2502.07752> | [cite](https://ui.adsabs.harvard.edu/abs/2025arXiv250207752G/exportcitation) |
|
|
254
254
|
| VSGD | *Variational Stochastic Gradient Descent for Deep Neural Networks* | [github](https://github.com/generativeai-tue/vsgd) | <https://openreview.net/forum?id=xu4ATNjcdy> | [cite](https://github.com/generativeai-tue/vsgd/tree/main?tab=readme-ov-file#cite) |
|
|
255
255
|
| SNSM | *Subset-Norm and Subspace-Momentum: Faster Memory-Efficient Adaptive Optimization with Convergence Guarantees* | [github](https://github.com/timmytonga/sn-sm) | <https://arxiv.org/abs/2411.07120> | [cite](https://ui.adsabs.harvard.edu/abs/2024arXiv241107120N/exportcitation) |
|
|
256
|
-
| AdamC | Why Gradients Rapidly Increase Near the End of Training*
|
|
256
|
+
| AdamC | *Why Gradients Rapidly Increase Near the End of Training* | | <https://arxiv.org/abs/2506.02285> | [cite](https://ui.adsabs.harvard.edu/abs/2025arXiv250602285D/exportcitation) |
|
|
257
|
+
| AdaMuon | *Adaptive Muon Optimizer* | | <https://arxiv.org/abs/2507.11005v1> | [cite](https://ui.adsabs.harvard.edu/abs/2025arXiv250711005S/exportcitation) |
|
|
258
|
+
| SPlus | *A Stable Whitening Optimizer for Efficient Neural Network Training* | [github](https://github.com/kvfrans/splus) | <https://arxiv.org/abs/2506.07254> | [cite](https://ui.adsabs.harvard.edu/abs/2025arXiv250607254F/exportcitation) |
|
|
259
|
+
| EmoNavi | *An emotion-driven optimizer that feels loss and navigates accordingly.* | [github](https://github.com/muooon/EmoNavi) | | |
|
|
257
260
|
|
|
258
261
|
## Supported LR Scheduler
|
|
259
262
|
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
## The reasons why you use `pytorch-optimizer`.
|
|
12
12
|
|
|
13
|
-
* Wide range of supported optimizers. Currently, **
|
|
13
|
+
* Wide range of supported optimizers. Currently, **110 optimizers (+ `bitsandbytes`, `qgalore`, `torchao`)**, **16 lr schedulers**, and **13 loss functions** are supported!
|
|
14
14
|
* Including many variants such as `ADOPT`, `Cautious`, `AdamD`, `StableAdamW`, and `Gradient Centrailiaztion`
|
|
15
15
|
* Easy to use, clean, and tested codes
|
|
16
16
|
* Active maintenance
|
|
@@ -215,7 +215,10 @@ get_supported_optimizers(['adam*', 'ranger*'])
|
|
|
215
215
|
| RACS & Alice | *Towards Efficient Optimizer Design for LLM via Structured Fisher Approximation with a Low-Rank Extension* | | <https://arxiv.org/pdf/2502.07752> | [cite](https://ui.adsabs.harvard.edu/abs/2025arXiv250207752G/exportcitation) |
|
|
216
216
|
| VSGD | *Variational Stochastic Gradient Descent for Deep Neural Networks* | [github](https://github.com/generativeai-tue/vsgd) | <https://openreview.net/forum?id=xu4ATNjcdy> | [cite](https://github.com/generativeai-tue/vsgd/tree/main?tab=readme-ov-file#cite) |
|
|
217
217
|
| SNSM | *Subset-Norm and Subspace-Momentum: Faster Memory-Efficient Adaptive Optimization with Convergence Guarantees* | [github](https://github.com/timmytonga/sn-sm) | <https://arxiv.org/abs/2411.07120> | [cite](https://ui.adsabs.harvard.edu/abs/2024arXiv241107120N/exportcitation) |
|
|
218
|
-
| AdamC | Why Gradients Rapidly Increase Near the End of Training*
|
|
218
|
+
| AdamC | *Why Gradients Rapidly Increase Near the End of Training* | | <https://arxiv.org/abs/2506.02285> | [cite](https://ui.adsabs.harvard.edu/abs/2025arXiv250602285D/exportcitation) |
|
|
219
|
+
| AdaMuon | *Adaptive Muon Optimizer* | | <https://arxiv.org/abs/2507.11005v1> | [cite](https://ui.adsabs.harvard.edu/abs/2025arXiv250711005S/exportcitation) |
|
|
220
|
+
| SPlus | *A Stable Whitening Optimizer for Efficient Neural Network Training* | [github](https://github.com/kvfrans/splus) | <https://arxiv.org/abs/2506.07254> | [cite](https://ui.adsabs.harvard.edu/abs/2025arXiv250607254F/exportcitation) |
|
|
221
|
+
| EmoNavi | *An emotion-driven optimizer that feels loss and navigates accordingly.* | [github](https://github.com/muooon/EmoNavi) | | |
|
|
219
222
|
|
|
220
223
|
## Supported LR Scheduler
|
|
221
224
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "pytorch_optimizer"
|
|
3
|
-
version = "3.
|
|
3
|
+
version = "3.7.0"
|
|
4
4
|
description = "optimizer & lr scheduler & objective function collections in PyTorch"
|
|
5
5
|
license = "Apache-2.0"
|
|
6
6
|
authors = ["kozistr <kozistr@gmail.com>"]
|
|
@@ -11,18 +11,18 @@ repository = "https://github.com/kozistr/pytorch_optimizer"
|
|
|
11
11
|
documentation = "https://pytorch-optimizers.readthedocs.io/en/latest"
|
|
12
12
|
keywords = [
|
|
13
13
|
"pytorch", "deep-learning", "optimizer", "lr scheduler", "A2Grad", "Alice", "ASGD", "AccSGD", "AdaBelief",
|
|
14
|
-
"AdaBound", "AdaDelta", "AdaFactor", "AdaGC", "AdaMax", "AdamG", "AdaMod", "AdaNorm", "AdaPNM",
|
|
15
|
-
"AdEMAMix", "Simplified-AdEMAMix", "ADOPT", "AdaHessian", "Adai", "Adalite", "AdaLomo", "AdamMini",
|
|
16
|
-
"AdamS", "Adan", "AggMo", "Aida", "AliG", "Amos", "Apollo", "APOLLO", "AvaGrad", "bSAM", "CAME",
|
|
17
|
-
"DAdaptAdam", "DAdaptAdan", "DAdaptSGD", "DAdaptLion", "DeMo", "DiffGrad", "
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"QGaLore",
|
|
14
|
+
"AdaBound", "AdaDelta", "AdaFactor", "AdaGC", "AdaMax", "AdaMuon", "AdamG", "AdaMod", "AdaNorm", "AdaPNM",
|
|
15
|
+
"AdaSmooth", "AdEMAMix", "Simplified-AdEMAMix", "ADOPT", "AdaHessian", "Adai", "Adalite", "AdaLomo", "AdamMini",
|
|
16
|
+
"AdamP", "AdamS", "Adan", "AggMo", "Aida", "AliG", "Amos", "Apollo", "APOLLO", "AvaGrad", "bSAM", "CAME",
|
|
17
|
+
"DAdaptAdaGrad", "DAdaptAdam", "DAdaptAdan", "DAdaptSGD", "DAdaptLion", "DeMo", "DiffGrad", "EmoFact", "EmoLynx",
|
|
18
|
+
"EmoNavi", "EXAdam", "FAdam", "Fira", "FOCUS", "Fromage", "FTRL", "GaLore", "Grams", "Gravity", "GrokFast", "GSAM",
|
|
19
|
+
"Kate", "Lamb", "LaProp", "LARS", "Lion", "LOMO", "Lookahead", "MADGRAD", "MARS", "MSVAG", "Muno", "Nero",
|
|
20
|
+
"NovoGrad", "OrthoGrad", "PAdam", "PCGrad", "PID", "PNM", "Prodigy", "PSGD", "QHAdam", "QHM", "RACS", "RAdam",
|
|
21
|
+
"Ranger", "Ranger21", "RotoGrad", "SAM", "GCSAM", "LookSAM", "ScheduleFreeSGD", "ScheduleFreeAdamW",
|
|
22
|
+
"ScheduleFreeRAdam", "SCION", "SGDP", "Shampoo", "ScalableShampoo", "SGDW", "SignSGD", "SM3", "SOAP", "SopihaH",
|
|
23
|
+
"SPAM", "StableSPAM", "SPlus", "SRMM", "StableAdamW", "SWATS", "TAM", "Tiger", "TRAC", "VSGD", "WSAM", "Yogi",
|
|
24
|
+
"BCE", "BCEFocal", "Focal", "FocalCosine", "SoftF1", "Dice", "LDAM", "Jaccard", "Bi-Tempered", "Tversky",
|
|
25
|
+
"FocalTversky", "LovaszHinge", "bitsandbytes", "WSD", "QGaLore",
|
|
26
26
|
]
|
|
27
27
|
classifiers = [
|
|
28
28
|
"License :: OSI Approved :: Apache Software License",
|
|
@@ -65,9 +65,12 @@ black = [
|
|
|
65
65
|
{ version = "<25", python = "<3.9" },
|
|
66
66
|
{ version = "^25", python = ">=3.9" },
|
|
67
67
|
]
|
|
68
|
-
ruff = "
|
|
69
|
-
pytest = "
|
|
70
|
-
pytest-cov =
|
|
68
|
+
ruff = "^0.12"
|
|
69
|
+
pytest = "^8"
|
|
70
|
+
pytest-cov = [
|
|
71
|
+
{ version = "<6", python = "<3.9" },
|
|
72
|
+
{ version = "^6", python = ">=3.9" },
|
|
73
|
+
]
|
|
71
74
|
|
|
72
75
|
[[tool.poetry.source]]
|
|
73
76
|
name = "torch"
|
|
@@ -139,5 +142,5 @@ omit = [
|
|
|
139
142
|
]
|
|
140
143
|
|
|
141
144
|
[build-system]
|
|
142
|
-
requires = ["poetry-core>=
|
|
145
|
+
requires = ["poetry-core>=2.0.0"]
|
|
143
146
|
build-backend = "poetry.core.masonry.api"
|
|
@@ -89,6 +89,7 @@ from pytorch_optimizer.optimizer import (
|
|
|
89
89
|
AdaMod,
|
|
90
90
|
AdamP,
|
|
91
91
|
AdamS,
|
|
92
|
+
AdaMuon,
|
|
92
93
|
AdamW,
|
|
93
94
|
AdamWSN,
|
|
94
95
|
Adan,
|
|
@@ -113,6 +114,9 @@ from pytorch_optimizer.optimizer import (
|
|
|
113
114
|
DeMo,
|
|
114
115
|
DiffGrad,
|
|
115
116
|
DynamicLossScaler,
|
|
117
|
+
EmoFact,
|
|
118
|
+
EmoLynx,
|
|
119
|
+
EmoNavi,
|
|
116
120
|
EXAdam,
|
|
117
121
|
FAdam,
|
|
118
122
|
Fira,
|
|
@@ -153,6 +157,7 @@ from pytorch_optimizer.optimizer import (
|
|
|
153
157
|
SignSGD,
|
|
154
158
|
SimplifiedAdEMAMix,
|
|
155
159
|
SophiaH,
|
|
160
|
+
SPlus,
|
|
156
161
|
StableAdamW,
|
|
157
162
|
StableSPAM,
|
|
158
163
|
Tiger,
|
|
@@ -154,7 +154,11 @@ class BaseOptimizer(ABC, Optimizer):
|
|
|
154
154
|
|
|
155
155
|
@staticmethod
|
|
156
156
|
def apply_ams_bound(
|
|
157
|
-
ams_bound: bool,
|
|
157
|
+
ams_bound: bool,
|
|
158
|
+
exp_avg_sq: torch.Tensor,
|
|
159
|
+
max_exp_avg_sq: Optional[torch.Tensor],
|
|
160
|
+
eps: float,
|
|
161
|
+
exp_avg_sq_eps: float = 1e-15,
|
|
158
162
|
) -> torch.Tensor:
|
|
159
163
|
r"""Apply AMSBound variant.
|
|
160
164
|
|
|
@@ -162,15 +166,16 @@ class BaseOptimizer(ABC, Optimizer):
|
|
|
162
166
|
:param exp_avg_sq: torch.Tensor. exp_avg_sq.
|
|
163
167
|
:param max_exp_avg_sq: Optional[torch.Tensor]. max_exp_avg_sq.
|
|
164
168
|
:param eps: float. epsilon.
|
|
169
|
+
:param exp_avg_sq_eps: float. eps value for numerical stability for exp_avg_sq.
|
|
165
170
|
"""
|
|
166
171
|
if ams_bound:
|
|
167
172
|
if torch.is_complex(max_exp_avg_sq):
|
|
168
173
|
max_exp_avg_sq = torch.view_as_real(max_exp_avg_sq)
|
|
169
174
|
|
|
170
175
|
torch.maximum(max_exp_avg_sq, exp_avg_sq, out=max_exp_avg_sq)
|
|
171
|
-
de_nom = max_exp_avg_sq.add(
|
|
176
|
+
de_nom = max_exp_avg_sq.add(exp_avg_sq_eps)
|
|
172
177
|
else:
|
|
173
|
-
de_nom = exp_avg_sq.add(
|
|
178
|
+
de_nom = exp_avg_sq.add(exp_avg_sq_eps)
|
|
174
179
|
|
|
175
180
|
return de_nom.sqrt_().add_(eps)
|
|
176
181
|
|
|
@@ -43,6 +43,7 @@ from pytorch_optimizer.optimizer.came import CAME
|
|
|
43
43
|
from pytorch_optimizer.optimizer.dadapt import DAdaptAdaGrad, DAdaptAdam, DAdaptAdan, DAdaptLion, DAdaptSGD
|
|
44
44
|
from pytorch_optimizer.optimizer.demo import DeMo
|
|
45
45
|
from pytorch_optimizer.optimizer.diffgrad import DiffGrad
|
|
46
|
+
from pytorch_optimizer.optimizer.emonavi import EmoFact, EmoLynx, EmoNavi
|
|
46
47
|
from pytorch_optimizer.optimizer.exadam import EXAdam
|
|
47
48
|
from pytorch_optimizer.optimizer.experimental.ranger25 import Ranger25
|
|
48
49
|
from pytorch_optimizer.optimizer.fadam import FAdam
|
|
@@ -66,7 +67,7 @@ from pytorch_optimizer.optimizer.lookahead import Lookahead
|
|
|
66
67
|
from pytorch_optimizer.optimizer.madgrad import MADGRAD
|
|
67
68
|
from pytorch_optimizer.optimizer.mars import MARS
|
|
68
69
|
from pytorch_optimizer.optimizer.msvag import MSVAG
|
|
69
|
-
from pytorch_optimizer.optimizer.muon import Muon
|
|
70
|
+
from pytorch_optimizer.optimizer.muon import AdaMuon, Muon
|
|
70
71
|
from pytorch_optimizer.optimizer.nero import Nero
|
|
71
72
|
from pytorch_optimizer.optimizer.novograd import NovoGrad
|
|
72
73
|
from pytorch_optimizer.optimizer.orthograd import OrthoGrad
|
|
@@ -98,6 +99,7 @@ from pytorch_optimizer.optimizer.snsm import AdamWSN
|
|
|
98
99
|
from pytorch_optimizer.optimizer.soap import SOAP
|
|
99
100
|
from pytorch_optimizer.optimizer.sophia import SophiaH
|
|
100
101
|
from pytorch_optimizer.optimizer.spam import SPAM, StableSPAM
|
|
102
|
+
from pytorch_optimizer.optimizer.splus import SPlus
|
|
101
103
|
from pytorch_optimizer.optimizer.srmm import SRMM
|
|
102
104
|
from pytorch_optimizer.optimizer.swats import SWATS
|
|
103
105
|
from pytorch_optimizer.optimizer.tam import TAM, AdaTAM
|
|
@@ -322,6 +324,11 @@ OPTIMIZER_LIST: List[OPTIMIZER] = [
|
|
|
322
324
|
RACS,
|
|
323
325
|
Alice,
|
|
324
326
|
VSGD,
|
|
327
|
+
AdaMuon,
|
|
328
|
+
SPlus,
|
|
329
|
+
EmoFact,
|
|
330
|
+
EmoLynx,
|
|
331
|
+
EmoNavi,
|
|
325
332
|
]
|
|
326
333
|
OPTIMIZERS: Dict[str, OPTIMIZER] = {str(optimizer.__name__).lower(): optimizer for optimizer in OPTIMIZER_LIST}
|
|
327
334
|
|
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
import math
|
|
2
|
+
from typing import Dict, Union
|
|
3
|
+
|
|
4
|
+
import torch
|
|
5
|
+
|
|
6
|
+
from pytorch_optimizer.base.exception import NoComplexParameterError, NoSparseGradientError
|
|
7
|
+
from pytorch_optimizer.base.optimizer import BaseOptimizer
|
|
8
|
+
from pytorch_optimizer.base.type import BETAS, CLOSURE, DEFAULTS, GROUP, LOSS, PARAMETERS
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def update_ema(state: Dict, loss: Union[float, torch.Tensor]) -> Dict[str, float]:
|
|
12
|
+
r"""Update the EMA dictionary for the `short` and `long` terms."""
|
|
13
|
+
if isinstance(loss, torch.Tensor):
|
|
14
|
+
loss = loss.item()
|
|
15
|
+
|
|
16
|
+
ema = state.setdefault('ema', {})
|
|
17
|
+
ema['short'] = 0.3 * loss + 0.7 * ema.get('short', loss)
|
|
18
|
+
ema['long'] = 0.01 * loss + 0.99 * ema.get('long', loss)
|
|
19
|
+
|
|
20
|
+
return ema
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def compute_scalar(ema: Dict[str, float]) -> float:
|
|
24
|
+
r"""Compute the difference scalar."""
|
|
25
|
+
diff: float = ema['short'] - ema['long']
|
|
26
|
+
return math.tanh(5.0 * diff)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def get_scalar_ratio(scalar: float) -> float:
|
|
30
|
+
r"""Get the scalar ratio."""
|
|
31
|
+
if scalar > 0.6:
|
|
32
|
+
return 0.7 + 0.2 * scalar
|
|
33
|
+
if scalar < -0.6:
|
|
34
|
+
return 0.1
|
|
35
|
+
if abs(scalar) > 0.3:
|
|
36
|
+
return 0.3
|
|
37
|
+
return 0.0
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class EmoNavi(BaseOptimizer):
|
|
41
|
+
r"""An emotion-driven optimizer that feels loss and navigates accordingly.
|
|
42
|
+
|
|
43
|
+
:param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
|
|
44
|
+
:param lr: float. learning rate.
|
|
45
|
+
:param betas: BETAS. coefficients used for computing running averages of gradient and the squared hessian trace.
|
|
46
|
+
:param shadow_weight: float. the weight of the shadow.
|
|
47
|
+
:param weight_decay: float. weight decay (L2 penalty).
|
|
48
|
+
:param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
|
|
49
|
+
:param fixed_decay: bool. fix weight decay.
|
|
50
|
+
:param eps: float. term added to the denominator to improve numerical stability.
|
|
51
|
+
:param maximize: bool. maximize the objective with respect to the params, instead of minimizing.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
def __init__(
|
|
55
|
+
self,
|
|
56
|
+
params: PARAMETERS,
|
|
57
|
+
lr: float = 1e-3,
|
|
58
|
+
betas: BETAS = (0.9, 0.999),
|
|
59
|
+
shadow_weight: float = 0.05,
|
|
60
|
+
weight_decay: float = 1e-2,
|
|
61
|
+
weight_decouple: bool = True,
|
|
62
|
+
fixed_decay: bool = False,
|
|
63
|
+
eps: float = 1e-8,
|
|
64
|
+
maximize: bool = False,
|
|
65
|
+
**kwargs,
|
|
66
|
+
):
|
|
67
|
+
self.validate_learning_rate(lr)
|
|
68
|
+
self.validate_betas(betas)
|
|
69
|
+
self.validate_range(shadow_weight, 'shadow_weight', 0.0, 1.0)
|
|
70
|
+
self.validate_non_negative(weight_decay, 'weight_decay')
|
|
71
|
+
self.validate_non_negative(eps, 'eps')
|
|
72
|
+
|
|
73
|
+
self.maximize = maximize
|
|
74
|
+
|
|
75
|
+
defaults: DEFAULTS = {
|
|
76
|
+
'lr': lr,
|
|
77
|
+
'betas': betas,
|
|
78
|
+
'shadow_weight': shadow_weight,
|
|
79
|
+
'weight_decay': weight_decay,
|
|
80
|
+
'weight_decouple': weight_decouple,
|
|
81
|
+
'fixed_decay': fixed_decay,
|
|
82
|
+
'eps': eps,
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
super().__init__(params, defaults)
|
|
86
|
+
|
|
87
|
+
def __str__(self) -> str:
|
|
88
|
+
return 'EmoNavi'
|
|
89
|
+
|
|
90
|
+
def init_group(self, group: GROUP, **kwargs) -> None:
|
|
91
|
+
for p in group['params']:
|
|
92
|
+
if p.grad is None:
|
|
93
|
+
continue
|
|
94
|
+
|
|
95
|
+
grad = p.grad
|
|
96
|
+
if grad.is_sparse:
|
|
97
|
+
raise NoSparseGradientError(str(self))
|
|
98
|
+
|
|
99
|
+
if torch.is_complex(p):
|
|
100
|
+
raise NoComplexParameterError(str(self))
|
|
101
|
+
|
|
102
|
+
state = self.state[p]
|
|
103
|
+
|
|
104
|
+
if len(state) == 0:
|
|
105
|
+
state['shadow'] = p.clone()
|
|
106
|
+
state['exp_avg'] = torch.zeros_like(p)
|
|
107
|
+
state['exp_avg_sq'] = torch.zeros_like(p)
|
|
108
|
+
|
|
109
|
+
@torch.no_grad()
|
|
110
|
+
def step(self, closure: CLOSURE = None) -> LOSS:
|
|
111
|
+
loss = 0.0
|
|
112
|
+
if closure is not None:
|
|
113
|
+
with torch.enable_grad():
|
|
114
|
+
loss = closure()
|
|
115
|
+
|
|
116
|
+
for group in self.param_groups:
|
|
117
|
+
if 'step' not in group:
|
|
118
|
+
self.init_group(group)
|
|
119
|
+
group['step'] = 1
|
|
120
|
+
else:
|
|
121
|
+
group['step'] += 1
|
|
122
|
+
|
|
123
|
+
beta1, beta2 = group['betas']
|
|
124
|
+
|
|
125
|
+
for p in group['params']:
|
|
126
|
+
if p.grad is None:
|
|
127
|
+
continue
|
|
128
|
+
|
|
129
|
+
grad = p.grad
|
|
130
|
+
|
|
131
|
+
self.maximize_gradient(grad, maximize=self.maximize)
|
|
132
|
+
|
|
133
|
+
state = self.state[p]
|
|
134
|
+
|
|
135
|
+
ema = update_ema(state, loss)
|
|
136
|
+
scalar = compute_scalar(ema)
|
|
137
|
+
ratio = get_scalar_ratio(scalar)
|
|
138
|
+
|
|
139
|
+
self.apply_weight_decay(
|
|
140
|
+
p=p,
|
|
141
|
+
grad=grad,
|
|
142
|
+
lr=group['lr'],
|
|
143
|
+
weight_decay=group['weight_decay'],
|
|
144
|
+
weight_decouple=group['weight_decouple'],
|
|
145
|
+
fixed_decay=group['fixed_decay'],
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
shadow, exp_avg, exp_avg_sq = state['shadow'], state['exp_avg'], state['exp_avg_sq']
|
|
149
|
+
|
|
150
|
+
if ratio > 0.0:
|
|
151
|
+
p.lerp_(shadow, weight=ratio)
|
|
152
|
+
shadow.lerp_(p, weight=group['shadow_weight'])
|
|
153
|
+
|
|
154
|
+
exp_avg.mul_(beta1).add_(grad, alpha=1.0 - beta1)
|
|
155
|
+
exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1.0 - beta2)
|
|
156
|
+
|
|
157
|
+
de_nom = exp_avg_sq.sqrt().add_(group['eps'])
|
|
158
|
+
|
|
159
|
+
p.addcdiv_(exp_avg, de_nom, value=-group['lr'])
|
|
160
|
+
|
|
161
|
+
return loss
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
class EmoLynx(BaseOptimizer):
|
|
165
|
+
r"""EmoLynx optimizer.
|
|
166
|
+
|
|
167
|
+
Lynx was developed with inspiration from Lion and Tiger, which we deeply respect for their lightweight and
|
|
168
|
+
intelligent design. It also integrates EmoNAVI to enhance its capabilities.
|
|
169
|
+
|
|
170
|
+
:param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
|
|
171
|
+
:param lr: float. learning rate.
|
|
172
|
+
:param betas: BETAS. coefficients used for computing running averages of gradient and the squared hessian trace.
|
|
173
|
+
:param shadow_weight: float. the weight of the shadow.
|
|
174
|
+
:param weight_decay: float. weight decay (L2 penalty).
|
|
175
|
+
:param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
|
|
176
|
+
:param fixed_decay: bool. fix weight decay.
|
|
177
|
+
:param eps: float. term added to the denominator to improve numerical stability.
|
|
178
|
+
:param maximize: bool. maximize the objective with respect to the params, instead of minimizing.
|
|
179
|
+
"""
|
|
180
|
+
|
|
181
|
+
def __init__(
|
|
182
|
+
self,
|
|
183
|
+
params: PARAMETERS,
|
|
184
|
+
lr: float = 1e-3,
|
|
185
|
+
betas: BETAS = (0.9, 0.99),
|
|
186
|
+
shadow_weight: float = 0.05,
|
|
187
|
+
weight_decay: float = 1e-2,
|
|
188
|
+
weight_decouple: bool = True,
|
|
189
|
+
fixed_decay: bool = False,
|
|
190
|
+
eps: float = 1e-8,
|
|
191
|
+
maximize: bool = False,
|
|
192
|
+
**kwargs,
|
|
193
|
+
):
|
|
194
|
+
self.validate_learning_rate(lr)
|
|
195
|
+
self.validate_betas(betas)
|
|
196
|
+
self.validate_range(shadow_weight, 'shadow_weight', 0.0, 1.0)
|
|
197
|
+
self.validate_non_negative(weight_decay, 'weight_decay')
|
|
198
|
+
self.validate_non_negative(eps, 'eps')
|
|
199
|
+
|
|
200
|
+
self.maximize = maximize
|
|
201
|
+
|
|
202
|
+
defaults: DEFAULTS = {
|
|
203
|
+
'lr': lr,
|
|
204
|
+
'betas': betas,
|
|
205
|
+
'shadow_weight': shadow_weight,
|
|
206
|
+
'weight_decay': weight_decay,
|
|
207
|
+
'weight_decouple': weight_decouple,
|
|
208
|
+
'fixed_decay': fixed_decay,
|
|
209
|
+
'eps': eps,
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
super().__init__(params, defaults)
|
|
213
|
+
|
|
214
|
+
def __str__(self) -> str:
|
|
215
|
+
return 'EmoLynx'
|
|
216
|
+
|
|
217
|
+
def init_group(self, group: GROUP, **kwargs) -> None:
|
|
218
|
+
for p in group['params']:
|
|
219
|
+
if p.grad is None:
|
|
220
|
+
continue
|
|
221
|
+
|
|
222
|
+
grad = p.grad
|
|
223
|
+
if grad.is_sparse:
|
|
224
|
+
raise NoSparseGradientError(str(self))
|
|
225
|
+
|
|
226
|
+
if torch.is_complex(p):
|
|
227
|
+
raise NoComplexParameterError(str(self))
|
|
228
|
+
|
|
229
|
+
state = self.state[p]
|
|
230
|
+
|
|
231
|
+
if len(state) == 0:
|
|
232
|
+
state['shadow'] = p.clone()
|
|
233
|
+
state['exp_avg'] = torch.zeros_like(p)
|
|
234
|
+
|
|
235
|
+
@torch.no_grad()
|
|
236
|
+
def step(self, closure: CLOSURE = None) -> LOSS:
|
|
237
|
+
loss = 0.0
|
|
238
|
+
if closure is not None:
|
|
239
|
+
with torch.enable_grad():
|
|
240
|
+
loss = closure()
|
|
241
|
+
|
|
242
|
+
for group in self.param_groups:
|
|
243
|
+
if 'step' not in group:
|
|
244
|
+
self.init_group(group)
|
|
245
|
+
group['step'] = 1
|
|
246
|
+
else:
|
|
247
|
+
group['step'] += 1
|
|
248
|
+
|
|
249
|
+
beta1, beta2 = group['betas']
|
|
250
|
+
|
|
251
|
+
for p in group['params']:
|
|
252
|
+
if p.grad is None:
|
|
253
|
+
continue
|
|
254
|
+
|
|
255
|
+
grad = p.grad
|
|
256
|
+
|
|
257
|
+
self.maximize_gradient(grad, maximize=self.maximize)
|
|
258
|
+
|
|
259
|
+
state = self.state[p]
|
|
260
|
+
|
|
261
|
+
ema = update_ema(state, loss)
|
|
262
|
+
scalar = compute_scalar(ema)
|
|
263
|
+
ratio = get_scalar_ratio(scalar)
|
|
264
|
+
|
|
265
|
+
self.apply_weight_decay(
|
|
266
|
+
p=p,
|
|
267
|
+
grad=grad,
|
|
268
|
+
lr=group['lr'],
|
|
269
|
+
weight_decay=group['weight_decay'],
|
|
270
|
+
weight_decouple=group['weight_decouple'],
|
|
271
|
+
fixed_decay=group['fixed_decay'],
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
shadow, exp_avg = state['shadow'], state['exp_avg']
|
|
275
|
+
|
|
276
|
+
if ratio > 0.0:
|
|
277
|
+
p.lerp_(shadow, weight=ratio)
|
|
278
|
+
shadow.lerp_(p, weight=group['shadow_weight'])
|
|
279
|
+
|
|
280
|
+
blended_grad = grad.mul(1.0 - beta1).add_(exp_avg, alpha=beta1).sign_()
|
|
281
|
+
exp_avg.mul_(beta2).add_(grad, alpha=1.0 - beta2)
|
|
282
|
+
|
|
283
|
+
p.add_(blended_grad, alpha=-group['lr'])
|
|
284
|
+
|
|
285
|
+
return loss
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
class EmoFact(BaseOptimizer):
|
|
289
|
+
r"""EmoFact optimizer.
|
|
290
|
+
|
|
291
|
+
EmoFact is inspired by AdaFactor and its VRAM-friendly design is something everyone loves.
|
|
292
|
+
|
|
293
|
+
:param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
|
|
294
|
+
:param lr: float. learning rate.
|
|
295
|
+
:param betas: BETAS. coefficients used for computing running averages of gradient and the squared hessian trace.
|
|
296
|
+
:param shadow_weight: float. the weight of the shadow.
|
|
297
|
+
:param weight_decay: float. weight decay (L2 penalty).
|
|
298
|
+
:param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
|
|
299
|
+
:param fixed_decay: bool. fix weight decay.
|
|
300
|
+
:param eps: float. term added to the denominator to improve numerical stability.
|
|
301
|
+
:param maximize: bool. maximize the objective with respect to the params, instead of minimizing.
|
|
302
|
+
"""
|
|
303
|
+
|
|
304
|
+
def __init__(
|
|
305
|
+
self,
|
|
306
|
+
params: PARAMETERS,
|
|
307
|
+
lr: float = 1e-3,
|
|
308
|
+
betas: BETAS = (0.9, 0.999),
|
|
309
|
+
shadow_weight: float = 0.05,
|
|
310
|
+
weight_decay: float = 1e-2,
|
|
311
|
+
weight_decouple: bool = True,
|
|
312
|
+
fixed_decay: bool = False,
|
|
313
|
+
eps: float = 1e-8,
|
|
314
|
+
maximize: bool = False,
|
|
315
|
+
**kwargs,
|
|
316
|
+
):
|
|
317
|
+
self.validate_learning_rate(lr)
|
|
318
|
+
self.validate_betas(betas)
|
|
319
|
+
self.validate_range(shadow_weight, 'shadow_weight', 0.0, 1.0)
|
|
320
|
+
self.validate_non_negative(weight_decay, 'weight_decay')
|
|
321
|
+
self.validate_non_negative(eps, 'eps')
|
|
322
|
+
|
|
323
|
+
self.maximize = maximize
|
|
324
|
+
|
|
325
|
+
defaults: DEFAULTS = {
|
|
326
|
+
'lr': lr,
|
|
327
|
+
'betas': betas,
|
|
328
|
+
'shadow_weight': shadow_weight,
|
|
329
|
+
'weight_decay': weight_decay,
|
|
330
|
+
'weight_decouple': weight_decouple,
|
|
331
|
+
'fixed_decay': fixed_decay,
|
|
332
|
+
'eps': eps,
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
super().__init__(params, defaults)
|
|
336
|
+
|
|
337
|
+
def __str__(self) -> str:
|
|
338
|
+
return 'EmoFact'
|
|
339
|
+
|
|
340
|
+
def init_group(self, group: GROUP, **kwargs) -> None:
|
|
341
|
+
for p in group['params']:
|
|
342
|
+
if p.grad is None:
|
|
343
|
+
continue
|
|
344
|
+
|
|
345
|
+
grad = p.grad
|
|
346
|
+
if grad.is_sparse:
|
|
347
|
+
raise NoSparseGradientError(str(self))
|
|
348
|
+
|
|
349
|
+
if torch.is_complex(p):
|
|
350
|
+
raise NoComplexParameterError(str(self))
|
|
351
|
+
|
|
352
|
+
state = self.state[p]
|
|
353
|
+
|
|
354
|
+
if len(state) == 0:
|
|
355
|
+
state['shadow'] = p.clone()
|
|
356
|
+
|
|
357
|
+
shape = p.size()
|
|
358
|
+
|
|
359
|
+
if len(shape) >= 2:
|
|
360
|
+
r_shape = [shape[0]] + [1] * (len(shape) - 1)
|
|
361
|
+
state['exp_avg_r'] = torch.zeros(r_shape, dtype=p.dtype, device=p.device)
|
|
362
|
+
|
|
363
|
+
c_shape = [1, *list(shape[1:])]
|
|
364
|
+
state['exp_avg_c'] = torch.zeros(c_shape, dtype=p.dtype, device=p.device)
|
|
365
|
+
else:
|
|
366
|
+
state['exp_avg'] = torch.zeros_like(p)
|
|
367
|
+
state['exp_avg_sq'] = torch.zeros_like(p)
|
|
368
|
+
|
|
369
|
+
@torch.no_grad()
|
|
370
|
+
def step(self, closure: CLOSURE = None) -> LOSS:
|
|
371
|
+
loss = 0.0
|
|
372
|
+
if closure is not None:
|
|
373
|
+
with torch.enable_grad():
|
|
374
|
+
loss = closure()
|
|
375
|
+
|
|
376
|
+
for group in self.param_groups:
|
|
377
|
+
if 'step' not in group:
|
|
378
|
+
self.init_group(group)
|
|
379
|
+
group['step'] = 1
|
|
380
|
+
else:
|
|
381
|
+
group['step'] += 1
|
|
382
|
+
|
|
383
|
+
beta1, beta2 = group['betas']
|
|
384
|
+
|
|
385
|
+
for p in group['params']:
|
|
386
|
+
if p.grad is None:
|
|
387
|
+
continue
|
|
388
|
+
|
|
389
|
+
grad = p.grad
|
|
390
|
+
|
|
391
|
+
self.maximize_gradient(grad, maximize=self.maximize)
|
|
392
|
+
|
|
393
|
+
state = self.state[p]
|
|
394
|
+
|
|
395
|
+
ema = update_ema(state, loss)
|
|
396
|
+
scalar = compute_scalar(ema)
|
|
397
|
+
ratio = get_scalar_ratio(scalar)
|
|
398
|
+
|
|
399
|
+
self.apply_weight_decay(
|
|
400
|
+
p=p,
|
|
401
|
+
grad=grad,
|
|
402
|
+
lr=group['lr'],
|
|
403
|
+
weight_decay=group['weight_decay'],
|
|
404
|
+
weight_decouple=group['weight_decouple'],
|
|
405
|
+
fixed_decay=group['fixed_decay'],
|
|
406
|
+
)
|
|
407
|
+
|
|
408
|
+
if ratio > 0.0:
|
|
409
|
+
shadow = state['shadow']
|
|
410
|
+
|
|
411
|
+
p.lerp_(shadow, weight=ratio)
|
|
412
|
+
shadow.lerp_(p, weight=group['shadow_weight'])
|
|
413
|
+
|
|
414
|
+
if grad.dim() >= 2:
|
|
415
|
+
exp_avg_r, exp_avg_c = state['exp_avg_r'], state['exp_avg_c']
|
|
416
|
+
|
|
417
|
+
grad_p2 = grad.pow(2)
|
|
418
|
+
r_sq = (
|
|
419
|
+
torch.mean(grad_p2, dim=tuple(range(1, grad.dim())), keepdim=True).add_(group['eps']).sqrt_()
|
|
420
|
+
)
|
|
421
|
+
c_sq = torch.mean(grad_p2, dim=0, keepdim=True).add_(group['eps']).sqrt_()
|
|
422
|
+
|
|
423
|
+
exp_avg_r.mul_(beta1).add_(r_sq, alpha=1.0 - beta1)
|
|
424
|
+
exp_avg_c.mul_(beta1).add_(c_sq, alpha=1.0 - beta1)
|
|
425
|
+
|
|
426
|
+
de_nom = (exp_avg_r * exp_avg_c).sqrt_().add_(group['eps'])
|
|
427
|
+
|
|
428
|
+
update = grad / de_nom
|
|
429
|
+
else:
|
|
430
|
+
exp_avg, exp_avg_sq = state['exp_avg'], state['exp_avg_sq']
|
|
431
|
+
|
|
432
|
+
exp_avg.mul_(beta1).add_(grad, alpha=1.0 - beta1)
|
|
433
|
+
exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1.0 - beta2)
|
|
434
|
+
|
|
435
|
+
de_nom = exp_avg_sq.sqrt().add_(group['eps'])
|
|
436
|
+
|
|
437
|
+
update = exp_avg / de_nom
|
|
438
|
+
|
|
439
|
+
p.add_(update, alpha=-group['lr'])
|
|
440
|
+
|
|
441
|
+
return loss
|