ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

总算理清了!归一化、标准化、规范化、正则化的区别与实战指南

总算理清了!归一化、标准化、规范化、正则化的区别与实战指南 规范化、标准化、归一化、正则化四个词搞晕多少工程师这四个词我在技术社区混了这么多年见过太多人把它们当成同义词用。面试的时候问候选人“什么是归一化和标准化的区别”十个有八个会愣住然后开始即兴发挥。更离谱的是有些博客文章自己都分不清标题写的是“规范化”正文讲的是“标准化”最后代码里跑出来的又是“归一化”读完整个人都是懵的。先给结论归一化Normalization和标准化Standardization是数据预处理的两种手段属于“同一件事的两类做法”规范化Normalization的直译在中文语境里容易造成歧义有时特指特征缩放到单位范数而正则化Regularization完全是另一码事它是在模型训练阶段用来防止过拟合的“罚款机制”。它们之间唯一的共同点就是英文名长得像以及中文翻译都带个“化”字仅此而已。这篇博客就把这四兄弟彻底掰开揉碎讲清楚。我的目标是你读完以后不仅知道它们各自是什么、数学公式长什么样、代码怎么写还能知道什么场景下该用哪个、为什么不能用错以及正则化系数到底该怎么调。1. 先说结论四个词到底在说什么1.1 混用的根源在哪里中文互联网上关于这四个词的资料非常混乱根源之一在于英文术语的中文译法没有统一标准。英文里有两个词Normalization 和 Standardization前者直译过来就是“归一化”或“规范化”后者是“标准化”。但实际操作中很多技术文档和面试题会把 Normalization 和 Standardization 混着说甚至有些框架的官方文档里接口名叫normalize实际算法却用的 z-score 标准化。另一个混乱来源是“规范化”这个词。在日常口语里工程师说“把数据规范化一下”可能只是泛指“把数据整理成合适的形态”并没有明确的数学含义。但在数值计算和机器学习领域“规范化”有更精确的含义——将一个向量缩放为单位范数通常是 L2 范数这在特征工程、文本向量处理里非常常见。至于“正则化”它和前面三个在目标、场景、实现方式上完全不在一个维度。前面三个处理的是“特征数据”正则化处理的是“损失函数”。一个在训练前一个在训练中一个改变样本的尺度一个改变模型参数的目标。放在一起聊纯粹是因为中文译名都带“化”字。1.2 一张表理清四者的本质差异术语英文处理对象核心公式目标典型场景归一化Min-Max Normalization单个特征列(x - min) / (max - min)把数据压到 [0, 1] 区间图像像素处理、神经网络输入标准化Z-score Standardization单个特征列(x - mean) / std让数据服从均值为0、方差为1的分布梯度下降类模型、距离计算规范化Unit Norm / L2 Normalization单个样本向量x /x正则化Regularization模型参数/损失函数Loss λ·R(w)限制模型复杂度防止过拟合线性回归、神经网络、SVM这张表你应该保存下来面试前扫一眼基本不会说错。2. 归一化把数据压进一个框里2.1 Min-Max 归一化的数学本质归一化严谨的说法是 Min-Max Normalization公式非常简单x (x - min) / (max - min)其中 min 和 max 分别是当前特征列的最小值和最大值。做完之后这列数据的最小数变成 0最大数变成 1中间的数按比例映射到 (0, 1) 区间里。如果遇到极端情况——最大值等于最小值也就是这一列所有值都相同公式分母为 0需要特殊处理通常直接返回 0 或者 0.5取决于业务场景。这个变换的本质是一个线性映射。它不改变数据的分布形状原本是正态分布的数据做完归一化后还是正态分布的形态只是把横轴压缩到了 [0, 1] 区间。这一点非常关键很多人误以为归一化之后数据就“接近正态分布”了这是完全错误的理解。我实际用过的一次场景是图像处理。图像像素值天然就是 0 到 255 的整数如果直接喂给神经网络数值范围偏大不利于梯度下降的稳定性。常规做法是除以 255.0把像素压到 [0, 1] 区间。但细看的话这本质上就是 Min-Max 归一化因为 0 和 255 就是像素值的理论最小值和最大值。有些框架的预处理接口甚至还支持“均值归一化”x (x - mean) / (max - min)输出范围在 [-0.5, 0.5] 左右效果大同小异。2.2 为什么图像处理偏爱归一化回到热搜词里提到的“VisionMaster 图像归一化”这其实是机器视觉领域的一个高频操作。工业相机拍出来的图像受光照变化、曝光时间、传感器灵敏度影响同一个工件的灰度直方图可能差异很大。如果直接提取特征做匹配光照一变特征就飘了。用图像归一化把灰度范围拉伸到统一区间可以在一定程度上消除光照影响。图像归一化有两种常见思路。一种是全局归一化找到整张图的最小灰度值和最大灰度值然后做 Min-Max 映射。另一种是局部均值归一化把图划分成小块对每个小块减去局部均值、除以局部标准差这在人脸识别、文字检测里更常用专门用来应对光照不均匀。实际操作中如果图像里有一小块很亮的高光区域全局归一化很容易把其他区域压成接近黑色这时候反而应该用局部策略。在工业视觉软件里做图像归一化时还有一个容易踩的坑图像采集卡或者 SDK 输出的图像可能是 12 位甚至 16 位深度的灰度范围和 8 位图像完全不同。遇到这种数据先把位深信息读出来再按对应的理论最大值归一化否则图像会偏色或者暗部细节丢失。2.3 去直流与归一化ADC 信号处理的经典组合热搜词里有一条“ADC 捕捉信号后去直流和归一化”这个场景特别典型值得单独拎出来说。单片机或者 FPGA 通过 ADC 采集到的电压信号通常包含一个直流偏置分量。比如一个以 2.5V 为中心摆动的正弦信号ADC 采集到的是 0 到 5V 之间的原始波形。所谓“去直流”就是把信号的均值减掉让波形围绕 0V 上下摆动。这样做的意义在于后续做 FFT 频谱分析时直流分量会在 0Hz 处形成一个巨大的谱峰把其他频率成分的幅值“压”得看不清楚去直流后频谱图才干净。去直流的公式极其简单x x - mean(x)然后用归一化把波形缩放到 [-1, 1] 区间x x / max(|x|)注意这里的归一化不是用 Min-Max而是把峰值归一化到 ±1。这两种做法的区别是Min-Max 会保留 0 的位置偏移峰值归一化则以 0 为中心对称伸缩。对于交流信号分析来说以 0 为中心更合理。处理完之后信号可以做后续的幅度解调、频率估计、特征提取。我当年第一次做这个东西的时候犯过一个低级错误先去直流然后直接用x / 255的方式归一化忘了 ADC 是 12 位的满量程是 4095结果所有幅值都被压缩得只剩 6%后续阈值判断全部失效。后来学乖了每个项目开始前先确认 ADC 位数、参考电压、采样率把这些参数写进配置头文件里再写算法代码。3. 标准化让数据符合标准正态3.1 Z-score 标准化的计算逻辑标准化Standardization最常用的形式是 Z-score 标准化x (x - mean) / std其中 mean 是该特征列的均值std 是标准差。做完之后这列数据的均值为 0标准差为 1。如果原始数据本身就近似正态分布做完标准化后就会接近标准正态分布 N(0, 1)。这里最容易被忽略的细节是mean 和 std 是在训练集上计算得到的然后同样作用于验证集和测试集。如果你在全部数据上计算 mean 和 std就会造成信息泄露——测试集的信息在训练阶段就被模型“看到”了做离线评估时指标会虚高上线后实际效果立刻打折。我见过不少团队犯这个错误。他们把数据切分成训练集和测试集之后忘了分别计算均值和标准差直接拿全部数据的统计量来做标准化模型在测试集上表现得异常优秀上线之后直接崩。正确做法是把标准化器Scaler先 fit 在训练集上然后用训练集的 mean 和 std 去 transform 测试集。3.2 为什么要做标准化梯度下降的横纵比问题先看一个具体的类比。假设你要在一个山谷里找最低点山谷的横轴范围是 0 到 100纵轴范围是 0 到 1。如果你从某个点出发沿着最陡的方向往下走你会发现几乎所有的下降都发生在横轴方向纵轴方向几乎不动。这就好比梯度下降里某个特征的尺度过大导致损失函数等高线呈非常扁的椭圆形梯度更新来回震荡收敛极慢。标准化之后每个特征的尺度都被拉到同一个量级损失函数的等高线趋向正圆形梯度方向直接指向圆心收敛速度显著加快。这就是为什么主流的神经网络、逻辑回归、SVM 等基于梯度的模型基本都要求对特征做标准化。另一个必须做标准化的场景是距离计算。KNN、K-Means、层次聚类这类算法依赖样本间的欧氏距离。如果某个特征量纲特别大比如“收入”范围上百万它会主导整个距离的计算结果其他特征比如“年龄”范围 20-60几乎不起作用。标准化后每个特征在距离计算中的贡献才大致相当。3.3 正态分布标准化动图的直觉理解热搜词里有一条“正态分布标准化动图”这个概念对新手理解标准化特别有帮助。你可以想象一个正态分布的钟形曲线均值决定了它的中心位置标准差决定了它的胖瘦。标准化的过程就是把这个钟形曲线整体平移让中心对准 0 点然后横向拉伸或者压缩让“胖瘦”变成统一的规格。关键是这个变换只改变坐标轴的比例尺不会改变分布本身的相对形状。原来偏态分布做标准化之后还是偏态的原来双峰的还是双峰。明白这一点能避免一个常见误区不要把标准化当成“让数据变得正态”的手段。如果数据本身严重偏态应该先做对数变换、Box-Cox 变换这类非线性变换来修正分布再做标准化顺序不能反。3.4 什么时候不该做标准化并不是所有模型都需要标准化。决策树、随机森林、XGBoost、LightGBM 这类基于树结构的模型对特征尺度完全不敏感。因为它们做的是“按特征取值排序后找切分点”每个特征内部的排序关系在标准化后不变特征的重要性排序也不会变。所以在树模型上做标准化纯粹是浪费时间还可能带来一个隐患标准化后的特征可解释性下降树模型输出的特征重要性也不方便直接对应到原始量纲。热搜词里提到“做 NCA 检验数据要标准化吗”这里说的 NCANeighborhood Component Analysis邻域分量分析是一种基于距离度量的降维方法它本身依赖样本间的距离所以标准化的建议是要做。同样原理适用于 PCA、LDA 这类统计降维方法因为它们求解的是方差和协方差结构标准化能防止量纲大的特征主导主成分方向。还有个特殊情况是稀疏数据。比如文本 TF-IDF 特征矩阵里面有大量 0 值。这类数据不宜做标准化——减去均值后原本的 0 会变成负数破坏了稀疏性后续存储和计算优势全失。对于稀疏数据要么保持原样喂给线性模型要么使用专门针对稀疏矩阵的缩放策略比如除以 L2 范数。4. 规范化被误读最多的一个词4.1 口语中的“规范化”和数学中的“规范化”在口语里大家说“规范化”往往没有精确的操作定义。产品经理说“把接口规范化一下”意思是让接口风格统一测试说“把用例规范化”意思是按照模板重写一遍。但在数学和机器学习语境中“规范化”通常特指把向量缩放为单位范数即 L2 规范化。L2 规范化的公式简洁得惊人x x / ||x||₂其中 ||x||₂ 是向量的欧几里得长度等于 sqrt(x₁² x₂² ... xn²)。做完之后向量的模长变成 1方向保持不变。换句话说规范化关注的是向量的“方向”而忽略“长度”。这个操作在推荐系统和文本处理里极其常见。把用户和物品的 embedding 向量做 L2 规范化后内积等于余弦相似度计算效率高且不受向量长度影响。很多人把这项操作叫作“归一化”严格说是不准确的但社区里这么用的太多了你只能通过上下文去判断对方到底说的是哪种操作。4.2 L2 规范化与归一化的异同归一化Min-Max处理的是“一个特征的取值区间”而 L2 规范化处理的是“一个样本的全部特征构成的向量”。两者的作用维度完全不同。归一化是逐列操作的规范化是逐行操作的。用实际数字说明假设数据集有 1000 个样本、10 个特征。归一化是对第 1 列的所有 1000 个数做 Min-Max再对第 2 列做……共做 10 次。L2 规范化是对第 1 行的 10 个特征做模长归一化再对第 2 行做……共做 1000 次。什么时候用 L2 规范化典型的场景是你有一组样本每个样本由多个维度的特征拼接而成且不同样本之间的“总量”天然不同。比如在文本分类里一篇长文章和一篇短文章的 BOW 特征向量长度差异悬殊。如果你直接用余弦相似度度量长度的影响已经被消除了如果你用点积长文本会天然获得更大的分数。这时候把每篇文本的向量都规范化到单位范数再算点积等价于算余弦相似度文章长短的影响就被消除了。另一个实用案例是音频特征处理。提取的 MFCC 特征矩阵不同样本的帧数不同总能量也不同。逐帧做 L2 规范化可以减弱录音设备音量对特征的影响。5. 正则化治过拟合的“罚款机制”5.1 为什么正则化和前三者不是一类东西正则化解决的是“模型在训练集上表现很好在测试集上一塌糊涂”的过拟合问题。它的思路非常朴素在损失函数后面加一个惩罚项让模型参数不要太大从而限制模型的复杂度。线性回归的原始损失函数是最小二乘Loss Σ(yᵢ - wᵀxᵢ)²加了 L2 正则化后变成Loss Σ(yᵢ - wᵀxᵢ)² λ·Σwⱼ²加了 L1 正则化后变成Loss Σ(yᵢ - wᵀxᵢ)² λ·Σ|wⱼ|这里的 λ 是正则化系数控制惩罚的力度。λ 越大参数被压缩得越狠λ 0 退化为原始损失函数。用生活化的类比来理解正则化假设你在写一篇论文模型就是你的论述逻辑。如果允许你随意发挥你可以把每个论点都写得天花乱坠在具体案例上解释得天衣无缝但这篇论文换个场景就完全说不通——这就是过拟合。正则化相当于给每个论点加了一个字数限制逼你提炼出更普适的规律而不是死记硬背每一个特例。5.2 L1 与 L2 正则化的本质区别L1 正则化也叫 Lasso和 L2 正则化也叫 Ridge虽然只差一个绝对值符号行为却有天壤之别。L2 正则化把参数往 0 的方向整体压缩但不会严格等于 0。它的效果是让权重在数值上变小模型的决策边界变得更平滑。数学上可以证明L2 正则化等价于在参数服从高斯先验的最大后验估计。L1 正则化会把参数精确地压缩到 0。这意味着它天然具备“特征选择”功能训练完成后那些权重为 0 的特征对模型没有任何贡献可以直接剔除。L1 正则化等价于在参数服从拉普拉斯先验的最大后验估计。为什么 L1 能做到 L2 做不到的事情关键在于约束区域的形状差异。L2 的约束是一个超球面参数被压缩到接近 0 但很难恰好落在 0 点L1 的约束是一个超菱形尖角恰好位于坐标轴上最优解更容易落在尖角上也就是某些维度正好为 0。实际项目中如果特征特别多比如上万个维度可以先用 L1 筛掉一批无关特征再做 L2 精细调优。L1 和 L2 的组合叫弹性网正则化Elastic Net公式是Loss Σ(yᵢ - wᵀxᵢ)² λ₁·Σ|wⱼ| λ₂·Σwⱼ²弹性网的优点是对高度相关的特征组更稳定不会像纯 L1 那样随机从一组强相关特征里只挑一个。如果特征具有天然的组结构比如 one-hot 编码后的类别特征组组 Lasso 也是不错的选项。5.3 软阈值算子为什么是 L1 正则化的解热搜词里有条“软阈值算子为什么是 l1 正则化的解”这个问题很硬核细讲需要推导但原理值得弄明白。考虑最简单的情况目标函数是 f(w) (w - t)² λ|w|其中 t 是某个常数场景比如梯度下降中当前参数减去学习率乘梯度的中间值。我们要求这个目标函数的最小值。求导分析分三种情况当 w 0 时f(w) 2(w - t) λ令导数为 0得 w t - λ/2。当 w 0 时f(w) 2(w - t) - λ令导数为 0得 w t λ/2。当 w 0 时如果导数穿过 0 点即从正到负的变化区间包含 0则 w 0 是最优解。把三种情况统一到一个公式就是软阈值算子w* sign(t) · max(|t| - λ/2, 0)可以这样直观理解L1 正则化像是在每个参数上执行一次“向零收缩”的操作。梯度下降每迭代一步参数都先朝梯度方向移动一点然后被软阈值函数“削”掉一小截。如果某一步的中间值 |t| λ/2这一截直接把参数削到 0之后就不再更新了。这就是 L1 让权重稀疏的根本原因。而 L2 正则化在同样的一维场景下目标函数 f(w) (w - t)² λw²求导得 w* t / (1 λ)是等比缩放而非硬性置零。基数对比一目了然一个是“砍到零”一个是“缩小一点”。5.4 弹性网正则化与一致性正则化弹性网正则化上面已经提过它在高维数据和强相关特征场景下表现比较稳健。搜热词里还出现了“一致性正则化机制”这是半监督学习和自监督学习中常用的方法。它通过约束模型对同一输入的不同扰动比如文本加噪声、图像裁剪和旋转输出一致让模型学到对扰动不敏感的特征表达。它和经典正则化目标相同——提升泛化能力、防止过拟合只是加约束的位置从“参数”变成了“预测一致性”。6. 实际项目中的选型与踩坑6.1 数据预处理的先后顺序和流程建议回到实际工程里。一个典型的机器学习项目数据预处理流程应该是先做缺失值处理和异常值处理删除或填充。如有必要做偏态修正对数变换、Box-Cox。如果数据使用距离度量或梯度优化方法做标准化或归一化。再切分训练集和测试集注意 scaler 的 fit 和 transform 分开。如果特征维度极高且有稀疏需求在模型正则化里考虑 L1。每次做完预处理记下用到的统计量min、max、mean、std部署上线时要用同一套统计量来转换线上数据。如果线上的一张图片用的 min 是训练集的 min 而不是测试时重新算的 min结果会完全不对——这个问题我在生产环境里排查过很多次最后发现全是拿到新数据后重新算了一遍 min/max 导致的数据分布错乱。6.2 正则化系数怎么调正则化系数 λ 的选择没有银弹但有两条可操作的路径。第一条路径网格搜索配合交叉验证。设定一组候选值比如 [0.0001, 0.001, 0.01, 0.1, 1, 10]对每个 λ 做 k 折交叉验证选验证集误差最小的那个。这个方法简单粗暴但是有效。注意 λ 的取值范围需要根据数据量做调整数据量大的时候过拟合风险低λ 可以取小一些数据量小的时候λ 需要大一些才能压制住方差。第二条路径观察正则化路径图。以 L1 为例随着 λ 增大越来越多的特征权重变成 0。你可以画一张横轴为 λ、纵轴为权重的路径图选择“权重开始明显下滑之前”的那个 λ 附近。这个位置通常对应模型从“过拟合”转向“正常拟合”的临界点。个人习惯的经验值是先让 λ 从 0 开始逐渐增大观察训练集和验证集的损失曲线。训练集损失持续下降但验证集损失开始回升说明过拟合发生了回到验证集损失最低点的那个 λ 值就好。这里的教训是不要为了追求验证集表现而把 λ 调得过小线上数据的分布漂移会让过拟合的代价远超离线评估的收益。6.3 标准化与归一化后的模型可解释性标准化和归一化会改变特征的取值导致模型的系数解读发生变化。比如你在逻辑回归里用原始收入特征单位元范围几千到几万拟合出的系数可能是 0.0002解释起来非常别扭。标准化之后收入特征的系数会变成 0.6 这种量级表示“收入每增加一个标准差风险提高 0.6 个对数几率比”。如果你需要对业务方解释模型这种无量纲的表达反而更直观。但归一化的解释性会差一点。Min-Max 到 [0, 1] 区间之后特征之间的最大最小值被压缩在一起系数代表“从最小到最大变化的影响”理解成本稍高。所以如果你的项目需要向非技术背景的业务人员解释模型优先用标准化而不是归一化。如果要同时兼顾可解释性和模型性能还有个折中办法模型训练时用标准化数据上线前把系数和截距换算回原始尺度。线性模型的换算方式是w_original w_standardized / stdb_original b_standardized - w_standardized · mean / std。这样既拿到了标准化的训练优势又能用原始的单位去解释模型。6.4 常见问题速查表问题原因解决方案归一化后数据分布形状没变误解了 Min-Max 的作用它不改变分布形状需要正态化时改用 Box-Cox 或对数变换标准化后某些特征仍不收敛数据有极端异常值std 被拉大先做分位数裁剪再标准化测试集效果和验证集差异大scaler 在全体数据上 fit 过信息泄露只在训练集上 fit保存统计量树模型的特征重要性不稳定在树上做标准化树模型无需标准化移除预处理L1 正则化后特征数量还是太多λ 太小惩罚不足增大 λ 或改用弹性网的 L1 比例图像灰度整体偏暗全局归一化被个别高光像素主导改用灰度分位数归一化或局部归一化信号幅值全变小用了错误的位深做归一化确认 ADC 位数再计算满量程最后说一个我自己的习惯每个项目开始前先花十分钟把四个词的定义、公式、适用场景写在项目文档的首页。不是为了装样子而是为了让团队里每个人在讨论“要不要归一化”的时候心里想的都是同一个公式。这个习惯看起来很简单但在协作项目里节省的沟通成本非常可观。规范化的第一步是让“规范化”这个词本身被规范地使用——这大概也是这篇文章最想传达的一件事。
返回列表