正则化
正则化其实就是在原来的目标函数的基础上又加了一项非负项, 并且这个非负项是 w 的函数。 这样的话target不变的基础上得让这个loss变得小一点, 相当于对其产生了一种约束。也可以认为正则化是减小权值方差的一种策略,减小权值的取值范围,从而使得模型求解空间变小,不会拟合出复杂的曲线(函数)
文章目录
正则化为什么可以抑制过拟合
减小模型参数(权重)大小或者参数的数量, 缓解过拟合。其实是说正则化在损失函数中加入一个非负惩罚项,在进行反向传播时就相当于在原来的权重上乘上了一个小于1的系数,使得权重减小,从而使得模型的权重的取值范围减小,即模型的求解空间变小,不会拟合出复杂的曲线(函数),从而达到抑制过拟合的目的
L1和L2正则
详细理解参考(再结合我参考资料的B站视频相信你会有更深的理解):
CSDN 系统学习Pytorch笔记九:正则化与标准化大总结
知乎 理解L1, L2正则化的正确姿势
但其实要注意:通常使用L2正则,称为权重衰减(Weight decay),一般在优化器中使用,取值一般为0.01、0.001、0.0001。不过到现在又出现了一些比较新的正则化方法,L2正则起的效果其实就没有那么大,尤其是在复杂模型。
Dropout
这个其实比较简单,就是以一定概率随机失活神经元,它在设计的时候就考虑到不改变数据分布的方差。只要注意Dropout是在全连接层使用,而且只在训练过程中使用,在推理预测是不使用的,所以一般在pytorch中设置model.train,model.eval来限制Dropout和BN。
为什么dropout可以抑制过拟合呢?dropout通过随机失活神经元,使得模型参数减少,网络变得简单,不会拟合出较为复杂的曲线,事实上也就相当于正则。
BN(BatchNormalization)
在网络层数较深时,由于链式求导的梯度更新法则,较深层的网络梯度较大,浅层的梯度较小,所以权重参数在网络的深层更新较快,会更快收敛,而浅层更新较慢(梯度下降的更新公式),而每层网络的输出会影响梯度,所以就导致整个网络收敛较慢,所以就该BN起作用了—BN其实是通过改变各层的输入、输出的均值、方差,让网络自己学习的合适的均值、方差,而不是只使用均值为0,方差为1的标准化。
一般在进行网络训练之前,要对数据做归一化,使其分布一致,但是在深度神经网络训练过程中,通常以送入网络的每一个batch训练,这样每个batch具有不同的分布,internal covarivate shift(内部协变量偏移:是指在训练过程中,数据分布会发生变化,对下一层网络的学习带来困难,最终网络输出层的数值尺度的变化导致网络无法训练。为了解决internal covarivate shift问题,batch normalizaiton这篇论文提出。但其实BN层更多的是我们可以使用更大学习率,加速模型收敛,但一般不会提升模型的精度,并没有解决网络各层内部协变量偏移的问题。
BN、LN、IN、GN的区别
BatchNormalization、LayerNormalization、InstanceNorm、GroupNorm、SwitchableNorm总结
为什么网络训练之前,要对数据做标准化?
标准化是归一化的一种,是指数据服从均值为0,方差为1的分布。归一化和标准化的相同点都是对某个特征(column)进行缩放(scaling)而不是对某个样本的特征向量(row)进行缩放。对特征向量进行缩放是毫无意义的。 比如三列特征:身高、体重、血压。每一条样本(row)就是三个这样的值,对这个row无论是进行标准化还是归一化都是好笑的,因为你不能将身高、体重和血压混到一起去!
在线性代数中,将一个向量除以向量的长度,也被称为标准化,不过这里的标准化是将向量变为长度为1的单位向量,它和我们这里的标准化不是一回事儿,不能搞混。
如果我们网络的输入特征在不同范围,假如 x1取值范围从1到1000,而x2在0到1,那么我们学习到的特征参数的范围也会很大不同,从而使得模型的求解变得困难,比较难收敛,所以需要标准化来统一输入数据的分布,加速模型收敛。
参考资料
CSDN 系统学习Pytorch笔记九:正则化与标准化大总结
CSDN 逻辑回归、优化算法和正则化的幕后细节补充
知乎 理解L1, L2正则化的正确姿势
b站 权重衰退【动手学深度学习v2】
B站 正则化、偏差和方差
CSDN 归一化输入-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
CSDN 标准化和归一化 超全详解
B站 批量归一化【动手学深度学习v2】
CSDN 3.6 BatchNorm 为什么起作用-深度学习第二课《改善深层神经网络