30 de mayo de 2020

Sobreentrenamiento de una red neuronal

Hola,
en la última entrada repasé como aprende una red neuronal y cómo se calcula el coste en un conjunto de entrenamiento. Hoy me detengo en el problema del sobreentrenamiento (overfitting en la literatura), para lo cual necesitamos un conjunto de datos independiente, que llamamos conjunto de validación.

Primero definiré el sobreentrenamiento con las palabras de J Krohn: "es la situación en la que el coste de entrenamiento desciende a la vez que aumenta en el conjunto de validación". El objetivo del entrenamiento debe ser obtener un modelo general, y el sobreentrenamiento es por tanto un obstáculo, porque al sobreentrenar lo que ocurre es que el modelo se particulariza para tu conjunto de entrenamiento.

Figura 9.5 de Krohn J (2019) Deep Learning Illustrated

En la figura se ilustran 4 modelos ajustados a los mismos datos. Arriba a la izquierda un modelo como un solo parámetro, con un ajuste muy pobre. A su derecha un modelo parabólico con con dos parámetros se ajusta bastante bien. Abajo se muestran un modelo multiparamétrico que sobreajustan los datos y que no generaliza bien cuando se agregan nuevos datos (abajo derecho). El sobreentrenamiento es un problema de sobreajuste.

En su libro, J Krohn presenta ideas para limitar el sobreentrenamiento. En primer lugar, habla del número de épocas que debemos entrenar una red:
  • Si el coste de entrenamiento en un conjunto de datos de validación alcanza el mínimo en la última época es buena idea agregar más épocas al entrenamiento.
  • Si el coste empieza a aumentar a partir de una época de entrenamiento, es normalmente un indicio de sobreentrenamiento
En segundo lugar, describe la técnica de eliminación neuronas (dropout) al azar en capas ocultas durante el proceso de entrenamiento:

Figura 9.6 de Krohn J (2019) Deep Learning Illustrated

El próximo día programaremos las primeras redes,
Bruno

3 de mayo de 2020

Entrenamiento de una red neuronal

Hola,
hoy voy a hablar sobre el entrenamiento de una red neuronal, que es el proceso por el que  presentamos a la red un conjunto de ejemplos de los que sabemos cuál debería ser la respuesta de la red. El ejemplo de la figura es una imagen de 28x28 píxeles en escala de grises que representa el número 3 y pertenece al conjunto MNIST de números manuscritos.
Figura 5.2 de Krohn J (2019) Deep Learning Illustrated

El proceso de entrenamiento consiste en presentar a la red el conjunto de entrenamiento varias veces seguidas (épocas en la jerga) con el fin de que vaya aprendiendo. Al final de cada época podemos calcular el error que comete la red al clasificar las instancias presentadas, que se calcula comparando las salidas obtenidas con las esperadas . El objetivo del entrenamiento es minimizar el error. Por tanto, deberemos definir una función de coste con el objeto de optimizarla frente a un conjunto de entrenamiento lo más grande y realista posible.

La función coste (loss function en la literatura) se calculaba inicialmente como el coste cuadrático promedio. El valor obtenido es siempre positivo y penaliza más las grandes diferencias que las pequeñas. Es el RMSD que se emplea por ejemplo para comparar estructuras de proteínas similares. Sin embargo, tiene el inconveniente de ser poco sensible a cambios en los pesos de las neuronas cerca de sus valores extremos, y por tanto, ralentiza el aprendizaje. Por esa razón se sustituye habitualmente por una función basada en logaritmos de coste entrópico, tomada de la teoría de información:



El último paso de una época de aprendizaje es la retro-propagación, es decir, la optimización de los pesos y umbrales de activación de las neuronas para minimizar el error. Para ello se emplea el algoritmo clásico del gradiente descendiente capa a capa, en sentido contrario a la propagación, empezando por la capa inmediatamente anterior a la capa de salida. El proceso completo se resume en el siguiente diagrama de flujo, donde se observa que los datos de entrenamiento se reparten en lotes (batches):

Figura 8.6 de Krohn J (2019) Deep Learning Illustrated
Dos de los parámetros más importantes durante el aprendizaje son:

1) la tasa de aprendizaje , que es la pendiente que aplica el algoritmo del gradiente descendiente para descender por el gradiente de coste. J Krohn recomienda valores de 0.01 u 0.001 para empezar.

2) El tamaño de los lotes, que nos permitirá entrenar con conjuntos de datos más grandes que la RAM de nuestro sistema de cálculo.

Al comparar los costes entre épocas es posible calcular la velocidad de aprendizaje. La siguiente figura muestra que la velocidad de aprendizaje es diferente para las diferentes capas de una red profunda. En concreto, las capas aprenden más lentamente cuánto más lejos de la capa de salida:

Figura 8.8 de Krohn J (2019) Deep Learning Illustrated

Esta es la razón más importante para restringir el número de capas ocultas de una red profunda. Hasta la próxima,
Bruno

19 de abril de 2020

Propagación en una red neuronal

