/
akp1n
/
ADVML
Обзор
Документация
Войти
/
akp1n
/
ADVML
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
task2/optimizers.py
160 строк
5 KB
Artemiy
fix
24 фев 2025, 20:45
24 фев 2025, 20:45
57cd6cd
Код
Авторство
О чём код?
import math import torch from torch.optim import Optimizer class MyNesterov(Optimizer): def __init__(self, params, lr=0.01, momentum=0.9, weight_decay=0.0): if lr <= 0.0: raise ValueError(f"Invalid learning rate: {lr}") if momentum < 0.0: raise ValueError(f"Invalid momentum value: {momentum}") defaults = dict(lr=lr, momentum=momentum, weight_decay=weight_decay) super().__init__(params, defaults) def step(self, closure=None): loss = None if closure is not None: loss = closure() for group in self.param_groups: lr = group['lr'] momentum = group['momentum'] weight_decay = group['weight_decay'] for p in group['params']: if p.grad is None: continue grad = p.grad.data if weight_decay != 0: grad = grad.add(p.data, alpha=weight_decay) param_state = self.state[p] if 'momentum_buffer' not in param_state: buf = param_state['momentum_buffer'] = torch.clone(grad).detach() else: buf = param_state['momentum_buffer'] buf.mul_(momentum).add_(grad) nesterov_grad = grad.add(buf, alpha=momentum) p.data.add_(nesterov_grad, alpha=-lr) return loss class MyAdam(Optimizer): def __init__(self, params, lr=1e-3, betas=(0.9, 0.999), eps=1e-8, weight_decay=0.0): if lr <= 0.0: raise ValueError(f"Invalid learning rate: {lr}") if eps <= 0.0: raise ValueError(f"Invalid epsilon value: {eps}") defaults = dict(lr=lr, betas=betas, eps=eps, weight_decay=weight_decay) super().__init__(params, defaults) def step(self, closure=None): loss = None if closure is not None: loss = closure() for group in self.param_groups: lr = group['lr'] beta1, beta2 = group['betas'] eps = group['eps'] weight_decay = group['weight_decay'] for p in group['params']: if p.grad is None: continue grad = p.grad.data # Weight decay if weight_decay != 0: grad = grad.add(p.data, alpha=weight_decay) state = self.state[p] if 'step' not in state: state['step'] = 0 if 'exp_avg' not in state: state['exp_avg'] = torch.zeros_like(p.data) if 'exp_avg_sq' not in state: state['exp_avg_sq'] = torch.zeros_like(p.data) exp_avg, exp_avg_sq = state['exp_avg'], state['exp_avg_sq'] state['step'] += 1 t = state['step'] exp_avg.mul_(beta1).add_(grad, alpha=(1 - beta1)) exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=(1 - beta2)) bias_correction1 = 1 - beta1 ** t bias_correction2 = 1 - beta2 ** t denom = (exp_avg_sq.sqrt() / math.sqrt(bias_correction2)).add_(eps) step_size = lr * math.sqrt(bias_correction2) / bias_correction1 p.data.addcdiv_(exp_avg, denom, value=-step_size) return loss class MyRMSProp(Optimizer): def __init__(self, params, lr=1e-2, alpha=0.99, eps=1e-8, weight_decay=0.0, momentum=0.0): if lr <= 0.0: raise ValueError(f"Invalid learning rate: {lr}") if alpha < 0.0 or alpha >= 1.0: raise ValueError(f"Invalid alpha: {alpha}") defaults = dict(lr=lr, alpha=alpha, eps=eps, weight_decay=weight_decay, momentum=momentum) super().__init__(params, defaults) def step(self, closure=None): loss = None if closure is not None: loss = closure() for group in self.param_groups: lr = group['lr'] alpha = group['alpha'] eps = group['eps'] weight_decay = group['weight_decay'] momentum = group['momentum'] for p in group['params']: if p.grad is None: continue grad = p.grad.data if weight_decay != 0: grad = grad.add(p.data, alpha=weight_decay) state = self.state[p] if 'square_avg' not in state: state['square_avg'] = torch.zeros_like(p.data) if momentum > 0.0 and 'momentum_buffer' not in state: state['momentum_buffer'] = torch.zeros_like(p.data) square_avg = state['square_avg'] square_avg.mul_(alpha).addcmul_(grad, grad, value=1 - alpha) avg = square_avg.sqrt().add_(eps) if momentum > 0.0: buf = state['momentum_buffer'] buf.mul_(momentum).addcdiv_(grad, avg) p.data.add_(buf, alpha=-lr) else: p.data.addcdiv_(grad, avg, value=-lr) return loss