Una de las preguntas más comunes durante las entrevistas sobre conocimientos de aprendizaje profundo es: “ ¿Por qué no podemos utilizar una función de costo cuadrática para entrenar una red neuronal? ”. En este artículo, discutiremos la respuesta a esta pregunta. ¡Habrá muchas matemáticas involucradas pero nada loco! Mantendré las cosas simples y precisas.
Comencemos contemplando la arquitectura general de una red neuronal.
Tenemos una serie de entradas que forman una "capa de entrada", una serie de neuronas en la "capa oculta" y una neurona que forma una "capa de salida" para un problema de clasificación binaria. Para esta pregunta, asumiremos que estamos tratando con un clasificador binario, por lo que solo tenemos un valor de salida de la red.
Ahora, observe la siguiente figura donde resaltamos la capa de entrada en verde, la neurona de salida en rojo y una neurona de la capa oculta en naranja. Desde todos los verdes hasta el naranja, vemos que todas las entradas están conectadas a la neurona naranja. En otras palabras, la "activación" de la neurona naranja se produce mediante la "agregación" de todas las neuronas verdes en la capa de entrada. Este proceso se replica en todas las neuronas de todas las capas hasta llegar a la neurona de salida roja final.
¿Qué pasa si reemplazamos la neurona naranja con la neurona roja, es decir, eliminamos la capa oculta y conectamos la neurona roja con las neuronas verdes directamente?
Obtendremos lo siguiente:
Para esta pregunta, asumiremos la "arquitectura simplista" antes mencionada y el resultado también se puede generalizar a la arquitectura completa.
Ahora introduzcamos algunas matemáticas paso a paso.
Lo que vemos arriba es la ecuación básica de "actualización de peso" para una red neuronal. He eliminado los hiperparámetros adicionales, como el factor de aprendizaje y el submuestreo (lote mínimo), etc. w_k es el vector de pesos y los pesos son los 'parámetros' de nuestro modelo de red neuronal. w_k comprende pesos individuales reunidos en un vector de columna. Estos pesos están asociados con las entradas al modelo (es decir, las neuronas verdes en nuestra arquitectura). Tenemos una función de costo C_i donde i = 1 an son el número de instancias de datos en nuestra muestra. La función de costo C es el "error" entre la salida real y y la salida de la red neuronal (neurona roja). Cada instancia de datos producirá un resultado previsto en comparación con un resultado real, por lo tanto, habrá un costo o error para cada instancia de datos. El objetivo del modelo es minimizar esta función de costos en promedio en todo el conjunto de datos. Y como sabemos, el paso de minimización implica tomar una derivada con respecto a los parámetros del modelo (pesos). Hacemos esto usando la derivada parcial del vector w_k. Todo esto significa es que el costo C será una expresión/agregación de pesos w_1 a w_q y diferenciaremos cada peso w y lo recogeremos en un vector. Esto se llama "vector gradiente" negativo. Se utiliza para actualizar el vector de peso desde la k-ésima iteración hasta la (k+1)ésima iteración. La metodología es el descenso del gradiente estocástico, pero lo dejaremos de lado en este artículo.
En pocas palabras, la red neuronal aprende mediante una actualización de los pesos a través del vector de gradiente negativo promediado sobre todas las muestras y calculado para w_k. Esto nos ayuda a avanzar hacia la minimización de la función de costos y ayuda a la red a aprender y mejorar su precisión. Es obvio que si las actualizaciones de los pesos no se realizan porque el gradiente negativo se acerca a cero, el aprendizaje se ha detenido. ¡Esto no implica necesariamente que hayamos alcanzado el mínimo! Porque nuestra función de costos es muy complicada y necesitamos encontrar un mínimo en un espacio multidimensional. Por lo tanto, podría haber muchos mínimos locales donde el gradiente sea cero y la red deje de aprender. De todos modos, no tenemos que preocuparnos por eso por este problema.
Veamos la siguiente expresión:
Esta expresión define z_i como una suma ponderada de las entradas x_ji. Tenga en cuenta que estas entradas son las neuronas verdes de nuestra arquitectura. Como no tenemos una capa oculta, combinamos las entradas x_ji y los pesos w_j y agregamos un término de sesgo para obtener z_i, que es lo que está representado por las flechas que conectan las neuronas verdes con la neurona roja en nuestra arquitectura. Como tenemos q entradas, tenemos x_j y w_j donde j = 1 a q
Pero no pasamos z_i a la neurona roja. Le aplicamos una “función de activación”. Esta función de activación puede ser diferente para diferentes redes neuronales. Para los propósitos de este problema, asumimos que la función de activación es "sigmoidea" o "logística". Asumiré aquí que el lector conoce esta función y continuaré.
Luego viene nuestro principal planteamiento del problema: ¿Cómo definimos la función Costo (C)? Es bien sabido que para la clasificación binaria, la función de costo es "entropía cruzada", pero la pregunta aquí es por qué no puede ser "cuadrática".
Definamos las expresiones de ambas funciones de costos:
Función de costo cuadrática – Función de costo de entropía cruzada –
Si bien la función de costo cuadrático es sencilla (piense en la minimización de mínimos cuadrados entre la salida real y_i y la salida prevista a_i), podemos ofrecer alguna explicación para la función de costo de entropía cruzada. Esto es similar a la probabilidad logarítmica negativa en nuestros modelos de regresión. Tenga en cuenta que hay un signo negativo fuera de los corchetes, que se utiliza para mantener el costo positivo (porque a_i estará entre 0 y 1, una salida de sigmoide, por lo tanto, el término dentro de los corchetes siempre será negativo). También tenga en cuenta que cuando a_i se acerca mucho a y_i, el costo se acerca mucho a cero. Esto se debe a que, cuando y_i = 1 y a_i ~ 1, ln(a_i) será aproximadamente 0. De manera similar, cuando y_i= 0 y a_i ~ 0, ln(1-a_i) será aproximadamente 0. Por lo tanto, esta función mantiene la El costo es positivo y mínimo cuando el modelo predice bien. Sin embargo, lo mismo puede decirse de la función de costes cuadrática. Pero no lo usamos. ¿Por qué? Aquí viene la explicación.
Volvemos a la ecuación básica de actualización de peso que vimos anteriormente y le ingresamos la función de costo cuadrática. Obtenemos lo siguiente
Ahora, para simplificar las cosas, consideraremos solo un punto de datos, es decir, i=1 y n=1. Y diferenciamos parcialmente para cada peso w_j. Obtenemos lo siguiente:
Recuerde que como i = 1, tenemos
Sustituyendo el valor de z, obtenemos
Ese es nuestro vector de gradiente que se encarga de actualizar los pesos de la red y tendrá una derivada de la función sigmoidea cuando usemos una función de costo cuadrática.
Ahora veamos el comportamiento de la derivada de la función sigmoidea:
Del gráfico anterior, queda claro que la derivada, que representa la pendiente de la función sigmoidea, se aproxima a 0 tan pronto como la entrada z se vuelve grande. ¿Qué quiere decir esto? Esto significa que el vector gradiente será cero cuando la entrada de activación z sea grande. Por lo tanto, la red dejará de aprender ya que los pesos no se actualizarán. Recordemos que esto no significa que hayamos llegado a un mínimo. Esto significa que estamos atrapados en un punto indeseable y en el espacio funcional que podría estar lejos del valor mínimo. Esto se conoce como “ralentización del aprendizaje”. Sin embargo, esto NO ocurre con una función de costo de entropía cruzada.
Realizamos la misma sustitución usando la función de costo de entropía cruzada y obtenemos lo siguiente:
Es interesante notar que el término:
También ocurre en el gradiente del costo cuadrático. Sin embargo, hay un truco que usaremos para simplificarlo. El gradiente de la función sigmoidea se puede expresar de la siguiente manera
Sustituimos eso en nuestra expresión original y obtenemos lo siguiente:
Ese es nuestro vector de gradiente que se encarga de actualizar los pesos de la red y no tiene una derivada de la función sigmoidea cuando usamos una función de costo de entropía cruzada. Por tanto, no hay ninguna desaceleración en el aprendizaje con esta función de costos.
Yuxtaponemos los degradados nuevamente para verlo mejor:
Esto responde a nuestra pregunta original: no utilizamos la función de costo cuadrático porque conduce a una desaceleración del aprendizaje.
Tenga en cuenta que el análisis anterior se realizó solo en la capa de salida (de una neurona); sin embargo, ¡también se puede generalizar para una red neuronal general!