pytorch-optimizer 3.0.0__tar.gz → 3.0.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 (96) hide show
  1. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/PKG-INFO +6 -4
  2. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/README.md +4 -2
  3. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pyproject.toml +7 -7
  4. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/__init__.py +4 -0
  5. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/base/optimizer.py +12 -10
  6. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/base/types.py +1 -1
  7. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adafactor.py +21 -8
  8. pytorch_optimizer-3.0.1/pytorch_optimizer/optimizer/fadam.py +124 -0
  9. pytorch_optimizer-3.0.1/pytorch_optimizer/optimizer/grokfast.py +232 -0
  10. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/lookahead.py +4 -1
  11. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/utils.py +1 -1
  12. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/LICENSE +0 -0
  13. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/base/__init__.py +0 -0
  14. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/base/exception.py +0 -0
  15. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/base/scheduler.py +0 -0
  16. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/loss/__init__.py +0 -0
  17. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/loss/bi_tempered.py +0 -0
  18. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/loss/cross_entropy.py +0 -0
  19. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/loss/dice.py +0 -0
  20. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/loss/f1.py +0 -0
  21. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/loss/focal.py +0 -0
  22. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/loss/jaccard.py +0 -0
  23. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/loss/ldam.py +0 -0
  24. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/loss/lovasz.py +0 -0
  25. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/loss/tversky.py +0 -0
  26. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/lr_scheduler/__init__.py +0 -0
  27. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/lr_scheduler/chebyshev.py +0 -0
  28. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/lr_scheduler/cosine_anealing.py +0 -0
  29. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/lr_scheduler/experimental/__init__.py +0 -0
  30. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/lr_scheduler/experimental/deberta_v3_lr_scheduler.py +0 -0
  31. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/lr_scheduler/linear_warmup.py +0 -0
  32. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/lr_scheduler/proportion.py +0 -0
  33. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/lr_scheduler/rex.py +0 -0
  34. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/__init__.py +0 -0
  35. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/a2grad.py +0 -0
  36. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adabelief.py +0 -0
  37. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adabound.py +0 -0
  38. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adadelta.py +0 -0
  39. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adahessian.py +0 -0
  40. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adai.py +0 -0
  41. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adalite.py +0 -0
  42. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adamax.py +0 -0
  43. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adamod.py +0 -0
  44. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adamp.py +0 -0
  45. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adams.py +0 -0
  46. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adan.py +0 -0
  47. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adanorm.py +0 -0
  48. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adapnm.py +0 -0
  49. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adashift.py +0 -0
  50. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/adasmooth.py +0 -0
  51. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/agc.py +0 -0
  52. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/aggmo.py +0 -0
  53. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/aida.py +0 -0
  54. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/alig.py +0 -0
  55. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/amos.py +0 -0
  56. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/apollo.py +0 -0
  57. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/avagrad.py +0 -0
  58. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/came.py +0 -0
  59. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/dadapt.py +0 -0
  60. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/diffgrad.py +0 -0
  61. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/fp16.py +0 -0
  62. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/fromage.py +0 -0
  63. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/galore.py +0 -0
  64. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/gc.py +0 -0
  65. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/gravity.py +0 -0
  66. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/lamb.py +0 -0
  67. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/lars.py +0 -0
  68. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/lion.py +0 -0
  69. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/lomo.py +0 -0
  70. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/madgrad.py +0 -0
  71. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/msvag.py +0 -0
  72. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/nero.py +0 -0
  73. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/novograd.py +0 -0
  74. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/padam.py +0 -0
  75. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/pcgrad.py +0 -0
  76. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/pid.py +0 -0
  77. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/pnm.py +0 -0
  78. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/prodigy.py +0 -0
  79. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/qhadam.py +0 -0
  80. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/qhm.py +0 -0
  81. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/radam.py +0 -0
  82. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/ranger.py +0 -0
  83. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/ranger21.py +0 -0
  84. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/rotograd.py +0 -0
  85. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/sam.py +0 -0
  86. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/schedulefree.py +0 -0
  87. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/sgd.py +0 -0
  88. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/sgdp.py +0 -0
  89. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/shampoo.py +0 -0
  90. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/shampoo_utils.py +0 -0
  91. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/sm3.py +0 -0
  92. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/sophia.py +0 -0
  93. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/srmm.py +0 -0
  94. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/swats.py +0 -0
  95. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/tiger.py +0 -0
  96. {pytorch_optimizer-3.0.0 → pytorch_optimizer-3.0.1}/pytorch_optimizer/optimizer/yogi.py +0 -0
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pytorch_optimizer
3
- Version: 3.0.0
3
+ Version: 3.0.1
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
7
- Keywords: pytorch,deep-learning,optimizer,lr scheduler,A2Grad,ASGD,AccSGD,AdaBelief,AdaBound,AdaDelta,AdaFactor,AdaMax,AdaMod,AdaNorm,AdaPNM,AdaSmooth,AdaHessian,Adai,Adalite,AdamP,AdamS,Adan,AggMo,Aida,AliG,Amos,Apollo,AvaGrad,bSAM,CAME,DAdaptAdaGrad,DAdaptAdam,DAdaptAdan,DAdaptSGD,DAdaptLion,DiffGrad,Fromage,GaLore,Gravity,GSAM,LARS,Lamb,Lion,LOMO,Lookahead,MADGRAD,MSVAG,Nero,NovoGrad,PAdam,PCGrad,PID,PNM,Prodigy,QHAdam,QHM,RAdam,Ranger,Ranger21,RotoGrad,SAM,ScheduleFreeSGD,ScheduleFreeAdamW,SGDP,Shampoo,ScalableShampoo,SGDW,SignSGD,SM3,SopihaH,SRMM,SWATS,Tiger,WSAM,Yogi,BCE,BCEFocal,Focal,FocalCosine,SoftF1,Dice,LDAM,Jaccard,Bi-Tempered,Tversky,FocalTversky,LovaszHinge,bitsandbytes
7
+ Keywords: pytorch,deep-learning,optimizer,lr scheduler,A2Grad,ASGD,AccSGD,AdaBelief,AdaBound,AdaDelta,AdaFactor,AdaMax,AdaMod,AdaNorm,AdaPNM,AdaSmooth,AdaHessian,Adai,Adalite,AdamP,AdamS,Adan,AggMo,Aida,AliG,Amos,Apollo,AvaGrad,bSAM,CAME,DAdaptAdaGrad,DAdaptAdam,DAdaptAdan,DAdaptSGD,DAdaptLion,DiffGrad,FAdam,Fromage,GaLore,Gravity,GrokFast,GSAM,LARS,Lamb,Lion,LOMO,Lookahead,MADGRAD,MSVAG,Nero,NovoGrad,PAdam,PCGrad,PID,PNM,Prodigy,QHAdam,QHM,RAdam,Ranger,Ranger21,RotoGrad,SAM,ScheduleFreeSGD,ScheduleFreeAdamW,SGDP,Shampoo,ScalableShampoo,SGDW,SignSGD,SM3,SopihaH,SRMM,SWATS,Tiger,WSAM,Yogi,BCE,BCEFocal,Focal,FocalCosine,SoftF1,Dice,LDAM,Jaccard,Bi-Tempered,Tversky,FocalTversky,LovaszHinge,bitsandbytes
8
8
  Author: kozistr
