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.
Files changed (128) hide show
  1. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/PKG-INFO +7 -4
  2. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/README.md +5 -2
  3. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pyproject.toml +20 -17
  4. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/__init__.py +5 -0
  5. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/base/optimizer.py +8 -3
  6. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/__init__.py +8 -1
  7. pytorch_optimizer-3.7.0/pytorch_optimizer/optimizer/emonavi.py +441 -0
  8. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/muon.py +256 -0
  9. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/psgd.py +2 -2
  10. pytorch_optimizer-3.7.0/pytorch_optimizer/optimizer/splus.py +215 -0
  11. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/LICENSE +0 -0
  12. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/base/__init__.py +0 -0
  13. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/base/exception.py +0 -0
  14. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/base/scheduler.py +0 -0
  15. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/base/type.py +0 -0
  16. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/loss/__init__.py +0 -0
  17. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/loss/bi_tempered.py +0 -0
  18. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/loss/cross_entropy.py +0 -0
  19. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/loss/dice.py +0 -0
  20. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/loss/f1.py +0 -0
  21. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/loss/focal.py +0 -0
  22. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/loss/jaccard.py +0 -0
  23. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/loss/ldam.py +0 -0
  24. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/loss/lovasz.py +0 -0
  25. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/loss/tversky.py +0 -0
  26. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/lr_scheduler/__init__.py +0 -0
  27. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/lr_scheduler/chebyshev.py +0 -0
  28. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/lr_scheduler/cosine_anealing.py +0 -0
  29. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/lr_scheduler/experimental/__init__.py +0 -0
  30. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/lr_scheduler/experimental/deberta_v3_lr_scheduler.py +0 -0
  31. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/lr_scheduler/linear_warmup.py +0 -0
  32. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/lr_scheduler/proportion.py +0 -0
  33. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/lr_scheduler/rex.py +0 -0
  34. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/lr_scheduler/wsd.py +0 -0
  35. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/a2grad.py +0 -0
  36. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adabelief.py +0 -0
  37. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adabound.py +0 -0
  38. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adadelta.py +0 -0
  39. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adafactor.py +0 -0
  40. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adagc.py +0 -0
  41. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adahessian.py +0 -0
  42. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adai.py +0 -0
  43. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adalite.py +0 -0
  44. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adam_mini.py +0 -0
  45. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adamax.py +0 -0
  46. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adamc.py +0 -0
  47. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adamg.py +0 -0
  48. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adamod.py +0 -0
  49. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adamp.py +0 -0
  50. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adams.py +0 -0
  51. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adamw.py +0 -0
  52. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adan.py +0 -0
  53. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adanorm.py +0 -0
  54. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adapnm.py +0 -0
  55. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adashift.py +0 -0
  56. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adasmooth.py +0 -0
  57. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/ademamix.py +0 -0
  58. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/adopt.py +0 -0
  59. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/agc.py +0 -0
  60. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/aggmo.py +0 -0
  61. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/aida.py +0 -0
  62. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/alig.py +0 -0
  63. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/amos.py +0 -0
  64. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/apollo.py +0 -0
  65. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/avagrad.py +0 -0
  66. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/came.py +0 -0
  67. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/dadapt.py +0 -0
  68. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/demo.py +0 -0
  69. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/diffgrad.py +0 -0
  70. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/exadam.py +0 -0
  71. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/experimental/__init__.py +0 -0
  72. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/experimental/ranger25.py +0 -0
  73. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/fadam.py +0 -0
  74. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/fira.py +0 -0
  75. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/focus.py +0 -0
  76. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/fp16.py +0 -0
  77. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/fromage.py +0 -0
  78. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/ftrl.py +0 -0
  79. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/galore.py +0 -0
  80. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/galore_utils.py +0 -0
  81. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/gradient_centralization.py +0 -0
  82. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/grams.py +0 -0
  83. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/gravity.py +0 -0
  84. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/grokfast.py +0 -0
  85. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/kate.py +0 -0
  86. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/lamb.py +0 -0
  87. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/laprop.py +0 -0
  88. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/lars.py +0 -0
  89. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/lion.py +0 -0
  90. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/lomo.py +0 -0
  91. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/lookahead.py +0 -0
  92. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/madgrad.py +0 -0
  93. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/mars.py +0 -0
  94. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/msvag.py +0 -0
  95. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/nero.py +0 -0
  96. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/novograd.py +0 -0
  97. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/orthograd.py +0 -0
  98. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/padam.py +0 -0
  99. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/pcgrad.py +0 -0
  100. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/pid.py +0 -0
  101. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/pnm.py +0 -0
  102. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/prodigy.py +0 -0
  103. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/psgd_utils.py +0 -0
  104. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/qhadam.py +0 -0
  105. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/qhm.py +0 -0
  106. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/racs.py +0 -0
  107. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/radam.py +0 -0
  108. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/ranger.py +0 -0
  109. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/ranger21.py +0 -0
  110. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/rotograd.py +0 -0
  111. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/sam.py +0 -0
  112. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/schedulefree.py +0 -0
  113. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/scion.py +0 -0
  114. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/sgd.py +0 -0
  115. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/shampoo.py +0 -0
  116. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/shampoo_utils.py +0 -0
  117. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/sm3.py +0 -0
  118. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/snsm.py +0 -0
  119. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/soap.py +0 -0
  120. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/sophia.py +0 -0
  121. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/spam.py +0 -0
  122. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/srmm.py +0 -0
  123. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/swats.py +0 -0
  124. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/tam.py +0 -0
  125. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/tiger.py +0 -0
  126. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/trac.py +0 -0
  127. {pytorch_optimizer-3.6.1 → pytorch_optimizer-3.7.0}/pytorch_optimizer/optimizer/utils.py +0 -0
  128. {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.6.1
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, **108 optimizers (+ `bitsandbytes`, `qgalore`, `torchao`)**, **16 lr schedulers**, and **13 loss functions** are supported!
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* | | <https://arxiv.org/abs/2506.02285> | [cite](https://ui.adsabs.harvard.edu/abs/2025arXiv250602285D/exportcitation) |
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, **108 optimizers (+ `bitsandbytes`, `qgalore`, `torchao`)**, **16 lr schedulers**, and **13 loss functions** are supported!
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* | | <https://arxiv.org/abs/2506.02285> | [cite](https://ui.adsabs.harvard.edu/abs/2025arXiv250602285D/exportcitation) |
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.6.1"
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", "AdaSmooth",
15
- "AdEMAMix", "Simplified-AdEMAMix", "ADOPT", "AdaHessian", "Adai", "Adalite", "AdaLomo", "AdamMini", "AdamP",
16
- "AdamS", "Adan", "AggMo", "Aida", "AliG", "Amos", "Apollo", "APOLLO", "AvaGrad", "bSAM", "CAME", "DAdaptAdaGrad",
17
- "DAdaptAdam", "DAdaptAdan", "DAdaptSGD", "DAdaptLion", "DeMo", "DiffGrad", "EXAdam", "FAdam", "Fira", "FOCUS",
18
- "Fromage", "FTRL", "GaLore", "Grams", "Gravity", "GrokFast", "GSAM", "Kate", "Lamb", "LaProp", "LARS", "Lion",
19
- "LOMO", "Lookahead", "MADGRAD", "MARS", "MSVAG", "Muno", "Nero", "NovoGrad", "OrthoGrad", "PAdam", "PCGrad", "PID",
20
- "PNM", "Prodigy", "PSGD", "QHAdam", "QHM", "RACS", "RAdam", "Ranger", "Ranger21", "RotoGrad", "SAM", "GCSAM",
21
- "LookSAM", "ScheduleFreeSGD", "ScheduleFreeAdamW", "ScheduleFreeRAdam", "SCION", "SGDP", "Shampoo",
22
- "ScalableShampoo", "SGDW", "SignSGD", "SM3", "SOAP", "SopihaH", "SPAM", "StableSPAM", "SRMM", "StableAdamW",
23
- "SWATS", "TAM", "Tiger", "TRAC", "VSGD", "WSAM", "Yogi", "BCE", "BCEFocal", "Focal", "FocalCosine", "SoftF1",
24
- "Dice", "LDAM", "Jaccard", "Bi-Tempered", "Tversky", "FocalTversky", "LovaszHinge", "bitsandbytes", "WSD",
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>=1.4.0"]
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, exp_avg_sq: torch.Tensor, max_exp_avg_sq: Optional[torch.Tensor], eps: float
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(eps)
176
+ de_nom = max_exp_avg_sq.add(exp_avg_sq_eps)
172
177
  else:
173
- de_nom = exp_avg_sq.add(eps)
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