Normalization
归一化会将特征或激活值重新缩放到统一范围,避免某个数值范围占据主导。内容涵盖最小-最大归一化、z 分数、L2 归一化和归一化层。
归一化是将数值重新缩放到共同尺度的过程,可避免某个特征仅仅因为单位不同就主导模型。在数据预处理中,它通常指在训练前将每个输入特征转换到 \[0, 1] 这样的固定范围,或转换为均值为零、方差为一的分布。在神经网络内部,批归一化等归一化层会将相同的思路应用于中间激活值。如果不进行归一化,在每次距离计算和梯度更新中,以数千为单位的特征(例如收入)就会压过以个位数为单位的特征(例如家庭人数)。
常见归一化技术#
- 最小-最大缩放:使用 (x − min) / (max − min) 将每个特征映射到 \[0, 1]。极端值会把其他值压缩到很窄的区间,因此这种方法适用于取值范围已知且固定的特征,例如除以 255 后的 8 位像素值。
- Z 分数标准化:减去特征均值,再除以标准差,使均值为 0、标准差为 1。这通常是取值范围不固定的特征的默认选择。
- 稳健缩放:减去中位数,再除以四分位距,因此少量离群值几乎不会影响其他数值的缩放方式。
- 对数缩放:应用对数变换(通常为 log(1 + x)),在进行其他缩放前压缩价格、人口或浏览量等长尾特征。
- 单位向量 (L2) 归一化:将每个样本的向量除以其长度,使每个向量的范数都为 1。将其应用于嵌入后,余弦相似度就会变成普通点积。scikit-learn 的 Normalizer会按样本执行此操作;期待它像
MinMaxScaler那样缩放每个特征的用户可能会对此感到意外。
选择哪种方法,取决于要缩放的内容及其数值分布:
归一化为何重要#
k 近邻 (k-NN)、k-means 聚类和 RBF 核支持向量机等基于距离的方法会比较原始欧几里得距离,因此取值范围最广的特征会决定哪些点被视为接近。基于梯度的模型使用归一化输入时训练速度更快,因为尺度差异很大的特征会将损失曲面拉伸成狭窄的谷地,使得梯度下降必须采取小步长。随机森林等树集成模型每次根据一个特征阈值进行划分,因此无论如何进行单调缩放,得到的划分都相同。对 Wine 数据集进行缩放后再运行 k-NN,可以看到这种影响有多大:
from sklearn.datasets import load_wine
from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import MinMaxScaler, StandardScaler
# 13 chemical features on very different scales, from hue (about 0.5-1.7) to proline (about 280-1,680)
X, y = load_wine(return_X_y=True)
# k-NN compares raw distances, so unscaled proline dominates every distance
for name, scaler in [("none", "passthrough"), ("min-max", MinMaxScaler()), ("z-score", StandardScaler())]:
# The pipeline fits the scaler on each training fold only, so no test statistics leak in
model = make_pipeline(scaler, KNeighborsClassifier())
accuracy = cross_val_score(model, X, y, cv=5).mean()
print(f"scaling {name:8s} 5-fold accuracy: {accuracy:.3f}")不进行缩放时,k-NN 的准确率为 0.691,因为取值范围约为 1400 的脯氨酸在每次距离计算中都比其他 12 个特征更重要。最小-最大缩放将准确率提高到 0.950,Z 分数标准化则将准确率提高到 0.949。将缩放器拟合过程放在流水线中很重要:在拆分数据集之前,根据整个数据集计算最小值、最大值、均值或标准差,会将测试集信息泄漏到训练过程中,这属于数据泄漏。
计算机视觉中的归一化#
图像按通道进行归一化。将 8 位像素值除以 255,可将其映射到 [0, 1];许多分类骨干网络随后会减去每个通道的均值,再除以标准差:torchvision 的 ImageNet 预训练 ResNet-50要求均值为 (0.485, 0.456, 0.406),标准差为 (0.229, 0.224, 0.225)。如果向预训练模型输入的归一化方式与其训练数据不同,每个激活值都会发生偏移,导致准确率下降。Ultralytics YOLO 预处理会将像素值除以 255,不进行均值或标准差偏移;无论是训练还是预测都是如此,因此 YOLO26接收的输入始终位于 [0, 1]。
医学图像需要采用与模态相适应的规则。CT 扫描以亨氏单位存储强度值,这是一种物理量纲,其中空气为 −1000,水为 0,因此不同扫描可以使用同一组统计量:广泛使用的 nnU-Net分割框架会将所有训练样本前景值的第 0.5 和第 99.5 百分位之外的 CT 强度值截断,然后使用整个数据集的均值和标准差进行 Z 分数标准化。MRI 强度没有固定的物理量纲,且会因扫描仪而异,因此 nnU-Net 会分别对每次 MRI 扫描进行 Z 分数标准化。










