著名: 本文是从 Michael Nielsen的电子书的那一嶂的卷积神经网络有哪些的参数优化方法的一些总结和摘录并不是我自己的结论和做实验所得到的结果。我想Michael的实验结果更有说服力一些本书在github上有的版本,
最近卷积神经网络有哪些(CNN)很火热它在图像分类领域的卓越表现引起了大家的广泛关注。本文总结和摘錄了Michael Nielsen的那本Neural Network and Deep
Learning一书中关于深度学习一章中关于提高泛化能力的一些概述和实验结果力争用数据给大家一个关于正则化,增加卷积层/全连接數弃权技术,拓展训练集等参数优化方法的效果
本文并不会介绍正则化,弃权(Dropout), 池化等方法的原理只会介绍它们在实验中的应用戓者起到的效果,更多的关于这些方法的解释请自行查询
本文的实验是基于mnist数据集合的,mnist是一个从0到9的手写数字集合共有60,000張训练图片,10000张测试图片。每张图片大小是28*28大小我们的实验就是构建一个神经网络有哪些来高精度的分类图片,也就是提高泛化能力
一般来说,提高泛化能力的方法主要有以下几个:
在深度学习中有许多不同的深度网络结构,包括卷积神经网络有哪些(CNN或convnet)、长短期记忆网络(LSTM)和生成对抗网络(GAN)等
在计算机视觉领域,对卷积神经网络有哪些(简称为CNN)的研究和应用都取得了显著的成果CNN网络最初的诞生收箌了动物视觉神经机制的启发,目前已成功用于机器视觉等领域中
技术博客Towards Data Science最近发布了一篇文章,作者Suki Lau文章讨论了在卷积神经网络有哪些中,该如何调整超参数以及可视化卷积层
首先我们想要计算机具有什么能力呢?
当我们看到一只貓跳上窗台或在沙发上睡觉时我们的潜意识会认出它是一只猫。
我们希望计算机也能完成这项任务即将图像输入后,找出其独有的特征最终输出该图像的类别信息。
卷积神经网络有哪些可以完成这项任务
先谈定义,卷积神经网络有哪些是一种特殊的神经网络有哪些其中至少包含一个卷积层。在典型的CNN网络结构中输入一张图像,经由一系列卷积层、非线性激活层、池化层和全连接层后可输出相應的类别标签。
卷积神经网络有哪些的特别之处在于加入了卷积层
在经典的神经网络有哪些中,整张图片会被传入网络中来训练各网络層权值当输入为简单居中的图像时,如Mnist手写数字图网络识别效果较优,但是当输入变为更为复杂多变的图像时如跳上窗户的小猫,此时网络识别效果不佳甚至无法辨识
加入更多隐含层学习输入图像的抽象特征,可能会有所帮助但是这样会增加神经元的数目,大大增加训练所需的计算资源和占用过多的内存这是不切实际的。
而CNN识别目标的过程是先寻找诸如边缘、线段和曲线等相关低级特征,然後使用多个卷积层来构建更多抽象的高级特征
在卷积层的学习过程中,CNN网络通过共享多个卷积核(或特征检测器)的权值来学习每张图片嘚局部信息,并用于构建抽象特征图谱卷积核共享特性大大降低了训练网络所需的参数量。
由于经过训练的检测器可以通过卷积层重复鼡来组合地检测图片中的抽象特征因此卷积神经网络有哪些更适用于复杂的图像识别任务。
在深度神经网络有哪些中调整超参数组合並非易事,因为训练深层神经网络有哪些十分耗时且需要配置多个参数。
接下来我们简单列举几个影响CNN网络的关键超参数。
学习率是指在优化算法中更新网络权重的幅度大小
学习率可以是恒定的、逐渐降低的、基于动量的或者是自适应的,采用哪种学习率取决于所选擇优化算法的类型如SGD、Adam、Adagrad、AdaDelta或RMSProp等算法。
优化策略这方面的内容可参阅量子位之前编译过的“一文看懂各种神经网络有哪些优化算法:从梯度下降到Adam方法”
迭代次数是指整个训练集输入到神经网络有哪些进行训练的次数。当测试错误率和训练错误率相差较小时可认为当湔的迭代次数是合适的,否则需继续增大迭代次数或调整网络结构。
在卷积神经网络有哪些的学习过程中小批次会表现得更好,选取范围一般位于区间[16,128]内
还需要注意的是,CNN网络对批次大小的调整十分敏感
激活函数具有非线性,理论上可以使模型拟合出任何函数通瑺情况下,rectifier函数在CNN网络中的效果较好当然,可以根据实际任务选择其他类型的激活函数,如Sigmoid和Tanh等等
增加隐含层数目以加深网络深度,会在一定程度上改善网络性能但是当测试错误率不再下降时,就需要寻求其他的改良方法增加隐含层数目也带来一个问题,即提高叻训练该网络的计算成本
当网络的单元数设置过少时,可能会导致欠拟合而单元数设置过多时,只要采取合适的正则化方式就不会產生不良影响。
在网络中通常会使用小随机数来初始化各网络层的权重,以防止产生不活跃的神经元但是设置过小的随机数可能生成零梯度网络。一般来说均匀分布方法效果较好。
作为一种常用的正则化方式加入Dropout层可以减弱深层神经网络有哪些的过拟合效应。该方法会按照所设定的概率参数在每次训练中随机地不激活一定比例的神经单元。该参数的默认值为/question/
训练技巧对深度学习来说是非常重要的作为一门实验性质很强的科学,同样的网络结构使用不同的训练方法训练结果可能会有很大的差异。这里我总结了近一年来的炼丹心嘚分享给大家,也欢迎大家补充指正
下面几种方式,随便选一个,结果基本都差不多。但是一定要做否则可能会减慢收敛速度,影响收斂结果甚至造成Nan等一系列问题。
Ensemble是论攵刷结果的终极核武器,深度学习中一般有以下几种方式
其实我发现现在深度学习越来越成熟,调参工作比以前少了很多绝大多数情况自己设计嘚参数都不如教程和框架的默认参数好,不过有一些技巧我一直都在用的
(1)relu+bn这套好基友组合是万精油,可以满足95%的情况除非有些特殊情况会用identity,比如回归问题比如resnet的shortcut支路,sigmoid什么的都快从我世界里消失了
(2)dropout 分类问题用dropout ,只需要最后一层softmax 前用基本就可以了能够防圵过拟合,可能对accuracy提高不大但是dropout 前面的那层如果是之后要使用的feature的话,性能会大大提升(例如max pool进入fc实测发现加BN效果非常明显)
(3)数據的shuffle 和augmentation 。这个没啥好说的aug也不是瞎加,比如行人识别一般就不会加上下翻转的因为不会碰到头朝下的异型种
(4)降学习率。随着网络訓练的进行学习率要逐渐降下来,如果你有tensorboard你有可能发现,在学习率下降的一瞬间网络会有个巨大的性能提升,同样的fine-tuning也要根据模型的性能设置合适的学习率比如一个训练的已经非常好的模型你上来就1e-3的学习率,那之前就白训练了就是说网络性能越好,学习率要樾小
(5)tensorboard以前不怎么用,用了之后发现太有帮助帮助你监视网络的状态,来调整网络参数
(6)随时存档模型要有validation 。这就跟打游戏一樣存档把每个epoch和其对应的validation 结果存下来,可以分析出开始overfitting的时间点方便下次加载fine-tuning
(7)网络层数,参数量什么的都不是大问题在性能不丟的情况下,减到最小
(8)batchsize通常影响没那么大塞满卡就行,除了特殊的算法需要batch大一点
(9)输入减不减mean归一化在有了bn之后已经不那么重偠了
上面那些都是大家所知道的常识也是外行人觉得深度学习一直在做的就是这些很low的东西,其实网络设计(关键!!!实测发现对于acc影响极大!)上博大精深这也远超过我的水平范畴,只说一些很简单的
(1)卷积核的分解从最初的5×5分解为两个3×3,到后来的3×3分解為1×3和3×1再到resnet的1×1,3×31×1,再xception的3×3 channel-wise conv+1×1网络的计算量越来越小,层数越来越多性能越来越好,这些都是设计网络时可以借鉴的
补充┅点adam收敛虽快但是得到的解往往没有sgd+momentum得到的解更好,如果不考虑时间成本的话还是用sgd吧
再补充一个rnn trick,仍然是不考虑时间成本的情况下batch size=1是一个很不错的regularizer, 起码在某些task上,这也有可能是很多人无法复现alex graves实验结果的原因之一,因为他总是把batch size设成1。
2.样本要做归一化3.激活函数要视样本输入选择
最近在看 Karpathy 的 cs231n, 还没看完, 不过过程中总结了一下他提到的一些技巧:
cnn的调参主要是在优化函数、embedding的维度还要残差网络的层数几个方面。
另外还有激活函数dropout层和batchnormalize层的使用。激活函数推荐使用reludropout层数不易设置过大,过大会导致不收敛调节步长可以昰0.05,一般调整到0.4或者0.5就可找到最佳值
以上是个人调参的一些经验,可供参考
导语:印度深度学习专家 Rishabh Shukla 对开发深度神经网络有哪些的经驗总结。
本文为印度深度学习专家、创业者 Rishabh Shukla 在 GitHub 上发表的长博文总结了他过去的开发经验,旨在给新入门的开发者提供指导雷锋网做了鈈改变原意的编译。
在深度学习领域为了高效训练深度神经网络有哪些,有些实践方法被过来人强烈推荐
在这篇博文中,我会覆盖几種最常使用的实践方法从高品质训练数据的重要性、超参数(hyperparameters)到更快创建 DNN(深度神经网络有哪些) 原型模型的一般性建议。这些推荐方法中的大多数已被学术界的研究所证实,并在论文中展示了相关实验、数学证据比如 和 。
许多 ML 开发者习惯把原始训练数据直接扔给 DNN——为什么不这么做呢既然任何 DNN (大多数人的假设)仍然能够给出不错的结果,不是吗但是,有句老话叫“给定恰当的数据类型一個简单的模型能比复杂 DNN 提供更好、更快的结果”。虽然这有一些例外但在今天,这句话仍然没有过时因此,不管你是在计算机视觉( CV)自然语言处理(NLP)还是统计建模(Statistical Modelling)等领域,想要对原始数据预处理有几个方法可以得到更好的训练数据:
获取越大的数据库越好。DNN 对数据很饥渴越多越好。
去除所有包含损坏数据的训练样本比如短文字,高度扭曲的图像假输出标签,包含许多虚值(null values)的属性
Data Augmentation(数据扩张)——生成新样例。以图像为例重新调节,增加噪声等等
激励函数是所有神经网络有哪些的核心部分之一。
激励函数把渴望已久的非线性(non-linearity)加入了模型多年来,Sigmoid 函数 一直是多数人倾向的选择但是,Sigmoid 函数不可避免地存在两个缺陷:1. 尾部 sigmoids 的饱和进一步導致梯度消失。2. 不以 0 为中心(输出在 0 到 1 之间)
你还可以探索其他选择,比如 ReLU, SoftSign 等等对于一些特定任务, 它们能够改善上述问题
保留超絀最优数量的隐藏单元,一般是比较保险的做法这是因为任何正则化方法( regularization method)都会处理好超出的单元,至少在某种程度上是这样在另┅方面,保留比最优数量更少的隐藏单元会导致更高的模型欠拟合(underfitting)几率。
另外当采用无监督预训练的表示时(unsupervised pre-trained representations,下文会做进一步解释)隐藏单元的最优数目一般会变得更大。因此预训练的表示可能会包含许多不相关信息(对于特定任务)。通过增加隐藏单元的數目模型会得到所需的灵活性,以在预训练表示中过滤出最合适的信息
“你只需不停增加层,直到测试误差不再减少”
永远用小的隨机数字初始化权重,以打破不同单元间的对称性(symmetry)但权重应该是多小呢?推荐的上限是多少用什么概率分布产生随机数字?
当使鼡 Sigmoid 激励函数时如果权重初始化为很大的数字,那么 sigmoid 会饱和(尾部区域)导致死神经元(dead neurons)。如果权重特别小梯度也会很小。因此朂好是在中间区域选择权重,比如说那些围绕平均值均衡分布的数值
幸运的是,已经有许多关于初始权重合适取值的研究这对于高效嘚收敛非常重要。为初始化均衡分布的权重均匀分布(uniform distribution )或许是最好的选择之一。另外就像论文中所展示的(,有更多输入连接(fan_in)嘚单位应该有相对更小的权重。
多亏这些十分透彻的试验现在我们已经有了经过检验的公式,可以直接用来权重的初始化
这或许是朂重要的超参数之一,调节着学习过程如果学习率设置得太小,你的模型很可能需要 n 年来收敛设置得太大,再加上不多的初始训练样夲你的损失可能会极高。一般来说0.01 的学习率比较保险
相比固定学习率,在每个周期、或每几千个样例后逐渐降低学习率是另一个选择虽然这能更快地训练,但需要人工决定新的学习率一般来说,学习率可以在每个周期后减半几年前,这种策略十分普遍
幸运的是,我们现在有了更好的、基于动能(momentum based)的方法来调整学习率。这取决于误差函数的曲率另外,既然有些参数有更快、或更慢的学习速率;它或许能帮助我们针对模型中的单独参数设定不同的学习率。
的方法能替我们省去人工选择初始学习率的麻烦;给定合适的时间,模型会开始平滑地收敛当然,选择一个特别合适的初始学习率仍然能起到帮助作用
网格搜索(Grid Search )在经典机器学习中十分普遍但它在寻找 DNN 的最优超参数方面一点也不高效。这主要是由于 DNN 尝试不同超参数组合所耗费的时间随著超参数不断增长,网格搜索需要的计算性能会指数级增长
取决于你之前的经验,你可以人工对部分常见超参数调参比如学习率、隐層数目。
采用随机搜索(random search)或者随机采样代替网格搜索,来选择最优超参数
超参数组合通常在期望范围之内、从均匀分布中被选择出來。加入之前获得的知识来进一步缩小搜寻空间也是有可能的(比如,学习率不应该太大也不应该太小)大家发现,随机搜索比网格搜索高效地多
等等。在提供自适应学习率之外这些复杂的方法还对于模型的不同参数使用不同的学习率,通常能有更平滑的收敛把這些当做超参数是件好事,你应该每次都在训练数据的子集上试试它们
即便是运行最先进的深度学习模型,使用朂新、最强大的计算硬件内存管理仍然在字节(byte)级别上进行。所以把参数保持在 64, 128, 512, 1024 等 2 的次方永远是件好事。这也许能帮助分割矩阵和權重导致学习效率的提升。当用 GPU 运算这变得更明显。
不管你进行的是 NLP(自然语言处理)、计算机视觉还是语音识别等任务无监督预訓练永远能帮助你训练监督、或其他无监督模型:NLP 中词向量就(Word Vectors)无所不在;你可以用 ImageNet 的数据库,使用无监督方式对你的模型预训练或昰对于两个类别的监督分类;或是更大频域的音频样本,来在扬声器消崎模型(speaker disambiguation model)中使用该信息
训练一个模型的主要目的是学习合适的參数,即产生输入到输出的最优映射这些参数利用每个训练样本进行调参,不管你决定使用 batch, mini-batch 还是随机学习当采用随机学习方法时,学習每个训练样本后权重的梯度都会进行调参向梯度加入噪音(随机学习中“随机”的由来)。这样做的结果十分理想比如说,训练中加入的噪音使得模型更不容易过拟合
但是,随机学习方法也许效率不高如今的计算设备有非常可观的运算能力,随机学习很可能会浪費其中的一大部分如果我们能计算矩阵相乘,那么为什么要限制自己重复单个矢量组之间的乘法呢?因此为了更高的吞吐率和更快嘚学习,我推荐使用 mini-batch 而不是随机学习
但是,选择适当的 batch 规模同样重要所以我们能保留一些噪音(相比大规模 batch),与此同时更高效地利鼡计算性能一般来说,包含 16 个到 128 个样例的 batch(2 的幂)是不错的选择通常,一旦你发现了更重要的超参数(通过随机搜索或是人工搜索)batch 规模就会确性下来。但是有些场景中模型得到训练数据流(比如网络学习),那么采用随机学习就是不错的选择
这来自于信息理论(Information Theory)——“学习到一件不太可能发生的事却发生了,比学习一件很可能发生的事已经发生包含更多的信息。”同样的把训练样例的顺序随机化(在不同周期,或者 mini-batch)会导致更快的收敛。如果模型看到的很多样例不在同一种顺序下运算速度会有小幅提升。
如果有数百萬的参数需要学习正则化就是避免 DNN 过拟合的必须手段。你也可以继续使用 L1/L2 正则化但 Dropout 是检查 DNN 过拟合的更好方式(雷锋网按:Dropout 是指随机让網络某些隐层节点的权重不工作,不工作的那些节点可以暂时认为不是网络结构的一部分但是它的权重会保留下来)。执行 Dropout 很容易并苴通常能带来更快地学习。0.5 的默认值是一个不错的选择当然,这取决于具体任务如果模型不太复杂,0.2 的 Dropout 值或许就够了
在测试阶段,Dropout 應该被关闭权重要调整到相应大小。只要对一个模型进行 Dropout 正则化多一点训练时间,误差一定会降低
“对深度学习模型进行多个周期的训练,会得到更好的模型”——我们经常听到这句话但多少周期才是“多”呢?其实这里有一个简单的策略:继續按照一个固定的样例数或者周期训练模型,比如两万个样例或者一个周期在每批样例之后,比较测试误差(test error)和训练误差(train error)如果咜们的差距在缩小,那么继续训练另外,记得在每批训练之后保存模型的参数,所以训练好之后你可以从多个模型中做选择
训练深喥学习模型有上千种出差错的方式。我猜大家都遇到过这样的场景:模型已经训练了几个小时或者好几天然而在训练完成之后,才意识箌某个地方出问题了为了不让你自己神经错乱,一定要对训练过程作可视化处理比较显而易见的措施是保存或打印损失值、训练误差、测试误差等项目的日志。
在此之外一个很好的措施是采用可视化库(visualization library ),在几个训练样例之后、或者周期之间生成权重柱状图。这戓许能帮助我们追踪深度学习模型中的一些常见问题比如梯度消失与梯度爆发(Exploding Gradient)。
谢天谢地对于快速创建原型模型,我们已经有了楿当不错的库比如 Theano, Tensorflow, Keras 等等。几乎所有这些深度学习库支持 GPU 计算和自动微分法所以,你不需要深入研究核心 GPU 编程技术(除非你想——这绝對很有意思)你也不需要写自己的微分代码——在非常复杂的模型上这相当费劲(但若需要,你应该有能力去做) Tensorflow还提供了分布式计算的支持——如果你是土豪的话.