Regularization
正则化会在训练过程中约束模型,使其能够泛化,而不是记住噪声。涵盖 L1、L2、权重衰减、dropout 和提前停止。
正则化是指对模型训练方式进行的任何调整,目的是降低模型在新数据上的误差,即使模型在训练数据上的误差有所上升。正则化可以抑制过拟合:当模型容量足够大时,模型会记住所见样本中的噪声和细微特征。正则化通过惩罚较大的权重、注入噪声、增加多样化数据或提前停止训练,来限制模型的有效复杂度。从偏差-方差的角度来看,正则化会接受少许额外偏差,以换取方差的大幅降低。
L1 和 L2 惩罚#
经典形式是在损失函数中加入权重惩罚项:总损失 = 数据损失 + λ × 惩罚项。L2 正则化惩罚权重平方和 Σw²,按权重大小将每个权重拉向零;在线性模型中,这称为岭回归。L1 正则化惩罚权重绝对值之和,其恒定的拉力会将许多权重精确地推至零,因此,带 L1 惩罚的线性回归(即套索回归)也可用于特征选择。弹性网络结合了两者。惩罚强度 λ 在 scikit-learn 中称为 alpha,它是一个超参数:值太小,模型仍会过拟合;值太大,模型则会欠拟合。用 12 个来自正弦波的带噪点拟合 9 次多项式,能展示这两种失效情形:
import numpy as np
from sklearn.linear_model import Ridge
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import PolynomialFeatures
rng = np.random.default_rng(0)
# 12 noisy training points from a sine wave, plus clean test points
x_train = rng.uniform(0, 1, (12, 1))
y_train = np.sin(2 * np.pi * x_train[:, 0]) + rng.normal(0, 0.2, 12)
x_test = np.linspace(0, 1, 200)[:, None]
y_test = np.sin(2 * np.pi * x_test[:, 0])
# The same degree-9 polynomial, fit with a growing L2 penalty on its coefficients
for alpha in (0.0, 1e-4, 1e-2, 1.0):
model = make_pipeline(PolynomialFeatures(9), Ridge(alpha=alpha)).fit(x_train, y_train)
train_mse = np.mean((model.predict(x_train) - y_train) ** 2)
test_mse = np.mean((model.predict(x_test) - y_test) ** 2)
weight_norm = np.linalg.norm(model[-1].coef_)
print(f"alpha {alpha:g}: train MSE {train_mse:.4f}, test MSE {test_mse:.4f}, |w| {weight_norm:.1f}")不加惩罚项时,多项式会随着噪声弯曲:其系数范数达到约 425,000,训练误差为 0.0148,测试误差为 0.1859。惩罚项设为 0.0001 时,系数范数降至 20.8,测试误差降低了 11 倍,达到 0.0170,而训练误差升至 0.0334。当 alpha 为 1 时,惩罚项占主导,模型出现欠拟合,测试误差为 0.3998。
神经网络中的权重衰减和 Dropout#
在神经网络中,L2 正则化通常采用权重衰减的形式:每次更新时,也会按一定比例缩小每个权重。对于普通的随机梯度下降,两者是等价的。对于 Adam 等自适应优化器,加到梯度上的 L2 项会被 Adam 的逐参数缩放系数除,因此梯度较大的权重几乎不会受到正则化。解耦权重衰减则直接进行权重缩减,由此得到的 AdamW 优化器是 Transformer 的标准选择。
Dropout 层在每个训练步骤中,以概率 p 将每个单元的输出置零,并将保留的输出乘以 1/(1 − p),这样网络就无法依赖任何单个单元;实际上,这相当于训练许多共享权重的精简子网络。推理时,每个单元都会保持激活状态。最初的实验发现,对于隐藏单元,将丢弃概率设为 0.5,在各种网络和任务中都接近最优。
Ultralytics YOLO 训练提供了这两项设置:weight_decay 默认值为 0.0005,仅作用于卷积层和线性层的权重,不作用于偏置和归一化层参数;dropout 默认值为 0.0,作用于 YOLO26分类模型最终线性层之前。
from ultralytics import YOLO
# 加载预训练的 YOLO26n 分类模型
model = YOLO("yolo26n-cls.pt")
# 在分类头中使用 dropout,并采用更强的权重衰减进行训练
results = model.train(data="mnist160", epochs=10, dropout=0.2, weight_decay=0.001)其他正则化技术#
- 数据增强:翻转、裁剪、缩放、颜色偏移和马赛克增强了训练图像的多样性,因此模型能在比原始数据集所包含的更多条件下观察每个对象。
- 标签平滑:用略微平滑的目标值替代 one-hot 分类目标,使模型不再将 logits 推向极端置信度。
- 隐式正则化:批归一化带来的小批次训练梯度噪声和批次间噪声,都能在没有显式正则项的情况下发挥正则化作用。
提前停止通过限制训练时长来实现正则化。它会在每个轮次后使用验证数据评估模型,并在分数连续若干轮次(称为耐心值)没有提升时停止训练,同时保留迄今为止表现最佳的权重:










