pytorch-optimizer 3.4.1__tar.gz → 3.4.2__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 (122) hide show
  1. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/PKG-INFO +4 -3
  2. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/README.md +2 -1
  3. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pyproject.toml +5 -5
  4. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/__init__.py +1 -0
  5. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/__init__.py +2 -0
  6. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/experimental/ranger25.py +1 -1
  7. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/schedulefree.py +32 -58
  8. pytorch_optimizer-3.4.2/pytorch_optimizer/optimizer/scion.py +113 -0
  9. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/LICENSE +0 -0
  10. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/base/__init__.py +0 -0
  11. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/base/exception.py +0 -0
  12. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/base/optimizer.py +0 -0
  13. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/base/scheduler.py +0 -0
  14. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/base/type.py +0 -0
  15. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/loss/__init__.py +0 -0
  16. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/loss/bi_tempered.py +0 -0
  17. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/loss/cross_entropy.py +0 -0
  18. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/loss/dice.py +0 -0
  19. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/loss/f1.py +0 -0
  20. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/loss/focal.py +0 -0
  21. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/loss/jaccard.py +0 -0
  22. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/loss/ldam.py +0 -0
  23. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/loss/lovasz.py +0 -0
  24. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/loss/tversky.py +0 -0
  25. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/lr_scheduler/__init__.py +0 -0
  26. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/lr_scheduler/chebyshev.py +0 -0
  27. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/lr_scheduler/cosine_anealing.py +0 -0
  28. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/lr_scheduler/experimental/__init__.py +0 -0
  29. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/lr_scheduler/experimental/deberta_v3_lr_scheduler.py +0 -0
  30. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/lr_scheduler/linear_warmup.py +0 -0
  31. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/lr_scheduler/proportion.py +0 -0
  32. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/lr_scheduler/rex.py +0 -0
  33. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/lr_scheduler/wsd.py +0 -0
  34. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/a2grad.py +0 -0
  35. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/adabelief.py +0 -0
  36. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/adabound.py +0 -0
  37. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/adadelta.py +0 -0
  38. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/adafactor.py +0 -0
  39. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/adahessian.py +0 -0
  40. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/adai.py +0 -0
  41. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/adalite.py +0 -0
  42. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/adam_mini.py +0 -0
  43. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/adamax.py +0 -0
  44. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/adamg.py +0 -0
  45. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/adamod.py +0 -0
  46. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/adamp.py +0 -0
  47. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/adams.py +0 -0
  48. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/adamw.py +0 -0
  49. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/adan.py +0 -0
  50. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/adanorm.py +0 -0
  51. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/adapnm.py +0 -0
  52. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/adashift.py +0 -0
  53. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/adasmooth.py +0 -0
  54. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/ademamix.py +0 -0
  55. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/adopt.py +0 -0
  56. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/agc.py +0 -0
  57. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/aggmo.py +0 -0
  58. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/aida.py +0 -0
  59. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/alig.py +0 -0
  60. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/amos.py +0 -0
  61. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/apollo.py +0 -0
  62. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/avagrad.py +0 -0
  63. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/came.py +0 -0
  64. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/dadapt.py +0 -0
  65. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/demo.py +0 -0
  66. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/diffgrad.py +0 -0
  67. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/exadam.py +0 -0
  68. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/experimental/__init__.py +0 -0
  69. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/fadam.py +0 -0
  70. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/focus.py +0 -0
  71. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/fp16.py +0 -0
  72. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/fromage.py +0 -0
  73. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/ftrl.py +0 -0
  74. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/galore.py +0 -0
  75. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/galore_utils.py +0 -0
  76. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/gradient_centralization.py +0 -0
  77. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/grams.py +0 -0
  78. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/gravity.py +0 -0
  79. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/grokfast.py +0 -0
  80. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/kate.py +0 -0
  81. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/lamb.py +0 -0
  82. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/laprop.py +0 -0
  83. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/lars.py +0 -0
  84. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/lion.py +0 -0
  85. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/lomo.py +0 -0
  86. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/lookahead.py +0 -0
  87. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/madgrad.py +0 -0
  88. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/mars.py +0 -0
  89. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/msvag.py +0 -0
  90. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/muon.py +0 -0
  91. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/nero.py +0 -0
  92. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/novograd.py +0 -0
  93. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/orthograd.py +0 -0
  94. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/padam.py +0 -0
  95. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/pcgrad.py +0 -0
  96. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/pid.py +0 -0
  97. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/pnm.py +0 -0
  98. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/prodigy.py +0 -0
  99. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/psgd.py +0 -0
  100. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/psgd_utils.py +0 -0
  101. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/qhadam.py +0 -0
  102. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/qhm.py +0 -0
  103. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/radam.py +0 -0
  104. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/ranger.py +0 -0
  105. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/ranger21.py +0 -0
  106. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/rotograd.py +0 -0
  107. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/sam.py +0 -0
  108. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/sgd.py +0 -0
  109. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/sgdp.py +0 -0
  110. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/shampoo.py +0 -0
  111. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/shampoo_utils.py +0 -0
  112. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/sm3.py +0 -0
  113. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/soap.py +0 -0
  114. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/sophia.py +0 -0
  115. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/spam.py +0 -0
  116. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/srmm.py +0 -0
  117. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/swats.py +0 -0
  118. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/tam.py +0 -0
  119. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/tiger.py +0 -0
  120. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/trac.py +0 -0
  121. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/pytorch_optimizer/optimizer/utils.py +0 -0
  122. {pytorch_optimizer-3.4.1 → pytorch_optimizer-3.4.2}/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.4.1
