点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

No.1

总结一下在旷视实习两年来的炼丹经验,我主要做了一些 RL,图像质量,图像分类,GAN 相关的任务,日常大概占用 5 - 10 张卡。

可复现性和一致性

有的同学在打比赛的时候,从头到尾只维护若干份丹方(代码),每次载入前一次的训练参数,调一下丹方再炼,俗称老丹。这样会有几个问题:某次引入一个 bug,过了很久才发现,然后不知道影响范围;炼出一个金丹,但是不知道它是怎么来的;忘了自己的 baseline,不知道改动是正面还是负面。

要尽可能确保每一个丹有可复现性,实践上建议丹方不应该在炼丹后改动,炼新的丹时,把旧的丹方复制一遍。得到的实验结果要开个文档记下来以便日后总结,避免遗忘。我经常通过阅读自己和别人的记录来得到灵感。

实验一致性上也要多做努力,理想状态是有合理的基准来测丹的性能,同一个丹方不应该由于超参的微小改动而有显著结果差异。出现这种情况可能是数据太少或基准设置不当。

资源利用

对于新入行的同学,不要试图在玩具级别的数据集或任务上做靠谱的研究,比如 MNIST。

不是每一个实验都要出一个金丹,实验是为了验证结论的。如果每个实验都要 8 张卡跑两个星期,人力物力都耗不起。尽力把实验控制在单卡一天以内,理想状态是半天得一次结论。理论上来说,水多加面面多加水(加数据加计算量)的做法无限涨点。建议先设一个目标,比如说就是在一天的训练时间下做对比实验。

我的实践经验是,首先用小图小模型,比如 128 x 128 输入的 ResNet18;用 cProfile 来找性能瓶颈,比如我发现某个丹,炼的时候有一大半时间耗费在等数据,数据处理中一大半时间在调用 numpy 的 round 函数,前期把精力集中在提高做实验的效率上。

模型不 work

先把锦上添花的东西去掉,比如数据增广,玄学学习率和超参,魔幻损失函数,异形模型。如果世界上有一个非要加旋转增广和 1.96e-4 学习率 42 batchsize,配上四种混合损失函数才能炼好的丹,它应该存在于灵能文明。可以先造一些尽量玩具的模型,验证代码正确性。

需要进一步改进

先确认影响模型性能的组件。感性认识就是,数据是否需要增加或增广。模型是大了还是小了,再根据速度和精度期望开始寻找合适的模型。能用全卷积的任务,少用全连接层,参数量小。基本模型上 ResNet, Unet 结构还是主流。

当你的模型有 Batch Normalization,初始化通常不需要操心,激活函数默认 Relu 即可(某引用数万的大佬说的)。一般顺序是 Conv - BN - Relu。如果没有 BN(很多任务上,BN降低训练难度,但是可能影响最终性能 ),试着要做一些数据归一化。

虽然有至少十种激活函数,但在 Relu 外只推荐试一下 Swish。炼丹术只推荐 Momentum 和 Adam。在这些方面做尝试意义不大,如果性能提升反倒可能说明模型不成熟。不推荐做人肉模型设计,比如把某层卷积改大一点,或者微调一下通道数。除非有特别 insight,不要自己乱设计新组件。

超参上,learning rate 最重要,推荐了解 cosine learning rate 和 cyclic learning rate,其次是 batchsize 和 weight decay。当你的丹还不错的时候,可以试着做数据增广和改损失函数锦上添花了。

祝读到这里的各位模型涨点!

参考文献

  • Bag of Tricks for Image Classification with Convolutional Neural Networks,trick 合集 1。

  • Must Know Tips/Tricks in Deep Neural Networks,trick 合集 2。

  • 33条神经网络训练秘技,trick 合集 3。

  • 26秒单GPU训练CIFAR10,工程实践。

  • Batch Normalization,虽然玄学,但是养活了很多炼丹师。

  • Searching for Activation Functions,swish 激活函数。

作者:hzwer

https://www.zhihu.com/question/41631631/answer/859040970

No.2

训练技巧对深度学习来说是非常重要的,作为一门实验性质很强的科学,同样的网络结构使用不同的训练方法训练,结果可能会有很大的差异。这里我总结了近一年来的炼丹心得,分享给大家,也欢迎大家补充指正。

参数初始化

