TICS-579-Deep Learning

Clase 6: Training Tips & Tricks

Alfonso Tobar-Arancibia

Entrenamiento de un Modelo

El entrenamiento de un modelo tiene demasiadas variables que pueden influir en el éxito del modelo. Algunos aspectos relevantes a los que hay que poner énfasis al momento de entrenar:

  • Overfitting
  • Convergencia/Tiempo de Convergencia
  • Generalización
  • Optimización de Recursos Computacionales/Hardware.
  • Prevenir problemas de Vanishing Gradient y Exploding Gradients.

Muchas de las técnicas que veremos acá permiten abordar mejoras en nuestros modelos para uno o más aspectos de los mencionados anteriormente.

Normalización

En general el término Normalización está muy trillado y en la práctica se utiliza para referirse a muchos temas distintos. Algunas definiciones conocidas:

Normalización

\[x_{i\_norm} = \frac{x_i-x_{min}}{x_{max} - x_{min}}\] Esta operación se puede hacer mediante MinMaxScaler de Scikit-Learn.

Estandarización

\[ x_{i\_est} = \frac{x_i - E[x]}{\sqrt(Var[x])}\]

Esta operación se puede hacer mediante StandardScaler de Scikit-Learn.

Normalización (Batch Norm)

Paper 2015: Batch Normalization

¿Por qué?

  • Acelera el entrenamiento
  • Disminuye la importancia de los Parámetros iniciales.
  • Regulariza el modelo (un poquito)
  • Resuelve el problema de Internal Covariate Shift.

Ejemplo: Supongamos que dado la altura y la edad queremos predecir si será deportista de alto rendimiento.

Normalización (Batch Norm)

  • Cambios en Altura son mucho más pequeños que en Edad debido al rango.
  • Toma más tiempo optimizar (requiere parámetros más pequeños)
  • Si el learning rate es alto puede diverger.
  • Si el learning rate es bajo implica que demora mucho más en converger.

Pros

  • Sin importar el punto inicial, el mínimo se encuentra casi a la misma distancia.
  • Es posible utilizar un learning rate más grande sin miedo a diverger.

Cons

  • Más cálculos y parámetros involucrados

Normalización (Batch Norm)

Normalización (Batch Norm)

Cálculo de Estadísticos

\[ \mu_B = \frac{1}{B} \sum_{i=1}^B z^{(i)} = \frac{1}{3}(4 + 7 + 5) = 5.33\] \[ \sigma_B^2 = \frac{1}{B} \sum_{i=1}^B (z^{(i)} - \mu_B)^2 = 1.555\]

Normalización

\[\widehat{z^{(i)}} = \frac{z^{(i)} - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}\]

Scale and Shift: \(\gamma\) y \(\beta\) son parámetros.

\[BN_{\gamma,\beta}(z_i)= \gamma \widehat{z_i} + \beta \]

Z2 norm

Note

Donde \(\gamma\) y \(\beta\) son parámetros aprendidos durante el entrenamiento.

Normalización (Batch Norm): Test Time

Problema

La predicción de una instancia \(i\) específica, ahora depende de otros elementos dentro del Batch. ¿Cómo funciona entonces el modelo en Test Time?

Se estiman valores de \(\mu_B\) y \(\sigma_B\) para usar en inferencia basados en los valores obtenidos en entrenamiento.

Estimación de Estadísticos

  • \(\mu_B^{inf} = E[\mu_B^{j}]\), \(j = 1,...,B\)
  • \(\sigma_B^{inf} = \frac{m}{m-1}E[\mu_B^{j}]\), \(j = 1,...,B\)

Normalización

\[\widehat{z^{(i)}} = \frac{z^{(i)} - \mu_B^{inf}}{\sqrt{(\sigma_B^{inf})^2 + \epsilon}}\]

Scale and Shift: \(\gamma\) y \(\beta\) son parámetros.

\[BN_{\gamma,\beta}(z_i)= \gamma \widehat{z_i} + \beta \]

