当前位置: 首页 > news >正文

知乎上关于‘深度学习调参技巧’讨论

作者:杨军
链接:https://www.zhihu.com/question/25097993/answer/127374415
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Share一些自己关于深度学习模型调试技巧的总结思考(以CNN为主)。

最近因为一些需要,参与了一些CNN建模调参的工作,出于个人习性,我并不习惯于通过单纯的trial-and-error的方式来调试经常给人以”black-box”印象的Deep Learning模型,所以在工作推进过程中,花了一些时间去关注了深度学习模型调试以及可视化的资料(可视化与模型调试存在着极强的联系,所以在后面我并没有对这两者加以区分),这篇文章也算是这些工作的一个阶段性总结。

这里总结的内容,对于模型高手来说,应该说都是基本的know-how了。

我本人是计算机体系结构专业出身,中途转行做算法策略,所以实际上我倒是在大规模机器学习系统的开发建设以及训练加速方面有更大的兴趣和关注。不过机器学习系统这个领域跟常规系统基础设施(比如Redis/LevelDB以及一些分布式计算的基础设施等)还有所区别,虽然也可以说是一种基础设施,但是它跟跑在这个基础设施上的业务问题有着更强且直接的联系,所以我也会花费一定的精力来关注数据、业务建模的技术进展和实际问题场景。

说得通俗一些,对自己服务的业务理解得更清晰,才可能设计开发出更好的算法基础设施。

另外在进入文章主体之前想声明的是,这篇文章对于Deep Learning的入门者参考价值会更高,对于Deep Learning老手,只期望能聊作帮助大家技术总结的一个余闲读物而已。

文章的主要内容源于Stanford CS231n Convolutional Neural Networks for Visual Recognition课程[1]里介绍的一些通过可视化手段,调试理解CNN网络的技巧,在[1]的基础上我作了一些沿展阅读,算是把[1]的内容进一步丰富系统化了一下。限于时间精力,我也没有能够把里面提到的所有调试技巧全部进行尝试,不过在整理这篇文章的时候,我还是参考了不止一处文献,也结合之前以及最近跟一些朋友的技术交流沟通,对这些方法的有效性我还是有着很强的confidence。

1.Visualize Layer Activations

通过将神经网络隐藏层的激活神经元以矩阵的形式可视化出来,能够让我们看到一些有趣的insights。

在[8]的头部,嵌入了一个web-based的CNN网络的demo,可以看到每个layer activation的可视化效果。

在[14]里为几种不同的数据集提供了CNN各个layer activation的可视化效果示例,在里头能够看到CNN模型在Mnist/CIFAR-10这几组数据集上,不同layer activation的图形化效果。

原则上来说,比较理想的layer activation应该具备sparse和localized的特点。

如果训练出的模型,用于预测某张图片时,发现在卷积层里的某个feature map的activation matrix可视化以后,基本跟原始输入长得一样,基本就表明出现了一些问题,因为这意味着这个feature map没有学到多少有用的东西。

2.Visualize Layer Weights
除了可视化隐藏层的activation以外,可视化隐藏层的模型weight矩阵也能帮助我们获得一些insights。

这里是AlexNet的第一个卷积层的weight可视化的示例:

通常,我们期望的良好的卷积层的weight可视化出来会具备smooth的特性(在上图也能够明显看到smooth的特点),参见下图(源于[13]):

这两张图都是将一个神经网络的第一个卷积层的filter weight可视化出来的效果图, 左图存在很多的噪点,右图则比较平滑。出现左图这个情形,往往意味着我们的模型训练过程出现了问题。

3.Retrieving Images That Maximally Activate a Neuron
为了理解3提到的方法,需要先理解CNN里Receptive Field的概念,在[5][6]里关于Receptive Field给出了直观的介绍:

如果用文字来描述的话,就是对应于卷积核所生成的Feature Map里的一个neuron,在计算这个neuron的标量数值时,是使用卷积核在输入层的图片上进行卷积计算得来的,对于Feature Map的某个特定neuron,用于计算该neuron的输入层数据的local patch就是这个neuron的receptive field。

而对于一个特定的卷积层的Feature Map里的某个神经元,我们可以找到使得这个神经元的activation最大的那些图片,然后再从这个Feature Map neuron还原到原始图片上的receptive field,即可以看到是哪张图片的哪些region maximize了这个neuron的activation。在[7]里使用这个技巧,对于某个pooling层的输出进行了activation maximization可视化的工作:

