归一化:RMSNorm朴素

归一化:RMSNorm朴素

RMSNorm朴素.h

// RMSNorm朴素.h —— RMSNorm(均方根归一化)朴素标量实现声明// 用途:每个 transformer/DeltaNet 块的输入归一化,是层堆叠稳定训练与推理的基础#pragmaonce// 引入基础类型(浮点/size_t 别名)#include"公共/基础定义.h"// RMSNorm朴素:对一维向量做均方根归一化,再乘可学习缩放权重// 公式:$$ \hat{x}_i = \frac{x_i}{\sqrt{\frac{1}{d}\sum_{j=1}^{d} x_j^2 + \epsilon}} \cdot \gamma_i $$// 纯文本:x̂_i = x_i / sqrt( (1/d)·Σx_j² + ε ) · γ_i// 含义:先算全部元素的平方均值(除以维度 d),开方得「均方根」,每个元素除以它再乘 γ_i。// γ 是模型权重(attn_norm.weight 等,维度 = 隐藏维);ε 是防除零小量,// 实测 qwen35moe 的 rms_eps = 1e-6。// 参数:输入 = 待归一化向量起点;权重 = 缩放 γ(维度 = 维度);输出 = 结果起点;// 维度 = 向量长度(= 权重长度);epsilon = 防除零常数// 说明:输出可等于 输入(就地),但调用方传独立缓冲即可;朴素实现用 double 累加平方和voidRMSNorm朴素(constfloat*输入,constfloat*权重,float*输出,size_t 维度,floatepsilon);

RMSNorm朴素.cpp

// RMSNorm朴素.cpp —— RMSNorm(均方根归一化)朴素标量实现// 用途:先求均方根,再逐元素除乘缩放权重#include"内核/归一化/RMSNorm朴素.h"// 引入标准头:平方根 sqrt#include<cmath>// RMSNorm朴素:均方根归一化 + 可学习缩放// 公式:x̂_i = x_i / sqrt( (1/d)·Σx_j² + ε ) · γ_i// 实现两步:① 求均方根(double 累加平方和防精度损失);② 逐元素 除均方根 × γvoidRMSNorm朴素(constfloat*输入,constfloat*权重,float*输出,size_t 维度,floatepsilon){// 第一步:累加平方和。用 double 累加,避免大量 float 累加累积舍入误差double平方和=0.0;for(size_t i=0;i<维度;++i){平方和+=static_cast<double>(输入[i])*输入[i];}// 均方根 = sqrt( 平方和/维度 + ε )constdouble均方根=std::sqrt(平方和/static_cast<double>(维度)+static_cast<double>(epsilon));// 第二步:每个元素除以均方根、乘缩放权重 γ,全程用 double 中间量保证精度for(size_t i=0;i<维度;++i){输出[i]=static_cast<浮点>(static_cast<double>(输入[i])/均方根*static_cast<double>(权重[i]));}}