pytorch-optimizer 2.9.0__tar.gz → 2.9.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 (72) hide show
  1. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/PKG-INFO +4 -4
  2. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/README.rst +2 -2
  3. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pyproject.toml +2 -2
  4. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/base/optimizer.py +19 -50
  5. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/a2grad.py +1 -1
  6. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adai.py +1 -1
  7. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adamp.py +1 -1
  8. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adan.py +1 -1
  9. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/agc.py +1 -1
  10. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/apollo.py +2 -2
  11. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/gc.py +1 -3
  12. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/lion.py +1 -1
  13. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/lookahead.py +1 -1
  14. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/pcgrad.py +1 -1
  15. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/ranger.py +1 -1
  16. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/ranger21.py +20 -34
  17. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/shampoo.py +2 -2
  18. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/utils.py +1 -3
  19. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/LICENSE +0 -0
  20. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/__init__.py +0 -0
  21. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/base/__init__.py +0 -0
  22. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/base/exception.py +0 -0
  23. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/base/scheduler.py +0 -0
  24. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/base/types.py +0 -0
  25. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/lr_scheduler/__init__.py +0 -0
  26. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/lr_scheduler/chebyshev.py +0 -0
  27. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/lr_scheduler/cosine_anealing.py +0 -0
  28. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/lr_scheduler/experimental/__init__.py +0 -0
  29. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/lr_scheduler/experimental/deberta_v3_lr_scheduler.py +0 -0
  30. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/lr_scheduler/linear_warmup.py +0 -0
  31. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/lr_scheduler/proportion.py +0 -0
  32. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/__init__.py +0 -0
  33. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adabelief.py +0 -0
  34. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adabound.py +0 -0
  35. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adadelta.py +0 -0
  36. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adafactor.py +0 -0
  37. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adamax.py +0 -0
  38. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adamod.py +0 -0
  39. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adams.py +0 -0
  40. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adanorm.py +0 -0
  41. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adapnm.py +0 -0
  42. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adashift.py +0 -0
  43. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/adasmooth.py +0 -0
  44. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/aggmo.py +0 -0
  45. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/alig.py +0 -0
  46. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/avagrad.py +0 -0
  47. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/dadapt.py +0 -0
  48. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/diffgrad.py +0 -0
  49. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/fp16.py +0 -0
  50. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/fromage.py +0 -0
  51. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/gravity.py +0 -0
  52. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/gsam.py +0 -0
  53. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/lamb.py +0 -0
  54. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/lars.py +0 -0
  55. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/madgrad.py +0 -0
  56. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/msvag.py +0 -0
  57. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/nero.py +0 -0
  58. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/novograd.py +0 -0
  59. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/pid.py +0 -0
  60. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/pnm.py +0 -0
  61. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/qhadam.py +0 -0
  62. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/qhm.py +0 -0
  63. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/radam.py +0 -0
  64. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/rotograd.py +0 -0
  65. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/sam.py +0 -0
  66. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/sgd.py +0 -0
  67. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/sgdp.py +0 -0
  68. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/shampoo_utils.py +0 -0
  69. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/sm3.py +0 -0
  70. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/srmm.py +0 -0
  71. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/swats.py +0 -0
  72. {pytorch_optimizer-2.9.0 → pytorch_optimizer-2.9.1}/pytorch_optimizer/optimizer/yogi.py +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pytorch-optimizer
3
- Version: 2.9.0
4
- Summary: optimizer & lr scheduler implementations in PyTorch with clean-code, strict types. Also, including useful optimization ideas.
3
+ Version: 2.9.1
4
+ Summary: optimizer & lr scheduler collections in PyTorch
5
5
  Home-page: https://github.com/kozistr/pytorch_optimizer
6
6
  License: Apache-2.0
