Resumamos cuál ha sido el proceso hasta ahora: hemos alimentado la red neuronal con estructuras Pandas (un DataFrame para las características predictivas y una Serie para los valores objetivo), las hemos transformado en listas (categorizando los valores objetivo), hemos creado una lista formada por tuplas (conteniendo cada una una muestra y su valor objetivo categorízado) y, por último, hemos separado esta lista en "mini-batches" con el objetivo de pasar cada uno de ellos por la red, calcular el error cometido y modificar los parámetros vía descenso de gradiente.
Y en la sección anterior dábamos por supuesta la existencia de un método al que llamamos __update_parameters, que recibía cada uno de estos mini-batches.
Este método deberá extraer cada una de las muestras (y su variable objetivo) del mini-batch y, para cada una de ellas, obtener el gradiente de la función de coste (la derivada parcial con respecto a cada parámetro de la red), sumar todos estos gradientes, multiplicar el resultado por la tasa de aprendizaje y actualizar los pesos y bias de la red. En pseudo-código, este proceso podría describirse de la siguiente manera:
def __update_parameters(self, mini_batch):
Inicializamos a cero el gradiente acumulado
Para cada muestra del mini-batch:
Obtenemos el gradiente de la función de error
Actualizamos el gradiente acumulado
Calculamos el incremento a aplicar a cada parámetro(multiplicando el
gradiente acumulado por la tasa de aprendizaje)
Actualizamos los parámetros sumando el incremento
Para ello vamos a utilizar las siguientes variables:
- total_gradient_weights: gradiente acumulado de la función de error para los pesos
- total_gradient_bias: gradiente acumulado de la función de error para los bias
- delta_gradient_weights: gradiente de la función de error correspondiente a una muestra para los pesos
- delta_gradient_bias: gradiente de la función de error correspondiente a una muestra para los bias