PyTorch 11.正则化
- 正则化
正则化
正则化即表示减少数据方差的策略
- 误差可分解为:偏差,方差与噪声之和。即
误差=偏差+方差+噪声
偏差:度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力。
方差:度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响。
噪声:表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界。 - nn.Dropout
减轻神经元对某个特征的过度依赖,减少过拟合。
随机:dropout probability
失活:weight=0
注意:测试时,所有权重应乘以1-drop_prob - Batch Normalization(一个batch中单个通道归一化)
批:一批数据,通常为一个batch的大小
标准化:均值为0,方差为1
优点:
可以用更大学习率,加速模型收敛
可以不用精心设计权重初始化
可以不用dropout或较小的dropout
可以不用L2或者较小的weight decay
可以不用LRN(local response normalization)
__init__(self,num_features,eps=1e-5,momentum=0.1,affine=True,tracking_running_stats=True)
参数:
num_features:样本特征数量
eps:分母修正项
momentum:指数加权平均估计当前mean/var
affine:是否需要affine transform
track running stats: 是训练状态,还是测试状态
在训练时,均值和方差是计算的一个batch的数量的样本,测试时,我们要逐一处理样本,方法是根据你的训练集估算均值和方差。
估算的方式:理论上可以在最终的网络中运行整个训练集得到均值和方差,但是在实际操作中,通常运用指数加权平均来追踪在训练过程中看到的均值和方差的值,然后用网络训练过程中得到的和
参数来计算测试样本
4. Layer Normalization (单个样本的归一化)
BN实际使用时需要计算并且保存某一层神经网络batch的均值和方差等统计信息,对于一个固定深度的前向神经网络使用BN,很方便;但是对于RNN来说,sequence长度是不一致的,换句话说RNN的深度是不固定的,不同的time-step需要保存不同的statics特征,可能存在一个特殊sequence比其他sequence长得多
nn.LayerNorm(
normalized_shape,
eps=1e-05,
elementwise_affine=True
)
主要参数:
normalized_shape:该层特征形状
eps:分母修正项
elementwise_affine:是否需要affine transform
LN中同层神经元输入拥有相同的均值的方差,不同的输入样本有不同的均值和方差;
BN中则针对不同神经元输入计算均值和方差,同一个batch中的输入拥有相同的均值和方差。
- Instance Normalization(W,H 归一化)
常见于图像生成,因为BN注重对每个batch进行归一化,保证数据分布一致,因为判别模型中结果取决于数据整体分布,但是图像风格化总,生成结果主要依赖于某个图像实例,所以对整个batch归一化不适合图像风格化中,因而对HW做归一化,可以加速模型收敛,并且保持每个图像实例之间的独立。
nn.InstanceNorm2d(
num_features,
eps=1e-05,
momentum=0.1,
affine-False,
tracking_running_stats=False
)
主要参数:
num_features:一个样本特征数量
eps:分母修正项
momentum:指数加权平均估计当前mean/var
affine: 是否需要affine transform
track_running_stats: 是训练状态,还是测试状态
- Group Normalization(G,W,H归一化)
起因:小batch样本中,BN估计的值不准
思路:数量不够,通道来凑
注意事项:
1 不再有running_mean和running_var
2和
为逐通道(channel)
主要是针对BN对小batchsize效果差,GN将channel方向分组,然后每个组内做归一化
nn.GroupNorm(
num_groups,
num_channels,
eps=1e-05,
affine=True)