不过,在[9]里,关于3提到的方法进行了更为细致的研究,在[9]里,发现,通过寻找maximizing activation某个特定neuron的方法也许并没有真正找到本质的信息。因为即便是对于某一个hidden layer的neurons进行线性加权,也同样会对一组图片表现出相近的semantic亲和性,并且,这个发现在不同的数据集上得到了验证。

如下面在MNIST和ImageNet数据集上的观察:


4.Embedding the Hidden Layer Neurons with  t-SNE
这个方法描述起来比较直观,就是通过t-SNE[10]对隐藏层进行降维,然后以降维之后的两维数据分别作为x、y坐标(也可以使用t-SNE将数据降维到三维,将这三维用作x、y、z坐标,进行3d clustering),对数据进行clustering,人工review同一类图片在降维之后的低维空间里是否处于相邻的区域。t-SNE降维以后的clustering图往往需要在较高分辨率下才能比较清楚地看到效果,这里我没有给出引用图,大家可以自行前往这里[15]里看到相关的demo图。

使用这个方法,可以让我们站在一个整体视角观察模型在数据集上的表现。

5.Occluding Parts of the Image
这个方法在[11]里被提出。我个人非常喜欢这篇文章,因为这篇文章写得非常清晰,并且给出的示例也非常直观生动,是那种非常适合推广到工业界实际应用场景的论文,能够获得ECCV 2014 best paper倒也算在意料之中。在[11]里,使用了[12]里提出的Deconvolutional Network,对卷积层形成的feature map进行reconstruction,将feature map的activation投影到输入图片所在的像素空间,从而提供了更直观的视角来观察每个卷积层学习到了什么东西,一来可以帮助理解模型;二来可以指导模型的调优设计。

[11]的工作主要是在AlexNet这个模型上做的,将Deconvolutional Network引入到AlexNet模型以后的大致topology如下:

上图里,右边是正常的卷积神经网络,左边是Deconv Net,Deconv Net的输入是卷积神经网络的某个卷积层/pooling层的输出,另外,在Deconv Net与右边的卷积神经网络之间存在一个Switches连接通道,用于执行Deconv net里的Unpooling操作。注意上图的一个细节,Deconv Net的Unpooling操作,实际上是pooling操作的一个近似逆函数,而非精确逆函数。

在AlexNet模型上使用Deconv Net对feature map进行input image space投影的效果示例如下:

从上面这个示例图里能够看得出来,不同的feature map,使用Deconv Net进行reconstruction,会投影出不同描述粒度的图片,比如低层的layer reconstruction出来的会是边缘性质的图像,而高层的layer reconstruction出来的则可能会是狗的脸部,计算器的轮廓等更general性质的图像。

另外,通过Deconv Net还可以观察训练过程中,feature map的演化情况,基本的作法就是将每个卷积层里,activation最大的feature map使用Deconv Net进行reconstruction,以epoch为时间粒度,观察这些feature map reconstructed image的变化趋势,比如下图:

能够看到,低层的feature map比较快就会收敛,而高层的feature map则需要较长epoch的训练时长才会收敛。

接下来回到[11]里提出的"Occluding Parts of the Image”的方法,这个方法描述起来并不复杂:对于一张输入图片,使用一个小尺寸的灰度方块图作为掩模,对该原始图片进行遍历掩模,每作一次掩模,计算一下CNN模型对这张掩模后图片的分类预测输出,同时,找到一个在训练集上activation最大的feature map,每作一次掩模,记录下来以掩模图片作为输入数据之后的feature map矩阵,将所有掩模所产生的这些feature map矩阵进行elementwise相加,就可以观察到掩模图片的不同区域对分类预测结果以及feature map的activation value的影响。示例图如下:

上图的第一列是原始图片。
第二列是在训练集上选出了layer 5上的activation行为最显著的一个feature map之后,对第一列的原始图片使用一个灰度小色块进行occluding之后,所生成的该feature map的activation value进行sum up之后的可视图。

第三列是这个feature map(这个是在没有occluding的image上应用CNN模型生成的feature map)使用Deconv Net投影到input image space上的图像。能够看得出来,第三列所reconstruct出的image与第二列中受occluding操作影响较大的区域明显是相重合的。

