1.3 Regularization
从过拟合的本质出发,系统引入参数正则化与结构正则化机制,并澄清其与归一化方法的根本区别
为什么需要正则化
直观上理解
在原始的无约束优化问题中,给定训练数据,只要求训练损失越小越好
只要在训练集上预测对,不管用了什么方式,不管参数长什么样,只要损失一样小,在优化器眼里这些解完全等价
但在高维模型(尤其是神经网络)中,“训练损失很小”的解不是一个点,而是一大片区域,里面可能有:
参数很小、变化平滑的解
参数巨大、极度敏感的解
稍微扰动输入就崩掉的解
非常稳定、抗噪声的解
以上这些解在训练集上,损失几乎一样
从数学角度理解
监督学习的目标并非最小化训练误差,而是最小化泛化误差:
R(θ)=E(x,y)∼D[L(fθ(x),y)]但真实分布 $\mathcal{D}$ 不可得,只能通过有限样本 $\mathcal{D}_{train}$ 近似:
Remp(θ)=N1i=1∑NL(fθ(xi),yi)
过拟合并不是指模型复杂,其本质而是:
参数空间中存在大量对训练集低损失、但对分布扰动极不稳定的解
梯度下降在高维空间中,极易滑向这些“尖锐极小值”
正则化的核心目标
正则化不是直接提升训练精度,而是改变优化问题的几何结构,打破损失相近的不同解之间“等价”的假设,使“稳定的解”更容易被找到
正则化不是在约束模型,而是在约束“哪种解值得被相信”
那么正则化约束如何进入优化问题
原始无约束优化问题:
θminL(θ)正则化后的等价形式:
θminL(θ)+λΩ(θ)$L(\theta)$:数据一致性——“在训练集上做得怎么样?”
$\Omega(\theta)$:复杂度度量——“这个解,看起来靠谱吗?”
$\lambda$:在“拟合”与“稳定”之间的权衡系数——“到底有多在乎‘靠谱吗’这件事?”
通过修改优化目标,正则化直接从目标函数层面作用于可行解空间/参数空间,从而限制“不稳定的使用方式”
在不同的解中,参数小往往意味着解更好,因为参数越大 → 输出对输入越敏感 → 一点点噪声就会放大
L2 正则化
L2 正则化(Weight Decay)的定义:
Ω(θ)=21∥θ∥22带正则项的目标函数:
Lreg(θ)=L(θ)+2λ∥θ∥22对参数求梯度:
∇θLreg=∇θL(θ)+λθ梯度下降更新:
θt+1=θt−η(∇L(θt)+λθt)=(1−ηλ)θt−η∇L(θt)机制理解:
通过 L2 正则,参数在每一步都会被整体向 0 拉回,并优先抑制那些仅靠放大参数幅值来降低损失的方向
相当于持续地、温和地告诉模型:不要靠“把某个参数拧得特别大”来拟合数据
从几何视角看,L2 正则倾向于选择损失盆地中更平坦、曲率更小的解,通过连续收缩,引导优化走向平坦解
L1 正则化
L1 正则化的定义:
Ω(θ)=∥θ∥1=i∑∣θi∣正则化目标:
Lreg(θ)=L(θ)+λi∑∣θi∣梯度(严格来说是次梯度):
∂θi∂∣θi∣=⎩⎨⎧+1,−1,[−1,1],θi>0θi<0θi=0机制理解:
相比于 L2 正则限制参数的大小,L1 正则不是简单地缩小参数,而是主动制造精确为 0 的维度
由于在 0 附近存在“不可导拐角”,那么参数一旦足够小,就会被直接压到 0
通过制造几何拐角,制造结构稀疏性,而模型自动完成“特征选择”,仅保留少数关键方向
Dropout
Dropout 从参数正则化到结构正则化,
Dropout 并不是在目标函数中显式加项,而是在训练阶段随机破坏网络结构
训练时:
h(l)=m(l)⊙f(W(l)h(l−1))其中,$m^{(l)} \sim \text{Bernoulli}(p)$
每一次前向传播,都是一个“子网络”
测试时:
E[h(l)]≈p⋅f(W(l)h(l−1))机制理解:
Dropout 从参数的正则化转向结构的正则化,不允许模型依赖任何一条固定通路
每次训练随机砍掉一部分神经元,使网络结构不断变化
保证只有在“很多不同子网络中都好用的表示”,才能存活下来
通过结构随机性,迫使表示具有鲁棒性
Dropout ≈ 对指数数量子模型的参数共享平均,是一种隐式的模型集成
Regularization ≠ Normalization
正则化(Regularization):
作用对象:解空间 / 参数空间
改变的是:什么样的解被偏好
目标:抑制过拟合、提升泛化
归一化(Normalization,如 BatchNorm / LayerNorm):
作用对象:中间激活分布
改变的是:优化路径与梯度尺度
目标:稳定训练、加速收敛
虽然:Normalization 往往带来“正则化效应”,但本质上它们解决的是完全不同层级的问题
作用层级
中间表示
解空间
是否进入目标函数
否
是
主要目标
稳定优化
抑制过拟合
是否改变最优解集合
通常不
明确改变
梯度裁剪
虽然像 AdamW 这样的优化器和合理的学习率调度策略能改善 Transformer 的训练稳定性,但由于模型层数深、计算路径长,仍可能出现另一个数值问题——梯度爆炸
为什么会出现梯度爆炸
在反向传播过程中,梯度是逐层传递的
若每层梯度的范数略大于 1,这种“链式乘积”可能随着层数增加呈指数增长,导致梯度幅度变得非常大,从而引发:
参数更新剧烈跳动
数值溢出甚至 NaN
训练损失震荡或发散
虽然像层归一化等结构能缓解一部分梯度问题,但在训练初期或遇到异常输入时仍可能发生大梯度爆发
梯度裁剪(Gradient Clipping)是一种直接应对梯度爆炸的技术:
在优化器根据梯度更新参数之前,对梯度的大小设置上限
如果梯度的总范数超过阈值,则按比例缩小到该阈值,从而限制单次更新步长
按全局范数裁剪(Transformer 训练中最常见的梯度裁剪方式)
设所有可训练参数的梯度组成一个向量 $G$,$||G||_2$ 是其 L2 范数(即欧几里得范数)
其中,L2 范数定义为:
∣∣G∣∣2=i∑(∂θi∂L)2给定一个阈值
max_norm:若 $||G||_2 \leq \text{max_norm}$:梯度不变
若 $||G||_2 > \text{max_norm}$:则整体缩放为:
Gclipped=G×∣∣G∣∣2max_norm
这种方式保持梯度方向不变,只限制其整体幅度,有助于避免单次更新过大,同时保留优化方向不偏离
在大多数深度学习框架中,梯度裁剪已被内置支持,并应在梯度计算之后、参数更新之前调用。典型的 PyTorch 调用方式如下:
选择
max_norm阈值的经验常见范围:约在 $[0.5,\ 5.0]$
常用起点:$1.0$
过低:可能过度限制梯度,从而减慢学习甚至阻碍模型收敛
过高:会无法有效抑制异常大梯度
Last updated
Was this helpful?