pytorch-optimizer 3.5.0__tar.gz → 3.5.1__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 (124) hide show
  1. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/PKG-INFO +2 -2
  2. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/README.md +1 -1
  3. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pyproject.toml +1 -1
  4. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/__init__.py +1 -0
  5. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/__init__.py +2 -1
  6. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/muon.py +15 -6
  7. pytorch_optimizer-3.5.1/pytorch_optimizer/optimizer/scion.py +530 -0
  8. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/spam.py +5 -4
  9. pytorch_optimizer-3.5.0/pytorch_optimizer/optimizer/scion.py +0 -129
  10. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/LICENSE +0 -0
  11. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/base/__init__.py +0 -0
  12. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/base/exception.py +0 -0
  13. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/base/optimizer.py +0 -0
  14. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/base/scheduler.py +0 -0
  15. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/base/type.py +0 -0
  16. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/loss/__init__.py +0 -0
  17. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/loss/bi_tempered.py +0 -0
  18. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/loss/cross_entropy.py +0 -0
  19. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/loss/dice.py +0 -0
  20. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/loss/f1.py +0 -0
  21. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/loss/focal.py +0 -0
  22. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/loss/jaccard.py +0 -0
  23. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/loss/ldam.py +0 -0
  24. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/loss/lovasz.py +0 -0
  25. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/loss/tversky.py +0 -0
  26. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/lr_scheduler/__init__.py +0 -0
  27. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/lr_scheduler/chebyshev.py +0 -0
  28. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/lr_scheduler/cosine_anealing.py +0 -0
  29. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/lr_scheduler/experimental/__init__.py +0 -0
  30. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/lr_scheduler/experimental/deberta_v3_lr_scheduler.py +0 -0
  31. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/lr_scheduler/linear_warmup.py +0 -0
  32. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/lr_scheduler/proportion.py +0 -0
  33. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/lr_scheduler/rex.py +0 -0
  34. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/lr_scheduler/wsd.py +0 -0
  35. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/a2grad.py +0 -0
  36. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adabelief.py +0 -0
  37. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adabound.py +0 -0
  38. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adadelta.py +0 -0
  39. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adafactor.py +0 -0
  40. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adagc.py +0 -0
  41. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adahessian.py +0 -0
  42. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adai.py +0 -0
  43. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adalite.py +0 -0
  44. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adam_mini.py +0 -0
  45. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adamax.py +0 -0
  46. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adamg.py +0 -0
  47. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adamod.py +0 -0
  48. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adamp.py +0 -0
  49. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adams.py +0 -0
  50. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adamw.py +0 -0
  51. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adan.py +0 -0
  52. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adanorm.py +0 -0
  53. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adapnm.py +0 -0
  54. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adashift.py +0 -0
  55. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adasmooth.py +0 -0
  56. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/ademamix.py +0 -0
  57. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/adopt.py +0 -0
  58. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/agc.py +0 -0
  59. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/aggmo.py +0 -0
  60. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/aida.py +0 -0
  61. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/alig.py +0 -0
  62. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/amos.py +0 -0
  63. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/apollo.py +0 -0
  64. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/avagrad.py +0 -0
  65. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/came.py +0 -0
  66. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/dadapt.py +0 -0
  67. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/demo.py +0 -0
  68. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/diffgrad.py +0 -0
  69. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/exadam.py +0 -0
  70. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/experimental/__init__.py +0 -0
  71. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/experimental/ranger25.py +0 -0
  72. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/fadam.py +0 -0
  73. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/focus.py +0 -0
  74. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/fp16.py +0 -0
  75. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/fromage.py +0 -0
  76. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/ftrl.py +0 -0
  77. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/galore.py +0 -0
  78. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/galore_utils.py +0 -0
  79. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/gradient_centralization.py +0 -0
  80. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/grams.py +0 -0
  81. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/gravity.py +0 -0
  82. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/grokfast.py +0 -0
  83. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/kate.py +0 -0
  84. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/lamb.py +0 -0
  85. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/laprop.py +0 -0
  86. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/lars.py +0 -0
  87. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/lion.py +0 -0
  88. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/lomo.py +0 -0
  89. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/lookahead.py +0 -0
  90. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/madgrad.py +0 -0
  91. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/mars.py +0 -0
  92. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/msvag.py +0 -0
  93. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/nero.py +0 -0
  94. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/novograd.py +0 -0
  95. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/orthograd.py +0 -0
  96. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/padam.py +0 -0
  97. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/pcgrad.py +0 -0
  98. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/pid.py +0 -0
  99. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/pnm.py +0 -0
  100. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/prodigy.py +0 -0
  101. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/psgd.py +0 -0
  102. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/psgd_utils.py +0 -0
  103. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/qhadam.py +0 -0
  104. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/qhm.py +0 -0
  105. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/radam.py +0 -0
  106. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/ranger.py +0 -0
  107. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/ranger21.py +0 -0
  108. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/rotograd.py +0 -0
  109. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/sam.py +0 -0
  110. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/schedulefree.py +0 -0
  111. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/sgd.py +0 -0
  112. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/sgdp.py +0 -0
  113. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/shampoo.py +0 -0
  114. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/shampoo_utils.py +0 -0
  115. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/sm3.py +0 -0
  116. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/soap.py +0 -0
  117. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/sophia.py +0 -0
  118. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/srmm.py +0 -0
  119. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/swats.py +0 -0
  120. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/tam.py +0 -0
  121. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/tiger.py +0 -0
  122. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/trac.py +0 -0
  123. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/utils.py +0 -0
  124. {pytorch_optimizer-3.5.0 → pytorch_optimizer-3.5.1}/pytorch_optimizer/optimizer/yogi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pytorch_optimizer
