En los artículos anteriores construimos dos piezas fundamentales:
- La función sigmoide, que transforma números en probabilidades
- La neurona artificial, que calcula una suma ponderada: z=XW+b
Ahora viene una pregunta clave:
Si ya tenemos una suma ponderada…
¿por qué necesitamos funciones de activación?
La respuesta es simple y muy importante.
El problema de una red sin funciones de activación
Imagina una red neuronal formada solo por capas lineales:Z1=XW1+b1 Z2=Z1W2+b2
Aunque tenga muchas capas, todo sigue siendo una sola operación lineal.
En otras palabras:
Una red sin funciones de activación no es más poderosa que una sola neurona.
No importa cuántas capas añadas:
sin activaciones, la red no puede aprender relaciones complejas.
Qué hace una función de activación (idea clave)
Una función de activación introduce no linealidad.
Eso permite que la red:
- Aprenda curvas
- Separe datos no triviales
- Modele relaciones complejas del mundo real
La activación se aplica después de la suma ponderada:Z=XW+b A=f(Z)
Donde f es la función de activación.
Visualizando el flujo completo de una neurona
Secuencia mental correcta:
- Suma ponderada →
Z - Activación →
A Apasa a la siguiente capa
Dos funciones de activación clave (las que usaremos)
En esta serie nos centraremos en dos funciones:
1️⃣ Sigmoide
- Rango: (0, 1)
- Ideal para salida en clasificación binaria
σ(x)=1+e−x1
2️⃣ Tangente hiperbólica (tanh)
- Rango: (−1, 1)
- Ideal para capas ocultas
tanh(x)=ex+e−xex−e−x
¿Por qué tanh es mejor que sigmoide en capas ocultas?
La diferencia clave está en el centrado.
- Sigmoide → salida entre 0 y 1
- tanh → salida entre −1 y 1
Esto hace que tanh:
- Converja más rápido
- Tenga gradientes más equilibrados
- Funcione mejor en capas internas
Por eso:
Sigmoide se usa al final, tanh en el medio.
Implementar tanh en Python
import numpy as npdef tanh(x): return np.tanh(x)
Ejemplo rápido:
tanh(0) # 0tanh(2) # ~0.96tanh(-2) # ~ -0.96
Comparando sigmoide vs tanh (gráficamente)
import numpy as npimport matplotlib.pyplot as pltx = np.linspace(-5, 5, 400)sig = 1 / (1 + np.exp(-x))t = np.tanh(x)plt.plot(x, sig, label="sigmoid")plt.plot(x, t, label="tanh")plt.axhline(0)plt.legend()plt.title("Sigmoide vs tanh")plt.show()
Observa:
- Sigmoide nunca baja de 0
- tanh está centrada en 0
Uniendo todo: neurona + activación
Ahora juntamos lo aprendido hasta ahora.
def linear_forward(X, W, b): return X @ W + bdef tanh(x): return np.tanh(x)Z = linear_forward(X, W, b)A = tanh(Z)
Aquí:
Zes la salida linealAes la salida activadaAes lo que pasa a la siguiente capa
Esto ya es una capa neuronal completa.
Pieza reutilizable (guárdala)
Esta función será usada en todas las capas ocultas:
def layer_forward(X, W, b, activation): Z = X @ W + b return activation(Z)
Uso típico:
A1 = layer_forward(X, W1, b1, np.tanh)
Qué viene después
En el Artículo #4 entraremos en uno de los conceptos más importantes de toda la serie:
La función de pérdida (loss): cómo una red sabe si lo está haciendo bien o mal