Optimizers

Reference for the optimization algorithms and learning-rate schedulers in AiDotNet.

Optimizers are generic over <T, TInput, TOutput> and take the model they optimize: new AdamWOptimizer<float, Tensor<float>, Tensor<float>>(model). Tuning (learning rate, betas, weight decay) lives in the matching *Options. Plug an optimizer in with ConfigureOptimizer(...).


First-Order Optimizers

Optimizer Use Case
StochasticGradientDescentOptimizer<T,TIn,TOut> General purpose
MomentumOptimizer<T,TIn,TOut> Faster convergence
NesterovAcceleratedGradientOptimizer<T,TIn,TOut> Look-ahead momentum
AdamOptimizer<T,TIn,TOut> General deep learning
AdamWOptimizer<T,TIn,TOut> Transformers, large models
AdaMaxOptimizer<T,TIn,TOut> Sparse gradients
NadamOptimizer<T,TIn,TOut> Improved convergence
AMSGradOptimizer<T,TIn,TOut> Stable training
AdagradOptimizer<T,TIn,TOut> Sparse features
AdaDeltaOptimizer<T,TIn,TOut> No learning-rate tuning
RootMeanSquarePropagationOptimizer<T,TIn,TOut> RNNs (RMSProp)
FTRLOptimizer<T,TIn,TOut> Online learning
LARSOptimizer<T,TIn,TOut> Large-batch training
LAMBOptimizer<T,TIn,TOut> BERT pre-training
LionOptimizer<T,TIn,TOut> Vision/language models

Second-Order Optimizers

Optimizer Use Case
LBFGSOptimizer<T,TIn,TOut> Small models, full batch
BFGSOptimizer<T,TIn,TOut> Convex optimization
NewtonMethodOptimizer<T,TIn,TOut> Quadratic convergence
LevenbergMarquardtOptimizer<T,TIn,TOut> Nonlinear least squares
ConjugateGradientOptimizer<T,TIn,TOut> Large sparse systems
TrustRegionOptimizer<T,TIn,TOut> Robust convergence

Evolutionary Optimizers

Optimizer Use Case
GeneticAlgorithmOptimizer<T,TIn,TOut> Complex search spaces
CMAESOptimizer<T,TIn,TOut> Black-box optimization
ParticleSwarmOptimizer<T,TIn,TOut> Global optimization
DifferentialEvolutionOptimizer<T,TIn,TOut> Continuous optimization
SimulatedAnnealingOptimizer<T,TIn,TOut> Combinatorial optimization

Learning-Rate Schedulers

Schedulers implement ILearningRateScheduler and attach via ConfigureLearningRateScheduler(...).

Scheduler Description
StepLRScheduler Decay by factor at fixed intervals
MultiStepLRScheduler Decay at specified milestones
ExponentialLRScheduler Exponential decay
CosineAnnealingLRScheduler Cosine annealing
LinearLRScheduler Linear decay
ReduceLROnPlateauScheduler Reduce when a metric plateaus
OneCycleLRScheduler One-cycle policy

Using an Optimizer

Configure the model first, then hand the same model to the optimizer.

using AiDotNet;
using AiDotNet.Data.Loaders;
using AiDotNet.Enums;
using AiDotNet.NeuralNetworks;
using AiDotNet.Optimizers;
using AiDotNet.Tensors.LinearAlgebra;

var rng = new Random(0);
var trainX = new Tensor<float>(new[] { 64, 16 });
var trainY = new Tensor<float>(new[] { 64, 3 });
for (int i = 0; i < 64; i++)
{
    for (int j = 0; j < 16; j++) trainX[new[] { i, j }] = (float)rng.NextDouble();
    trainY[new[] { i, i % 3 }] = 1f;
}

var model = new NeuralNetwork<float>(new NeuralNetworkArchitecture<float>(
    inputFeatures: 16, numClasses: 3, complexity: NetworkComplexity.Simple));

// Swap AdamWOptimizer for any optimizer above — they share the (model, options) shape.
var result = await new AiModelBuilder<float, Tensor<float>, Tensor<float>>()
    .ConfigureModel(model)
    .ConfigureOptimizer(new AdamWOptimizer<float, Tensor<float>, Tensor<float>>(model))
    .ConfigureDataLoader(DataLoaders.FromTensors(trainX, trainY))
    .BuildAsync();

