| # core/norm.py · RMSNorm | |
| ## 代码 | |
| ```python | |
| class RMSNorm(nn.Module): | |
| def __init__(self, dim, eps=1e-5): | |
| self.eps = eps | |
| self.weight = nn.Parameter(torch.ones(dim)) | |
| def norm(self, x): | |
| return x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps) | |
| def forward(self, x): | |
| return (self.weight * self.norm(x.float())).type_as(x) | |
| ``` | |
| ## 公式 | |
| $$ | |
| \mathrm{RMS}(x)=\sqrt{\frac{1}{d}\sum_{i=1}^{d}x_i^2+\varepsilon},\qquad | |
| y=\frac{x}{\mathrm{RMS}(x)}\odot \gamma | |
| $$ | |
| ## 要点(面试) | |
| - 相比 LayerNorm **省去均值中心化**,只做缩放,参数更少、更稳定。 | |
| - 在 **float32** 里算归一化再 `.type_as(x)` 还原,避免低精度下数值爆炸。 | |
| - `gamma`(即 `weight`)初始化为 1,等价于先不做缩放。 | |
| - LLaMA / MiniMind 全程用 RMSNorm,不使用 bias。 | |