机器学习31:深度学习模型调参技巧【转载整理】

机器学习31:深度学习模型调参技巧【转载整理】

       本文转载自博客模型调参:分步骤的提升模型的精度(cnn)和知乎问题你有哪些deep learning(rnn、cnn)调参的经验?的回答,主要整理博客和知乎问答中关于卷积神经网络的调参技巧。

1.博客整理:

       链接:模型调参:分步骤的提升模型的精度(cnn)
       来源:CSDN

    (1)数据增强技术:

             使用数据增强技术主要是在训练数据上增加微小的扰动或者变化,一方面可以增加训练数据,从而提升模型的泛化能力,另一方面可以增加噪声数据,从而增强模型的鲁棒性。运行流程为获取一个 batch 的训练数据,进行数据增强步骤之后再送入网络进行训练。

             主要的数据增强方法有:翻转变换 、随机修剪、色彩抖动、平移变换、尺度变换、对比度变换、噪声扰动、旋转变换 、反射变换等。

             比较常用的数据增强操作为图像切割、图像翻转以及图像白化【将图像归一化成 Gaussian(0,1) 分布】。

   (2)从模型角度改进:

             1)权重衰减:对于目标函数加入正则化项,限制权重参数的个数,这是一种防止过拟合的方式,这个方法就是机器学习中的l2正则化方法。

              2)Dropout:在每次训练过程中,随机让一定概率的神经元不被激活,这样可以防止过拟合,提高模型的泛化能力。

              3)批量正则化:BatchNormalization 对神经网络的每一层的输入数据都进行正则化处理,这样有利于让数据的分布更加均匀,不会出现所有数据都会导致神经元的激活,或者所有数据都不会导致神经元的激活,这是一种数据标准化方法,能够提升模型的拟合能力 。

               4)LRN: LRN 层模仿生物神经系统的侧抑制机制,对局部神经元的活动创建竞争机制,使得响应比较大的值相对更大,提高模型泛化能力。

   (3)变化学习率技术:

             变化学习率技术的大致思路是首先使用较大的学习率进行训练,观察目标函数值和验证集准确率的收敛曲线,当目标函数值下降速度和验证集准确率上升速度出现减缓时,适当减小学习率;循环执行如上操作,直至减小学习率也不会影响目标函数下降或验证集准确率上升为止。

   (4)残差结构的引入:

            当网络层数加大时,由于梯度衰减的原因,导致网络性能可能不升反降,而残差网络的技术可以解决深层网络引入的梯度衰减问题,发挥深层网络的特征提取能力,使模型获得很强的拟合能力和泛化能力。

            残差网络通过跨层的直连边,可以使误差在反传的过程中减少衰减,使得深层次的网络可以成功训练。

2.知乎用户京东白条回答整理:

         链接:https://www.zhihu.com/question/41631631/answer/776852832
         来源:知乎

         对于参数初始化,因为我们学习的本来就是权重W与偏置b,如果初始化足够好,直接就初始化到最优解,那么就不用进行训练了, 良好的初始化,可以让参数更接近最优解,这可以大大提高收敛速度,也可以防止落入局部极小。对于学习率,学习率如果取太大,会使模型训练非常震荡,可以想象我们最小化一个二次抛物线,选取一个很大的学习率,那么迭代点会一直在抛物线的两边震荡,收敛不到最小值,甚至还有螺旋上升迭代点的可能。下面对深度学习调参技巧谈些心得,可以为读者提供一些调参的思路。

   (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初始化;数据预处理方法一般也就采用数据归一化即可。

3.知乎用户陈运文回答整理:

     CNN的调参主要是在优化函数、embedding的维度和残差网络的层数几个方面。

     (1)优化函数的选择主要有Adam和sgd,Adam相对而言不需要设置参数并且简单很多,效果不错。

     (2)embedding随着维度的增大会出现一个最大值点,也就是开始随着维度增加效果逐渐变好,到达一个点后随着维度增加效果逐渐变差。

     (3)残差网络的层数与embedding的维度有关,随着层数的增加效果呈现为凸函数。

     (4)激活函数推荐使用relu。

     (5)Dropout层数不宜设置过大,过大容易造成网络不收敛,调节步长可以为0.05,一般调整到0.4~0.5时会获取到最佳值。

 

 

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值