zoukankan      html  css  js  c++  java
  • 深度学习调参体验(二)

     

    深度学习调参体验(二)

    1. 激活函数选择:

    常用的激活函数有relu、leaky-relu、sigmoid、tanh等。对于输出层,多分类任务选用softmax输出,二分类任务选用sigmoid输出,回归任务选用线性输出。而对于中间隐层,则优先选择relu激活函数(relu激活函数可以有效的解决sigmoid和tanh出现的梯度弥散问题,多次实验表明它会比其他激活函数以更快的速度收敛)。另外,构建序列神经网络(RNN)时要优先选用tanh激活函数。

    2、学习率设定:

    一般学习率从0.1或0.01开始尝试。学习率设置太大会导致训练十分不稳定,甚至出现Nan,设置太小会导致损失下降太慢。学习率一般要随着训练进行衰减。衰减系数设0.1,0.3,0.5均可,衰减时机,可以是验证集准确率不再上升时,或固定训练多少个周期以后自动进行衰减。

    3、防止过拟合:

    一般常用的防止过拟合方法有使用L1正则项、L2正则项、dropout、提前终止、数据集扩充等。如果模型在训练集上表现比较好但在测试集上表现欠佳可以选择增大L1或L2正则的惩罚力度(L2正则经验上首选1.0,超过10很少见),或增大dropout的随机失活概率(经验首选0.5);或者当随着训练的持续在测试集上不增反降时,使用提前终止训练的方法。当然最有效的还是增大训练集的规模,实在难以获得新数据也可以使用数据集增强的方法,比如CV任务可以对数据集进行裁剪、翻转、平移等方法进行数据集增强,这种方法往往都会提高最后模型的测试精度。

    4、优化器选择:

    如果数据是稀疏的,就用自适应方法,即 Adagrad, Adadelta, RMSprop, Adam。整体来讲,Adam 是最好的选择。SGD 虽然能达到极小值,但是比其它算法用的时间长,而且可能会被困在鞍点。如果需要更快的收敛,或者是训练更深更复杂的神经网络,需要用一种自适应的算法。

    5、残差块与BN层:

    如果你希望训练一个更深更复杂的网络,那么残差块绝对是一个重要的组件,它可以让你的网络训练的更深。

    BN层具有加速训练速度,有效防止梯度消失与梯度爆炸,具有防止过拟合的效果,所以构建网络时最好要加上这个组件。

    6.自动调参方法:

    1)Grid Search:网格搜索,在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组里找最大值。缺点是太费时间了,特别像神经网络,一般尝试不了太多的参数组合。

    2)Random Search:经验上,Random Search比Gird Search更有效。实际操作的时候,一般也是先用Gird Search的方法,得到所有候选参数,然后每次从中随机选择进行训练。另外Random Search往往会和由粗到细的调参策略结合使用,即在效果比较好的参数附近进行更加精细的搜索。

    3)Bayesian Optimization:贝叶斯优化,考虑到了不同参数对应的 实验结果值,因此更节省时间,贝叶斯调参比Grid Search迭代次数少, 速度快;而且其针对非凸问题依然稳健。

    7.参数随机初始化与数据预处理:

    参数初始化很重要,它决定了模型的训练速度与是否可以躲开局部极小。relu激活函数初始化推荐使用He normal,tanh初始化推荐使用Glorot normal,其中Glorot normal也称作Xavier normal初始化;数据预处理方法一般也就采用数据归一化即可。

    深度学习debug的流程策略

    针对上面的问题,小哥总结出调试深度学习模型的第一要义——悲观主义

    既然消除模型中的错误很难,我们不如先从简单模型入手,然后逐渐增加模型的复杂度。

    他把这个过程分为5个步骤:

    9.  从最简单模型入手;

    10. 成功搭建模型,重现结果;

    11. 分解偏差各项,逐步拟合数据;

    12. 用由粗到细随机搜索优化超参数;

    13. 如果欠拟合,就增大模型;如果过拟合,就添加数据或调整。

    14. 学习率:

    ·       执行学习率范围测试以确定“大”的学习率。

    ·       一轮测试确定最大学习速率,将最小学习速率设置为最大学习速率的十分之一。

    15. 动量:

    ·       用短期动量值0.99、0.97、0.95和0.9进行测试,以获得动量的最佳值;

    ·       如果使用周期学习率计划,最好从该最大动量值开始循环设置动量,并随着学习率的增加而减小到0.8或0.85;

    16. 批量大小:

    ·       根据硬件条件使用尽可能大的批量大小,然后比较不同批量大小的性能;

    ·       小批量添加正规化的效果大,而大批量添加的正则化效果小,因此在适当平衡正规化效果的同时利用好它;

    ·       使用更大的批量通常会更好,这样就可以使用更大的学习率;

    17. 权重衰减:

    ·       网格搜索以确定适当的幅度,但通常不需要超过一个有效数字精度;

    ·       更复杂的数据集需要较少的正则化,因此设置为较小的权重衰减值,例如10^-4、10^-5、10^-6、0;

    ·       浅层结构需要更多的正则化,因此设置更大的权重衰减值,例如10^-2、10^-3、10^-4。

     

  • 相关阅读:
    Thinkphp随堂笔记【模型初步上】
    Thinkphp随堂笔记【MVC模式和URl访问的四种方式】
    C# set get 个人学习笔记
    关于文件的操作r、r+、w、w+
    HTTPS的通信步骤02
    HTTPS的通信步骤01
    python六剑客之reduce()函数
    python六剑客之filter()函数
    python六剑客之map()函数
    TCP/IP四层模型
  • 原文地址:https://www.cnblogs.com/wujianming-110117/p/12884223.html
Copyright © 2011-2022 走看看