Adam Optimizer (Adaptive Moment Estimation) #
Adam optimizer with adaptive learning rates per parameter. Combines ideas from RMSprop and momentum.
Algorithm #
m_t = β₁ * m_{t-1} + (1 - β₁) * g_t # First moment (momentum)
v_t = β₂ * v_{t-1} + (1 - β₂) * g_t² # Second moment (uncentered variance)
m̂_t = m_t / (1 - β₁^t) # Bias correction
v̂_t = v_t / (1 - β₂^t) # Bias correction
θ_t = θ_{t-1} - α * m̂_t / (√v̂_t + ε) # Parameter update
Typical Hyperparameters #
- Learning rate (α): 0.001
- β₁ (momentum): 0.9
- β₂ (RMS decay): 0.999
- ε (numerical stability): 1e-8
Usage Example #
-- Create optimizer
let opt := AdamConfig.default.withLearningRate 0.001
-- Optimization step
let (newParams, newState) := opt.step params grads state
References #
- Kingma & Ba (2014): "Adam: A Method for Stochastic Optimization"
- https://arxiv.org/abs/1412.6980
Adam optimizer configuration
- learningRate : Float
Learning rate (typical: 0.001)
- beta1 : Float
Exponential decay rate for first moment estimates (typical: 0.9)
- beta2 : Float
Exponential decay rate for second moment estimates (typical: 0.999)
- epsilon : Float
Small constant for numerical stability (typical: 1e-8)
- weightDecay : Float
Weight decay (L2 regularization)
- amsgrad : Bool
Use AMSGrad variant (maintains max of v_t)
Instances For
Equations
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Default Adam configuration (recommended hyperparameters)
Equations
Instances For
Create Adam with specified learning rate
Equations
- config.withLearningRate lr = { learningRate := lr, beta1 := config.beta1, beta2 := config.beta2, epsilon := config.epsilon, weightDecay := config.weightDecay, amsgrad := config.amsgrad }
Instances For
Create Adam with weight decay (AdamW variant)
Equations
- config.withWeightDecay wd = { learningRate := config.learningRate, beta1 := config.beta1, beta2 := config.beta2, epsilon := config.epsilon, weightDecay := wd, amsgrad := config.amsgrad }
Instances For
Create Adam with custom beta parameters
Equations
- config.withBetas beta1 beta2 = { learningRate := config.learningRate, beta1 := beta1, beta2 := beta2, epsilon := config.epsilon, weightDecay := config.weightDecay, amsgrad := config.amsgrad }
Instances For
Enable AMSGrad variant
Equations
- config.withAMSGrad = { learningRate := config.learningRate, beta1 := config.beta1, beta2 := config.beta2, epsilon := config.epsilon, weightDecay := config.weightDecay, amsgrad := true }
Instances For
Adam optimizer state (moment estimates)
First moment estimates (momentum) for each parameter
Second moment estimates (uncentered variance) for each parameter
Maximum of v_t (for AMSGrad)
- step : Nat
Number of steps taken
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Initialize Adam state for given parameter shapes
Equations
- One or more equations did not get rendered due to their size.
Instances For
Helper: Compute effective learning rate at step t
Equations
- Hesper.Optimizer.Adam.effectiveLearningRate config step = config.learningRate * (1.0 - config.beta2.pow (Float.ofNat (step + 1))).sqrt / (1.0 - config.beta1.pow (Float.ofNat (step + 1)))
Instances For
Helper: Compute L2 norm of first moments (momentum magnitude)
Equations
- Hesper.Optimizer.Adam.momentumNorm state = (Array.foldl (fun (acc : Float) (m : Array Float) => acc + Array.foldl (fun (acc2 mi : Float) => acc2 + mi * mi) 0.0 m) 0.0 state.m).sqrt
Instances For
Helper: Compute L2 norm of second moments (variance magnitude)
Equations
- Hesper.Optimizer.Adam.varianceNorm state = (Array.foldl (fun (acc : Float) (v : Array Float) => acc + Array.foldl (fun (acc2 vi : Float) => acc2 + vi * vi) 0.0 v) 0.0 state.v).sqrt
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Equations
- One or more equations did not get rendered due to their size.