3
+ Version: 3.4.2
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,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,GCSAM,LookSAM,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,GCSAM,LookSAM,ScheduleFreeSGD,ScheduleFreeAdamW,ScheduleFreeRAdam,SCION,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
@@ -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, **98 optimizers (+ `bitsandbytes`, `qgalore`, `torchao`)**, **16 lr schedulers**, and **13 loss functions** are supported!
51
+ * Wide range of supported optimizers. Currently, **99 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
@@ -244,6 +244,7 @@ get_supported_optimizers(['adam*', 'ranger*'])
244
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) |
245
245
  | GCSAM | *Gradient Centralized Sharpness Aware Minimization* | [github](https://github.com/mhassann22/GCSAM) | <https://arxiv.org/abs/2501.11584> | [cite](https://github.com/mhassann22/GCSAM?tab=readme-ov-file#citation) |
246
246
  | LookSAM | *Towards Efficient and Scalable Sharpness-Aware Minimization* | [github](https://github.com/rollovd/LookSAM) | <https://arxiv.org/abs/2203.02714> | [cite](https://ui.adsabs.harvard.edu/abs/2022arXiv220302714L/exportcitation) |
247
+ | SCION | *Training Deep Learning Models with Norm-Constrained LMOs* | | <https://arxiv.org/abs/2502.07529> | [cite](https://ui.adsabs.harvard.edu/abs/2025arXiv250207529P/exportcitation) |
247
248
 
248
249
  ## Supported LR Scheduler
249
250
 
@@ -10,7 +10,7 @@
10
10
 
11
11
  ## The reasons why you use `pytorch-optimizer`.
12
12
 
13
- * Wide range of supported optimizers. Currently, **98 optimizers (+ `bitsandbytes`, `qgalore`, `torchao`)**, **16 lr schedulers**, and **13 loss functions** are supported!
13
+ * Wide range of supported optimizers. Currently, **99 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
@@ -206,6 +206,7 @@ get_supported_optimizers(['adam*', 'ranger*'])
206
206
  | 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) |
207
207
  | GCSAM | *Gradient Centralized Sharpness Aware Minimization* | [github](https://github.com/mhassann22/GCSAM) | <https://arxiv.org/abs/2501.11584> | [cite](https://github.com/mhassann22/GCSAM?tab=readme-ov-file#citation) |
208
208
  | LookSAM | *Towards Efficient and Scalable Sharpness-Aware Minimization* | [github](https://github.com/rollovd/LookSAM) | <https://arxiv.org/abs/2203.02714> | [cite](https://ui.adsabs.harvard.edu/abs/2022arXiv220302714L/exportcitation) |
209
+ | SCION | *Training Deep Learning Models with Norm-Constrained LMOs* | | <https://arxiv.org/abs/2502.07529> | [cite](https://ui.adsabs.harvard.edu/abs/2025arXiv250207529P/exportcitation) |
209
210
 
210
211
  ## Supported LR Scheduler
211
212
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "pytorch_optimizer"
3
- version = "3.4.1"
3
+ version = "3.4.2"
4
4
  description = "optimizer & lr scheduler & objective function collections in PyTorch"
5
5
  license = "Apache-2.0"
6
6
  authors = ["kozistr <kozistr@gmail.com>"]
@@ -18,10 +18,10 @@ keywords = [
18
18
  "GrokFast", "GSAM", "Kate", "Lamb", "LaProp", "LARS", "Lion", "LOMO", "Lookahead", "MADGRAD", "MARS", "MSVAG",
19
19
  "Muno", "Nero", "NovoGrad", "OrthoGrad", "PAdam", "PCGrad", "PID", "PNM", "Prodigy", "PSGD", "QHAdam", "QHM",
20
20
  "RAdam", "Ranger", "Ranger21", "RotoGrad", "SAM", "GCSAM", "LookSAM", "ScheduleFreeSGD", "ScheduleFreeAdamW",
21
- "ScheduleFreeRAdam", "SGDP", "Shampoo", "ScalableShampoo", "SGDW", "SignSGD", "SM3", "SOAP", "SopihaH", "SPAM",
22
- "SRMM", "StableAdamW", "SWATS", "TAM", "Tiger", "TRAC", "WSAM", "Yogi", "BCE", "BCEFocal", "Focal", "FocalCosine",
23
- "SoftF1", "Dice", "LDAM", "Jaccard", "Bi-Tempered", "Tversky", "FocalTversky", "LovaszHinge", "bitsandbytes", "WSD",
24
- "QGaLore",
21
+ "ScheduleFreeRAdam", "SCION", "SGDP", "Shampoo", "ScalableShampoo", "SGDW", "SignSGD", "SM3", "SOAP", "SopihaH",
22
+ "SPAM", "SRMM", "StableAdamW", "SWATS", "TAM", "Tiger", "TRAC", "WSAM", "Yogi", "BCE", "BCEFocal", "Focal",
23
+ "FocalCosine", "SoftF1", "Dice", "LDAM", "Jaccard", "Bi-Tempered", "Tversky", "FocalTversky", "LovaszHinge",
24
+ "bitsandbytes", "WSD", "QGaLore",
25
25
  ]
26
26
  classifiers = [
27
27
  "License :: OSI Approved :: Apache Software License",
@@ -58,6 +58,7 @@ from pytorch_optimizer.optimizer import (
58
58
  PNM,
59
59
  QHM,
60
60
  SAM,
61
+ SCION,
61
62
  SGDP,
62
63
  SGDW,
63
64
  SM3,
@@ -81,6 +81,7 @@ from pytorch_optimizer.optimizer.ranger21 import Ranger21
81
81
  from pytorch_optimizer.optimizer.rotograd import RotoGrad
82
82
  from pytorch_optimizer.optimizer.sam import BSAM, GSAM, SAM, WSAM, LookSAM
83
83
  from pytorch_optimizer.optimizer.schedulefree import ScheduleFreeAdamW, ScheduleFreeRAdam, ScheduleFreeSGD
84
+ from pytorch_optimizer.optimizer.scion import SCION
84
85
  from pytorch_optimizer.optimizer.sgd import ASGD, SGDW, AccSGD, SGDSaI, SignSGD
85
86
  from pytorch_optimizer.optimizer.sgdp import SGDP
86
87
  from pytorch_optimizer.optimizer.shampoo import ScalableShampoo, Shampoo
@@ -300,6 +301,7 @@ OPTIMIZER_LIST: List[OPTIMIZER] = [
300
301
  SPAM,
301
302
  Kron,
302
303
  EXAdam,
304
+ SCION,
303
305
  Ranger25,
304
306
  ]
305
307
  OPTIMIZERS: Dict[str, OPTIMIZER] = {str(optimizer.__name__).lower(): optimizer for optimizer in OPTIMIZER_LIST}
@@ -40,7 +40,7 @@ class Ranger25(BaseOptimizer):
40
40
  self,
41
41
  params: PARAMETERS,
42
42
  lr: float = 1e-3,
43
- betas: BETAS = (0.95, 0.98, 0.9999),
43
+ betas: BETAS = (0.9, 0.98, 0.9999),
44
44
  weight_decay: float = 1e-3,
45
45
  weight_decouple: bool = True,
46
46
  fixed_decay: bool = False,
@@ -1,4 +1,3 @@
1
- import math
2
1
  from typing import List
3
2
 
4
3
  import torch
@@ -15,8 +14,6 @@ class ScheduleFreeSGD(BaseOptimizer):
15
14
  :param lr: float. learning rate.
16
15
  :param momentum: float. momentum factor, must be between 0 and 1 exclusive.
17
16
  :param weight_decay: float. weight decay (L2 penalty).
18
- :param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
19
- :param fixed_decay: bool. fix weight decay.
20
17
  :param r: float. use polynomial weighting in the average with power r.
21
18
  :param weight_lr_power: float. during warmup, the weights in the average will be equal to lr raised to this power.
22
19
  set to 0 for no weighting.
@@ -30,8 +27,6 @@ class ScheduleFreeSGD(BaseOptimizer):
30
27
  lr: float = 1.0,
31
28
  momentum: float = 0.9,
32
29
  weight_decay: float = 0.0,
33
- weight_decouple: bool = True,
34
- fixed_decay: bool = False,
35
30
  r: float = 0.0,
36
31
  weight_lr_power: float = 2.0,
37
32
  warmup_steps: int = 0,
@@ -47,8 +42,6 @@ class ScheduleFreeSGD(BaseOptimizer):
47
42
  'lr': lr,
48
43
  'momentum': momentum,
49
44
  'weight_decay': weight_decay,
50
- 'weight_decouple': weight_decouple,
51
- 'fixed_decay': fixed_decay,
52
45
  'r': r,
53
46
  'weight_lr_power': weight_lr_power,
54
47
  'warmup_steps': warmup_steps,
@@ -114,7 +107,7 @@ class ScheduleFreeSGD(BaseOptimizer):
114
107
  lr: float = group['lr'] * schedule
115
108
  lr_max = group['lr_max'] = max(lr, group['lr_max'])
116
109
 
117
- weight = (group['step'] ** group['r']) * (lr_max ** group['weight_lr_power'])
110
+ weight: float = (group['step'] ** group['r']) * (lr_max ** group['weight_lr_power'])
118
111
  weight_sum = group['weight_sum'] = group['weight_sum'] + weight
119
112
 
120
113
  checkpoint: float = weight / weight_sum if weight_sum != 0.0 else 0.0
@@ -137,8 +130,8 @@ class ScheduleFreeSGD(BaseOptimizer):
137
130
  grad=grad,
138
131
  lr=lr,
139
132
  weight_decay=group['weight_decay'],
140
- weight_decouple=group['weight_decouple'],
141
- fixed_decay=group['fixed_decay'],
133
+ weight_decouple=False,
134
+ fixed_decay=False,
142
135
  )
143
136
 
144
137
  z = state['z']
@@ -158,8 +151,6 @@ class ScheduleFreeAdamW(BaseOptimizer):
158
151
  :param lr: float. learning rate.
159
152
  :param betas: BETAS. coefficients used for computing running averages of gradient and the squared hessian trace.
160
153
  :param weight_decay: float. weight decay (L2 penalty).
161
- :param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
162
- :param fixed_decay: bool. fix weight decay.
163
154
  :param r: float. use polynomial weighting in the average with power r.
164
155
  :param weight_lr_power: float. during warmup, the weights in the average will be equal to lr raised to this power.
165
156
  set to 0 for no weighting.
@@ -174,8 +165,6 @@ class ScheduleFreeAdamW(BaseOptimizer):
174
165
  lr: float = 2.5e-3,
175
166
  betas: BETAS = (0.9, 0.999),
176
167
  weight_decay: float = 0.0,
177
- weight_decouple: bool = True,
178
- fixed_decay: bool = False,
179
168
  r: float = 0.0,
180
169
  weight_lr_power: float = 2.0,
181
170
  warmup_steps: int = 0,
@@ -192,8 +181,6 @@ class ScheduleFreeAdamW(BaseOptimizer):
192
181
  'lr': lr,
193
182
  'betas': betas,
194
183
  'weight_decay': weight_decay,
195
- 'weight_decouple': weight_decouple,
196
- 'fixed_decay': fixed_decay,
197
184
  'r': r,
198
185
  'weight_lr_power': weight_lr_power,
199
186
  'warmup_steps': warmup_steps,
@@ -259,22 +246,16 @@ class ScheduleFreeAdamW(BaseOptimizer):
259
246
 
260
247
  beta1, beta2 = group['betas']
261
248
 
262
- bias_correction2_sq: float = math.sqrt(1.0 - beta2 ** group['step'])
249
+ bias_correction2: float = self.debias(beta2, group['step'])
263
250
 
264
- lr: float = group['lr'] * schedule * bias_correction2_sq
251
+ lr: float = group['lr'] * schedule
265
252
  lr_max = group['lr_max'] = max(lr, group['lr_max'])
266
253
 
267
- weight = (group['step'] ** group['r']) * (lr_max ** group['weight_lr_power'])
254
+ weight: float = (group['step'] ** group['r']) * (lr_max ** group['weight_lr_power'])
268
255
  weight_sum = group['weight_sum'] = group['weight_sum'] + weight
269
256
 
270
257
  checkpoint: float = weight / weight_sum if weight_sum != 0.0 else 0.0
271
258
 
272
- if group['use_palm']:
273
- beta2: float = 1.0 - group['step'] ** -0.8
274
- debias: float = (1.0 - beta2) / (1.0 - beta2 ** group['step'])
275
- else:
276
- debias: float = beta2
277
-
278
259
  for p in group['params']:
279
260
  if p.grad is None:
280
261
  continue
@@ -289,27 +270,27 @@ class ScheduleFreeAdamW(BaseOptimizer):
289
270
  state['z'] = p.clone()
290
271
  state['exp_avg_sq'] = torch.zeros_like(p)
291
272
 
292
- self.apply_weight_decay(
293
- p=p,
294
- grad=grad,
295
- lr=lr,
296
- weight_decay=group['weight_decay'],
297
- weight_decouple=group['weight_decouple'],
298
- fixed_decay=group['fixed_decay'],
299
- )
300
-
301
273
  z, exp_avg_sq = state['z'], state['exp_avg_sq']
302
- exp_avg_sq.mul_(debias).addcmul_(grad, grad, value=1.0 - debias)
274
+ exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1.0 - beta2)
303
275
 
304
276
  de_nom = self.apply_ams_bound(
305
277
  ams_bound=group['ams_bound'],
306
- exp_avg_sq=exp_avg_sq,
278
+ exp_avg_sq=exp_avg_sq.div(bias_correction2),
307
279
  max_exp_avg_sq=state.get('max_exp_avg_sq', None),
308
280
  eps=group['eps'],
309
281
  )
310
282
 
311
283
  grad.div_(de_nom)
312
284
 
285
+ self.apply_weight_decay(
286
+ p=p,
287
+ grad=grad,
288
+ lr=lr,
289
+ weight_decay=group['weight_decay'],
290
+ weight_decouple=False,
291
+ fixed_decay=False,
292
+ )
293
+
313
294
  p.lerp_(z, weight=checkpoint)
314
295
  p.add_(grad, alpha=lr * (beta1 * (1.0 - checkpoint) - 1))
315
296
 
@@ -325,12 +306,13 @@ class ScheduleFreeRAdam(BaseOptimizer):
325
306
  :param lr: float. learning rate.
326
307
  :param betas: BETAS. coefficients used for computing running averages of gradient and the squared hessian trace.
327
308
  :param weight_decay: float. weight decay (L2 penalty).
328
- :param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
329
- :param fixed_decay: bool. fix weight decay.
330
- :param degenerated_to_sgd: float. degenerated to SGD.
331
309
  :param r: float. use polynomial weighting in the average with power r.
332
310
  :param weight_lr_power: float. during warmup, the weights in the average will be equal to lr raised to this power.
333
311
  set to 0 for no weighting.
312
+ :param silent_sgd_phase: bool. the optimizer will not use the first SGD phase of RAdam. This means that the
313
+ optimizer will not update model parameters during the early training steps (e.g., < 5 when β_2 = 0.999), but
314
+ just update the momentum values of the optimizer. This helps stabilize training by ensuring smoother warmup
315
+ behavior and more reliable calculation of the moving average coefficient (`ckp1`). Recommended to set to True.
334
316
  :param eps: float. term added to the denominator to improve numerical stability.
335
317
  """
336
318
 
@@ -340,11 +322,9 @@ class ScheduleFreeRAdam(BaseOptimizer):
340
322
  lr: float = 2.5e-3,
341
323
  betas: BETAS = (0.9, 0.999),
342
324
  weight_decay: float = 0.0,
343
- weight_decouple: bool = True,
344
- fixed_decay: bool = False,
345
- degenerated_to_sgd: bool = False,
346
325
  r: float = 0.0,
347
326
  weight_lr_power: float = 2.0,
327
+ silent_sgd_phase: bool = True,
348
328
  eps: float = 1e-8,
349
329
  **kwargs,
350
330
  ):
@@ -357,9 +337,7 @@ class ScheduleFreeRAdam(BaseOptimizer):
357
337
  'lr': lr,
358
338
  'betas': betas,
359
339
  'weight_decay': weight_decay,
360
- 'weight_decouple': weight_decouple,
361
- 'fixed_decay': fixed_decay,
362
- 'degenerated_to_sgd': degenerated_to_sgd,
340
+ 'silent_sgd_phase': silent_sgd_phase,
363
341
  'r': r,
364
342
  'weight_lr_power': weight_lr_power,
365
343
  'eps': eps,
@@ -418,7 +396,7 @@ class ScheduleFreeRAdam(BaseOptimizer):
418
396
 
419
397
  beta1, beta2 = group['betas']
420
398
 
421
- bias_correction2_sq: float = math.sqrt(1.0 - beta2 ** group['step'])
399
+ bias_correction2: float = self.debias_beta(beta2, group['step'])
422
400
 
423
401
  lr, n_sma = self.get_rectify_step_size(
424
402
  is_rectify=True,
@@ -426,24 +404,20 @@ class ScheduleFreeRAdam(BaseOptimizer):
426
404
  lr=group['lr'],
427
405
  beta2=beta2,
428
406
  n_sma_threshold=4,
429
- degenerated_to_sgd=group['degenerated_to_sgd'],
407
+ degenerated_to_sgd=False,
430
408
  )
409
+ if lr < 0.0:
410
+ lr = float(not group['silent_sgd_phase'])
431
411
 
432
412
  lr_max = group['lr_max'] = max(lr, group['lr_max'])
433
413
 
434
- weight = (group['step'] ** group['r']) * (lr_max ** group['weight_lr_power'])
414
+ weight: float = (group['step'] ** group['r']) * (lr_max ** group['weight_lr_power'])
435
415
  weight_sum = group['weight_sum'] = group['weight_sum'] + weight
436
416
 
437
417
  checkpoint: float = weight / weight_sum if weight_sum != 0.0 else 0.0
438
418
 
439
419
  adaptive_y_lr: float = lr * (beta1 * (1.0 - checkpoint) - 1.0)
440
420
 
441
- if group['use_palm']:
442
- beta2: float = 1.0 - group['step'] ** -0.8
443
- debias: float = (1.0 - beta2) / (1.0 - beta2 ** group['step'])
444
- else:
445
- debias: float = beta2
446
-
447
421
  for p in group['params']:
448
422
  if p.grad is None:
449
423
  continue
@@ -459,10 +433,10 @@ class ScheduleFreeRAdam(BaseOptimizer):
459
433
  state['exp_avg_sq'] = torch.zeros_like(p)
460
434
 
461
435
  z, exp_avg_sq = state['z'], state['exp_avg_sq']
462
- exp_avg_sq.mul_(debias).addcmul_(grad, grad, value=1.0 - debias)
436
+ exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1.0 - beta2)
463
437
 
464
438
  if n_sma > 4.0:
465
- de_nom = exp_avg_sq.sqrt().div_(bias_correction2_sq).add_(group['eps'])
439
+ de_nom = exp_avg_sq.sqrt().div_(bias_correction2).add_(group['eps'])
466
440
  grad.div_(de_nom)
467
441
 
468
442
  self.apply_weight_decay(
@@ -470,8 +444,8 @@ class ScheduleFreeRAdam(BaseOptimizer):
470
444
  grad=grad,
471
445
  lr=lr,
472
446
  weight_decay=group['weight_decay'],
473
- weight_decouple=group['weight_decouple'],
474
- fixed_decay=group['fixed_decay'],
447
+ weight_decouple=False,
448
+ fixed_decay=False,
475
449
  )
476
450
 
477
451
  p.lerp_(z, weight=checkpoint)
@@ -0,0 +1,113 @@
1
+ from typing import Literal
2
+
3
+ import torch
4
+
5
+ from pytorch_optimizer.base.exception import NoSparseGradientError
6
+ from pytorch_optimizer.base.optimizer import BaseOptimizer
7
+ from pytorch_optimizer.base.type import CLOSURE, DEFAULTS, LOSS, PARAMETERS
8
+ from pytorch_optimizer.optimizer.shampoo_utils import zero_power_via_newton_schulz_5
9
+
10
+ LMO_TYPE = Literal['spectral', 'sign', 'col_norm', 'row_norm']
11
+
12
+
13
+ class SCION(BaseOptimizer):
14
+ r"""Training Deep Learning Models with Norm-Constrained LMOs.
15
+
16
+ :param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
17
+ :param lr: float. learning rate.
18
+ :param momentum: float. momentum factor.
19
+ :param constraint: bool. whether to use a constraint SCG or not.
20
+ :param lmo_type: LMO_TYPE. supported LMO types.
21
+ :param weight_decay: float. weight decay (L2 penalty).
22
+ :param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
23
+ """
24
+
25
+ def __init__(
26
+ self,
27
+ params: PARAMETERS,
28
+ lr: float = 1e-4,
29
+ momentum: float = 0.1,
30
+ constraint: bool = False,
31
+ lmo_type: LMO_TYPE = 'spectral',
32
+ weight_decay: float = 0.0,
33
+ weight_decouple: bool = True,
34
+ **kwargs,
35
+ ):
36
+ self.validate_learning_rate(lr)
37
+ self.validate_range(momentum, 'momentum', 0.0, 1.0, '(]')
38
+ self.validate_options(lmo_type, 'lmo_type', ['spectral', 'sign', 'col_norm', 'row_norm'])
39
+
40
+ defaults: DEFAULTS = {
41
+ 'lr': lr,
42
+ 'momentum': momentum,
43
+ 'constraint': constraint,
44
+ 'lmo_type': lmo_type,
45
+ 'weight_decay': weight_decay,
46
+ 'weight_decouple': weight_decouple,
47
+ }
48
+ super().__init__(params, defaults)
49
+
50
+ def __str__(self) -> str:
51
+ return 'SCION'
52
+
53
+ @torch.no_grad()
54
+ def reset(self):
55
+ for group in self.param_groups:
56
+ for p in group['params']:
57
+ state = self.state[p]
58
+ state['d'] = torch.zeros_like(p)
59
+
60
+ @staticmethod
61
+ def get_lmo_direction(grad: torch.Tensor, lmo_type: str) -> torch.Tensor:
62
+ r"""Get LMO direction."""
63
+ if lmo_type == 'spectral' and grad.ndim == 2:
64
+ return zero_power_via_newton_schulz_5(grad)
65
+ if lmo_type == 'sign':
66
+ return torch.sign(grad)
67
+ if lmo_type == 'col_norm':
68
+ return grad / torch.norm(grad, dim=0, keepdim=True).add_(1e-6)
69
+ if lmo_type == 'row_norm' and grad.ndim == 2:
70
+ return grad / torch.norm(grad, dim=1, keepdim=True).add_(1e-6)
71
+ return torch.sign(grad)
72
+
73
+ @torch.no_grad()
74
+ def step(self, closure: CLOSURE = None) -> LOSS:
75
+ loss: LOSS = None
76
+ if closure is not None:
77
+ with torch.enable_grad():
78
+ loss = closure()
79
+
80
+ for group in self.param_groups:
81
+ step_size: float = -group['lr']
82
+ for p in group['params']:
83
+ if p.grad is None:
84
+ continue
85
+
86
+ grad = p.grad
87
+ if grad.is_sparse:
88
+ raise NoSparseGradientError(str(self))
89
+
90
+ state = self.state[p]
91
+ if 'd' not in state:
92
+ state['d'] = torch.zeros_like(p)
93
+
94
+ d = state['d']
95
+ d.mul_(1.0 - group['momentum']).add_(grad, alpha=group['momentum'])
96
+
97
+ update = self.get_lmo_direction(d, group['lmo_type'])
98
+
99
+ if not group['constraint']:
100
+ self.apply_weight_decay(
101
+ p,
102
+ grad,
103
+ lr=group['lr'],
104
+ weight_decay=group['weight_decay'],
105
+ weight_decouple=group['weight_decouple'],
106
+ fixed_decay=False,
107
+ )
108
+
109
+ p.add_(update, alpha=step_size)
110
+ else:
111
+ p.mul_(1.0 - step_size).add_(update, alpha=step_size)
112
+
113
+ return loss