最后说一下我的感受,卷积神经网络自从2012年以AlexNet模型的形态在ImageNet大赛里大放异彩之后,就成为了图像识别领域的标配,甚至现在文本和语音领域也开始在使用卷积神经网络进行建模了。不过以卷积神经网络为代表的深层神经网络一直被诟病“black-box”,这对于DL模型在工业界的应用推广还是带来了一定的阻碍。

对于”black-box”这个说法,一方面,我觉得确实得承认DL这种model跟LR、GBDT这些shallow model相比,理解、调试的复杂性高了不少。想像一下,理解一个LR或是GBDT模型的工作机理,一个没有受到过系统机器学习训练的工程师,只要对LR或GBDT的基本概念有一定认识,也大致可以通过ad-hoc的方法来进行good case/bad case的分析了。而CNN这样的模型,理解和调试其的技巧,则往往需要资深的专业背景人士来提出,并且这些技巧也都还存在一定的局限性。对于LR模型来说,我们可以清晰地描述一维特征跟目标label的关系(即便存在特征共线性或是交叉特征,也不难理解LR模型的行为表现),而DL模型,即便这几年在模型的可解释性、调试技巧方面有不少研究人员带来了新的进展,在我来看也还是停留在一个相对”rough”的控制粒度,对技巧的应用也还是存在一定的门槛。

另一方面,我们应该也对学术界、工业界在DL模型调试方面的进展保持一定的关注。我自己的体会,DL模型与shallow model的应用曲线相比,目前还是存在一定的差异的。从网上拉下来一个pre-trained好的模型,应用在一个跟pre-trained模型相同的应用场景,能够快速地拿到7,80分的收益,但是,如果应用场景存在差异,或者对模型质量要求更高,后续的模型优化往往会存在较高的门槛(这也是模型调试、可视化技巧发挥用武之地的地方),而模型离线tune好以后,布署到线上系统的overhead也往往更高一些,不论是在线serving的latency要求(这也催生了一些新的商业机会,比如Nervana和寒武纪这样的基于软硬件协同设计技术的神经网络计算加速公司),还是对memory consumption的需求。以前有人说过一句话“现在是个人就会在自己的简历上写自己懂Deep Learning,但其实只有1%的人知道怎样真正design一个DL model,剩下的只是找来一个现成的DL model跑一跑了事”。这话听来刺耳,但其实有几分道理。
回到我想表达的观点,一方面我们能够看到DL model应用的门槛相较于shallow  model要高,另一方面能够看到这个领域的快速进展。所以对这个领域的技术进展保持及时的跟进,对于模型的设计调优以及在业务中的真正应用会有着重要的帮助。像LR、GBDT这种经典的shallow model那样,搞明白基本建模原理就可以捋起袖子在业务中开搞,不需要再分配太多精力关注模型技术的进展的工作方式,在当下的DL建模场景,我个人认为这种技术工作的模式并不适合。也许未来随着技术、工具平台的进步,可以把DL也做得更为易用,到那时,使用DL建模的人也能跟现在使用shallow model一样,可以从模型技术方面解放出更多精力,用于业务问题本身了

References:

[1]. Visualizing what ConvNets Learn. CS231n Convolutional Neural Networks for Visual Recognition
CS231n Convolutional Neural Networks for Visual Recognition
[2]. Matthew Zeiler. Visualizing and Understanding Convolutional Networks. Visualizing and Understanding Convolutional Networks.

[3]. Daniel Bruckner. deepViz: Visualizing Convolutional Neural Networks for Image Classification.

vis.berkeley.edu/course
[4]. ConvNetJS MNIST Demo. ConvNetJS MNIST demo
[5]. Receptive Field. CS231n Convolutional Neural Networks for Visual Recognition
[6]. Receptive Field of Neurons in LeNet. deep learning
[7]. Ross Girshick. Rich feature hierarchies for accurate object detection and semantic segmentation

Tech report. Arxiv, 2011.

[8]. CS231n: Convolutional Neural Networks for Visual Recognition. Stanford University CS231n: Convolutional Neural Networks for Visual Recognition
[9]. Christian Szegedy. Intriguing properties of neural networks. Arxiv, 2013.

[10]. t-SNE. t-SNE – Laurens van der Maaten
[11]. Matthew D.Zeiler. Visualizing and Understanding Convolutional Networks. Arxiv, 2011.

[12]. Matthew D.Zeiler. Adaptive Deconvolutional Networks for Mid and High Level Feature Learning, ICCV 2011.

