María Carolina Cantillo
03-08-2025
Las funciones de activación son esenciales en el campo de estudio relacionado con las redes neuronales, estas les permite aprender patrones complejos en conjuntos de datos.
Dichas funciones se encargan de transformar 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 ellas, las redes neuronales se limitarían a modelar únicamente relaciones lineales entre entradas y salidas. Es decir, las funciones de activación introducen no linealidades (la mayoría de los datos del mundo real son no lineales), lo que permite a las redes neuronales aprender mapeos muy complejos y de gran utilidad.
La función de activación sigmoide, a menudo representada como σ(x), es una función infinitamente diferenciable históricamente importante en el desarrollo de las redes neuronales. La función de activación sigmoide tiene la forma matemática:
Función (sigmoide):
\[f(x) = \frac{1}{1 + e^{-x}}\]
sigmoid <- function(x) 1 / (1 + exp(-x))
curve(sigmoid, from = -10, to = 10, col = "lightblue", lwd = 2,
ylab = "Sigmoid(x)", main = "Función Sigmoide")
abline(h = 0.5, lty = 2, col = "gray")
Derivada (sigmoide):
\[f'(x) = f(x)(1 - f(x))\]
sigmoid_deriv <- function(x) {
s <- sigmoid(x)
s * (1 - s)
}
curve(sigmoid_deriv, from = -10, to = 10, col = "darkblue", lwd = 2,
ylab = "Sigmoid'(x)", main = "Derivada de la función Sigmoide")
abline(h = 0, v = 0, lty = 2, col = "gray")
Las unidades sigmoides fueron ampliamente usadas en las primeras redes neuronales por su capacidad de facilitar el entrenamiento mediante retropropagación, especialmente cuando la salida está cerca de 0.5. Sin embargo, presentan un problema crítico: el desvanecimiento del gradiente.
Cuando la entrada toma valores muy altos o bajos, la función se satura en 0 o 1 y su pendiente se vuelve casi nula, haciendo que los gradientes sean muy pequeños. Esto ralentiza o detiene el aprendizaje en las capas iniciales de redes profundas.
Actualmente, su uso principal es en la capa de salida de modelos de clasificación binaria, ya que transforma la salida en una probabilidad entre 0 y 1.
La función de activación de tangente hiperbólica (tanh) se define como:
Función (tanh):
\[f(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}\]
curve(tanh, from = -10, to = 10, col = "purple", lwd = 2,
ylab = "tanh(x)", main = "Función Tanh")
abline(h = 0, v = 0, lty = 2, col = "gray")
Derivada (tanh):
\[f'(x) = 1 - f(x)^2\]
tanh_deriv <- function(x) 1 - tanh(x)^2
curve(tanh_deriv, from = -10, to = 10, col = "orange", lwd = 2,
ylab = "tanh'(x)", main = "Derivada de la función Tanh")
abline(h = 0, v = 0, lty = 2, col = "gray")
Sus valores oscilan entre -1 y +1, lo que le permite manejar mejor datos negativos en comparación con la sigmoide (0 a 1). A diferencia de esta última, tanh está centrada en cero, lo que favorece una convergencia más rápida durante el entrenamiento.
Otra ventaja es que sus gradientes son más fuertes, lo que ayuda a mitigar el problema del desvanecimiento del gradiente en redes no muy profundas. Sin embargo, tanh también puede sufrir este problema en redes profundas, dificultando la actualización de los pesos en capas iniciales.
Es común utilizar tanh en capas ocultas, especialmente cuando los datos están normalizados con media cero. En general, tanh suele preferirse sobre la sigmoide, salvo que el caso de uso indique lo contrario.
La función de activación de unidad lineal rectificada (ReLU) tiene la forma:
Función (ReLU):
f(x) = max(0, x)
relu <- function(x) ifelse(x > 0, x, 0)
curve(relu, from = -10, to = 10, col = "purple", lwd = 2,
ylab = "ReLU(x)", main = "Función ReLU")
abline(h = 0, v = 0, lty = 2, col = "gray")
Derivada (ReLU):
\[f'(x) = \begin{cases} 0, \text{ si } x < 0 \\ 1, \text{ si } x > 0 \end{cases}\]
relu_deriv <- function(x) ifelse(x > 0, 1, 0)
curve(relu_deriv, from = -10, to = 10, col = "darkgreen", lwd = 2,
ylab = "ReLU'(x)", main = "Derivada de la función ReLU")
abline(h = 0, v = 0, lty = 2, col = "gray")
La función ReLU devuelve 0 para entradas negativas y la propia entrada para valores positivos. Para valores mayores que cero, actúa como una función lineal con pendiente 1, lo que permite que el gradiente fluya sin alteraciones, ayudando a evitar el desvanecimiento del gradiente.
Aunque es lineal en parte de su dominio, ReLU es no lineal debido al punto no diferenciable en x = 0, lo que la hace útil para aprender patrones complejos. También genera activaciones dispersas, ya que muchas salidas pueden ser cero, lo que mejora la eficiencia computacional.
Es muy eficiente en cálculo, pues solo requiere una comparación con cero, lo que la hace ideal para redes profundas en comparación con funciones como sigmoide o tanh.
La función de activación softmax, también conocida como función exponencial normalizada, es especialmente útil en el contexto de los problemas de clasificación multiclase. Esta función opera sobre un vector, a menudo denominado logits, que representa las previsiones o las puntuaciones brutas de cada clase calculadas por las capas anteriores de una red neuronal.
Para un vector de entrada x con elementos x1, x2, …, xC, la función softmax se define como:
Función (softmax):
\[f(x_i) = \frac{e^{x_i}}{\sum_j e^{x_j}}\]
x <- seq(-5, 5, length.out = 300)
softmax_batch <- function(x) {
sapply(x, function(xi) {
input <- c(xi, 0, -xi)
exp_input <- exp(input - max(input))
exp_input / sum(exp_input)
})
}
softmax_vals <- softmax_batch(x)
softmax_matrix <- t(softmax_vals)
matplot(x, softmax_matrix, type = "l", lwd = 2,
col = c("red", "blue", "green"), lty = 1,
ylab = "Probabilidad", main = "Función Softmax simulada")
legend("topright", legend = c("Clase 1", "Clase 2", "Clase 3"),
col = c("red", "blue", "green"), lty = 1, lwd = 2)
Derivada (softmax):
La derivada de Softmax es una matriz jacobiana. No se representa como una curva, pero se puede observar cómo cambia la probabilidad con respecto a los valores de entrada.
dx <- 0.01
x_plus <- x + dx
x_minus <- x - dx
softmax_vals_plus <- softmax_batch(x_plus)
softmax_vals_minus <- softmax_batch(x_minus)
deriv_softmax_1 <- (softmax_vals_plus[1, ] - softmax_vals_minus[1, ]) / (2 * dx)
plot(x, deriv_softmax_1, type = "l", col = "red", lwd = 2,
ylab = "d/dx Softmax(x)[1]", main = "Derivada aproximada de Softmax (Clase 1)")
abline(h = 0, v = 0, lty = 2, col = "gray")
La función softmax transforma un vector de valores en una distribución de probabilidad, donde todos los elementos son no negativos y su suma es igual a 1. Cada valor representa la probabilidad de pertenecer a una clase específica.
Softmax amplifica las diferencias entre los valores de entrada: incluso pequeñas variaciones pueden generar diferencias notables en las probabilidades, haciendo que la clase con el mayor valor de entrada domine la salida.
Se utiliza principalmente en la capa de salida para tareas de clasificación multiclase, y permite interpretar los resultados como niveles de confianza del modelo. Sin embargo, esta amplificación también la hace sensible a valores extremos, lo que puede llevar a un modelo excesivamente confiado.
Tipo de problema | Función de activación recomendada | Ubicación en la red | Motivo |
---|---|---|---|
Clasificación binaria | Sigmoide | Capa de salida | Genera una probabilidad entre 0 y 1 para representar dos clases. |
Clasificación multiclase | Softmax | Capa de salida | Produce una distribución de probabilidad sobre todas las clases. |
No estás seguro / capas ocultas | ReLU | Capas ocultas | Es eficiente, evita el desvanecimiento de gradiente y funciona bien en general. |
[1] M. Ali, «Introducción a las funciones de activación en las redes neuronales,» 15 Abril 2024. [En línea]. Available: https://www.datacamp.com/es/tutorial/introduction-to-activation-functions-in-neural-networks.
[2] C. A. Ruiz y M. S. Basualdo, «Redes Neuronales: Conceptos Básicos y,» Rosario, 2001.