pytorch-optimizer 3.3.4__tar.gz → 3.4.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.3.4 → pytorch_optimizer-3.4.0}/PKG-INFO +6 -5
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/README.md +4 -1
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pyproject.toml +25 -25
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/__init__.py +3 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/base/optimizer.py +23 -2
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/loss/jaccard.py +2 -2
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/__init__.py +6 -0
- pytorch_optimizer-3.4.0/pytorch_optimizer/optimizer/exadam.py +123 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/experimental/ranger25.py +23 -1
- pytorch_optimizer-3.4.0/pytorch_optimizer/optimizer/focus.py +95 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/ftrl.py +1 -1
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/lookahead.py +1 -7
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/muon.py +2 -2
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/orthograd.py +16 -11
- pytorch_optimizer-3.4.0/pytorch_optimizer/optimizer/psgd.py +375 -0
- pytorch_optimizer-3.4.0/pytorch_optimizer/optimizer/psgd_utils.py +94 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/rotograd.py +1 -1
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/shampoo_utils.py +3 -3
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/soap.py +13 -5
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/trac.py +12 -12
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/utils.py +1 -1
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/LICENSE +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/base/__init__.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/base/exception.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/base/scheduler.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/base/types.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/loss/__init__.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/loss/bi_tempered.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/loss/cross_entropy.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/loss/dice.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/loss/f1.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/loss/focal.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/loss/ldam.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/loss/lovasz.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/loss/tversky.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/lr_scheduler/__init__.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/lr_scheduler/chebyshev.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/lr_scheduler/cosine_anealing.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/lr_scheduler/experimental/__init__.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/lr_scheduler/experimental/deberta_v3_lr_scheduler.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/lr_scheduler/linear_warmup.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/lr_scheduler/proportion.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/lr_scheduler/rex.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/lr_scheduler/wsd.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/a2grad.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/adabelief.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/adabound.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/adadelta.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/adafactor.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/adahessian.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/adai.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/adalite.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/adam_mini.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/adamax.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/adamg.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/adamod.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/adamp.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/adams.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/adamw.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/adan.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/adanorm.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/adapnm.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/adashift.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/adasmooth.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/ademamix.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/adopt.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/agc.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/aggmo.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/aida.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/alig.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/amos.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/apollo.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/avagrad.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/came.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/dadapt.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/demo.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/diffgrad.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/experimental/__init__.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/fadam.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/fp16.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/fromage.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/galore.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/galore_utils.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/gc.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/grams.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/gravity.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/grokfast.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/kate.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/lamb.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/laprop.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/lars.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/lion.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/lomo.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/madgrad.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/mars.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/msvag.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/nero.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/novograd.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/padam.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/pcgrad.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/pid.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/pnm.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/prodigy.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/qhadam.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/qhm.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/radam.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/ranger.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/ranger21.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/sam.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/schedulefree.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/sgd.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/sgdp.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/shampoo.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/sm3.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/sophia.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/spam.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/srmm.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/swats.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/tam.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/tiger.py +0 -0
- {pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.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.4.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,ASGD,AccSGD,AdaBelief,AdaBound,AdaDelta,AdaFactor,AdaMax,AdamG,AdaMod,AdaNorm,AdaPNM,AdaSmooth,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,FAdam,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,QHAdam,QHM,RAdam,Ranger,Ranger21,RotoGrad,SAM,ScheduleFreeSGD,ScheduleFreeAdamW,ScheduleFreeRAdam,SGDP,Shampoo,ScalableShampoo,SGDW,SignSGD,SM3,SOAP,SopihaH,SPAM,SRMM,StableAdamW,SWATS,TAM,Tiger,TRAC,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,ASGD,AccSGD,AdaBelief,AdaBound,AdaDelta,AdaFactor,AdaMax,AdamG,AdaMod,AdaNorm,AdaPNM,AdaSmooth,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,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,RAdam,Ranger,Ranger21,RotoGrad,SAM,ScheduleFreeSGD,ScheduleFreeAdamW,ScheduleFreeRAdam,SGDP,Shampoo,ScalableShampoo,SGDW,SignSGD,SM3,SOAP,SopihaH,SPAM,SRMM,StableAdamW,SWATS,TAM,Tiger,TRAC,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
|
|
@@ -29,8 +29,6 @@ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
|
29
29
|
Classifier: Topic :: Software Development
|
|
30
30
|
Classifier: Topic :: Software Development :: Libraries
|
|
31
31
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
32
|
-
Provides-Extra: bitsandbytes
|
|
33
|
-
Requires-Dist: bitsandbytes (>=0.44,<0.45) ; extra == "bitsandbytes"
|
|
34
32
|
Requires-Dist: numpy (<=1.24.4) ; python_version < "3.9"
|
|
35
33
|
Requires-Dist: numpy (>1.24.4) ; python_version >= "3.9"
|
|
36
34
|
Requires-Dist: torch (>=1.10) ; python_version >= "3.8"
|
|
@@ -51,7 +49,7 @@ Description-Content-Type: text/markdown
|
|
|
51
49
|
|
|
52
50
|
## The reasons why you use `pytorch-optimizer`.
|
|
53
51
|
|
|
54
|
-
* Wide range of supported optimizers. Currently, **
|
|
52
|
+
* Wide range of supported optimizers. Currently, **95 optimizers (+ `bitsandbytes`, `qgalore`, `torchao`)**, **16 lr schedulers**, and **13 loss functions** are supported!
|
|
55
53
|
* Including many variants such as `ADOPT`, `Cautious`, `AdamD`, `StableAdamW`, and `Gradient Centrailiaztion`
|
|
56
54
|
* Easy to use, clean, and tested codes
|
|
57
55
|
* Active maintenance
|
|
@@ -241,6 +239,9 @@ get_supported_optimizers(['adam*', 'ranger*'])
|
|
|
241
239
|
| Adam-ATAN2 | *Scaling Exponents Across Parameterizations and Optimizers* | | <https://arxiv.org/abs/2407.05872> | [cite](https://ui.adsabs.harvard.edu/abs/2024arXiv240705872E/exportcitation) |
|
|
242
240
|
| SPAM | *Spike-Aware Adam with Momentum Reset for Stable LLM Training* | [github](https://github.com/TianjinYellow/SPAM-Optimizer) | <https://arxiv.org/abs/2501.06842> | [cite](https://ui.adsabs.harvard.edu/abs/2025arXiv250106842H/exportcitation) |
|
|
243
241
|
| TAM | *Torque-Aware Momentum* | | <https://arxiv.org/abs/2412.18790> | [cite](https://ui.adsabs.harvard.edu/abs/2024arXiv241218790M/exportcitation) |
|
|
242
|
+
| FOCUS | *First Order Concentrated Updating Scheme* | [github](https://github.com/liuyz0/FOCUS) | <https://arxiv.org/abs/2501.12243> | [cite](https://ui.adsabs.harvard.edu/abs/2025arXiv250112243M/exportcitation) |
|
|
243
|
+
| PSGD | *Preconditioned Stochastic Gradient Descent* | [github](https://github.com/lixilinx/psgd_torch) | <https://arxiv.org/abs/1512.04202> | [cite](https://github.com/lixilinx/psgd_torch?tab=readme-ov-file#resources) |
|
|
244
|
+
| EXAdam | *The Power of Adaptive Cross-Moments* | [github](https://github.com/AhmedMostafa16/EXAdam) | <https://arxiv.org/abs/2412.20302> | [cite](https://github.com/AhmedMostafa16/EXAdam?tab=readme-ov-file#citation) |
|
|
244
245
|
|
|
245
246
|
## Supported LR Scheduler
|
|
246
247
|
|
|
@@ -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, **95 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
|
|
@@ -200,6 +200,9 @@ get_supported_optimizers(['adam*', 'ranger*'])
|
|
|
200
200
|
| Adam-ATAN2 | *Scaling Exponents Across Parameterizations and Optimizers* | | <https://arxiv.org/abs/2407.05872> | [cite](https://ui.adsabs.harvard.edu/abs/2024arXiv240705872E/exportcitation) |
|
|
201
201
|
| SPAM | *Spike-Aware Adam with Momentum Reset for Stable LLM Training* | [github](https://github.com/TianjinYellow/SPAM-Optimizer) | <https://arxiv.org/abs/2501.06842> | [cite](https://ui.adsabs.harvard.edu/abs/2025arXiv250106842H/exportcitation) |
|
|
202
202
|
| TAM | *Torque-Aware Momentum* | | <https://arxiv.org/abs/2412.18790> | [cite](https://ui.adsabs.harvard.edu/abs/2024arXiv241218790M/exportcitation) |
|
|
203
|
+
| FOCUS | *First Order Concentrated Updating Scheme* | [github](https://github.com/liuyz0/FOCUS) | <https://arxiv.org/abs/2501.12243> | [cite](https://ui.adsabs.harvard.edu/abs/2025arXiv250112243M/exportcitation) |
|
|
204
|
+
| PSGD | *Preconditioned Stochastic Gradient Descent* | [github](https://github.com/lixilinx/psgd_torch) | <https://arxiv.org/abs/1512.04202> | [cite](https://github.com/lixilinx/psgd_torch?tab=readme-ov-file#resources) |
|
|
205
|
+
| EXAdam | *The Power of Adaptive Cross-Moments* | [github](https://github.com/AhmedMostafa16/EXAdam) | <https://arxiv.org/abs/2412.20302> | [cite](https://github.com/AhmedMostafa16/EXAdam?tab=readme-ov-file#citation) |
|
|
203
206
|
|
|
204
207
|
## Supported LR Scheduler
|
|
205
208
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "pytorch_optimizer"
|
|
3
|
-
version = "3.
|
|
3
|
+
version = "3.4.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>"]
|
|
@@ -14,13 +14,13 @@ keywords = [
|
|
|
14
14
|
"AdaDelta", "AdaFactor", "AdaMax", "AdamG", "AdaMod", "AdaNorm", "AdaPNM", "AdaSmooth", "AdEMAMix", "ADOPT",
|
|
15
15
|
"AdaHessian", "Adai", "Adalite", "AdaLomo", "AdamMini", "AdamP", "AdamS", "Adan", "AggMo", "Aida", "AliG", "Amos",
|
|
16
16
|
"Apollo", "APOLLO", "AvaGrad", "bSAM", "CAME", "DAdaptAdaGrad", "DAdaptAdam", "DAdaptAdan", "DAdaptSGD",
|
|
17
|
-
"DAdaptLion", "DeMo", "DiffGrad", "
|
|
18
|
-
"Kate", "Lamb", "LaProp", "LARS", "Lion", "LOMO", "Lookahead", "MADGRAD", "MARS", "MSVAG",
|
|
19
|
-
"NovoGrad", "OrthoGrad", "PAdam", "PCGrad", "PID", "PNM", "Prodigy", "
|
|
20
|
-
"
|
|
21
|
-
"ScalableShampoo", "SGDW", "SignSGD", "SM3", "SOAP", "SopihaH", "SPAM", "SRMM", "StableAdamW",
|
|
22
|
-
"Tiger", "TRAC", "WSAM", "Yogi", "BCE", "BCEFocal", "Focal", "FocalCosine", "SoftF1", "Dice",
|
|
23
|
-
"Bi-Tempered", "Tversky", "FocalTversky", "LovaszHinge", "bitsandbytes", "WSD", "QGaLore",
|
|
17
|
+
"DAdaptLion", "DeMo", "DiffGrad", "EXAdam", "FAdam", "FOCUS", "Fromage", "FTRL", "GaLore", "Grams", "Gravity",
|
|
18
|
+
"GrokFast", "GSAM", "Kate", "Lamb", "LaProp", "LARS", "Lion", "LOMO", "Lookahead", "MADGRAD", "MARS", "MSVAG",
|
|
19
|
+
"Muno", "Nero", "NovoGrad", "OrthoGrad", "PAdam", "PCGrad", "PID", "PNM", "Prodigy", "PSGD", "QHAdam", "QHM",
|
|
20
|
+
"RAdam", "Ranger", "Ranger21", "RotoGrad", "SAM", "ScheduleFreeSGD", "ScheduleFreeAdamW", "ScheduleFreeRAdam",
|
|
21
|
+
"SGDP", "Shampoo", "ScalableShampoo", "SGDW", "SignSGD", "SM3", "SOAP", "SopihaH", "SPAM", "SRMM", "StableAdamW",
|
|
22
|
+
"SWATS", "TAM", "Tiger", "TRAC", "WSAM", "Yogi", "BCE", "BCEFocal", "Focal", "FocalCosine", "SoftF1", "Dice",
|
|
23
|
+
"LDAM", "Jaccard", "Bi-Tempered", "Tversky", "FocalTversky", "LovaszHinge", "bitsandbytes", "WSD", "QGaLore",
|
|
24
24
|
]
|
|
25
25
|
classifiers = [
|
|
26
26
|
"License :: OSI Approved :: Apache Software License",
|
|
@@ -52,29 +52,27 @@ numpy = [
|
|
|
52
52
|
{ version = "<=1.24.4", python = "<3.9" },
|
|
53
53
|
]
|
|
54
54
|
torch = { version = ">=1.10", python = ">=3.8", source = "torch" }
|
|
55
|
-
bitsandbytes = { version = "^0.44", optional = true }
|
|
56
55
|
|
|
57
|
-
[tool.poetry.dev
|
|
58
|
-
isort =
|
|
59
|
-
|
|
56
|
+
[tool.poetry.group.dev.dependencies]
|
|
57
|
+
isort = [
|
|
58
|
+
{ version = "<6", python = "<3.9" },
|
|
59
|
+
{ version = "^6", python = ">=3.9" },
|
|
60
|
+
]
|
|
61
|
+
black = [
|
|
62
|
+
{ version = "<25", python = "<3.9" },
|
|
63
|
+
{ version = "^25", python = ">=3.9" },
|
|
64
|
+
]
|
|
60
65
|
ruff = "*"
|
|
61
66
|
pytest = "*"
|
|
62
67
|
pytest-cov = "*"
|
|
63
68
|
|
|
64
|
-
[tool.poetry.extras]
|
|
65
|
-
bitsandbytes = ["bitsandbytes"]
|
|
66
|
-
|
|
67
69
|
[[tool.poetry.source]]
|
|
68
70
|
name = "torch"
|
|
69
71
|
url = "https://download.pytorch.org/whl/cpu"
|
|
70
72
|
priority = "explicit"
|
|
71
73
|
|
|
72
74
|
[tool.ruff]
|
|
73
|
-
src = [
|
|
74
|
-
"pytorch_optimizer",
|
|
75
|
-
"tests",
|
|
76
|
-
"examples",
|
|
77
|
-
]
|
|
75
|
+
src = ["pytorch_optimizer", "tests", "examples"]
|
|
78
76
|
target-version = "py312"
|
|
79
77
|
line-length = 119
|
|
80
78
|
exclude = [
|
|
@@ -97,8 +95,10 @@ select = [
|
|
|
97
95
|
"TID", "ARG", "ERA", "RUF", "YTT", "PL", "Q"
|
|
98
96
|
]
|
|
99
97
|
ignore = [
|
|
100
|
-
"A005", "B905",
|
|
101
|
-
"
|
|
98
|
+
"A005", "B905",
|
|
99
|
+
"D100", "D102", "D104", "D105", "D107", "D203", "D213", "D413",
|
|
100
|
+
"PLR0912", "PLR0913", "PLR0915", "PLR2004",
|
|
101
|
+
"Q003", "ARG002",
|
|
102
102
|
]
|
|
103
103
|
fixable = ["ALL"]
|
|
104
104
|
unfixable = ["F401"]
|
|
@@ -107,10 +107,10 @@ flake8-quotes.docstring-quotes = "double"
|
|
|
107
107
|
flake8-quotes.inline-quotes = "single"
|
|
108
108
|
|
|
109
109
|
[tool.ruff.lint.extend-per-file-ignores]
|
|
110
|
-
"hubconf.py" = ["D", "INP001"]
|
|
111
110
|
"examples/visualize_optimizers.py" = ["D103", "D400", "D415"]
|
|
112
|
-
"**/__init__.py" = ["F401"]
|
|
113
111
|
"{tests,examples}/*.py" = ["D", "S101"]
|
|
112
|
+
"**/__init__.py" = ["F401"]
|
|
113
|
+
"hubconf.py" = ["D", "INP001"]
|
|
114
114
|
|
|
115
115
|
[tool.ruff.lint.isort]
|
|
116
116
|
combine-as-imports = false
|
|
@@ -129,9 +129,9 @@ testpaths = "tests"
|
|
|
129
129
|
|
|
130
130
|
[tool.coverage.run]
|
|
131
131
|
omit = [
|
|
132
|
-
"./pytorch_optimizer/optimizer/rotograd.py",
|
|
133
132
|
"./pytorch_optimizer/optimizer/adam_mini.py",
|
|
134
133
|
"./pytorch_optimizer/optimizer/demo.py",
|
|
134
|
+
"./pytorch_optimizer/optimizer/rotograd.py",
|
|
135
135
|
]
|
|
136
136
|
|
|
137
137
|
[build-system]
|
|
@@ -46,6 +46,7 @@ from pytorch_optimizer.optimizer import (
|
|
|
46
46
|
ASGD,
|
|
47
47
|
BSAM,
|
|
48
48
|
CAME,
|
|
49
|
+
FOCUS,
|
|
49
50
|
FTRL,
|
|
50
51
|
GSAM,
|
|
51
52
|
LARS,
|
|
@@ -105,6 +106,7 @@ from pytorch_optimizer.optimizer import (
|
|
|
105
106
|
DeMo,
|
|
106
107
|
DiffGrad,
|
|
107
108
|
DynamicLossScaler,
|
|
109
|
+
EXAdam,
|
|
108
110
|
FAdam,
|
|
109
111
|
Fromage,
|
|
110
112
|
GaLore,
|
|
@@ -112,6 +114,7 @@ from pytorch_optimizer.optimizer import (
|
|
|
112
114
|
Gravity,
|
|
113
115
|
GrokFastAdamW,
|
|
114
116
|
Kate,
|
|
117
|
+
Kron,
|
|
115
118
|
Lamb,
|
|
116
119
|
LaProp,
|
|
117
120
|
Lion,
|
|
@@ -6,7 +6,16 @@ import torch
|
|
|
6
6
|
from torch.optim import Optimizer
|
|
7
7
|
|
|
8
8
|
from pytorch_optimizer.base.exception import NegativeLRError, NegativeStepError
|
|
9
|
-
from pytorch_optimizer.base.types import
|
|
9
|
+
from pytorch_optimizer.base.types import (
|
|
10
|
+
BETAS,
|
|
11
|
+
CLOSURE,
|
|
12
|
+
DEFAULTS,
|
|
13
|
+
HUTCHINSON_G,
|
|
14
|
+
LOSS,
|
|
15
|
+
OPTIMIZER_INSTANCE_OR_CLASS,
|
|
16
|
+
PARAMETERS,
|
|
17
|
+
STATE,
|
|
18
|
+
)
|
|
10
19
|
|
|
11
20
|
|
|
12
21
|
class BaseOptimizer(ABC, Optimizer):
|
|
@@ -15,6 +24,18 @@ class BaseOptimizer(ABC, Optimizer):
|
|
|
15
24
|
def __init__(self, params: PARAMETERS, defaults: DEFAULTS) -> None:
|
|
16
25
|
super().__init__(params, defaults)
|
|
17
26
|
|
|
27
|
+
@staticmethod
|
|
28
|
+
def load_optimizer(optimizer: OPTIMIZER_INSTANCE_OR_CLASS, **kwargs) -> Optimizer:
|
|
29
|
+
r"""Build torch.optim.Optimizer class."""
|
|
30
|
+
if isinstance(optimizer, Optimizer):
|
|
31
|
+
return optimizer
|
|
32
|
+
|
|
33
|
+
if 'params' in kwargs:
|
|
34
|
+
params = kwargs.pop('params')
|
|
35
|
+
return optimizer(params, **kwargs)
|
|
36
|
+
|
|
37
|
+
raise ValueError('need to pass `params` when you pass the `torch.optim.Optimizer` instance.')
|
|
38
|
+
|
|
18
39
|
@staticmethod
|
|
19
40
|
@torch.no_grad()
|
|
20
41
|
def set_hessian(param_groups: PARAMETERS, state: STATE, hessian: List[torch.Tensor]) -> None:
|
|
@@ -317,7 +338,7 @@ class BaseOptimizer(ABC, Optimizer):
|
|
|
317
338
|
@staticmethod
|
|
318
339
|
def validate_options(x: str, name: str, options: List[str]) -> None:
|
|
319
340
|
if x not in options:
|
|
320
|
-
opts: str = ' or '.join([f'
|
|
341
|
+
opts: str = ' or '.join([f"'{option}'" for option in options]).strip()
|
|
321
342
|
raise ValueError(f'[-] {name} {x} must be one of ({opts})')
|
|
322
343
|
|
|
323
344
|
@staticmethod
|
|
@@ -49,7 +49,7 @@ class JaccardLoss(_Loss):
|
|
|
49
49
|
def __init__(
|
|
50
50
|
self,
|
|
51
51
|
mode: CLASS_MODE,
|
|
52
|
-
classes: List[int] = None,
|
|
52
|
+
classes: Optional[List[int]] = None,
|
|
53
53
|
log_loss: bool = False,
|
|
54
54
|
from_logits: bool = True,
|
|
55
55
|
label_smooth: float = 0.0,
|
|
@@ -59,7 +59,7 @@ class JaccardLoss(_Loss):
|
|
|
59
59
|
|
|
60
60
|
if classes is not None:
|
|
61
61
|
if mode == 'binary':
|
|
62
|
-
raise ValueError('
|
|
62
|
+
raise ValueError('masking classes is not supported with mode=binary')
|
|
63
63
|
|
|
64
64
|
classes = torch.LongTensor(classes)
|
|
65
65
|
|
|
@@ -40,8 +40,10 @@ from pytorch_optimizer.optimizer.came import CAME
|
|
|
40
40
|
from pytorch_optimizer.optimizer.dadapt import DAdaptAdaGrad, DAdaptAdam, DAdaptAdan, DAdaptLion, DAdaptSGD
|
|
41
41
|
from pytorch_optimizer.optimizer.demo import DeMo
|
|
42
42
|
from pytorch_optimizer.optimizer.diffgrad import DiffGrad
|
|
43
|
+
from pytorch_optimizer.optimizer.exadam import EXAdam
|
|
43
44
|
from pytorch_optimizer.optimizer.experimental.ranger25 import Ranger25
|
|
44
45
|
from pytorch_optimizer.optimizer.fadam import FAdam
|
|
46
|
+
from pytorch_optimizer.optimizer.focus import FOCUS
|
|
45
47
|
from pytorch_optimizer.optimizer.fp16 import DynamicLossScaler, SafeFP16Optimizer
|
|
46
48
|
from pytorch_optimizer.optimizer.fromage import Fromage
|
|
47
49
|
from pytorch_optimizer.optimizer.ftrl import FTRL
|
|
@@ -69,6 +71,7 @@ from pytorch_optimizer.optimizer.pcgrad import PCGrad
|
|
|
69
71
|
from pytorch_optimizer.optimizer.pid import PID
|
|
70
72
|
from pytorch_optimizer.optimizer.pnm import PNM
|
|
71
73
|
from pytorch_optimizer.optimizer.prodigy import Prodigy
|
|
74
|
+
from pytorch_optimizer.optimizer.psgd import Kron
|
|
72
75
|
from pytorch_optimizer.optimizer.qhadam import QHAdam
|
|
73
76
|
from pytorch_optimizer.optimizer.qhm import QHM
|
|
74
77
|
from pytorch_optimizer.optimizer.radam import RAdam
|
|
@@ -289,8 +292,11 @@ OPTIMIZER_LIST: List[OPTIMIZER] = [
|
|
|
289
292
|
LaProp,
|
|
290
293
|
MARS,
|
|
291
294
|
SGDSaI,
|
|
295
|
+
FOCUS,
|
|
292
296
|
Grams,
|
|
293
297
|
SPAM,
|
|
298
|
+
Kron,
|
|
299
|
+
EXAdam,
|
|
294
300
|
Ranger25,
|
|
295
301
|
]
|
|
296
302
|
OPTIMIZERS: Dict[str, OPTIMIZER] = {str(optimizer.__name__).lower(): optimizer for optimizer in OPTIMIZER_LIST}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
import torch
|
|
3
|
+
|
|
4
|
+
from pytorch_optimizer.base.exception import NoSparseGradientError
|
|
5
|
+
from pytorch_optimizer.base.optimizer import BaseOptimizer
|
|
6
|
+
from pytorch_optimizer.base.types import BETAS, CLOSURE, DEFAULTS, LOSS, PARAMETERS
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class EXAdam(BaseOptimizer):
|
|
10
|
+
r"""The Power of Adaptive Cross-Moments.
|
|
11
|
+
|
|
12
|
+
:param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
|
|
13
|
+
:param lr: float. learning rate.
|
|
14
|
+
:param betas: BETAS. coefficients used for computing running averages of gradient and the squared hessian trace.
|
|
15
|
+
:param weight_decay: float. weight decay (L2 penalty).
|
|
16
|
+
:param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
|
|
17
|
+
:param fixed_decay: bool. fix weight decay.
|
|
18
|
+
:param eps: float. term added to the denominator to improve numerical stability.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(
|
|
22
|
+
self,
|
|
23
|
+
params: PARAMETERS,
|
|
24
|
+
lr: float = 1e-3,
|
|
25
|
+
betas: BETAS = (0.9, 0.999),
|
|
26
|
+
weight_decay: float = 0.0,
|
|
27
|
+
weight_decouple: bool = True,
|
|
28
|
+
fixed_decay: bool = False,
|
|
29
|
+
eps: float = 1e-8,
|
|
30
|
+
**kwargs,
|
|
31
|
+
):
|
|
32
|
+
self.validate_learning_rate(lr)
|
|
33
|
+
self.validate_betas(betas)
|
|
34
|
+
self.validate_non_negative(weight_decay, 'weight_decay')
|
|
35
|
+
self.validate_non_negative(eps, 'eps')
|
|
36
|
+
|
|
37
|
+
self.sq2: float = np.sqrt(2)
|
|
38
|
+
|
|
39
|
+
defaults: DEFAULTS = {
|
|
40
|
+
'lr': lr,
|
|
41
|
+
'betas': betas,
|
|
42
|
+
'weight_decay': weight_decay,
|
|
43
|
+
'weight_decouple': weight_decouple,
|
|
44
|
+
'fixed_decay': fixed_decay,
|
|
45
|
+
'eps': eps,
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
super().__init__(params, defaults)
|
|
49
|
+
|
|
50
|
+
def __str__(self) -> str:
|
|
51
|
+
return 'EXAdam'
|
|
52
|
+
|
|
53
|
+
@torch.no_grad()
|
|
54
|
+
def reset(self):
|
|
55
|
+
for group in self.param_groups:
|
|
56
|
+
group['step'] = 0
|
|
57
|
+
for p in group['params']:
|
|
58
|
+
state = self.state[p]
|
|
59
|
+
|
|
60
|
+
state['exp_avg'] = torch.zeros_like(p)
|
|
61
|
+
state['exp_avg_sq'] = torch.zeros_like(p)
|
|
62
|
+
|
|
63
|
+
@torch.no_grad()
|
|
64
|
+
def step(self, closure: CLOSURE = None) -> LOSS:
|
|
65
|
+
loss: LOSS = None
|
|
66
|
+
if closure is not None:
|
|
67
|
+
with torch.enable_grad():
|
|
68
|
+
loss = closure()
|
|
69
|
+
|
|
70
|
+
for group in self.param_groups:
|
|
71
|
+
if 'step' in group:
|
|
72
|
+
group['step'] += 1
|
|
73
|
+
else:
|
|
74
|
+
group['step'] = 1
|
|
75
|
+
|
|
76
|
+
beta1, beta2 = group['betas']
|
|
77
|
+
|
|
78
|
+
bias_correction1: float = self.debias(beta1, group['step'])
|
|
79
|
+
bias_correction2: float = self.debias(beta2, group['step'])
|
|
80
|
+
|
|
81
|
+
step_size: float = group['lr'] * np.log(np.sqrt(group['step'] + 1) * self.sq2)
|
|
82
|
+
|
|
83
|
+
for p in group['params']:
|
|
84
|
+
if p.grad is None:
|
|
85
|
+
continue
|
|
86
|
+
|
|
87
|
+
grad = p.grad
|
|
88
|
+
if grad.is_sparse:
|
|
89
|
+
raise NoSparseGradientError(str(self))
|
|
90
|
+
|
|
91
|
+
state = self.state[p]
|
|
92
|
+
if len(state) == 0:
|
|
93
|
+
state['exp_avg'] = torch.zeros_like(p)
|
|
94
|
+
state['exp_avg_sq'] = torch.zeros_like(p)
|
|
95
|
+
|
|
96
|
+
self.apply_weight_decay(
|
|
97
|
+
p=p,
|
|
98
|
+
grad=grad,
|
|
99
|
+
lr=group['lr'],
|
|
100
|
+
weight_decay=group['weight_decay'],
|
|
101
|
+
weight_decouple=group['weight_decouple'],
|
|
102
|
+
fixed_decay=group['fixed_decay'],
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
exp_avg, exp_avg_sq = state['exp_avg'], state['exp_avg_sq']
|
|
106
|
+
exp_avg.mul_(beta1).add_(grad, alpha=1.0 - beta1)
|
|
107
|
+
exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1.0 - beta2)
|
|
108
|
+
|
|
109
|
+
d1 = 1.0 + exp_avg_sq.div(exp_avg_sq.add(group['eps'])) * (1.0 - bias_correction2)
|
|
110
|
+
|
|
111
|
+
exp_avg_p2 = exp_avg.pow(2)
|
|
112
|
+
d2 = 1.0 + exp_avg_p2.div(exp_avg_p2.add(group['eps'])) * (1.0 - bias_correction1)
|
|
113
|
+
|
|
114
|
+
m_tilde = exp_avg.div(bias_correction1) * d1
|
|
115
|
+
v_tilde = exp_avg_sq.div(bias_correction2) * d2
|
|
116
|
+
|
|
117
|
+
g_tilde = grad.div(bias_correction1) * d1
|
|
118
|
+
|
|
119
|
+
update = (m_tilde + g_tilde) / v_tilde.sqrt().add_(group['eps'])
|
|
120
|
+
|
|
121
|
+
p.add_(update, alpha=-step_size)
|
|
122
|
+
|
|
123
|
+
return loss
|
|
@@ -11,7 +11,7 @@ from pytorch_optimizer.base.types import BETAS, CLOSURE, DEFAULTS, LOSS, PARAMET
|
|
|
11
11
|
class Ranger25(BaseOptimizer):
|
|
12
12
|
r"""Mixin' every fancy optimizer hacks.
|
|
13
13
|
|
|
14
|
-
ADOPT + AdEMAMix + Cautious + StableAdamW + Adam-Atan2
|
|
14
|
+
ADOPT + AdEMAMix + Cautious + StableAdamW + Adam-Atan2 + OrthoGrad
|
|
15
15
|
|
|
16
16
|
:param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
|
|
17
17
|
:param lr: float. learning rate.
|
|
@@ -23,6 +23,7 @@ class Ranger25(BaseOptimizer):
|
|
|
23
23
|
:param t_alpha_beta3: Optional[float]. total number of iterations is preferred when needed.
|
|
24
24
|
:param cautious: bool. whether to use the Cautious variant.
|
|
25
25
|
:param stable_adamw: bool. whether to use stable AdamW variant.
|
|
26
|
+
:param orthograd: bool. whether to use orthograd variant.
|
|
26
27
|
:param eps: Optional[float]. term added to the denominator to improve numerical stability. when eps is None and
|
|
27
28
|
stable_adamw is False, adam-atan2 feature will be used.
|
|
28
29
|
"""
|
|
@@ -39,6 +40,7 @@ class Ranger25(BaseOptimizer):
|
|
|
39
40
|
t_alpha_beta3: Optional[float] = None,
|
|
40
41
|
cautious: bool = True,
|
|
41
42
|
stable_adamw: bool = True,
|
|
43
|
+
orthograd: bool = True,
|
|
42
44
|
eps: Optional[float] = 1e-8,
|
|
43
45
|
**kwargs,
|
|
44
46
|
):
|
|
@@ -51,6 +53,7 @@ class Ranger25(BaseOptimizer):
|
|
|
51
53
|
|
|
52
54
|
self.cautious = cautious
|
|
53
55
|
self.stable_adamw: bool = stable_adamw if isinstance(eps, float) else False
|
|
56
|
+
self.orthograd = orthograd
|
|
54
57
|
|
|
55
58
|
defaults: DEFAULTS = {
|
|
56
59
|
'lr': lr,
|
|
@@ -97,6 +100,21 @@ class Ranger25(BaseOptimizer):
|
|
|
97
100
|
beta3,
|
|
98
101
|
)
|
|
99
102
|
|
|
103
|
+
@torch.no_grad()
|
|
104
|
+
def orthogonalize_gradients(self, params, eps: float = 1e-16) -> None:
|
|
105
|
+
for p in params:
|
|
106
|
+
if p.grad is None or p.grad.is_sparse:
|
|
107
|
+
continue
|
|
108
|
+
|
|
109
|
+
w = p.view(-1)
|
|
110
|
+
g = p.grad.view(-1)
|
|
111
|
+
|
|
112
|
+
proj = torch.dot(w, g).div_(torch.dot(w, w).add_(eps))
|
|
113
|
+
g_ortho = g.to(dtype=torch.float32, copy=True).sub_(w, alpha=proj)
|
|
114
|
+
g_ortho_scaled = g_ortho.mul_(g.norm(2).div_(g_ortho.norm(2).add_(eps)))
|
|
115
|
+
|
|
116
|
+
p.grad.copy_(g_ortho_scaled.view_as(p.grad))
|
|
117
|
+
|
|
100
118
|
@torch.no_grad()
|
|
101
119
|
def step(self, closure: CLOSURE = None) -> LOSS:
|
|
102
120
|
loss: LOSS = None
|
|
@@ -104,6 +122,10 @@ class Ranger25(BaseOptimizer):
|
|
|
104
122
|
with torch.enable_grad():
|
|
105
123
|
loss = closure()
|
|
106
124
|
|
|
125
|
+
if self.orthograd:
|
|
126
|
+
for group in self.param_groups:
|
|
127
|
+
self.orthogonalize_gradients(group['params'])
|
|
128
|
+
|
|
107
129
|
for group in self.param_groups:
|
|
108
130
|
if 'step' in group:
|
|
109
131
|
group['step'] += 1
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import torch
|
|
2
|
+
|
|
3
|
+
from pytorch_optimizer.base.exception import NoSparseGradientError
|
|
4
|
+
from pytorch_optimizer.base.optimizer import BaseOptimizer
|
|
5
|
+
from pytorch_optimizer.base.types import BETAS, CLOSURE, DEFAULTS, LOSS, PARAMETERS
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class FOCUS(BaseOptimizer):
|
|
9
|
+
r"""First Order Concentrated Updating Scheme.
|
|
10
|
+
|
|
11
|
+
:param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
|
|
12
|
+
:param lr: float. learning rate.
|
|
13
|
+
:param betas: BETAS. coefficients used for computing running averages of gradient and the squared hessian trace.
|
|
14
|
+
:param gamma: float. control the strength of the attraction.
|
|
15
|
+
:param weight_decay: float. weight decay (L2 penalty).
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def __init__(
|
|
19
|
+
self,
|
|
20
|
+
params: PARAMETERS,
|
|
21
|
+
lr: float = 1e-2,
|
|
22
|
+
betas: BETAS = (0.9, 0.999),
|
|
23
|
+
gamma: float = 0.1,
|
|
24
|
+
weight_decay: float = 0.0,
|
|
25
|
+
**kwargs,
|
|
26
|
+
):
|
|
27
|
+
self.validate_learning_rate(lr)
|
|
28
|
+
self.validate_betas(betas)
|
|
29
|
+
self.validate_range(gamma, 'gamma', 0.0, 1.0, '[)')
|
|
30
|
+
self.validate_non_negative(weight_decay, 'weight_decay')
|
|
31
|
+
|
|
32
|
+
defaults: DEFAULTS = {'lr': lr, 'betas': betas, 'gamma': gamma, 'weight_decay': weight_decay}
|
|
33
|
+
|
|
34
|
+
super().__init__(params, defaults)
|
|
35
|
+
|
|
36
|
+
def __str__(self) -> str:
|
|
37
|
+
return 'FOCUS'
|
|
38
|
+
|
|
39
|
+
@torch.no_grad()
|
|
40
|
+
def reset(self):
|
|
41
|
+
for group in self.param_groups:
|
|
42
|
+
group['step'] = 0
|
|
43
|
+
for p in group['params']:
|
|
44
|
+
state = self.state[p]
|
|
45
|
+
|
|
46
|
+
state['exp_avg'] = torch.zeros_like(p)
|
|
47
|
+
state['pbar'] = torch.zeros_like(p)
|
|
48
|
+
|
|
49
|
+
@torch.no_grad()
|
|
50
|
+
def step(self, closure: CLOSURE = None) -> LOSS:
|
|
51
|
+
loss: LOSS = None
|
|
52
|
+
if closure is not None:
|
|
53
|
+
with torch.enable_grad():
|
|
54
|
+
loss = closure()
|
|
55
|
+
|
|
56
|
+
for group in self.param_groups:
|
|
57
|
+
if 'step' in group:
|
|
58
|
+
group['step'] += 1
|
|
59
|
+
else:
|
|
60
|
+
group['step'] = 1
|
|
61
|
+
|
|
62
|
+
beta1, beta2 = group['betas']
|
|
63
|
+
|
|
64
|
+
bias_correction2: float = self.debias(beta2, group['step'])
|
|
65
|
+
|
|
66
|
+
weight_decay: float = group['weight_decay']
|
|
67
|
+
|
|
68
|
+
for p in group['params']:
|
|
69
|
+
if p.grad is None:
|
|
70
|
+
continue
|
|
71
|
+
|
|
72
|
+
grad = p.grad
|
|
73
|
+
if grad.is_sparse:
|
|
74
|
+
raise NoSparseGradientError(str(self))
|
|
75
|
+
|
|
76
|
+
state = self.state[p]
|
|
77
|
+
if len(state) == 0:
|
|
78
|
+
state['exp_avg'] = torch.zeros_like(p)
|
|
79
|
+
state['pbar'] = torch.zeros_like(p)
|
|
80
|
+
|
|
81
|
+
exp_avg, pbar = state['exp_avg'], state['pbar']
|
|
82
|
+
|
|
83
|
+
exp_avg.mul_(beta1).add_(grad, alpha=1.0 - beta1)
|
|
84
|
+
pbar.mul_(beta2).add_(p, alpha=1.0 - beta2)
|
|
85
|
+
|
|
86
|
+
pbar_hat = pbar / bias_correction2
|
|
87
|
+
|
|
88
|
+
if weight_decay > 0.0:
|
|
89
|
+
p.add_(pbar_hat, alpha=-group['lr'] * weight_decay)
|
|
90
|
+
|
|
91
|
+
update = (p - pbar_hat).sign_().mul_(group['gamma']).add_(torch.sign(exp_avg))
|
|
92
|
+
|
|
93
|
+
p.add_(update, alpha=-group['lr'])
|
|
94
|
+
|
|
95
|
+
return loss
|
{pytorch_optimizer-3.3.4 → pytorch_optimizer-3.4.0}/pytorch_optimizer/optimizer/lookahead.py
RENAMED
|
@@ -29,13 +29,7 @@ class Lookahead(BaseOptimizer):
|
|
|
29
29
|
self.validate_range(alpha, 'alpha', 0.0, 1.0)
|
|
30
30
|
self.validate_options(pullback_momentum, 'pullback_momentum', ['none', 'reset', 'pullback'])
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
self.optimizer = optimizer
|
|
34
|
-
elif 'params' in kwargs:
|
|
35
|
-
params = kwargs.pop('params')
|
|
36
|
-
self.optimizer = optimizer(params, **kwargs)
|
|
37
|
-
else:
|
|
38
|
-
raise ValueError('Need to pass `params` when you pass the torch.optim.Optimizer instance.')
|
|
32
|
+
self.optimizer: Optimizer = self.load_optimizer(optimizer, **kwargs)
|
|
39
33
|
|
|
40
34
|
self._optimizer_step_pre_hooks: Dict[int, Callable] = {}
|
|
41
35
|
self._optimizer_step_post_hooks: Dict[int, Callable] = {}
|
|
@@ -95,10 +95,10 @@ class Muon(BaseOptimizer):
|
|
|
95
95
|
|
|
96
96
|
return new_params
|
|
97
97
|
|
|
98
|
-
def set_muon_state(self, params: PARAMETERS, adamw_params: PARAMETERS
|
|
98
|
+
def set_muon_state(self, params: PARAMETERS, adamw_params: PARAMETERS) -> None:
|
|
99
99
|
r"""Set use_muon flag."""
|
|
100
100
|
for p in params:
|
|
101
|
-
self.state[p]['use_muon'] = p.ndim >= 2
|
|
101
|
+
self.state[p]['use_muon'] = p.ndim >= 2
|
|
102
102
|
|
|
103
103
|
for p in adamw_params:
|
|
104
104
|
self.state[p]['use_muon'] = False
|