pub struct QHAdamW {
pub lr: f32,
pub beta1: f32,
pub beta2: f32,
pub nu1: f32,
pub nu2: f32,
pub eps: f32,
pub weight_decay: f32,
/* private fields */
}Expand description
Quasi-hyperbolic AdamW. Per-tensor state: two f32 buffers.
Fields§
§lr: f32Learning rate.
beta1: f32First-moment EMA decay β₁. Ma & Yarats recommend 0.995 (much
closer to 1 than vanilla Adam) — the QH interpolation already
keeps current-gradient weight in the numerator.
beta2: f32Second-moment EMA decay β₂. Default 0.999.
nu1: f32First-moment QH interpolation coefficient ν₁ ∈ [0, 1].
1.0 = pure EMA (standard Adam first moment); 0.0 = pure
current gradient (no momentum). Default 0.7.
nu2: f32Second-moment QH interpolation coefficient ν₂. 1.0 = standard
Adam denominator. Default 1.0.
eps: f32Denominator stability constant. Default 1e-8.
weight_decay: f32Decoupled weight-decay coefficient λ. Default 0.01.
Implementations§
Source§impl QHAdamW
impl QHAdamW
Sourcepub fn new(lr: f32) -> Self
pub fn new(lr: f32) -> Self
Construct with (β₁, β₂, ν₁, ν₂, ε, λ) = (0.995, 0.999, 0.7, 1.0, 1e-8, 0.01).
Sourcepub fn with_betas(self, b1: f32, b2: f32) -> Self
pub fn with_betas(self, b1: f32, b2: f32) -> Self
Override (β₁, β₂).
Sourcepub fn with_nus(self, n1: f32, n2: f32) -> Self
pub fn with_nus(self, n1: f32, n2: f32) -> Self
Override the quasi-hyperbolic coefficients (ν₁, ν₂).
Sourcepub fn with_weight_decay(self, wd: f32) -> Self
pub fn with_weight_decay(self, wd: f32) -> Self
Override the decoupled-decay coefficient.
Trait Implementations§
Source§impl Optimizer for QHAdamW
impl Optimizer for QHAdamW
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.fn step( &mut self, name: &str, _shape: &[usize], param: &mut [f32], grad: &[f32], )
Source§fn end_iteration(&mut self)
fn end_iteration(&mut self)
step, so most implementations leave this a no-op.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 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.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
Auto Trait Implementations§
impl Freeze for QHAdamW
impl RefUnwindSafe for QHAdamW
impl Send for QHAdamW
impl Sync for QHAdamW
impl Unpin for QHAdamW
impl UnsafeUnpin for QHAdamW
impl UnwindSafe for QHAdamW
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