下面几种方式,随便选一个,结果基本都差不多。但是一定要做。否则可能会减慢收敛速度,影响收敛结果,甚至造成Nan等一系列问题。

下面的n_in为网络的输入大小,n_out为网络的输出大小,n为n_in或(n_in+n_out)*0.5

Xavier初始法论文:

http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf

He初始化论文:https://arxiv.org/abs/1502.01852

  • uniform均匀分布初始化:
    w = np.random.uniform(low=-scale, high=scale, size=[n_in,n_out])

    • Xavier初始法,适用于普通激活函数(tanh,sigmoid):scale = np.sqrt(3/n)

    • He初始化,适用于ReLU:scale = np.sqrt(6/n)

  • normal高斯分布初始化:
    w = np.random.randn(n_in,n_out) * stdev # stdev为高斯分布的标准差,均值设为0

    • Xavier初始法,适用于普通激活函数 (tanh,sigmoid):stdev = np.sqrt(n)

    • He初始化,适用于ReLU:stdev = np.sqrt(2/n)

  • svd初始化:对RNN有比较好的效果。参考论文:https://arxiv.org/abs/1312.6120

数据预处理方式

  • zero-center ,这个挺常用的.
    X -= np.mean(X, axis = 0) # zero-center
    X /= np.std(X, axis = 0) # normalize

  • PCA whitening,这个用的比较少.

训练技巧

  • 要做梯度归一化,即算出来的梯度除以minibatch size

  • clip c(梯度裁剪): 限制最大梯度,其实是value = sqrt(w1^2+w2^2….),如果value超过了阈值,就算一个衰减系系数,让value的值等于阈值: 5,10,15

  • dropout对小数据防止过拟合有很好的效果,值一般设为0.5,小数据上dropout+sgd在我的大部分实验中,效果提升都非常明显.因此可能的话,建议一定要尝试一下。dropout的位置比较有讲究, 对于RNN,建议放到输入->RNN与RNN->输出的位置.关于RNN如何用dropout,可以参考这篇论文:http://arxiv.org/abs/1409.2329

  • adam,adadelta等,在小数据上,我这里实验的效果不如sgd, sgd收敛速度会慢一些,但是最终收敛后的结果,一般都比较好。如果使用sgd的话,可以选择从1.0或者0.1的学习率开始,隔一段时间,在验证集上检查一下,如果cost没有下降,就对学习率减半. 我看过很多论文都这么搞,我自己实验的结果也很好. 当然,也可以先用ada系列先跑,最后快收敛的时候,更换成sgd继续训练.同样也会有提升.据说adadelta一般在分类问题上效果比较好,adam在生成问题上效果比较好。

  • 除了gate之类的地方,需要把输出限制成0-1之外,尽量不要用sigmoid,可以用tanh或者relu之类的激活函数.1. sigmoid函数在-4到4的区间里,才有较大的梯度。之外的区间,梯度接近0,很容易造成梯度消失问题。2. 输入0均值,sigmoid函数的输出不是0均值的。

  • rnn的dim和embdding size,一般从128上下开始调整. batch size,一般从128左右开始调整.batch size合适最重要,并不是越大越好.

  • word2vec初始化,在小数据上,不仅可以有效提高收敛速度,也可以可以提高结果.

  • 尽量对数据做shuffle

  • LSTM 的forget gate的bias,用1.0或者更大的值做初始化,可以取得更好的结果,来自这篇论文:http://jmlr.org/proceedings/papers/v37/jozefowicz15.pdf, 我这里实验设成1.0,可以提高收敛速度.实际使用中,不同的任务,可能需要尝试不同的值.

  • Batch Normalization据说可以提升效果,不过我没有尝试过,建议作为最后提升模型的手段,参考论文:Accelerating Deep Network Training by Reducing Internal Covariate Shift

  • 如果你的模型包含全连接层(MLP),并且输入和输出大小一样,可以考虑将MLP替换成Highway Network,我尝试对结果有一点提升,建议作为最后提升模型的手段,原理很简单,就是给输出加了一个gate来控制信息的流动,详细介绍请参考论文: http://arxiv.org/abs/1505.00387

  • 来自@张馨宇的技巧:一轮加正则,一轮不加正则,反复进行。

Ensemble