7
7
  Keywords: pytorch,deep-learning,optimizer,lr scheduler,A2Grad,ASGD,AccSGD,AdaBelief,AdaBound,AdaDelta,AdaFactor,AdaMax,AdaMod,AdaNorm,AdaPNM,AdaSmooth,Adai,AdamP,AdamS,Adan,AggMo,AliG,Apollo,AvaGrad,DAdaptAdaGrad,DAdaptAdam,DAdaptAdan,DAdaptSGD,DiffGrad,Fromage,Gravity,LARS,Lamb,Lion,MADGRAD,MSVAG,Nero,NovoGrad,PID,PNM,QHAdam,QHM,RAdam,Ranger,Ranger21,SGDP,SGDW,SM3,SRMM,SWATS,ScalableShampoo,Shampoo,Yogi,SAM,GSAM,PCGrad,RotoGrad
@@ -172,9 +172,9 @@ You can check the supported optimizers & lr schedulers.
172
172
  +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
173
173
  | Adai | *Disentangling the Effects of Adaptive Learning Rate and Momentum* | `github <https://github.com/zeke-xie/adaptive-inertia-adai>`__ | `https://arxiv.org/abs/2006.15815 <https://arxiv.org/abs/2006.15815>`__ | `cite <https://github.com/zeke-xie/adaptive-inertia-adai#citing>`__ |
174
174
  +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
175
- | SAM | *Sharpness-Aware Minimization* | `github <https://github.com/davda54/sam>`__ | `https://arxiv.org/abs/2010.01412 <https://arxiv.org/abs/2010.01412>`__ | `cite <https://ui.adsabs.harvard.edu/abs/2020arXiv201001412F/exportcitation>`__ |
175
+ | SAM | *Sharpness-Aware Minimization* | `github <https://github.com/davda54/sam>`__ | `https://arxiv.org/abs/2010.01412 <https://arxiv.org/abs/2010.01412>`__ | `cite <https://ui.adsabs.harvard.edu/abs/2020arXiv201001412F/exportcitation>`__ |
176
176
  +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
177
- | ASAM | *Adaptive Sharpness-Aware Minimization* | `github <https://github.com/davda54/sam>`__ | `https://arxiv.org/abs/2102.11600 <https://arxiv.org/abs/2102.11600>`__ | `cite <https://ui.adsabs.harvard.edu/abs/2021arXiv210211600K/exportcitation>`__ |
177
+ | ASAM | *Adaptive Sharpness-Aware Minimization* | `github <https://github.com/davda54/sam>`__ | `https://arxiv.org/abs/2102.11600 <https://arxiv.org/abs/2102.11600>`__ | `cite <https://ui.adsabs.harvard.edu/abs/2021arXiv210211600K/exportcitation>`__ |
178
178
  +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
179
179
  | GSAM | *Surrogate Gap Guided Sharpness-Aware Minimization* | `github <https://github.com/juntang-zhuang/GSAM>`__ | `https://openreview.net/pdf?id=edONMAnhLu- <https://openreview.net/pdf?id=edONMAnhLu->`__ | `cite <https://github.com/juntang-zhuang/GSAM#citation>`__ |
180
180
  +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
@@ -129,9 +129,9 @@ You can check the supported optimizers & lr schedulers.
129
129
  +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
130
130
  | Adai | *Disentangling the Effects of Adaptive Learning Rate and Momentum* | `github <https://github.com/zeke-xie/adaptive-inertia-adai>`__ | `https://arxiv.org/abs/2006.15815 <https://arxiv.org/abs/2006.15815>`__ | `cite <https://github.com/zeke-xie/adaptive-inertia-adai#citing>`__ |
131
131
  +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
