Motivación del Aprendizaje Profundo, su Historia e Inspiración

$$\gdef \sam #1 {\mathrm{softargmax}(#1)}$$ $$\gdef \vect #1 {\boldsymbol{#1}} $$ $$\gdef \matr #1 {\boldsymbol{#1}} $$ $$\gdef \E {\mathbb{E}} $$ $$\gdef \V {\mathbb{V}} $$ $$\gdef \R {\mathbb{R}} $$ $$\gdef \N {\mathbb{N}} $$ $$\gdef \relu #1 {\texttt{ReLU}(#1)} $$ $$\gdef \D {\,\mathrm{d}} $$ $$\gdef \deriv #1 #2 {\frac{\D #1}{\D #2}}$$ $$\gdef \pd #1 #2 {\frac{\partial #1}{\partial #2}}$$ $$\gdef \set #1 {\left\lbrace #1 \right\rbrace} $$ % My colours $$\gdef \aqua #1 {\textcolor{8dd3c7}{#1}} $$ $$\gdef \yellow #1 {\textcolor{ffffb3}{#1}} $$ $$\gdef \lavender #1 {\textcolor{bebada}{#1}} $$ $$\gdef \red #1 {\textcolor{fb8072}{#1}} $$ $$\gdef \blue #1 {\textcolor{80b1d3}{#1}} $$ $$\gdef \orange #1 {\textcolor{fdb462}{#1}} $$ $$\gdef \green #1 {\textcolor{b3de69}{#1}} $$ $$\gdef \pink #1 {\textcolor{fccde5}{#1}} $$ $$\gdef \vgrey #1 {\textcolor{d9d9d9}{#1}} $$ $$\gdef \violet #1 {\textcolor{bc80bd}{#1}} $$ $$\gdef \unka #1 {\textcolor{ccebc5}{#1}} $$ $$\gdef \unkb #1 {\textcolor{ffed6f}{#1}} $$ % Vectors $$\gdef \vx {\pink{\vect{x }}} $$ $$\gdef \vy {\blue{\vect{y }}} $$ $$\gdef \vb {\vect{b}} $$ $$\gdef \vz {\orange{\vect{z }}} $$ $$\gdef \vtheta {\vect{\theta }} $$ $$\gdef \vh {\green{\vect{h }}} $$ $$\gdef \vq {\aqua{\vect{q }}} $$ $$\gdef \vk {\yellow{\vect{k }}} $$ $$\gdef \vv {\green{\vect{v }}} $$ $$\gdef \vytilde {\violet{\tilde{\vect{y}}}} $$ $$\gdef \vyhat {\red{\hat{\vect{y}}}} $$ $$\gdef \vycheck {\blue{\check{\vect{y}}}} $$ $$\gdef \vzcheck {\blue{\check{\vect{z}}}} $$ $$\gdef \vztilde {\green{\tilde{\vect{z}}}} $$ $$\gdef \vmu {\green{\vect{\mu}}} $$ $$\gdef \vu {\orange{\vect{u}}} $$ % Matrices $$\gdef \mW {\matr{W}} $$ $$\gdef \mA {\matr{A}} $$ $$\gdef \mX {\pink{\matr{X}}} $$ $$\gdef \mY {\blue{\matr{Y}}} $$ $$\gdef \mQ {\aqua{\matr{Q }}} $$ $$\gdef \mK {\yellow{\matr{K }}} $$ $$\gdef \mV {\lavender{\matr{V }}} $$ $$\gdef \mH {\green{\matr{H }}} $$ % Coloured math $$\gdef \cx {\pink{x}} $$ $$\gdef \ctheta {\orange{\theta}} $$ $$\gdef \cz {\orange{z}} $$ $$\gdef \Enc {\lavender{\text{Enc}}} $$ $$\gdef \Dec {\aqua{\text{Dec}}}$$
🎙️ Yann LeCun