Ensemble是论文刷结果的终极核武器,深度学习中一般有以下几种方式

  • 同样的参数,不同的初始化方式

  • 不同的参数,通过cross-validation,选取最好的几组

  • 同样的参数,模型训练的不同阶段,即不同迭代次数的模型。

  • 不同的模型,进行线性融合. 例如RNN和传统模型.

作者:萧瑟
https://www.zhihu.com/question/41631631/answer/94816420

No.3

总结一下我遇到的小朋友常犯的错:

1、一上来就自己动手写模型。建议首先用成熟的开源项目及其默认配置(例如 Gluon 对经典模型的各种复现、各个著名模型作者自己放出来的代码仓库)在自己的数据集上跑一遍,在等程序运行结束的时间里仔细研究一下代码里的各种细节,最后再自己写或者改代码。

2、训 RNN 不加 gradient clipping,导致训练一段时间以后 loss 突然变成 Nan。

3、tying input & output embedding(就是词向量层和输出 softmax 前的矩阵共享参数,在语言模型或机器翻译中常用)时学习率需要设置得非常小,不然容易 Nan。

4、在数据集很大的情况下,一上来就跑全量数据。建议先用 1/100、1/10 的数据跑一跑,对模型性能和训练时间有个底,外推一下全量数据到底需要跑多久。在没有足够的信心前不做大规模实验。

5、只喜欢漂亮的模型结构,瞧不起调参数的论文/实验报告,看论文时经常不看超参数设置等细节。举个例子,现在还有相当多的人不知道 BERT 的激活函数是 GELU 而不是 transformer 原论文中的 ReLU。在自己没有太多资源实验的情况下,实验报告类文章简直是业界良心好不好!

NLP 领域主要推荐以下几篇:

Regularizing and Optimizing LSTM Language Models(LSTM 的训练技巧)

Massive Exploration of Neural Machine Translation Architectures(NMT 里各个超参的影响)

Training Tips for the Transformer Model(训练 Transformer 时会发生的各种现象)

RoBERTa: A Robustly Optimized BERT Pretraining Approach(BERT 预训练技巧,虽然跟大部分人没啥关系)

CV 我不算太熟,不过也可以勉强推荐几篇:

Training ImageNet in 1 Hour(大批量训练技巧)

Bag of Tricks for Image Classification with Convolutional Neural Networks(各种训练技巧集大成)

EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks(当前对参数利用最有效的 CNN)

6、初始学习率:

有时受 batch size、sequence length 各种因素的影响,loss 很大(比如说好几万),对于这种数字人是没有数感的,建议首先计算一下 per token loss(如果是多任务,可以每个任务单独算;类似地,某些 CV 任务可以计算 per pixel loss),心里有点感觉。脱离损失函数的形式谈学习率没有意义(例如单是对 batch size 求和或者取平均这个差异就会使梯度差成百上千倍)。

在确定初始学习率的时候,从一个很小的值(例如 1e-7)开始,然后每一步指数增大学习率(例如扩大1.05 倍)进行训练。训练几百步应该能观察到损失函数随训练步数呈对勾形,选择损失下降最快那一段的学习率即可。

7、Adam 可以解决一堆奇奇怪怪的问题(有时 loss 降不下去,换 Adam 瞬间就好了),也可以带来一堆奇奇怪怪的问题(比如单词词频差异很大,当前 batch 没有的单词的词向量也被更新;再比如Adam和L2正则结合产生的复杂效果)。用的时候要胆大心细,万一遇到问题找各种魔改 Adam(比如 MaskedAdam, AdamW 啥的)抢救。

8、subword 总是会很稳定地涨点,只管用就对了。

9、要有耐心!

这一条放在最后,是因为很多人不把它当一回事儿。可能是觉得这一条不需要写代码所以不重要?我见过太多人因为这条浪费时间了,所以专门强调一下。

有些指标是有滞后性的,需要等训练一段时间才开始动。很多人训练几步看没什么效果就把程序停掉开始 debug 了,但其实代码毫无问题。如此反复好几天甚至一两周都在原地踏步,其实需要做的仅仅是让程序自个儿安安静静地跑上几个小时或者一天……

作者:Towser

https://www.zhihu.com/question/41631631/answer/862075836

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

