Autograd
PyTorch autograd calcula automáticamente los gradientes de las salidas escalares con respecto a las entradas tensoriales. Potencia todo el entrenamiento de redes neuronales a través de la diferenciación automática en modo reverso.
Busca en todas las páginas de la documentación
PyTorch autograd calcula automáticamente los gradientes de las salidas escalares con respecto a las entradas tensoriales. Potencia todo el entrenamiento de redes neuronales a través de la diferenciación automática en modo reverso.
Tarjeta de referencia rápida - lista para copiar y pegar.
import torch
x = torch.tensor(2.0, requires_grad=True)
y = x ** 2 + 3 * x
y.backward()
print(x.grad) # dy/dx en x=2: 2*2+3 = 7
# Inferencia: sin seguimiento de gradientes
with torch.no_grad():
pred = model(x)Cuándo usar esto:
loss.backward() y optimizer.step()."""autograd.py - cálculo de gradientes y verificación de gradientes."""
import torch
import torch.nn as nn
# Grafo de cómputo simple
w = torch.tensor([1.0, 2.0], requires_grad=True)
b = torch.tensor(0.5, requires_grad=True)
x = torch.tensor([3.0, 4.0])
# Adelante: y = w . x + b, loss = y^2
y = (w * x).sum() + b
loss = y ** 2
loss.backward()
print("w.grad:", w.grad) # d(loss)/dw
print("b.grad:", b.grad) # d(loss)/db
# Modelo con autograd
model = nn.Linear(3, 1)
x_batch = torch.randn(16, 3)
target = torch.randn(16, 1)
model.zero_grad(set_to_none=True)
pred = model(x_batch)
loss = nn.functional.mse_loss(pred, target)
loss.backward()
for name, param in model.named_parameters():
print(f"{name}: grad norm = {param.grad.norm().item():.4f}")Lo que esto demuestra:
w, b) acumulan gradientes en .grad.loss.backward() recorre el grafo en reversa.zero_grad(set_to_none=True) limpia los gradientes de manera eficiente.backward() aplica la regla de la cadena desde la salida hacia las hojas.requires_grad=True acumulan .grad.backward a menos que retain_graph=True.torch.inference_mode() es más estricto y rápido que no_grad() para la inferencia.| Contexto | Efecto | Uso |
|---|---|---|
requires_grad=True | Rastrea operaciones | Parámetros del modelo, entradas que necesitan gradiente |
torch.no_grad() | Deshabilita el rastreo | Inferencia, cálculo de métricas |
torch.inference_mode() | Modo sin gradiente más estricto | Inferencia en producción |
.detach() | Rompe la conexión con el grafo | Detiene gradientes a través de un tensor |
retain_graph=True | Mantiene el grafo después de backward | Múltiples llamadas a backward |
# Función autograd personalizada
class MyReLU(torch.autograd.Function):
@staticmethod
def forward(ctx, input):
ctx.save_for_backward(input)
return input.clamp(min=0)
@staticmethod
def backward(ctx, grad_output):
input, = ctx.saved_tensors
grad_input = grad_output.clone()
grad_input[input < 0] = 0
return grad_inputzero_grad() - los gradientes se acumulan entre pasos. Solución: llama a optimizer.zero_grad(set_to_none=True) antes de cada backward.backward dos veces sin retain_graph - el grafo se libera después de la primera llamada a backward. Solución: loss.backward(retain_graph=True) o pases hacia adelante separados.x.add_(1) en tensores rastreados; usa x = x + 1..item() para registrar; del loss después de backward.float antes de operaciones que necesiten gradientes..detach().cpu().numpy() para exportar.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| PyTorch autograd | Por defecto para redes neuronales | Necesitas matemáticas simbólicas (usa JAX) |
torch.func (functorch) | Gradientes por muestra, vmap | Entrenamiento de modelos simple |
| Gradientes manuales | Enseñanza, verificación | Código de modelo en producción |
| JAX autograd | Transformaciones funcionales, TPU | Ecosistema PyTorch existente |
backward a menos que se retenga.backward() calcula los gradientes de una salida escalar.y.backward(gradient=torch.ones_like(y)).inference_mode deshabilita más infraestructura de autograd - más rápido.inference_mode para inferencia en producción.no_grad está bien para bucles de validación durante el entrenamiento.for name, p in model.named_parameters():
if p.grad is None:
print(f"no grad: {name}")param.requires_grad = False o usa patrones como model.freeze().torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)optimizer.step().loss.backward(create_graph=True)
grad_grad = torch.autograd.grad(loss, model.parameters(), create_graph=True)create_graph=True mantiene el grafo para gradientes de orden superior.optimizer.zero_grad(set_to_none=True) establece .grad a None en lugar de cero..grad poblado por defecto.retain_grad() en tensores no hoja si es necesario.with torch.no_grad():
features = frozen_encoder(x)
output = trainable_head(features)backward en la prácticann.Parameterautocast y escalado de gradientesVersiones de Stack: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.
Revisado por Chris St. John·Última actualización: 16 jul 2026