Plan del curso

  • Conceptos básicos de Aprendizaje Supervisado, Redes Neuronales, Aprendizaje Profundo
  • Retropropagación y componentes de la arquitectura.
  • Red neuronal convolucional y sus aplicaciones.
  • Más Arquitecturas de Aprendizaje Profundo
  • Trucos de regularización / Trucos de optimización / Comprendiendo cómo funciona el Aprendizaje Profundo
  • Modelos basados en energía.
  • Aprendizaje auto supervisado y más allá

Inspiración del Aprendizaje Profundo y su historia.

En un nivel conceptual, el aprendizaje profundo está inspirado en el cerebro, pero no todos los detalles del cerebro son relevantes. A modo de comparación, los aviones se inspiraron en las aves. El principio de volar es el mismo, pero los detalles son extremadamente diferentes.

La historia del aprendizaje profundo se remonta a un campo llamado cibernética, cuyo nombre a cambiado ahora. Comenzó en la década de 1940 con McCulloch y Pitts. Se les ocurrió la idea de que las neuronas son unidades con cierto umbral, con estados de encendido y apagado. Se podría construir un circuito booleano conectando neuronas entre sí y realizar inferencia lógica con neuronas. El cerebro es básicamente una máquina de inferencia lógica porque las neuronas son binarias. Las neuronas calculan una suma ponderada de entradas y comparan esa suma con su umbral. Se enciende si está por encima del umbral y se apaga si está por debajo, lo cual es una visión simplificada de cómo funcionan las redes neuronales.

En 1947, Donald Hebb tuvo la idea de que las neuronas en el cerebro aprenden modificando la fuerza de las conexiones entre ellas. Esto es llamado hiper aprendizaje, donde si dos neuronas se disparan juntas, entonces la conexión vinculada entre ellas aumenta; Si no disparan juntas, la fuerza de la conexión disminuye.

Más tarde, en 1948, Norbert Wiener propuso la cibernética, que es la idea de que al tener sistemas con sensores y actuadores, se tiene un circuito de retroalimentación y un sistema autorregulador. Las reglas del mecanismo de retroalimentación de un automóvil provienen de este trabajo.

En 1957, Frank Rosenblatt propuso el Perceptrón, que es un algoritmo de aprendizaje que modifica los pesos de redes neuronales muy simples.

En general, esta idea de tratar de construir máquinas intelectuales simulando muchas neuronas nació en la década de 1940, despegó en la década de 1950 y murió por completo a fines de la década de 1960. Las principales razones de la muerte del campo en 1960 son:

  • Los investigadores usaron neuronas que eran binarias. Sin embargo, para hacer funcionar la retropropagación (o propagación hacia atrás, del inglés backpropagation) es necesario usar funciones de activación continuas. En ese momento, los investigadores no tenían la idea de usar neuronas continuas y no creían que se pudieran entrenar con gradientes ya que las neuronas binarias no son diferenciables.
  • Con neuronas continuas, uno tendría que multiplicar la activación de una neurona por un peso para obtener su contribución a la suma ponderada. Sin embargo, antes de 1980, la multiplicación de dos números, especialmente los números de punto flotante, era extremadamente lenta. Esto resultó en otro incentivo para evitar el uso de neuronas continuas.

El Aprendizaje Profundo despegó nuevamente en 1985 con la aparición de la retropropagación. En 1995, el campo murió nuevamente y la comunidad de aprendizaje automático abandonó la idea de las redes neuronales. A principios de 2010, las personas comenzaron a usar redes neuronales en el reconocimiento de voz con una gran mejora en el rendimiento y más tarde se desplegó ampliamente en el campo comercial. En 2013, el campo de visión por computadora comenzó a cambiar a redes neuronales. En 2016, ocurrió la misma transición en el procesamiento del lenguaje natural. Pronto, ocurrirán revoluciones similares en robótica, control y muchos otros campos.

Aprendizaje Supervisado

