正则化¶
Note
深度神经网络的拟合能力虽强,但代价是过拟合的风险
从《机器学习手册》中我们就知道,正则化(regularization)是线性模型处理过拟合的有效手段,对于深度神经网络来说也是如此
Intuition¶
一般地,对于同类模型其参数越多,参数的取值范围越大,其拟合能力就越强,也越容易过拟合。
要平衡模型的拟合能力和过拟合的风险,往往可以在参数的取值范围上做文章,正则化就是通过对绝对值大的参数做惩罚,软性地限制参数的取值范围。
在神经网络中,若模型的直接损失为 \(L\),那么加上 \(l_{1}\) 正则后的目标函数:
\[L + \lambda\left \|\boldsymbol{\theta} \right \|_{1}\]
加上 \(l_{2}\) 正则后的目标函数:
\[L + \frac{\lambda}{2}\left \|\boldsymbol\theta \right \|_{2}^{2}\]
若使用梯度下降,\(l_{2}\) 正则化等价于权重衰减:
\[\boldsymbol\theta_{t} = (1 - \lambda\eta)\boldsymbol\theta_{t - 1} - \eta\nabla\boldsymbol{\theta}_{t - 1}\]
Pytorch中的正则化¶
import torch
from torch import nn
net = nn.Sequential(nn.Linear(784, 1))
# pytorch可直接在optimizer中定义权重衰减,此时weight和bias都衰减
# weight_decay默认为0
lr = 0.1
weight_decay = 0.01
optimizer = torch.optim.Adam(net.parameters(), lr=lr, weight_decay=weight_decay)
# 自定义不衰减bias
optimizer = torch.optim.SGD([{"params":net[0].weight,'weight_decay': weight_decay},
{"params":net[0].bias}], lr=lr)
Warning
在Adam等较复杂的优化方法中,权重衰减不等价于l2正则化,不过是类似的,用就是了
对于深度神经网络,正则化的效果不够显著,还需要其他方法(后两节会介绍)