Los parámetros \(\gamma\) y \(\beta\) son los aprendidos durante el proceso de entrenamiento.

Normalización (Batch Norm): Consejos

  • Andrew Ng propone utilizar BatchNorm justo antes de la función de Activacion.
  • El paper original también propone su uso justo antes de la activación.
  • Francoise Chollet, creador de Keras dice que los autores del paper en realidad lo utilizaron después de la función de activación.
  • Adicionalmente existen benchmarks que muestran mejoras usando BatchNorm después de las funciones de activación.

Entonces, la posición del BatchNorm termina siendo parte de la Arquitectura, y se debe comprobar donde tiene un mejor efecto.

Batchnorm tiene efectos distintos al momento de entrenar o de evaluar/predecir en un modelo. Por lo tanto, de usar Batchnorm es imperativo utilizar los modos model.train() y model.eval() de manera apropiada.

Normalización: Layer Norm

Paper 2016: Layer Normalization

Batch Norm tiene algunos problemas:

  • Muy difícil de calcular en datos secuenciales (lo veremos más adelante).
  • Inestable cuando el Batch Size es muy pequeño.
  • Difícil de Paralelizar.

Beneficios de Layer Norm

  • Puede trabajar con secuencias.
  • No tiene problemas para trabajar con cualquier tipo de Batch Size.
  • Se puede paralelizar, lo cuál es útil en redes como las RNN.
  • En este caso se realiza la normalización por capa o por Data Point (instancia).
  • Además son el elementos cruciales en las Arquitecturas de Transformers.

Normalización: Layer Norm

\[ \mu_{norm} = \frac{1}{n_i} \sum_{j=1}^{n_i} z_j = \frac{1}{4}(4 + 9 + 6 + 7) = 6.5\] \[ \sigma_{norm}^2 = \frac{1}{n_i} \sum_{j=1}^{n_i} (z_j - \mu_B)^2 = 3.25\]

Normalización

\[\widehat{z_j} = \frac{z_j - \mu_{norm}}{\sqrt{\sigma_{norm}^2 + \epsilon}}\]

Regularización L2 aka Weight Decay

Paper 1991: Weight Decay

En general el gran problema de las Redes Neuronales es el Overfitting. Esto porque las redes neuronales normalmente se denominan como Overparametrized Models. ¿Qué significa esto?

Weight Decay

Corresponde a una penalización que se da a los modelos para limitar su complejidad y asegurar que pueda generalizar correctamente en datos no vistos.

\[ \underset{W_{i:L}}{minimize} \frac{1}{m} \sum_{i=1}^m l(h_\theta(x^{(i)}),y^{(i)}) + \frac{\lambda}{2} \sum_{i=1}^L ||W_i||_f^2\]

Eso implica una transformación a nuestro Update Rule:

\[W_i := W_i - \alpha \nabla \frac{1}{m} \sum_{i=1}^m l(h_\theta(x^{(i)}),y^{(i)}) - \alpha \lambda W_i = (1-\alpha\lambda)W_i - \alpha \nabla l(h_\theta(x^{(i)}),y^{(i)})\]

Se puede ver que los pesos (weights) se contraen (decaen) antes de actualizarse en la dirección del gradiente.

Por alguna razón Pytorch decidió implementarlo como una propiedad de los Optimizers cuando en realidad debió ser de la Loss Function.

Dropout

Paper 2014: Dropout

A diferencia de la estrategia anterior, este tipo de regularización se aplica a las activaciones de la red (resultados de la Transformación Affine, previo a la transformación no lineal).

Definiremos el Dropout como:

\[Z_{i+1} = \sigma(W_i^T Z_i + b_i)\] \[\widehat{Z_{i+1}} = D(Z_{i+1})\]

donde \(D\) implica la aplicación de Dropout a la capa \(i+1\). El elemento \(j\) de la capa \(\widehat{Z_i}\) se calcula como:

\[(\widehat{Z_{i+1}})_j = \begin{cases} \frac{(Z_{i+1})_j}{1-p} & \text{with prob 1-p} \\ 0, & \text{with prob p} \end{cases}\]