El $90\%$ de las aplicaciones de aprendizaje profundo utilizan aprendizaje supervisado. El aprendizaje supervisado es un proceso mediante el cual, se recopilan varios pares de entradas y salidas, y las entradas se introducen en una máquina que debe aprender cuál es la salida correcta. Cuando la salida es correcta, no se hace nada. Si la salida es incorrecta, se modifica el parámetro de la máquina y corrige la salida en dirección a la deseada. El truco aquí es cómo averiguar en qué dirección y cuánto debe modificarse el parámetro, para lo cual se utiliza el cálculo de gradiente y la propagación hacia atrás.

El aprendizaje supervisado proviene de Perceptrón y Adaline. Adaline se basa en la misma arquitectura con entradas ponderadas: cuando está por encima del umbral, se enciende y por debajo del umbral, se apaga. El Perceptrón es una red neuronal de 2 capas donde la segunda capa es entrenable y la primera capa es fija. La mayoría de las veces, la primera capa se determina al azar y eso es a lo que llaman capas asociativas.

Historia del Reconocimiento de Patrones e introducción al Descenso de Gradiente

Lo anterior es la base conceptual del reconocimiento de patrones antes de que el aprendizaje profundo sea desarrollado. El modelo estándar de reconocimiento de patrones consiste en un extractor de características y un clasificador entrenable. La entrada pasa por el extractor de características, extrayendo información útil y relevante de las entradas, como la detección de un ojo cuando el propósito es reconocer una cara. Luego, el vector de características resultante, se alimenta al clasificador entrenable para calcular la suma ponderada y compararla con el umbral. Aquí, un clasificador entrenable podría ser un perceptrón o una red neuronal única. El problema es que el extractor de características debe diseñarse a mano. Lo que significa que el reconocimiento de patrones / visión por computadora se enfoca en el extractor de características considerando cómo diseñarlo para un problema específico, no muy dedicado al clasificador entrenable.

Después de la aparición y el desarrollo del aprendizaje profundo, el proceso de 2 etapas cambió a una secuencia de módulos. Cada módulo tiene parámetros ajustables y una no linealidad (función no lineal). Luego, se apilan formando múltiples capas. Por eso se llama “aprendizaje profundo”. La razón por la que se usa la no linealidad en lugar de la linealidad, es que dos capas lineales pueden ser formadas por una sola capa lineal, ya que la composición de dos funciones lineales, es también lineal.

La arquitectura más simple de múltiples capas con parámetros ajustables y no linealidad podría ser: la entrada se representa como un vector, como por ejemplo una imagen o audio. Esta entrada se multiplica por la matriz de pesos, cuyos coeficientes son los parámetros ajustables. Luego, cada componente del vector resultante se pasa a través de una función no lineal, como una ReLU. Repitiendo este proceso, la arquitectura se convierte en una red neuronal básica. La razón por la que se llama red neuronal es que esta arquitectura calcula una suma ponderada del vector de entrada, a partir del producto de los componentes del vector de entrada por las filas correspondientes de una matriz de pesos.

Volviendo al aprendizaje supervisado, comparamos la salida resultante con la salida objetivo y luego optimizamos la función objetivo, que es el cálculo de la distancia de error / penalización / divergencia entre el resultado y el objetivo. Luego, se promedia esta función de costo sobre el conjunto de datos de entrenamiento. Este es el objetivo que queremos minimizar. En otras palabras, queremos encontrar el valor de los parámetros que minimizan este promedio.

El método de cómo encontrarlo es calcular el gradiente. Por ejemplo, si estamos perdidos en una montaña lisa en una noche de niebla y queremos ir al pueblo en el valle, una forma de conseguirlo podría ser girar en el lugar y sentir con los pies cuál es la forma más empinada de bajar, para luego dar un pequeño paso hacia abajo. La dirección es el gradiente (negativo). Suponiendo que el valle es convexo, podríamos llegar al valle.

