pytorch-optimizer 3.3.2__tar.gz → 3.3.4__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.
Files changed (117) hide show
  1. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/PKG-INFO +15 -6
  2. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/README.md +11 -2
  3. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pyproject.toml +10 -10
  4. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/__init__.py +6 -0
  5. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/base/optimizer.py +10 -0
  6. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/base/scheduler.py +4 -3
  7. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/base/types.py +1 -0
  8. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/lr_scheduler/cosine_anealing.py +3 -4
  9. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/lr_scheduler/rex.py +3 -4
  10. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/__init__.py +23 -8
  11. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/adafactor.py +2 -2
  12. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/adamp.py +4 -3
  13. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/adamw.py +2 -4
  14. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/ademamix.py +7 -1
  15. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/adopt.py +9 -2
  16. pytorch_optimizer-3.3.4/pytorch_optimizer/optimizer/experimental/__init__.py +0 -0
  17. pytorch_optimizer-3.3.4/pytorch_optimizer/optimizer/experimental/ranger25.py +175 -0
  18. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/fp16.py +31 -36
  19. pytorch_optimizer-3.3.4/pytorch_optimizer/optimizer/grams.py +108 -0
  20. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/lookahead.py +13 -5
  21. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/nero.py +4 -4
  22. pytorch_optimizer-3.3.4/pytorch_optimizer/optimizer/orthograd.py +66 -0
  23. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/pcgrad.py +5 -5
  24. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/prodigy.py +12 -6
  25. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/rotograd.py +2 -2
  26. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/sam.py +4 -3
  27. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/sgd.py +2 -2
  28. pytorch_optimizer-3.3.4/pytorch_optimizer/optimizer/spam.py +269 -0
  29. pytorch_optimizer-3.3.4/pytorch_optimizer/optimizer/tam.py +221 -0
  30. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/trac.py +13 -5
  31. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/LICENSE +0 -0
  32. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/base/__init__.py +0 -0
  33. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/base/exception.py +0 -0
  34. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/loss/__init__.py +0 -0
  35. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/loss/bi_tempered.py +0 -0
  36. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/loss/cross_entropy.py +0 -0
  37. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/loss/dice.py +0 -0
  38. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/loss/f1.py +0 -0
  39. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/loss/focal.py +0 -0
  40. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/loss/jaccard.py +0 -0
  41. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/loss/ldam.py +0 -0
  42. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/loss/lovasz.py +0 -0
  43. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/loss/tversky.py +0 -0
  44. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/lr_scheduler/__init__.py +0 -0
  45. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/lr_scheduler/chebyshev.py +0 -0
  46. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/lr_scheduler/experimental/__init__.py +0 -0
  47. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/lr_scheduler/experimental/deberta_v3_lr_scheduler.py +0 -0
  48. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/lr_scheduler/linear_warmup.py +0 -0
  49. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/lr_scheduler/proportion.py +0 -0
  50. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/lr_scheduler/wsd.py +0 -0
  51. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/a2grad.py +0 -0
  52. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/adabelief.py +0 -0
  53. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/adabound.py +0 -0
  54. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/adadelta.py +0 -0
  55. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/adahessian.py +0 -0
  56. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/adai.py +0 -0
  57. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/adalite.py +0 -0
  58. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/adam_mini.py +0 -0
  59. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/adamax.py +0 -0
  60. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/adamg.py +0 -0
  61. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/adamod.py +0 -0
  62. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/adams.py +0 -0
  63. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/adan.py +0 -0
  64. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/adanorm.py +0 -0
  65. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/adapnm.py +0 -0
  66. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/adashift.py +0 -0
  67. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/adasmooth.py +0 -0
  68. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/agc.py +0 -0
  69. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/aggmo.py +0 -0
  70. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/aida.py +0 -0
  71. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/alig.py +0 -0
  72. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/amos.py +0 -0
  73. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/apollo.py +0 -0
  74. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/avagrad.py +0 -0
  75. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/came.py +0 -0
  76. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/dadapt.py +0 -0
  77. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/demo.py +0 -0
  78. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/diffgrad.py +0 -0
  79. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/fadam.py +0 -0
  80. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/fromage.py +0 -0
  81. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/ftrl.py +0 -0
  82. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/galore.py +0 -0
  83. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/galore_utils.py +0 -0
  84. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/gc.py +0 -0
  85. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/gravity.py +0 -0
  86. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/grokfast.py +0 -0
  87. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/kate.py +0 -0
  88. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/lamb.py +0 -0
  89. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/laprop.py +0 -0
  90. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/lars.py +0 -0
  91. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/lion.py +0 -0
  92. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/lomo.py +0 -0
  93. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/madgrad.py +0 -0
  94. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/mars.py +0 -0
  95. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/msvag.py +0 -0
  96. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/muon.py +0 -0
  97. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/novograd.py +0 -0
  98. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/padam.py +0 -0
  99. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/pid.py +0 -0
  100. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/pnm.py +0 -0
  101. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/qhadam.py +0 -0
  102. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/qhm.py +0 -0
  103. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/radam.py +0 -0
  104. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/ranger.py +0 -0
  105. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/ranger21.py +0 -0
  106. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/schedulefree.py +0 -0
  107. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/sgdp.py +0 -0
  108. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/shampoo.py +0 -0
  109. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/shampoo_utils.py +0 -0
  110. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/sm3.py +0 -0
  111. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/soap.py +0 -0
  112. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/sophia.py +0 -0
  113. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/srmm.py +0 -0
  114. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/swats.py +0 -0
  115. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/tiger.py +0 -0
  116. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/utils.py +0 -0
  117. {pytorch_optimizer-3.3.2 → pytorch_optimizer-3.3.4}/pytorch_optimizer/optimizer/yogi.py +0 -0