132
- | SAM | *Sharpness-Aware Minimization* | `github <https://github.com/davda54/sam>`__ | `https://arxiv.org/abs/2010.01412 <https://arxiv.org/abs/2010.01412>`__ | `cite <https://ui.adsabs.harvard.edu/abs/2020arXiv201001412F/exportcitation>`__ |
132
+ | SAM | *Sharpness-Aware Minimization* | `github <https://github.com/davda54/sam>`__ | `https://arxiv.org/abs/2010.01412 <https://arxiv.org/abs/2010.01412>`__ | `cite <https://ui.adsabs.harvard.edu/abs/2020arXiv201001412F/exportcitation>`__ |
133
133
  +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
134
- | ASAM | *Adaptive Sharpness-Aware Minimization* | `github <https://github.com/davda54/sam>`__ | `https://arxiv.org/abs/2102.11600 <https://arxiv.org/abs/2102.11600>`__ | `cite <https://ui.adsabs.harvard.edu/abs/2021arXiv210211600K/exportcitation>`__ |
134
+ | ASAM | *Adaptive Sharpness-Aware Minimization* | `github <https://github.com/davda54/sam>`__ | `https://arxiv.org/abs/2102.11600 <https://arxiv.org/abs/2102.11600>`__ | `cite <https://ui.adsabs.harvard.edu/abs/2021arXiv210211600K/exportcitation>`__ |
135
135
  +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
136
136
  | GSAM | *Surrogate Gap Guided Sharpness-Aware Minimization* | `github <https://github.com/juntang-zhuang/GSAM>`__ | `https://openreview.net/pdf?id=edONMAnhLu- <https://openreview.net/pdf?id=edONMAnhLu->`__ | `cite <https://github.com/juntang-zhuang/GSAM#citation>`__ |
137
137
  +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
@@ -1,7 +1,7 @@
1
1
  [tool.poetry]
2
2
  name = "pytorch_optimizer"
3
- version = "2.9.0"
4
- description = "optimizer & lr scheduler implementations in PyTorch with clean-code, strict types. Also, including useful optimization ideas."
3
+ version = "2.9.1"
4
+ description = "optimizer & lr scheduler collections in PyTorch"
5
5
  license = "Apache-2.0"
6
6
  authors = ["kozistr <kozistr@gmail.com>"]
7
7
  maintainers = ["kozistr <kozistr@gmail.com>"]
@@ -1,6 +1,6 @@
1
1
  import math
2
2
  from abc import ABC, abstractmethod
3
- from typing import Optional, Tuple, Union
3
+ from typing import List, Optional, Tuple, Union
4
4
 
5
5
  import torch
6
6
 
@@ -90,31 +90,6 @@ class BaseOptimizer(ABC):
90
90
 
91
91
  return grad * exp_grad_norm / grad_norm if exp_grad_norm > grad_norm else grad
92
92
 
93
- @staticmethod
94
- def validate_learning_rate(learning_rate: Optional[float]):
95
- if learning_rate is not None and learning_rate < 0.0:
96
- raise NegativeLRError(learning_rate)
97
-
98
- @staticmethod
99
- def validate_betas(betas: BETAS):
100
- if not 0.0 <= betas[0] <= 1.0:
101
- raise ValueError(f'[-] beta1 {betas[0]} must be in the range [0, 1]')
102
- if not 0.0 <= betas[1] <= 1.0:
103
- raise ValueError(f'[-] beta2 {betas[1]} must be in the range [0, 1]')
104
-
105
- if len(betas) < 3:
106
- return
107
-
108
- if not 0.0 <= betas[2] <= 1.0:
109
- raise ValueError(f'[-] beta3 {betas[2]} must be in the range [0, 1]')
110
-
111
- @staticmethod
112
- def validate_weight_decay_type(weight_decay_type: str):
113
- if weight_decay_type not in ('l2', 'decoupled', 'stable'):
114
- raise ValueError(
115
- f'[-] weight_decay_type {weight_decay_type} must be one of (\'l2\', \'decoupled\', \'stable\')'
116
- )
117
-
118
93
  @staticmethod
119
94
  def validate_range(x: float, name: str, low: float, high: float, range_type: str = '[)'):
