Entendiendo las funciones de activación en las redes neuronales
Avinash Sharma V
Sigue
Mar 30, 2017 – 10 min read
Recientemente, un compañero me hizo algunas preguntas como «¿por qué tenemos tantas funciones de activación?», «¿por qué es que una funciona mejor que la otra?», «¿cómo sabemos cuál usar?», «¿es matemática dura?» y así sucesivamente. Así que pensé, ¿por qué no escribir un artículo sobre él para aquellos que están familiarizados con la red neuronal sólo en un nivel básico y es, por tanto, preguntando acerca de las funciones de activación y su «por qué-cómo-matemáticas!».
NOTA: Este artículo asume que usted tiene un conocimiento básico de una «neurona» artificial. Recomendaría leer los fundamentos de las redes neuronales antes de leer este artículo para una mejor comprensión.
Funciones de activación
¿Entonces qué hace una neurona artificial? Sencillamente, calcula una «suma ponderada» de su entrada, añade un sesgo y luego decide si debe «dispararse» o no ( sí, claro, esto lo hace una función de activación, pero sigamos la corriente por un momento).
Así que considera una neurona.
Ahora, el valor de Y puede ser cualquier cosa desde -inf hasta +inf. La neurona realmente no conoce los límites del valor. Entonces, ¿cómo decidimos si la neurona debe disparar o no ( por qué este patrón de disparo? Porque lo aprendimos de la biología que es la forma en que el cerebro funciona y el cerebro es un testimonio de trabajo de un sistema impresionante e inteligente ).
Decidimos añadir «funciones de activación» para este propósito. Para comprobar el valor Y producido por una neurona y decidir si las conexiones externas deben considerar esta neurona como «disparada» o no. O mejor digamos – «activada» o no.
Función de paso
Lo primero que se nos ocurre es ¿qué tal una función de activación basada en el umbral? Si el valor de Y está por encima de un determinado valor, declararlo activado. Si es menor que el umbral, entonces di que no lo está. Hmm genial. Esto podría funcionar!
Función de activación A = «activado» si Y > umbral sino no
Alternativamente, A = 1 si y umbral, 0 en caso contrario
Bueno, lo que acabamos de hacer es una «función escalonada», ver la siguiente figura.
Su salida es 1 («activado») cuando el valor > 0 (umbral) y emite un 0 («no activado») en caso contrario.
Genial. Así que esto hace una función de activación para una neurona. No hay confusiones. Sin embargo, hay ciertos inconvenientes con esto. Para entenderlo mejor, piensa en lo siguiente.
Supón que estás creando un clasificador binario. Algo que debe decir un «sí» o un «no» ( activar o no activar ). ¡Una función Step podría hacer eso por ti! Eso es exactamente lo que hace, decir un 1 o un 0. Ahora, piense en el caso de uso en el que usted querría que múltiples neuronas de este tipo se conectaran para traer más clases. Clase1, clase2, clase3, etc. ¿Qué ocurrirá si se «activa» más de una neurona? Todas las neuronas emitirán un 1 (de la función de paso). ¿Ahora qué decidirías? ¿De qué clase se trata? Hmm difícil, complicado.
Querrías que la red activara sólo 1 neurona y las demás fueran 0 ( sólo así podrías decir que clasificó correctamente/identificó la clase ). Ah! Esto es más difícil de entrenar y converger de esta manera. Hubiera sido mejor que la activación no fuera binaria y que dijera «50% activado» o «20% activado» y así sucesivamente. ¡Y entonces si se activa más de 1 neurona, se podría encontrar qué neurona tiene la «mayor activación» y así sucesivamente ( mejor que max, un softmax, pero dejémoslo por ahora).
En este caso también, si más de 1 neurona dice «100% activado», el problema sigue persistiendo.Lo sé! Pero … ya que hay valores intermedios de activación para la salida, el aprendizaje puede ser más suave y más fácil ( menos wiggly ) y las posibilidades de más de 1 neurona de ser 100% activado es menor en comparación con la función de paso mientras que la formación ( también dependiendo de lo que usted está entrenando y los datos ).
Ok, así que queremos algo para darnos intermedio ( analógico ) valores de activación en lugar de decir «activado» o no ( binario ).
Lo primero que nos viene a la cabeza sería la función lineal.
Función lineal
A = cx
Una función rectilínea donde la activación es proporcional a la entrada ( que es la suma ponderada desde la neurona ).
De esta forma, da un rango de activaciones, por lo que no es una activación binaria. Definitivamente podemos conectar algunas neuronas juntas y si más de 1 se dispara, podríamos tomar el máximo ( o softmax) y decidir en base a eso. Así que eso también está bien. Entonces, ¿cuál es el problema con esto?
Si estás familiarizado con el descenso de gradiente para el entrenamiento, te darás cuenta de que para esta función, la derivada es una constante.
A = cx, la derivada con respecto a x es c. Eso significa, que el gradiente no tiene ninguna relación con X. Es un gradiente constante y el descenso va a ser en gradiente constante. Si hay un error en la predicción, los cambios realizados por la retropropagación son constantes y no dependen del cambio en la entrada delta(x) !!!
¡Esto no es tan bueno! ( no siempre, pero tenedme en cuenta ). También hay otro problema. Piensa en capas conectadas. Cada capa es activada por una función lineal. Esa activación a su vez pasa al siguiente nivel como entrada y la segunda capa calcula la suma ponderada sobre esa entrada y ésta a su vez, se dispara en base a otra función de activación lineal.
¡No importa cuántas capas tengamos, si todas son de naturaleza lineal, la función de activación final de la última capa no es más que una función lineal de la entrada de la primera capa! Párate un poco y piénsalo.
Eso significa que estas dos capas ( o N capas ) pueden ser sustituidas por una sola capa. ¡Ah! Acabamos de perder la capacidad de apilar capas de esta manera. No importa cómo apilemos, toda la red sigue siendo equivalente a una sola capa con activación lineal ( una combinación de funciones lineales de forma lineal sigue siendo otra función lineal ).