@@ -1,10 +1,9 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.3
2
2
  Name: pytorch_optimizer
3
- Version: 3.3.2
3
+ Version: 3.3.4
4
4
  Summary: optimizer & lr scheduler & objective function collections in PyTorch
5
- Home-page: https://github.com/kozistr/pytorch_optimizer
6
5
  License: Apache-2.0
7
- 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,Gravity,GrokFast,GSAM,Kate,Lamb,LaProp,LARS,Lion,LOMO,Lookahead,MADGRAD,MARS,MSVAG,Muno,Nero,NovoGrad,PAdam,PCGrad,PID,PNM,Prodigy,QHAdam,QHM,RAdam,Ranger,Ranger21,RotoGrad,SAM,ScheduleFreeSGD,ScheduleFreeAdamW,ScheduleFreeRAdam,SGDP,Shampoo,ScalableShampoo,SGDW,SignSGD,SM3,SOAP,SopihaH,SRMM,StableAdamW,SWATS,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,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
8
7
  Author: kozistr
9
8
  Author-email: kozistr@gmail.com
10
9
  Maintainer: kozistr
@@ -36,6 +35,7 @@ Requires-Dist: numpy (<=1.24.4) ; python_version < "3.9"
36
35
  Requires-Dist: numpy (>1.24.4) ; python_version >= "3.9"
37
36
  Requires-Dist: torch (>=1.10) ; python_version >= "3.8"
38
37
  Project-URL: Documentation, https://pytorch-optimizers.readthedocs.io/en/latest
38
+ Project-URL: Homepage, https://github.com/kozistr/pytorch_optimizer
39
39
  Project-URL: Repository, https://github.com/kozistr/pytorch_optimizer
40
40
  Description-Content-Type: text/markdown
41
41
 
@@ -51,8 +51,8 @@ Description-Content-Type: text/markdown
51
51
 
52
52
  ## The reasons why you use `pytorch-optimizer`.
53
53
 
54
- * Wide range of supported optimizers. Currently, **86 optimizers (+ `bitsandbytes`, `qgalore`, `torchao`)**, **16 lr schedulers**, and **13 loss functions** are supported!
55
- * Including many variants such as `Cautious`, `AdamD`, `Gradient Centrailiaztion`
54
+ * Wide range of supported optimizers. Currently, **92 optimizers (+ `bitsandbytes`, `qgalore`, `torchao`)**, **16 lr schedulers**, and **13 loss functions** are supported!
55
+ * Including many variants such as `ADOPT`, `Cautious`, `AdamD`, `StableAdamW`, and `Gradient Centrailiaztion`
56
56
  * Easy to use, clean, and tested codes
57
57
  * Active maintenance
58
58
  * Somewhat a bit more optimized compared to the original implementation