120
95
  if range_type == '[)' and not low <= x < high:
@@ -149,37 +124,31 @@ class BaseOptimizer(ABC):
149
124
  raise NegativeStepError(step, step_type=step_type)
150
125
 
151
126
  @staticmethod
152
- def validate_pullback_momentum(pullback_momentum: str):
153
- if pullback_momentum not in ('none', 'reset', 'pullback'):
154
- raise ValueError(
155
- f'[-] pullback_momentum {pullback_momentum} must be one of (\'none\' or \'reset\' or \'pullback\')'
156
- )
127
+ def validate_options(x: str, name: str, options: List[str]):
128
+ if x not in options:
129
+ opts: str = ' or '.join([f'\'{option}\'' for option in options]).strip()
130
+ raise ValueError(f'[-] {name} {x} must be one of ({opts})')
157
131
 
158
132
  @staticmethod
159
- def validate_reduction(reduction: str):
160
- if reduction not in ('mean', 'sum'):
161
- raise ValueError(f'[-] reduction {reduction} must be one of (\'mean\' or \'sum\')')
133
+ def validate_learning_rate(learning_rate: Optional[float]):
134
+ if learning_rate is not None and learning_rate < 0.0:
135
+ raise NegativeLRError(learning_rate)
162
136
 
163
- @staticmethod
164
- def validate_rebound(rebound: str):
165
- if rebound not in ('constant', 'belief'):
166
- raise ValueError(f'[-] rebound {rebound} must be one of (\'constant\' or \'belief\')')
137
+ def validate_betas(self, betas: BETAS):
138
+ self.validate_range(betas[0], 'beta1', 0.0, 1.0, range_type='[]')
139
+ self.validate_range(betas[1], 'beta2', 0.0, 1.0, range_type='[]')
167
140
 
168
- @staticmethod
169
- def validate_a2grad_variant(variant: str):
170
- if variant not in ('uni', 'inc', 'exp'):
171
- raise ValueError(f'[-] A2Grad variant {variant} must be one of (\'uni\' or \'inc\' or \'exp\')')
141
+ if len(betas) < 3:
142
+ return
172
143
 
173
- @staticmethod
174
- def validate_nus(nus: Union[float, Tuple[float, float]]):
144
+ self.validate_range(betas[2], 'beta3', 0.0, 1.0, range_type='[]')
145
+
146
+ def validate_nus(self, nus: Union[float, Tuple[float, float]]):
175
147
  if isinstance(nus, float):
176
- if not 0.0 <= nus <= 1.0:
177
- raise ValueError(f'[-] nus {nus} must be in the range [0, 1]')
148
+ self.validate_range(nus, 'nu', 0.0, 1.0, range_type='[]')
178
149
  else:
179
- if not 0.0 <= nus[0] <= 1.0:
180
- raise ValueError(f'[-] nus1 {nus[0]} must be in the range [0, 1]')
181
- if not 0.0 <= nus[1] <= 1.0:
182
- raise ValueError(f'[-] nus2 {nus[1]} must be in the range [0, 1]')
150
+ self.validate_range(nus[0], 'nu1', 0.0, 1.0, range_type='[]')
151
+ self.validate_range(nus[1], 'nu2', 0.0, 1.0, range_type='[]')
183
152
 
184
153
  @abstractmethod
185
154
  def reset(self):
@@ -32,7 +32,7 @@ class A2Grad(Optimizer, BaseOptimizer):
32
32
  self.validate_learning_rate(lr)
33
33
  self.validate_non_negative(lips, 'lips')
34
34
  self.validate_non_negative(rho, 'rho')
35
- self.validate_a2grad_variant(variant)
35
+ self.validate_options(variant, 'variant', ['uni', 'inc', 'exp'])
36
36
 
37
37
  self.variant = variant
38
38
 