Hola,
tras la reciente entrada sobre las capas de una red neuronal podemos ya aprender cómo se propaga la computación en la red, lo que la literatura se conoce como forward propagation. Para ello nada mejor que ver la red con salida binaria de la entrada anterior, con las neuronas numeradas:
Figura 7.2 de Krohn J (2019) Deep Learning Illustrated
Supongamos que las neuronas de input toman los siguientes valores reales, por ejemplo medidas físicas en un experimento:



Recordemos ahora que las neuronas de las capas ocultas son de tipo ReLU, que tienen la siguiente función de activación (alfa):



Ahora detallaré cómo calculamos las activaciones capa a capa, y por tanto, cómo se propaga la información en la red.

Empezaré por la neurona a1. Supongamos que sus dos pesos toman valores reales de -0.5 y 1.5 y su umbral de activación es 0.9:
z1 = -0.5 x 4.0 + 1.5 x 3.0 - 0.9  = -2 + 4.5 -  0.9 = 1.6
alfa1 = max(1.6 , 0) = 1.6

Sustituyendo los pesos y umbrales correspondientes, que son los valores que se optimizan en el periodo de entranamiento, podemos calcular de la misma manera la activación de a2 y a3. Así tendríamos ya la primera capa oculta completa y podríamos pasar a la siguiente, formada por las neuronas a4 y a5.

Finalmente llegamos a la neurona de output, que en la entrada anterior quedamos era de tipo sigmoidea. Ésta recibe las activaciones 2.5 y 2.0, con pesos respectivos de 1.0 y 0.5 y un umbral 5.5.

z(output) = 1.0 x 2.5 + 0.5 x 2.0 - 5.5 = -2.0

Ahora usaremos la función sigmoidea para calcular el estado (activación) de la neurona output:


En el contexto de un clasificador binario, para reconocer por ejemplo objetos de una cierta clase, la salida se interpreta como que la probabilidad de que la instancia (4.0, 3.0) sea de esa clase es 0.1192

Hasta pronto,
Bruno

Siguiente entrada: Entrenamiento de una red neuronal

18 de abril de 2020

Capas de una red neuronal

Hola,
ésta es la tercera entrada sobre redes neuronales profundas, donde hablaré de cómo se contruye una red por capas, o layers en inglés. La siguiente figura muestra una red con un total de 4 capas.
 
Figura 7.1 de Krohn J (2019) Deep Learning Illustrated
La capa 1 es la capa de input o entrada. En este ejemplo tiene solamente 2 neuronas, X1 y X2. Esta  capa debe adaptarse a la dimensionalidad y el tipo de los datos que vayamos a utilizar como entrada de la red. En el ejemplo la capa de entrada sería adecuada para datos con dos dimensiones. La capa de input es especial porque no tiene una función de activación, simplemente recibe los datos y los pasa a la siguiente capa.

La capa 2 es la primera capa oculta y recibe la salida de la primera capa. En este ejemplo es una capa densa o completamente conectada, dado que sus tres neuronas (a1, a2 y a3) reciben la salida de todas las neuronas de entrada. Puedes mirar aquí un ejemplo de red no densa. Las capas ocultas normalmente son de neuronas ReLU.

La capa 3 es la segunda capa oculta del ejemplo y de nuevo es una capa densa, en este caso con dos neuronas solamente.

La capa 4 es la capa de salida o output y emite la respuesta final de la red para un determinado input. En este ejemplo solamente hay una neurona de salida, que es lo adecuado para un clasificador binario, donde solo hay dos estados posibles. Para este caso usaríamos una neurona sigmoidea.

Si vuelves a la figura verás que hay una flecha horizontal de izquierda a derecha que simboliza el flujo de información a través de las capas. En las redes neuronales este flujo va de input a output y en la terminología en inglés se llama forward propagation.

Algunos problemas implican clasificar los datos o instancias en más de dos clases. Para ellos usaríamos una capa de salida con varias neuronas de tipo softmax,  como las 3 neuronas de salida de la siguiente figura. La capa softmax primero computa la activación de las 3 neuronas de salida y después aplica la función softmax para calcular cuál de los 3 estados o clases representa mejor una instancia, tal como se explica en https://github.com/the-deep-learners/deep-learning-illustrated/blob/master/notebooks/softmax_demo.ipynb :

Figura 7.4 de Krohn J (2019) Deep Learning Illustrated

Finalmente, hay redes neuronales que no clasifican las instancias en categorías discretas. En cambio, producen valores reales a partir del input. Este tipo de redes se llaman redes neuronales de regresión, y las veremos en otras entrada.

Hasta la siguiente,
Bruno

Siguiente entrada: Propagación en una red neuronal



17 de abril de 2020

sobre el origen sospechoso de SARS-CoV-2

Buenas,
interrumpiendo la serie de entradas sobre redes neuronales no he podido resistirme a pegar aquí esta historia, en inglés, sobre el origen del virus SARS-CoV-2, o nCOV2019 en este artículo: http://virological.org/t/tackling-rumors-of-a-suspicious-origin-of-ncov2019/384

El tema es oportuno para este blog, porque la principal figura es un alineamiento pareado al estilo de BLASTN donde se observan hasta 19 mutaciones, todas en las terceras posiciones de sus codones:





En el artículo original usan datos de gripe para datar esta serie de mutaciones, y les salen 1950 años,

hasta pronto,
Bruno