Batch GD
Usa todos los datos para calcular el gradiente. Preciso pero lento.
Capítulo 1
. El gradiente apunta en la dirección de máximo crecimiento, así que nos movemos en dirección opuesta.
Contornos de . El punto amarillo es el inicio.
Usa todos los datos para calcular el gradiente. Preciso pero lento.
Un solo ejemplo por paso. Ruidoso pero rápido y escapa de mínimos locales.
Compromiso: un batch pequeño (~32-256) por paso.
Acumula gradientes pasados para suavizar la trayectoria.
import numpy as np
from sklearn.linear_model import SGDRegressor
from sklearn.datasets import make_regression
X, y = make_regression(n_samples=1000, n_features=10, noise=0.1)
# SGD para regresión lineal
model = SGDRegressor(
max_iter=1000,
learning_rate='adaptive',
eta0=0.01,
penalty=None # sin regularización
)
model.fit(X, y)
print(f"Coeficientes: {model.coef_[:5]}...")
print(f"Score R²: {model.score(X, y):.4f}")
# Implementación manual de momentum
def gradient_descent_momentum(grad_fn, x0, lr=0.01, beta=0.9, steps=100):
x = x0.copy()
v = np.zeros_like(x)
for i in range(steps):
g = grad_fn(x)
v = beta * v + lr * g
x -= v
return xfrom sklearn.linear_model import SGDRegressor
# SGDRegressor usa por defecto 'adaptive' o 'invscaling'
# Para Adam-like, usar optimizadores de PyTorch/TensorFlow
# En PyTorch:
# optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
# Learning rate schedule simple
import numpy as np
def schedule(epoch, lr0=0.1, decay=0.01):
return lr0 / (1 + decay * epoch)
for epoch in range(10):
lr = schedule(epoch)
print(f"Epoch {epoch}: lr = {lr:.5f}")