调参GG

一.超参数:

影响时间和准确率:5)学习迭代次数 epoch  

                                6)miniBatch :批量数据大小

                                11)样本数量

影响学习速度: 1)学习率 η

                           8)代价函数选择

                           10)神经激活函数种类(隐含层sigmod ,输出层softmax)

准确率和学习速度:9)初始化权重

分类的正确率:2)正则化参数λ、

                        3)4)7)骨干网络选择

二.初次训练

精简:精简检验集中数据的数量,因为真正验证的是网络的性能,选择泛化网络

三.学习率选择(通常学习率倾向于更小而非更大)

1)选择 一个η阈值的估计,使得训练数据代价函数立刻下降(非增加,非震荡)(矫正量级即可)

        1.若在多个回合才Cost才开始下降,则增大η

        2.若一开始cost就震荡或增加,则减小η

四.迭代次数

每训练n次,进行一次验证,当acc多回合不在上升,则停止训练

方案:在初始阶段使用 10 回合不提升规则,然后逐步地选择更久的回合,比如 20 回合不提升就终止,30回合不提升就终止

五.正则化参数

1)开始时代价函数不包含正则项,先确定 η 的值

2)确定 η后,用验证数据来选择好的 λ(尝试λ=1开始,根据验证集上的性能,每次变化10)

六.miniBatch选取(幸运的是,小批量数据大小的选择其实是相对独立的一个超参数)

方法同学习率调整

七.大神从头调参

1)确定激活函数的种类,之后确定代价函数种类和权重初始化的方法,以及输出层的编码方式

2)自己构建网络(定神经网络中隐层的数目以及每一个隐层中神经元的个数),进行二步骤来验证

3)先不考虑正则项,得到一个η的阈值,取η/2 作为初始化参数

4)确定miniBatch

5)确定λλ

6)重新优化η

习惯:

1)画图:

一般是训练数据遍历一轮以后,就输出一下训练集和验证集准确率。同时画到一张图上。

2)经验参数

1.learning rate:0.1

2.每层结点数: 16 32 128

3.batch size: 128

4.dropout: 0.5

5.L2正则:1.0

6.clip c(梯度裁剪): 限制最大梯度:5,10,15

3)自动调参

Gird Search:每种参数确定好几个要尝试的值,然后组合遍历

Random Search:从候选参数中随机选择进行训练

Bayesian Optimization.(贝叶斯优化):推荐两个实现了贝叶斯调参的Python库

                             1  hyperopt / hyperopt 比较简单

                              2.fmfn / BayesianOptimization, 比较复杂,支持并行调参

心得:

1)用normal初始化cnn的参数,最后acc只能到70%多,仅仅改成xavier,acc可以到98%

2)可视化取调参:

       1.某个feature map的activation matrix可视化后跟原始输入长得一样,说明没有学到东西

        2.可视化隐藏层的模型weight矩阵也能帮助我们获得一些insights

       3..Embedding the Hidden Layer Neurons with t-SNE :通过t-SNE[10]对隐藏层进行降维,然后以降维之后的两维数据分别作为x、y坐标(也可以使用t-SNE将数据降维到三维,将这三维用作x、y、z坐标,进行3d clustering),对数据进行clustering,人工review同一类图片在降维之后的低维空间里是否处于相邻的区域。

技巧:

1)最初,先小数据集,大模型,能用256个filter你就别用128个,直接奔着过拟合去. 没错, 就是训练过拟合网络, 连测试集验证集这些都可以不用.就是为了看整体训练流程没有错误,假如loss不收敛就要好好反思了

2)观察loss胜于观察准确率 

准确率虽然是评测指标,但会存在突变现象

3)心急的人, 总爱设个大点的LR, 初始情况下容易爆, 先上一个小LR保证不爆, 等loss降下来了, 再慢慢升LR

           

经验:

epoch:几十到几百

sgd,mini batch size:几十到几百

步长:0.1,可手动收缩

weight decay:0.005

momentum:0.9

dropout加relu

weight:高斯分布初始化

bias:始化为0

输入特征和预测目标:归一化

写两个脚本:1)给定参数的周期性评估结果    2)重新参数分配

自我总结:

准备:尽量选取大的网络(能用256个filter你就别用128个,直接奔着过拟合去)     

1)参考论文,以论文给的参数作为初始化参数,若无,参数可使用均与分布初始化或高斯分布初始化)

2)判断这组初始化参数是否可行? 

      尝试训练法:用这组初始化参数,先减少训练集数目和训练类别数进行试探训练,观察结果(一般小数据集上合适参数,大数据集同样适用)

3)训练过程中,先使用较小的lr训练(但不能太小,容易达到局部最优),观察loss ,若果loss逐渐下降,说明学习的梯度方向正确,我们可以加大lr,增快训练速度 。       最后loss逐渐平稳的时候,再减小lr进行微调。

训练过程中,则先设置重要的参数(例如学习率等(0.001 0.01 0.1 1 10,一般从1开始,很少见大于10),学习率一般要随训练进行衰减,一般衰减系数为0.5(一般在验证机准确率不再上升时进行,或固定周期),不过一般adam,adadelta,rmsprop等,论文中都有默认值可直接使用),在设置次要参数(例如,dropout(0.3 0.5 0.7),正则化值(0.001 0.01 0.1 1 10)等

3-1)训练时,batch size尽可能大,最好在128以上(因为batch size太大,一般不会对结果有太大的影响,而batch size太小的话,结果有可能很差)

3-2)使用 梯度剪裁(clip c),限制最大梯度。(如果value超过了阈值,就算一个衰减系系数,让value的值等于阈值: 5,10,15)

3-3)初始化的dropout: 0.5,L2正则:1.0(很少超过10)

4)训练 过程中,周期进行验证,若COST没有下降,则学习率减半(可以先用ada系列先跑,最后快收敛的时候,更换成sgd继续训练.同样也会有提升.据说adadelta一般在分类问题上效果比较好,adam在生成问题上效果比较好)

5)训练集loss不下降 (代码问题,数据问题,超参数有问题)。【正常情况应该是训练集的cost值不断下降,最后趋于平缓,或者小范围震荡,测试集的cost值先下降,然后开始震荡或者慢慢上升。】

6)最后,尝试用Highway Network 替代全连接层,尝试加入BN层

遇到Nan:

1)除0的可能。  查看代码,看看有除法的地方(例如softmax层)

2)梯度过大 。     1.减少学习率   2.用梯度剪裁

3)初始化参数过大    --考虑加入BN层

猜你喜欢

转载自blog.csdn.net/weixin_38740463/article/details/83578302
gg