[13]. Neural Networks Part 3: Learning and Evaluation. CS231n Convolutional Neural Networks for Visual Recognition
[14]. ConvNetJS---Deep Learning in Your Browser. ConvNetJS: Deep Learning in your browser
[15]. Colah. Visualizing MNIST: An Exploration of Dimensionality Reduction. colah.github.io/posts/2
编辑于 2016-10-19
作者:Captain Jack
链接:https://www.zhihu.com/question/25097993/answer/127472322
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我和

@杨军
类似, 也是半路出家. 现在的工作内容主要就是使用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


========================================================
我自己的经验, 有下面这些:

基本原则:
快速试错

一些大的注意事项:
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 就会会心一笑...
编辑于 2016-10-20

作者:罗浩.ZJU
链接:https://www.zhihu.com/question/25097993/answer/136222606
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

根据我平时使用的经验,记住几个关键词就可以

Relu,batchnorm,dropout,adam ,微步幅

前面几个比较好理解,relu 是一个很万能的激活函数,可以很好的防止梯度弥散问题,当然最后一层的激活函数千万慎用relu,如果是连续的用identify(还是叫identity ,记不清了),分类的用softmax ,拟合回归的话我最后一层也经常不用激活函数,直接wx +b就行

batchnorm也是大杀器,可以大大加快训练速度和模型性能

Dropout 也是防止过拟合的大杀器,如果不知道怎么设比例的话,就直接设置为0.5,即一半一半,但是测试的时候记得把dropout关掉

Adam 优化函数应该是收敛非常快的一个优化函数,不过有人说sgd +momentum 速度慢一点但是性能好,但是我用的没感觉性能好

微步幅是只卷积步幅选择2,然后模板数量逐层翻倍,就是越来越小但越来越厚,反卷积的话对称反过来,这样每次卷积图像就缩小了一半,下采样和池化都可以不加,我一直不加的

以上是我平时调参的一些经验,可供参考,我平时用这些方法基本上在一两百次迭代就可以达到百分之八十的性能了,所以除了刷结果不需要训练那么久

大半夜手机码字好艰难 o(╥﹏╥)o

----------------------------------------------------------------补充几个图--------------------------------------------------------
看到几个图,对于优化函数的比较有很直观的帮助,其中adadelta可以近似的认为adam,果然和我平时实验的结果一致,通常adam优化函数的性能是不错的

img.blog.csdn.net/20160
img.blog.csdn.net/20160

感觉除了层数和每层隐节点的个数,也没啥好调的。其它参数,近两年论文基本都用同样的参数设定:迭代几十到几百epoch。sgd,mini batch size从几十到几百皆可。步长0.1,可手动收缩,weight decay取0.005,momentum取0.9。dropout加relu。weight用高斯分布初始化,bias全初始化为0。最后记得输入特征和预测目标都做好归一化。做完这些你的神经网络就应该跑出基本靠谱的结果,否则反省一下自己的人品。
以上。
编辑于 2015-01-19


作者:匿名用户
链接:https://www.zhihu.com/question/25097993/answer/37525469
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

作者:陈旭展
链接:https://www.zhihu.com/question/25097993/answer/161393876
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

趁着模型正在跑,我来强答一发。


我只对卷积网络有一点点了解,所以接下来谈的都是和卷积网络相关的内容。

调参请在验证集上!调参请在验证集上!调参请在验证集上!

首先我们假设我们手上有一个正确的,没有bug,可以训练的模型,以及预先设立的误差目标。那么分三种情况:

1、模型表现非常好,在训练集和验证集上都满足我们的目标。那不用调了。

2、模型在训练集上的误差很小,且各种(softmax 等等) loss 能减小到一个很小的值(对于我自己而言小于0.01),但是验证集的 loss 相对较大(对我的问题而言,一般会在0.3~0.6)。那就是过拟合了。

3、在训练集和验证集上的loss都比较大,都大于0.3,那可能就是欠拟合了。


——————————————————————————————————————————

模型的训练是在拟合训练集的规律,模型的使用却是将规律作用于测试集。那么我们假设训练集和测试集所包含的规律是大方向相同的,小细节存在差异的。


如果一个模型在训练集上一直一直训练下去,那么它会很好的拟合训练集所有的大方向规律和小细节规律,过拟合就是必然的了。因为训练的目标是将训练集 loss 降到 0。理想的训练过程如图:





我们假设模型在验证集的表现由两部分组成:1、对训练集规律的掌握(主要指标 trainset loss),2、学习结果对训练集的适应程度(主要指标 validation set loss)。如上图所示,调参的本质就是要找到那个best model 平衡点。

——————————————————————————————————————————


出现上述情况该调什么?调试hyperparameters 的先后顺序是什么?

1、优先调 learning rate!优先调 learning rate!优先调 learning rate!

学习速率会很大程度上影响模型的表现。同样的模型采用不同的learning rate 可能会表现迥异。所以凭感觉建好一个模型后如果对表现不满意应该优先调学习速率。我前段时间在知乎上看一个哥们说学习速率可以有解析解,希望他早日成功拯救我脱离调学习速率的苦海。模型具有理论容量和有效容量两种能力指标,理论容量是由卷积核数量,模型深度等决定的。但是有效容量会受学习速率影响。

2、加 Dropout, 加 BN,  加Data Argument

一般而言,在设计模型之初我们都信奉大力出奇迹。模型尽量深,卷积核尽量多,强行让模型拟合训练集。这时容易遇到的问题就是过拟合。解决过拟合的第一要素是模型的正则化,最有效方法是加大训练数据集。如果有钱任性,那请多标记数据。如果没钱要认命(比如我),那就给训练数据加增强,什么图像裁剪,对称变换,旋转平移,都可以让模型在验证集上的表现更好。此外,增加常用的正则化也可以提升模型的表现。

3、调模型的层数和卷积核数量

走到这一步的时候都是迫不得已了。这两个参数都是对模型理论容量具有巨大影响的参数,一旦调整了之后所有东西都要重新调。增大模型的层数和卷积核的数量都会提升模型的容量。不同的是,增大模型层数(让模型变高)可以让模型获得更好的非线性,模型容量指数增加,缺点是加大层数会让模型更难训练,面临梯度消失的风险,引入死单元。增加卷积核(让模型变胖)可以在不引入训练困难的情况下让模型更好的拟合训练集,也就是降低 training loss,但是会更容易过拟合。


总之,理想情况下表现优越的模型一般长的高高瘦瘦(深,每层卷积核不多),但是为了便于我们训练,有时候不得不让他更矮壮一些。模型的调参除了学习速率和正则化这些比较耗时的工作外,还需要一些灵感,来确定模型的身材。


努力多调吧,你在训练模型的时候它也在训练你。

推荐Yoshua 的 Deep learning book, chapter 11, 11.4.1 Manul Hyperparameter tunning.


拜拜,装完逼就跑,真刺激~~~~~~~~~~~~~~~~~~

编辑于 2017-04-27
作者:陈旭展
链接:https://www.zhihu.com/question/25097993/answer/161393876
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

趁着模型正在跑,我来强答一发。


我只对卷积网络有一点点了解,所以接下来谈的都是和卷积网络相关的内容。

调参请在验证集上!调参请在验证集上!调参请在验证集上!

首先我们假设我们手上有一个正确的,没有bug,可以训练的模型,以及预先设立的误差目标。那么分三种情况:

1、模型表现非常好,在训练集和验证集上都满足我们的目标。那不用调了。

2、模型在训练集上的误差很小,且各种(softmax 等等) loss 能减小到一个很小的值(对于我自己而言小于0.01),但是验证集的 loss 相对较大(对我的问题而言,一般会在0.3~0.6)。那就是过拟合了。

3、在训练集和验证集上的loss都比较大,都大于0.3,那可能就是欠拟合了。


——————————————————————————————————————————

模型的训练是在拟合训练集的规律,模型的使用却是将规律作用于测试集。那么我们假设训练集和测试集所包含的规律是大方向相同的,小细节存在差异的。


如果一个模型在训练集上一直一直训练下去,那么它会很好的拟合训练集所有的大方向规律和小细节规律,过拟合就是必然的了。因为训练的目标是将训练集 loss 降到 0。理想的训练过程如图:





我们假设模型在验证集的表现由两部分组成:1、对训练集规律的掌握(主要指标 trainset loss),2、学习结果对训练集的适应程度(主要指标 validation set loss)。如上图所示,调参的本质就是要找到那个best model 平衡点。

——————————————————————————————————————————


出现上述情况该调什么?调试hyperparameters 的先后顺序是什么?

