背景

使用正则化的前提是过拟合

过拟合即训练后的权重为高方差,正则化的目的就是减小权重的方差

通过损失函数+正则项的方式减小方差:

obj=loss+Regularization

Regularization 

 L1正则化

Regularization=\sum|w_{i}|

 obj=loss+\sum|w_{i}|

梯度下降时使loss值和正则项的值最小

loss的等高线为圆环所示
L1正则项的等高线为菱形:w_1+w_2等于常数c,w_1,w_2之间肯定是线性的

w_1+w_2=c\\w_2=c-w_1

loss值在a,b,c三点都为最小值,计算正则项的最小值:

a\_reg=1+4=5\\b\_reg=0+2=2\\c\_reg=4+1=5

 正则项在坐标轴上存在最小值,在坐标轴上w_1=0,所以经过L1正则化后使得权重稀疏

L2正则化

L2 Regularization又叫做weight decay(权值衰减)

Regularization=\sum w_i^2

 obj=loss+\frac{\lambda }{2}\sum w_i^2

在进行权重更新时:

w_i=w_i-\eta( \frac{\partial loss}{\partial w_i}+\lambda w_i)\\w_i=w_i(1-\lambda )-\eta \frac{\partial loss}{\partial w_i}

\lambda取(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)

 

更多推荐