L1L2正则化

P范数

p范数的定义

$\|\mathbf{x}\|_{p}:=\left(\sum_{i=1}^{n}\left|x_{i}\right|^{p}\right)^{1 / p}$

p=1时 $\|\boldsymbol{x}\|_{1}:=\sum_{i=1}^{n}\left|x_{i}\right|$
p=2时 $\|\boldsymbol{x}\|_{2}:=\left(\sum_{i=1}^{n}\left|x_{i}\right|^{2}\right)^{\frac{1}{2}}$
L1范数是指向量中各个元素绝对值之和,L2范数是指向量各元素的平方和然后求平方根。
事实上,等价于在求最优化问题上加一个约束条件。

L1-regularization

$\mathbf{w}^{*}=\arg \min _{\mathbf{w}} \sum_{j}\left(t\left(\mathbf{x}_{j}\right)-\sum_{i} w_{i} h_{i}\left(\mathbf{x}_{j}\right)\right)^{2}+\lambda \sum_{i=1}^{k}\left|w_{i}\right|$

$t\left(\mathbf{x}_{j}\right)$为真实值,$\sum_{i} w_{i} h_{i}\left(\mathbf{x}_{j}\right)$为预测值,在loss函数中加入$\lambda \sum_{i=1}^{k}\left|w_{i}\right|$做l1正则化。
L1L2正则化_第1张图片
把问题简单化,当只有两个权重变量 $w_1$ ,$w_2$ 时分析。椭圆为原目标函数的一条等高线,最优解在 $w_{lin}$ 处,此时的 $w_1$ ,$w_2$ 会造成模型过拟合。加入L1范数做为约束条件,保证 $w$的位置不能离开红外矩阵,蓝色箭头 $E_{in}$为目标函数在该处的梯度方向, $w$只能沿着边界向左上方移动 。最终 $w$将稳定在顶点处,达到最优解 $w^*$,此时, $w_1$=0,这也就是采用l1范数会使 $w$产生稀疏性的原因。

regularization_loss = 0
for param in model.parameters():
    regularization_loss += torch.sum(abs(param))

calssify_loss = criterion(pred,target)
loss = classify_loss + lamda * regularization_loss

optimizer.zero_grad()
loss.backward()
optimizer.step()

L2-regularization

$\mathbf{w}^{*}=\arg \min _{\mathbf{w}} \sum_{j}\left(t\left(\mathbf{x}_{j}\right)-\sum_{i} w_{i} h_{i}\left(\mathbf{x}_{j}\right)\right)^{2}+\lambda \sum_{i=1}^{k} w_{i}^{2}$

L1L2正则化_第2张图片
在PyTorch中某些optimizer优化器的参数weight_decay (float, optional)就是 L2 正则项,它的默认值为0。
选择一个合适的权重衰减系数λ非常重要,这个需要根据具体的情况去尝试,初步尝试可以使用 1e-4 或者 1e-3

optimizer = torch.optim.SGD(model.parameters(),lr=0.01,weight_decay=0.001)

$\sum_{i=1}^{k} w_{i}^{2}$ 当i=2时,l2范数为圆。梯度下降法更新$w$,只能朝着范数球上的$w$处的切线方向更新,既绿色箭头的位置。当运动到$w^*$时切线方向分量为0,无法继续移动,达到最优解。
以上分析基于二维情况,扩展到高维同理。

L1范数可以进行特征选择,即让特征的系数变为0,L2范数可以防止过拟合,提升模型的泛化能力。

你可能感兴趣的:(神经网络)