0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

深度学习的调参经验

电子工程师 来源:工程师曾玲 2019-06-08 14:41 次阅读

对于深度学习本人也是半路出家. 现在的工作内容主要就是使用CNN做CV任务. 干调参这种活也有两年时间了. 我的回答可能更多的还是侧重工业应用, 技术上只限制在CNN这块.

先说下我的观点, 调参就是trial-and-error. 没有其他捷径可以走. 唯一的区别是有些人盲目的尝试, 有些人思考后再尝试.快速尝试, 快速纠错这是调参的关键.

◆ 首先说下可视化

我个人的理解, 对于可视化, 更多的还是帮助人类以自己熟悉的方式来观察网络. 因为, 你是不可能边观察网络, 还边调参的. 你只是训练完成后(或者准确率到达一个阶段后), 才能可视化. 在这之前, 网络没有学习到良好的参数, 你可视化了也没意义, 网络达到不错的准确率了, 你看看其实也就听个响. 同样, 你的网络训练的一塌糊涂, 你可视化也没什么意义, 唯一能够看到的就是中间结果乱七八糟, 或者全黑全白, 这时候你直接看最后准确率就可以知道这网络没救了.

◆ 关于权重的可视化[Visualize Layer Weights](现在是否强求smooth其实意义不大, 这个后面说.)

同样, 你看到一个不满足平滑结果的图像, 你知道, 这网络训练的不好, 但是为什么呢? 是数据不好? 没有预处理? 网络结构问题? 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. 刚开始,先上小规模数据,模型往大了放, 只要不爆显存, 能用256个filter你就别用128个. 直接奔着过拟合去. 没错, 就是训练过拟合网络, 连测试集验证集这些都可以不用.

为什么?

你要验证自己的训练脚本的流程对不对. 这一步小数据量, 生成速度快, 但是所有的脚本都是和未来大规模训练一致的(除了少跑点循环)

如果小数据量下, 你这么粗暴的大网络奔着过拟合去都没效果. 那么, 你要开始反思自己了, 模型的输入输出是不是有问题? 要不要检查自己的代码(永远不要怀疑工具库, 除非你动过代码)? 模型解决的问题定义是不是有问题? 你对应用场景的理解是不是有错? 不要怀疑NN的能力, 不要怀疑NN的能力, 不要怀疑NN的能力. 就我们调参狗能遇到的问题, NN没法拟合的, 这概率是有多小?

你可以不这么做, 但是等你数据准备了两天, 结果发现有问题要重新生成的时候, 你这周时间就酱油了.

★ 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 就会会心一笑...

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 可视化
    +关注

    关注

    1

    文章

    1161

    浏览量

    20846
  • 深度学习
    +关注

    关注

    73

    文章

    5459

    浏览量

    120863
收藏 人收藏

    评论

    相关推荐

    自制飞控板能用地面站软件进行刷固件或者吗?

    如果是自制飞控板的话,还能用地面站软件(mission planner)进行刷固件或者么?有哪位大神可以提供一些入门的学习资料,刚开始,有点懵,不知如何下手。
    发表于 06-27 04:35

    ADRC的使用方法和大致的方向

    由于串级PID还没搞定,就转向了自抗扰控制,用STM32控制无刷电机做了一个ADRC速度闭环,没静差是真的,但感觉也没想象中那么强,就写篇博文记录一下ADRC大概的使用方法和大致的方向。
    发表于 09-07 06:33

    教你怎样学会PID

    不会PID?这篇文章图文结合带你学会PID!让你成为PID大神!!!
    发表于 01-06 07:47

    PID的相关资料分享

    说明:本文章适用于STM32初学者,想完成一个好玩且有深度的项目但不知道从何下手的同学。PID是平衡车的精髓所在,参数整定的好坏直接影响到平衡车的平衡效果。有的车平衡时来回晃而参数选的好的车就能
    发表于 01-14 09:14

    针对PID进行详细的讲解

      大家好,我是小政。本篇文章我将针对PID进行详细的讲解,让每位小伙伴能够对比例、积分、微分三个参数如何调节有更加清晰的理解。一、步骤确立机械中值直立环(内环)——Kp极性、
    发表于 01-14 06:26

    WinGUI_2.3软件

    英文版软件,很好的软件,WinGUI_2.3软件
    发表于 12-08 14:28 3次下载

    NAZA_驱动软件及说明书

    NAZA 驱动软件,需要的可以看一看了
    发表于 02-15 15:10 0次下载

    CF飞控说明

    CF飞控说明
    发表于 10-09 14:56 15次下载

    关于如何从零开始构建深度学习项目的详细教程

    第一部分:启动一个深度学习项目 第二部分:创建一个深度学习数据集 第三部分:设计深度模型 第四部分:可视化
    的头像 发表于 04-19 15:21 3861次阅读

    深度学习和机器学习深度的不同之处 浅谈深度学习的训练和

    近年来,深度学习作为机器学习中比较火的一种方法出现在我们面前,但是和非深度学习的机器学习相比(我
    发表于 05-02 10:30 4309次阅读

    【连载】深度学习笔记4:深度神经网络的正则化

    原理莫过于如下公式: 该公式可谓是机器学习中最核心最关键最能概述监督学习的核心思想的公式了:所有的有监督机器学习,无非就是正则化参数的同时最小化经验误差函数。最小化
    的头像 发表于 08-14 11:58 3305次阅读

    模型:CANape与Simulink的强强联手

    CANape推出新功能Simulink XCP Server,针对Simulink模型以及ECU内部数据的参数化和可视化,让模型变得简单。
    的头像 发表于 08-01 15:00 1233次阅读
    模型<b class='flag-5'>调</b><b class='flag-5'>参</b>:CANape与Simulink的强强联手

    什么是 CCP协议的实现原理

    就是优化或调整控制算法中的某些参数以获得系统最佳效果的过程。我们通过校准工具(比如网络接口卡can盒子和canape)访问 ECU 中的校准变量并进行更改,注意我们要校准的那些参数都被分组到 ECU 内存的一个特殊部分,称为校准内存。我们通过校准工具来访问这块内存。
    发表于 06-21 09:12 768次阅读
    什么是<b class='flag-5'>调</b><b class='flag-5'>参</b> CCP协议的实现原理

    NNI:自动帮你做机器学习的神器

    NNI 自动机器学习,是微软开源的又一个神器,它能帮助你找到最好的神经网络架构或超参数,支持 各种训练环境 。 它常用的 使用场景 如下: 想要在自己的代码、模型中试验 不同的机器学习
    的头像 发表于 10-30 10:28 2269次阅读
    NNI:自动帮你做机器<b class='flag-5'>学习</b><b class='flag-5'>调</b><b class='flag-5'>参</b>的神器

    机器学习8大技巧

    今天给大家一篇关于机器学习技巧的文章。超参数优是机器学习例程中的基本步骤之一。该方法也称为超参数优化,需要搜索超参数的最佳配置以实现最
    的头像 发表于 03-23 08:26 545次阅读
    机器<b class='flag-5'>学习</b>8大<b class='flag-5'>调</b><b class='flag-5'>参</b>技巧