La esencia matemática de la retropropagación
En este capítulo se calculará manualmente todo el proceso de retropropagación de una red neuronal de dos capas.
Retropropagación = aplicación sistemática de la regla de la cadena en el gráfico de cálculo.
Análisis de conceptos
Gráfico de cálculo: propagación hacia adelante y hacia atrás
Una red simple de dos capas: entrada x → capa oculta (ReLU) → salida → pérdida MSE.
La propagación hacia adelante calcula la salida de izquierda a derecha. La retropropagaciónde derecha a izquierdacalcula el gradiente de cada parámetro respecto a la pérdida.
Calcular manualmente un ejemplo completo
Sean x=2, y=4 (etiqueta real), parámetros w₁=0.5, b₁=0, w₂=1, b₂=0.
Propagación hacia adelante
| Pasos | Cálculo | Valor |
|---|---|---|
| z₁ = w₁x + b₁ | 0.5×2 + 0 | 1.0 |
| a₁ = ReLU(z₁) | max(0, 1.0) | 1.0 |
| ŷ = w₂a₁ + b₂ | 1×1.0 + 0 | 1.0 |
| L = (ŷ - y)² | (1-4)² | 9.0 |
Retropropagación (regla de la cadena)
Gradiente de la pérdida respecto a ŷ:\( \frac{\partial L}{\partial \hat{y}} = 2(\hat{y}-y) = 2(1-4) = -6 \)
Gradiente de ŷ respecto a w₂ → L respecto a w₂:\( \frac{\partial \hat{y}}{\partial w_2} = a_1 = 1.0 \),\( \frac{\partial L}{\partial w_2} = (-6) \times 1.0 = -6 \)
Gradiente de L respecto a a₁ (continuar propagando hacia adelante):\( \frac{\partial L}{\partial a_1} = \frac{\partial L}{\partial \hat{y}} \cdot w_2 = -6 \times 1 = -6 \)
A través de ReLU:\( \frac{\partial a_1}{\partial z_1} = 1 \) (porque z₁=1>0), \( \frac{\partial L}{\partial z_1} = -6 \)
L respecto a w₁:\( \frac{\partial L}{\partial w_1} = \frac{\partial L}{\partial z_1} \cdot x = -6 \times 2 = -12 \)
Resumir gradientes y actualizar
| Parámetros | Gradiente | Actualización (lr=0.1) |
|---|---|---|
| w₁ | -12 | 0.5 + 1.2 = 1.7 |
| b₁ | -6 | 0 + 0.6 = 0.6 |
| w₂ | -6 | 1 + 0.6 = 1.6 |
| b₂ | -6 | 0 + 0.6 = 0.6 |
Los gradientes son todos negativos: esto indica que la predicción actual es demasiado pequeña (1 < 4), todos los parámetros deben aumentar.
El gradiente de w₁ (-12) es mayor que el de w₂ (-6): porque w₁ está más lejos de la pérdida, la ruta de propagación en cadena es más larga y se multiplica por x=2.
Verificación en Python
Ejemplo
x = torch.tensor([2.0])
y = torch.tensor([4.0])
w1 = torch.tensor([0.5], requires_grad=True)
b1 = torch.tensor([0.0], requires_grad=True)
w2 = torch.tensor([1.0], requires_grad=True)
b2 = torch.tensor([0.0], requires_grad=True)
# Adelante
a1 = torch.relu(w1 * x + b1)
y_pred = w2 * a1 + b2
loss = (y_pred - y) ** 2
loss.backward()
print(=== EJEMPLO PyTorch validación ===)
print(f∂L/∂w1 = {w1.grad.item():.1f} (cálculo manual: -12))
print(f∂L/∂b1 = {b1.grad.item():.1f} (cálculo manual: -6))
print(f∂L/∂w2 = {w2.grad.item():.1f} (cálculo manual: -6))
print(f"∂L/∂b2 = {b2.grad.item():.1f} (cálculo manual: -6)")
# Un paso de descenso de gradiente
lr = 0.1
with torch.no_grad():
w1 -= lr * w1.grad; b1 -= lr * b1.grad
w2 -= lr * w2.grad; b2 -= lr * b2.grad
new_loss = ((w2 * torch.relu(w1*x+b1) + b2 - y)**2).item()
print(f"\nPérdida original: {loss.item():.1f} → Nueva pérdida: {new_loss:.2f}")
print(f"¡La pérdida disminuyó!")
=== EJEMPLO PyTorch 验证 === ∂L/∂w1 = -12.0 (手算: -12) ∂L/∂b1 = -6.0 (手算: -6) ∂L/∂w2 = -6.0 (手算: -6) ∂L/∂b2 = -6.0 (手算: -6) 原损失: 9.0 → 新损失: 1.03 损失减小了!
Retropropagación = la confluencia de tres líneas
Propagación hacia adelante = operaciones matriciales
z = Wx + b
Retropropagación = regla de la cadena
∂L/∂w = ∂L/∂z · ∂z/∂w
Actualización de parámetros = descenso de gradiente
θ = θ - η∇J
Diseño de pérdida = MLE + entropía cruzada
L = -log P(y|x)
La retropropagación esencialmente hace tres cosas: hacia adelante usa operaciones matriciales para calcular la salida, hacia atrás usa la regla de la cadena para calcular los gradientes, y una vez obtenidos los gradientes, usa el descenso de gradiente para actualizar los parámetros.
La probabilidad, la estadística y la teoría de la información proporcionan la base teórica para la elección de la función de pérdida.
Otras extensiones