TICS-579-Deep Learning

Clase 2: Introducción a las Redes Neuronales y formalidades

Alfonso Tobar-Arancibia

Problemas de una Hipótesis Lineal

Clase anterior

La Regresión Softmax es capaz de generar separaciones lineales para más de dos clases para cualquier punto \(x \in \mathbb{R}^{1 \times n}\):


\(h_\theta(x) = \theta^T x\), tal que \(\theta \in \mathbb{R}^{n \times k}\).


Esta hipótesis es bastante limitada, y existen muchos problemas que no podrán solucionarse con este tipo de solución.

Limitaciones de una Hipótesis Lineal

Es claro que un problema como el que se muestra acá no podrá ser resuelto mediante un clasificador lineal (hipótesis lineal).

¿Cómo se resuelve este tipo de problemas?

  • Creando nuevas features que permitan predecir problemas no-lineales.

\[h_\theta(x) = \theta^T \phi(x)\]

tal que \(\theta \in \mathbb{R}^{n \times k}\) y \(\phi(x): \mathbb{R}^n \rightarrow \mathbb{R}^d\) con \(d > n\).

  • Básicamente \(\phi(.)\) es la manera matemática de denotar la creación de más features que permiten resolver el problema.

SVM es un algoritmo que hace esto de manera automática utilizando el famoso Kernel Trick, donde \(\phi(.)\) es conocido como el Kernel.

Diferencias entre ML y DL

La diferencia principal entre el Machine Learning y el Deep Learning es la manera en la que se crean las features.

  • Normalmente el Machine Learning está enfocado en que manualmente se generen features.
  • Deep Learning busca que el Algoritmo busque esas features. El énfasis está en buscar la Arquitectura adecuada.

¿Cómo creamos features de manera automática?

Una primera idea sería crearlas de manera lineal:

\[\phi(x) = W^T x\]

donde \(W \in \mathbb{R}^{n \times d}\).

En este caso nuestra hipótesis queda como: \[ h_\theta(x) = \theta^T \phi(x) = \theta^T W^T x = \tilde{\theta}^T x\]

Lamentablemente este approach no funciona, ya que \(\tilde{\theta}^T\) es sólo otra matriz que genera dos transformaciones simultáneas, pero que en este caso llevará de \(n\) a \(k\) de manera directa.

Ojo con las dimensiones.

  • \(W^t\) tiene dimensión \(d \times n\).
  • Sabemos que \(h_\theta(x)\) tiene que devolver \(k\) outputs. Por lo tanto, \(\theta^T\) tiene que tener dimensiones \(k \times d\).
  • \(x\) es un vector con \(n\) features por lo tanto es de dimensión \(n \times 1\).
  • Eso hará que \(h_\theta(x)\) sea de tamaño \(k \times 1\).

¿Entonces cómo?

Vamos a utilizar funciones no lineales. Cualquiera sirve tal que:

\[\phi(x) = \sigma(W^Tx)\]

donde \(W \in \mathbb{R}^{n \times d}\) y \(\sigma: \mathbb{R}^d \rightarrow \mathbb{R}^d\), es decir, \(\sigma\) es una función escalar.

De este modo nuestra hipótesis quedaría como:

\[h_\theta(x) = \theta^T \sigma(W^T x) \neq \tilde{\theta}^T x\]

Estamos aplicando una transformación no-lineal a la transformación lineal de \(x\) con \(W\).

Normalmente escogeremos funciones no-lineales que sean diferenciables para poder actualizar \(\theta\) y \(W\).

Esto es lo que llamaremos el entrenamiento de una red neuronal.

Activation Functions

Definiremos las funciones de activación como funciones no-lineales que se aplican a la salida de cada capa para evitar la composición de dos trasnformaciones lineales consecutivas.

Esta es la única manera de transformar hipótesis lineales en hipótesis no lineales.

Funciones Clásicas

  • Sigmoide
  • ReLU
  • Tanh
  • Softmax

Funciones más modernas

  • Swish
  • GELU
  • ELU

2-Layer non-linear Softmax Regression

\[h_\theta(x) = W_2^T \phi(x) = W_2^T \sigma(W_1^T x)\]

