El cuadernillo

TensorFlow, Regresión Múltiple por medio del Gradiente Descendente Estocastico

Introduction

Pedro Valiente Verde

Pedro Valiente Verde


LATEST POSTS

Programando ESP8266 (NodeMcu) como si fuera Arduino en Eclipse con Platformio 12th February, 2018

Herencia virtual en c++, consideraciones sobre los constructores de las clases bases virtuales 04th June, 2017

Machine Learning

TensorFlow, Regresión Múltiple por medio del Gradiente Descendente Estocastico

Posted on .

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:

[latex]{\large \min_{w} f_{objetivo} = \sum_{i=1}^{n}\frac{(Y-X*\boldsymbol{w})^2}{n}}[/latex]

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.

¿Por qué optimizamos ECM y no otros como RSS? Aparte de otros motivos, para no tener en cuenta el numero de elementos en nuestra muestra. ECM es la media del sumatorio de errores cuadráticos mientras que RSS únicamente la suma de errores cuadráticos, dicho de otro modo, el numero de elementos influye en el valor de RSS, y por ende, en la actualización de los pesos en cada iteración

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

Normalizacion de datos. Gradient Descent tiene un gran inconveniente: es muy sensible al escalado de cada variable. Para normalizar hay varias alternativas, una de las conocidas es StandardScaler de SkLearn. En este post no ha sido necesario puesto que la muestra ha sido preparada para prescindir de la estandarización de los datos y centrarnos en el objetivo del post. 

  

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

Este este post, los datos son optimos para utilizarlo por SGD puesto que los datos están correlacionados y no hay datos repetidos que haga sobreestimar pesos y quitando importancia al resto. De hecho, La eliminación de datos duplicados será un prepoceso importante a medida que el hiperparametro del numero de muestras de cada mini-batch tienda a 1

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:

  • SkFlow Simplifica la interfaza de TensorFlow, la API es muy parecida a SkLearn

Material:

Todo el material se encuentra en mi github

Pedro Valiente Verde

Pedro Valiente Verde

http://p.valienteverde.com

Navigation