Introducción

Las redes neuronales son modelos computacionales inspirados en el cerebro humano, diseñados para aprender patrones complejos a partir de datos. Sin embargo, dado que estos patrones suelen ser no lineales, las redes requieren un componente esencial: las funciones de activación. Estas funciones transforman no linealmente la señal de entrada en una salida procesada, permitiendo modelar relaciones complejas entre capas. Sin ellas, las redes se limitarían a combinaciones lineales, incapaces de capturar patrones en procesamiento de imágenes, lenguaje o predicciones financieras. A continuación se presentan 5 funciones de activación y sus respectivas derivadas.

1. Función de paso binario

\[ \text{H}(x) = \begin{cases} 0 & \text{si } x < \theta, \\ 1 & \text{si } x \geq \theta. \end{cases} \]

donde \(\theta\) es el umbral de activación, usalmente \(\theta=0\).

#Se define la función
funcion_paso_binario<-function(x, theta=0) {ifelse(x>theta, 1, ifelse(x<theta, 0, NA))}

#Se grafica con curve
curve(funcion_paso_binario, from = -10, to = 10, col = "#1874CD", lwd = 2, xlab="x", ylab="H(x)")

points(0, 0, pch = 21, bg = "white", col = "#1874CD", cex = 1.5)  # Bola abierta
points(0, 1, pch = 19, col = "#1874CD", cex = 1.5) # Bola cerrada

1.1 Derivada de la función de paso binario:

\[ H'(x)= 0 \quad \forall x \neq \theta \]

Debido a que hay una discontinuidad en x=\(\theta\), que en este caso es igual a 0, la derivada no existe en este punto.

#Se define la función
derivada_funcion_paso_binario<-function(x, theta=0) {ifelse(x!=theta,0,NA)}

#Se grafica con curve
curve(derivada_funcion_paso_binario, from = -10, to = 10, col = "#1874CD", lwd = 2, xlab="x", ylab="H'(x)")


points(0, 0, pch = 21, bg = "white", col = "#1874CD", cex = 1.5)  # Bola abierta

La función de paso binario es una función de activación simple, pero fundamental en las primeras redes neuronales bastante simples. Toma una entrada real y a partir de un umbral, activa una neurona (\(H(x)=1\)) si la entrada supera el umbral y la desactiva (\(H(x)=0\)) en caso contrario. Con esto en mente, esta función es útil en modelos discretos como redes neuronales binarias o en sistemas de control basados en umbrales. No obstante, su limitación principal es que no es diferenciable en \(x = \theta\) y la derivada es 0 en todos los demás puntos, por tanto no es posible usar el backpropagation para el ajuste de pesos, lo que la hace inviable en redes profundas modernas.

2. Función sigmoide

\[ σ(x)= \frac{1}{1+e^{-x}} \]

#Se define la función
funcion_sigmoide<-function(x) {1/(1+exp(-x))}

#Se grafica con curve
curve(funcion_sigmoide, from = -10, to = 10, col = "#1874CD", lwd = 2, xlab="x", ylab="σ(x)")

2.1 Derivada de la función sigmoide:

\[ σ'(x)= \frac{e^{-x}}{(1+e^{-x})^2} \]

#Se define la función
derivada_funcion_sigmoide<-function(x) {exp(-x)/(1+exp(-x))^2}

#Se grafica con curve
curve(derivada_funcion_sigmoide, from = -10, to = 10, col = "#1874CD", lwd = 2, xlab="x", ylab="σ'(x)")

La función sigmoide tiene una curva en forma de S, es una función suave y diferenciable en todos \(\rm I\! R\) que transforma cualquier valor real en un rango entre 0 y 1 (\(σ(x) \in\) (0,1) \(\forall x \in \rm I\! R\)), lo que la hace ideal para modelar probabilidades en problemas de clasificación binaria. Las entradas más grandes y positivas producen valores cercanos a 1, mientras que las más pequeñas y negativas producen valores cercanos a 0, lo que ocurre también con su derivada, pues note que su valor máximo es igual a 0.25 en \(x=0\), pero para valores en los extremos sus salidas son próximas a 0, por lo que durante el backpropagation en las capas iniciales los pesos de los nodos son casi 0, lo que estanca el aprendizaje, esto es lo que se conoce como el problema de desvanecimiento del gradiente.

3. Función tangente hiperbólica

\[ \tanh(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} \]

#Se define la función
funcion_tanh<-function(x) {(exp(x)-exp(-x))/(exp(x)+exp(-x))}

#Se grafica con curve
curve(funcion_tanh, from = -10, to = 10, col = "#1874CD", lwd = 2, xlab="x", ylab="tanh(x)")

3.1 Derivada de la función tangente hiperbólica:

\[ \tanh'(x)= \frac{4}{(e^{x}+e^{-x})^2} \]

#Se define la función
derivada_funcion_tanh<-function(x) {4/(exp(x)+exp(-x))^2}

#Se grafica con curve
curve(derivada_funcion_tanh, from = -10, to = 10, col = "#1874CD", lwd = 2, xlab="x", ylab="tanh'(x)")

La función tangente hiperbólica es una función suave e inifnitamente diferenciable en todo \(\rm I\! R\) que transforma cualquier valor real en un rango entre -1 y 1, es decir \(\tanh(x)\) \(\in\) (-1,1) \(\forall x \in \rm I\! R\). Está centrada en cero y su resultado es simétrico alrededor del origen, es decir es una función impar. Lo anterior ayuda a representar salidas negativas, neutras o positivas lo que es preferible en problemas donde los datos están centrados en 0. En comparación con la sigmoide, esta propiedad implica una mayor diversidad en los signos de las derivadas parciales durante el backpropagation, por tanto hay una mayor flexibilidad y eficiencia en el aprendizaje. A pesar de que la derivada máxima vale 1 en \(x=0\), al igual que la sigmoide, se aproxima a cero para valores extremos, lo que también puede provocar el problema de desvanecimiento del gradiente en capas iniciales.

4. Unidad lineal rectificada (ReLU)

\[ \text{ReLU}(x) = \max(0, x) = \begin{cases} 0 & \text{si } x \leq 0, \\ x & \text{si } x > 0. \end{cases} \]

#Se define la función
ReLU<-function(x) {pmax(0,x)}

#Se grafica con curve
curve(ReLU, from = -10, to = 10, col = "#1874CD", lwd = 2, xlab="x", ylab="ReLU(x)")

4.1 Derivada de ReLU:

\[ \text{ReLU}'(x) = \begin{cases} 0 & \text{si } x < 0, \\ 1 & \text{si } x > 0. \end{cases} \]

En x=0 hay un punto esquinoso, por tanto la derivada no existe en este punto.

#Se define la función
derivada_ReLU <- function(x) {ifelse(x > 0, 1, ifelse(x < 0, 0, NA))}

#Se grafica con curve
curve(derivada_ReLU, from = -10, to = 10, col = "#1874CD", lwd = 2, xlab="x", ylab="ReLU'(x)")

#bolas abierts
points(0, 0, pch = 21, bg = "white", col = "#1874CD", cex = 1.5)  
points(0, 1, pch = 21, bg = "white", col = "#1874CD", cex = 1.5)  

La función ReLU transforma cualquier valor real en un número mayor o igual a 0. Es una de las más importantes funciones de activación en redes neuronales por su eficiencia computacional, pues además de tener operaciones simples, en algunas situaciones donde los valores negativos representan ruido o características menos importantes, la activación dispersa es lo ideal, ya que solo las neuronas relevantes procesan la información y se reduce la carga computacional. Por otro lado, a diferencia de la función sigmoide y tangente hiperbólica, ReLU mitiga el problema del desvanecimiento del gradiente, puesto que, a pesar de que su derivada sea indefinida en 0, para las neuronas activas su derivada es 1, lo que permite un flujo constante de gradientes y acelera el entrenamiento, dado que no se estanca y es ideal para las capas ocultas en redes neuronales profundas. No obstante, para las neuronas con entradas siempre negativas está el problema de las neuronas muertas, dado que dejan de aprender y se puede perder información valiosa dependiendo del problema.

5. Función Softplus

\[ \text{softplus}(x) = \ln(1+e^{x})\]

#Se define la función
funcion_softplus<-function(x) {log(1+exp(x))}

#Se grafica con curve
curve(funcion_softplus, from = -10, to = 10, col = "#1874CD", lwd = 2, xlab="x", ylab="softplus(x)")

5.1 Derivada de la función Softplus:

\[ \text{softplus}'(x)= \frac{e^x}{1+e^x} \]

#Se define la función
derivada_funcion_softplus<-function(x) {exp(x)/(1+ exp(x))}

#Se grafica con curve
curve(derivada_funcion_softplus, from = -10, to = 10, col = "#1874CD", lwd = 2, xlab="x", ylab="softplus'(x)")

La función Softplus transforma entradas reales a un rango de salida (0, +\(\infty\)). A diferencia de ReLU, Softplus es infinitamente diferenciable en todo su dominio, por lo que es preferible en contextos donde la diferenciabilidad es importante. Note que su derivada coinicide con la función sigmoide y tiene un comportamiento asintótico, pues tiene un rango (0,1) \(\forall x \in \rm I\! R\), lo que evita el problema de las neuronas muertas que ocurre en ReLU, puesto que la función y su derivada nunca se anulan. Sin embargo, su cálculo implica operaciones exponenciales y logarítmicas, lo que la hace más costosa computacionalmente y lenta que ReLU. Finalmente, aunque su derivada nunca es 0, en valores negativos extremos la derivada es muy pequeña, lo que puede estancar o ralentizar el aprendizaje.

Bibliografía

  1. Buhl, N. (2023, 17 octubre). Activation Functions in Neural Networks: With 15 examples. https://encord-com.translate.goog/blog/activation-functions-neural-networks/?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es&_x_tr_pto=tc

  2. DataCamp. (s.f.). Introducción a las funciones de activación en redes neuronales. https://www.datacamp.com/es/tutorial/introduction-to-activation-functions-in-neural-networks

  3. Redes neuronales: Funciones de activación. (s.f.). Google For Developers. https://developers.google.com/machine-learning/crash-course/neural-networks/activation-functions?hl=es-419

  4. Vicente, F. R. (2023, 29 junio). Las matemáticas del Machine Learning: Funciones de activación. Telefónica Tech. https://telefonicatech.com/blog/las-matematicas-del-machine-learning-funciones-de-activacion