背景
使用正则化的前提是过拟合
过拟合即训练后的权重为高方差,正则化的目的就是减小权重的方差
通过损失函数+正则项的方式减小方差:
Regularization
L1正则化
梯度下降时使loss值和正则项的值最小
loss的等高线为圆环所示
L1正则项的等高线为菱形:w_1+w_2等于常数c,w_1,w_2之间肯定是线性的
loss值在a,b,c三点都为最小值,计算正则项的最小值:
正则项在坐标轴上存在最小值,在坐标轴上w_1=0,所以经过L1正则化后使得权重稀疏
L2正则化
L2 Regularization又叫做weight decay(权值衰减)
在进行权重更新时:
取(0,1),经过L2正则化后权重减小
L1使得权重稀疏,L2使权重减小
net_weight_decay
torch.optim.SGD(net_weight_decay.parameters(), lr=lr_init, momentum=0.9, weight_decay=1e-2)
没有经过L2正则化的网络权重一直都很大,含有大量网络参数
经过L2正则化的网络权重不断减小,防止过拟合
对反向传播过程进行debug:
for i, param in enumerate(params):
d_p = d_p_list[i] if not maximize else -d_p_list[i]
if weight_decay != 0:
d_p = d_p.add(param, alpha=weight_decay) # p=p+w*p
if momentum != 0:
buf = momentum_buffer_list[i]
if buf is None:
buf = torch.clone(d_p).detach()
momentum_buffer_list[i] = buf
else:
buf.mul_(momentum).add_(d_p, alpha=1 - dampening)
if nesterov:
d_p = d_p.add(buf, alpha=momentum)
else:
d_p = buf
param.add_(d_p, alpha=-lr)