donde \(\theta=\{W_1 \in \mathbb{R}^{n \times d}, W_2 \in \mathbb{R}^{d \times k}\}\)

  • Podemos pensar que \(W_1 \in \mathbb{R}^{n \times d}\) es aquella matriz que lleva a un vector \(x\) de \(n\) a \(d\) dimensiones.
  • De la misma forma, \(W_2 \in \mathbb{R}^{d \times k}\) es aquella matriz que lleva a un vector \(x\) de \(d\) a \(k\) dimensiones/salidas.

Matrix Batch Form

\[h_\theta(X) = \sigma(XW_1)W_2\]

Update Rule

\[W_1 := W_1 - \frac{\alpha}{m} \nabla_{W_1} l_{ce}(h_\theta(X),y)\] \[W_2 := W_2 - \frac{\alpha}{m} \nabla_{W_2} l_{ce}(h_\theta(X),y)\]

Cálculo de Gradientes

Gradiente de \(W_1\)

\[\begin{align} \nabla_{W_1} &= \frac{\partial l_{ce}(h_\theta(X),y)}{\partial \sigma(XW_1)} \cdot \frac{\partial h_\theta(X)}{\partial \sigma(XW_1)} \cdot \frac{\partial \sigma(XW_1)}{\partial XW_1} \cdot \frac{\partial XW_1}{\partial W_1} \\ &= (Z-I_y)_{m \times k} \cdot (W_{2})_{d \times k} \cdot \sigma'(XW_1)_{m \times d} \cdot X_{m \times n} \end{align}\]

Luego, corrigiendo por dimensiones obtenemos que \[\nabla_{W_1} \in \mathbb{R}^{n \times d} = X^T_{n \times m} \left[\sigma'(XW_1) \odot (Z-I_y)W_2^T \right]_{m \times d}\]

Gradiente de \(W_2\)

\[\begin{align} \nabla_{W_2} &= \frac{\partial l_{ce}(h_\theta(X),y)}{\partial h_\theta(X)} \cdot \frac{\partial h_\theta(X)}{\partial W_2}\\ &= (Z-I_y)_{m\times k} \cdot \sigma(XW_1)_{m \times d} \end{align}\]

Luego, corrigiendo por dimensiones obtenemos que \[\nabla_{W_2} \in \mathbb{R}^{d \times k} = \sigma(XW_1)^T_{d \times m}(Z - I_y)_{m \times k}\]

  • \(\odot\) representa el producto Hadamard entre dos matrices. Esto es, multiplicación elemento a elemento.
  • \(\sigma'(.)\) representa la derivada de la función de activación \(\sigma(.)\)

Nuestra Primera Red Neuronal

Definiciones

Inputs

\[Z_1 = X\]

Intermediate Outputs

\[Z_{i+1} = \sigma_i(Z_iW_i), i=1,...,L\] \[Z_i \in \mathbb{R}^{m \times n_i}\]

Output (Head)

\[h_\theta(X) = Z_{L+1}\]

Parámetros

\[\theta = \left[W_1,..., W_L\right]\] \[ W_i \in \mathbb{R}^{n_i \times n_{i+1}}\]

  • Las salidas intermedias (intermediate outputs) son las mal llamadas hidden layers. Esta red cuenta con \(L\) hidden layers \(W\).

Definiciones

Red Neuronal

Vamos a definir como Red Neuronal un tipo particular de hipótesis que consiste en:

  • Multiples capas que permiten cambiar de dimensión.
  • Funciones de activación no-lineales y diferenciables que permiten desacoplar transformaciones lineales.
  • Un set de parámetros optimizables, que permiten reducir una Loss Function.

Si bien estas redes toman inspiración de la biólogía, poco o nada tienen que ver con neuronas reales.

Términos como Neural Network, Deep Networks, Deep Learning, son ampliamente usados y algunas veces usados para diferenciar el tamaño de distintas arquitecturas.

Nosotros los vamos a usar prácticamente como sinónimos.

Update Rule

\[W_i := W_i - \frac{\alpha}{m} \nabla_{W_i} l(h_\theta(X),y)\]

Cálculo de Gradientes de una Red Neuronal

\[\nabla_{W_i} l(Z_{L+1},y) = \underbrace{\frac{\partial l(Z_{L+1},i)}{\partial Z_{L+1}} \cdot \frac{\partial Z_{{L+1}}}{\partial Z_L} \cdot \frac{\partial Z_L}{\partial Z_{L-1}}...\cdot \frac{\partial Z_{i+2}}{\partial Z_{i+1}}}_{G_{i+1} = \frac{\partial l(Z_{L+1},y)}{\partial Z_{i+1}}}\cdot \frac{\partial Z_{i+1}}{\partial W_i}\]

Gradiente Entrante (Incoming Backward Gradient)

  • Vamos a definir el Gradiente Entrante hasta antes de la capa \(i\) (desde la salida en dirección a la entrada) como: \[\begin{align}G_i &= G_{i+1} \cdot \frac{\partial Z_{i + 1}}{\partial Z_i} \\ &= G_{i+1} \cdot \frac{\partial \sigma_i(Z_i W_i)}{\partial Z_i W_i} \cdot \frac{\partial Z_i W_i}{\partial Z_i}_{} \\ &= (G_{i+1})_{m \times n_{i+1}} \cdot \sigma'(Z_i W_i)_{m \times n_{i + 1}} \cdot (W_i)_{n_i \times n_{i+1}} \end{align}\]

Luego, \[ G_i \in \mathbb{R}^{m \times n_i} = \left[ G_{i+1} \odot \sigma_i'(Z_i W_i)\right] W_i^T\]

Cálculo de Gradientes de una Red Neuronal

\[\begin{align}\nabla_{W_i} l(Z_{L+1},y) &= G_{i+1} \cdot \frac{\partial Z_{i+1}}{\partial W_i} \\ &= G_{i+1} \cdot \frac{\partial \sigma_i'(Z_i W_i)}{\partial Z_i W_i} \cdot \frac{\partial Z_i W_i}{\partial W_i} \\ &= (G_{i+1})_{m \times n_{i+1}} \cdot \sigma'(Z_i W_i)_{m \times n_{i+1}} \cdot (Z_i)_{m \times n_i} \end{align}\]


Luego el Gradiente de cualquier Loss Function con respecto a un set de parámetros \(W_i\) se escribe como:

\[\nabla_{W_i}l(Z_{L+1}, y) = Z_i^T \left[G_{i+1} \odot \sigma'(Z_i W_i)\right]\]

Forward y Backward Passes

Backpropagation
Corresponde al Algoritmo con el cuál calcularemos los Gradientes de una Red Neuronal. Es un nombre muy fancy para calcular la Regla de la Cadena de manera eficiente aplicando caching de los resultados intermedios.

Forward Pass

  1. Inicializar \(Z_1 = X\).
  2. Iterar calculando: \(Z_i = \sigma_i(Z_i W_i), i=1,...,L\).

Backward Pass

  1. Inicializar \(G_{L+1} = \nabla_{Z_{L+1}}l(Z_{L+1},y) = S-I_y\) (Este ejemplo es sólo el caso de Cross Entropy como Loss Function).
  2. Iterar calculando: \(G_i = \left[G_{i+1} \odot \sigma_i'(Z_i W_i)\right]W_i^T, i=L,...,1\)

Update Rule

  1. Calcular Gradientes para poder aplicar el Update Rule.

\[W_i := W_i - \frac{\alpha}{m}\nabla_{W_i}l(Z_{L+1},y) = W_i - \frac{\alpha}{m} Z_i^T\left[G_{i+1} \odot \sigma'(Z_i W_i)\right]\]

Conceptos Clásicos del Entrenamiento de una NN

  • Definiremos una Epoch como el número de veces que repetiremos el Algoritmo de Backpropagation con todos los datos de Entrenamiento. El número de epochs de entrenamiento será un hiperparámetro de un modelo.
  • Definiremos el learning rate como un hiperparámetro que controlará el aprendizaje del modelo.
  • Definiremos este tipo de redes neuronales como Feed Forward Networks o FFN aunque en la práctica tienen una pequeña modificación que veremos en la siguiente clase.

Este tipo de redes es muy utilizada y recibe diversos nombres:

  • Fully Connected Layers
  • Dense Layers: Proviene de la nomenclatura utilizada por Tensorflow.
  • Linear Layers: Proviene de la nomenclatura utilizada por Pytorch, pero no es del todo correcto.
  • MLP o Multilayer Perceptron.

See ya later, aligator!!