Adam Optimizer
Adam combina el momento con tamaños de paso por parámetro, escalados según la magnitud reciente de los gradientes. Incluye la regla de actualización, los valores predeterminados, AdamW y la comparación entre Adam y SGD.
El optimizador Adam, abreviatura de estimación adaptativa de momentos, es un algoritmo de optimización para entrenar redes neuronales que asigna a cada parámetro un tamaño de paso adaptativo propio. Kingma y Ba lo presentaron en Adam: un método para la optimización estocástica; amplía el descenso de gradiente estocástico (SGD) con promedios móviles de los gradientes anteriores y de sus cuadrados. Su rápido progreso inicial y sus valores predeterminados tolerantes hicieron de Adam el optimizador de partida más habitual en el aprendizaje profundo, y su variante AdamW es la opción estándar para entrenar transformadores y modelos de lenguaje grandes.
Cómo funciona Adam#
El entrenamiento minimiza una función de pérdida actualizando repetidamente cada peso en función de su gradiente. El SGD normal multiplica todos los gradientes por la misma tasa de aprendizaje. Adam mantiene dos valores adicionales por parámetro y los actualiza en cada paso t a partir del gradiente actual g:
- Primer momento (momento):
m = β1·m + (1 − β1)·g, un promedio de gradientes con decaimiento exponencial que mantiene la actualización avanzando en una dirección coherente. - Segundo momento:
v = β2·v + (1 − β2)·g², un promedio decreciente de los gradientes al cuadrado que registra el tamaño habitual de los gradientes de cada parámetro. - Corrección del sesgo:
m̂ = m / (1 − β1^t)yv̂ = v / (1 − β2^t), que compensan el hecho de que ambos promedios empiezan en cero. - Actualización:
θ = θ − lr · m̂ / (√v̂ + ε).
Los valores predeterminados del artículo, que también utiliza torch.optim.Adam de PyTorch, son lr = 0.001, β1 = 0.9, β2 = 0.999 y ε = 1e-8. Dividir entre √v̂ normaliza cada paso según el tamaño típico del gradiente del parámetro, de modo que los pasos se mantienen cerca de la tasa de aprendizaje tanto si los gradientes son minúsculos como enormes, y se reducen en las direcciones ruidosas donde los gradientes positivos y negativos se cancelan dentro de m̂. El siguiente fragmento compara el primer paso de SGD y Adam en dos parámetros cuyos gradientes tienen una diferencia de escala de 1000x:
import torch
# Two parameters whose gradients differ in scale by 1,000x
scale = torch.tensor([1000.0, 1.0])
for name, optimizer_cls in [("SGD", torch.optim.SGD), ("Adam", torch.optim.Adam)]:
w = torch.zeros(2, requires_grad=True)
optimizer = optimizer_cls([w], lr=0.001)
loss = (scale * w).sum() # gradient is [1000, 1]
loss.backward()
optimizer.step()
print(f"{name} first step: {[round(v, 4) for v in w.tolist()]}")SGD desplaza el primer parámetro a -1.0 y el segundo a -0.001, una diferencia de 1000x que sigue la escala de los gradientes. Adam desplaza ambos exactamente lo mismo que la tasa de aprendizaje, -0.001, porque su paso normalizado depende de la dirección y la coherencia del gradiente, no de su tamaño bruto.
Adam y AdamW#
Adam, tal como se implementa habitualmente, aplica una disminución de pesos, una forma de regularización, como penalización L2 añadida al gradiente; después, esa penalización se divide también entre √v̂, junto con todo lo demás, por lo que apenas se regularizan los pesos con gradientes grandes. La disminución de pesos desacoplada de Loshchilov y Hutter soluciona este problema reduciendo directamente los pesos en cada paso, de forma independiente de la actualización adaptativa. En los experimentos del artículo, el AdamW resultante mejoró la generalización de Adam en la clasificación de imágenes y está disponible como torch.optim.AdamW.
Adam frente a SGD#
El SGD con momento utiliza una tasa de aprendizaje global y almacena un búfer por parámetro, mientras que Adam almacena dos: 8 bytes por parámetro en precisión de 32 bits, lo que supone 56 GB de estado del optimizador para un modelo de 7000 millones de parámetros. Adam suele avanzar más rápido al principio, es menos sensible a la tasa de aprendizaje y entrena transformadores de forma mucho más fiable que SGD. Un SGD bien ajustado suele alcanzar una exactitud final igual o superior en modelos convolucionales de imagen, y Wilson et al. observaron que los métodos adaptativos a menudo generalizaban peor que SGD en las tareas de clasificación de imágenes y de lenguaje que evaluaron.
El entrenamiento de Ultralytics YOLO refleja esta compensación: el valor predeterminado optimizer="auto" selecciona AdamW, con una tasa de aprendizaje inicial ajustada al número de clases, para ejecuciones de hasta 10 000 iteraciones, y cambia a MuSGD, una combinación de SGD y Muon, para planificaciones más largas. Si configuras el optimizador explícitamente, también tienes que definir la tasa de aprendizaje, ya que el valor predeterminado lr0=0.01 está pensado para SGD y es diez veces superior a la tasa habitual de Adam.
from ultralytics import YOLO
# Carga un modelo YOLO26n preentrenado
model = YOLO("yolo26n.pt")
# Entrena con AdamW y una tasa de aprendizaje inicial adecuada para Adam
results = model.train(data="coco8.yaml", epochs=5, optimizer="AdamW", lr0=0.001)Cuando YOLO26 entrena con un optimizador de la familia Adam, el argumento momentum (valor predeterminado: 0.937) establece β1, mientras que β2 permanece fijo en 0.999.
Adam y optimizadores relacionados#
- AdaGrad: Divide cada paso por la raíz de la suma de todos los gradientes al cuadrado anteriores, por lo que el tamaño de los pasos solo disminuye; esto resulta adecuado para características dispersas, pero ralentiza los entrenamientos largos.
- RMSProp: Sustituye la suma acumulada de AdaGrad por un promedio de los gradientes al cuadrado con decaimiento exponencial. Adam es, básicamente, RMSProp más momento y corrección del sesgo.
- Muon: Optimizador para las matrices de pesos 2D de las capas ocultas que ortogonaliza cada actualización del momento mediante iteraciones de Newton–Schulz y mantiene un único búfer de estado por parámetro, la mitad del estado del optimizador de Adam.