3
- Version: 3.5.0
3
+ Version: 3.5.1
4
4
  Summary: optimizer & lr scheduler & objective function collections in PyTorch
5
5
  License: Apache-2.0
6
6
  Keywords: pytorch,deep-learning,optimizer,lr scheduler,A2Grad,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,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,StableSPAM,SRMM,StableAdamW,SWATS,TAM,Tiger,TRAC,WSAM,Yogi,BCE,BCEFocal,Focal,FocalCosine,SoftF1,Dice,LDAM,Jaccard,Bi-Tempered,Tversky,FocalTversky,LovaszHinge,bitsandbytes,WSD,QGaLore
@@ -244,7 +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
+ | SCION | *Training Deep Learning Models with Norm-Constrained LMOs* | [github](https://github.com/LIONS-EPFL/scion) | <https://arxiv.org/abs/2502.07529> | [cite](https://github.com/LIONS-EPFL/scion?tab=readme-ov-file#citation) |
248
248
  | COSMOS | *SOAP with Muon* | [github](https://github.com/lliu606/COSMOS) | | |
249
249
  | StableSPAM | *How to Train in 4-Bit More Stably than 16-Bit Adam* | [github](https://github.com/TianjinYellow/StableSPAM) | <https://arxiv.org/abs/2502.17055> | |
250
250
  | AdaGC | *Improving Training Stability for Large Language Model Pretraining* | | <https://arxiv.org/abs/2502.11034> | [cite](https://ui.adsabs.harvard.edu/abs/2025arXiv250211034W/exportcitation) |
@@ -206,7 +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
+ | SCION | *Training Deep Learning Models with Norm-Constrained LMOs* | [github](https://github.com/LIONS-EPFL/scion) | <https://arxiv.org/abs/2502.07529> | [cite](https://github.com/LIONS-EPFL/scion?tab=readme-ov-file#citation) |
210
210
  | COSMOS | *SOAP with Muon* | [github](https://github.com/lliu606/COSMOS) | | |
211
211
  | StableSPAM | *How to Train in 4-Bit More Stably than 16-Bit Adam* | [github](https://github.com/TianjinYellow/StableSPAM) | <https://arxiv.org/abs/2502.17055> | |
212
212
  | AdaGC | *Improving Training Stability for Large Language Model Pretraining* | | <https://arxiv.org/abs/2502.11034> | [cite](https://ui.adsabs.harvard.edu/abs/2025arXiv250211034W/exportcitation) |
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "pytorch_optimizer"
3
- version = "3.5.0"
3
+ version = "3.5.1"
4
4
  description = "optimizer & lr scheduler & objective function collections in PyTorch"
5
5
  license = "Apache-2.0"
6
6
  authors = ["kozistr <kozistr@gmail.com>"]
@@ -141,6 +141,7 @@ from pytorch_optimizer.optimizer import (
141
141
  ScheduleFreeRAdam,
142
142
  ScheduleFreeSGD,
143
143
  ScheduleFreeWrapper,
144
+ SCIONLight,
144
145
  SGDSaI,
145
146
  Shampoo,
146
147
  SignSGD,
@@ -87,7 +87,7 @@ from pytorch_optimizer.optimizer.schedulefree import (
87
87
  ScheduleFreeSGD,
88
88
  ScheduleFreeWrapper,
89
89
  )
90
- from pytorch_optimizer.optimizer.scion import SCION
90
+ from pytorch_optimizer.optimizer.scion import SCION, SCIONLight
91
91
  from pytorch_optimizer.optimizer.sgd import ASGD, SGDW, AccSGD, SGDSaI, SignSGD
92
92
  from pytorch_optimizer.optimizer.sgdp import SGDP
93
93
  from pytorch_optimizer.optimizer.shampoo import ScalableShampoo, Shampoo
@@ -309,6 +309,7 @@ OPTIMIZER_LIST: List[OPTIMIZER] = [
309
309
  Kron,
310
310
  EXAdam,
311
311
  SCION,
312
+ SCIONLight,
312
313
  StableSPAM,
313
314
  AdaGC,
314
315
  Ranger25,
@@ -1,6 +1,6 @@
1
1
  import math
2
2
  import os
3
- from typing import List, Optional
3
+ from typing import List, Optional, Tuple
4
4
 
5
5
  import torch
6
6
  from torch.distributed import ReduceOp, all_reduce
@@ -131,9 +131,18 @@ class Muon(BaseOptimizer):
131
131
  state['moment2'] = torch.zeros_like(p)
132
132
 
133
133
  @staticmethod
134
- def adjust_lr_for_muon(lr: float, param_shape) -> float:
135
- adjusted_ratio: float = 0.2 * math.sqrt(max(param_shape[0], param_shape[1]))
136
- return lr * adjusted_ratio
134
+ def get_adjusted_lr(lr: float, param_shape: Tuple[float, ...], use_adjusted_lr: bool = False) -> float:
135
+ r"""Get the adjust learning rate."""
136
+ output_shape, *input_shape = param_shape
137
+ input_shape = math.prod(input_shape)
138
+
139
+ ratio: float = (
140
+ math.pow(max(1.0, output_shape / input_shape), 0.5)
141
+ if use_adjusted_lr
142
+ else 0.2 * math.sqrt(max(output_shape, input_shape))
143
+ )
144
+
145
+ return lr * ratio
137
146
 
138
147
  @torch.no_grad()
139
148
  def step(self, closure: CLOSURE = None) -> LOSS:
@@ -202,9 +211,9 @@ class Muon(BaseOptimizer):
202
211
  fixed_decay=False,
203
212
  )
204
213
 
205
- lr: float = self.adjust_lr_for_muon(group['lr'], p.size()) if group['use_adjusted_lr'] else group['lr']
214
+ lr: float = self.get_adjusted_lr(group['lr'], p.size(), group['use_adjusted_lr'])
206
215
 
207
- p.add_(g, alpha=-lr * (max(1.0, p.size(-2) / p.size(-1)) ** 0.5))
216
+ p.add_(g, alpha=-lr)
208
217
  curr_idx += p.numel()
209
218
 
210
219
  params = [p for p in group['params'] if p.grad is not None and not self.state[p]['use_muon']]
@@ -0,0 +1,530 @@
1
+ import math
2
+ from enum import IntEnum
3
+ from typing import Dict, Optional
4
+
5
+ import torch
6
+
7
+ from pytorch_optimizer.base.exception import NoSparseGradientError
8
+ from pytorch_optimizer.base.optimizer import BaseOptimizer
9
+ from pytorch_optimizer.base.type import CLOSURE, DEFAULTS, LOSS, PARAMETERS
10
+ from pytorch_optimizer.optimizer.shampoo_utils import zero_power_via_newton_schulz_5
11
+
12
+
13
+ class LMONorm(IntEnum):
14
+ r"""normalization types."""
15
+
16
+ NONE = 0
17
+ AUTO = 1
18
+ SPECTRAL = 2
19
+ SPECTRALCONV = 3
20
+ SIGN = 4
21
+ BIAS = 5
22
+ COL = 6
23
+ ROW = 7
24
+
25
+
26
+ class Norm:
27
+ r"""Base class to perform norm onto Scion. This class does no norm."""
28
+
29
+ def init(self, x: torch.Tensor) -> torch.Tensor:
30
+ r"""Initialize parameter."""
31
+ return x
32
+
33
+ def lmo(self, grad: torch.Tensor) -> torch.Tensor:
34
+ r"""Get LMO."""
35
+ return grad
36
+
37
+
38
+ class Col(Norm):
39
+ r"""col-wise normalization.
40
+
41
+ :param normalized: bool. normalize by the input dimension. use for non-input layers.
42
+ :param transpose: bool. transpose input before normalization. use for embedding layers which have a shape of
43
+ (vocab_size, embedding_dim)
44
+ """
45
+
46
+ def __init__(self, normalized: bool = False, transpose: bool = False) -> None:
47
+ self.normalized = normalized
48
+ self.transpose = transpose
49
+
50
+ def init(self, x: torch.Tensor) -> torch.Tensor:
51
+ dtype = x.dtype
52
+ if self.transpose:
53
+ x = x.transpose(0, 1)
54
+
55
+ torch.nn.init.normal_(x)
56
+
57
+ x.div_(x.norm(dim=0, keepdim=True)).mul_(math.sqrt(x.size(0)))
58
+ if self.normalized:
59
+ x.div_(x.size(1))
60
+
61
+ x = x.to(dtype=dtype)
62
+ if self.transpose:
63
+ x = x.transpose(0, 1)
64
+
65
+ return x
66
+
67
+ def lmo(self, grad: torch.Tensor, eps: float = 1e-8) -> torch.Tensor:
68
+ if self.transpose:
69
+ grad = grad.transpose(0, 1)
70
+
71
+ d_in, d_out = grad.size()
72
+
73
+ rms_value = torch.sqrt(torch.sum(grad.pow(2), dim=0, keepdim=True)) / math.sqrt(d_in)
74
+ if self.normalized:
75
+ rms_value.mul_(d_out)
76
+
77
+ grad /= rms_value.add_(eps)
78
+
79
+ if self.transpose:
80
+ grad = grad.transpose(0, 1)
81
+
82
+ return grad
83
+
84
+
85
+ class Row(Norm):
86
+ r"""row-wise normalization.
87
+
88
+ :param normalized: bool. normalize by the input dimension. use for non-input layers.
89
+ :param transpose: bool. transpose input before normalization. use for embedding layers which have a shape of
90
+ (vocab_size, embedding_dim)
91
+ """
92
+
93
+ def __init__(self, normalized: bool = True, transpose: bool = False) -> None:
94
+ self.normalized = normalized
95
+ self.transpose = transpose
96
+
97
+ def init(self, x: torch.Tensor) -> torch.Tensor:
98
+ dtype = x.dtype
99
+ if self.transpose:
100
+ x = x.transpose(0, 1)
101
+
102
+ torch.nn.init.normal_(x)
103
+
104
+ x.div_(x.norm(dim=-1, keepdim=True))
105
+ if self.normalized:
106
+ x.div_(math.sqrt(x.size(-1)))
107
+
108
+ x = x.to(dtype=dtype)
109
+ if self.transpose:
110
+ x = x.transpose(0, 1)
111
+
112
+ return x
113
+
114
+ def lmo(self, grad: torch.Tensor, eps: float = 1e-8) -> torch.Tensor:
115
+ if self.transpose:
116
+ grad = grad.transpose(0, 1)
117
+
118
+ rms_value = torch.sqrt(torch.sum(grad.pow(2), dim=-1, keepdim=True))
119
+ if self.normalized:
120
+ rms_value.mul_(math.sqrt(grad.size(-1)))
121
+
122
+ grad /= rms_value.add_(eps)
123
+
124
+ if self.transpose:
125
+ grad = grad.transpose(0, 1)
126
+
127
+ return grad
128
+
129
+
130
+ class BiasRMS(Norm):
131
+ r"""bias RMS."""
132
+
133
+ def init(self, x: torch.Tensor) -> torch.Tensor:
134
+ return torch.nn.init.zeros_(x)
135
+
136
+ def lmo(self, grad: torch.Tensor, eps: float = 1e-8) -> torch.Tensor:
137
+ rms_value = torch.sqrt(torch.sum(grad.pow(2), dim=0, keepdim=True))
138
+ grad /= rms_value.add_(eps)
139
+ return grad
140
+
141
+
142
+ class SpectralConv(Norm):
143
+ r"""spectral-convolution normalization.
144
+
145
+ :param num_steps: int. number of steps of zero-power Newton-Schulz 5.
146
+ """
147
+
148
+ def __init__(self, num_steps: int = 5) -> None:
149
+ self.num_steps = num_steps
150
+
151
+ def init(self, x: torch.Tensor) -> torch.Tensor:
152
+ x_fp64 = x.double()
153
+
154
+ d_out, d_in, kernel_size, *_ = x_fp64.size()
155
+
156
+ for i in range(kernel_size):
157
+ for j in range(kernel_size):
158
+ torch.nn.init.orthogonal_(x_fp64[..., i, j])
159
+
160
+ x_fp64.mul_(math.sqrt(d_out / d_in) / (kernel_size**2))
161
+
162
+ return x_fp64.to(dtype=x.dtype)
163
+
164
+ def lmo(self, grad: torch.Tensor, eps: float = 1e-8) -> torch.Tensor:
165
+ grad = zero_power_via_newton_schulz_5(grad.view(len(grad), -1), self.num_steps).view(grad.shape)
166
+
167
+ d_out, d_in, kernel_size, *_ = grad.size()
168
+
169
+ grad *= math.sqrt(d_out / d_in) / (kernel_size**2)
170
+
171
+ return grad
172
+
173
+
174
+ class Spectral(Norm):
175
+ r"""spectral normalization.
176
+
177
+ :param max_scale: bool. set upper bound (1.0) of the scale.
178
+ :param normalize: bool. normalize by the input dimension. use for non-input layers.
179
+ :param num_steps: int. number of steps of zero-power Newton-Schulz 5.
180
+ """
181
+
182
+ def __init__(self, max_scale: bool = False, normalize: bool = True, num_steps: int = 5) -> None:
183
+ self.max_scale = max_scale
184
+ self.normalize = normalize
185
+ self.num_steps = num_steps
186
+
187
+ def init(self, x: torch.Tensor) -> torch.Tensor:
188
+ x_fp64 = x.double()
189
+
190
+ torch.nn.init.orthogonal_(x_fp64)
191
+
192
+ d_out, d_in = x_fp64.size()
193
+
194
+ scale: float = math.sqrt(d_out / d_in) if self.normalize else math.sqrt(d_out)
195
+ if self.max_scale:
196
+ scale = max(1.0, scale)
197
+
198
+ x_fp64.mul_(scale)
199
+
200
+ return x_fp64.to(dtype=x.dtype)
201
+
202
+ def lmo(self, grad: torch.Tensor, eps: float = 1e-8) -> torch.Tensor:
203
+ grad = zero_power_via_newton_schulz_5(grad.view(len(grad), -1), self.num_steps).view(grad.shape)
204
+
205
+ d_out, d_in = grad.size()
206
+
207
+ scale: float = math.sqrt(d_out / d_in) if self.normalize else math.sqrt(d_out)
208
+ if self.max_scale:
209
+ scale = max(1.0, scale)
210
+
211
+ grad *= scale
212
+
213
+ return grad
214
+
215
+
216
+ class Sign(Norm):
217
+ r"""sign normalization.
218
+
219
+ :param zero_init: bool. initialize with zero.
220
+ :param normalize: bool. normalize by the input dimension. use for non-input layers.
221
+ """
222
+
223
+ def __init__(self, zero_init: bool = False, normalize: bool = True) -> None:
224
+ self.zero_init = zero_init
225
+ self.normalize = normalize
226
+
227
+ def init(self, x: torch.Tensor) -> torch.Tensor:
228
+ if self.zero_init:
229
+ return torch.nn.init.zeros_(x)
230
+
231
+ d_in: int = x.size(1)
232
+
233
+ x = 2 * torch.randint(0, 2, x.shape, dtype=x.dtype, device=x.device) - 1
234
+ if self.normalize:
235
+ x.div_(d_in)
236
+
237
+ return x
238
+
239
+ def lmo(self, grad: torch.Tensor, eps: float = 1e-8) -> torch.Tensor:
240
+ d_in: int = grad.size(1)
241
+ return torch.sign(grad).div_(d_in) if self.normalize else torch.sign(grad)
242
+
243
+
244
+ class Auto(Norm):
245
+ r"""choose Norm type automatically."""
246
+
247
+ def init(self, x: torch.Tensor) -> torch.Tensor:
248
+ ndim: int = x.ndim
249
+ if ndim in (0, 1):
250
+ return BiasRMS().init(x)
251
+ if ndim == 2:
252
+ return Spectral().init(x)
253
+ if ndim in (3, 4):
254
+ return SpectralConv().init(x)
255
+ raise NotImplementedError
256
+
257
+ def lmo(self, grad: torch.Tensor) -> torch.Tensor:
258
+ ndim: int = grad.ndim
259
+ if ndim in (0, 1):
260
+ return BiasRMS().lmo(grad)
261
+ if ndim == 2:
262
+ return Spectral().lmo(grad)
263
+ if ndim in (3, 4):
264
+ return SpectralConv().lmo(grad)
265
+ raise NotImplementedError
266
+
267
+
268
+ def build_lmo_norm(norm_type: int, **kwargs) -> Norm: # noqa: PLR0911
269
+ r"""Build LMONorm by given norm_type."""
270
+ if norm_type == LMONorm.AUTO:
271
+ return Auto()
272
+ if norm_type == LMONorm.SPECTRAL:
273
+ return Spectral(**kwargs)
274
+ if norm_type == LMONorm.SPECTRALCONV:
275
+ return SpectralConv(**kwargs)
276
+ if norm_type == LMONorm.SIGN:
277
+ return Sign(**kwargs)
278
+ if norm_type == LMONorm.BIAS:
279
+ return BiasRMS()
280
+ if norm_type == LMONorm.COL:
281
+ return Col(**kwargs)
282
+ if norm_type == LMONorm.ROW:
283
+ return Row(**kwargs)
284
+ return Norm()
285
+
286
+
287
+ class SCION(BaseOptimizer):
288
+ r"""Training Deep Learning Models with Norm-Constrained LMOs.
289
+
290
+ Example:
291
+ >>> radius = 50.0
292
+ >>> parameter_groups = [{
293
+ ... 'params': model.transformer.h.parameters(),
294
+ ... 'norm_type': 'spectral',
295
+ ... 'norm_kwargs': {},
296
+ ... 'scale': radius,
297
+ ... }, {
298
+ ... 'params': model.lm_head.parameters(),
299
+ ... 'norm_type': 'sign',
300
+ ... 'norm_kwargs': {},
301
+ ... 'scale': radius * 60.0,
302
+ ... }]
303
+ >>> optimizer = SCION(parameter_groups)
304
+
305
+ For more details, checkout here https://github.com/LIONS-EPFL/scion/tree/main?tab=readme-ov-file#examples
306
+
307
+ :param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
308
+ :param lr: float. learning rate.
309
+ :param momentum: float. momentum factor. 1.0 - usual momentum.
310
+ :param constraint: bool. whether to use a constraint SCG or not.
311
+ :param norm_type: int. supported LMO norm types. 0 stands for no normalization and 1 stands for AUTO. 0 to 7.
312
+ please check LMONorm Enum class for the details.
313
+ :param norm_kwargs: Optional[Dict]. arguments for the Norm.
314
+ :param scale: float. based on the usage of the original intend, 50.0 is used for Transformer block, and 3000.0 is
315
+ used for others (e.g. Embedding, LM head)
316
+ :param weight_decay: float. weight decay (L2 penalty).
317
+ :param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
318
+ """
319
+
320
+ def __init__(
321
+ self,
322
+ params: PARAMETERS,
323
+ lr: float = 1e-3,
324
+ momentum: float = 0.1,
325
+ constraint: bool = False,
326
+ norm_type: int = LMONorm.AUTO,
327
+ norm_kwargs: Optional[Dict] = None,
328
+ scale: float = 1.0,
329
+ weight_decay: float = 0.0,
330
+ weight_decouple: bool = True,
331
+ **kwargs,
332
+ ):
333
+ self.validate_learning_rate(lr)
334
+ self.validate_range(momentum, 'momentum', 0.0, 1.0, '(]')
335
+ self.validate_positive(scale, 'scale')
336
+
337
+ if norm_kwargs is None:
338
+ norm_kwargs = {}
339
+
340
+ defaults: DEFAULTS = {
341
+ 'lr': lr,
342
+ 'momentum': momentum,
343
+ 'constraint': constraint,
344
+ 'norm_type': norm_type,
345
+ 'norm_kwargs': norm_kwargs,
346
+ 'scale': scale,
347
+ 'weight_decay': weight_decay,
348
+ 'weight_decouple': weight_decouple,
349
+ }
350
+ super().__init__(params, defaults)
351
+
352
+ def __str__(self) -> str:
353
+ return 'SCION'
354
+
355
+ @torch.no_grad()
356
+ def reset(self):
357
+ pass
358
+
359
+ @torch.no_grad()
360
+ def init(self):
361
+ for group in self.param_groups:
362
+ norm = build_lmo_norm(group['norm_type'], **group['norm_kwargs'])
363
+ for p in group['params']:
364
+ norm.init(p)
365
+ p.mul_(group['scale'])
366
+
367
+ @torch.no_grad()
368
+ def step(self, closure: CLOSURE = None) -> LOSS:
369
+ loss: LOSS = None
370
+ if closure is not None:
371
+ with torch.enable_grad():
372
+ loss = closure()
373
+
374
+ for group in self.param_groups:
375
+ norm = build_lmo_norm(group['norm_type'], **group['norm_kwargs'])
376
+
377
+ for p in group['params']:
378
+ if p.grad is None:
379
+ continue
380
+
381
+ grad = p.grad
382
+ if grad.is_sparse:
383
+ raise NoSparseGradientError(str(self))
384
+
385
+ state = self.state[p]
386
+ if 'd' not in state:
387
+ state['d'] = torch.zeros_like(grad)
388
+
389
+ d = state['d']
390
+ d.mul_(1.0 - group['momentum']).add_(grad, alpha=group['momentum'])
391
+
392
+ update = norm.lmo(grad).mul_(group['scale'])
393
+
394
+ if group['constraint']:
395
+ p.mul_(1.0 - group['lr'])
396
+
397
+ if not group['constraint'] and group['weight_decay'] > 0.0:
398
+ self.apply_weight_decay(
399
+ p,
400
+ grad,
401
+ lr=group['lr'],
402
+ weight_decay=group['weight_decay'],
403
+ weight_decouple=group['weight_decouple'],
404
+ fixed_decay=False,
405
+ )
406
+
407
+ p.add_(update, alpha=-group['lr'])
408
+
409
+ return loss
410
+
411
+
412
+ class SCIONLight(BaseOptimizer):
413
+ r"""Memory-efficient variant of the Scion optimizer.
414
+
415
+ Example:
416
+ >>> radius = 50.0
417
+ >>> parameter_groups = [{
418
+ ... 'params': model.transformer.h.parameters(),
419
+ ... 'norm_type': 'spectral',
420
+ ... 'norm_kwargs': {},
421
+ ... 'scale': radius,
422
+ ... }, {
423
+ ... 'params': model.lm_head.parameters(),
424
+ ... 'norm_type': 'sign',
425
+ ... 'norm_kwargs': {},
426
+ ... 'scale': radius * 60.0,
427
+ ... }]
428
+ >>> optimizer = SCIONLight(parameter_groups)
429
+
430
+ For more details, checkout here https://github.com/LIONS-EPFL/scion/tree/main?tab=readme-ov-file#examples
431
+
432
+ :param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
433
+ :param lr: float. learning rate.
434
+ :param momentum: float. momentum factor. 1.0 - usual momentum.
435
+ :param constraint: bool. whether to use a constraint SCG or not.
436
+ :param norm_type: int. supported LMO norm types. 0 stands for no normalization and 1 stands for AUTO. 0 to 7.
437
+ please check LMONorm Enum class for the details.
438
+ :param norm_kwargs: Optional[Dict]. arguments for the Norm.
439
+ :param scale: float. based on the usage of the original intend, 50.0 is used for Transformer block, and 3000.0 is
440
+ used for others (e.g. Embedding, LM head)
441
+ :param weight_decay: float. weight decay (L2 penalty).
442
+ :param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
443
+ """
444
+
445
+ def __init__(
446
+ self,
447
+ params: PARAMETERS,
448
+ lr: float = 1e-3,
449
+ momentum: float = 0.1,
450
+ constraint: bool = False,
451
+ norm_type: int = LMONorm.AUTO,
452
+ norm_kwargs: Optional[Dict] = None,
453
+ scale: float = 1.0,
454
+ weight_decay: float = 0.0,
455
+ weight_decouple: bool = True,
456
+ **kwargs,
457
+ ):
458
+ self.validate_learning_rate(lr)
459
+ self.validate_range(momentum, 'momentum', 0.0, 1.0, '(]')
460
+ self.validate_positive(scale, 'scale')
461
+
462
+ if norm_kwargs is None:
463
+ norm_kwargs = {}
464
+
465
+ defaults: DEFAULTS = {
466
+ 'lr': lr,
467
+ 'momentum': momentum,
468
+ 'constraint': constraint,
469
+ 'norm_type': norm_type,
470
+ 'norm_kwargs': norm_kwargs,
471
+ 'scale': scale,
472
+ 'weight_decay': weight_decay,
473
+ 'weight_decouple': weight_decouple,
474
+ }
475
+ super().__init__(params, defaults)
476
+
477
+ def __str__(self) -> str:
478
+ return 'SCIONLight'
479
+
480
+ @torch.no_grad()
481
+ def reset(self):
482
+ pass
483
+
484
+ @torch.no_grad()
485
+ def init(self):
486
+ for group in self.param_groups:
487
+ norm = build_lmo_norm(group['norm_type'], **group['norm_kwargs'])
488
+ for p in group['params']:
489
+ norm.init(p)
490
+ p.mul_(group['scale'])
491
+
492
+ @torch.no_grad()
493
+ def step(self, closure: CLOSURE = None) -> LOSS:
494
+ loss: LOSS = None
495
+ if closure is not None:
496
+ with torch.enable_grad():
497
+ loss = closure()
498
+
499
+ for group in self.param_groups:
500
+ norm = build_lmo_norm(group['norm_type'], **group['norm_kwargs'])
501
+
502
+ for p in group['params']:
503
+ if p.grad is None:
504
+ continue
505
+
506
+ grad = p.grad
507
+ if grad.is_sparse:
508
+ raise NoSparseGradientError(str(self))
509
+
510
+ update = norm.lmo(grad).mul_(group['scale'])
511
+
512
+ if group['constraint']:
513
+ p.mul_(1.0 - group['lr'])
514
+
515
+ if not group['constraint'] and group['weight_decay'] > 0.0:
516
+ self.apply_weight_decay(
517
+ p,
518
+ grad,
519
+ lr=group['lr'],
520
+ weight_decay=group['weight_decay'],
521
+ weight_decouple=group['weight_decouple'],
522
+ fixed_decay=False,
523
+ )
524
+
525
+ p.add_(update, alpha=-group['lr'])
526
+
527
+ if group['momentum'] != 1.0:
528
+ grad.mul_(1.0 - group['momentum'])
529
+
530
+ return loss
@@ -31,7 +31,8 @@ class CosineDecay:
31
31
 
32
32
  :param current_step: int. Current step index.
33
33
  """
34
- self.cosine_stepper.step(current_step)
34
+ self.cosine_stepper.last_epoch = current_step
35
+ self.cosine_stepper.step()
35
36
 
36
37
  def get_death_rate(self, current_step: int) -> float:
37
38
  r"""Get the updated rate (death_rate) at the given step.
@@ -266,9 +267,9 @@ class StableSPAM(BaseOptimizer):
266
267
  :param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
267
268
  :param lr: float. learning rate.
268
269
  :param betas: BETAS. coefficients used for computing running averages of gradient and the squared hessian trace.
269
- :param gamma1: float.
270
- :param gamma2: float.
271
- :param theta: float.
270
+ :param gamma1: float. gamma1 parameter.
271
+ :param gamma2: float. gamma2 parameter.
272
+ :param theta: float. theta parameter.
272
273
  :param t_max: Optional[int]. total number of steps.
273
274
  :param eta_min: float. eta_min of CosineDecay.
274
275
  :param weight_decay: float. weight decay (L2 penalty).