Implementation of a custom optimizer with momentum and adaptive learning rates:
- Base optimizer class
- Momentum implementation
- Adaptive methods
import torch
import torch.nn as nn
class CustomOptimizer:
def __init__(self, params, lr=0.001, momentum=0.9, adaptive=True):
self.params = list(params)
self.lr = lr
self.momentum = momentum
self.adaptive = adaptive
self.state = {
'momentum_buffer': [torch.zeros_like(p) for p in self.params],
'square_avg': [torch.zeros_like(p) for p in self.params] if adaptive else None
}
def step(self):
for i, param in enumerate(self.params):
if param.grad is None:
continue
grad = param.grad
momentum_buffer = self.state['momentum_buffer'][i]
# Momentum update
momentum_buffer.mul_(self.momentum).add_(grad)
if self.adaptive:
# Adaptive learning rates (similar to RMSprop)
square_avg = self.state['square_avg'][i]
square_avg.mul_(0.99).addcmul_(grad, grad, value=0.01)
param.data.addcdiv_(momentum_buffer, square_avg.sqrt() + 1e-8, value=-self.lr)
else:
# Standard momentum update
param.data.add_(momentum_buffer, alpha=-self.lr)