你有哪些deep learning(rnn、cnn)调参的经验?相关推荐

  1. 【深度学习】你有哪些深度学习(RNN、CNN)调参的经验?

    No.1 总结一下在旷视实习两年来的炼丹经验,我主要做了一些 RL,图像质量,图像分类,GAN 相关的任务,日常大概占用 5 - 10 张卡. 可复现性和一致性 有的同学在打比赛的时候,从头到尾只维护 ...

  2. 深度学习(deep learning)优化调参细节(trick)

    https://blog.csdn.net/h4565445654/article/details/70477979 转载于:https://www.cnblogs.com/zhibei/p/9815 ...

  3. 你有哪些 Deep learning(RNN、CNN)调参的经验?

    来自 | 知乎-hzwer,北京大学 https://www.zhihu.com/question/41631631/answer/859040970 编辑 | 机器学习算法与自然语言处理,Dataw ...

  4. 速看!deep learning(rnn、cnn)调参的经验

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|视觉算法 话说三人行,必有我师焉.有哪些deep lea ...

  5. 这些deep learning(rnn、cnn)调参的经验值得分享

    由于机器学习(包括神经网络)调参的经验内容比较多,我的回答篇幅会较长些,我尽量浓缩每个知识点,欢迎各位讨论指点. 深度神经网络,尤其是卷积神经网络(CNN)允许由多个隐藏层组成的计算模型来学习具有多个 ...

  6. 你有哪些深度学习(rnn、cnn)调参的经验?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 你有哪些deep learning(rnn.cnn)调参的经验? ...

  7. 《南溪的目标检测学习笔记》——夏侯南溪的CNN调参笔记,加油

    1 致谢 感谢赵老师的教导! 感谢张老师的指导! 2 调参目标 在COCO数据集上获得mAP>=10.0的模型,现在PaddleDetection上的Anchor-Free模型[TTFNet]的 ...

  8. 各路丹师 调参[炼丹]经验小结

    作者:hzwer 链接:https://www.zhihu.com/question/41631631/answer/859040970 来源:知乎 总结一下在旷视实习两年来的炼丹经验,我主要做了一些 ...

  9. 你有哪些deep learning(rnn、cnn)调参的经验

    总结一下在旷视实习两年来的炼丹经验,我主要做了一些 RL,图像质量,图像分类,GAN 相关的任务 『可复现性和一致性』 有的同学在打比赛的时候,从头到尾只维护若干份代码,每次载入前一次的训练参数,改一 ...

最新文章

  1. 最强的windows2003安全设置
  2. 如何基于MySQL及Redis搭建统一的kv存储服务 | 秦波
  3. R语言基础篇——数据对象
  4. objective-c 2.0的字面量Literals
  5. Hadoop hdfs 获取文件列表代码示例
  6. python excel centos_centos中使用python遇到的几个问题
  7. fedora如何删除某个包且不删除依赖它的相关包
  8. 为CheckBoxList每个项目添加一张图片
  9. QML 读取本地文件内容
  10. ruby DBI安装使用指南
  11. 三酷猫学python_python学习第6期
  12. 在springcacheinvokecontext中没找到field_CNN中的感受野
  13. 选择图层_PS图层之——基本功能详细介绍
  14. 数据分析可视化图表mysql_50个最有价值的数据可视化图表
  15. inteli211网卡linux驱动,Intel英特尔I210/I340/I350/82575/82580系列网卡驱动5.5.2版For Linux(2021年2月1日发布)...
  16. java强制删文件夹_Java 删除文件夹 和 文件 集合
  17. markdowm快捷键学习
  18. w7怎么修改服务器dns,win7系统在哪修改dns?win7系统修改dns的详细步骤
  19. php开发公众号 token验证失败 其中一个原因
  20. Python——输入姓名,返回姓名笔画小程序

热门文章

  1. 百度ERNIE登顶GLUE榜单,得分首破90大关
  2. Google又放大招:高效实时实现视频目标检测 | 技术头条
  3. 萌新养成 | AI科技大本营实习生招募计划
  4. 公开课 | 让机器读懂你的意图——人体姿态估计入门
  5. 面试官问:BitMap了解么?在什么场景下用过?碰到过什么问题?
  6. 非常有必要了解的Springboot启动扩展点
  7. 鱼佬:从数据竞赛到工作!
  8. 国内高校硕博补贴大公开!(某校博士在读已经年薪 25w 了)
  9. 用树莓派DIY车钥匙,开锁仅需90秒
  10. 就算是戴上口罩,AI也知道你在说什么