pytorch-optimizer 3.3.1__tar.gz → 3.3.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 (111) hide show
  1. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/PKG-INFO +3 -2
  2. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/README.md +2 -1
  3. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pyproject.toml +1 -1
  4. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/__init__.py +1 -0
  5. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/__init__.py +2 -1
  6. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adashift.py +2 -1
  7. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/ademamix.py +3 -2
  8. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/mars.py +14 -11
  9. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/sgd.py +123 -0
  10. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/LICENSE +0 -0
  11. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/base/__init__.py +0 -0
  12. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/base/exception.py +0 -0
  13. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/base/optimizer.py +0 -0
  14. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/base/scheduler.py +0 -0
  15. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/base/types.py +0 -0
  16. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/loss/__init__.py +0 -0
  17. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/loss/bi_tempered.py +0 -0
  18. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/loss/cross_entropy.py +0 -0
  19. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/loss/dice.py +0 -0
  20. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/loss/f1.py +0 -0
  21. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/loss/focal.py +0 -0
  22. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/loss/jaccard.py +0 -0
  23. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/loss/ldam.py +0 -0
  24. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/loss/lovasz.py +0 -0
  25. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/loss/tversky.py +0 -0
  26. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/lr_scheduler/__init__.py +0 -0
  27. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/lr_scheduler/chebyshev.py +0 -0
  28. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/lr_scheduler/cosine_anealing.py +0 -0
  29. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/lr_scheduler/experimental/__init__.py +0 -0
  30. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/lr_scheduler/experimental/deberta_v3_lr_scheduler.py +0 -0
  31. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/lr_scheduler/linear_warmup.py +0 -0
  32. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/lr_scheduler/proportion.py +0 -0
  33. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/lr_scheduler/rex.py +0 -0
  34. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/lr_scheduler/wsd.py +0 -0
  35. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/a2grad.py +0 -0
  36. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adabelief.py +0 -0
  37. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adabound.py +0 -0
  38. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adadelta.py +0 -0
  39. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adafactor.py +0 -0
  40. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adahessian.py +0 -0
  41. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adai.py +0 -0
  42. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adalite.py +0 -0
  43. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adam_mini.py +0 -0
  44. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adamax.py +0 -0
  45. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adamg.py +0 -0
  46. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adamod.py +0 -0
  47. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adamp.py +0 -0
  48. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adams.py +0 -0
  49. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adamw.py +0 -0
  50. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adan.py +0 -0
  51. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adanorm.py +0 -0
  52. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adapnm.py +0 -0
  53. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adasmooth.py +0 -0
  54. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/adopt.py +0 -0
  55. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/agc.py +0 -0
  56. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/aggmo.py +0 -0
  57. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/aida.py +0 -0
  58. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/alig.py +0 -0
  59. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/amos.py +0 -0
  60. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/apollo.py +0 -0
  61. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/avagrad.py +0 -0
  62. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/came.py +0 -0
  63. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/dadapt.py +0 -0
  64. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/demo.py +0 -0
  65. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/diffgrad.py +0 -0
  66. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/fadam.py +0 -0
  67. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/fp16.py +0 -0
  68. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/fromage.py +0 -0
  69. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/ftrl.py +0 -0
  70. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/galore.py +0 -0
  71. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/galore_utils.py +0 -0
  72. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/gc.py +0 -0
  73. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/gravity.py +0 -0
  74. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/grokfast.py +0 -0
  75. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/kate.py +0 -0
  76. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/lamb.py +0 -0
  77. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/laprop.py +0 -0
  78. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/lars.py +0 -0
  79. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/lion.py +0 -0
  80. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/lomo.py +0 -0
  81. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/lookahead.py +0 -0
  82. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/madgrad.py +0 -0
  83. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/msvag.py +0 -0
  84. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/muon.py +0 -0
  85. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/nero.py +0 -0
  86. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/novograd.py +0 -0
  87. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/padam.py +0 -0
  88. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/pcgrad.py +0 -0
  89. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/pid.py +0 -0
  90. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/pnm.py +0 -0
  91. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/prodigy.py +0 -0
  92. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/qhadam.py +0 -0
  93. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/qhm.py +0 -0
  94. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/radam.py +0 -0
  95. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/ranger.py +0 -0
  96. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/ranger21.py +0 -0
  97. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/rotograd.py +0 -0
  98. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/sam.py +0 -0
  99. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/schedulefree.py +0 -0
  100. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/sgdp.py +0 -0
  101. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/shampoo.py +0 -0
  102. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/shampoo_utils.py +0 -0
  103. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/sm3.py +0 -0
  104. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/soap.py +0 -0
  105. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/sophia.py +0 -0
  106. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/srmm.py +0 -0
  107. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/swats.py +0 -0
  108. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/tiger.py +0 -0
  109. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/trac.py +0 -0
  110. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/utils.py +0 -0
  111. {pytorch_optimizer-3.3.1 → pytorch_optimizer-3.3.2}/pytorch_optimizer/optimizer/yogi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pytorch_optimizer
