miércoles, 27 de mayo de 2020

Catálogo de componentes de redes neuronales (y IV): optimizadores


Vamos a cerrar, al menos por el momento, esta serie de artículos dedicados a censar elementos de diseño de las redes neuronales, y lo haremos hablando de los optimizadores, es decir, esa pieza nuclear del aprendizaje que, tomando como dato de entrada el valor de la función de pérdida, decide cómo modificar los pesos de la red para conseguir que el resultado se acerque, en cada paso, un poquito más al objetivo deseado.

Ya anticipamos el algoritmo más 'típico' que podemos en este caso que el descenso de gradiente ('Gradient descent') cuando comentamos las intuiciones sencillas que existen tras muchos algoritmos en apariencia, y quizá no tan en apariencia, complejos.

Vimos que, en el fondo, el descenso de gradiente no es más, como intuición, que imaginar el perfil de la función de pérdida como una curva o superficie e ir 'bajando' en pequeños pasos por esa curva/superficie, en la dirección de máxima inclinación, hasta encontrar el 'valle', el punto más bajo, momento en que habríamos minimizado el error.

El descenso de gradiente ('Gradient Descent', GD) es un optimizador popular y la base de algunos otros. Vamos a ver, brevemente, el censo de otros optimizadores.

  • BGD ('Batch Gradient Descent'): Es una variante del gradient descent en que, en cada iteración, tomamos el conjunto entero de datos de aprendizaje para calcular el valor del gradiente. Es un algoritmo relativamente sencillo de entender, pero de convergencia lenta.

  • SGD ('Stochastic Gradient Descent'): Es el extremo contrario: en lugar de usar todo el conjunto de datos para calcular el gradiente y actualizar pesos como hace BGD, en este caso en cada iteración utilizamos un único punto de datos con lo que tenemos una convergencia mucho más rápida. A cambio, tiende a presentar ciertas inestabilidades y fluctuaciones.

  • 'Mini-batch Gradient Descent': Es el punto intermedio entre los dos anteriores. En este caso, en cada iteración elegimos un conjunto más o menos reducido de puntos de datos.

  • Nadam ('Nesterov-accelerated adaptive moment stimation') Este es un optimizador que utiliza el concepto de 'momento'. La idea intuitiva es acelerar más o menos el descenso de la curva de gradiente, según la pendiente de la misma, yendo más rápido en las direcciones en que la curva de la función de pérdida es más escarpada y más lento en las direcciones en que la curva presenta un perfil más suave. Y la forma de hacerlo matemáticamente es teniendo en cuenta, no sólo la pendiente actual, sino también la pendiente de las iteraciones anteriores con lo cual tenemos una cierta estimación de aceleración o deceleración.

  • Adagrad ('ADAptive GRADient algorithm') Un método que introduce el aprendizaje adaptativo, en que el nivel de variación de los parámetros depende de estos. La idea geométrica es que, si en el descenso de gradiente avanzamos en la dirección de la mayor pendiente en cada momento, pudiendo esa pendiente no apuntar directamente al mínimo global, en Adagrad intentamos que la dirección de descenso, aunque no sea la máxima, sí apunte más en la dirección del mínimo. Presenta, eso si, el problema de una tasa de aprendizaje cada vez menor, que es lo que intentan resolver los siguientes optimizadores.

  • RMSprop ('Root Mean Square prop'): Utiliza una media móvil de los cuadrados del gradiente y normaliza ese valor empleando para ello las magnitudes recientes de los gradientes anteriores. La normalización se realiza, evidentemente, por que si no, el hecho de elevar al cuadrado hace que, caso de no normalizar, tengamos un valor de gradiente exageradamente alto (el cuadrado, en concreto).

  • Adam ('ADAptive Moment stimation'): Viene a ser una combinación de Adagrad y RMSprop. Utiliza una media móvil exponencial de los gradientes para ajustar las tasas de aprendizaje. Es un algoritmo computacionalmente eficiente y que usa poca memoria. Y es uno de los optimizadores más populares hoy día.

  • Adadelta: Una extensión de Adagrad más robusta que usa una ventana móvil de actualizaciones de gradientes.

  • Adamax: Una variante algo sutil de Adam, en que en lugar de un momento de segundo orden, se utiliza un momento de orden infinito.

Por detrás de los optimizadores, ya se intuye, existe un cierto aparataje matemático y no es fácil describirlos de una forma realmente sencilla. En mi caso, y para realizar este post, me ha sido útil el artículo sobre optimizadores 'Machine Learning: Gradient Descent' y 'Overview of differente optimizers for neural netowrks', publicados ambos por Renu Khandelwal en Medium.

Y con esto cierro, como decía, esta serie de cuatro artículos sobre elementos de diseño que tenemos en redes neuronales, y catalogar de forma sencilla las principales opciones existentes.

No se agotan aquí los elementos de diseño disponibles pero, para una primera visión, he preferido centrarme en conocer e intentar consolidar éstos: capas, funciones de activación, funciones de périda y optimizadores.


Artículos de este blog relacionados

No hay comentarios:

Publicar un comentario