Console.WriteLine($"Trained; output [{string.Join(", ", result.Predict(trainX).Shape)}]");

Tuning via Options

using AiDotNet;
using AiDotNet.Data.Loaders;
using AiDotNet.Enums;
using AiDotNet.Models.Options;
using AiDotNet.NeuralNetworks;
using AiDotNet.Optimizers;
using AiDotNet.Tensors.LinearAlgebra;

var trainX = new Tensor<float>(new[] { 32, 8 });
var trainY = new Tensor<float>(new[] { 32, 2 });
for (int i = 0; i < 32; i++) { trainX[new[] { i, 0 }] = i / 32f; trainY[new[] { i, i % 2 }] = 1f; }

var model = new NeuralNetwork<float>(new NeuralNetworkArchitecture<float>(
    inputFeatures: 8, numClasses: 2, complexity: NetworkComplexity.Simple));

// The learning rate and every other knob live on the options object.
var options = new AdamOptimizerOptions<float, Tensor<float>, Tensor<float>>
{
    InitialLearningRate = 3e-4,   // the learning rate
    Epsilon = 1e-8,
    MaxGradientNorm = 1.0,        // gradient clipping
};

var result = await new AiModelBuilder<float, Tensor<float>, Tensor<float>>()
    .ConfigureModel(model)
    .ConfigureOptimizer(new AdamOptimizer<float, Tensor<float>, Tensor<float>>(model, options))
    .ConfigureDataLoader(DataLoaders.FromTensors(trainX, trainY))
    .BuildAsync();

Console.WriteLine("Trained with custom optimizer options.");

Learning-Rate Schedules

Decay the learning rate over training with a scheduler — CosineAnnealingLRScheduler, StepLRScheduler, and others live in AiDotNet.LearningRateSchedulers and attach via ConfigureLearningRateScheduler(...).

using AiDotNet;
using AiDotNet.Data.Loaders;
using AiDotNet.Enums;
using AiDotNet.LearningRateSchedulers;
using AiDotNet.NeuralNetworks;
using AiDotNet.Optimizers;
using AiDotNet.Tensors.LinearAlgebra;

var trainX = new Tensor<float>(new[] { 32, 8 });
var trainY = new Tensor<float>(new[] { 32, 2 });
for (int i = 0; i < 32; i++) { trainX[new[] { i, 0 }] = i / 32f; trainY[new[] { i, i % 2 }] = 1f; }

var model = new NeuralNetwork<float>(new NeuralNetworkArchitecture<float>(
    inputFeatures: 8, numClasses: 2, complexity: NetworkComplexity.Simple));

var result = await new AiModelBuilder<float, Tensor<float>, Tensor<float>>()
    .ConfigureModel(model)
    .ConfigureOptimizer(new AdamWOptimizer<float, Tensor<float>, Tensor<float>>(model))
    // Cosine decay from 3e-4 over 100 epochs; StepLRScheduler(baseLearningRate, stepSize, gamma) for step decay.
    .ConfigureLearningRateScheduler(new CosineAnnealingLRScheduler(baseLearningRate: 3e-4, tMax: 100))
    .ConfigureDataLoader(DataLoaders.FromTensors(trainX, trainY))
    .BuildAsync();

Console.WriteLine("Trained with a cosine-annealing learning-rate schedule.");

Optimizer Selection Guide

Task Recommended
General deep learning AdamWOptimizer
Transformers / LLMs AdamWOptimizer + cosine schedule
Large-batch training LAMBOptimizer
Vision models StochasticGradientDescentOptimizer (momentum) or LionOptimizer
RNNs RootMeanSquarePropagationOptimizer or AdamOptimizer
Small datasets LBFGSOptimizer
Hyperparameter search GeneticAlgorithmOptimizer / ParticleSwarmOptimizer

Hyperparameter Guidelines

Parameter Typical Range Notes
Learning rate 1e-5 to 1e-2 Start with 3e-4 for Adam
Weight decay 0 to 0.1 0.01 is common
Beta1 0.9 to 0.95 0.9 is standard
Beta2 0.99 to 0.999 0.999 for Adam
Epsilon 1e-8 to 1e-6 1e-8 is standard