zoukankan      html  css  js  c++  java
  • 深度学习模型训练技巧 Tips for Deep Learning

    一、深度学习建模与调试流程

    先看训练集上的结果怎么样(有些机器学习模型没必要这么做,比如决策树、KNN、Adaboost 啥的,理论上在训练集上一定能做到完全正确,没啥好检查的)

    Deep Learning 里面过拟合并不是首要的问题,或者说想要把神经网络训练得好,至少先在训练集上结果非常好,再考虑那些改善过拟合的技术(BN,Dropout 之类的)。否则的话回去检查三个 step 哪里有问题。

     

    Deep Learning 中的方法为了解决两个主要问题而提出:1.训练集做得不好;2.训练集做得好,测试集做得不好

    实际应用的时候搞清楚自己面对的问题,选择对应的技巧。

    二、激活函数

    1. sigmoid

    梯度消失:网络很深的时候,靠近输入的 hidden layers 的梯度对损失函数影响很小, 参数更新的就很慢;靠近输出的情况反之。前面几层的参数都还没怎么更新的时候就收敛了。

    原因也比较简单,反向传播的时候每经过一层,都会乘上小于 1 的数(sigmoid 函数 会把输入压到 0~1 之间),结果就越来越衰减。

    早期用 RBM ,先训练好前面几层。

    2. ReLU

    计算快;有些生物学的来源;相当于无穷多个不同偏置的sigmoid函数叠加;不存在梯度消失

    输出要么是0,要么是输入本身,相当于把原来的网络变成一个 thinner linear network。
     
    这样网络还是非线性的吗? —— 是。只要输入的变化比较大,跨越函数分段,网络依旧具有非线性。
    好像不可微? —— 确实。但做浮点运算也几乎不会正好要在原点处计算微分,所以直接忽略这个问题。
     
    一些变种,亲测过确实会有提升。
     

    3. maxout network

    每个神经元的激活函数的具体形式,是可以学习来的(不一定非得像 ReLU 那样在原点分段):

    哪些神经元要被 group 起来是事先决定的(比如随机2个或者3个一组之类的,几个一组也可以作为一个参数来学习)。

    ReLU 就是特殊情况下的 maxout ;但 maxout 可以实现更多可能的激活函数(具体是什么样的函数,根本上是由参数 w 决定的)。

    怎么训练?—— 给定一个输入,是能够知道每次取 max,留下的是哪一条路径。训练去掉不作用的神经元之后的“瘦长”的线性网络就行了。
    怎么保证参数都能被更新?—— 训练的时候每次给不同的输入数据,去掉的神经元是不一样的。所以一直给不同的输入,差不多每个参数都会被更新到。

    三、梯度下降的改进

    1. Adagrad 

    在梯度下降中已经总结过,在不同方向上需要不同的学习率。

    学习率时间衰减 + 从开始到当前时刻的梯度平方和求平均来估计二阶微分的大小趋势

    2. RMSProp

    error surface 非常复杂,即使在同一个方向上,学习率也需要不断调整。进阶版 Adagrad,动态调整学习率。

    在 decaying 累计的先前梯度,通过调整alpha的大小,来选择是考虑先前的梯度(t 时刻之前的累积)多一些,还是当前的梯度(t时刻的)多一些

    真的会卡在 local minima 吗?
    实际这种情况下的几率很小(by lecun)如果是 local minima 的话,那在每一个方向上都得是“谷底”,参数越多这个几率就越小。
     

    3. Momentum

    解决一点 local minima 和 plateau 的问题

    每次移动的方向不仅考虑当前时刻的梯度,也考虑之前移动的方向(惯性)。
    用 vt 来记录 t 时刻移动的方向,v0 = 0;参数更新的公式为:
    vt+1  = λv- ηgt
    θt+1  = θ+ vt+1
    例如:第一次更新 θ = θ+ v= θ+ λv- ηg0 = θ- ηg0
       第二次更新 θ2  = θ+ v= θ+ λv- ηg1 = θ1 + (λ)2v- ληg0 - ηg1 = θ1 - ληg0 - ηg1
     
    所以化简的递推公式为  θt+1 = θt - ηgt - ληgt-1 - ... - (λ)tηg0
      
     
    另一个角度理解 v:把公式展开,v 其实就是以往所有时刻梯度的 weighted sum,只不过越往前的初始时刻的梯度被考虑的越少( 每往前一个时刻就多乘一个λ),但也依旧对当前要更新的方向存在影响。

    4. Adam 

    RMSProp + Momentum,利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。

     

    其中,在迭代初始阶段,m和 v有一个向初值的偏移(过多的偏向了 0),因此可以对一阶和二阶动量做偏置校正 (bias correction),这样每次迭代学习率都有一个确定的范围,参数更新比较平稳。

    四、正则化

    1. Early Stopping 

    机器学习中比较常见的技巧

    2. Dropout

    神经网络中才会用

    随机 kill 掉一定比例的神经元。测试的时候不做,而且还要补偿参数。

    为什么要这么做?
    如果不乘以 1 - dropout rate,参数其实是比较大的:
    Dropout 可以理解成是一种 Ensemble,因为训练时每次都随机干掉一部分网络,但测试时要综合起来全部都用。

  • 相关阅读:
    jsp四个域对象
    java,qq邮箱发邮件工具类(需要部分修改)
    Java使用qq邮箱发邮件实现
    JavaScript 高级
    JavaScript基础
    JQuery 高级
    JQuery 基础
    团队最后一次作业:总结
    C++多态
    结对编程
  • 原文地址:https://www.cnblogs.com/chaojunwang-ml/p/11196420.html
Copyright © 2011-2022 走看看