INTRODUCCIÓN

Antes de empezar, definiremos qué es una función de activación para una mejor comprensión.

¿Qué es una función de activación?

Las funciones de activación son un componente integral de las redes neuronales que les permite aprender patrones complejos en los datos. Transforman la señal de entrada de un nodo de una red neuronal en una señal de salida que pasa a la capa siguiente. Sin funciones de activación, las redes neuronales se limitarían a modelar únicamente relaciones lineales entre entradas y salidas.

TIPOS DE FUNCIONES DE ACTIVACIÓN

En este trabajo exploraremos cinco tipos diferentes de funciones de activación:

1. Función de paso binario

La función de paso binario se define matemáticamente como:

\[ f(x) = \begin{cases} 0 & \text{si } x < 0 \\ 1 & \text{si } x \geq 0 \end{cases} \]

Su gráfica es la siguiente:

Funcion12 <- function(x){
  ifelse(x < 0, 0, 1)
}

curve(Funcion12, from = -10, to = 10,
      col = "steelblue",
      lwd = 2,
      ylab = expression(f(x)), xaxt = "n",
      main = "Función Paso Binario",
      type = "s")

axis(1, at=seq(-10, 10, by=2.5))

grid()

Es la función de activación basada en umbral más simple, que funciona activando el nodo, es decir, pasando su salida a la siguiente capa en caso de que se supere el valor del umbral, o no haciendo nada en absoluto. Si el valor de entrada del nodo es menor que 0, devuelve 0 como salida. De lo contrario, devuelve 1. Generalmente no se recomienda utilizar paso binario en la capa oculta, ya que es una función lineal por partes incapaz de manejar representaciones complejas.

La derivada es la siguiente:

\[ f'(x) = 0 \]

para \(x \neq 0\). Ya que en ese punto se presenta una discontinuidad.

Su gráfica es la siguiente:

Funcion13 <- function(x){
  ifelse(x == 0, NA, 0)
}

curve(Funcion13, from = -10, to = 10,
      col = "steelblue",
      lwd = 2,
      ylab = expression(f(x)), xaxt = "n",
      main = "Derivada de la Función Paso Binario",
      type = "s")

axis(1, at=seq(-10, 10, by=2.5))

grid()

La derivada de la función paso binario es cero para todos los valores de entrada, salvo en el punto de discontinuidad.


2. La función sigmoidal (\(\sigma\))

La función sigmoidal se define como:

\[ \sigma(x) = \frac{1}{1 + e^{-x}} \] Su gráfica es la siguiente:

#Primero creamos una función justamente con la de nuestro interés
Funcion <- function(x){
  1 / (1 + exp(-x)) 
}

#Gráfico
curve(Funcion, from = -10, to = 10,
      col = "steelblue" , #El color de la línea
      lwd = 2, #Grosor
      ylab = expression(sigma(x)), xaxt = "n", #EL primero hace que se puede escribir en latex el eje y y el segundo hace que no se escriba nada en el eje x.
      main = "Función Sigmoidal" #Escribe el título de la función
      )

axis(1, at=seq(-10, 10, by=2.5)) #Definimos el eje de las abscisas aparte.

grid() #Añadimos la cuadrícula.

Esta función de activación toma cualquier rango de valores a la entrada y los mapea al rango de 0 a 1 a la salida. En la actualidad tiene un uso limitado, y realmente su principal aplicación es la clasificación binaria. Es especialmente útil para tareas de clasificación o predicción de probabilidad, ya que puede implementarse en el entrenamiento de redes de visión artificial y aprendizaje profundo.

La derivada de la función sigmoide es la siguiente:

\[ \sigma'(x) = \frac{e^x}{(1+e^{x})^2} \] La gráfica es la siguiente:

#Primero creamos una función justamente con la de nuestro interés
Funcion2 <- function(x){
  exp(x) / ((1 + exp(x)^2)) 
}

#Gráfico
curve(Funcion2, from = -10, to = 10,
      col = "steelblue" , #El color de la línea
      lwd = 2, #Grosor
      ylab = expression(sigma(x)), xaxt = "n", #EL primero hace que se puede escribir en latex el eje y y el segundo hace que no se escriba nada en el eje x.
      main = "Derivada de la Función Sigmoidal" #Escribe el título de la función
      )

axis(1, at=seq(-10, 10, by=2.5)) #Definimos el eje de las abscisas aparte.

grid() #Añadimos la cuadrícula.

La gráfica muestra cómo la derivada de la función sigmoidal alcanza su valor máximo en \(x = 0\) y disminuye rápidamente hacia los extremos.


3. La función tangente hiperbólica (tanh)

La función tangente hiperbólica, conocida como tanh, se define como:

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

Su gráfica es la siguiente:

#Primero creamos una función justamente con la de nuestro interés
Funcion3 <- function(x){
  (exp(x) - exp(-x)) / (exp(x) + exp(-x)) 
}

#Gráfico
curve(Funcion3, from = -10, to = 10,
      col = "steelblue" , #El color de la línea
      lwd = 2, #Grosor
      ylab = expression(tahn(x)), xaxt = "n", #EL primero hace que se puede escribir en latex el eje y y el segundo hace que no se escriba nada en el eje x.
      main = "Función Tangente Hiperbólica" #Escribe el título de la función
      )

axis(1, at=seq(-10, 10, by=2.5)) #Definimos el eje de las abscisas aparte.

grid() #Añadimos la cuadrícula.

Esta función presenta un comportamiento muy similar al de la sigmoidal, con la diferencia de que sus valores de salida se encuentran en el rango de -1 a 1. Su principal característica es que la salida está centrada en cero, lo que implica que las entradas negativas se transforman en salidas negativas y las entradas positivas en salidas positivas. Por esta razón, suele emplearse con frecuencia en las capas ocultas de redes neuronales. Además, dado que su salida está centrada, cuando los datos de entrada también se normalizan para tener media cero, puede favorecer un entrenamiento más rápido y estable.

A continuación, se muestra la derivada de la función tangente hiperbólica:

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

La gráfica es la siguiente:

#Primero creamos una función justamente con la de nuestro interés
Funcion4 <- function(x){
  4 * exp(2*x) / ((exp(2*x) + 1)^2) 
}

#Gráfico
curve(Funcion4, from = -10, to = 10,
      col = "steelblue" , #El color de la línea
      lwd = 2, #Grosor
      ylab = expression(tahn(x)), xaxt = "n", #EL primero hace que se puede escribir en latex el eje y y el segundo hace que no se escriba nada en el eje x.
      main = "Derivada de la Función Tangente Hiperbólica" #Escribe el título de la función
      )

axis(1, at=seq(-10, 10, by=2.5)) #Definimos el eje de las abscisas aparte.

grid() #Añadimos la cuadrícula.

De manera semejante, observamos que la derivada de \(tanh(x)\), es máxima en \(x = 0\) y tiende a cero a medida que \(|x|\) crece.


4. Función de Unidad Lineal Rectificada (ReLU)

La función unidad lineal rectificada, conocida como ReLU (Rectified Linear Unit), se define de la siguiente manera:

\[ f(x) = max(0,x) \]

Otra forma equivalente de expresarla es mediante una función a trozos, que muestra de manera explícita su comportamiento para valores positivos y negativos de \(x\):

\[ R(x) = \begin{cases} x & \text{si } x \geq 0 \\ 0 & \text{si } x < 0 \end{cases} \]

Su gráfica es la siguiente:

#Primero creamos una función justamente con la de nuestro interés
Funcion5 <- function(x){
  ifelse(x < 0, 0, x)
}

#Gráfico
curve(Funcion5, from = -10, to = 10,
      col = "steelblue" , #El color de la línea
      lwd = 2, #Grosor
      ylab = expression(ReLU(x)), xaxt = "n", #EL primero hace que se puede escribir en latex el eje y y el segundo hace que no se escriba nada en el eje x.
      main = "Función ReLU" #Escribe el título de la función
      )

axis(1, at=seq(-10, 10, by=2.5)) #Definimos el eje de las abscisas aparte.

grid() #Añadimos la cuadrícula.

La función ReLU ayuda a mitigar el problema de la saturación de gradiente cuando los valores de la combinación lineal de la entrada son mayores a 0 permitiendo una propagación hacia atrás efectiva incluso en redes profundas. Es más fácil de implementar computacionalmente en comparación con las otras dos funciones (sigmoidal y tanh), que requieren el cálculo de funciones matemáticas más complejas como la exponencial.

La derivada de esta función es:

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

No se tiene en cuenta el punto \(x = 0\) debido a que no es diferenciable cuando \(x\) toma el valor de \(0\).

La gráfica es la siguiente:

#Primero creamos una función justamente con la de nuestro interés
Funcion6 <- function(x){
  ifelse(x == 0, NA, ifelse(x > 0, 1, 0))
}

#Gráfico
curve(Funcion6, from = -10, to = 10,
      type = "s", #Para que se sepa que clase de función es.
      col = "steelblue" , #El color de la línea
      lwd = 2, #Grosor
      ylab = expression(ReLU(x)), xaxt = "n", #EL primero hace que se puede escribir en latex el eje y y el segundo hace que no se escriba nada en el eje x.
      main = "Derivada de la Función ReLU" #Escribe el título de la función
      )

axis(1, at=seq(-10, 10, by=2.5)) #Definimos el eje de las abscisas aparte.

grid() #Añadimos la cuadrícula.

# Añadimos los circulitos para x=0
points(0, 0, pch = 21, bg = "white", cex=1.5)  # círculo abierto en (0,0)
points(0, 1, pch = 21, bg = "steelblue", cex=1.5)  # círculo abierto en (0,1)

La gráfica muestra que la derivada de la función ReLU es cero para valores negativos de \(x\) y \(1\) para valores positivos de \(x\). En \(x = 0\), la derivada no está definida, lo que se refleja como un salto en la gráfica.


5. La función Softplus

La función Softplus se define como:

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

La gráfica es la siguiente:

#Primero creamos una función justamente con la de nuestro interés
Funcion10 <- function(x){
  log(1 + exp(x))
}

#Gráfico
curve(Funcion10, from = -10, to = 10,
      col = "steelblue" , #El color de la línea
      lwd = 2, #Grosor
      ylab = expression(softplus(x)), xaxt = "n", #EL primero hace que se puede escribir en latex el eje y y el segundo hace que no se escriba nada en el eje x.
      main = "Función Softplus" #Escribe el título de la función
      )

axis(1, at=seq(-10, 10, by=2.5)) #Definimos el eje de las abscisas aparte.

grid() #Añadimos la cuadrícula.

La función Softplus es una aproximación suave de la función ReLU. Tiene las siguientes características:

  • La salida es siempre positiva.
  • La función aumenta suavemente y siempre es diferenciable, a diferencia de ReLU, que tiene un punto culminante en cero.
  • Para entradas negativas, la función se acerca a cero, pero a diferencia de ReLU, nunca llega exactamente a cero, evitando el problema de las “neuronas moribundas”(es cuando algunas neuronas dejan de activarse y de actualizarse durante el entrenamiento).

Luego, la derivada de la función sigmoide es la siguiente:

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

Note que la expresión de arriba es equivalente a:

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

Que es justamente la función sigmoidal (\(\sigma\)).

Su gráfica es la siguiente:

#Primero creamos una función justamente con la de nuestro interés
Funcion11 <- function(x){
  exp(x) / (1 + exp(x)) 
}

#Gráfico
curve(Funcion11, from = -10, to = 10,
      col = "steelblue" , #El color de la línea
      lwd = 2, #Grosor
      ylab = expression(softplus(x)), xaxt = "n", #EL primero hace que se puede escribir en latex el eje y y el segundo hace que no se escriba nada en el eje x.
      main = "Derivada de la función Softplus" #Escribe el título de la función
      )

axis(1, at=seq(-10, 10, by=2.5)) #Definimos el eje de las abscisas aparte.

grid() #Añadimos la cuadrícula.

La gráfica muestra cómo la derivada de la función Softplus coincide con la función sigmoidea. Se observa que alrededor de \(x = 0\) alcanza su pendiente más pronunciada (cercana a 0.5) y, a medida que \(x\) crece, tiende a acercarse a \(1\), mientras que para valores muy negativas tiende a \(0\).


Referencias

1. ENCORD. Funciones de activación en redes neuronales: con 15 ejemplos. Recuperado de: 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. Codecademy. AI Binary Step Activation Function. Recuperado de: https://www.codecademy.com/resources/docs/ai/neural-networks/binary-step-activation-function

3. GeeksForGeeks. Sigmoid Function. Recuperado de: https://www.geeksforgeeks.org/machine-learning/derivative-of-the-sigmoid-function/

4. GeeksForGeeks. Tanh vs. Sigmoid vs. ReLU. Recuperado de: https://www.geeksforgeeks.org/deep-learning/tanh-vs-sigmoid-vs-relu/

5. GeeksForGeeks. Softplus Function in Neural Network. Recuperado de: https://www.geeksforgeeks.org/deep-learning/softplus-function-in-neural-network/

6. Ultralytics. Fugas ReLU. https://www.ultralytics.com/es/glossary/leaky-relu

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