归一化:RMSNorm朴素

📅 2026/8/9 3:56:37
归一化: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_{j1}^{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#includecmath// 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 i0;i维度;i){平方和static_castdouble(输入[i])*输入[i];}// 均方根 sqrt( 平方和/维度 ε )constdouble均方根std::sqrt(平方和/static_castdouble(维度)static_castdouble(epsilon));// 第二步每个元素除以均方根、乘缩放权重 γ全程用 double 中间量保证精度for(size_t i0;i维度;i){输出[i]static_cast浮点(static_castdouble(输入[i])/均方根*static_castdouble(权重[i]));}}