deep learning(rnn、cnn)调参的经验?

整理的链接:https://www.zhihu.com/question/41631631
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

调了快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,可以参考这篇论文:http://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或者更大的值做初始化,可以取得更好的结果,来自这篇论文:http://jmlr.org/proceedings/papers/v37/jozefowicz15.pdf, 我这里实验设成1.0,可以提高收敛速度.实际使用中,不同的任务,可能需要尝试不同的值.
  4. Ensemble: 论文刷结果的终极核武器,深度学习中一般有以下几种方式
    1. 同样的参数,不同的初始化方式
    2. 不同的参数,通过cross-validation,选取最好的几组
    3. 同样的参数,模型训练的不同阶段
    4. 不同的模型,进行线性融合. 例如RNN和传统模型.  

      补充一点,adam收敛虽快但是得到的解往往没有sgd+momentum得到的解更好,如果不考虑时间成本的话还是用sgd吧。
      再补充一个rnn trick,仍然是不考虑时间成本的情况下,batch size=1是一个很不错的regularizer, 起码在某些task上,这也有可能是很多人无法复现alex graves实验结果的原因之一,因为他总是把batch size设成1。。。

      最近在看 Karpathy 的 cs231n, 还没看完, 不过过程中总结了一下他提到的一些技巧:

      关于参数:

      • 通常情况下, 更新参数的方法默认用 Adam 效果就很好
      • 如果可以载入全部数据 (full batch updates), 可以使用 L-BFGS

      Model Ensembles:

      • 训练多个模型, 在测试时将结果平均起来, 大约可以得到 2% 提升.
      • 训练单个模型时, 平均不同时期的 checkpoints 的结果, 也可以有提升.
      • 测试时可以将测试的参数和训练的参数组合起来:

      1.无论是cnn还是rnn,batch normalization都有用,不一定结果提高几个点,收敛快多了
      2.数据初始时normalize得好,有时候直接提高2个点,比如cifar10,转到yuv下normalize再scn
      3.loss不降了lr就除10
      4. google的inception系列按它论文里说的永远无法复现

      本人做rnn的文本相关研究,一直使用adam,下降速度巨快,看别人论文也尝试过adadelta和adagrad,但不知是姿势不对还是别的原因效果很差,batch-size大小设置在50(训练集大小为17w),dropout随大流0.5,另外我发现l2取值对我的结果影响挺大的,之前一直跟着别人论文用0.001,我换成0.0001以后发现提升了1%

时间: 2024-10-10 01:21:25

deep learning(rnn、cnn)调参的经验?的相关文章

01.CNN调参

调参是个头疼的事情,Yann LeCun.Yoshua Bengio和Geoffrey Hinton这些大牛为什么能够跳出各种牛逼的网络? 下面一些推荐的书和文章:调参资料总结Neural Network: Trick of the Trade Neural Networks: Tricks of the Trade Practical Recommendations for Gradient-based Training of Deep Architectures http://arxiv.o

Deep Learning基础--CNN的反向求导及练习

前言: CNN作为DL中最成功的模型之一,有必要对其更进一步研究它.虽然在前面的博文Stacked CNN简单介绍中有大概介绍过CNN的使用,不过那是有个前提的:CNN中的参数必须已提前学习好.而本文的主要目的是介绍CNN参数在使用bp算法时该怎么训练,毕竟CNN中有卷积层和下采样层,虽然和MLP的bp算法本质上相同,但形式上还是有些区别的,很显然在完成CNN反向传播前了解bp算法是必须的.本文的实验部分是参考斯坦福UFLDL新教程UFLDL:Exercise: Convolutional Ne

【CNN调参】目标检测算法优化技巧

上次bbuf分享了亚马逊团队的用于分类模型的bag of tricks, 详见:链接, 本文继续梳理一下目标检测trick, 解读这篇19年同样由亚马逊团队发表的<Bag of Freebies for Training Object Detection Neural Networks>.先来看看效果,在使用了trick后,Faster R-CNN能提高1-2个百分点,而YOLOv3则提高了5个百分点. 1. 简介 目标检测模型相比于分类模型的研究相比,更缺少普遍性,并且网络结构和优化目标更加

让CNN跑起来,以下是调参的所有秘密

知乎上看到的 - 收集高质量标注数据 - 输入输出数据做好归一化,以防出现数值问题,方法就是主成分分析啥的. - 参数初始化很重要.太小了,参数根本走不动.一般权重参数0.01均方差,0均值的高斯分布是万能的,不行就试更大的.偏差参数全0即可. - 用SGD ,minibatch size 128.或者更小size ,但那样吞吐量变小,计算效率变低. - 用带momentum的SGD,二阶方法不用也罢. - 梯度更新的步长很重要.一般0.1是个万能数值.调参可改进结果,具体做法是人肉监督:用另外

Deep learning网络调参技巧

参数初始化 下面几种方式,随便选一个,结果基本都差不多.但是一定要做.否则可能会减慢收敛速度,影响收敛结果,甚至造成Nan等一系列问题.n_in为网络的输入大小,n_out为网络的输出大小,n为n_in或(n_in+n_out)*0.5Xavier初始法论文:http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdfHe初始化论文:https://arxiv.org/abs/1502.01852 uniform均匀分布初始化:w =

Deep Learning 调参

整理一下如何调参,开始是准备翻译,后来加入了一些自己的理解,有少部分不是很确定的没有写出来,如果有问题可以看原文,在末尾有写出.水平有限,如果有错误请指出. 获取数据:确保有足够多的高质量输入-输出的数据集,而且要有代表性. 有时并没有这么大的数据集,比如字符识别中对mnist数据库的训练,很容易就可以达到98%的识别率,但是真正用在实际中会发现效果并没有那么好,把数据库的图片存到硬盘看一下,会发现几乎所有字体都在图片正中,大小几乎一样,而且没有大幅度的旋转,所以这里图片的代表性就不够强,有必要

深度学习调参经验汇总

此篇文章是在原创教程这个栏目下,但实际上是一篇汇总整理文章.相信大家在做深度学习时对调参尤为无奈,经验不足乱调一通,或者参数太多无从下手,我也如此.希望通过此文汇总网上一些调参的经验方法,供大家参考.此文会对网上每一篇调参文章做简练的总结与提炼,以此为此文的组成单元,并附上原文的链接.如果遇到不对的地方,欢迎指正~本文也将不定期更新,最后祝大家调参(炼金)顺利! 有多少人工,就有多少智能!(笑哭脸) 人工智障 炼金大法 你已经是成熟的算法了,要学会自己调参 正文开始 UNIT 1 case1:网

deep learning实践经验总结2--准确率再次提升,到达0.8,再来总结一下

deep learning实践经验总结2 最近拿caffe来做图片分类,遇到不少问题,同时也吸取不少教训和获得不少经验. 这次拿大摆裙和一步裙做分类, 多次训练效果一直在0.7,后来改动了全链接层的初始化参数.高斯分布的标准差由0.001改为0.0001,就是调小了. 然后效果很明显,准确率高了,权重图画出来后,也看得出是有意义的了,部分权重图是人的轮廓或者裙子的轮廓. 先看看图片: 大摆裙      一步裙      然后找一些响应图看一下,当然我这里展示的是一些效果好的响应图. 大摆裙   

Deep Learning(深度学习)学习笔记整理系列之(四)——CNN

[email protected] http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0  2013-04-08 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除. 3)本人才疏学浅,整理总结的时候难免出错,还望各位前辈