Source code for numpynet.optimizers.sgd
import numpy as np
from .base import Optimizer
[docs]
class SGD(Optimizer):
"""
Stochastic Gradient Descent with optional momentum and Nesterov acceleration.
"""
def __init__(self, learning_rate=0.01, momentum=0.0, nesterov=False,
weight_decay=0.0):
super().__init__(learning_rate)
self.momentum = momentum
self.nesterov = nesterov
self.weight_decay = weight_decay
self._velocities = {}
[docs]
def apply_gradients(self, params, grads):
self._iterations += 1
updates = {}
for key, grad in grads.items():
param = params[key]
g = grad + self.weight_decay * param if self.weight_decay else grad
if self.momentum > 0:
v = self._velocities.get(key, np.zeros_like(param))
v_new = self.momentum * v - self.learning_rate * g
self._velocities[key] = v_new
if self.nesterov:
updates[key] = param + self.momentum * v_new - self.learning_rate * g
else:
updates[key] = param + v_new
else:
updates[key] = param - self.learning_rate * g
return updates
[docs]
def get_config(self):
cfg = super().get_config()
cfg.update({
"momentum": self.momentum,
"nesterov": self.nesterov,
"weight_decay": self.weight_decay,
})
return cfg