Como actualizar de forma automática los pesos de la red neuronal

El framework hasta el momento ya es capaz de realizar la retropropagacion automáticamente, pero todavía no actualiza todos los pesos de forma automática, para definiremos la clase SGD que realiza Stochastic Gradient Descent o Descenso de gradiente Estocastico

import os
import sys
module_path = os.path.abspath(os.path.join('..'))
if module_path not in sys.path:
    sys.path.append(module_path)
class SGD(object):

    def __init__(self, parameters, alpha=0.1):
        self.parameters = parameters
        self.alpha = alpha

    def zero(self):
        for p in self.parameters:
            p.grad.data *= 0

    def step(self, zero=True):
        for p in self.parameters:
            p.data = p.data - (self.alpha * p.grad.data)

            if(zero):
                p.grad.data *= 0

La misma red neuronal del notebook anterior, utilizando stochastic gradient descent para optimizarla

from lightdlf_old.cpu.core import Tensor
import numpy as np
np.random.seed(0)

data = Tensor(np.array([[0,0],[0,1],[1,0],[1,1]]), autograd=True)   # (4,2)
target = Tensor(np.array([[0],[1],[0],[1]]), autograd=True)         # (4,1)

w = list()
w.append(Tensor(np.random.rand(2,3), autograd=True))                # (2,3)
w.append(Tensor(np.random.rand(3,1), autograd=True))                # (3,1)
optim = SGD(w, alpha=0.1)

for i in range(10):
    pred = data.mm(w[0]).mm(w[1])
    
    loss = ((pred - target) * (pred - target)).sum(0)
    
    loss.backward(Tensor(np.ones_like(loss.data)))
    optim.step()
    
    print(loss)
[0.58128304]
[0.48988149]
[0.41375111]
[0.34489412]
[0.28210124]
[0.2254484]
[0.17538853]
[0.1324231]
[0.09682769]
[0.06849361]