pytorch-optimizer 2.9.1__tar.gz → 2.10.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/PKG-INFO +11 -8
  2. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/README.rst +9 -1
  3. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pyproject.toml +2 -2
  4. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/__init__.py +8 -1
  5. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/base/optimizer.py +69 -1
  6. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/base/types.py +3 -1
  7. pytorch_optimizer-2.10.0/pytorch_optimizer/optimizer/adahessian.py +139 -0
  8. pytorch_optimizer-2.10.0/pytorch_optimizer/optimizer/amos.py +142 -0
  9. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/dadapt.py +1 -1
  10. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/sgd.py +72 -0
  11. pytorch_optimizer-2.10.0/pytorch_optimizer/optimizer/sophia.py +133 -0
  12. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/LICENSE +0 -0
  13. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/base/__init__.py +0 -0
  14. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/base/exception.py +0 -0
  15. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/base/scheduler.py +0 -0
  16. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/lr_scheduler/__init__.py +0 -0
  17. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/lr_scheduler/chebyshev.py +0 -0
  18. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/lr_scheduler/cosine_anealing.py +0 -0
  19. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/lr_scheduler/experimental/__init__.py +0 -0
  20. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/lr_scheduler/experimental/deberta_v3_lr_scheduler.py +0 -0
  21. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/lr_scheduler/linear_warmup.py +0 -0
  22. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/lr_scheduler/proportion.py +0 -0
  23. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/__init__.py +0 -0
  24. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/a2grad.py +0 -0
  25. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adabelief.py +0 -0
  26. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adabound.py +0 -0
  27. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adadelta.py +0 -0
  28. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adafactor.py +0 -0
  29. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adai.py +0 -0
  30. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adamax.py +0 -0
  31. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adamod.py +0 -0
  32. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adamp.py +0 -0
  33. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adams.py +0 -0
  34. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adan.py +0 -0
  35. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adanorm.py +0 -0
  36. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adapnm.py +0 -0
  37. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adashift.py +0 -0
  38. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adasmooth.py +0 -0
  39. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/agc.py +0 -0
  40. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/aggmo.py +0 -0
  41. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/alig.py +0 -0
  42. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/apollo.py +0 -0
  43. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/avagrad.py +0 -0
  44. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/diffgrad.py +0 -0
  45. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/fp16.py +0 -0
  46. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/fromage.py +0 -0
  47. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/gc.py +0 -0
  48. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/gravity.py +0 -0
  49. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/gsam.py +0 -0
  50. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/lamb.py +0 -0
  51. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/lars.py +0 -0
  52. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/lion.py +0 -0
  53. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/lookahead.py +0 -0
  54. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/madgrad.py +0 -0
  55. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/msvag.py +0 -0
  56. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/nero.py +0 -0
  57. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/novograd.py +0 -0
  58. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/pcgrad.py +0 -0
  59. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/pid.py +0 -0
  60. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/pnm.py +0 -0
  61. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/qhadam.py +0 -0
  62. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/qhm.py +0 -0
  63. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/radam.py +0 -0
  64. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/ranger.py +0 -0
  65. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/ranger21.py +0 -0
  66. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/rotograd.py +0 -0
  67. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/sam.py +0 -0
  68. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/sgdp.py +0 -0
  69. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/shampoo.py +0 -0
  70. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/shampoo_utils.py +0 -0
  71. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/sm3.py +0 -0
  72. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/srmm.py +0 -0
  73. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/swats.py +0 -0
  74. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/utils.py +0 -0
  75. {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/yogi.py +0 -0
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pytorch-optimizer
3
- Version: 2.9.1
3
+ Version: 2.10.0
4
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
- 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
7
+ Keywords: pytorch,deep-learning,optimizer,lr scheduler,A2Grad,ASGD,AccSGD,AdaBelief,AdaBound,AdaDelta,AdaFactor,AdaMax,AdaMod,AdaNorm,AdaPNM,AdaSmooth,AdaHessian,Adai,AdamP,AdamS,Adan,AggMo,AliG,Amos,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,SignSGD,SM3,SopihaH,SRMM,SWATS,ScalableShampoo,Shampoo,Yogi,SAM,GSAM,PCGrad,RotoGrad
8
8
  Author: kozistr
9
9
  Author-email: kozistr@gmail.com
10
10
  Maintainer: kozistr
@@ -21,13 +21,8 @@ Classifier: Programming Language :: Python :: 3.8
21
21
  Classifier: Programming Language :: Python :: 3.9
22
22
  Classifier: Programming Language :: Python :: 3.10
23
23
  Classifier: Programming Language :: Python :: 3.11
24
- Classifier: Programming Language :: Python :: 3
25
- Classifier: Programming Language :: Python :: 3.10
26
- Classifier: Programming Language :: Python :: 3.11
27
24
  Classifier: Programming Language :: Python :: 3.6
28
25
  Classifier: Programming Language :: Python :: 3.7
29
- Classifier: Programming Language :: Python :: 3.8
30
- Classifier: Programming Language :: Python :: 3.9
31
26
  Classifier: Topic :: Scientific/Engineering
32
27
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
33
28
  Classifier: Topic :: Software Development
@@ -59,7 +54,7 @@ pytorch-optimizer
59
54
 
60
55
  | **pytorch-optimizer** is optimizer & lr scheduler collections in PyTorch.
61
56
  | I just re-implemented (speed & memory tweaks, plug-ins) the algorithm while based on the original paper. Also, It includes useful and practical optimization ideas.
62
- | Currently, 50 optimizers, 6 lr schedulers are supported!
57
+ | Currently, 54 optimizers, 6 lr schedulers are supported!
63
58
  |
64
59
  | Highly inspired by `pytorch-optimizer <https://github.com/jettify/pytorch-optimizer>`__.
65
60
 
@@ -256,6 +251,14 @@ You can check the supported optimizers & lr schedulers.
256
251
  +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
257
252
  | AdaDelta | *An Adaptive Learning Rate Method* | | `https://arxiv.org/abs/1212.5701v1 <https://arxiv.org/abs/1212.5701v1>`__ | `cite <https://ui.adsabs.harvard.edu/abs/2012arXiv1212.5701Z/exportcitation>`__ |
258
253
  +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
254
+ | Amos | *An Adam-style Optimizer with Adaptive Weight Decay towards Model-Oriented Scale* | `github <https://github.com/google-research/jestimator>`__ | `https://arxiv.org/abs/2210.11693 <https://arxiv.org/abs/2210.11693>`__ | `cite <https://ui.adsabs.harvard.edu/abs/2022arXiv221011693T/exportcitation>`__ |
255
+ +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
256
+ | SignSGD | *Compressed Optimisation for Non-Convex Problems* | `github <https://github.com/jxbz/signSGD>`__ | `https://arxiv.org/abs/1802.04434 <https://arxiv.org/abs/1802.04434>`__ | `cite <https://ui.adsabs.harvard.edu/abs/2018arXiv180204434B/exportcitation>`__ |
257
+ +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
258
+ | AdaHessian | *An Adaptive Second Order Optimizer for Machine Learning* | `github <https://github.com/amirgholami/adahessian>`__ | `https://arxiv.org/abs/2006.00719 <https://arxiv.org/abs/2006.00719>`__ | `cite <https://github.com/amirgholami/adahessian#citation>`__ |
259
+ +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
260
+ | Sophia | *A Scalable Stochastic Second-order Optimizer for Language Model Pre-training* | `github <https://github.com/Liuhong99/Sophia>`__ | `https://arxiv.org/abs/2305.14342 <https://arxiv.org/abs/2305.14342>`__ | `cite <https://github.com/Liuhong99/Sophia>`__ |
261
+ +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
259
262
 
260
263
  Useful Resources
261
264
  ----------------
@@ -16,7 +16,7 @@ pytorch-optimizer
16
16
 
17
17
  | **pytorch-optimizer** is optimizer & lr scheduler collections in PyTorch.
18
18
  | I just re-implemented (speed & memory tweaks, plug-ins) the algorithm while based on the original paper. Also, It includes useful and practical optimization ideas.
19
- | Currently, 50 optimizers, 6 lr schedulers are supported!
19
+ | Currently, 54 optimizers, 6 lr schedulers are supported!
20
20
  |
21
21
  | Highly inspired by `pytorch-optimizer <https://github.com/jettify/pytorch-optimizer>`__.
22
22
 
@@ -213,6 +213,14 @@ You can check the supported optimizers & lr schedulers.
213
213
  +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
214
214
  | AdaDelta | *An Adaptive Learning Rate Method* | | `https://arxiv.org/abs/1212.5701v1 <https://arxiv.org/abs/1212.5701v1>`__ | `cite <https://ui.adsabs.harvard.edu/abs/2012arXiv1212.5701Z/exportcitation>`__ |
215
215
  +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
216
+ | Amos | *An Adam-style Optimizer with Adaptive Weight Decay towards Model-Oriented Scale* | `github <https://github.com/google-research/jestimator>`__ | `https://arxiv.org/abs/2210.11693 <https://arxiv.org/abs/2210.11693>`__ | `cite <https://ui.adsabs.harvard.edu/abs/2022arXiv221011693T/exportcitation>`__ |
217
+ +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
218
+ | SignSGD | *Compressed Optimisation for Non-Convex Problems* | `github <https://github.com/jxbz/signSGD>`__ | `https://arxiv.org/abs/1802.04434 <https://arxiv.org/abs/1802.04434>`__ | `cite <https://ui.adsabs.harvard.edu/abs/2018arXiv180204434B/exportcitation>`__ |
219
+ +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
220
+ | AdaHessian | *An Adaptive Second Order Optimizer for Machine Learning* | `github <https://github.com/amirgholami/adahessian>`__ | `https://arxiv.org/abs/2006.00719 <https://arxiv.org/abs/2006.00719>`__ | `cite <https://github.com/amirgholami/adahessian#citation>`__ |
221
+ +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
222
+ | Sophia | *A Scalable Stochastic Second-order Optimizer for Language Model Pre-training* | `github <https://github.com/Liuhong99/Sophia>`__ | `https://arxiv.org/abs/2305.14342 <https://arxiv.org/abs/2305.14342>`__ | `cite <https://github.com/Liuhong99/Sophia>`__ |
223
+ +--------------+---------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------+
216
224
 
217
225
  Useful Resources
218
226
  ----------------
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "pytorch_optimizer"
3
- version = "2.9.1"
3
+ version = "2.10.0"
4
4
  description = "optimizer & lr scheduler collections in PyTorch"
5
5
  license = "Apache-2.0"
6
6
  authors = ["kozistr <kozistr@gmail.com>"]
@@ -9,7 +9,7 @@ readme = "README.rst"
9
9
  homepage = "https://github.com/kozistr/pytorch_optimizer"
10
10
  repository = "https://github.com/kozistr/pytorch_optimizer"
11
11
  documentation = "https://pytorch-optimizers.readthedocs.io/en/latest"
12
- 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"]
12
+ keywords = ["pytorch", "deep-learning", "optimizer", "lr scheduler", "A2Grad", "ASGD", "AccSGD", "AdaBelief", "AdaBound", "AdaDelta", "AdaFactor", "AdaMax", "AdaMod", "AdaNorm", "AdaPNM", "AdaSmooth", "AdaHessian", "Adai", "AdamP", "AdamS", "Adan", "AggMo", "AliG", "Amos", "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", "SignSGD", "SM3", "SopihaH", "SRMM", "SWATS", "ScalableShampoo", "Shampoo", "Yogi", "SAM", "GSAM", "PCGrad", "RotoGrad"]
13
13
  classifiers = [
14
14
  "License :: OSI Approved :: Apache Software License",
15
15
  "Development Status :: 5 - Production/Stable",
@@ -21,6 +21,7 @@ from pytorch_optimizer.optimizer.adabelief import AdaBelief
21
21
  from pytorch_optimizer.optimizer.adabound import AdaBound
22
22
  from pytorch_optimizer.optimizer.adadelta import AdaDelta
23
23
  from pytorch_optimizer.optimizer.adafactor import AdaFactor
24
+ from pytorch_optimizer.optimizer.adahessian import AdaHessian
24
25
  from pytorch_optimizer.optimizer.adai import Adai
25
26
  from pytorch_optimizer.optimizer.adamax import AdaMax
26
27
  from pytorch_optimizer.optimizer.adamod import AdaMod
@@ -34,6 +35,7 @@ from pytorch_optimizer.optimizer.adasmooth import AdaSmooth
34
35
  from pytorch_optimizer.optimizer.agc import agc
35
36
  from pytorch_optimizer.optimizer.aggmo import AggMo
36
37
  from pytorch_optimizer.optimizer.alig import AliG
38
+ from pytorch_optimizer.optimizer.amos import Amos
37
39
  from pytorch_optimizer.optimizer.apollo import Apollo
38
40
  from pytorch_optimizer.optimizer.avagrad import AvaGrad
39
41
  from pytorch_optimizer.optimizer.dadapt import DAdaptAdaGrad, DAdaptAdam, DAdaptAdan, DAdaptSGD
@@ -61,7 +63,7 @@ from pytorch_optimizer.optimizer.ranger import Ranger
61
63
  from pytorch_optimizer.optimizer.ranger21 import Ranger21
62
64
  from pytorch_optimizer.optimizer.rotograd import RotoGrad
63
65
  from pytorch_optimizer.optimizer.sam import SAM
64
- from pytorch_optimizer.optimizer.sgd import ASGD, SGDW, AccSGD
66
+ from pytorch_optimizer.optimizer.sgd import ASGD, SGDW, AccSGD, SignSGD
65
67
  from pytorch_optimizer.optimizer.sgdp import SGDP
66
68
  from pytorch_optimizer.optimizer.shampoo import ScalableShampoo, Shampoo
67
69
  from pytorch_optimizer.optimizer.shampoo_utils import (
@@ -80,6 +82,7 @@ from pytorch_optimizer.optimizer.shampoo_utils import (
80
82
  power_iteration,
81
83
  )
82
84
  from pytorch_optimizer.optimizer.sm3 import SM3
85
+ from pytorch_optimizer.optimizer.sophia import SophiaH
83
86
  from pytorch_optimizer.optimizer.srmm import SRMM
84
87
  from pytorch_optimizer.optimizer.swats import SWATS
85
88
  from pytorch_optimizer.optimizer.utils import (
@@ -145,6 +148,10 @@ OPTIMIZER_LIST: List[OPTIMIZER] = [
145
148
  AvaGrad,
146
149
  AdaShift,
147
150
  AdaDelta,
151
+ Amos,
152
+ AdaHessian,
153
+ SophiaH,
154
+ SignSGD,
148
155
  ]
149
156
  OPTIMIZERS: Dict[str, OPTIMIZER] = {str(optimizer.__name__).lower(): optimizer for optimizer in OPTIMIZER_LIST}
150
157
 
@@ -5,12 +5,80 @@ from typing import List, Optional, Tuple, Union
5
5
  import torch
6
6
 
7
7
  from pytorch_optimizer.base.exception import NegativeLRError, NegativeStepError
8
- from pytorch_optimizer.base.types import BETAS
8
+ from pytorch_optimizer.base.types import BETAS, HUTCHINSON_G, PARAMETERS, STATE
9
9
 
10
10
 
11
11
  class BaseOptimizer(ABC):
12
12
  r"""Base optimizer class."""
13
13
 
14
+ @staticmethod
15
+ @torch.no_grad()
16
+ def set_hessian(param_groups: PARAMETERS, state: STATE, hessian: List[torch.Tensor]):
17
+ r"""Set hessian to state from external source. Generally useful when using functorch as a base.
18
+
19
+ Example usage:
20
+ ```
21
+ # Hutchinsons Estimator using HVP
22
+ noise = tree_map(lambda v: torch.randn_like(v), params)
23
+ loss_, hvp_est = jvp(grad(run_model_fn), (params,), (noise,))
24
+ hessian_diag_est = tree_map(lambda a, b: a * b, hvp_est, noise)
25
+
26
+ optimizer.set_hessian(hessian_diag_est)
27
+ # OR
28
+ optimizer.step(hessian=hessian_diag_est)
29
+ ````
30
+ """
31
+ i: int = 0
32
+ for group in param_groups:
33
+ for p in group['params']:
34
+ if p.size() != hessian[i].size():
35
+ raise ValueError(
36
+ f'[-] the shape of parameter and hessian does not match. {p.size()} vs {hessian[i].size()}'
37
+ )
38
+
39
+ state[p]['hessian'] = hessian[i]
40
+ i += 1
41
+
42
+ @staticmethod
43
+ @torch.no_grad()
44
+ def compute_hutchinson_hessian(
45
+ param_groups: PARAMETERS,
46
+ state: STATE,
47
+ num_samples: int = 1,
48
+ pre_zero: bool = True,
49
+ alpha: float = 1.0,
50
+ distribution: HUTCHINSON_G = 'gaussian',
51
+ ):
52
+ r"""Hutchinson's approximate hessian, added to the state under key `hessian`."""
53
+ if distribution not in ('gaussian', 'rademacher'):
54
+ raise NotImplementedError(f'[-] Hessian with distribution {distribution} is not implemented.')
55
+
56
+ params = []
57
+ for group in param_groups:
58
+ for p in group['params']:
59
+ if p.requires_grad and p.grad is not None and not p.grad.is_sparse:
60
+ if 'hessian' not in state[p]:
61
+ state[p]['hessian'] = torch.zeros_like(p)
62
+ elif pre_zero:
63
+ state[p]['hessian'].zero_()
64
+
65
+ params.append(p)
66
+
67
+ if len(params) == 0:
68
+ return
69
+
70
+ grads = [p.grad for p in params]
71
+
72
+ for i in range(num_samples):
73
+ if distribution == 'rademacher':
74
+ zs = [torch.randint_like(p, 0, 1) * 2.0 - 1.0 for p in params]
75
+ else:
76
+ zs = [torch.randn_like(p) for p in params]
77
+
78
+ h_zs = torch.autograd.grad(grads, params, grad_outputs=zs, retain_graph=i < num_samples - 1)
79
+ for h_z, z, p in zip(h_zs, zs, params):
80
+ state[p]['hessian'].add_(h_z * z, alpha=(1 / num_samples) * alpha)
81
+
14
82
  @staticmethod
15
83
  def apply_weight_decay(
16
84
  p: torch.Tensor,
@@ -1,4 +1,4 @@
1
- from typing import Any, Callable, Dict, Iterable, Optional, Tuple, Type, Union
1
+ from typing import Any, Callable, Dict, Iterable, Literal, Optional, Tuple, Type, Union
2
2
 
3
3
  import torch
4
4
  from torch.optim import Optimizer
@@ -12,3 +12,5 @@ PARAMETERS = Optional[Union[Iterable[Dict[str, Any]], Iterable[torch.Tensor]]]
12
12
  STATE = Dict[str, Any]
13
13
  OPTIMIZER = Type[Optimizer]
14
14
  SCHEDULER = Type[_LRScheduler]
15
+
16
+ HUTCHINSON_G = Literal['gaussian', 'rademacher']
@@ -0,0 +1,139 @@
1
+ from typing import List, Optional
2
+
3
+ import torch
4
+ from torch.optim.optimizer import Optimizer
5
+
6
+ from pytorch_optimizer.base.exception import NoSparseGradientError
7
+ from pytorch_optimizer.base.optimizer import BaseOptimizer
8
+ from pytorch_optimizer.base.types import BETAS, CLOSURE, DEFAULTS, HUTCHINSON_G, LOSS, PARAMETERS
9
+
10
+
11
+ class AdaHessian(Optimizer, BaseOptimizer):
12
+ r"""An Adaptive Second Order Optimizer for Machine Learning.
13
+
14
+ Requires `loss.backward(create_graph=True)` in order to calculate hessians.
15
+
16
+ :param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
17
+ :param lr: float. learning rate.
18
+ :param betas: BETAS. coefficients used for computing running averages of gradient and the squared hessian trace.
19
+ :param weight_decay: float. weight decay (L2 penalty).
20
+ :param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
21
+ :param fixed_decay: bool. fix weight decay.
22
+ :param hessian_power: float. exponent of the hessian trace.
23
+ :param update_period: int. number of steps after which to apply hessian approximation.
24
+ :param num_samples: int. times to sample `z` for the approximation of the hessian trace.
25
+ :param hessian_distribution: HUTCHINSON_G. type of distribution to initialize hessian.
26
+ :param adam_debias: bool. Only correct the denominator to avoid inflating step sizes early in training.
27
+ :param eps: float. term added to the denominator to improve numerical stability.
28
+ """
29
+
30
+ def __init__(
31
+ self,
32
+ params: PARAMETERS,
33
+ lr: float = 1e-1,
34
+ betas: BETAS = (0.9, 0.999),
35
+ weight_decay: float = 0.0,
36
+ weight_decouple: bool = True,
37
+ fixed_decay: bool = False,
38
+ hessian_power: float = 1.0,
39
+ update_period: int = 1,
40
+ num_samples: int = 1,
41
+ hessian_distribution: HUTCHINSON_G = 'rademacher',
42
+ adam_debias: bool = False,
43
+ eps: float = 1e-16,
44
+ ):
45
+ self.validate_learning_rate(lr)
46
+ self.validate_betas(betas)
47
+ self.validate_non_negative(weight_decay, 'weight_decay')
48
+ self.validate_non_negative(eps, 'eps')
49
+ self.validate_range(hessian_power, 'Hessian Power', 0, 1, range_type='(]')
50
+
51
+ self.update_period = update_period
52
+ self.num_samples = num_samples
53
+ self.distribution = hessian_distribution
54
+
55
+ defaults: DEFAULTS = {
56
+ 'lr': lr,
57
+ 'betas': betas,
58
+ 'weight_decay': weight_decay,
59
+ 'weight_decouple': weight_decouple,
60
+ 'fixed_decay': fixed_decay,
61
+ 'hessian_power': hessian_power,
62
+ 'adam_debias': adam_debias,
63
+ 'eps': eps,
64
+ }
65
+ super().__init__(params, defaults)
66
+
67
+ def __str__(self) -> str:
68
+ return 'AdaHessian'
69
+
70
+ @torch.no_grad()
71
+ def reset(self):
72
+ for group in self.param_groups:
73
+ group['step'] = 0
74
+ for p in group['params']:
75
+ state = self.state[p]
76
+ state['exp_avg'] = torch.zeros_like(p)
77
+ state['exp_hessian_diag_sq'] = torch.zeros_like(p)
78
+
79
+ @torch.no_grad()
80
+ def step(self, closure: CLOSURE = None, hessian: Optional[List[torch.Tensor]] = None) -> LOSS:
81
+ loss: LOSS = None
82
+ if closure is not None:
83
+ with torch.enable_grad():
84
+ loss = closure()
85
+
86
+ step: int = self.param_groups[0].get('step', 1)
87
+
88
+ if hessian is not None:
89
+ self.set_hessian(self.param_groups, self.state, hessian)
90
+ elif step % self.update_period == 0:
91
+ self.compute_hutchinson_hessian(
92
+ self.param_groups, self.state, self.num_samples, distribution=self.distribution
93
+ )
94
+
95
+ for group in self.param_groups:
96
+ if 'step' in group:
97
+ group['step'] += 1
98
+ else:
99
+ group['step'] = 1
100
+
101
+ beta1, beta2 = group['betas']
102
+
103
+ bias_correction1: float = 1.0 - beta1 ** group['step']
104
+ bias_correction2: float = 1.0 - beta2 ** group['step']
105
+
106
+ for p in group['params']:
107
+ if p.grad is None:
108
+ continue
109
+
110
+ grad = p.grad
111
+ if grad.is_sparse:
112
+ raise NoSparseGradientError(str(self))
113
+
114
+ state = self.state[p]
115
+ if 'exp_avg' not in state:
116
+ state['exp_avg'] = torch.zeros_like(p)
117
+ state['exp_hessian_diag_sq'] = torch.zeros_like(p)
118
+
119
+ self.apply_weight_decay(
120
+ p=p,
121
+ grad=grad,
122
+ lr=group['lr'],
123
+ weight_decay=group['weight_decay'],
124
+ weight_decouple=group['weight_decouple'],
125
+ fixed_decay=group['fixed_decay'],
126
+ )
127
+
128
+ exp_avg, exp_hessian_diag_sq = state['exp_avg'], state['exp_hessian_diag_sq']
129
+ exp_avg.mul_(beta1).add_(grad, alpha=1.0 - beta1)
130
+
131
+ if 'hessian' in state and (group['step'] % self.update_period == 0 or hessian is not None):
132
+ exp_hessian_diag_sq.mul_(beta2).addcmul_(state['hessian'], state['hessian'], value=1.0 - beta2)
133
+
134
+ de_nom = (exp_hessian_diag_sq / bias_correction2).pow_(group['hessian_power'] / 2).add_(group['eps'])
135
+
136
+ step_size: float = self.apply_adam_debias(group['adam_debias'], group['lr'], bias_correction1)
137
+ p.addcdiv_(exp_avg, de_nom, value=-step_size)
138
+
139
+ return loss
@@ -0,0 +1,142 @@
1
+ import math
2
+
3
+ import torch
4
+ from torch.optim.optimizer import Optimizer
5
+
6
+ from pytorch_optimizer.base.exception import NoSparseGradientError
7
+ from pytorch_optimizer.base.optimizer import BaseOptimizer
8
+ from pytorch_optimizer.base.types import CLOSURE, DEFAULTS, LOSS, PARAMETERS
9
+
10
+
11
+ class Amos(Optimizer, BaseOptimizer):
12
+ r"""An Adam-style Optimizer with Adaptive Weight Decay towards Model-Oriented Scale.
13
+
14
+ :param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
15
+ :param lr: float. learning rate.
16
+ :param beta: float. A float slightly < 1. We recommend setting `1 - beta` to the same order of magnitude
17
+ as the learning rate. similarity with beta2 in Adam.
18
+ :param momentum: float. Exponential decay rate for optional moving average of updates.
19
+ :param extra_l2: float. Additional L2 regularization.
20
+ :param c_coef: float. Coefficient for decay_factor_c.
21
+ :param d_coef: float. Coefficient for decay_factor_d.
22
+ :param eps: float. term added to the denominator to improve numerical stability.
23
+ """
24
+
25
+ def __init__(
26
+ self,
27
+ params: PARAMETERS,
28
+ lr: float = 1e-3,
29
+ beta: float = 0.999,
30
+ momentum: float = 0.0,
31
+ extra_l2: float = 0.0,
32
+ c_coef: float = 0.25,
33
+ d_coef: float = 0.25,
34
+ eps: float = 1e-18,
35
+ ):
36
+ self.validate_learning_rate(lr)
37
+ self.validate_range(momentum, 'momentum', 0.0, 1.0, range_type='[)')
38
+ self.validate_range(beta, 'beta', 0.0, 1.0, range_type='[)')
39
+ self.validate_non_negative(extra_l2, 'extra_l2')
40
+ self.validate_non_negative(eps, 'eps')
41
+
42
+ self.c_coef = c_coef
43
+ self.d_coef = d_coef
44
+
45
+ defaults: DEFAULTS = {
46
+ 'lr': lr,
47
+ 'beta': beta,
48
+ 'momentum': momentum,
49
+ 'extra_l2': extra_l2,
50
+ 'eps': eps,
51
+ }
52
+
53
+ super().__init__(params, defaults)
54
+
55
+ def __str__(self) -> str:
56
+ return 'Amos'
57
+
58
+ @torch.no_grad()
59
+ def reset(self):
60
+ for group in self.param_groups:
61
+ group['step'] = 0
62
+ for p in group['params']:
63
+ state = self.state[p]
64
+
65
+ state['exp_avg_sq'] = torch.zeros((1,), dtype=p.dtype, device=p.device)
66
+ state['decay'] = torch.zeros((1,), dtype=p.dtype, device=p.device)
67
+ if group['momentum'] > 0.0:
68
+ state['exp_avg'] = torch.zeros_like(p)
69
+
70
+ @staticmethod
71
+ def get_scale(p: torch.Tensor) -> float:
72
+ r"""Get expected scale for model weights."""
73
+ if len(p.shape) == 1: # expected 'bias'
74
+ return 0.5
75
+ if len(p.shape) == 2: # expected Embedding, Linear, ...
76
+ return math.sqrt(2 / p.size(1))
77
+ return math.sqrt(1 / p.size(1))
78
+
79
+ @torch.no_grad()
80
+ def step(self, closure: CLOSURE = None) -> LOSS:
81
+ loss: LOSS = None
82
+ if closure is not None:
83
+ with torch.enable_grad():
84
+ loss = closure()
85
+
86
+ for group in self.param_groups:
87
+ if 'step' in group:
88
+ group['step'] += 1
89
+ else:
90
+ group['step'] = 1
91
+
92
+ momentum, beta = group['momentum'], group['beta']
93
+
94
+ lr_sq: float = math.sqrt(group['lr'])
95
+ bias_correction: float = 1.0 - beta ** group['step']
96
+
97
+ for p in group['params']:
98
+ if p.grad is None:
99
+ continue
100
+
101
+ grad = p.grad
102
+ if grad.is_sparse:
103
+ raise NoSparseGradientError(str(self))
104
+
105
+ state = self.state[p]
106
+
107
+ if len(state) == 0:
108
+ state['exp_avg_sq'] = torch.zeros((1,), dtype=p.dtype, device=p.device)
109
+ state['decay'] = torch.zeros((1,), dtype=p.dtype, device=p.device)
110
+ if group['momentum'] > 0.0:
111
+ state['exp_avg'] = torch.zeros_like(p)
112
+
113
+ g2 = grad.pow(2).mean()
114
+ init_lr: float = group['lr'] * self.get_scale(p)
115
+
116
+ exp_avg_sq = state['exp_avg_sq']
117
+ exp_avg_sq.mul_(beta).add_(g2, alpha=1.0 - beta)
118
+
119
+ r_v_hat = bias_correction / (exp_avg_sq + group['eps'])
120
+
121
+ b = state['decay']
122
+ decay_factor_c = torch.rsqrt(1.0 + self.c_coef * lr_sq * b)
123
+ decay_factor_d = torch.reciprocal(1.0 + self.d_coef * math.sqrt(init_lr) * b)
124
+
125
+ gamma = decay_factor_c * (group['lr'] ** 2) * r_v_hat * g2
126
+
127
+ update = p.clone()
128
+ update.mul_((gamma - group['extra_l2']) / 2.0)
129
+ update.add_(r_v_hat.sqrt() * grad, alpha=init_lr)
130
+ update.mul_(decay_factor_d)
131
+
132
+ b.mul_(1.0 + gamma).add_(gamma)
133
+
134
+ if momentum > 0.0:
135
+ exp_avg = state['exp_avg']
136
+ exp_avg.mul_(momentum).add_(update, alpha=1.0 - momentum)
137
+
138
+ update.copy_(exp_avg)
139
+
140
+ p.add_(-update)
141
+
142
+ return loss
@@ -266,7 +266,7 @@ class DAdaptAdam(Optimizer, BaseOptimizer):
266
266
  weight_decouple: bool = False,
267
267
  fixed_decay: bool = False,
268
268
  bias_correction: bool = False,
269
- eps: float = 0.0,
269
+ eps: float = 1e-8,
270
270
  ):
271
271
  self.validate_learning_rate(lr)
272
272
  self.validate_betas(betas)
@@ -311,3 +311,75 @@ class ASGD(Optimizer, BaseOptimizer):
311
311
  p.add_(grad, alpha=-new_lr)
312
312
 
313
313
  return loss
314
+
315
+
316
+ class SignSGD(Optimizer, BaseOptimizer):
317
+ r"""Compressed Optimisation for Non-Convex Problems.
318
+
319
+ :param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
320
+ :param lr: float. learning rate.
321
+ :param momentum: float. momentum factor (0.0 = SignSGD, >0 = Signum).
322
+ :param weight_decay: float. weight decay (L2 penalty).
323
+ :param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
324
+ """
325
+
326
+ def __init__(
327
+ self,
328
+ params: PARAMETERS,
329
+ lr: float = 1e-3,
330
+ momentum: float = 0.9,
331
+ weight_decay: float = 0.0,
332
+ weight_decouple: bool = True,
333
+ ):
334
+ self.validate_learning_rate(lr)
335
+ self.validate_range(momentum, 'beta', 0.0, 1.0)
336
+ self.validate_non_negative(weight_decay, 'weight_decay')
337
+
338
+ defaults: DEFAULTS = {
339
+ 'lr': lr,
340
+ 'momentum': momentum,
341
+ 'weight_decay': weight_decay,
342
+ 'weight_decouple': weight_decouple,
343
+ }
344
+ super().__init__(params, defaults)
345
+
346
+ @torch.no_grad()
347
+ def reset(self):
348
+ for group in self.param_groups:
349
+ group['step'] = 0
350
+ for p in group['params']:
351
+ state = self.state[p]
352
+
353
+ if group['momentum'] > 0.0:
354
+ state['momentum_buffer'] = torch.zeros_like(p)
355
+
356
+ @torch.no_grad()
357
+ def step(self, closure: CLOSURE = None) -> LOSS:
358
+ loss: LOSS = None
359
+ if closure is not None:
360
+ with torch.enable_grad():
361
+ loss = closure()
362
+
363
+ for group in self.param_groups:
364
+ momentum = group['momentum']
365
+ for p in group['params']:
366
+ if p.grad is None:
367
+ continue
368
+
369
+ grad = p.grad
370
+ if grad.is_sparse:
371
+ raise NoSparseGradientError(str(self))
372
+
373
+ state = self.state[p]
374
+ if momentum > 0.0:
375
+ if len(state) == 0:
376
+ state['momentum_buffer'] = torch.zeros_like(p)
377
+
378
+ buf = state['momentum_buffer']
379
+ buf.mul_(momentum).add_(grad, alpha=1.0 - momentum)
380
+ else:
381
+ buf = grad
382
+
383
+ p.add_(torch.sign(buf), alpha=-group['lr'])
384
+
385
+ return loss
@@ -0,0 +1,133 @@
1
+ from typing import List, Optional
2
+
3
+ import torch
4
+ from torch.optim.optimizer import Optimizer
5
+
6
+ from pytorch_optimizer.base.exception import NoSparseGradientError
7
+ from pytorch_optimizer.base.optimizer import BaseOptimizer
8
+ from pytorch_optimizer.base.types import BETAS, CLOSURE, DEFAULTS, HUTCHINSON_G, LOSS, PARAMETERS
9
+
10
+
11
+ class SophiaH(Optimizer, BaseOptimizer):
12
+ r"""Second-order Clipped Stochastic Optimization.
13
+
14
+ Requires `loss.backward(create_graph=True)` in order to calculate hessians.
15
+
16
+ :param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
17
+ :param lr: float. learning rate.
18
+ :param betas: BETAS. coefficients used for computing running averages of gradient and the squared hessian trace.
19
+ :param weight_decay: float. weight decay (L2 penalty).
20
+ :param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
21
+ :param fixed_decay: bool. fix weight decay.
22
+ :param p: float. clip effective (applied) gradient (p).
23
+ :param update_period: int. number of steps after which to apply hessian approximation.
24
+ :param num_samples: int. times to sample `z` for the approximation of the hessian trace.
25
+ :param hessian_distribution: HUTCHINSON_G. type of distribution to initialize hessian.
26
+ :param eps: float. term added to the denominator to improve numerical stability.
27
+ """
28
+
29
+ def __init__(
30
+ self,
31
+ params: PARAMETERS,
32
+ lr: float = 6e-2,
33
+ betas: BETAS = (0.96, 0.99),
34
+ weight_decay: float = 0.0,
35
+ weight_decouple: bool = True,
36
+ fixed_decay: bool = False,
37
+ p: float = 1e-2,
38
+ update_period: int = 10,
39
+ num_samples: int = 1,
40
+ hessian_distribution: HUTCHINSON_G = 'gaussian',
41
+ eps: float = 1e-12,
42
+ ):
43
+ self.validate_learning_rate(lr)
44
+ self.validate_betas(betas)
45
+ self.validate_non_negative(weight_decay, 'weight_decay')
46
+ self.validate_non_negative(p, 'p (gradient clip)')
47
+ self.validate_step(update_period, 'update_period')
48
+ self.validate_positive(num_samples, 'num_samples')
49
+ self.validate_options(hessian_distribution, 'hessian_distribution', ['gaussian', 'rademacher'])
50
+ self.validate_non_negative(eps, 'eps')
51
+
52
+ self.update_period = update_period
53
+ self.num_samples = num_samples
54
+ self.distribution = hessian_distribution
55
+
56
+ defaults: DEFAULTS = {
57
+ 'lr': lr,
58
+ 'betas': betas,
59
+ 'weight_decay': weight_decay,
60
+ 'weight_decouple': weight_decouple,
61
+ 'fixed_decay': fixed_decay,
62
+ 'p': p,
63
+ 'eps': eps,
64
+ }
65
+ super().__init__(params, defaults)
66
+
67
+ def __str__(self) -> str:
68
+ return 'SophiaH'
69
+
70
+ @torch.no_grad()
71
+ def reset(self):
72
+ for group in self.param_groups:
73
+ group['step'] = 0
74
+ for p in group['params']:
75
+ state = self.state[p]
76
+ state['momentum'] = torch.zeros_like(p)
77
+ state['hessian_moment'] = torch.zeros_like(p)
78
+
79
+ @torch.no_grad()
80
+ def step(self, closure: CLOSURE = None, hessian: Optional[List[torch.Tensor]] = None) -> LOSS:
81
+ loss: LOSS = None
82
+ if closure is not None:
83
+ with torch.enable_grad():
84
+ loss = closure()
85
+
86
+ step: int = self.param_groups[0].get('step', 1)
87
+
88
+ if hessian is not None:
89
+ self.set_hessian(self.param_groups, self.state, hessian)
90
+ elif step % self.update_period == 0:
91
+ self.compute_hutchinson_hessian(
92
+ self.param_groups, self.state, self.num_samples, distribution=self.distribution
93
+ )
94
+
95
+ for group in self.param_groups:
96
+ if 'step' in group:
97
+ group['step'] += 1
98
+ else:
99
+ group['step'] = 1
100
+
101
+ beta1, beta2 = group['betas']
102
+ for p in group['params']:
103
+ if p.grad is None:
104
+ continue
105
+
106
+ grad = p.grad
107
+ if grad.is_sparse:
108
+ raise NoSparseGradientError(str(self))
109
+
110
+ state = self.state[p]
111
+ if len(state) == 0:
112
+ state['momentum'] = torch.zeros_like(p)
113
+ state['hessian_moment'] = torch.zeros_like(p)
114
+
115
+ self.apply_weight_decay(
116
+ p=p,
117
+ grad=grad,
118
+ lr=group['lr'],
119
+ weight_decay=group['weight_decay'],
120
+ weight_decouple=group['weight_decouple'],
121
+ fixed_decay=group['fixed_decay'],
122
+ )
123
+
124
+ momentum, hessian_moment = state['momentum'], state['hessian_moment']
125
+ momentum.mul_(beta1).add_(grad, alpha=1.0 - beta1)
126
+
127
+ if 'hessian' in state and (group['step'] % self.update_period == 0 or hessian is not None):
128
+ hessian_moment.mul_(beta2).add_(state['hessian'], alpha=1.0 - beta2)
129
+
130
+ update = (momentum / torch.clip(hessian_moment, min=group['eps'])).clamp_(-group['p'], group['p'])
131
+ p.add_(update, alpha=-group['lr'])
132
+
133
+ return loss