@@ -236,6 +236,11 @@ get_supported_optimizers(['adam*', 'ranger*'])
236
236
  | APOLLO | *SGD-like Memory, AdamW-level Performance* | [github](https://github.com/zhuhanqing/APOLLO) | <https://arxiv.org/abs/2412.05270> | [cite](https://github.com/zhuhanqing/APOLLO?tab=readme-ov-file#-citation) |
237
237
  | MARS | *Unleashing the Power of Variance Reduction for Training Large Models* | [github](https://github.com/AGI-Arena/MARS) | <https://arxiv.org/abs/2411.10438> | [cite](https://github.com/AGI-Arena/MARS/tree/main?tab=readme-ov-file#citation) |
238
238
  | SGDSaI | *No More Adam: Learning Rate Scaling at Initialization is All You Need* | [github](https://github.com/AnonymousAlethiometer/SGD_SaI) | <https://arxiv.org/abs/2411.10438> | [cite](https://github.com/AnonymousAlethiometer/SGD_SaI?tab=readme-ov-file#citation) |
239
+ | Grams | *Gradient Descent with Adaptive Momentum Scaling* | | <https://arxiv.org/abs/2412.17107> | [cite](https://ui.adsabs.harvard.edu/abs/2024arXiv241217107C/exportcitation) |
240
+ | OrthoGrad | *Grokking at the Edge of Numerical Stability* | [github](https://github.com/LucasPrietoAl/grokking-at-the-edge-of-numerical-stability) | <https://arxiv.org/abs/2501.04697> | [cite](https://github.com/LucasPrietoAl/grokking-at-the-edge-of-numerical-stability?tab=readme-ov-file#citation) |
241
+ | Adam-ATAN2 | *Scaling Exponents Across Parameterizations and Optimizers* | | <https://arxiv.org/abs/2407.05872> | [cite](https://ui.adsabs.harvard.edu/abs/2024arXiv240705872E/exportcitation) |
242
+ | 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
+ | TAM | *Torque-Aware Momentum* | | <https://arxiv.org/abs/2412.18790> | [cite](https://ui.adsabs.harvard.edu/abs/2024arXiv241218790M/exportcitation) |
239
244
 
240
245
  ## Supported LR Scheduler
241
246
 
@@ -411,6 +416,10 @@ Correcting the norm of a gradient in each iteration based on the adaptive traini
411
416
 
412
417
  Updates only occur when the proposed update direction aligns with the current gradient.
413
418
 
419
+ ### Adam-ATAN2
420
+
421
+ Adam-atan2 is a new numerically stable, scale-invariant version of Adam that eliminates the epsilon hyperparameter.
422
+
414
423
  ## Frequently asked questions
415
424
 
416
425
  [here](docs/qa.md)
@@ -10,8 +10,8 @@
10
10
 
11
11
  ## The reasons why you use `pytorch-optimizer`.
12
12
 
13
- * Wide range of supported optimizers. Currently, **86 optimizers (+ `bitsandbytes`, `qgalore`, `torchao`)**, **16 lr schedulers**, and **13 loss functions** are supported!
14
- * Including many variants such as `Cautious`, `AdamD`, `Gradient Centrailiaztion`
13
+ * Wide range of supported optimizers. Currently, **92 optimizers (+ `bitsandbytes`, `qgalore`, `torchao`)**, **16 lr schedulers**, and **13 loss functions** are supported!
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
17
17
  * Somewhat a bit more optimized compared to the original implementation
@@ -195,6 +195,11 @@ get_supported_optimizers(['adam*', 'ranger*'])
195
195
  | APOLLO | *SGD-like Memory, AdamW-level Performance* | [github](https://github.com/zhuhanqing/APOLLO) | <https://arxiv.org/abs/2412.05270> | [cite](https://github.com/zhuhanqing/APOLLO?tab=readme-ov-file#-citation) |
196
196
  | MARS | *Unleashing the Power of Variance Reduction for Training Large Models* | [github](https://github.com/AGI-Arena/MARS) | <https://arxiv.org/abs/2411.10438> | [cite](https://github.com/AGI-Arena/MARS/tree/main?tab=readme-ov-file#citation) |
197
197
  | SGDSaI | *No More Adam: Learning Rate Scaling at Initialization is All You Need* | [github](https://github.com/AnonymousAlethiometer/SGD_SaI) | <https://arxiv.org/abs/2411.10438> | [cite](https://github.com/AnonymousAlethiometer/SGD_SaI?tab=readme-ov-file#citation) |
198
+ | Grams | *Gradient Descent with Adaptive Momentum Scaling* | | <https://arxiv.org/abs/2412.17107> | [cite](https://ui.adsabs.harvard.edu/abs/2024arXiv241217107C/exportcitation) |
199
+ | OrthoGrad | *Grokking at the Edge of Numerical Stability* | [github](https://github.com/LucasPrietoAl/grokking-at-the-edge-of-numerical-stability) | <https://arxiv.org/abs/2501.04697> | [cite](https://github.com/LucasPrietoAl/grokking-at-the-edge-of-numerical-stability?tab=readme-ov-file#citation) |
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
+ | 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
+ | TAM | *Torque-Aware Momentum* | | <https://arxiv.org/abs/2412.18790> | [cite](https://ui.adsabs.harvard.edu/abs/2024arXiv241218790M/exportcitation) |
198
203
 
199
204
  ## Supported LR Scheduler
200
205
 
@@ -370,6 +375,10 @@ Correcting the norm of a gradient in each iteration based on the adaptive traini
370
375
 
371
376
  Updates only occur when the proposed update direction aligns with the current gradient.
372
377
 
378
+ ### Adam-ATAN2
379
+
380
+ Adam-atan2 is a new numerically stable, scale-invariant version of Adam that eliminates the epsilon hyperparameter.
381
+
373
382
  ## Frequently asked questions
374
383
 
375
384
  [here](docs/qa.md)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "pytorch_optimizer"
3
- version = "3.3.2"
3
+ version = "3.3.4"
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", "FAdam", "Fromage", "FTRL", "GaLore", "Gravity", "GrokFast", "GSAM", "Kate",
18
- "Lamb", "LaProp", "LARS", "Lion", "LOMO", "Lookahead", "MADGRAD", "MARS", "MSVAG", "Muno", "Nero", "NovoGrad",
19
- "PAdam", "PCGrad", "PID", "PNM", "Prodigy", "QHAdam", "QHM", "RAdam", "Ranger", "Ranger21", "RotoGrad", "SAM",
20
- "ScheduleFreeSGD", "ScheduleFreeAdamW", "ScheduleFreeRAdam", "SGDP", "Shampoo", "ScalableShampoo", "SGDW",
21
- "SignSGD", "SM3", "SOAP", "SopihaH", "SRMM", "StableAdamW", "SWATS", "Tiger", "TRAC", "WSAM", "Yogi", "BCE",
22
- "BCEFocal", "Focal", "FocalCosine", "SoftF1", "Dice", "LDAM", "Jaccard", "Bi-Tempered", "Tversky", "FocalTversky",
23
- "LovaszHinge", "bitsandbytes", "WSD", "QGaLore",
17
+ "DAdaptLion", "DeMo", "DiffGrad", "FAdam", "Fromage", "FTRL", "GaLore", "Grams", "Gravity", "GrokFast", "GSAM",
18
+ "Kate", "Lamb", "LaProp", "LARS", "Lion", "LOMO", "Lookahead", "MADGRAD", "MARS", "MSVAG", "Muno", "Nero",
19
+ "NovoGrad", "OrthoGrad", "PAdam", "PCGrad", "PID", "PNM", "Prodigy", "QHAdam", "QHM", "RAdam", "Ranger",
20
+ "Ranger21", "RotoGrad", "SAM", "ScheduleFreeSGD", "ScheduleFreeAdamW", "ScheduleFreeRAdam", "SGDP", "Shampoo",
21
+ "ScalableShampoo", "SGDW", "SignSGD", "SM3", "SOAP", "SopihaH", "SPAM", "SRMM", "StableAdamW", "SWATS", "TAM",
22
+ "Tiger", "TRAC", "WSAM", "Yogi", "BCE", "BCEFocal", "Focal", "FocalCosine", "SoftF1", "Dice", "LDAM", "Jaccard",
23
+ "Bi-Tempered", "Tversky", "FocalTversky", "LovaszHinge", "bitsandbytes", "WSD", "QGaLore",
24
24
  ]
25
25
  classifiers = [
26
26
  "License :: OSI Approved :: Apache Software License",
@@ -97,8 +97,8 @@ select = [
97
97
  "TID", "ARG", "ERA", "RUF", "YTT", "PL", "Q"
98
98
  ]
99
99
  ignore = [
100
- "B905", "D100", "D102", "D104", "D105", "D107", "D203", "D213", "D413", "PIE790", "PLR0912", "PLR0913", "PLR0915",
101
- "PLR2004", "RUF013", "Q003", "ARG002",
100
+ "A005", "B905", "D100", "D102", "D104", "D105", "D107", "D203", "D213", "D413", "PIE790", "PLR0912", "PLR0913",
101
+ "PLR0915", "PLR2004", "RUF013", "Q003", "ARG002",
102
102
  ]
103
103
  fixable = ["ALL"]
104
104
  unfixable = ["F401"]
@@ -61,8 +61,10 @@ from pytorch_optimizer.optimizer import (
61
61
  SGDW,
62
62
  SM3,
63
63
  SOAP,
64
+ SPAM,
64
65
  SRMM,
65
66
  SWATS,
67
+ TAM,
66
68
  TRAC,
67
69
  WSAM,
68
70
  A2Grad,
@@ -87,6 +89,7 @@ from pytorch_optimizer.optimizer import (
87
89
  AdaPNM,
88
90
  AdaShift,
89
91
  AdaSmooth,
92
+ AdaTAM,
90
93
  AdEMAMix,
91
94
  AggMo,
92
95
  Aida,
@@ -105,6 +108,7 @@ from pytorch_optimizer.optimizer import (
105
108
  FAdam,
106
109
  Fromage,
107
110
  GaLore,
111
+ Grams,
108
112
  Gravity,
109
113
  GrokFastAdamW,
110
114
  Kate,
@@ -115,6 +119,7 @@ from pytorch_optimizer.optimizer import (
115
119
  Muon,
116
120
  Nero,
117
121
  NovoGrad,
122
+ OrthoGrad,
118
123
  PAdam,
119
124
  PCGrad,
120
125
  Prodigy,
@@ -122,6 +127,7 @@ from pytorch_optimizer.optimizer import (
122
127
  RAdam,
123
128
  Ranger,
124
129
  Ranger21,
130
+ Ranger25,
125
131
  RotoGrad,
126
132
  SafeFP16Optimizer,
127
133
  ScalableShampoo,
@@ -266,6 +266,16 @@ class BaseOptimizer(ABC, Optimizer):
266
266
  mask.mul_(mask.numel() / (mask.sum() + 1))
267
267
  update.mul_(mask)
268
268
 
269
+ @staticmethod
270
+ def get_stable_adamw_rms(grad: torch.Tensor, exp_avg_sq: torch.Tensor, eps: float = 1e-16) -> float:
271
+ r"""Get StableAdamW RMS.
272
+
273
+ :param grad: torch.Tensor. gradient.
274
+ :param exp_avg_sq: torch.Tensor. exp_avg_sq.
275
+ :param eps: float. epsilon.
276
+ """
277
+ return grad.pow(2).div_(exp_avg_sq.clip(min=eps)).mean().sqrt_().clip_(min=1.0).item()
278
+
269
279
  @staticmethod
270
280
  def validate_range(x: float, name: str, low: float, high: float, range_type: str = '[)') -> None:
271
281
  if range_type == '[)' and not low <= x < high:
@@ -1,8 +1,9 @@
1
1
  from abc import ABC, abstractmethod
2
2
  from typing import List
3
3
 
4
+ from torch.optim import Optimizer
5
+
4
6
  from pytorch_optimizer.base.exception import NegativeLRError, NegativeStepError
5
- from pytorch_optimizer.base.types import OPTIMIZER
6
7
 
7
8
 
8
9
  class BaseLinearWarmupScheduler(ABC):
@@ -10,7 +11,7 @@ class BaseLinearWarmupScheduler(ABC):
10
11
 
11
12
  The LR Scheduler class based on this class has linear warmup strategy.
12
13
 
13
- :param optimizer: Optimizer. OPTIMIZER. It will set learning rate to all trainable parameters in optimizer.
14
+ :param optimizer: Optimizer. It will set learning rate to all trainable parameters in optimizer.
14
15
  :param t_max: int. total steps to train.
15
16
  :param max_lr: float. maximum lr.
16
17
  :param min_lr: float. minimum lr.
@@ -20,7 +21,7 @@ class BaseLinearWarmupScheduler(ABC):
20
21
 
21
22
  def __init__(
22
23
  self,
23
- optimizer: OPTIMIZER,
24
+ optimizer: Optimizer,
24
25
  t_max: int,
25
26
  max_lr: float,
26
27
  min_lr: float = 0.0,
@@ -11,6 +11,7 @@ DEFAULTS = Dict
11
11
  PARAMETERS = Optional[Union[Iterable[Dict], Iterable[torch.Tensor]]]
12
12
  STATE = Dict
13
13
  OPTIMIZER = Type[Optimizer]
14
+ OPTIMIZER_INSTANCE_OR_CLASS = Union[OPTIMIZER, Optimizer]
14
15
  SCHEDULER = Type[LRScheduler]
15
16
 
16
17
  HUTCHINSON_G = Literal['gaussian', 'rademacher']
@@ -1,10 +1,9 @@
1
1
  import math
2
2
  from typing import List, Optional
3
3
 
4
+ from torch.optim import Optimizer
4
5
  from torch.optim.lr_scheduler import LRScheduler
5
6
 
6
- from pytorch_optimizer.base.types import OPTIMIZER
7
-
8
7
 
9
8
  class CosineAnnealingWarmupRestarts(LRScheduler):
10
9
  r"""CosineAnnealingWarmupRestarts.
@@ -21,7 +20,7 @@ class CosineAnnealingWarmupRestarts(LRScheduler):
21
20
 
22
21
  def __init__(
23
22
  self,
24
- optimizer: OPTIMIZER,
23
+ optimizer: Optimizer,
25
24
  first_cycle_steps: int,
26
25
  cycle_mult: float = 1.0,
27
26
  max_lr: float = 1e-4,
@@ -53,7 +52,7 @@ class CosineAnnealingWarmupRestarts(LRScheduler):
53
52
 
54
53
  self.init_lr()
55
54
 
56
- def init_lr(self):
55
+ def init_lr(self) -> None:
57
56
  self.base_lrs = []
58
57
  for param_group in self.optimizer.param_groups:
59
58
  param_group['lr'] = self.min_lr
@@ -1,9 +1,8 @@
1
1
  from typing import List, Optional
2
2
 
3
+ from torch.optim import Optimizer
3
4
  from torch.optim.lr_scheduler import LRScheduler
4
5
 
5
- from pytorch_optimizer.base.types import OPTIMIZER
6
-
7
6
 
8
7
  class REXScheduler(LRScheduler):
9
8
  r"""Revisiting Budgeted Training with an Improved Schedule.
@@ -16,7 +15,7 @@ class REXScheduler(LRScheduler):
16
15
 
17
16
  def __init__(
18
17
  self,
19
- optimizer: OPTIMIZER,
18
+ optimizer: Optimizer,
20
19
  total_steps: int,
21
20
  max_lr: float = 1.0,
22
21
  min_lr: float = 0.0,
@@ -35,7 +34,7 @@ class REXScheduler(LRScheduler):
35
34
 
36
35
  self.init_lr()
37
36
 
38
- def init_lr(self):
37
+ def init_lr(self) -> None:
39
38
  self.base_lrs = []
40
39
  for param_group in self.optimizer.param_groups:
41
40
  param_group['lr'] = self.min_lr
@@ -1,10 +1,10 @@
1
1
  import fnmatch
2
2
  from importlib.util import find_spec
3
- from typing import Dict, List, Optional, Sequence, Set, Union
3
+ from typing import Dict, List, Optional, Sequence, Set, Type, Union
4
4
 
5
5
  import torch
6
6
  from torch import nn
7
- from torch.optim import AdamW
7
+ from torch.optim import AdamW, Optimizer
8
8
 
9
9
  from pytorch_optimizer.base.types import OPTIMIZER, PARAMETERS
10
10
  from pytorch_optimizer.optimizer.a2grad import A2Grad
@@ -40,12 +40,14 @@ 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.experimental.ranger25 import Ranger25
43
44
  from pytorch_optimizer.optimizer.fadam import FAdam
44
45
  from pytorch_optimizer.optimizer.fp16 import DynamicLossScaler, SafeFP16Optimizer
45
46
  from pytorch_optimizer.optimizer.fromage import Fromage
46
47
  from pytorch_optimizer.optimizer.ftrl import FTRL
47
48
  from pytorch_optimizer.optimizer.galore import GaLore
48
49
  from pytorch_optimizer.optimizer.gc import centralize_gradient
50
+ from pytorch_optimizer.optimizer.grams import Grams
49
51
  from pytorch_optimizer.optimizer.gravity import Gravity
50
52
  from pytorch_optimizer.optimizer.grokfast import GrokFastAdamW
51
53
  from pytorch_optimizer.optimizer.kate import Kate
@@ -61,6 +63,7 @@ from pytorch_optimizer.optimizer.msvag import MSVAG
61
63
  from pytorch_optimizer.optimizer.muon import Muon
62
64
  from pytorch_optimizer.optimizer.nero import Nero
63
65
  from pytorch_optimizer.optimizer.novograd import NovoGrad
66
+ from pytorch_optimizer.optimizer.orthograd import OrthoGrad
64
67
  from pytorch_optimizer.optimizer.padam import PAdam
65
68
  from pytorch_optimizer.optimizer.pcgrad import PCGrad
66
69
  from pytorch_optimizer.optimizer.pid import PID
@@ -80,8 +83,10 @@ from pytorch_optimizer.optimizer.shampoo import ScalableShampoo, Shampoo
80
83
  from pytorch_optimizer.optimizer.sm3 import SM3
81
84
  from pytorch_optimizer.optimizer.soap import SOAP
82
85
  from pytorch_optimizer.optimizer.sophia import SophiaH
86
+ from pytorch_optimizer.optimizer.spam import SPAM
83
87
  from pytorch_optimizer.optimizer.srmm import SRMM
84
88
  from pytorch_optimizer.optimizer.swats import SWATS
89
+ from pytorch_optimizer.optimizer.tam import TAM, AdaTAM
85
90
  from pytorch_optimizer.optimizer.tiger import Tiger
86
91
  from pytorch_optimizer.optimizer.trac import TRAC
87
92
  from pytorch_optimizer.optimizer.yogi import Yogi
@@ -248,6 +253,8 @@ OPTIMIZER_LIST: List[OPTIMIZER] = [
248
253
  SRMM,
249
254
  AvaGrad,
250
255
  AdaShift,
256
+ TAM,
257
+ AdaTAM,
251
258
  AdaDelta,
252
259
  Amos,
253
260
  AdaHessian,
@@ -282,6 +289,9 @@ OPTIMIZER_LIST: List[OPTIMIZER] = [
282
289
  LaProp,
283
290
  MARS,
284
291
  SGDSaI,
292
+ Grams,
293
+ SPAM,
294
+ Ranger25,
285
295
  ]
286
296
  OPTIMIZERS: Dict[str, OPTIMIZER] = {str(optimizer.__name__).lower(): optimizer for optimizer in OPTIMIZER_LIST}
287
297
 
@@ -293,8 +303,9 @@ def create_optimizer(
293
303
  weight_decay: float = 0.0,
294
304
  wd_ban_list: List[str] = ('bias', 'LayerNorm.bias', 'LayerNorm.weight'),
295
305
  use_lookahead: bool = False,
306
+ use_orthograd: bool = False,
296
307
  **kwargs,
297
- ):
308
+ ) -> Optimizer:
298
309
  r"""Build optimizer.
299
310
 
300
311
  :param model: nn.Module. model.
@@ -302,7 +313,8 @@ def create_optimizer(
302
313
  :param lr: float. learning rate.
303
314
  :param weight_decay: float. weight decay.
304
315
  :param wd_ban_list: List[str]. weight decay ban list by layer.
305
- :param use_lookahead: bool. use lookahead.
316
+ :param use_lookahead: bool. use Lookahead.
317
+ :param use_orthograd: bool. use OrthoGrad.
306
318
  """
307
319
  optimizer_name = optimizer_name.lower()
308
320
 
@@ -310,14 +322,17 @@ def create_optimizer(
310
322
  get_optimizer_parameters(model, weight_decay, wd_ban_list) if weight_decay > 0.0 else model.parameters()
311
323
  )
312
324
 
313
- optimizer = load_optimizer(optimizer_name)
325
+ optimizer_class: OPTIMIZER = load_optimizer(optimizer_name)
314
326
 
315
327
  if optimizer_name == 'alig':
316
- optimizer = optimizer(parameters, max_lr=lr, **kwargs)
328
+ optimizer = optimizer_class(parameters, max_lr=lr, **kwargs)
317
329
  elif optimizer_name in {'lomo', 'adalomo', 'adammini'}:
318
- optimizer = optimizer(model, lr=lr, **kwargs)
330
+ optimizer = optimizer_class(model, lr=lr, **kwargs)
319
331
  else:
320
- optimizer = optimizer(parameters, lr=lr, **kwargs)
332
+ optimizer = optimizer_class(parameters, lr=lr, **kwargs)
333
+
334
+ if use_orthograd:
335
+ optimizer = OrthoGrad(optimizer, **kwargs)
321
336
 
322
337
  if use_lookahead:
323
338
  optimizer = Lookahead(
@@ -13,8 +13,8 @@ class AdaFactor(BaseOptimizer):
13
13
 
14
14
  :param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
15
15
  :param lr: float. learning rate.
16
- :param betas: BETAS. coefficients used for computing running averages of gradient and the squared
17
- hessian trace. if beta1 is None, first momentum will be skipped.
16
+ :param betas: BETAS. coefficients used for computing running averages of gradient and the squared hessian trace.
17
+ if beta1 is None, first momentum will be skipped.
18
18
  :param decay_rate: float. coefficient used to compute running averages of square gradient.
19
19
  :param weight_decay: float. weight decay (L2 penalty).
20
20
  :param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
@@ -141,6 +141,10 @@ class AdamP(BaseOptimizer):
141
141
  inv_de_nom = exp_avg_sq.rsqrt().add_(group['eps']).mul_(bias_correction2_sq)
142
142
 
143
143
  perturb = exp_avg.clone()
144
+
145
+ if self.cautious:
146
+ self.apply_cautious(perturb, grad)
147
+
144
148
  if group['nesterov']:
145
149
  perturb.mul_(beta1).addcmul_(grad, inv_de_nom, value=1.0 - beta1)
146
150
  else:
@@ -173,9 +177,6 @@ class AdamP(BaseOptimizer):
173
177
  bias_correction1=bias_correction1,
174
178
  )
175
179
 
176
- if self.cautious:
177
- self.apply_cautious(perturb, grad)
178
-
179
180
  p.add_(perturb, alpha=-step_size)
180
181
 
181
182
  return loss
@@ -107,13 +107,11 @@ class StableAdamW(BaseOptimizer):
107
107
  exp_avg.lerp_(grad, weight=beta1_comp)
108
108
  exp_avg_sq.mul_(beta2_hat).addcmul_(grad, grad, value=1.0 - beta2_hat)
109
109
 
110
- rms = grad.pow(2).div_(exp_avg_sq.clip(min=eps_p2)).mean().sqrt_()
111
-
112
- lr = group['lr'] / rms.clip(min=1.0)
110
+ lr: float = group['lr'] / self.get_stable_adamw_rms(grad, exp_avg_sq, eps=eps_p2)
113
111
 
114
112
  self.apply_weight_decay(
115
113
  p,
116
- p.grad,
114
+ grad,
117
115
  lr=lr,
118
116
  weight_decay=group['weight_decay'],
119
117
  weight_decouple=group['weight_decouple'],
@@ -19,7 +19,8 @@ class AdEMAMix(BaseOptimizer):
19
19
  :param fixed_decay: bool. fix weight decay.
20
20
  :param alpha: float. usually between 4 and 10 would work well.
21
21
  :param t_alpha_beta3: Optional[float]. total number of iterations is preferred when needed.
22
- :param cautious: bool. whether to use cautious feature.
22
+ :param cautious: bool. whether to use the Cautious variant.
23
+ :param stable_adamw: bool. whether to use stable AdamW variant.
23
24
  :param eps: float. term added to the denominator to improve numerical stability.
24
25
  """
25
26
 
@@ -34,6 +35,7 @@ class AdEMAMix(BaseOptimizer):
34
35
  alpha: float = 5.0,
35
36
  t_alpha_beta3: Optional[float] = None,
36
37
  cautious: bool = False,
38
+ stable_adamw: bool = False,
37
39
  eps: float = 1e-8,
38
40
  **kwargs,
39
41
  ):
@@ -45,6 +47,7 @@ class AdEMAMix(BaseOptimizer):
45
47
  self.validate_non_negative(eps, 'eps')
46
48
 
47
49
  self.cautious = cautious
50
+ self.stable_adamw = stable_adamw
48
51
 
49
52
  defaults: DEFAULTS = {
50
53
  'lr': lr,
@@ -150,6 +153,9 @@ class AdEMAMix(BaseOptimizer):
150
153
  if self.cautious:
151
154
  self.apply_cautious(update, grad)
152
155
 
156
+ if self.stable_adamw:
157
+ step_size /= self.get_stable_adamw_rms(grad, exp_avg_sq)
158
+
153
159
  update.add_(exp_avg_slow, alpha=alpha_t).div_(de_nom)
154
160
 
155
161
  p.add_(update, alpha=-step_size)
@@ -18,6 +18,7 @@ class ADOPT(BaseOptimizer):
18
18
  :param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
19
19
  :param fixed_decay: bool. fix weight decay.
20
20
  :param cautious: bool. whether to use the Cautious variant.
21
+ :param stable_adamw: bool. whether to use stable AdamW variant.
21
22
  :param eps: float. term added to the denominator to improve numerical stability.
22
23
  """
23
24
 
@@ -31,6 +32,7 @@ class ADOPT(BaseOptimizer):
31
32
  weight_decouple: bool = False,
32
33
  fixed_decay: bool = False,
33
34
  cautious: bool = False,
35
+ stable_adamw: bool = False,
34
36
  eps: float = 1e-6,
35
37
  **kwargs,
36
38
  ):
@@ -41,6 +43,7 @@ class ADOPT(BaseOptimizer):
41
43
 
42
44
  self.clip_lambda = clip_lambda
43
45
  self.cautious = cautious
46
+ self.stable_adamw = stable_adamw
44
47
 
45
48
  defaults: DEFAULTS = {
46
49
  'lr': lr,
@@ -80,6 +83,7 @@ class ADOPT(BaseOptimizer):
80
83
  group['step'] = 1
81
84
 
82
85
  beta1, beta2 = group['betas']
86
+ lr: float = group['lr']
83
87
 
84
88
  for p in group['params']:
85
89
  if p.grad is None:
@@ -98,7 +102,7 @@ class ADOPT(BaseOptimizer):
98
102
  self.apply_weight_decay(
99
103
  p=p,
100
104
  grad=grad,
101
- lr=group['lr'],
105
+ lr=lr,
102
106
  weight_decay=group['weight_decay'],
103
107
  weight_decouple=group['weight_decouple'],
104
108
  fixed_decay=group['fixed_decay'],
@@ -127,6 +131,9 @@ class ADOPT(BaseOptimizer):
127
131
  else:
128
132
  update = exp_avg
129
133
 
130
- p.add_(update, alpha=-group['lr'])
134
+ if self.stable_adamw:
135
+ lr /= self.get_stable_adamw_rms(grad, exp_avg_sq)
136
+
137
+ p.add_(update, alpha=-lr)
131
138
 
132
139
  return loss