El descenso del gradiente
Rubén Rodríguez Abril
El descenso del gradiente es el método estándar utilizado para minimizar la función de pérdida o error, esto es, reducir la diferencia entre el resultado obtenido y el que se busca obtener. En este algoritmo los pesos sinápticos de la red son modificados hasta que dicha función alcanza un mínimo.
Descenso del gradiente
La misión del aprendizaje supervisado es minimizar en lo posible la función de pérdida o error de la red, penalizando aquellas conexiones sinápticas que en mayor medida hayan contribuido al crecimiento de dicha función.
Si trazamos una gráfica en la que se representa a la pérdida como función de un peso sináptico w_{ij} concreto, comprobaremos cómo los mínimos y máximos locales de la función se hayan precisamente allí donde la derivada o gradiente de la función respecto a dicho peso es nula:
En esta ilustración se representa el valor de la derivada de la función E respecto a un peso sináptico en dos puntos distintos de la curva. Cuando el peso sináptico vale 2, la derivada de E es negativa (pendiente descendente), mientras que cuando vale 4, su derivada es cero (pendiente nula). Este último punto es el objetivo a alcanzar, puesto que en él la función E ha alcanzado un mínimo local.
Para que que la función de pérdida se acerque a un mínimo, debemos desplazarnos iterativamente a través de su curva en la dirección inversa señalada por el gradiente. Si la derivada de la función en el punto es positiva (pendiente ascendente) debemos disminuir el valor del peso sináptico. Si es negativa (pendiente descendiente), debemos incrementarlo.
En este ejemplo, dado que el gradiente es negativo en w_{ij} = 2, el peso sináptico debe incrementarse paso a paso hasta alcanzar el punto de gradiente nulo. Esto es lo que se conoce como descenso del gradiente.
Algoritmo del descenso del gradiente
Tras la conclusión de cada lote, el incremento Δw_{ij} del peso sináptico se calculará multiplicando la media (en el lote) del gradiente de la pérdida por un coeficiente constante, la tasa de aprendizaje a:
La tasa de aprendizaje
La tasa de aprendizaje a es un hiperparámetro que determina a qué velocidad deben de modificarse los pesos sinápticos de la neurona durante cada iteración.
Cuanto mayor sea esta tasa, mayor será la alteración del comportamiento de la red cada vez que se actualicen los pesos. Suele oscilar entre 0 y 1. El objetivo del aprendizaje es que la neurona estabilice sus pesos sinápticos entorno a un valor concreto. Y para ello deben evitarse tasas de aprendizaje excesivamente altas o bajas.
La modificación del peso sináptico en cada iteración del algoritmo está determinado en parte por la tasa de aprendizaje a. En el ejemplo izquierdo una a demasiado pequeña ocasiona que el aprendizaje requiera de muchas iteraciones. En el ejemplo derecho, una a excesivamente grande provoca que el peso sináptico no acabe de estabilizándose entorno al punto óptimo.
Implementación del método
Por su modo de implementación, el descenso del gradiente puede realizarse de tres modos diferentes:
–Estocástico: la actualización de los pesos sinápticos o “iteración” -y por lo tanto, el desplazamiento a través de la curva de la función de error- tiene lugar cada vez que una muestra de entrenamiento se evalúa por la red. Se producen tantas iteraciones como objetos hay en el conjunto de entrenamiento. Los lotes se componen, pues, de una sola muestra.
–Por lotes: los pesos sinápticos sólo se actualizan cuando concluye una época, es decir, cuando ha concluido la evaluación del conjunto de datos de entrenamiento. Cada vez que se evalúa una muestra, se calcula el gradiente de la función de error para cada conexión sináptica. Una vez que concluye la evaluación de todas las muestras, se calcula la media del gradiente para cada conexión, que entonces es utilizada para la modificación del peso sináptico. Hay una iteración por cada época. Todos los datos de entrenamiento forman un sólo lote.
–Por minilotes: los datos del conjunto de entrenamiento se dividen en minilotes de tamaño similar (por lo general, del orden de 100-200 muestras). La iteración tiene lugar al finalizar la evaluación de cada minilote, teniendo en cuenta la media del gradiente a lo largo de dicho lote. Es el método de implementación más utilizado.
Ascenso del gradiente
Cabe señalar que en algunos modelos neuronales (como los generadores de los GANs, que con posterioridad examinaremos) lo que se busca es maximizar la pérdida. En este caso, el algoritmo toma el nombre de ascenso del gradiente y el miembro derecho de la anterior ecuación cambia de signo:
Problemas del Descenso del Gradiente
El valor de la función de pérdida es el mismo en toda la red. Se trata de una función única que sin embargo posee miles de derivadas parciales, cada una de ellas respecto a un peso sináptico diferente.
El cálculo de dichas derivadas comienza en las neuronas de salida. Y luego, recursivamente, va procediéndose a su cómputo en las neuronas de las capas anteriores, hacia las neuronas de entrada. Este procedimiento, denominado de retropropagación, será analizado pormenorizadamente en el próximo artículo de esta serie. Por el momento, basta con señalar que para propagar el gradiente hacia las neuronas de la capa anterior es necesario multiplicarlo por la derivada de su función de activación \frac {∂s_{i}}{∂x_{j}}.
Problema de la desaparición del gradiente
Dicha derivada tiene a menudo valores inferiores a uno y muy cercanos a cero. Esto provoca que conforme se va retrocediendo a lo largo de la red, los valores de los gradientes parciales sean cada vez más cercanos a cero, y los pesos sinápticos apenas se modifiquen. El entrenamiento, en este caso, queda reducido a las últimas capas de la red. Este fenómeno se conoce con el nombre de problema de la desaparición del gradiente (vanishing gradient problem) o problema fundamental del aprendizaje profundo (fundamental deep learning problem). En los años 80 provocaba el fracaso de las redes de aprendizaje profundo una vez que éstas alcanzaban un cierto tamaño crítico.
El estudiante alemán Sepp Hochreiter diagnosticó adecuadamente el problema en el año 1991. Y a partir de entonces se han adoptado diversas medidas para paliarlo, entre las que podemos citar las siguientes:
Función rectificadora
La función rectificadora tiene como derivada a la función escalón de Heaviside, cuyo valor es la unidad cuando su argumento es mayor que cero. Por ello, su adopción como función de activación resuelve el problema de la desaparición del gradiente cuando la excitación de la neurona es positiva.
A la izquierda, la función rectificadora. A la derecha su gradiente. El gradiente o derivada de la función de activación respecto a la función de excitación, se mantiene constante \frac {∂s_{i}}{∂x_{j}} = 1 para valores x_{j} > 0.
Normalización por lotes
Problemas en la zona de saturación
Se dice que una función se satura no linealmente cuando su derivada tiende rápidamente a cero fuera de la región comprendida entre K y -K, donde K es un número real determinado. La zona donde sucede esta cuasi-anulación de la derivada se denomina zona de saturación.
La función logística y la tangente hiperbólica presentan zonas de saturación. Por ello, si se las utiliza como funciones de activación, se ha de prevenir a toda costa que su argumento, la suma de excitaciones de la neurona, tome valores de dichas zonas, ya que en ellas el gradiente/derivada es casi nulo.
En esta gráfica de la función logística las zonas de saturación se marcan en rosa. En ellas (argumento superior a 1 o inferior a -1) la derivada de la función (pendiente de la curva) es prácticamente nula. Como podemos ver en la gráfica de la derecha, en la que se traza el gradiente o derivada de la función logística, incluso fuera de dicha zona de saturación los gradientes siguen siendo cercanos a 0 y apenas se aproximan a 1.
Normalización de los datos de entrada
Con este fin, una técnica frecuentemente empleada es la transformación matemática de los valores de excitación que una neurona determinada toma a lo largo de un lote, de tal manera que todos ellos se ordenen en una distribución normal con media de cero y de desviación típica igual a uno. Este procedimiento de denomina normalización por lotes, y es usado para evitar valores de entrada excesivamente dispersos.
Para implementarlo debemos calcular la media y la desviación típica de los valores originales del lote. Y tras ello se aplicaría la siguiente ecuación de normalización:
Siendo x_{k} el valor de excitación sin normalizar, μ la media de la distribución originaria, σ su desviación típica, y n_{k} el nuevo valor (normalizado) de excitación.
Una matriz de datos A, con media μ_{A} = 111.86 y desviación típica δ_{A} = 79.18 puede ser convertida en una nueva distribución Z con media μ_{Z} = 0 y desviación δ_{Z} = 1, es decir, una distribución normal. Para ello solo es necesario aplicar la fórmula a cada valor a de la primera distribución.
Desplazamiento y escalado
Opcionalmente, una vez que hemos normalizado el lote, podemos desplazar la distribución a izquierda y derecha y cambiar su escala, por medio de la siguiente ecuación (operación de desplazamiento y reescalado):
donde y_{k} es el valor definitivo de salida (transmitido a la capa siguiente) mientras que γ y β son dos variables aprendidas. Esta operación nos permite deshacer la normalización por lotes si así lo deseamos, ya que si igualamos γ a la desviación típica del lote y β a la media del mismo, obtenemos la distribución original. Si lo que pretendemos es que las salidas estén completamente normalizadas, nos basta con dejar γ= 1 y β = 0. Ambas variables son aprendidas, y también se modifican mediante el procedimiento del descenso del gradiente de la función de pérdida, de un modo similar a los pesos sinápticos.
Optimización de la red
Los autores del trabajo inicial que introdujo la normalización por lotes, Sergey Ioffe y Christian Szegedy, comprobaron, además, que incluso cuando no existían problemas de saturación en la función de activación, el entrenamiento de una red neuronal podía llegar a ser hasta 13 veces más rápido si se introducía el expediente de la normalización por lotes. Ello se debe al hecho de que la modificación de los pesos sinápticos de una capa afecta a las entradas de la capa siguiente. Y el efecto concatenado de la modificación a lo largo de toda la red puede provocar que las entradas de las capas posteriores estén sometidas a una gran dispersión estadística, lo que entorpece la convergencia de la función de error hacia su mínimo.
El efecto es parecido al del empleo de tasas de aprendizaje demasiado grandes. La introducción de procesos de normalización reduce esta dispersión, permite el uso de tasas de aprendizaje más elevadas y acelera con ello la transición del estado de la red hacia su óptimo.
Capa de normalización
En muchas redes convolucionales (usadas para tareas como el reconocimiento visual o la segmentación semántica), la normalización por lotes se aplica como una capa independiente. Y suele intercalarse, por lo general, entre las operaciones de convolución y de activación/rectificación.
Conclusión
Lecturas Recomendadas
– Sepp Hochreiter. (1991). Untersuchungen zu dynamischen neuronalen Netzen. Diploma thesis, TU Munich.
– Sergey Ioffe, Christian Szegedy. (2015) Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift.