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.
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/PKG-INFO +11 -8
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/README.rst +9 -1
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pyproject.toml +2 -2
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/__init__.py +8 -1
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/base/optimizer.py +69 -1
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/base/types.py +3 -1
- pytorch_optimizer-2.10.0/pytorch_optimizer/optimizer/adahessian.py +139 -0
- pytorch_optimizer-2.10.0/pytorch_optimizer/optimizer/amos.py +142 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/dadapt.py +1 -1
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/sgd.py +72 -0
- pytorch_optimizer-2.10.0/pytorch_optimizer/optimizer/sophia.py +133 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/LICENSE +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/base/__init__.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/base/exception.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/base/scheduler.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/lr_scheduler/__init__.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/lr_scheduler/chebyshev.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/lr_scheduler/cosine_anealing.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/lr_scheduler/experimental/__init__.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/lr_scheduler/experimental/deberta_v3_lr_scheduler.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/lr_scheduler/linear_warmup.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/lr_scheduler/proportion.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/__init__.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/a2grad.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adabelief.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adabound.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adadelta.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adafactor.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adai.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adamax.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adamod.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adamp.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adams.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adan.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adanorm.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adapnm.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adashift.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adasmooth.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/agc.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/aggmo.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/alig.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/apollo.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/avagrad.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/diffgrad.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/fp16.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/fromage.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/gc.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/gravity.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/gsam.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/lamb.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/lars.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/lion.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/lookahead.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/madgrad.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/msvag.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/nero.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/novograd.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/pcgrad.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/pid.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/pnm.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/qhadam.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/qhm.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/radam.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/ranger.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/ranger21.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/rotograd.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/sam.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/sgdp.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/shampoo.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/shampoo_utils.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/sm3.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/srmm.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/swats.py +0 -0
- {pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/utils.py +0 -0
- {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.
|
|
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,
|
|
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,
|
|
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.
|
|
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 =
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/lr_scheduler/__init__.py
RENAMED
|
File without changes
|
{pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/lr_scheduler/chebyshev.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/lr_scheduler/linear_warmup.py
RENAMED
|
File without changes
|
{pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/lr_scheduler/proportion.py
RENAMED
|
File without changes
|
{pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adabelief.py
RENAMED
|
File without changes
|
{pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adabound.py
RENAMED
|
File without changes
|
{pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adadelta.py
RENAMED
|
File without changes
|
{pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adafactor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adashift.py
RENAMED
|
File without changes
|
{pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/adasmooth.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/diffgrad.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/lookahead.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/novograd.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/ranger21.py
RENAMED
|
File without changes
|
{pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/rotograd.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytorch_optimizer-2.9.1 → pytorch_optimizer-2.10.0}/pytorch_optimizer/optimizer/shampoo_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|