Definición

Las funciones de activación son componentes esenciales en redes neuronales. Introducen no linealidad en el modelo, permitiendo que las redes aprendan relaciones complejas. Se aplican a la salida de cada neurona antes de pasar al siguiente nivel de la red.

A continuación, se muestran cinco funciones de activación comunes, sus derivadas y sus respectivas grÔficas.

# Activación y derivadas
sigmoid <- function(x) 1 / (1 + exp(-x))
d_sigmoid <- function(x) sigmoid(x) * (1 - sigmoid(x))

tanh_fn <- function(x) tanh(x)
d_tanh <- function(x) 1 - tanh(x)^2

relu <- function(x) ifelse(x > 0, x, 0)
d_relu <- function(x) ifelse(x > 0, 1, 0)

leaky_relu <- function(x, alpha = 0.01) ifelse(x > 0, x, alpha * x)
d_leaky_relu <- function(x, alpha = 0.01) ifelse(x > 0, 1, alpha)

swish <- function(x) x * sigmoid(x)
d_swish <- function(x) {
  s <- sigmoid(x)
  return(s + x * s * (1 - s))
}

# Crear datos para graficar
x <- seq(-10, 10, by = 0.1)

# Plots
par(mfrow = c(5, 2), mar = c(4, 4, 2, 1)) # 5 filas, 2 columnas

Sigmoid

•   Transforma cualquier valor real en un valor entre 0 y 1.
•   Ideal para modelar probabilidades.
•   Tiende a saturarse en los extremos (vanishing gradient).
plot(x, sigmoid(x), type = "l", col = "blue", main = "Sigmoid", ylab = "f(x)")

plot(x, d_sigmoid(x), type = "l", col = "red", main = "Derivada Sigmoid", ylab = "f'(x)")

Tanh

•   Similar a Sigmoid pero centrada en 0.
•   Salida entre -1 y 1.
•   Mejor rendimiento en redes profundas que sigmoid.
plot(x, tanh_fn(x), type = "l", col = "blue", main = "Tanh", ylab = "f(x)")

plot(x, d_tanh(x), type = "l", col = "red", main = "Derivada Tanh", ylab = "f'(x)")

ReLU

•   Activa solo valores positivos.
•   Muy eficiente computacionalmente.
•   Puede causar neuronas muertas si muchas salidas son 0.
plot(x, relu(x), type = "l", col = "blue", main = "ReLU", ylab = "f(x)")

plot(x, d_relu(x), type = "l", col = "red", main = "Derivada ReLU", ylab = "f'(x)")

Leaky ReLU

•   Variante de ReLU que permite pequeƱos gradientes para ( x < 0 ).
•   Evita el problema de neuronas muertas.
•   ParĆ”metro ( \alpha ) controla la pendiente negativa.
plot(x, leaky_relu(x), type = "l", col = "blue", main = "Leaky ReLU", ylab = "f(x)")

plot(x, d_leaky_relu(x), type = "l", col = "red", main = "Derivada Leaky ReLU", ylab = "f'(x)")

Swish

•   Función propuesta por Google.
•   Combina linealidad con sigmoide: ( f(x) = x \cdot \text{sigmoid}(x) ).
•   Suave y no-monótona, da buenos resultados en redes profundas.
plot(x, swish(x), type = "l", col = "blue", main = "Swish", ylab = "f(x)")

plot(x, d_swish(x), type = "l", col = "red", main = "Derivada Swish", ylab = "f'(x)")