深度学习模型设计经验分享

深度学习模型设计经验分享
内容来源:2018 年 05 ⽉ 18 ⽇,百度资深研发⼯程师刘凡平在“百度深度学习公开课·杭州站:AI⼯程师的快速进阶之路”进⾏的
内容来源:
《深度学习模型设计经验分享》演讲分享。IT ⼤咖说(id:itdakashuo)作为独家视频合作⽅,经主办⽅和讲者审阅授权发布。应力应变曲线
阅读字数:
阅读字数:3633 | 10分钟阅读
法国社会学家获取嘉宾演讲视频及PPT:
摘要
本次演讲将从数据准备、模型结构、优化⽅法、计算性能这四个⽅⾯,来探讨深度学习模型设计的⼀些经验。
研发流程简述
以个⼈经验来看,⼀般性的研发流程⼤致可分为8步。
1. 问题分析,确定需求
2. 数据分析,确定现有数据的价值(主要依据特征及分布)
耦合性
3. 特征抽取,根据数据的价值和需要解决的问题,确定特征
4. 数据准备,在前三步都完成的情况下,准备训练集、测试集合、验证集合
5. 模型分析,根据问题的输⼊和输出,确定选择的模型
6. 参数训练,不断迭代模型直⾄收敛
7. 验证调优,验证模型的各项指标,使模型达到最佳状态
8. 应⽤上线,以离线或在线的⽅式对外提供服务
整个流程中,模型设计的动机和⽬标⾮常重要。其中包括需求与问题的定义、建⽴问题的数学模型、确定数据与求解问题之间的关系、探索问题解的可能性、⽬标的可实现性与可评估性。
经验之数据准备
充分的数据
对于模型设计⾸先要有充分的数据,分为两个层⾯。第⼀是数据特征,⽤于确定能否达成模型设计的⽬标,特征应当具备⼀定的“因果关系”,分布要有“导向性”。第⼆数据集应当尽可能多,DNN需要⼤量的数据,⽽且模型在⼩的数据集上容易过拟合。建议如果条件允许可以尝试扩展原始的数据集合。
数据预处理
数据预处理对很多业内⼈员来说是个令⼈头疼的问题,针对不同场景有不同的解决⽅案。
连体人
简单介绍⼏种常见的⽅式。⾸先是去均值处理,即⽤原始数据减去全部数据的均值,把输⼊数据各个维度的数据都中⼼化为0。去均值处理后,特征虽然明显了,但是特征之间的相互⽐较性尚未明确,因此要⽤到归⼀化处理,把每个维度上的数据都除以这个维度上的数据的标准。另外还有⼀种适使⽤于图像处理的⽅式PCA/Whiteing(⽩化),图像中相邻像素点之间的特征极为相似,⽆法轻易做到收敛。⽽PCA 可以去除这些相邻特征的相关性,达到快速收敛的⽬的。
数据的shuffle
每次epoch的时候都会有很多的batch,⼀般情况下这些batch都是相同的,但理想状态是每次epoch都有不同的batch。因此如果条件允许就应该在每次epoch的时候shuffle(随机化)⼀次,以获取不同的batch。
经验之模型结构
隐藏层神经元估算
BP神经⽹络对于单层的感知器⽹络新增了隐藏层,隐藏层数量的选择⽬前还不具备理论⽀持。
在多层感知器中,确定的是输⼊和输出层中的节点数量,隐藏层节点数量是不确定的,并对神经⽹络的性能有影响。对此我们可以使⽤经验公式来计算
h表⽰隐藏层数量,m是输⼊层,n是输出层,a为取值1~10的范围值。最后h的结果也在⼀个范围值内,⼀般建议取该范围中为2的n次⽅的值。
一起又看流星雨最后一集
权重初始化策略
权重合理初始化能够提升性能并加快训练速度,对于权重⽽⾔,建议统⼀到⼀定区间内。
线性模型区间建议为[-v, v],v=1/sqrt(输⼊层尺⼨),sprt表⽰开根号。卷积神经⽹络的区间和公式同样类似,不过最后的输⼊层尺⼨要改为卷积核的宽度*卷积核的⾼度*输⼊深度。
有效调整激活函数
Sigmoid以及Tanh函数的代价⾮常昂贵,容易饱和从⽽导致梯度消失,并且可能会停⽌⽅向传播。实际上,⽹络模型的层级结构越深,就越应避免使⽤Sigmoid和Tanh函数。可以使⽤更简单⽽且更⾼效的ReLU和PReLU的激活函数。
ReLU是⾮常有⽤的⾮线性函数,可以解决很多问题。不过由于ReLU阻碍反向传播,初始化不好,所以⽤它微调模型的时候,没法得到任何微调效果。建议使⽤PReLU以及⼀个⾮常⼩的乘数(通常为0.1),这样收敛会更快,⽽且不会像ReLU那样在初始化阶段被卡住。此外ELU也很好,但成本较⾼。
实际上ReLU是Maxout的⼀种特例。Maxout是⼀个可以学习的激活函数,主要⼯作⽅式是选择每组中最⼤的数作为输出值。如下图,以两个元素为⼀组,5和7,-1和1,最终得到7和1。
模型拟合能⼒验证
模型过拟合相信很多⼈都遇到过,也由此引出了很多问题,不过从另⼀个及⾓度来看过拟合是有必要
存在的——可以⽤它来做模型的验证。因为复杂模型下⼤规模样本的训练需要耗费⼤量的时间,从⽽导致开发成本上升。
我们可以在使⽤全量数据集上训练之前,先在随机抽样的⼦集上进⾏过拟合验证,如果过拟合现象发⽣,则可以推断⽹络模型收敛的可能性较⾼。
纳维斯托克斯方程注重Loss的设计
Loss的设计要注重其合理性,简单直接的体现模型的终极⽬标,有合理的梯度,能够被求解。另外不要过于关注Accuracy(评测指标),⽽忽视了训练过程中Loss的设计。
经验之优化⽅法
学习速率优化⽅法
已知调节学习速率也能带来效果的提升,上图是不同速率下Loss曲线的情况,很明显最优的速率应该是让Loss曲线平滑向前(红⾊曲线)。在对学习速率进⾏调参的时候可以参考这张图。
卷积核⼤⼩优化
⼏个⼩的卷积核叠加在⼀起,相⽐⼀个⼤的卷积核,与原图的连通性不变,但却⼤⼤降低了参数的个数以及计算复杂度。因此我们推荐“⼩⽽深”的模型,避免“⼤⽽短”。⼩的卷积核还能代替⼤的卷积核,⽐如⼀个5*5的卷积核可以⽤两个3*3的卷积核代替,⼀个7*7的卷积核可以⽤三个3*3的卷积核代替。
⼀般优化⽅法选择
学习率与训练步骤、batch⼤⼩和优化⽅法都有耦合关系,常见的优化⽅案是⾃适应学习速率(RMSProb、Momentum、Adam等),使⽤⾃适应优化算法,⾃动更新学习速率。也可以使⽤SGD⼿动选择学习率和动量参数,此时随着时间的推移学习率会降低。实际使⽤中,⾃适应优化倾向于⽐SGD更快收敛,最终表现通常相对较差。
⼀般⽽⾔,对于⾼性能训练较好的做法是从Adam切换到SGD。不过由于训练的早期阶段是SGD对参数调整和初始化⾮常敏感的时候,因此可以使⽤Adam进⾏最初的训练,这样不仅节约时间,且不必担⼼初始化和参数调整。当Adam运⾏⼀段时间后,再切换到SGD加动量优化,以达到最佳性能。
当然对于稀疏数据,建议应尽量使⽤学习可⾃适应的优化⽅法。
效果可视化
通常卷积神经⽹络的卷积层的weight可视化出来会具备smooth的特性。下⾯两者图都是将⼀个神经⽹
络的第⼀层卷积层的filter weight可视化出来的效果。如果出现左边的这种情况,可能就需要考虑下模型有哪些地⽅设计的有问题。
经验之计算性能
计算性能分析⽅法
计算平台有两个重要的指标,算⼒和带宽。算⼒表⽰计算平台的性能上限,指的是⼀个计算平台倾尽全⼒每秒钟所能完成的浮点运算数,单位是FLOP/s。带宽指的是计算平台倾尽全⼒每秒钟所能完成的内存交换量,单位是Byte/s。算⼒除以带宽可得到计算平台的强度上限,即单位内存交换最多⽤来进⾏多少次计算,单位是FLOP/Byte。
模型同样有两个重要指标,计算量和访存量。计算量指的是输⼊单个样本,模型进⾏⼀次完整的前向传播所发⽣的浮点运算个数,也即模型的时间复杂度,单位是FLOPS。访问量指的是输⼊单个样本,完成⼀次前向传播过程中发⽣的内存交换量,即模型的空间复杂度,数据类型通常为float32。
我们来看⼀个模型计算性能⽰例。假设有两个矩阵A、B,它们均是1000*1000,数据类型为float32,计算C=A*B。则该计算会进⾏1000*1000*1000的浮点乘、加,约2G FLOPS的计算量。该过程中会读A、B两个矩阵,写C矩阵,⾄少要访问三次存储器,约
12MB。
这样简单的1000*1000的矩阵就要花费12MB,可以想象更复杂的模型会耗费多少资源。正是基于这种对计算性能的考虑,在选择模型的时候不⼀定⾮要选深度学习的,空间和时间的复杂度对模型也有很⼤的影响。在模型选择上,可以先尝试线性模型、树相关的模型,不适合的话再使⽤传统机器学习中的经典模型,最后才是神经⽹络模型。
Dropout & 分布式训练
根据我们的经验,在单层节点数量⼤于256个时,⽆论是全连接层或卷积层都建议使⽤Dropout。
以个⼈接触过的开发者来看,很多⼈并不是特别重视分布式训练,⼤部分情况都是单机运⾏⾼性能显卡,但分布式的训练效率可能会更⾼些,可以考虑向这⽅⾯靠拢。

本文发布于:2024-09-22 07:21:24,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/438008.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:模型   数据   学习   训练   计算   问题
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议