Primeros experimentos: inversión lineal en TensorFlow

0
389

Os recuerdo que este tutorial forma parte de una colección de apuntes personales que estoy tomando de auto-formación en aprendizaje automático (no es una conclusión sino un camino).

  1. Instalación de TensorFlow y entorno de desarrollo Python en Mac.
  2. Revisión de ejemplos de TensorFlow.
  3. Principios de aprendizaje automático supervisado.
  4. Primeros pasos con Python: los tipos de datos básicos.
  5. Entendiendo un modelo de regresión lineal con TensorBoard.

En el anterior tutorial os presentaba cómo funciona TensorFlow y TensorBoard a través de un ejemplo muy simple de regresión lineal.

Ahora es el momento de empezar a complicar un poquito la cosa y hacer mis propios ejemplos para sacar conclusiones propias (y os quedaré agradecidos por la crítica constructiva).

Os recuerdo que partiremos de este tutorial y que no tenéis que instalar nada para poder utilizar estos ejemplos: Simplemente, ir a Colab y partiendo del ejemplo base, ir cambiando lo que os interese.

Vamos a mostrar poco a poco el código. Lo primero que hacemos es inicializar TensorFlow y TensorBoard. Esto no tiene nada de particular.

Inicializar TensorFlow y TensorBoard

Y ahora vamos a hacer una pequeña variación. En vez de generar datos de una recta vamos a generar dos rectas, con pendientes distintas, y ver cómo se comporta en modelo de entrenamiento, para posteriormente tratar de realizar modificaciones y conseguir que las predicciones cuadren con lo esperado.

Resultados

Y vemos los datos de Test también:

Test

Voy a hacer un pequeño lapsus de teoría aquí.

Os invito a revisar este enlace sobre regresión polinómica en TensorFlow para entender los grados.

Gráficas de funciones polinómicas

 

En el siguiente enlace podéis ver la representación de múltiples ecuaciones (que muchos hemos estudiado pero a ver quién se acuerda).

Gráficas de funciones polinómicas

Y utilizamos el mismo código para hacer el entrenamiento:

Ahora sería buen momento para estudiar cómo construir un modelo secuencial

When to use a sequential model

Podemos visualizar el sumario de la red que tenemos:

sumario de la red

Y también podemos visualizar el modelo gráficamente.

visualización el modelo gráficamente

Ahora compilamos el modelo y lo entrenamos.

Vemos las gráficas sobre cómo funciona la pérdida… que se nos va.

Gráfica Pérdida

Y podemos ver que algo no funciona demasiado bien porque el error tiende a infinito.

Por tanto, los parámetros de configuración que podemos manejar hasta ahora no son satisfactorios.

Gráfica Pérdida

El sistema no es capaz de predecir los resultados.datos predecidos

Podemos actuar por ahora en varios puntos:

  • El coeficiente de aprendizaje.
  • Las capas de la red.
  • La ecuación de activación.

Vamos a empezar a actuar en el coeficiente de aprendizaje que nos hace sospechar que es muy grande y lo podemos intentar bajar.

Se pueden hacer varias pruebas: bajándolo una dimensión y luego ir incrementándolo contrastando resultados de pérdida.

Model.Compile

Y obtenemos el siguiente resultado:

Resultados

Superados ciertos intentos la cosa no mejora y la perdida total media es de 5.5.

pérdida Total Media

Epoch_loss

Vemos los valores que obtenemos de la predicción.

Predicción

Vamos a buscar un método simple para pintar un espacio vectorial de 25 puntos y calcular su predicción, para ver visualmente la relación que hay entre los datos iniciales de entrenamiento y predicciones.

Esta gráfica nos va a permitir hacernos una mejor idea de lo que está pasando:

espacio vectorial de 25 puntos

Podemos continuar con el ejemplo cambiando los coeficientes de entrenamiento a mano subiéndolos y bajándolos un poco. También podemos cambiar el ratio de entrenamiento dinámicamente.

Y comprobamos que hemos mejorado la pérdida media.

Mejora perdida media

Por lo que parece que modificando el ratio de aprendizaje, solamente obtenemos una mejora parcial. Ahora vamos a modificar la complejidad de la red para ver si mejoramos.

Intuitivamente si añadimos una capa más se produce una “multiplicación de una transformación por otra” lo que provocará una adaptación a las rectas con una curva más compleja”.

Os invito a que re-visitéis ahora el entrenador de TensorFlow para comprender mejor cómo afecta introducir complejidad en la red neuronal y modificar la función de activación y ratio de aprendizaje.

TensorFlow

Modificamos la red.

Comprobamos la nueva red montada.

Nueva red

Compilamos y revisamos.

Y vemos que la curva tiene otra pinta.

Nueva curva

Y esta es la adaptación entre la predicción y las muestras, que va teniendo ya mejor aspecto (considerando que siempre hará un error o sobre-adaptación).

adaptación entre la predicción y las muestras

Ahora vamos a aumentar en número de núcleos a 16 en la segunda capa.

aumentar en número de núcleos

Visualizando la nueva red.

Nueva red

Y comprovamos que se suaviza la curva anterior.

Nueva curva

Aunque la adaptación no es la más satisfactoria.

Nueva gráfica puntos

Pero ahora vamos a hacer un pequeño cambio, modificar la función de activación de la segunda capa a “selu”.

Os invito ahora a visitar este enlace donde podéis ver ejemplos de código con regresión polinomial.

ejemplos de código con regresión polinomial

Podemos ver la función de activación selu en el siguiente enlace.  

Selu

Y podemos comprobar con TensorBoard la pérdida, que es la mejor que hemos podido obtener hasta ahora.

tensorBoard

Y esta es la adaptación de la curva a las rectas.

adaptación de la curva a las rectas

Con el nivel de conocimiento que tengo hasta ahora, es lo mejor que he podido conseguir. Tendremos que seguir investigando sobre los posibles parámetros a actuar y posibles soluciones a un mismo problema.

Os invito a tocar y proponerme mejoras sobre el modelo que es cómo se aprende.

Dejar respuesta

Please enter your comment!
Please enter your name here