Machine Learning
TensorFlow, Regresión Múltiple por medio del Gradiente Descendente Estocastico
Intro
Seguimos con TensorFlow, pero nos vamos a alejar del propósito de los ejemplos que nos proponen en su pagina web centrándonos en la resolución de regresiones múltiples por medio de GradientDescent.
Este tutorial no tiene como objetivo describir el algoritmo del gradiente descendente, ni optimizaciones sino conocer como aplicarlo para dar soluciones a regresiones múltiples por medio de Tensor Flow.
Eso si, como introducción al siguiente post sobre como optimizar el algoritmo de GradientDescent, veremos como en vez de dar todo el lote de datos al algoritmo en cada iteración, lo alimentamos con pequeños lotes (mini batches) mejoraremos el tiempo de ejecución de forma significativa. A esta pequeña modificación tiene un nombre: Gradiente Descendente Estocástico.
Realmente, Gradiente Descendente Estocastico (SGD, Online Gradient Descent) es cuando el mini-batch tiene un solo ejemplo y no cuando separamos todo el lote en n muestras. Para este post, lo llamaremos SGD independientemente del numero de muestras del mini-batch
Ventajas Mini-Batch/SGD
El rendimiento del algoritmo del gradiente descendente para grandes cantidades de datos (big data) se ve mermado a medida que aumentamos el numero de datos ademas de tener el inconveniente de tener en memoria todos los datos a procesar. Otra alternativa sería plantearnos si realmente hace falta procesar todos los datos o con una pequeña muestra del conjunto de datos sería suficiente.
Estos inconvenientes se solucionan ejecutando el gradiente descendente por medio de mini lotes:
- Disminuir la muestra de entrenamiento: Con el entrenamiento por medio de mini-batch, desde la primera iteración se está tendiendo al mínimo local y así sucesivamente, pudiéndose dar el caso que solamente hemos tenido que utilizar un pequeño porcentaje de la muestra completa para alcanzar el minimo local.
- Suministro online de los datos: Cargar en memoria grandes cantidades de datos puede ser prohibitivo (EJ: Nuestro ordenador cuenta con 8Gb de ram y los datos son del orden de 10Gb). Con SGD/Mini-Batch podemos suministrar iterativamente pequeñas cantidades de datos, es decir, podemos leer por lotes los datos(se aconseja aleatoriamente): cargarlos en memoria, iterar y liberar recursos y así sucesivamente.
- Mini-Batch frente a SGD: Por medio de Mini-Batch podemos utilizar el procesamiento vectorial del procesador en vez de calcular el gradiente descendente muestra a muestra. Por lo que en muchos casos, el gradiente descendente por medio de pequeños lotes es mas rápido que por medio de SGD.
Definicion del algoritmo
Como dijimos, vamos a calcular los coeficientes para un polinomio de grado n por medio del gradiente descendente. Para ello, primero nos tenemos que definir la matriz de diseño o matriz de coeficientes por medio de la siguiente función.
Calculo matriz de coeficientes
Como se puede observar, ya tiene el termino independiente implícito (la primera columna con todos 1’s) por lo que no tenemos que incluirlo en nuestra función objetivo (es decir nos olvidamos del famoso bias). Nuestro grafo consistirá en la formula definida mas abajo donde X es la matriz de coeficientes e w los pesos a calcular:
Graph Gradient Descent
Las variables de entrada y salida serán definidas según como se defina en la sesión e inicializamos los pesos a 0.
En un post anterior se explica un poco mas sobre parámetros, constantes y variables.
Gradient Descent aplicado a la regresión multiple
Uso directo
Lo «dificil» ya está hecho, ahora solo falta entrenarlo ejecuntado la sesion y alimentar al modelo con el lote completo
Entrenamiento Gradiente Descendente
Uso por medio de mini-batches: Gradiente Descendente Estocastico
Lo único que se modifica, son los parámetros de entrada al grafo. En este caso son mini-batches creados a partir del generador definido como get_minibatches(x_train,y_train,indices)
donde indices
es una matriz que define las muestras de cada mini-batch
Entrenamiento Gradiente Descendente Estocastico
Resultados
En el siguiente Jupyter se muestra la comparativa de los dos algoritmos para calcular los coeficientes de un polinomio de grado 4 con 100000 muestras.
El gradiente descendente a utilizado 826 iteraciones por lo que a utilizado realmente 82600000 muestras para alcanzar el mínimo local.
El algoritmo por mini lotes ha necesitado 553 iteraciones pero en este caso, en cada iteración utiliza 100000/1000=100 muestras, por lo que unicamente a necesitado 55300 muestras para lograr el mínimo local.
Juzgad vosotros mismos.
Resultados
En el apartado de Material está el enlace de las funciones que intervienen
SkFlow
Como es lógico, ya exite una API que nos simplifica la vida cuando queremos trabajar con TensorFlow y no queremos desarrollar nuestro grafo:
Material:
Todo el material se encuentra en mi github