\(p\) se conoce como el Dropout Rate.

El factor \(\frac{1}{1-p}\) se aplica para mantener la varianza estable luego de haber eliminado activaciones con probabilidad \(p\).

Dropout se aplica normalmente al momento de entrenar el modelo. Por lo tanto, de usar Dropout es imperativo cambiar al modo model.eval() al momento de predecir.

Weights Initialization

Paper 2010: Xavier Initialization Paper 2015: Kaiming Initialization

Hemos hablado que los métodos basados en SGD normalmente utilizan valores aleatorios para partir su entrenamiento, lo cual deja un poco al azar el éxito de un proceso de entrenamiento.

Existen diversos estudios de cómo inicializar los parámetros para una convergencia óptima. Algunas de las inicializaciones son:

Activaciones Triviales

  • Constante
  • Sólo unos
  • Sólo Zeros

Weights Initialization

Xavier o Glorot Uniforme

Se inicia con valores provenientes de una distribución uniforme: \(\mathcal{U}(-a,a)\)

\[ a = gain \cdot \sqrt{\frac{6}{fan_{in} + fan_{out}}}\]

Xavier o Glorot Normal

Se inicia con valores provenientes de una distribución uniforme: \(\mathcal{N}(0,std^2)\)

\[ std = gain \cdot \sqrt{\frac{2}{fan_{in} + fan_{out}}}\]

  • \(fan_{in}\) corresponde al número de conexiones que entran a una neurona. Mientras que \(fan_{out}\) corresponde al número de neuronas que salen de dicha neurona.
  • \(fan\_mode\) corresponde a la elección de \(fan_{in}\) o \(fan_{out}\).

Kaiming (aka He) Uniforme

Se inicia con valores provenientes de una distribución uniforme: \(\mathcal{U}(-bound,bound)\)

\[ bound = gain \cdot \sqrt{\frac{3}{fan\_mode}}\]

Kaiming (aka He) Normal

Se inicia con valores provenientes de una distribución uniforme: \(\mathcal{N}(0,std^2)\)

\[std =\sqrt{\frac{gain}{fan\_mode}}\]

Training Control

El entrenamiento de una red neuronal puede tomar mucho tiempo. Es por eso que algunas buenas prácticas serían:

  • Disponer de resultados preliminares aunque el entrenamiento no haya terminado.
  • Guardar los pesos del mejor modelo obtenido en el proceso de entrenamiento.
  • Evitar entrenar pasado el punto de Overfitting.
    • Aunque hay nuevas ideas de lo que se llama el grokking.

Early Stopping

  • Se refiere al proceso de detener el entrenamiento luego de patience epochs sin mejorar el validation loss u otro criterio.

Checkpointing

  • Corresponde al proceso de guardar los parámetros obtenidos en un epoch en específico. Normalmente se guarda la mejor epoch y la última, pero se puede generar algún criterio.

Categorical Variables

Es importante mencionar que normalmente no se utilizan redes neuronales para poder entrenar datos tabulares. Pero de hacerlo, es muy probable que nos encontremos con variables categóricas. Para ello existen dos técnicas que son las más comunes en redes neuronales.

One Hot Encoder
Corresponde a la representación mediante dummy variables. Normalmente se considera una representación Sparse de los datos.

En Pytorch se puede implementar como F.one_hot(), pero mi recomendación es utilizar las herramientas de Scikit-Learn para evitar Data Leakage.

Categorical Variables

Embeddings
Es una representación de Densa de los Datos. Corresponde a una representación a en un espacio dimensional definido que es aprendido por la misma red. La representación aprendida considera aspectos como la similaridad la cual se refleja como una medida de distancia.

En Pytorch esto se puede realizar mediante: nn.Embedding().

nn.Embedding(num_embeddings, embedding_dim)
  • num_embeddings: Corresponde al número de categórías.
  • embedding_dim: El número de dimensiones en el cual se quiere representar.
  • Este proceso tiene parámetros entrenables asociados.

That’s all Folks