1、优先调 learning rate!优先调 learning rate!优先调 learning rate!

学习速率会很大程度上影响模型的表现。同样的模型采用不同的learning rate 可能会表现迥异。所以凭感觉建好一个模型后如果对表现不满意应该优先调学习速率。我前段时间在知乎上看一个哥们说学习速率可以有解析解,希望他早日成功拯救我脱离调学习速率的苦海。模型具有理论容量和有效容量两种能力指标,理论容量是由卷积核数量,模型深度等决定的。但是有效容量会受学习速率影响。

2、加 Dropout, 加 BN,  加Data Argument

一般而言,在设计模型之初我们都信奉大力出奇迹。模型尽量深,卷积核尽量多,强行让模型拟合训练集。这时容易遇到的问题就是过拟合。解决过拟合的第一要素是模型的正则化,最有效方法是加大训练数据集。如果有钱任性,那请多标记数据。如果没钱要认命(比如我),那就给训练数据加增强,什么图像裁剪,对称变换,旋转平移,都可以让模型在验证集上的表现更好。此外,增加常用的正则化也可以提升模型的表现。

3、调模型的层数和卷积核数量

走到这一步的时候都是迫不得已了。这两个参数都是对模型理论容量具有巨大影响的参数,一旦调整了之后所有东西都要重新调。增大模型的层数和卷积核的数量都会提升模型的容量。不同的是,增大模型层数(让模型变高)可以让模型获得更好的非线性,模型容量指数增加,缺点是加大层数会让模型更难训练,面临梯度消失的风险,引入死单元。增加卷积核(让模型变胖)可以在不引入训练困难的情况下让模型更好的拟合训练集,也就是降低 training loss,但是会更容易过拟合。


总之,理想情况下表现优越的模型一般长的高高瘦瘦(深,每层卷积核不多),但是为了便于我们训练,有时候不得不让他更矮壮一些。模型的调参除了学习速率和正则化这些比较耗时的工作外,还需要一些灵感,来确定模型的身材。


努力多调吧,你在训练模型的时候它也在训练你。

推荐Yoshua 的 Deep learning book, chapter 11, 11.4.1 Manul Hyperparameter tunning.


拜拜,装完逼就跑,真刺激~~~~~~~~~~~~~~~~~~

编辑于 2017-04-27

相关文章:

  • Matlab中@文件夹/+文件夹,类的点滴知识点
  • 入门GAN小示例tensorflow代码解析
  • Maltlab中函数 line()以及text()
  • 阅读MatconvNet中Fast Rcnn源码笔记(1)
  • 深度学习之对抗样本问题
  • 深度学习对抗样本的八个误解与事实
  • 阅读yolo_v1源码(tensorflow)笔记
  • 【Tensorflow1.0+】记录常用函数
  • 【零基础入门学习Python笔记017】GUI的最终选择:Tkinter
  • 用Yolov2模型训练VOC数据集的各文件理解
  • python 中easydict的简单使用
  • Numpy np.array 相关常用操作学习笔记
  • Matconvnet关于simplenn 转dagnn的一些小的总结
  • 海思AI芯片(Hi3519A/3559A)方案学习(一)资料以及术语介绍
  • 海思AI芯片(Hi3519A/3559A)方案学习(二)RuyiStudio安装
  • JavaScript-如何实现克隆(clone)函数
  • ➹使用webpack配置多页面应用(MPA)
  • Android Studio:GIT提交项目到远程仓库
  • Angularjs之国际化
  • JavaScript 奇技淫巧
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Node 版本管理
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • PHP变量
  • SQLServer之创建显式事务
  • 初探 Vue 生命周期和钩子函数
  • 从setTimeout-setInterval看JS线程
  • 番外篇1:在Windows环境下安装JDK
  • 工程优化暨babel升级小记
  • 构建二叉树进行数值数组的去重及优化
  • 学习JavaScript数据结构与算法 — 树
  • gunicorn工作原理
  • ​ArcGIS Pro 如何批量删除字段
  • ​低代码平台的核心价值与优势
  • #传输# #传输数据判断#
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (a /b)*c的值
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • .NET 的程序集加载上下文
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .net 流——流的类型体系简单介绍
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET分布式缓存Memcached从入门到实战
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [100天算法】-x 的平方根(day 61)
  • [Angularjs]asp.net mvc+angularjs+web api单页应用