写点什么

深度学习网络调参技巧

  • 2019-11-24
  • 本文字数:2848 字

    阅读完需:约 9 分钟

深度学习网络调参技巧

介绍

之前曾经写过一篇文章,讲了一些深度学习训练的技巧,其中包含了部分调参心得:深度学习训练心得[1]。不过由于一般深度学习实验,相比普通机器学习任务,时间较长,因此调参技巧就显得尤为重要。同时个人实践中,又有一些新的调参心得,因此这里单独写一篇文章,谈一下自己对深度学习调参的理解,大家如果有其他技巧,也欢迎多多交流。

好的实验环境是成功的一半

由于深度学习实验超参众多,代码风格良好的实验环境,可以让你的人工或者自动调参更加省力,有以下几点可能需要注意:


  • 将各个参数的设置部分集中在一起。如果参数的设置分布在代码的各个地方,那么修改的过程想必会非常痛苦。

  • 可以输出模型的损失函数值以及训练集和验证集上的准确率。

  • 可以考虑设计一个子程序,可以根据给定的参数,启动训练并监控和周期性保存评估结果。再由一个主程序,分配参数以及并行启动一系列子程序

画图

画图是一个很好的习惯,一般是训练数据遍历一轮以后,就输出一下训练集和验证集准确率。同时画到一张图上。这样训练一段时间以后,如果模型一直没有收敛,那么就可以停止训练,尝试其他参数了,以节省时间。


如果训练到最后,训练集,测试集准确率都很低,那么说明模型有可能欠拟合。那么后续调节参数方向,就是增强模型的拟合能力。例如增加网络层数,增加节点数,减少 dropout 值,减少 L2 正则值等等。


如果训练集准确率较高,测试集准确率比较低,那么模型有可能过拟合,这个时候就需要向提高模型泛化能力的方向,调节参数。

从粗到细分阶段调参

实践中,一般先进行初步范围搜索,然后根据好结果出现的地方,再缩小范围进行更精细的搜索。


1. 建议先参考相关论文,以论文中给出的参数作为初始参数。至少论文中的参数,是个不差的结果。


2. 如果找不到参考,那么只能自己尝试了。可以先从比较重要,对实验结果影响比较大的参数开始,同时固定其他参数,得到一个差不多的结果以后,在这个结果的基础上,再调其他参数。例如学习率一般就比正则值,dropout 值重要的话,学习率设置的不合适,不仅结果可能变差,模型甚至会无法收敛。


3. 如果实在找不到一组参数,可以让模型收敛。那么就需要检查,是不是其他地方出了问题,例如模型实现,数据等等。可以参考我写的深度学习网络调试技巧[2]

提高速度

调参只是为了寻找合适的参数,而不是产出最终模型。一般在小数据集上合适的参数,在大数据集上效果也不会太差。因此可以尝试对数据进行精简,以提高速度,在有限的时间内可以尝试更多参数。


  • 对训练数据进行采样。例如原来 100W 条数据,先采样成 1W,进行实验看看。

  • 减少训练类别。例如手写数字识别任务,原来是 10 个类别,那么我们可以先在 2 个类别上训练,看看结果如何。

超参数范围

建议优先在对数尺度上进行超参数搜索。比较典型的是学习率和正则化项,我们可以从诸如 0.001 0.01 0.1 1 10,以 10 为阶数进行尝试。因为他们对训练的影响是相乘的效果。不过有些参数,还是建议在原始尺度上进行搜索,例如 dropout 值: 0.3 0.5 0.7)。

经验参数

这里给出一些参数的经验值,避免大家调参的时候,毫无头绪。


Learning rate: 1 0.1 0.01 0.001, 一般从 1 开始尝试。很少见 learning rate 大于 10 的。学习率一般要随着训练进行衰减。衰减系数一般是 0.5。衰减时机,可以是验证集准确率不再上升时,或固定训练多少个周期以后。


不过更建议使用自适应梯度的办法,例如 adam,adadelta,rmsprop 等,这些一般使用相关论文提供的默认值即可,可以避免再费劲调节学习率。对 RNN 来说,有个经验,如果 RNN 要处理的序列比较长,或者 RNN 层数比较多,那么 learning rate 一般小一些比较好,否则有可能出现结果不收敛,甚至 Nan 等问题。


网络层数:先从 1 层开始。


每层结点数:16 32 128,超过 1000 的情况比较少见。超过 1W 的从来没有见过。


batch size: 128 上下开始。batch size 值增加,的确能提高训练速度。但是有可能收敛结果变差。如果显存大小允许,可以考虑从一个比较大的值开始尝试。因为 batch size 太大,一般不会对结果有太大的影响,而 batch size 太小的话,结果有可能很差。


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


dropout:0.5


L2 正则:1.0,超过 10 的很少见。


词向量 embedding 大小:128,256


正负样本比例:这个是非常忽视,但是在很多分类问题上,又非常重要的参数。很多人往往习惯使用训练数据中默认的正负类别比例,当训练数据非常不平衡的时候,模型很有可能会偏向数目较大的类别,从而影响最终训练结果。除了尝试训练数据默认的正负类别比例之外,建议对数目较小的样本做过采样,例如进行复制。提高他们的比例,看看效果如何,这个对多分类问题同样适用。


在使用 mini-batch 方法进行训练的时候,尽量让一个 batch 内,各类别的比例平衡,这个在图像识别等多分类任务上非常重要。

自动调参

人工一直盯着实验,毕竟太累。自动调参当前也有不少研究。下面介绍几种比较实用的办法:


  • Gird Search. 这个是最常见的。具体说,就是每种参数确定好几个要尝试的值,然后像一个网格一样,把所有参数值的组合遍历一下。优点是实现简单暴力,如果能全部遍历的话,结果比较可靠。缺点是太费时间了,特别像神经网络,一般尝试不了太多的参数组合。

  • Random Search。Bengio 在 Random Search for Hyper-Parameter Optimization 中指出,Random Search 比 Gird Search 更有效。实际操作的时候,一般也是先用 Gird Search 的方法,得到所有候选参数,然后每次从中随机选择进行训练。

  • Bayesian Optimization. 贝叶斯优化,考虑到了不同参数对应的实验结果值,因此更节省时间。和网络搜索相比简直就是老牛和跑车的区别。具体原理可以参考这个论文:Practical Bayesian Optimization of Machine Learning Algorithms ,这里同时推荐两个实现了贝叶斯调参的 Python 库,可以上手即用:

  • jaberg/hyperopt, 比较简单。

  • fmfn/BayesianOptimization, 比较复杂,支持并行调参。

总结

1. 合理性检查,确定模型,数据和其他地方没有问题。


2. 训练时跟踪损失函数值,训练集和验证集准确率。


3. 使用 Random Search 来搜索最优超参数,分阶段从粗(较大超参数范围训练较少周期)到细(较小超参数范围训练较长周期)进行搜索。


参考资料:


  1. https://zhuanlan.zhihu.com/p/20767428

  2. https://zhuanlan.zhihu.com/p/20792837

  3. Practical recommendations for gradient-based training of deep architectures by Yoshua Bengio (2012)

  4. Efficient BackProp, by Yann LeCun, Léon Bottou, Genevieve Orr and Klaus-Robert Müller

  5. Neural Networks: Tricks of the Trade, edited by Grégoire Montavon, Geneviève Orr, and Klaus-Robert Müller.


原文链接:https://mp.weixin.qq.com/s?__biz=MzU2ODA0NTUyOQ==&mid=2247484029&idx=1&sn=8ca09b63f782d6761950d15356328ef3&chksm=fc92b8cbcbe531dd7c71d90c856ffb97750cb86cb6d3423bfbbc5be63718cf1f3d3912bdb6b4&scene=27#wechat_redirect


2019-11-24 10:002872

评论

发布
暂无评论
发现更多内容

云智慧蝉联中国IT统一运维ITSM软件市场第一!

云智慧AIOps社区

ITSM IT运维 运维管理

企业级大数据平台智能运维好帮手——星环科技多模数据平台监控软件Aquila Insight

星环科技

英特尔着眼系统工艺协同优化理念,推进摩尔定律新浪潮

科技之家

仅用5个小时纯Java版实现羊了个羊,来看源码吧,还送你108套皮肤

非喵鱼

Java swing 小游戏 羊了个羊

软件测试丨让工作更高效,搞定Git的分支管理

测试人

git GitHub 软件测试 自动化测试 测试开发

云服务器代理商选哪家好?理由是什么?

行云管家

云计算 服务器 云服务器

Karmada多云多集群生产实践专场圆满落幕

华为云开发者联盟

云原生 华为云 12 月 PK 榜

瓴羊Quick BI 权限管理:构建高效企业数据分析运行管理体系

夏日星河

为什么 OpenCV 计算的视频 FPS 是错的

百度Geek说

OpenCV ffmpeg 12 月 PK 榜 帧率

聚焦技术创新!旺链科技荣获“宝山区企业技术中心”认定

旺链科技

区块链 产业区块链 技术创新 12 月 PK 榜

聚焦人机交互智能应用领域,APISIX 在希沃网关的应用与实践

API7.ai 技术团队

api 网关 APISIX 用户案例

你可能需要的6个React开发小技巧

千锋IT教育

星环科技TDS 2.4.0 发布: 数据开发、数据治理、数据运营套件能力再次升级

星环科技

FL Studio2024永久免费版音乐程序

茶色酒

FL Studio FL Studio2023 FL Studio21

小游戏流量变现瓶颈,新增长点是超级App?

FinFish

小游戏 小程序游戏 微信小游戏 小游戏引擎 流量变现

Mybatis源码解析之执行SQL语句

京东科技开发者

缓存 mybatis sql 源码学习 数据库·

10个Python脚本来自动化你的日常任务

@下一站

Python 脚本 12月日更 12月月更

大咖说·施耐德|数智技术,企业绿色低碳转型的催化剂

大咖说

双碳 绿色转型

2022年12月中国数据库排行榜:OceanBase立足创新登榜首,华为腾讯排名上升树雄心

墨天轮

数据库 opengauss TiDB oceanbase 国产数据库

MacBook2023免费的系统电脑优化软件CleanMyMac

茶色酒

CleanMyMac CleanMyMac X CleanMyMac X2023

Java开发如何通过IoT边缘ModuleSDK进行协议转换

华为云开发者联盟

Java 开发 华为云 12 月 PK 榜

MatrixOne 0.6.0 :首个云原生架构的HTAP数据库发布!

MatrixOrigin

分布式数据库 云原生数据库 国产数据库 MatrixOrigin MatrixOne

DHorse打包原理

tiandizhiguai

maven 打包工具 构建

使用Spring Data Redis 发布订阅消息

码语者

redis Spring Boot message

BEVFormer-accelerate:基于EasyCV加速BEVFormer

阿里云大数据AI技术

深度学习 算法 计算机视觉 12 月 PK 榜

想做长期的 AB 实验?快来看看这些坑你踩了没

京东科技开发者

测试 测试原则 复盘归因 A/B 测试

四步骤打造银行智能标签体系,助力银行精准营销

袋鼠云数栈

智能标签 数据画像

等保三级认证备案证明是哪个机构颁发?一般要多久?

行云管家

等保 等级保护 等保三级 等保备案

性能达1.5+倍!昇腾AI助力分子动力学模拟研究

华为云开发者联盟

人工智能 华为云 昇腾AI 12 月 PK 榜

【知识分享】关于电子元器件封装的几个小知识

华秋PCB

封装 PCB PCB设计

开发小游戏都有哪些难点?

FinFish

小游戏 小游戏开发 小程序游戏 微信小游戏

深度学习网络调参技巧_语言 & 开发_深度传送门_InfoQ精选文章