Introducción al Deep Learning I: Funciones de Activación

Share on facebook
Share on twitter
Share on linkedin

El aprendizaje profundo o deep learning ha ganado una enorme relevancia durante los últimos años en el área de ciencias de la computación, revolucionando las capacidades de los sistemas de inteligencia artificial. Resultados que se consideraban imposibles, e incluso super humanos se han alcanzado debido a estas poderosas técnicas, pero la primera pregunta que emerge al acercarnos a este paradigma es ¿Qué es el deep learning?

Antecesores del Deep Learning

Dentro del Aprendizaje Automático se han vivido diferentes etapas en donde las redes neuronales han tenido mayor o menor auge de investigación por parte de la comunidad científica. Pasando por dos “inviernos” (épocas en que los investigadores dejaron de experimentar con ellas) las redes neuronales se convirtieron en una de las herramientas más poderosas en esta rama de las ciencias de la computación.

Con el crecimiento de la capacidad de cómputo y los datos disponibles, diferentes algoritmos de clasificación supervisada como: Random Forest, Naive Bayes, Support Vector Machines, K nearest neighbors, fueron relegados gradualmente a segundos planos en favor de las Redes Neuronales. ¿Cuál es la magia detrás de estos algoritmos?

¡Que permiten aproximar cualquier función continua utilizando tan solo una capa de profundidad!

Lo anterior nos da una idea de la capacidad de estos modelos para adaptarse a una gran cantidad de problemas, donde necesitemos realizar una transformación matemática desde una entrada X a una salida Y.

A pesar de poder aproximar cualquier función continua, la cantidad de neuronas necesarias para resolver tareas complejas, puede llegar a ser muy grande ocasionando que el problema sea intratable en términos computacionales. ¿Cómo podemos resolver ese problema? Mediante deep learning.

Deep Learning

Podemos definir informalmente Deep Learning como la rama del aprendizaje automático que extrae patrones por medio de redes neuronales con varias capas de profundidad, que son capaces de generalizar bien sobre conjuntos grandes de datos que son intratables cuando se utilizan redes superficiales (pocas capas).

No existe un punto exacto en donde una red deja de ser superficial y comienza a ser profunda, sino que tenemos un espectro de expresividad, sin embargo, la clara distinción de los algoritmos de aprendizaje profundo de los algoritmos convencionales de aprendizaje supervisado, se da en el momento en que notamos una curva como la siguiente:

Fig. 1 Deep learning vs. Algoritmos clásicos

Como vemos en la Figura 1, la diferencia fundamental, es que mientras los algoritmos tradicionales de aprendizaje supervisado no pueden mejorar su rendimiento a pesar de contar con mayores cantidades de datos, las redes profundas lo pueden lograr mientras cuenten con los recursos computacionales necesarios (capacidad de procesamiento y tiempo de entrenamiento), pero esta cantidad de capas viene con un costo.

Los problemas del aprendizaje profundo

Al realizar aprendizaje profundo nos encontramos con una serie de problemas importantes: El desvanecimiento y la explosión de los gradientes, la eficiencia del entrenamiento, la velocidad de convergencia y el diseño de las arquitecturas.

Cuando una red neuronal es profunda, el proceso de backpropagation puede ocasionar que los gradientes menores a uno, al pasar por múltiples capas, se hagan cada vez más pequeños. Si el gradiente se vuelve demasiado pequeño puede colapsar numéricamente (redondearse a cero), ocasionando un fenómeno conocido como desvanecimiento de gradiente (vanishing gradients). De igual forma cuando tenemos muchas capas y los gradientes son mayores a 1, el gradiente puede comenzar a crecer rápidamente ocasionando que el cálculo tenga un overflow, conocido como explosión de gradiente (exploding gradients). Estos problemas se agravan debido a un fenómeno conocido como saturación de gradiente, que se relaciona directamente con la forma de la derivada de la función de activación de cada una de las neuronas en las capas ocultas.

Otro problema importante que se tiene es el de la velocidad de convergencia. Según la dificultad para generalizar los datos, muchas variables entran en consideración a la hora de realizar el aprendizaje, incluyendo la forma de la función de pérdida, el poder de cómputo para calcular la activación de las neuronas, el poder de cómputo para calcular el gradiente, la propagación hacia atrás del error, la determinación del learning rate óptimo, la cantidad de regularización necesaria, entre otras.

Para poder resolver estos problemas se han propuesto diversas estrategias entre las que se encuentran la modificación de las funciones de activación: Tanh, ReLU, Leaky ReLU, optimización del learning rate: Momentum, Adagrad, RMSprop, Adam, descenso de gradiente estocástico y por mini lotes, así como estrategias de regularización: Dropout, Batch Normalization, Early Stopping.

Funciones de Activación

Las funciones de activación son de vital importancia dentro del entrenamiento de las redes neuronales profundas debido a que introducen una no linealidad al momento de calcular la función ponderada de las entradas. Lo anterior permite realizar transformaciones complejas de los datos aumentando la capacidad de representación de cada una de las neuronas de la red.

La selección de la función de activación es relevante al realizar optimización basada en gradiente, debido a que la derivada de la función de activación determina la magnitud del gradiente al propagar hacia atrás. Si la forma de la función de activación es muy plana en los extremos, la derivada en esos puntos será pequeña y por lo tanto el gradiente será cercano a cero. Este fenómeno se conoce como saturación de gradiente. Esto es un problema en particular cuando las redes tienen varias capas de profundidad puesto que puede ocasionar el desvanecimiento del gradiente. 

En los inicios de las redes neuronales se utilizó la función de activación sigmoide debido a la propiedad que tiene de mapear el dominio de los reales al intervalo (0,1), con lo cual se asemeja a una distribución de probabilidad. La función sigmoide sufre de un problema conocido como covariate shift, debido a que la salida de la función se encuentra centrada en 0.5 existe un desplazamiento de la salida de las neuronas que ocasiona que los pesos tengan problemas de convergencia.