@@ -103,7 +103,7 @@ class Adai(Optimizer, BaseOptimizer):
103
103
  state['step'] += 1
104
104
 
105
105
  if self.use_gc:
106
- grad = centralize_gradient(grad, gc_conv_only=False)
106
+ centralize_gradient(grad, gc_conv_only=False)
107
107
 
108
108
  bias_correction2: float = 1.0 - beta2 ** state['step']
109
109
 
@@ -122,7 +122,7 @@ class AdamP(Optimizer, BaseOptimizer):
122
122
  state['exp_grad_norm'] = torch.zeros((1,), dtype=grad.dtype, device=grad.device)
123
123
 
124
124
  if self.use_gc:
125
- grad = centralize_gradient(grad, gc_conv_only=False)
125
+ centralize_gradient(grad, gc_conv_only=False)
126
126
 
127
127
  s_grad = self.get_adanorm_gradient(
128
128
  grad=grad,
@@ -130,7 +130,7 @@ class Adan(Optimizer, BaseOptimizer):
130
130
  grad.mul_(clip_global_grad_norm)
131
131
 
132
132
  if self.use_gc:
133
- grad = centralize_gradient(grad, gc_conv_only=False)
133
+ centralize_gradient(grad, gc_conv_only=False)
134
134
 
135
135
  grad_diff = state['previous_grad']
136
136
  grad_diff.add_(grad)
@@ -6,7 +6,7 @@ from pytorch_optimizer.optimizer.utils import unit_norm
6
6
  def agc(p: torch.Tensor, grad: torch.Tensor, agc_eps: float, agc_clip_val: float, eps: float = 1e-6) -> torch.Tensor:
7
7
  r"""Clip gradient values in excess of the unit wise norm.
8
8
 
9
- :param p: Parameter. parameter.
9
+ :param p: torch.Tensor. parameter.
10
10
  :param grad: torch.Tensor, gradient.
11
11
  :param agc_eps: float. agc epsilon to clip the norm of parameter.
12
12
  :param agc_clip_val: float. norm clip.
@@ -37,9 +37,9 @@ class Apollo(Optimizer, BaseOptimizer):
37
37
  ):
38
38
  self.validate_learning_rate(lr)
39
39
  self.validate_range(beta, 'beta', 0.0, 1.0, range_type='[]')
40
- self.validate_rebound(rebound)
40
+ self.validate_options(rebound, 'rebound', ['constant', 'belief'])
41
41
  self.validate_non_negative(weight_decay, 'weight_decay')
42
- self.validate_weight_decay_type(weight_decay_type)
42
+ self.validate_options(weight_decay_type, 'weight_decay_type', ['l2', 'decoupled', 'stable'])
43
43
  self.validate_non_negative(eps, 'eps')
44
44
 
45
45
  self.lr = lr
@@ -1,14 +1,12 @@
1
1
  import torch
2
2
 
3
3
 
4
- def centralize_gradient(x: torch.Tensor, gc_conv_only: bool = False) -> torch.Tensor:
4
+ def centralize_gradient(x: torch.Tensor, gc_conv_only: bool = False):
5
5
  r"""Gradient Centralization (GC).
6
6
 
7
7
  :param x: torch.Tensor. gradient.
8
8
  :param gc_conv_only: bool. 'False' for both conv & fc layers.
9
- :return: torch.Tensor. centralized gradient.
10
9
  """
11
10
  size: int = x.dim()
12
11
  if (gc_conv_only and size > 3) or (not gc_conv_only and size > 1):
13
12
  x.add_(-x.mean(dim=tuple(range(1, size)), keepdim=True))
14
- return x
@@ -90,7 +90,7 @@ class Lion(Optimizer, BaseOptimizer):
90
90
  state['exp_grad_norm'] = torch.zeros((1,), dtype=grad.dtype, device=grad.device)
91
91
 
92
92
  if self.use_gc:
93
- grad = centralize_gradient(grad, gc_conv_only=False)
93
+ centralize_gradient(grad, gc_conv_only=False)
94
94
 
95
95
  self.apply_weight_decay(
96
96
  p=p,
@@ -25,7 +25,7 @@ class Lookahead(BaseOptimizer):
25
25
  ):
26
26
  self.validate_positive(k, 'k')
27
27
  self.validate_range(alpha, 'alpha', 0.0, 1.0)
28
- self.validate_pullback_momentum(pullback_momentum)
28
+ self.validate_options(pullback_momentum, 'pullback_momentum', ['none', 'reset', 'pullback'])
29
29
 
30
30
  self.alpha = alpha
31
31
  self.k = k
@@ -18,7 +18,7 @@ class PCGrad(BaseOptimizer):
18
18
  """
19
19
 
20
20
  def __init__(self, optimizer: OPTIMIZER, reduction: str = 'mean'):
21
- self.validate_reduction(reduction)
21
+ self.validate_options(reduction, 'reduction', ['mean', 'sum'])
22
22
 
23
23
  self.optimizer = optimizer
24
24
  self.reduction = reduction
@@ -140,7 +140,7 @@ class Ranger(Optimizer, BaseOptimizer):
140
140
  state['exp_grad_norm'] = torch.zeros((1,), dtype=grad.dtype, device=grad.device)
141
141
 
142
142
  if self.use_gc and grad.dim() > self.gc_gradient_threshold:
143
- grad = centralize_gradient(grad, gc_conv_only=False)
143
+ centralize_gradient(grad, gc_conv_only=False)
144
144
 
145
145
  self.apply_weight_decay(
146
146
  p=p,
@@ -96,12 +96,9 @@ class Ranger21(Optimizer, BaseOptimizer):
96
96
  self.lookahead_blending_alpha = lookahead_blending_alpha
97
97
  self.norm_loss_factor = norm_loss_factor
98
98
 
99
- # lookahead
100
99
  self.lookahead_step: int = 0
101
-
102
- # learning rate
103
- self.starting_lr = lr
104
- self.current_lr = lr
100
+ self.starting_lr: float = lr
101
+ self.current_lr: float = lr
105
102
 
106
103
  defaults: DEFAULTS = {
107
104
  'lr': lr,
@@ -114,7 +111,6 @@ class Ranger21(Optimizer, BaseOptimizer):
114
111
  }
115
112
  super().__init__(params, defaults)
116
113
 
117
- # warmup iterations
118
114
  self.num_warm_up_iterations: int = (
119
115
  self.build_warm_up_iterations(num_iterations, betas[1])
120
116
  if num_warm_up_iterations is None
@@ -140,8 +136,7 @@ class Ranger21(Optimizer, BaseOptimizer):
140
136
 
141
137
  state['grad_ma'] = torch.zeros_like(p)
142
138
  state['variance_ma'] = torch.zeros_like(p)
143
- state['lookahead_params'] = torch.empty_like(p)
144
- state['lookahead_params'].copy_(p)
139
+ state['lookahead_params'] = p.clone()
145
140
  state['neg_grad_ma'] = torch.zeros_like(p)
146
141
  state['max_variance_ma'] = torch.zeros_like(p)
147
142
 
@@ -162,28 +157,21 @@ class Ranger21(Optimizer, BaseOptimizer):
162
157
 
163
158
  warm_up_current_pct: float = min(1.0, (step / self.num_warm_up_iterations))
164
159
 
165
- new_lr: float = lr * warm_up_current_pct
166
- self.current_lr = new_lr
160
+ self.current_lr = lr * warm_up_current_pct
167
161
 
168
- return new_lr
162
+ return self.current_lr
169
163
 
170
164
  def warm_down(self, lr: float, iteration: int) -> float:
171
165
  if iteration < self.start_warm_down:
172
166
  return lr
173
167
 
174
168
  # start iteration from 1, not 0
175
- warm_down_iteration: int = (iteration + 1) - self.start_warm_down
176
- warm_down_iteration = max(warm_down_iteration, 1)
177
-
178
- warm_down_pct: float = warm_down_iteration / (self.num_warm_down_iterations + 1)
179
- warm_down_pct = min(warm_down_pct, 1.0)
180
-
181
- new_lr: float = self.starting_lr - self.warm_down_lr_delta * warm_down_pct
182
- new_lr = max(new_lr, self.min_lr)
169
+ warm_down_iteration: int = max((iteration + 1) - self.start_warm_down, 1)
170
+ warm_down_pct: float = min(warm_down_iteration / (self.num_warm_down_iterations + 1), 1.0)
183
171
 
184
- self.current_lr = new_lr
172
+ self.current_lr = max(self.starting_lr - self.warm_down_lr_delta * warm_down_pct, self.min_lr)
185
173
 
186
- return new_lr
174
+ return self.current_lr
187
175
 
188
176
  @torch.no_grad()
189
177
  def step(self, closure: CLOSURE = None) -> LOSS:
@@ -220,8 +208,7 @@ class Ranger21(Optimizer, BaseOptimizer):
220
208
  if len(state) == 0:
221
209
  state['grad_ma'] = torch.zeros_like(p)
222
210
  state['variance_ma'] = torch.zeros_like(p)
223
- state['lookahead_params'] = torch.empty_like(p)
224
- state['lookahead_params'].copy_(p)
211
+ state['lookahead_params'] = p.clone()
225
212
  state['neg_grad_ma'] = torch.zeros_like(p)
226
213
  state['max_variance_ma'] = torch.zeros_like(p)
227
214
 
@@ -229,8 +216,8 @@ class Ranger21(Optimizer, BaseOptimizer):
229
216
  grad.copy_(agc(p, grad, self.agc_eps, self.agc_clipping_value))
230
217
 
231
218
  # Apply gradient centralization & normalization
232
- grad = centralize_gradient(grad, gc_conv_only=False)
233
- grad = normalize_gradient(grad)
219
+ centralize_gradient(grad, gc_conv_only=False)
220
+ normalize_gradient(grad)
234
221
 
235
222
  # second moment estimation
236
223
  # using positive-negative momentum and bias correction
@@ -245,7 +232,6 @@ class Ranger21(Optimizer, BaseOptimizer):
245
232
 
246
233
  # Phase 2 - Apply weight decay and step
247
234
  for group in self.param_groups:
248
- lr: float = group['lr']
249
235
  beta1, beta2 = group['betas']
250
236
 
251
237
  bias_correction1: float = 1.0 - beta1 ** group['step'] # fmt: skip
@@ -254,7 +240,7 @@ class Ranger21(Optimizer, BaseOptimizer):
254
240
  noise_norm: float = math.sqrt((1.0 + beta2) ** 2 + beta2 ** 2) # fmt: skip
255
241
 
256
242
  # warm up & down
257
- lr = self.warm_up_dampening(lr, group['step'])
243
+ lr: float = self.warm_up_dampening(group['lr'], group['step'])
258
244
  lr = self.warm_down(lr, group['step'])
259
245
 
260
246
  for p in group['params']:
@@ -265,7 +251,7 @@ class Ranger21(Optimizer, BaseOptimizer):
265
251
  self.apply_weight_decay(
266
252
  p=p,
267
253
  grad=None,
268
- lr=group['lr'],
254
+ lr=lr,
269
255
  weight_decay=group['weight_decay'],
270
256
  weight_decouple=group['weight_decouple'],
271
257
  fixed_decay=group['fixed_decay'],
@@ -287,16 +273,16 @@ class Ranger21(Optimizer, BaseOptimizer):
287
273
 
288
274
  de_nom = (variance_ma.sqrt() / bias_correction2_sq).add_(group['eps'])
289
275
 
276
+ if self.use_softplus:
277
+ de_nom = f.softplus(de_nom, beta=self.beta_softplus)
278
+
290
279
  grad = p.grad
291
- grad = centralize_gradient(grad, gc_conv_only=False)
292
- grad = normalize_gradient(grad)
280
+ centralize_gradient(grad, gc_conv_only=False)
281
+ normalize_gradient(grad)
293
282
 
294
283
  grad_ma.mul_(beta1 ** 2).add_(grad, alpha=1.0 - beta1 ** 2) # fmt: skip
295
284
 
296
- step_size: float = lr if group['adam_debias'] else lr / bias_correction1
297
-
298
- if self.use_softplus:
299
- de_nom = f.softplus(de_nom, beta=self.beta_softplus)
285
+ step_size: float = self.apply_adam_debias(group['adam_debias'], lr, bias_correction1)
300
286
 
301
287
  pn_momentum = grad_ma.mul(1.0 + 1.0).add(neg_grad_ma, alpha=-1.0).mul(1.0 / noise_norm)
302
288
  p.addcdiv_(pn_momentum, de_nom, value=-step_size)
@@ -45,7 +45,6 @@ class Shampoo(Optimizer, BaseOptimizer):
45
45
  self.validate_non_negative(matrix_eps, 'matrix_eps')
46
46
 
47
47
  self.preconditioning_compute_steps = preconditioning_compute_steps
48
- self.matrix_eps = matrix_eps
49
48
 
50
49
  defaults: DEFAULTS = {
51
50
  'lr': lr,
@@ -53,6 +52,7 @@ class Shampoo(Optimizer, BaseOptimizer):
53
52
  'weight_decay': weight_decay,
54
53
  'weight_decouple': weight_decouple,
55
54
  'fixed_decay': fixed_decay,
55
+ 'matrix_eps': matrix_eps,
56
56
  }
57
57
  super().__init__(params, defaults)
58
58
 
@@ -93,7 +93,7 @@ class Shampoo(Optimizer, BaseOptimizer):
93
93
  state['momentum_buffer'] = grad.clone()
94
94
 
95
95
  for dim_id, dim in enumerate(grad.size()):
96
- state[f'pre_cond_{dim_id}'] = self.matrix_eps * torch.eye(dim, out=grad.new(dim, dim))
96
+ state[f'pre_cond_{dim_id}'] = group['matrix_eps'] * torch.eye(dim, out=grad.new(dim, dim))
97
97
  state[f'inv_pre_cond_{dim_id}'] = grad.new(dim, dim).zero_()
98
98
 
99
99
  if momentum > 0.0:
@@ -27,13 +27,12 @@ def to_real(x: torch.Tensor) -> torch.Tensor:
27
27
  return x.real if torch.is_complex(x) else x
28
28
 
29
29
 
30
- def normalize_gradient(x: torch.Tensor, use_channels: bool = False, epsilon: float = 1e-8) -> torch.Tensor:
30
+ def normalize_gradient(x: torch.Tensor, use_channels: bool = False, epsilon: float = 1e-8):
31
31
  r"""Normalize gradient with stddev.
32
32
 
33
33
  :param x: torch.Tensor. gradient.
34
34
  :param use_channels: bool. channel-wise normalization.
35
35
  :param epsilon: float. eps.
36
- :return: torch.Tensor. normalized gradient.
37
36
  """
38
37
  size: int = x.dim()
39
38
  if size > 1 and use_channels:
@@ -42,7 +41,6 @@ def normalize_gradient(x: torch.Tensor, use_channels: bool = False, epsilon: flo
42
41
  elif torch.numel(x) > 2:
43
42
  s = x.std().add_(epsilon)
44
43
  x.div_(s)
45
- return x
46
44
 
47
45
 
48
46
  def flatten_grad(grads: List[torch.Tensor]) -> torch.Tensor: