申请专栏作者 参展
投稿发布
您的当前位置:主页 > yabo体育平台注册页 > 正文

深度学习如何调参?

来源: 时间:2018-10-17
请支持本站,点击下面的广告后浏览!
对于本人也是半路出家. 现在的工作内容主要就是使用CNN做CV任务. 干调参这种活也有两年时间了. 我的回答可能更多的还是侧重工业应用, 技术上只限制在CNN这块.
?
先说下我的观点, 调参就是trial-and-error. 没有其他捷径可以走. 的区别是有些人盲目的尝试, 有些人思考后再尝试.快速尝试, 快速纠错这是调参的关键.
?
首先说下可视化
我个人的理解, 对于可视化, 更多的还是帮助人类以自己熟悉的方式来观察网络. 因为, 你是不可能边观察网络, 还边调参的. 你只是训练完成后(或者准确率到达一个阶段后), 才能可视化. 在这之前, 网络没有学习到良好的参数, 你可视化了也没意义, 网络达到不错的准确率了, 你看看其实也就听个响. 同样, 你的网络训练的一塌糊涂, 你可视化也没什么意义, 能够看到的就是中间结果乱七八糟, 或者全黑全白, 这时候你直接看最后准确率就可以知道这网络没救了.
?
关于权重的可视化[Visualize Layer Weights](现在是否强求smooth其实意义不大, 这个后面说.)
同样, 你看到一个不满足平滑结果的图像, 你知道, 这网络训练的不好, 但是为什么呢? 是yabo88滚球不好? 没有预处理? 网络结构问题? Learning Rate太大或者太小? 或者就是差了一个LRN层(之前我就遇到, 加个LRN就能出smooth的weights, 当然这其实和预处理有关)?
?
Smooth是需要看一下的, 心里有个数. 但是具体调参怎么调是没辙的. 第一, 你不可能告诉网络, 这层你得学个边界检测的功能出来. 第二, 不同任务下会有不同的weights(虽然底层的特征有很大的通用性), 你觉得你凭什么来指导一个看图片比你快得多的机器?
?
再说现在是否需要强求smooth. 现在的趋势是鼓励使用小filter, 3x3大小, 多加层次(这样, 非线性更好点). 换句话说, 3x3的图片, 总共才9个像素, 你怎么判断smooth与否呢? 当然如果你使用大的filter, 一般5x5往上, 运气不差的话, 你是可以看到smooth的结果的.
?
咱们再说另外一个极端, 一个网络,运行的完美(满足应用要求就算完美), 打开一看, 这weights不smooth啊. 你告诉我, 你打算怎么办? 没错, 具有不平滑的权重的网络同样可以获得很好的结果(这种情况我都习以为常了).
?
那么可视化网络就不重要了?
非常重要, 但是不在训练这块, 而是帮助理解网络的原理这块. 理解网络原理后, 你才能在设计结构的时候心里有感觉(只是有感觉而已), 网络出了问题, 或者在某些情况下不满意, 有更好的直觉去调整.(没错, 只是直觉, 虽然有些情况下的调整从网络原理来看逻辑上应该可以工作, 但是人家就是不工作, 你能咬机器去么?)
?
那么怎样训练一个不错的网络呢?
这是一个很好的链接, 说明了如何从零开始不断的trial-and-error(其实这里面没遇到什么error):Using convolutional neural nets to detect facial keypoints tutorial
(链接网址:http://suo.im/533arJ)
?
对于调参我自己的经验, 有下面这些:
?
基本原则:快速试错
一些大的注意事项:
1.刚开始, 先上小规模yabo88滚球, 模型往大了放, 只要不爆显存, 能用256个filter你就别用128个. 直接奔着过拟合去. 没错, 就是训练过拟合网络, 连测试集验证集这些都可以不用.
?
为什么?
你要验证自己的训练脚本的流程对不对. 这一步小yabo88滚球量, 生成速度快, 但是所有的脚本都是和未来大规模训练一致的(除了少跑点循环)
?
如果小yabo88滚球量下, 你这么粗暴的大网络奔着过拟合去都没效果. 那么, 你要开始反思自己了, 模型的输入输出是不是有问题? 要不要检查自己的代码(永远不要怀疑工具库, 除非你动过代码)? 模型解决的问题定义是不是有问题? 你对应用场景的理解是不是有错? 不要怀疑NN的能力, 不要怀疑NN的能力, 不要怀疑NN的能力. 就我们调参狗能遇到的问题, NN没法拟合的, 这概率是有多小?
?
你可以不这么做, 但是等你yabo88滚球准备了两天, 结果发现有问题要重新生成的时候, 你这周时间就酱油了.
?
2. Loss设计要合理.
一般来说分类就是Softmax, 回归就是L2的loss. 但是要注意loss的错误范围(主要是回归), 你预测一个label是10000的值, 模型输出0, 你算算这loss多大, 这还是单变量的情况下. 一般结果都是nan. 所以不仅仅输入要做normalization, 输出也要这么弄.
?
多任务情况下, 各loss想法限制在一个量级上, 或者最终限制在一个量级上, 初期可以着重一个任务的loss
?
3. 观察loss胜于观察准确率
准确率虽然是评测指标, 但是训练过程中还是要注意loss的. 你会发现有些情况下, 准确率是突变的, 原来一直是0, 可能保持上千迭代, 然后突然变1. 要是因为这个你提前中断训练了, 只有老天替你惋惜了. 而loss是不会有这么诡异的情况发生的, 毕竟优化目标是loss.
?
给NN一点时间, 要根据任务留给NN的学习一定空间. 不能说前面一段时间没起色就不管了. 有些情况下就是前面一段时间看不出起色, 然后开始稳定学习.
?
4. 确认分类网络学习充分
分类网络就是学习类别之间的界限. 你会发现, 网络就是慢慢的从类别模糊到类别清晰的. 怎么发现? 看Softmax输出的概率的分布. 如果是二分类, 你会发现, 刚开始的网络预测都是在0.5上下, 很模糊. 随着学习过程, 网络预测会慢慢的移动到0,1这种极值附近. 所以, 如果你的网络预测分布靠中间, 再学习学习.
?
5. Learning Rate设置合理
?
太大: loss爆炸, 或者nan?
?
太小: 半天loss没反映(但是, LR需要降低的情况也是这样, 这里可视化网络中间结果, 不是weights, 有效果, 俩者可视化结果是不一样的, 太小的话中间结果有点水波纹或者噪点的样子, 因为filter学习太慢的原因, 试过就会知道很明显)
?
需要进一步降低了: loss在当前LR下一路降了下来, 但是半天不再降了.
?
如果有个复杂点的任务, 刚开始, 是需要人肉盯着调LR的. 后面熟悉这个任务网络学习的特性后, 可以扔一边跑去了.
?
如果上面的Loss设计那块你没法合理, 初始情况下容易爆, 先上一个小LR保证不爆, 等loss降下来了, 再慢慢升LR, 之后当然还会慢慢再降LR, 虽然这很蛋疼.
?
LR在可以工作的较大值下往小收一收, 免得ReLU把神经元弄死了. 当然, 我是个心急的人, 总爱设个大点的.
?
6. 对比训练集和验证集的loss
判断过拟合, 训练是否足够, 是否需要early stop的依据, 这都是中规中矩的原则, 不多说了.
?
7. 清楚receptive field的大小
CV的任务, context window是很重要的. 所以你对自己模型的receptive field的大小要心中有数. 这个对效果的影响还是很显着的. 特别是用FCN, 大目标需要很大的receptive field. 不像有fully connection的网络, 好歹有个fc兜底, 全局信息都有.
?
简短的注意事项:
1、预处理: -mean/std zero-center就够了, PCA, 白化什么的都用不上. 我个人观点, 反正CNN能学习encoder, PCA用不用其实关系不大, 大不了网络里面自己学习出来一个.
?
2、shuffle, shuffle, shuffle.
?
3、网络原理的理解最重要, CNN的conv这块, 你得明白sobel算子的边界检测.
?
4、Dropout, Dropout, Dropout(不仅仅可以防止过拟合, 其实这相当于做人力成本较低的Ensemble, 当然, 训练起来会比没有Dropout的要慢一点, 同时网络参数你较好相应加一点, 对, 这会再慢一点).
?
5、CNN更加适合训练回答是否的问题, 如果任务比较复杂, 考虑先用分类任务训练一个模型再finetune.
?
6、无脑用ReLU(CV领域).
?
7、无脑用3x3.
?
8、无脑用xavier.
?
9、LRN一类的, 其实可以不用. 不行可以再拿来试试看.
?
10、filter数量2^n.
?
11、多尺度的图片输入(或者网络内部利用多尺度下的结果)有很好的提升效果.
?
12、第一层的filter, 数量不要太少. 否则根本学不出来(底层特征很重要).
?
13、sgd adam 这些选择上, 看你个人选择. 一般对网络不是决定性的. 反正我无脑用sgd + momentum.
?
14、batch normalization我一直没用, 虽然我知道这个很好, 我不用仅仅是因为我懒. 所以要鼓励使用batch normalization.
?
15、不要完全相信论文里面的东西. 结构什么的觉得可能有效果, 可以拿去试试.
?
16、你有95%概率不会使用超过40层的模型.
?
17、shortcut的联接是有作用的.
?
18、暴力调参最可取, 毕竟, 自己的生命最重要. 你调完这个模型说不定过两天这模型就扔掉了.
?
19、机器, 机器, 机器.
?
20、Google的inception论文, 结构要好好看看.
?
21、一些传统的方法, 要稍微了解了解. 我自己的程序就用过1x14的手写filter, 写过之后你看看inception里面的1x7, 7x1 就会会心一笑...
?

转发量:

网友评论:

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片 匿名?

关于我们?? 免责声明?? 广告合作?? 版权声明?? 联系方式?? 原创投稿?? 网站地图??

Copyright?2005-2019 Sykv.com 可思yabo88滚球 版权所有 ?? ICP备案:京ICP备14056871号

人工智能资讯?? 人工智能资讯?? 人工智能资讯?? 人工智能资讯

?扫码入群
咨询反馈
扫码关注

微信公众号

返回顶部
关闭