正则化:
上面这条曲线表示验证集的loss情况;下面这条曲线表示训练集的loss情况
方差:表示的是训练集与验证集之间的差异
L2正则化
正则化:降低方差,解决过拟合
L1正则化:要cost与wi的绝对值之和都要小,参数解发生在坐标轴上,表明参数解有稀疏项。
L2正则化又称为权值衰减
在参数更新中多了一个(1-lamda),lamda大于0小于1,故因此L2正则化又称为权值衰减。
权值不断减小,以至于模型没那么复杂
在pytorch中,L2正则化加载在optimizer中实现
optim_weight_decay = torch.optim.SGD(net.parameters(), lr=lr_init, momentum=0.9, weight_decay=1e-2)
在sgd中:
L2正则化通过一下两个等式实现权值衰减:即在grad之后加上lamdaw
d_p=d_p+(pweight_decay)
p=p-(d_p*group[‘lr’])
正则化Dropout
dropout:(降低方差;类似于L2正则化,收缩权重)
使某些神经元的weight=0,无法与上层或下层的神经元进行连接
作用:
1)减少依赖(不会给某些神经元权重过大的机会,解除过度依赖)
2)权重数值约束
但是,训练时由于对神经元进行Dropout后,神经元的数量尺度会缩小为原来的70%,以某一个神经元来说,他与上层中没有失活的神经元进行连接,而测试时不进行Dropout,以某一个神经元来说,他与上层所有的神经元进行连接。故训练阶段与测试阶段的神经元连接的尺度不匹配。
在pytorch中,故在训练时,用权重乘以1/(1-p),抵消训练阶段数据尺度的变化,在测试时无需再缩放权重,加速收敛。
dropout放在需要dropout层的前一层,常见的形式:
dropout—>linear----->Relu
通常在输出层前不用加dropout
在训练时,dropout起作用使某些神经元失活(通过net.train()函数控制是训练阶段)
在测试及验证时,dropout不起作用,神经元全部存在(通过net.eval()函数控制是测试及验证阶段)
net.train()和net.eval()主要是对self.training进行控制:
1)True:为训练状态
2)False:为测试及验证状态
默认为True状态