8. Optimización de redes neuronales

Sobreajuste

El sobreajuste (en inglés Overfitting) es cuando nuestro modelo, en vez de aprender lo que hace es memorizar los resultados. Tambien existe el concepto de subajuste (en inglés underfitting) que es cuando el modelo no es lo suficientemente ponente para adecuarse a los datos. En redes neuronales suele darse menos el underfitting ya que las redes las podemos haces bastantes complejos y solemos pecar de modelos demasiado complejos.

En las siguientes gráficas se observas distintos redes neuronales que tienen sobreajuste:

¿Como podemos evitar el sobre ajuste? Hay varias formas:

Dropout

Regularización

Regularización

Para hacer el modelo mas sencillo, la regularización intenta que los pesos sean mas pequeños. En una red neuronal tenemos una serie de pesos w y b. Si penalizamos la función de pérdida cuando los pesos son mas grandes, habremos "hecho" la regularización.

Se consigue que el tener el w o b muy bajo esa neurona "no exista" y por lo tanto simplifica el modelo. Un modelo más sencillo hace que haya menos sobre ajuste.

Existen 3 tipos de regularizadores (realmente existen más):

L1: También llamada Lasso. Intenta hacer los pesos lo más pequeños posibles.

L2: También llamada Ridge. Intenta eliminar correlaciones entre pesos.

L1L2: También llamada ElasticNet. Es la unión de los 2 anteriores.

Los regularizadores se pueden aplicar tanto a los w como a los b:

kernel_regularizer: Para aplicarse a los w

bias_regularizer: Para aplicarse a los b

Lo normal es aplicar los regularizadores a los w es decir usar kernel_regularizer.

Ejemplos de uso en Keras de L1:

Ejemplos de uso en Keras de L2:

Ejemplos de uso en Keras de L1L2:

Los valores de l1, l2 que se pasa a los regularizadores es cuanto queremos que regularicemos. Si vale 0, no se regulariza nada. Si vale 1 se regulariza muchísimo.

Como vemos el regularizador se puede indicar creando la clase para indicar el nivel de regularización o simplemente con un string e indicando el nombre.

Vamos a ver como funcionan los distintos regularizadores y con distintos valores:

Más información:

Module: tf.keras.regularizers

Regularización Lasso L1, Ridge L2 y ElasticNet: Fórmulas de L1, L2 y ElasticNet

Difference between L1 and L2 regularization, implementation and visualization in Tensorflow: Las imágenes en 3D de las 2 regularizaciones.

How we express regularization in practice: Mas imágenes en 3D de L1 y L2

Intuiciones sobre la regularización L1 y L2: Explica gracias a las derivadas porque L1 hace que el peso sea menor.

l0-Norm, l1-Norm, l2-Norm, … , l-infinity Norm: Las normas (de matemáticas) que se usan en L1 y L2.

Regularization

Machine Learning regularization techniques in real life

LASSO and Ridge Regularization .. Simply Explained

L1, L2 Regularization – Why needed/What it does/How it helps?

Bias-Variance Tradeoff: What is it and why is it important?

Regulation Techniques for Multicollinearity: Lasso, Ridge, and Elastic Nets

Why is ridge regression called "ridge", why is it needed, and what happens when λ goes to infinity?

shrinkage_ridge_regression_subset_selection_and_lasso.pdf

De la regresión lineal a la regresión de crestas, el lazo y la red elástica: Están las gráficas de L1, L2 pero también L1+L2

Logistic Regression: Explica cosas de L1 y L2

No Todas las Bolas Son Redondas | Cuando π ≠ 3,14...

A complete guide to linear regression using gene expression data: regularization

Dropout

El Dropout consiste en hacer que ciertas neuronas se vayan desactivando cada vez en el entrenamiento.

Se hace añadiendo capas de Dropout con una tasa (rate) de cuantas neuronas se desactivan. Un valor de 0 es como si no hubiera dropout y un valor cercano a 1 es como si se desactivaran la mayoría de neuronas. (No se permite el valor de 1)

Uso de uso en Keras de Dropout:

Optimización

Junto con las técnicas anteriores , existen otras para mejorar una red neuronal:

Normalization

Tamaño de Batch

Parada anticipada

Normalization

La normalización consiste es que los datos de entrada estén centrado en 0 y una desviación "pequeña". Esto se hace porque la red va a entrenarse mejor si los datos son "pequeños" y todos en la misma escala ya que así funciona mejor el algoritmo del descenso de gradiente.

Para normalizar los datos se usa la clase StandardScaler de sklearn.

Y sobre un ejemplo de datos sería lo siguiente:

Veamos un ejemplo de que es lo que realmente hace.

Un problema que hay al usar la clase StandardScaler es que en producción hay que usar la misma transformación para predecir los datos. Por ello es necesario guardar los datos de la clase para volver a ponerlos.

La forma de hacerlo es la siguiente:

Batch Normalization

Hace que las salida sigan con valores alrededor de media 0 y desviación 1.

Tamaño del Batch

Difference Between a Batch and an Epoch in a Neural Network

Parada anticipada

La parada anticipada resuelve el problema de cuántas épocas debemos entregar nuestro modelo. Lo que hace es detener el entrenamiento si la métrica no mejora. Para ello se usa la clase de callback de keras llamado EarlyStopping().

La clase contiene entre otros los siguientes parámetros:

monitor: La métrica a monitorizar. Por defecto monitoriza val_loss.

min_delta: El mínimo valor que consideramos como una mejora. Si mejora menos que este valor lo consideraremos como que no ha mejorado. Por defecto si valor es 0.

patience: Cuántas épocas puede estar sin mejorar antes de que paremos el entrenamiento. Por defecto vale 0.

mode: Indica el tipo de métrica que es. Es decir si la métrica es mejor cuanto mayor valor tiene (max) o la métrica es mejor cuanto menor valor tiene (min). Por defecto es valor es auto y keras sabrá el tipo de la métrica por el nombre que tiene.

Más información:

tf.keras.callbacks.EarlyStopping

Keras callback EarlyStopping

Early Stopping in Practice: an example with Keras and TensorFlow 2.0