3
- Version: 3.3.1
3
+ Version: 3.3.2
4
4
  Summary: optimizer & lr scheduler & objective function collections in PyTorch
5
5
  Home-page: https://github.com/kozistr/pytorch_optimizer
6
6
  License: Apache-2.0
@@ -51,7 +51,7 @@ Description-Content-Type: text/markdown
51
51
 
52
52
  ## The reasons why you use `pytorch-optimizer`.
53
53
 
54
- * Wide range of supported optimizers. Currently, **85 optimizers (+ `bitsandbytes`, `qgalore`, `torchao`)**, **16 lr schedulers**, and **13 loss functions** are supported!
54
+ * Wide range of supported optimizers. Currently, **86 optimizers (+ `bitsandbytes`, `qgalore`, `torchao`)**, **16 lr schedulers**, and **13 loss functions** are supported!
55
55
  * Including many variants such as `Cautious`, `AdamD`, `Gradient Centrailiaztion`
56
56
  * Easy to use, clean, and tested codes
57
57
  * Active maintenance
@@ -235,6 +235,7 @@ get_supported_optimizers(['adam*', 'ranger*'])
235
235
  | LaProp | *Separating Momentum and Adaptivity in Adam* | [github](https://github.com/Z-T-WANG/LaProp-Optimizer) | <https://arxiv.org/abs/2002.04839> | [cite](https://github.com/Z-T-WANG/LaProp-Optimizer?tab=readme-ov-file#citation) |
236
236
  | APOLLO | *SGD-like Memory, AdamW-level Performance* | [github](https://github.com/zhuhanqing/APOLLO) | <https://arxiv.org/abs/2412.05270> | [cite](https://github.com/zhuhanqing/APOLLO?tab=readme-ov-file#-citation) |
237
237
  | MARS | *Unleashing the Power of Variance Reduction for Training Large Models* | [github](https://github.com/AGI-Arena/MARS) | <https://arxiv.org/abs/2411.10438> | [cite](https://github.com/AGI-Arena/MARS/tree/main?tab=readme-ov-file#citation) |
238
+ | SGDSaI | *No More Adam: Learning Rate Scaling at Initialization is All You Need* | [github](https://github.com/AnonymousAlethiometer/SGD_SaI) | <https://arxiv.org/abs/2411.10438> | [cite](https://github.com/AnonymousAlethiometer/SGD_SaI?tab=readme-ov-file#citation) |
238
239
 
239
240
  ## Supported LR Scheduler
240
241
 
@@ -10,7 +10,7 @@
10
10
 
11
11
  ## The reasons why you use `pytorch-optimizer`.
12
12
 
13
- * Wide range of supported optimizers. Currently, **85 optimizers (+ `bitsandbytes`, `qgalore`, `torchao`)**, **16 lr schedulers**, and **13 loss functions** are supported!
13
+ * Wide range of supported optimizers. Currently, **86 optimizers (+ `bitsandbytes`, `qgalore`, `torchao`)**, **16 lr schedulers**, and **13 loss functions** are supported!
14
14
  * Including many variants such as `Cautious`, `AdamD`, `Gradient Centrailiaztion`
15
15
  * Easy to use, clean, and tested codes
16
16
  * Active maintenance
@@ -194,6 +194,7 @@ get_supported_optimizers(['adam*', 'ranger*'])
194
194
  | LaProp | *Separating Momentum and Adaptivity in Adam* | [github](https://github.com/Z-T-WANG/LaProp-Optimizer) | <https://arxiv.org/abs/2002.04839> | [cite](https://github.com/Z-T-WANG/LaProp-Optimizer?tab=readme-ov-file#citation) |
195
195
  | APOLLO | *SGD-like Memory, AdamW-level Performance* | [github](https://github.com/zhuhanqing/APOLLO) | <https://arxiv.org/abs/2412.05270> | [cite](https://github.com/zhuhanqing/APOLLO?tab=readme-ov-file#-citation) |
196
196
  | MARS | *Unleashing the Power of Variance Reduction for Training Large Models* | [github](https://github.com/AGI-Arena/MARS) | <https://arxiv.org/abs/2411.10438> | [cite](https://github.com/AGI-Arena/MARS/tree/main?tab=readme-ov-file#citation) |
197
+ | SGDSaI | *No More Adam: Learning Rate Scaling at Initialization is All You Need* | [github](https://github.com/AnonymousAlethiometer/SGD_SaI) | <https://arxiv.org/abs/2411.10438> | [cite](https://github.com/AnonymousAlethiometer/SGD_SaI?tab=readme-ov-file#citation) |
197
198
 
198
199
  ## Supported LR Scheduler
199
200
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "pytorch_optimizer"
3
- version = "3.3.1"
3
+ version = "3.3.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>"]
@@ -128,6 +128,7 @@ from pytorch_optimizer.optimizer import (
128
128
  ScheduleFreeAdamW,
129
129
  ScheduleFreeRAdam,
130
130
  ScheduleFreeSGD,
131
+ SGDSaI,
131
132
  Shampoo,
132
133
  SignSGD,
133
134
  SophiaH,
@@ -74,7 +74,7 @@ from pytorch_optimizer.optimizer.ranger21 import Ranger21
74
74
  from pytorch_optimizer.optimizer.rotograd import RotoGrad
75
75
  from pytorch_optimizer.optimizer.sam import BSAM, GSAM, SAM, WSAM
76
76
  from pytorch_optimizer.optimizer.schedulefree import ScheduleFreeAdamW, ScheduleFreeRAdam, ScheduleFreeSGD
77
- from pytorch_optimizer.optimizer.sgd import ASGD, SGDW, AccSGD, SignSGD
77
+ from pytorch_optimizer.optimizer.sgd import ASGD, SGDW, AccSGD, SGDSaI, SignSGD
78
78
  from pytorch_optimizer.optimizer.sgdp import SGDP
79
79
  from pytorch_optimizer.optimizer.shampoo import ScalableShampoo, Shampoo
80
80
  from pytorch_optimizer.optimizer.sm3 import SM3
@@ -281,6 +281,7 @@ OPTIMIZER_LIST: List[OPTIMIZER] = [
281
281
  ScheduleFreeRAdam,
282
282
  LaProp,
283
283
  MARS,
284
+ SGDSaI,
284
285
  ]
285
286
  OPTIMIZERS: Dict[str, OPTIMIZER] = {str(optimizer.__name__).lower(): optimizer for optimizer in OPTIMIZER_LIST}
286
287
 
@@ -110,10 +110,11 @@ class AdaShift(BaseOptimizer):
110
110
  exp_avg_sq.mul_(beta2).add_(reduced_grad_sq, alpha=1.0 - beta2)
111
111
 
112
112
  update = exp_avg.clone()
113
- update.div_(exp_avg_sq.div(bias_correction).sqrt_().add_(group['eps']))
114
113
  if self.cautious:
115
114
  self.apply_cautious(update, grad)
116
115
 
116
+ update.div_(exp_avg_sq.div(bias_correction).sqrt_().add_(group['eps']))
117
+
117
118
  p.add_(update, alpha=-group['lr'])
118
119
 
119
120
  return loss
@@ -146,10 +146,11 @@ class AdEMAMix(BaseOptimizer):
146
146
 
147
147
  de_nom = exp_avg_sq.sqrt().div_(bias_correction2_sq).add_(group['eps'])
148
148
 
149
+ update = exp_avg.clone()
149
150
  if self.cautious:
150
- self.apply_cautious(exp_avg, grad)
151
+ self.apply_cautious(update, grad)
151
152
 
152
- update = (exp_avg + alpha_t * exp_avg_slow).div_(de_nom)
153
+ update.add_(exp_avg_slow, alpha=alpha_t).div_(de_nom)
153
154
 
154
155
  p.add_(update, alpha=-step_size)
155
156
 
@@ -121,8 +121,9 @@ class MARS(BaseOptimizer):
121
121
 
122
122
  exp_avg.mul_(beta1).add_(c_t, alpha=1.0 - beta1)
123
123
 
124
+ update = exp_avg.clone()
124
125
  if cautious:
125
- self.apply_cautious(exp_avg, grad)
126
+ self.apply_cautious(update, grad)
126
127
 
127
128
  if mars_type == 'adamw' or (mars_type == 'shampoo' and not is_grad_2d):
128
129
  exp_avg_sq.mul_(beta2).addcmul_(c_t, c_t, value=1.0 - beta2)
@@ -130,17 +131,17 @@ class MARS(BaseOptimizer):
130
131
  bias_correction1: float = self.debias(beta1, step)
131
132
  bias_correction2_sq: float = math.sqrt(self.debias(beta2, step))
132
133
 
133
- update = self.apply_ams_bound(ams_bound, exp_avg_sq, max_exp_avg_sq, eps)
134
- update.div_(bias_correction2_sq).mul_(bias_correction1)
134
+ de_nom = self.apply_ams_bound(ams_bound, exp_avg_sq, max_exp_avg_sq, eps)
135
+ de_nom.div_(bias_correction2_sq).mul_(bias_correction1)
135
136
 
136
- return exp_avg.div(update)
137
+ return update.div_(de_nom)
137
138
 
138
139
  if mars_type == 'lion':
139
- return exp_avg.sign()
140
+ return update.sign_()
140
141
 
141
- factor: float = max(1.0, grad.size(0) / grad.size(1)) ** 0.5
142
+ factor: float = math.sqrt(max(1.0, grad.size(0) / grad.size(1)))
142
143
 
143
- return zero_power_via_newton_schulz_5(exp_avg.mul(1.0 / (1.0 - beta1)), eps=eps).mul_(factor)
144
+ return zero_power_via_newton_schulz_5(update.mul_(1.0 / (1.0 - beta1)), eps=eps).mul_(factor)
144
145
 
145
146
  def optimize_1d(
146
147
  self,
@@ -162,13 +163,15 @@ class MARS(BaseOptimizer):
162
163
  exp_avg.mul_(beta1).add_(grad, alpha=1.0 - beta1)
163
164
  exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1.0 - beta2)
164
165
 
165
- update = self.apply_ams_bound(ams_bound, exp_avg_sq, max_exp_avg_sq, eps)
166
- update.div_(bias_correction2_sq).mul_(bias_correction1)
166
+ update = exp_avg.clone()
167
167
 
168
168
  if cautious:
169
- self.apply_cautious(exp_avg, grad)
169
+ self.apply_cautious(update, grad)
170
170
 
171
- return exp_avg.div(update)
171
+ de_nom = self.apply_ams_bound(ams_bound, exp_avg_sq, max_exp_avg_sq, eps)
172
+ de_nom.div_(bias_correction2_sq).mul_(bias_correction1)
173
+
174
+ return update.div_(de_nom)
172
175
 
173
176
  @torch.no_grad()
174
177
  def step(self, closure: CLOSURE = None) -> LOSS:
@@ -356,6 +356,9 @@ class SignSGD(BaseOptimizer):
356
356
  }
357
357
  super().__init__(params, defaults)
358
358
 
359
+ def __str__(self) -> str:
360
+ return 'SignSGD'
361
+
359
362
  @torch.no_grad()
360
363
  def reset(self):
361
364
  for group in self.param_groups:
@@ -396,3 +399,123 @@ class SignSGD(BaseOptimizer):
396
399
  p.add_(torch.sign(buf), alpha=-group['lr'])
397
400
 
398
401
  return loss
402
+
403
+
404
+ class SGDSaI(BaseOptimizer):
405
+ r"""No More Adam: Learning Rate Scaling at Initialization is All You Need.
406
+
407
+ :param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
408
+ :param lr: float. learning rate.
409
+ :param momentum: float. coefficients used for computing running averages of gradient.
410
+ :param weight_decay: float. weight decay (L2 penalty).
411
+ :param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
412
+ :param eps: float. term added to the denominator to improve numerical stability.
413
+ """
414
+
415
+ def __init__(
416
+ self,
417
+ params: PARAMETERS,
418
+ lr: float = 1e-2,
419
+ momentum: float = 0.9,
420
+ weight_decay: float = 1e-2,
421
+ weight_decouple: bool = True,
422
+ eps: float = 1e-8,
423
+ **kwargs,
424
+ ):
425
+ self.validate_learning_rate(lr)
426
+ self.validate_range(momentum, 'beta', 0.0, 1.0)
427
+ self.validate_non_negative(weight_decay, 'weight_decay')
428
+ self.validate_non_negative(eps, 'eps')
429
+
430
+ self.has_warmup: bool = False
431
+
432
+ defaults: DEFAULTS = {
433
+ 'lr': lr,
434
+ 'momentum': momentum,
435
+ 'weight_decay': weight_decay,
436
+ 'weight_decouple': weight_decouple,
437
+ 'eps': eps,
438
+ }
439
+ super().__init__(params, defaults)
440
+
441
+ def __str__(self) -> str:
442
+ return 'SGDSaI'
443
+
444
+ @torch.no_grad()
445
+ def reset(self):
446
+ for group in self.param_groups:
447
+ group['step'] = 0
448
+ for p in group['params']:
449
+ state = self.state[p]
450
+
451
+ if group['momentum'] > 0.0:
452
+ state['momentum_buffer'] = torch.zeros_like(p)
453
+
454
+ @torch.no_grad()
455
+ def warmup_step(self, closure: CLOSURE = None) -> LOSS:
456
+ loss: LOSS = None
457
+ if closure is not None:
458
+ with torch.enable_grad():
459
+ loss = closure()
460
+
461
+ for group in self.param_groups:
462
+ for p in group['params']:
463
+ if p.grad is None:
464
+ continue
465
+
466
+ grad = p.grad
467
+ if grad.is_sparse:
468
+ raise NoSparseGradientError(str(self))
469
+
470
+ sigma = grad.std().nan_to_num_()
471
+ grad_norm = grad.norm()
472
+
473
+ g_snr = grad_norm.div_(sigma.add_(group['eps'])) if sigma != 0.0 else grad_norm
474
+
475
+ self.state[p]['gsnr'] = g_snr
476
+
477
+ self.has_warmup = True
478
+
479
+ return loss
480
+
481
+ @torch.no_grad()
482
+ def step(self, closure: CLOSURE = None) -> LOSS:
483
+ if not self.has_warmup:
484
+ self.warmup_step(closure)
485
+
486
+ loss: LOSS = None
487
+ if closure is not None:
488
+ with torch.enable_grad():
489
+ loss = closure()
490
+
491
+ for group in self.param_groups:
492
+ momentum: float = group['momentum']
493
+ for p in group['params']:
494
+ if p.grad is None:
495
+ continue
496
+
497
+ grad = p.grad
498
+
499
+ state = self.state[p]
500
+
501
+ if momentum > 0.0:
502
+ if 'momentum_buffer' not in state:
503
+ state['momentum_buffer'] = grad.clone()
504
+
505
+ buf = state['momentum_buffer']
506
+ buf.mul_(momentum).add_(grad, alpha=1.0 - momentum)
507
+ else:
508
+ buf = grad
509
+
510
+ self.apply_weight_decay(
511
+ p,
512
+ grad,
513
+ group['lr'],
514
+ group['weight_decay'],
515
+ group['weight_decouple'],
516
+ False,
517
+ )
518
+
519
+ p.add_(buf, alpha=-group['lr'] * state['gsnr'])
520
+
521
+ return loss