use burn::module::{Module, Param}; use burn::nn::Initializer; use burn::tensor::backend::Backend; use burn::tensor::{Float, Tensor}; #[derive(Module, Debug)] pub struct RMSNorm { pub weight: Param>, pub eps: f64, } impl RMSNorm { pub fn new(dim: usize, eps: f64, device: &B::Device) -> Self { let weight = Initializer::Ones.init([dim], device); Self { weight, eps, } } pub fn forward(&self, x: Tensor) -> Tensor { let variance = x.clone().powf_scalar(2.0).mean_dim(D - 1); let rms = (variance + self.eps).sqrt(); let x_norm = x / rms; let weight = self.weight.val().clone().unsqueeze(); x_norm * weight } }