Fig 2. Función sigmoide y su derivada
Fig. 3. Gráficas de la función sigmoide y su derivada

Para resolver los problemas de saturación de gradiente y covariate shift, así como para acelerar la velocidad de convergencia, se han propuesto funciones de activación alternativas en redes neuronales profundas.

Tanh

La tangente hiperbólica se puede ver como una versión escalada y desplazada de la sigmoide. De hecho se pude escribir la función de tangente hiperbólica en términos de la sigmoide:

Fig 4. Tanh formula

Esta función mapea el dominio de los reales al intervalo abierto (-1, 1). Debido a lo anterior se encuentra centrada en 0 y elimina el problema del covariate shift. De igual forma su derivada es más “activa” que la sigmoide, lo cual perimite reducir tiempos de entrenamiento y convergencia, sin embargo, también sufre de saturación de gradiente a los extremos de la función:

Fig 5. Tanh y su derivada

Una aproximación más eficiente computacionalmente es la tangente hiperbólica dura, la cual se define como:

Fig. 6. Hard Tanh y su derivada

Esta función de activación es menos suave que la tanh pero da una aproximación interesante.

Fig. 7. Gráficas de la hard Tanh y su derivada

ReLU

ReLU es un acrónimo de Rectified Linear Unit. La ReLU es una función de activación que ha ganado una gran popularidad en los últimos años. Es una función extremadamente rápida de calcular y ha demostrado su efectividad en varios dominios de aplicación. La ReLU se define como:

Fig. 8. ReLU formula

La función ReLU ayuda a mitigar el problema de la saturación de gradiente cuando los valores de la combinación lineal de la entrada son mayores a 0 permitiendo una propagación hacia atrás efectiva incluso en redes profundas. Sin embargo, dado que la derivada colapsa a 0 para valores del gradiente con activaciones negativas, en ocasiones algunas de las neuronas con activación ReLU pueden llegar a colapsar y “morir” durante el entrenamiento.

Fig. 9. ReLU y su derivada

Para mitigar el problema de colapso de las neuronas para gradientes negativos se propone una estrategia conocida como Leaky ReLU, la cual utiliza un parámetro alpha para añadir cierta pendiente que permita la propagación de gradientes negativos. La función Leaky ReLU se define como:

Fig. 10 Leaky Relu y su derivada

En la gráfica de la función se aprecia la pendiente en la activación que hace que la derivada no colapse:

Fig. 11. Gráficas de la Leaky Relu y su derivada.

Softmax

Softmax no es una función de activación propiamente dicha, en el sentido que no recibe como entrada un único elemento, sino un vector. Realiza la exponencial de cada elemento y la divide entre la suma de las exponenciales del vector. El resultado es que esta función de activación traduce las salidas de la capa previa a un vector que simula la distribución de probabilidades de pertenencia a las diferentes clases:

Fig. 12 activación Softmax

Es importante resaltar que la suma de los elementos del vector de salida es 1, en donde la mayor “probabilidad” se asigna de acuerdo a la intensidad de la entrada con respecto de los valores del vector. Es importante mencionar que Softmax debe usarse cuando las clases son mutuamente excluyentes, de otro modo es mejor utilizar una activación sigmoide.

Otras funciones de activación

En la sección anterior revisamos algunas de las funciones de activación más utilizadas, sin embargo, no son las únicas que existen. Han sido propuestas modificaciones de la ReLU como la PRELU y la ELU. La PRELU introduce un parámetro alpha variable (similar al de la Leaky ReLU) para cada neurona, mientras que la ELU, añade una versión exponencial para el gradiente negativo haciendo que las activaciones sean más cercanas a 0 y acelerando la convergencia. Estas activaciones han sido utilizadas con mayor o menor éxito en diferentes problemas de aprendizaje profundo.

Fig 13. Función de acivación ELU
Fig 14. ELU y su derivada

Recientemente se han propuesto otras funciones de activación conocidas como Gaussian Error Linear Units o GELUs, diseñadas por investigadores de la universidad de Berkeley y Toyota. Las GELUs añaden la no linealidad al multiplicar de manera estocástica por 0 o 1 dependiendo de un muestreo a una distribución normal estándar.

Fig. 15. Función de activación GELU

La gráfica de la GELU es similar a la ReLU pero añade una pequeña curva para los valores de X menores a 0:

Fig. 16. Gráficas de las funciones ReLU y GELU

El artículo muestra resultados interesantes incluyendo un par de aproximaciones numéricas para acelerar la velocidad de convergencia.

Conclusiones

Las redes neuronales profundas han cobrado auge gracias a los resultados que han conseguido en problemas complejos de procesamiento de lenguaje natural, visión computacional, robótica, creatividad computacional, entre otros.

Con el crecimiento de las capas y sus capacidades, emergen desafíos importantes, así como nuevas arquitecturas, modelos de neuronas y de optimización. En artículos futuros exploraremos a detalle algunas de las estrategias para enfrentar esos desafíos, así como las nuevas arquitecturas, su aplicación a problemas complejos y en particular a problemas de procesamiento de lenguaje natural.

Puedes encontrar implementaciones básicas de las funciones de activación presentadas en el artículo en Github: https://github.com/MaxSob/NeuralNetworks_In_5_minutes/blob/master/Activation%20functions%20and%20derivatives.ipynb

Share on facebook
Share on twitter
Share on linkedin

No hay comentarios

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

¡Conozcámonos mejor!

Te haremos llegar las novedades de SoldAI, ofertas exclusivas, notificaciones, y mucho más.

¡Deja tu correo, tenemos mucho que contarte!