添加Dropout
- 详情可参考: DL——为什么Dropout能防止过拟合
参数范书惩罚
相关参数: Weight decay(权重衰减)
添加L2或L1正则化, 详情可参考: ML——模型的方差与偏差
L1正则化:
- L1又称为: Lasso Regularization(稀疏规则算子)
- 计算公式为: 参数绝对值求和
- 意义: 趋向于让一些参数为0, 可以起到特征选择的作用
L2正则化:
- L2又称为: Ridge Regression(岭回归)
- Weight decay 是放在正则项(Regularization)前面的一个系数,正则项一般指模型的复杂度
- Weight decay 控制模型复杂度对损失函数的影响, 若Weight Decay很大,则模型的损失函数值也就大
- pytorch中实现了L2正则化,也叫做权重衰减,具体实现是在优化器中,参数是
weight_decay
, 默认为0
PyTorch中的
weight_decay
参数说明
weight_decay (float, optional): weight decay (L2 penalty) (default: 0)
我之前的实现代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# zero the parameter gradients
optimizer.zero_grad()
# forward
outputs = model(inputs)
# _, preds = torch.max(outputs.data, 1)
loss = loss_criterion(outputs, labels)
# L1 regularization
l1_loss = 0
for w in model.parameters():
l1_loss += torch.sum(torch.abs(w))
loss += l1_rate * l1_loss
# backward + optimize only if in training phase
if phase == 'train':
loss.backward()
optimizer.step()- 其中
# L1 regularization
后面是添加的L1 正则化
- 其中
就整体而言,对比加入正则化和未加入正则化的模型,训练输出的loss和Accuracy信息,我们可以发现,加入正则化后,loss下降的速度会变慢,准确率Accuracy的上升速度会变慢,并且未加入正则化模型的loss和Accuracy的浮动比较大(或者方差比较大),而加入正则化的模型训练loss和Accuracy,表现的比较平滑。并且随着正则化的权重lambda越大,表现的更加平滑。这其实就是正则化的对模型的惩罚作用,通过正则化可以使得模型表现的更加平滑,即通过正则化可以有效解决模型过拟合的问题。
数据增强
- 提高模型的泛化能力最好的办法是, 使用更多的训练数据进行训练
- 创造一些假数据添加到训练集中
- 实例:
- AlexNet中使用对图片旋转等方式生成新的图片作为样本加入训练, 误差能降低1%
提前终止训练
- 当发现数据在验证集上的损失趋于收敛甚至开始增加时,停止训练
- 即使模型在验证集上的损失还在减小
参数绑定与参数共享
Soft Weight Sharing
- 类似于CNN中卷积层的权重共享方法
- RNN中也有权重共享, 整条时间链上的参数共享
Bagging
- 其实bagging的方法是可以起到正则化的作用,因为正则化就是要减少泛化误差,而bagging的方法可以组合多个模型起到减少泛化误差的作用
- 在深度学习中同样可以使用此方法,但是其会增加计算和存储的成本
- 这一点在Kaggle比赛中有用过,的确有很大提高
Batch Normalization
- 在Google Inception V2中所采用,是一种非常有用的正则化方法,可以让大型的卷积网络训练速度加快很多倍,同事收敛后分类的准确率也可以大幅度的提高.
- N在训练某层时,会对每一个mini-batch数据进行标准化(normalization)处理,使输出规范到N(0,1)的正太分布,减少了Internal convariate shift(内部神经元分布的改变),传统的深度神经网络在训练是,每一层的输入的分布都在改变,因此训练困难,只能选择用一个很小的学习速率,但是每一层用了BN后,可以有效的解决这个问题,学习速率可以增大很多倍
- 更多信息参考: DL——BN-LN-IN-GN-LRN-WN
辅助分类节点
(auxiliary classifiers)
- 在Google Inception V1中,采用了辅助分类节点的策略,即将中间某一层的输出用作分类,并按一个较小的权重加到最终的分类结果中,这样相当于做了模型的融合,同时给网络增加了反向传播的梯度信号,提供了额外的正则化的思想.
尝试不同神经网络架构
- 尝试替换以下方面:
- 激活函数
- 层数
- 权重?
- 层的参数?