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

    超参数(Hyper-Parameter)是困扰神经网络训练的问题之一,因为这些参数不可通过常规方法学习获得。

    神经网络经典五大超参数:

    学习率(Leraning Rate)、权值初始化(Weight Initialization)、网络层数(Layers)

    单层神经元数(Units)、正则惩罚项(Regularizer|Normalization)

    这五大超参数使得神经网络更像是一门实践课,而不是理论课。

    懂神经网络可能只要一小时,但是调神经网络可能要几天。

    https://zhuanlan.zhihu.com/p/24720954#!

     

    英文介绍:]

    http://lamda.nju.edu.cn/weixs/project/CNNTricks/CNNTricks.html

    知乎上的一些比较好的解答:https://www.zhihu.com/question/41631631?from=profile_question_card

    https://zhuanlan.zhihu.com/p/24720954#!

     

    没做过CNN,RNN,调过连续值DNN,以下经验仅限于CTR
    1.样本要足够随机,防止大数据淹没小数据
    2.样本要做归一化
    3.激活函数要视样本输入选择
    4.minibatch很重要,几百到几千是比较合适的(很大数据量的情况下),无论是cnn还是rnn,batch normalization都有用,不一定结果提高几个点,收敛快多了
    5.learning rate很重要,可以直接用adagrad or adadelta,省去一些麻烦,然后把冲量调到0.9以上
    6.权重初始化,可用高斯分布乘上一个很小的数
    7.loss不降了lr就除10


    调了快1年的rnn, 深刻的感受到,深度学习是一门实验科学,下面是一些炼丹心得,后面会不断补充. 有问题的地方,也请大家指正.
    1. 参数初始化,下面几种方式,随便选一个,结果基本都差不多.

      1. uniform
        W = np.random.uniform(low=-scale, high=scale, size=shape)
      2. glorot_uniform
        scale = np.sqrt(6. / (shape[0] + shape[1]))
        np.random.uniform(low=-scale, high=scale, size=shape)
      3. 高斯初始化:
        w = np.random.randn(n) / sqrt(n),n为参数数目
        激活函数为relu的话,推荐
        w = np.random.randn(n) * sqrt(2.0/n)
      4. svd ,对RNN效果比较好,可以有效提高收敛速度.
    2. 数据预处理方式

      1. zero-center ,这个挺常用的.
        X -= np.mean(X, axis = 0) # zero-center
        X /= np.std(X, axis = 0) # normalize
      2. PCA whitening,这个用的比较少.
    3. 训练技巧

      1. 要做梯度归一化,即算出来的梯度除以minibatch size
      2. clip c(梯度裁剪): 限制最大梯度,其实是value = sqrt(w1^2+w2^2….),如果value超过了阈值,就算一个衰减系系数,让value的值等于阈值: 5,10,15
      3. dropout对小数据防止过拟合有很好的效果,值一般设为0.5,小数据上dropout+sgd效果更好. dropout的位置比较有讲究, 对于RNN,建议放到输入->RNN与RNN->输出的位置.关于RNN如何用dropout,可以参考这篇论文:arxiv.org/abs/1409.2329
      4. adam,adadelta等,在小数据上,我这里实验的效果不如sgd,如果使用sgd的话,可以选择从1.0或者0.1的学习率开始,隔一段时间,在验证集上检查一下,如果cost没有下降,就对学习率减半. 我看过很多论文都这么搞,我自己实验的结果也很好. 当然,也可以先用ada系列先跑,最后快收敛的时候,更换成sgd继续训练.同样也会有提升.
      5. 除了gate之类的地方,需要把输出限制成0-1之外,尽量不要用sigmoid,可以用tanh或者relu之类的激活函数.
      6. rnn的dim和embdding size,一般从128上下开始调整. batch size,一般从128左右开始调整.batch size合适最重要,并不是越大越好.
      7. word2vec初始化,在小数据上,不仅可以有效提高收敛速度,也可以可以提高结果.
      8. 尽量对数据做shuffle
      9. LSTM 的forget gate的bias,用1.0或者更大的值做初始化,可以取得更好的结果,来自这篇论文:jmlr.org/proceedings/pa, 我这里实验设成1.0,可以提高收敛速度.实际使用中,不同的任务,可能需要尝试不同的值.
    4. Ensemble: 论文刷结果的终极核武器,深度学习中一般有以下几种方式

      1. 同样的参数,不同的初始化方式
      2. 不同的参数,通过cross-validation,选取最好的几组
      3. 同样的参数,模型训练的不同阶段
      4. 不同的模型,进行线性融合. 例如RNN和传统模型.
    下面的网站也有一些总结:
    http://blog.csdn.net/chenzhi1992/article/details/52905569
  • 相关阅读:
    MySQL+Navicat for MySQL安装
    intellij idea14 +svn配置
    java重载(实现同一方法名,不同参数)
    Java连接MySQL数据库及操作
    通过Chrome的inspect对手机webview进行调试
    使用fiddler对手机上的程序进行抓包
    开始一个Android的appium实例
    Android模拟器内安装应用
    Appium的inspector使用
    python webdriver启动IE浏览器
  • 原文地址:https://www.cnblogs.com/mfryf/p/11393662.html
Copyright © 2011-2022 走看看