La forma más eficiente se llama Descenso de Gradiente Estocástico (SGD). Dado que queremos minimizar la pérdida promedio sobre el conjunto de entrenamiento, tomamos una sola muestra de entrada, o un pequeño grupo de muestras, calculamos el error sobre ellas, y usamos el descenso de gradiente. Luego, tomamos una nueva muestra, obtenemos un nuevo valor para el error, y calculamos el gradiente, que normalmente es una dirección diferente. Dos de las razones principales para usar SGD son que ayuda al modelo a converger rápidamente (de forma empírica) si el conjunto de entrenamiento es muy grande y permite una mejor generalización, lo que significa obtener un rendimiento similar para varios conjuntos de datos.

Cálculo de gradientes por retropropagación

Calcular gradientes por retropropagación es una aplicación práctica de la regla de la cadena. La ecuación de retropropagación para los gradientes de la entrada es la siguiente:

\[\begin{aligned} \frac{\partial C}{\partial \boldsymbol{x}_{i - 1}} &= \frac{\partial C}{\partial \boldsymbol{x}_i}\frac{\partial \boldsymbol{x}_i}{\partial \boldsymbol{x}_{i - 1}} \\ \frac{\partial C}{\partial \boldsymbol{x}_{i - 1}} &= \frac{\partial C}{\partial \boldsymbol{x}_i}\frac{\partial f_i(\boldsymbol{x}_{i - 1}, \boldsymbol{w}_i)}{\partial \boldsymbol{x}_{i - 1}} \end{aligned}\]

La propagación hacia atrás para los gradientes de los pesos es:

\[\begin{aligned} \frac{\partial C}{\partial \boldsymbol{w}_{i}} &= \frac{\partial C}{\partial \boldsymbol{x}_i}\frac{\partial \boldsymbol{x}_i}{\partial \boldsymbol{w}_{i}} \\ \frac{\partial C}{\partial \boldsymbol{w}_{i}} &= \frac{\partial C}{\partial \boldsymbol{x}_i}\frac{\partial f_i(\boldsymbol{x}_{i - 1}, \boldsymbol{w}_i)}{\partial \boldsymbol{w}_{i}} \end{aligned}\]

Hay que tener en cuenta que en lugar de entradas escalares, serán entradas de vectores. Más generalmente, entradas multidimensionales. La retropropagación permite calcular la derivada de la diferencia entre la salida que se desea y la salida que se obtiene (que es el valor de la función objetivo) con respecto a cualquier valor dentro de la red. Finalmente, la retropropagación es esencial ya que se aplica a múltiples capas.

Es importante considerar cómo interpretar las entradas. Por ejemplo, una imagen RGB de 256\(\times\)256 requeriría una matriz de 200.000 valores. Estas serían matrices enormes que las capas de la red neuronal deberán procesar. No sería práctico utilizar tales matrices. Por lo tanto, es importante enunciar ciertas hipótesis de la estructura de la matriz.

Representación jerárquica de la Corteza Visual.

Los experimentos de Fukushima nos dieron una comprensión de cómo nuestro cerebro interpreta la entrada a nuestros ojos. En resumen, se descubrió que las neuronas frente a nuestra retina comprimen la entrada (conocida como normalización de contraste) y esta señal viaja desde nuestros ojos hasta nuestro cerebro. Después de esto, la imagen se procesa en etapas y ciertas neuronas se activan con ciertas categorías. Por lo tanto, la corteza visual realiza reconocimiento de patrones de manera jerárquica.

Experimentos en los que los investigadores conectaron electrodos en áreas específicas de la corteza visual, específicamente en el área V1, hicieron que se dieran cuenta de que ciertas neuronas reaccionan a ciertos patrones que aparecen en un área muy pequeña del campo visual y de manera similar con las neuronas vecinas y las áreas vecinas en el campo visual. Además, las neuronas que reaccionan al mismo campo visual, reaccionan a diferentes tipos de bordes de manera organizada (por ejemplo, bordes verticales u horizontales). También es importante tener en cuenta que existe la idea de que el proceso visual es esencialmente un proceso de retroalimentación. Por lo tanto, de alguna manera se puede hacer un reconocimiento rápido sin algunas conexiones recurrentes.


📝 Yunya Wang, SunJoo Park, Mark Estudillo, Justin Mae
LecJackS
27 Jan 2020