pub struct Sgd {
pub lr: f32,
pub momentum: f32,
pub nesterov: bool,
pub weight_decay: f32,
/* private fields */
}Expand description
SGD with momentum / Nesterov / L2 weight decay.
All hyperparameters are public so callers can hot-swap them between
iterations (e.g. for a warm-up schedule). State is keyed by
parameter name; the same Sgd instance can drive every tensor in
a model.
Fields§
§lr: f32Learning rate. No default — pass it to Sgd::new.
momentum: f32Polyak momentum coefficient ∈ [0, 1). 0.0 disables momentum
entirely (and the per-tensor velocity buffer is still allocated
but unused — set via Sgd::with_momentum if you want it on).
nesterov: boolUse Nesterov-accelerated momentum. Only meaningful when
momentum > 0.
weight_decay: f32L2 weight decay coefficient λ. Folded into the gradient
before the momentum EMA (classical, not decoupled).
Use crate::AdamW-style decoupling if you need that.
Implementations§
Source§impl Sgd
impl Sgd
Sourcepub fn new(lr: f32) -> Self
pub fn new(lr: f32) -> Self
Construct with lr and momentum / decay disabled.
Examples found in repository?
56fn main() {
57 for n in [64 * 1024usize, 1024 * 1024, 8 * 1024 * 1024] {
58 println!(
59 "\n{} elements ({:.1} MiB per buffer)",
60 n,
61 (n * 4) as f64 / 1048576.0
62 );
63 bench("adamw (f64 default)", n, Box::new(AdamW::new(1e-3)));
64 bench(
65 "adamw f32Math",
66 n,
67 Box::new(AdamW::new(1e-3).with_f32_math(true)),
68 );
69 bench("adam (f64 default)", n, Box::new(Adam::new(1e-3)));
70 bench(
71 "adam f32Math",
72 n,
73 Box::new(Adam::new(1e-3).with_f32_math(true)),
74 );
75 bench("sgd+momentum", n, {
76 let mut o = Sgd::new(1e-3);
77 o.momentum = 0.9;
78 Box::new(o)
79 });
80 bench("lion", n, Box::new(Lion::new(1e-3)));
81 }
82}Sourcepub fn with_momentum(self, momentum: f32, nesterov: bool) -> Self
pub fn with_momentum(self, momentum: f32, nesterov: bool) -> Self
Enable Polyak (or Nesterov) momentum.
Sourcepub fn with_weight_decay(self, wd: f32) -> Self
pub fn with_weight_decay(self, wd: f32) -> Self
Set the L2 weight-decay coefficient.
Trait Implementations§
Source§impl Optimizer for Sgd
impl Optimizer for Sgd
Source§fn set_lr(&mut self, lr: f32)
fn set_lr(&mut self, lr: f32)
lr (e.g. Adafactor’s relative
step size); every algorithm in this crate that has an lr field
overrides this to update it.Source§fn state_dict(&self) -> Option<OptimizerState>
fn state_dict(&self) -> Option<OptimizerState>
Source§fn load_state_dict(&mut self, state: &OptimizerState) -> bool
fn load_state_dict(&mut self, state: &OptimizerState) -> bool
fn step( &mut self, name: &str, _shape: &[usize], param: &mut [f32], grad: &[f32], )
Source§fn step_batch(&mut self, items: &mut [OptItem<'_>])
fn step_batch(&mut self, items: &mut [OptItem<'_>])
step per item — bit-identical to the per-parameter loop. Optimizers
whose parameter groups are independent (e.g. Muon on the 2-D weight
matrices vs AdamW on the embeddings/biases/norms) can override this to
run the groups on separate threads; because the groups touch disjoint
parameters and disjoint optimizer state, the result is bit-for-bit the
same as the serial loop — only the wall-clock (the CPU-side optimizer
bubble) shrinks toward max(group_times) instead of their sum.Source§fn end_iteration(&mut self)
fn end_iteration(&mut self)
step, so most implementations leave this a no-op.Source§fn lr_scale(&self, _name: &str) -> f32
fn lr_scale(&self, _name: &str) -> f32
1.0 for every name. Override when wrapping this crate to
support per-name LR schedules (e.g. embedding-vs-attention
splits, or the Gaussian-splat attribute-typed LR setup). The
CPU impls in this crate currently honor this only when the
caller passes a pre-scaled lr for the relevant call —
backends are encouraged to consult it inside their fused
kernel.Auto Trait Implementations§
impl Freeze for Sgd
impl RefUnwindSafe for Sgd
impl Send for Sgd
impl Sync for Sgd
impl Unpin for Sgd
impl UnsafeUnpin for Sgd
impl UnwindSafe for Sgd
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more