pytorch-optimizer 3.3.4__tar.gz → 3.4.0__tar.gz

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