模型调参
(一)训练集loss不下降
1. 初始化方案有问题
神经网络在训练之前,我们需要给其赋予一个初值,常用的初始化方案有全零初始化、随机正态分布初始化和随机均匀分布初始化等。
建议无脑xaiver normal初始化或者 he normal /xavier用在权重初始化上,constant用在偏置初始化
2. 正则化过度
L1 L2和Dropout是防止过拟合用的,当训练集loss下不来时,就要考虑一下是不是正则化过度,导致模型欠拟合了。
刚开始是不需要加正则化的,过拟合后,再根据训练情况进行调整。
如果一开始就正则化,那么就难以确定当前的模型结构设计是否正确了,而且调试起来也更加困难。
建议Batch Normalization,他也有一定的防止过拟合的能力/ 1.0,超过10的很少见。
3. 激活函数
卷积神经网络中,卷积层的输出,一般使用ReLu作为激活函数,因为可以有效避免梯度消失,并且线性函数在计算性能上面更加有优势。
循环神经网络中的循环层一般为tanh,或者ReLu,全连接层也多用ReLu,只有在神经网络的输出层,使用全连接层来分类的情况下,才会使用softmax
4. 损失函数
分类任务,通常使用交叉熵损失函数
回归任务使用均方误差,有自动对齐的任务使用CTC loss
5. 优化器
# SGD 就是随机梯度下降
opt_SGD = torch.optim.SGD(net_SGD.parameters(), lr=LR)
# momentum 动量加速,在SGD函数里指定momentum的值即可
opt_Momentum = torch.optim.SGD(net_Momentum.parameters(), lr=LR, momentum=0.8)
# RMSprop 指定参数alpha
opt_RMSprop = torch.optim.RMSprop(net_RMSprop.parameters(), lr=LR, alpha=0.9)
# Adam 参数betas=(0.9, 0.99)
opt_Adam = torch.optim.Adam(net_Adam.parameters(), lr=LR, betas=(0.9, 0.99))
#再看下官方文档
class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)
#参数:
params (iterable) – 用于优化的可以迭代参数或定义参数组
lr (float, 可选) – 学习率(默认:1e-3)
betas (Tuple[float, float], 可选) – 用于计算梯度运行平均值及其平方的系数(默认:0.9, 0.999)
eps (float, 可选) – 增加分母的数值以提高数值稳定性(默认:1e-8)
weight_decay (float, 可选) – 权重衰减(L2范数)(默认: 0)
step(closure) #执行单个优化步骤。
神经网络的优化器选取一般选取Adam,但是在有些情况下Adam难以训练,这时候需要使用如SGD之类的其他优化器。
6. 学习速率
学习率决定了网络训练的速度,但学习率不是越大越好,当网络趋近于收敛时应该选择较小的学习率来保证找到更好的最优点。
需要手动调整学习率,首先选择一个合适的初始学习率,当训练不动之后,稍微降低学习率,然后再训练一段时间,这时候基本上就完全收敛了
建议:学习率的调整是乘以/除以10的倍数/ 1 0.1 0.01 0.001
new_lr = lr * (0.1 ** (epoch // 10))
7. 模型训练遇到瓶颈
瓶颈一般包括:梯度消失、大量神经元失活、梯度爆炸和弥散、学习率过大或过小等。
通过梯度的检验来验证模型当前所处的状态。有时梯度的更新和反向传播代码存在bug时,也会有这样的问题
使用Relu激活函数的时候,当每一个神经元的输入X为负时,会使得该神经元输出恒为0,导致失活,由于此时梯度为0,解决方案是使用LeakyRelu
梯度爆炸和梯度弥散产生的根本原因是,根据链式法则,深度学习中的梯度在逐层累积。网络中某些层过大的输出也会造成梯度爆炸,此时应该为该输出 取一个上界,可用最大范数约束。
8. batch size过大
batch size过小,会导致模型后期摇摆不定,迟迟难以收敛。
过大时,模型前期由于梯度的平均,导致收敛速度过慢。
建议:常常选取为32,或者16 /128上下开始
9. 数据集未打乱
不打乱数据集的话,会导致网络在学习过程中产生一定的偏见问题。
10. 数据集有问题
当一个数据集噪声过多,或者数据标注有大量错误时,会使得神经网络难以从中学到有用的信息,从而出现摇摆不定的情况。
类别的不平衡也会使得较少类别由于信息量不足,难以习得本质特征。
11. 未进行归一化
未进行归一化会导致尺度的不平衡,比如1km和1cm的不平衡,因此会导致误差变大
12. 数据特征的选取有问题
数据特征的选取不合理,就像数据标注错误一样,会使得神经网络难以找到数据的本质特征进行学习。
13. 每层节点数
每层结点数: 16 32 128,超过1000的情况比较少见
14. weight_decay
为避免overfitting,会给误差函数添加一个惩罚项,常用的惩罚项是所有权重的平方乘以一个衰减常量之和。其用来惩罚大的权值。
在损失函数中,weight decay是放在正则项前面的一个系数,正则项一般指示模型的复杂度,所以weight decay的作用是调节模型复杂度对损失函数的影响,若weight decay很大,则复杂的模型损失函数的值也就大。
建议:0.005
(二)训练集loss下降,验证集loss不下降--过拟合
1. 适当的正则化和降维
增加一个正则项,并且人为给定一个正则系数lambda,进行权重衰减,将一些相关性不大的特征项的参数衰减到几乎为0,相当于去掉了这一项特征
神经网络两个层之间增加Dropout和Normal等,也起到了抑制过拟合的作用。
2. 适当降低模型的规模
3. 获取更多的数据集
(三)训练集loss下降,验证集loss下降,测试集loss不下降
1.应用场景不一致
2. 噪声问题
posted on 2019-10-12 14:58 happygril3 阅读(560) 评论(0) 收藏 举报
浙公网安备 33010602011771号