9
9
  Author-email: kozistr@gmail.com
10
10
  Maintainer: kozistr
@@ -49,7 +49,7 @@ Description-Content-Type: text/markdown
49
49
 
50
50
  **pytorch-optimizer** is optimizer & lr scheduler collections in PyTorch.
51
51
  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.
52
- Currently, **67 optimizers (+ `bitsandbytes`)**, **11 lr schedulers**, and **13 loss functions** are supported!
52
+ Currently, **69 optimizers (+ `bitsandbytes`)**, **11 lr schedulers**, and **13 loss functions** are supported!
53
53
 
54
54
  Highly inspired by [pytorch-optimizer](https://github.com/jettify/pytorch-optimizer).
55
55
 
@@ -203,6 +203,8 @@ supported_optimizers = get_supported_optimizers()
203
203
  | Adalite | *Adalite optimizer* | [github](https://github.com/VatsaDev/adalite) | <https://github.com/VatsaDev/adalite> | [cite](https://github.com/VatsaDev/adalite) |
204
204
  | bSAM | *SAM as an Optimal Relaxation of Bayes* | [github](https://github.com/team-approx-bayes/bayesian-sam) | <https://arxiv.org/abs/2210.01620> | [cite](https://ui.adsabs.harvard.edu/abs/2022arXiv221001620M/exportcitation) |
205
205
  | Schedule-Free | *Schedule-Free Optimizers* | [github](https://github.com/facebookresearch/schedule_free) | <https://github.com/facebookresearch/schedule_free> | [cite](https://github.com/facebookresearch/schedule_free) |
206
+ | FAdam | *Adam is a natural gradient optimizer using diagonal empirical Fisher information* | [github](https://github.com/lessw2020/fadam_pytorch) | <https://arxiv.org/abs/2405.12807> | [cite](https://ui.adsabs.harvard.edu/abs/2024arXiv240512807H/exportcitation) |
207
+ | Grokfast | *Accelerated Grokking by Amplifying Slow Gradients* | [github](https://github.com/ironjr/grokfast) | <https://arxiv.org/abs/2405.20233> | [cite](https://github.com/ironjr/grokfast?tab=readme-ov-file#citation) |
206
208
 
207
209
  ## Supported LR Scheduler
208
210
 
@@ -363,7 +365,7 @@ If you use this software, please cite it below. Or you can get it from "cite thi
363
365
  month = jan,
364
366
  title = {{pytorch_optimizer: optimizer & lr scheduler & loss function collections in PyTorch}},
365
367
  url = {https://github.com/kozistr/pytorch_optimizer},
366
- version = {2.12.0},
368
+ version = {3.0.1},
367
369
  year = {2021}
368
370
  }
369
371
 
@@ -10,7 +10,7 @@
10
10
 
11
11
  **pytorch-optimizer** is optimizer & lr scheduler collections in PyTorch.
12
12
  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.
13
- Currently, **67 optimizers (+ `bitsandbytes`)**, **11 lr schedulers**, and **13 loss functions** are supported!
13
+ Currently, **69 optimizers (+ `bitsandbytes`)**, **11 lr schedulers**, and **13 loss functions** are supported!
14
14
 
15
15
  Highly inspired by [pytorch-optimizer](https://github.com/jettify/pytorch-optimizer).
16
16
 
@@ -164,6 +164,8 @@ supported_optimizers = get_supported_optimizers()
164
164
  | Adalite | *Adalite optimizer* | [github](https://github.com/VatsaDev/adalite) | <https://github.com/VatsaDev/adalite> | [cite](https://github.com/VatsaDev/adalite) |
165
165
  | bSAM | *SAM as an Optimal Relaxation of Bayes* | [github](https://github.com/team-approx-bayes/bayesian-sam) | <https://arxiv.org/abs/2210.01620> | [cite](https://ui.adsabs.harvard.edu/abs/2022arXiv221001620M/exportcitation) |
166
166
  | Schedule-Free | *Schedule-Free Optimizers* | [github](https://github.com/facebookresearch/schedule_free) | <https://github.com/facebookresearch/schedule_free> | [cite](https://github.com/facebookresearch/schedule_free) |
167
+ | FAdam | *Adam is a natural gradient optimizer using diagonal empirical Fisher information* | [github](https://github.com/lessw2020/fadam_pytorch) | <https://arxiv.org/abs/2405.12807> | [cite](https://ui.adsabs.harvard.edu/abs/2024arXiv240512807H/exportcitation) |
168
+ | Grokfast | *Accelerated Grokking by Amplifying Slow Gradients* | [github](https://github.com/ironjr/grokfast) | <https://arxiv.org/abs/2405.20233> | [cite](https://github.com/ironjr/grokfast?tab=readme-ov-file#citation) |
167
169
 
168
170
  ## Supported LR Scheduler
169
171
 
@@ -324,7 +326,7 @@ If you use this software, please cite it below. Or you can get it from "cite thi
324
326
  month = jan,
325
327
  title = {{pytorch_optimizer: optimizer & lr scheduler & loss function collections in PyTorch}},
326
328
  url = {https://github.com/kozistr/pytorch_optimizer},
327
- version = {2.12.0},
329
+ version = {3.0.1},
328
330
  year = {2021}
329
331
  }
330
332
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "pytorch_optimizer"
3
- version = "3.0.0"
3
+ version = "3.0.1"
4
4
  description = "optimizer & lr scheduler & objective function collections in PyTorch"
5
5
  license = "Apache-2.0"
6
6
  authors = ["kozistr <kozistr@gmail.com>"]
@@ -13,12 +13,12 @@ keywords = [
13
13
  "pytorch", "deep-learning", "optimizer", "lr scheduler", "A2Grad", "ASGD", "AccSGD", "AdaBelief", "AdaBound",
14
14
  "AdaDelta", "AdaFactor", "AdaMax", "AdaMod", "AdaNorm", "AdaPNM", "AdaSmooth", "AdaHessian", "Adai", "Adalite",
15
15
  "AdamP", "AdamS", "Adan", "AggMo", "Aida", "AliG", "Amos", "Apollo", "AvaGrad", "bSAM", "CAME", "DAdaptAdaGrad",
16
- "DAdaptAdam", "DAdaptAdan", "DAdaptSGD", "DAdaptLion", "DiffGrad", "Fromage", "GaLore", "Gravity", "GSAM", "LARS",
17
- "Lamb", "Lion", "LOMO", "Lookahead", "MADGRAD", "MSVAG", "Nero", "NovoGrad", "PAdam", "PCGrad", "PID", "PNM",
18
- "Prodigy", "QHAdam", "QHM", "RAdam", "Ranger", "Ranger21", "RotoGrad", "SAM", "ScheduleFreeSGD",
19
- "ScheduleFreeAdamW", "SGDP", "Shampoo", "ScalableShampoo", "SGDW", "SignSGD", "SM3", "SopihaH", "SRMM", "SWATS",
20
- "Tiger", "WSAM", "Yogi", "BCE", "BCEFocal", "Focal", "FocalCosine", "SoftF1", "Dice", "LDAM", "Jaccard",
21
- "Bi-Tempered", "Tversky", "FocalTversky", "LovaszHinge", "bitsandbytes",
16
+ "DAdaptAdam", "DAdaptAdan", "DAdaptSGD", "DAdaptLion", "DiffGrad", "FAdam", "Fromage", "GaLore", "Gravity",
17
+ "GrokFast", "GSAM", "LARS", "Lamb", "Lion", "LOMO", "Lookahead", "MADGRAD", "MSVAG", "Nero", "NovoGrad", "PAdam",
18
+ "PCGrad", "PID", "PNM", "Prodigy", "QHAdam", "QHM", "RAdam", "Ranger", "Ranger21", "RotoGrad", "SAM",
19
+ "ScheduleFreeSGD", "ScheduleFreeAdamW", "SGDP", "Shampoo", "ScalableShampoo", "SGDW", "SignSGD", "SM3", "SopihaH",
20
+ "SRMM", "SWATS", "Tiger", "WSAM", "Yogi", "BCE", "BCEFocal", "Focal", "FocalCosine", "SoftF1", "Dice", "LDAM",
21
+ "Jaccard", "Bi-Tempered", "Tversky", "FocalTversky", "LovaszHinge", "bitsandbytes",
22
22
  ]
23
23
  classifiers = [
24
24
  "License :: OSI Approved :: Apache Software License",
@@ -54,11 +54,13 @@ from pytorch_optimizer.optimizer.avagrad import AvaGrad
54
54
  from pytorch_optimizer.optimizer.came import CAME
55
55
  from pytorch_optimizer.optimizer.dadapt import DAdaptAdaGrad, DAdaptAdam, DAdaptAdan, DAdaptLion, DAdaptSGD
56
56
  from pytorch_optimizer.optimizer.diffgrad import DiffGrad
57
+ from pytorch_optimizer.optimizer.fadam import FAdam
57
58
  from pytorch_optimizer.optimizer.fp16 import DynamicLossScaler, SafeFP16Optimizer
58
59
  from pytorch_optimizer.optimizer.fromage import Fromage
59
60
  from pytorch_optimizer.optimizer.galore import GaLore, GaLoreProjector
60
61
  from pytorch_optimizer.optimizer.gc import centralize_gradient
61
62
  from pytorch_optimizer.optimizer.gravity import Gravity
63
+ from pytorch_optimizer.optimizer.grokfast import GrokFastAdamW, gradfilter_ema, gradfilter_ma
62
64
  from pytorch_optimizer.optimizer.lamb import Lamb
63
65
  from pytorch_optimizer.optimizer.lars import LARS
64
66
  from pytorch_optimizer.optimizer.lion import Lion
@@ -190,6 +192,8 @@ OPTIMIZER_LIST: List[OPTIMIZER] = [
190
192
  BSAM,
191
193
  ScheduleFreeSGD,
192
194
  ScheduleFreeAdamW,
195
+ FAdam,
196
+ GrokFastAdamW,
193
197
  ]
194
198
  OPTIMIZERS: Dict[str, OPTIMIZER] = {str(optimizer.__name__).lower(): optimizer for optimizer in OPTIMIZER_LIST}
195
199
 
@@ -215,7 +215,7 @@ class BaseOptimizer(ABC):
215
215
  return grad * exp_grad_norm / grad_norm if exp_grad_norm > grad_norm else grad
216
216
 
217
217
  @staticmethod
218
- def validate_range(x: float, name: str, low: float, high: float, range_type: str = '[)'):
218
+ def validate_range(x: float, name: str, low: float, high: float, range_type: str = '[)') -> None:
219
219
  if range_type == '[)' and not low <= x < high:
220
220
  raise ValueError(f'[-] {name} must be in the range [{low}, {high})')
221
221
  if range_type == '[]' and not low <= x <= high:
@@ -226,40 +226,42 @@ class BaseOptimizer(ABC):
226
226
  raise ValueError(f'[-] {name} must be in the range ({low}, {high})')
227
227
 
228
228
  @staticmethod
229
- def validate_non_negative(x: Optional[float], name: str):
229
+ def validate_non_negative(x: Optional[float], name: str) -> None:
230
230
  if x is not None and x < 0.0:
231
231
  raise ValueError(f'[-] {name} must be non-negative')
232
232
 
233
233
  @staticmethod
234
- def validate_positive(x: Union[float, int], name: str):
234
+ def validate_positive(x: Union[float, int], name: str) -> None:
235
235
  if x <= 0:
236
236
  raise ValueError(f'[-] {name} must be positive')
237
237
 
238
238
  @staticmethod
239
- def validate_boundary(constant: float, boundary: float, bound_type: str = 'upper'):
239
+ def validate_boundary(constant: float, boundary: float, bound_type: str = 'upper') -> None:
240
240
  if bound_type == 'upper' and constant > boundary:
241
241
  raise ValueError(f'[-] constant {constant} must be in a range of (-inf, {boundary}]')
242
242
  if bound_type == 'lower' and constant < boundary:
243
243
  raise ValueError(f'[-] constant {constant} must be in a range of [{boundary}, inf)')
244
244
 
245
245
  @staticmethod
246
- def validate_step(step: int, step_type: str):
246
+ def validate_step(step: int, step_type: str) -> None:
247
247
  if step < 1:
248
248
  raise NegativeStepError(step, step_type=step_type)
249
249
 
250
250
  @staticmethod
251
- def validate_options(x: str, name: str, options: List[str]):
251
+ def validate_options(x: str, name: str, options: List[str]) -> None:
252
252
  if x not in options:
253
253
  opts: str = ' or '.join([f'\'{option}\'' for option in options]).strip()
254
254
  raise ValueError(f'[-] {name} {x} must be one of ({opts})')
255
255
 
256
256
  @staticmethod
257
- def validate_learning_rate(learning_rate: Optional[float]):
257
+ def validate_learning_rate(learning_rate: Optional[float]) -> None:
258
258
  if learning_rate is not None and learning_rate < 0.0:
259
259
  raise NegativeLRError(learning_rate)
260
260
 
261
- def validate_betas(self, betas: BETAS):
262
- self.validate_range(betas[0], 'beta1', 0.0, 1.0, range_type='[]')
261
+ def validate_betas(self, betas: BETAS) -> None:
262
+ if betas[0] is not None:
263
+ self.validate_range(betas[0], 'beta1', 0.0, 1.0, range_type='[]')
264
+
263
265
  self.validate_range(betas[1], 'beta2', 0.0, 1.0, range_type='[]')
264
266
 
265
267
  if len(betas) < 3:
@@ -268,7 +270,7 @@ class BaseOptimizer(ABC):
268
270
  if betas[2] is not None:
269
271
  self.validate_range(betas[2], 'beta3', 0.0, 1.0, range_type='[]')
270
272
 
271
- def validate_nus(self, nus: Union[float, Tuple[float, float]]):
273
+ def validate_nus(self, nus: Union[float, Tuple[float, float]]) -> None:
272
274
  if isinstance(nus, float):
273
275
  self.validate_range(nus, 'nu', 0.0, 1.0, range_type='[]')
274
276
  else:
@@ -6,7 +6,7 @@ from torch.optim.lr_scheduler import _LRScheduler
6
6
 
7
7
  CLOSURE = Optional[Callable[[], float]]
8
8
  LOSS = Optional[float]
9
- BETAS = Union[Tuple[float, float], Tuple[float, float, float]]
9
+ BETAS = Union[Tuple[float, float], Tuple[float, float, float], Tuple[None, float]]
10
10
  DEFAULTS = Dict
11
11
  PARAMETERS = Optional[Union[Iterable[Dict], Iterable[torch.Tensor]]]
12
12
  STATE = Dict
@@ -10,11 +10,12 @@ from pytorch_optimizer.base.types import BETAS, CLOSURE, DEFAULTS, LOSS, PARAMET
10
10
 
11
11
 
12
12
  class AdaFactor(Optimizer, BaseOptimizer):
13
- r"""Adaptive Learning Rates with Sublinear Memory Cost.
13
+ r"""Adaptive Learning Rates with Sublinear Memory Cost with some tweaks.
14
14
 
15
15
  :param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
16
16
  :param lr: float. learning rate.
17
- :param betas: BETAS. coefficients used for computing running averages of gradient and the squared hessian trace.
17
+ :param betas: BETAS. coefficients used for computing running averages of gradient and the squared
18
+ hessian trace. if beta1 is None, first momentum will be skipped.
18
19
  :param decay_rate: float. coefficient used to compute running averages of square gradient.
19
20
  :param weight_decay: float. weight decay (L2 penalty).
20
21
  :param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
@@ -27,6 +28,9 @@ class AdaFactor(Optimizer, BaseOptimizer):
27
28
  is being used.
28
29
  :param eps1: float. term added to the denominator to improve numerical stability.
29
30
  :param eps2: float. term added to the denominator to improve numerical stability.
31
+ :param momentum_dtype: torch.dtype. type of momentum variable. In VIT paper observed that storing momentum in
32
+ half-precision (bfloat16 type) does not affect training dynamics and has no effect on the outcome while
33
+ reducing optimize overhead from 2-fold to 1.5-fold.
30
34
  """
31
35
 
32
36
  def __init__(
@@ -45,6 +49,7 @@ class AdaFactor(Optimizer, BaseOptimizer):
45
49
  warmup_init: bool = False,
46
50
  eps1: float = 1e-30,
47
51
  eps2: float = 1e-3,
52
+ momentum_dtype: torch.dtype = torch.bfloat16,
48
53
  ):
49
54
  self.validate_learning_rate(lr)
50
55
  self.validate_betas(betas)
@@ -56,6 +61,7 @@ class AdaFactor(Optimizer, BaseOptimizer):
56
61
  self.clip_threshold = clip_threshold
57
62
  self.eps1 = eps1
58
63
  self.eps2 = eps2
64
+ self.momentum_dtype = momentum_dtype
59
65
 
60
66
  defaults: DEFAULTS = {
61
67
  'lr': lr,
@@ -87,7 +93,8 @@ class AdaFactor(Optimizer, BaseOptimizer):
87
93
  grad_shape: Tuple[int, ...] = grad.shape
88
94
  factored: bool = self.get_options(grad_shape)
89
95
 
90
- state['exp_avg'] = torch.zeros_like(p)
96
+ if group['betas'][0] is not None:
97
+ state['exp_avg'] = torch.zeros_like(p, dtype=self.momentum_dtype)
91
98
 
92
99
  if factored:
93
100
  state['exp_avg_sq_row'] = torch.zeros(grad_shape[:-1], dtype=grad.dtype, device=grad.device)
@@ -149,7 +156,7 @@ class AdaFactor(Optimizer, BaseOptimizer):
149
156
  else:
150
157
  group['step'] = 1
151
158
 
152
- beta1, _ = group['betas']
159
+ beta1, beta2 = group['betas']
153
160
 
154
161
  beta2_t: float = 1.0 - math.pow(group['step'], self.decay_rate)
155
162
 
@@ -167,7 +174,8 @@ class AdaFactor(Optimizer, BaseOptimizer):
167
174
  factored: bool = self.get_options(grad_shape)
168
175
 
169
176
  if len(state) == 0:
170
- state['exp_avg'] = torch.zeros_like(p)
177
+ if beta1 is not None:
178
+ state['exp_avg'] = torch.zeros_like(p, dtype=self.momentum_dtype)
171
179
 
172
180
  if factored:
173
181
  state['exp_avg_sq_row'] = torch.zeros(grad_shape[:-1], dtype=grad.dtype, device=grad.device)
@@ -205,6 +213,8 @@ class AdaFactor(Optimizer, BaseOptimizer):
205
213
  else:
206
214
  exp_avg_sq = state['exp_avg_sq']
207
215
  exp_avg_sq.mul_(beta2_t).add_(update, alpha=1.0 - beta2_t)
216
+ exp_avg_sq.clamp_(max=beta2)
217
+
208
218
  torch.rsqrt(exp_avg_sq, out=update)
209
219
 
210
220
  if group['ams_bound']:
@@ -216,8 +226,11 @@ class AdaFactor(Optimizer, BaseOptimizer):
216
226
 
217
227
  update.div_((self.get_rms(update) / self.clip_threshold).clamp_(min=1.0)).mul_(lr)
218
228
 
219
- exp_avg = state['exp_avg']
220
- exp_avg.mul_(beta1).add_(update, alpha=1.0 - beta1)
229
+ if beta1 is not None:
230
+ exp_avg = state['exp_avg']
231
+ exp_avg.mul_(beta1).add_(update, alpha=1.0 - beta1)
232
+
233
+ update = exp_avg
221
234
 
222
235
  self.apply_weight_decay(
223
236
  p=p,
@@ -228,6 +241,6 @@ class AdaFactor(Optimizer, BaseOptimizer):
228
241
  fixed_decay=group['fixed_decay'],
229
242
  )
230
243
 
231
- p.add_(-exp_avg)
244
+ p.add_(-update)
232
245
 
233
246
  return loss
@@ -0,0 +1,124 @@
1
+ import torch
2
+ from torch.optim.optimizer import Optimizer
3
+
4
+ from pytorch_optimizer.base.exception import NoSparseGradientError
5
+ from pytorch_optimizer.base.optimizer import BaseOptimizer
6
+ from pytorch_optimizer.base.types import BETAS, CLOSURE, DEFAULTS, LOSS, PARAMETERS
7
+
8
+
9
+ class FAdam(Optimizer, BaseOptimizer):
10
+ r"""Adam is a natural gradient optimizer using diagonal empirical Fisher information.
11
+
12
+ :param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
13
+ :param lr: float. learning rate.
14
+ :param betas: BETAS. coefficients used for computing running averages of gradient and the squared hessian trace.
15
+ :param weight_decay: float. weight decay (L2 penalty).
16
+ :param clip: float. maximum norm of the gradient.
17
+ :param p: float. momentum factor.
18
+ :param eps: float. term added to the denominator to improve numerical stability.
19
+ :param momentum_dtype: torch.dtype. type of momentum.
20
+ :param fim_dtype: torch.dtype. type of fim.
21
+ """
22
+
23
+ def __init__(
24
+ self,
25
+ params: PARAMETERS,
26
+ lr: float = 1e-3,
27
+ betas: BETAS = (0.9, 0.999),
28
+ weight_decay: float = 0.1,
29
+ clip: float = 1.0,
30
+ p: float = 0.5,
31
+ eps: float = 1e-8,
32
+ momentum_dtype: torch.dtype = torch.float32,
33
+ fim_dtype: torch.dtype = torch.float32,
34
+ ):
35
+ self.validate_learning_rate(lr)
36
+ self.validate_betas(betas)
37
+ self.validate_non_negative(weight_decay, 'weight_decay')
38
+ self.validate_positive(clip, 'clip')
39
+ self.validate_positive(p, 'p')
40
+ self.validate_non_negative(eps, 'eps')
41
+
42
+ self.momentum_dtype = momentum_dtype
43
+ self.fim_dtype = fim_dtype
44
+
45
+ defaults: DEFAULTS = {
46
+ 'lr': lr,
47
+ 'betas': betas,
48
+ 'weight_decay': weight_decay,
49
+ 'clip': clip,
50
+ 'p': p,
51
+ 'eps': eps,
52
+ }
53
+
54
+ super().__init__(params, defaults)
55
+
56
+ def __str__(self) -> str:
57
+ return 'FAdam'
58
+
59
+ @torch.no_grad()
60
+ def reset(self):
61
+ for group in self.param_groups:
62
+ group['step'] = 0
63
+ for p in group['params']:
64
+ state = self.state[p]
65
+
66
+ state['momentum'] = torch.zeros_like(p, dtype=self.momentum_dtype)
67
+ state['fim'] = torch.zeros_like(p, dtype=self.fim_dtype)
68
+
69
+ @torch.no_grad()
70
+ def step(self, closure: CLOSURE = None) -> LOSS:
71
+ loss: LOSS = None
72
+ if closure is not None:
73
+ with torch.enable_grad():
74
+ loss = closure()
75
+
76
+ for group in self.param_groups:
77
+ if 'step' in group:
78
+ group['step'] += 1
79
+ else:
80
+ group['step'] = 1
81
+
82
+ beta1, beta2 = group['betas']
83
+
84
+ curr_beta2: float = beta2 * (1 - beta2 ** (group['step'] - 1)) / (1 - beta2 ** group['step'])
85
+
86
+ for p in group['params']:
87
+ if p.grad is None:
88
+ continue
89
+
90
+ grad = p.grad
91
+ if grad.is_sparse:
92
+ raise NoSparseGradientError(str(self))
93
+
94
+ state = self.state[p]
95
+ if len(state) == 0:
96
+ state['momentum'] = torch.zeros_like(p, dtype=self.momentum_dtype)
97
+ state['fim'] = torch.zeros_like(p, dtype=self.fim_dtype)
98
+
99
+ momentum, fim = state['momentum'], state['fim']
100
+ fim.mul_(curr_beta2).addcmul_(grad, grad, value=1.0 - curr_beta2)
101
+
102
+ rms_grad = grad.pow(2).mean().sqrt_()
103
+ curr_eps = min(rms_grad, 1) * group['eps']
104
+
105
+ fim_base = fim.pow(group['p']).add_(curr_eps)
106
+ grad_nat = grad / fim_base
107
+
108
+ rms = grad_nat.pow(2).mean().sqrt_()
109
+ divisor = max(1, rms) / group['clip']
110
+ grad_nat.div_(divisor)
111
+
112
+ momentum.mul_(beta1).add_(grad_nat, alpha=1.0 - beta1)
113
+
114
+ grad_weights = p / fim_base
115
+
116
+ rms = torch.pow(grad_weights, 2).mean().sqrt_()
117
+ divisor = max(1, rms) / group['clip']
118
+ grad_weights.div_(divisor)
119
+
120
+ grad_weights.mul_(group['weight_decay']).add_(momentum)
121
+
122
+ p.add_(grad_weights, alpha=-group['lr'])
123
+
124
+ return loss
@@ -0,0 +1,232 @@
1
+ import math
2
+ from collections import deque
3
+ from typing import Dict, Literal, Optional
4
+
5
+ import torch
6
+ from torch import nn
7
+ from torch.optim.optimizer import Optimizer
8
+
9
+ from pytorch_optimizer.base.exception import NoSparseGradientError
10
+ from pytorch_optimizer.base.optimizer import BaseOptimizer
11
+ from pytorch_optimizer.base.types import BETAS, CLOSURE, DEFAULTS, LOSS, PARAMETERS
12
+
13
+ FILTER_TYPE = Literal['mean', 'sum']
14
+
15
+
16
+ @torch.no_grad()
17
+ def gradfilter_ma(
18
+ model: nn.Module,
19
+ grads: Optional[Dict[str, deque]] = None,
20
+ window_size: int = 100,
21
+ lamb: float = 5.0,
22
+ filter_type: FILTER_TYPE = 'mean',
23
+ warmup: bool = True,
24
+ ) -> Dict[str, deque]:
25
+ r"""Grokfast-MA.
26
+
27
+ Example:
28
+ -------
29
+ Here's an example::
30
+
31
+ loss.backwards() # Calculate the gradients.
32
+
33
+ grads = gradfilter_ma(model, grads=grads, window_size=window_size, lamb=lamb)
34
+
35
+ optimizer.step() # Call the optimizer.
36
+
37
+ :param model: nn.Module. model that contains every trainable parameters.
38
+ :param grads: Optional[Dict[str, deque]]. running memory (Queue for windowed moving average). initialize by setting
39
+ it to None. feed the output of the method recursively after on.
40
+ :param window_size: int. the width of the filter window. additional memory requirements increases linearly with
41
+ respect to the windows size.
42
+ :param lamb: float. amplifying factor hyperparameter of the filter.
43
+ :param filter_type: FILTER_TYPE. aggregation method for the running queue.
44
+ :param warmup: bool. if true, filter is not applied until the queue is filled.
45
+ """
46
+ if grads is None:
47
+ grads = {n: deque(maxlen=window_size) for n, p in model.named_parameters() if p.requires_grad}
48
+
49
+ for n, p in model.named_parameters():
50
+ if p.requires_grad:
51
+ grads[n].append(p.grad)
52
+
53
+ if not warmup or len(grads[n]) == window_size:
54
+ if filter_type == 'mean':
55
+ avg = sum(grads[n]) / len(grads[n])
56
+ elif filter_type == 'sum':
57
+ avg = sum(grads[n])
58
+ else:
59
+ raise ValueError(f'not supported filter_type {filter_type}')
60
+
61
+ p.grad.add_(avg, alpha=lamb)
62
+
63
+ return grads
64
+
65
+
66
+ @torch.no_grad()
67
+ def gradfilter_ema(
68
+ model: nn.Module,
69
+ grads: Optional[Dict[str, torch.Tensor]] = None,
70
+ alpha: float = 0.98,
71
+ lamb: float = 2.0,
72
+ ) -> Dict[str, torch.Tensor]:
73
+ r"""Grokfast.
74
+
75
+ Example:
76
+ -------
77
+ Here's an example::
78
+
79
+ loss.backwards() # Calculate the gradients.
80
+
81
+ grads = gradfilter_ema(model, grads=grads, alpha=alpha, lamb=lamb)
82
+
83
+ optimizer.step() # Call the optimizer.
84
+
85
+ :param model: nn.Module. model that contains every trainable parameters.
86
+ :param grads: Optional[Dict[str, deque]]. running memory (EMA). Initialize by setting it to None. Feed the output
87
+ of the method recursively after on.
88
+ :param alpha: int. momentum hyperparameter of the EMA.
89
+ :param lamb: float. amplifying factor hyperparameter of the filter.
90
+ """
91
+ if grads is None:
92
+ grads = {n: p.grad for n, p in model.named_parameters() if p.requires_grad}
93
+
94
+ for n, p in model.named_parameters():
95
+ if p.requires_grad:
96
+ grads[n].mul_(alpha).add_(p.grad, alpha=1.0 - alpha)
97
+ p.grad.add_(grads[n], alpha=lamb)
98
+
99
+ return grads
100
+
101
+
102
+ class GrokFastAdamW(Optimizer, BaseOptimizer):
103
+ r"""Accelerated Grokking by Amplifying Slow Gradients with AdamW.
104
+
105
+ :param params: PARAMETERS. iterable of parameters to optimize or dicts defining parameter groups.
106
+ :param lr: float. learning rate.
107
+ :param betas: BETAS. coefficients used for computing running averages of gradient and the squared hessian trace.
108
+ :param grokfast: bool. whether to use grokfast.
109
+ :param grokfast_alpha: float. momentum hyperparameter of the EMA.
110
+ :param grokfast_lamb: float. amplifying factor hyperparameter of the filter..
111
+ :param grokfast_after_step: int. warmup step for grokfast.
112
+ :param weight_decay: float. weight decay (L2 penalty).
113
+ :param weight_decouple: bool. the optimizer uses decoupled weight decay as in AdamW.
114
+ :param fixed_decay: bool. fix weight decay.
115
+ :param eps: float. term added to the denominator to improve numerical stability.
116
+ """
117
+
118
+ def __init__(
119
+ self,
120
+ params: PARAMETERS,
121
+ lr: float = 1e-4,
122
+ betas: BETAS = (0.9, 0.99),
123
+ grokfast: bool = True,
124
+ grokfast_alpha: float = 0.98,
125
+ grokfast_lamb: float = 2.0,
126
+ grokfast_after_step: int = 0,
127
+ weight_decay: float = 0.0,
128
+ weight_decouple: bool = True,
129
+ fixed_decay: bool = False,
130
+ normalize_lr: bool = True,
131
+ eps: float = 1e-8,
132
+ ):
133
+ self.validate_learning_rate(lr)
134
+ self.validate_betas(betas)
135
+ self.validate_non_negative(weight_decay, 'weight_decay')
136
+ self.validate_range(grokfast_alpha, 'grokfast_alpha', 0.0, 1.0)
137
+ self.validate_non_negative(eps, 'eps')
138
+
139
+ if grokfast and normalize_lr:
140
+ lr /= 1.0 + grokfast_lamb
141
+
142
+ defaults: DEFAULTS = {
143
+ 'lr': lr,
144
+ 'betas': betas,
145
+ 'weight_decay': weight_decay,
146
+ 'weight_decouple': weight_decouple,
147
+ 'fixed_decay': fixed_decay,
148
+ 'grokfast': grokfast,
149
+ 'grokfast_alpha': grokfast_alpha,
150
+ 'grokfast_lamb': grokfast_lamb,
151
+ 'grokfast_after_step': grokfast_after_step,
152
+ 'eps': eps,
153
+ }
154
+ super().__init__(params, defaults)
155
+
156
+ def __str__(self) -> str:
157
+ return 'GrokFastAdamW'
158
+
159
+ @torch.no_grad()
160
+ def reset(self):
161
+ for group in self.param_groups:
162
+ group['step'] = 0
163
+ for p in group['params']:
164
+ state = self.state[p]
165
+
166
+ state['exp_avg'] = torch.zeros_like(p)
167
+ state['exp_avg_sq'] = torch.zeros_like(p)
168
+
169
+ @torch.no_grad()
170
+ def step(self, closure: CLOSURE = None) -> LOSS:
171
+ loss: LOSS = None
172
+ if closure is not None:
173
+ with torch.enable_grad():
174
+ loss = closure()
175
+
176
+ for group in self.param_groups:
177
+ if 'step' in group:
178
+ group['step'] += 1
179
+ else:
180
+ group['step'] = 1
181
+
182
+ beta1, beta2 = group['betas']
183
+
184
+ bias_correction1: float = 1.0 - beta1 ** group['step']
185
+ bias_correction2_sq: float = math.sqrt(1.0 - beta2 ** group['step'])
186
+
187
+ should_grokfast: bool = (
188
+ group['grokfast'] and group['step'] > group['grokfast_after_step'] and group['grokfast_lamb'] > 0
189
+ )
190
+
191
+ for p in group['params']:
192
+ if p.grad is None:
193
+ continue
194
+
195
+ grad = p.grad
196
+ if grad.is_sparse:
197
+ raise NoSparseGradientError(str(self))
198
+
199
+ state = self.state[p]
200
+
201
+ if len(state) == 0:
202
+ state['exp_avg'] = torch.zeros_like(p)
203
+ state['exp_avg_sq'] = torch.zeros_like(p)
204
+ if should_grokfast:
205
+ state['grok_exp_avg'] = grad.clone()
206
+
207
+ self.apply_weight_decay(
208
+ p=p,
209
+ grad=grad,
210
+ lr=group['lr'],
211
+ weight_decay=group['weight_decay'],
212
+ weight_decouple=group['weight_decouple'],
213
+ fixed_decay=group['fixed_decay'],
214
+ )
215
+
216
+ if should_grokfast:
217
+ grok_exp_avg = state['grok_exp_avg']
218
+ grok_exp_avg.lerp_(grad, weight=1.0 - group['grokfast_alpha'])
219
+
220
+ grad.add_(grok_exp_avg, alpha=group['grokfast_lamb'])
221
+
222
+ exp_avg, exp_avg_sq = state['exp_avg'], state['exp_avg_sq']
223
+ exp_avg.mul_(beta1).add_(grad, alpha=1.0 - beta1)
224
+ exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1.0 - beta2)
225
+
226
+ de_nom = exp_avg_sq.sqrt().div_(bias_correction2_sq).clamp_(min=group['eps'])
227
+
228
+ update = exp_avg.div(bias_correction1).div_(de_nom)
229
+
230
+ p.add_(update, alpha=-group['lr'])
231
+
232
+ return loss
@@ -36,7 +36,6 @@ class Lookahead(Optimizer, BaseOptimizer):
36
36
  self.pullback_momentum = pullback_momentum
37
37
 
38
38
  self.optimizer = optimizer
39
- self.param_groups = self.optimizer.param_groups
40
39
 
41
40
  self.state: STATE = defaultdict(dict)
42
41
 
@@ -58,6 +57,10 @@ class Lookahead(Optimizer, BaseOptimizer):
58
57
  **optimizer.defaults,
59
58
  }
60
59
 
60
+ @property
61
+ def param_groups(self):
62
+ return self.optimizer.param_groups
63
+
61
64
  def __getstate__(self):
62
65
  return {
63
66
  'state': self.state,
@@ -282,7 +282,7 @@ def reduce_max_except_dim(x: torch.Tensor, dim: int) -> torch.Tensor:
282
282
 
283
283
  def reg_noise(
284
284
  network1: nn.Module, network2: nn.Module, num_data: int, lr: float, eta: float = 8e-3, temperature: float = 1e-4
285
- ) -> torch.Tensor | float:
285
+ ) -> Union[torch.Tensor, float]:
286
286
  r"""Entropy-MCMC: Sampling from flat basins with ease.
287
287
 
288
288
  usage: https://github.com/lblaoke/EMCMC/blob/master/exp/cifar10_emcmc.py