batch_batchnorm

2025-09-20猫先森10

  导语

  我常常被问到诸如怎样从深度学习模子中得到更好的结果的题目,雷同的题目尚有:

  我怎样提拔正确度

  假如我的神经网络模子性能不佳,我可以或许做什么?

  对于这些题目,我常常如许答复,“我并不知道确切的答案,但是我有很多思绪”,接着我会列出了我所能想到的全部大概可以或许给性能带来提拔的思绪。

  为克制一次次摆列出如许一个简单的列表,我决定把全部想法具体写在这篇博客里。

  这些思绪应该是通用的,不但能在深度学习范畴资助你,还能实用于任何呆板学习算法。

  这篇博文略长,你可以将其参加书签(之后再看)。

  

  怎样提拔深度学习性能

  照片泉源:PedroRibeiroSimões

  提拔算法性能思绪

  这个列表里提到的思绪并完全,但是一个好的开始。

  我的目标是给出很多可以实行的思绪,盼望此中的一或两个你之前没有想到。你常常只必要一个好的想法就能得到性能提拔。

  假如你能从此中一个思绪中得到结果,请在批评区告诉我。我很高兴能得知这些好消息。

  假如你有更多的想法,大概是所列思绪的拓展,也请告诉我,我和其他读者都将受益!偶然间仅仅是一个想法大概就能使他人得到突破。

  我将此博文分为四个部分:

  1.通过数据提拔性能

  2.通过算法提拔性能

  3.通过算法调参提拔性能

  4.通过嵌套模子提拔性能

  通常来讲,随着列表自上而下,性能的提拔也将变小。比方,对题目举行新的架构大概获取更多的数据,通常比调解最优算法的参数能带来更好的结果。固然并不总是如许,但是通常来讲是的。

  我已经把相应的链接参加了博客的教程中,相应网站的题目中,以及经典的NeuralNetFAQ中。

  部分思绪只实用于人工神经网络,但是大部分是通用的。通用到充足你用来共同其他技能来碰撞出提拔模子性能的方法。

  OK,如今让我们开始吧。

  1.通过数据提拔性能

  对你的练习数据和题目界说举行得当改变,你能得到很大的性能提拔。大概是最大的性能提拔。

  以下是我将要提到的思绪:

  获取更多数据

  创造更多数据

  重放缩你的数据

  转换你的数据

  特性选取

  重架构你的题目

  1)获取更多数据

  你能获取更多练习数据吗?

  你的模子的质量通常受到你的练习数据质量的限定。为了得到最好的模子,你起首应该想办法得到最好的数据。你也想尽大概多的得到那些最好的数据。

  有更多的数据,深度学习和其他当代的非线性呆板学习技能有更全的学习源,能学得更好,深度学习尤为云云。这也是呆板学习对各人布满吸引力的很大一个缘故起因(天下到处都是数据)。如下图所示:

  

  为什么选择深度学习?

  图片由AndrewNg提供,版权全部

  更多的数据并不是总是有效,但是确实有资助。于我而言,假如可以,我会选择获取更多的数据。

  可以拜见以下相干阅读:

  DatasetsOverAlgorithms(www.edge.org/response-detail/26587)

  2)创造更多数据

  上一末节说到了有了更多数据,深度学习算法通常会变的更好。有些时间你大概无法公道地获取更多数据,那你可以试试创造更多数据。

  假如你的数据是数值型向量,可以随机构造已有向量的修改版本。

  假如你的数据是图片,可以随机构造已有图片的修改版本(平移、截取、旋转等)。

  假如你的数据是文本,雷同的操纵……

  这通常被称作数据扩增(dataaugmentation)大概数据天生(datageneration)。

  你可以利用一个天生模子。你也可以用一些简单的本领。比方,针对图片数据,你可以通过随机地平移或旋转已有图片获取性能的提拔。假如新数据中包罗了这种转换,则提拔了模子的泛化本领。

  这也与增长噪声是相干的,我们风俗称之为增长扰动。它起到了与正则化方法雷同的作用,即克制练习数据的过拟合。

  以下是相干阅读:

  ImageAugmentationforDeepLearningWithKeras(https://machinelearningmastery.com/image-augmentation-deep-learning-keras/)

  Whatisjitter?(Trainingwithnoise)(ftp://ftp.sas.com/pub/neural/FAQ3.html#A_jitter)

  3)重缩放(rescale)你的数据

  这是一个快速得到性能提拔的方法。

  当应用神经网络时,一个传统的履历法则是:重缩放(rescale)你的数据至激活函数的边界。

  假如你在利用sigmoid激活函数,重缩放你的数据到0和1的区间里。假如你在利用双曲正切(tanh)激活函数,重缩放数据到-1和1的区间里。

batch_batchnorm batch_batchnorm 优化资讯

  这种方法可以被应用到输入数据(x)和输出数据(y)。比方,假如你在输出层利用sigmoid函数去猜测二元分类的结果,应当标准化y值,使之成为二元的。假如你在利用softmax函数,你仍旧可以通过标准化y值来获益。

  这仍旧是一个好的履历法则,但是我想更深入一点。我发起你可以参考下述方法来创造一些练习数据的差别的版本:

  归一化到0和1的区间。

  重放缩到-1和1的区间

  标准化(译者注:标准化数据使之成为零均值,单位标准差)

  然后对每一种方法,评估你的模子的性能,选取最好的举行利用。假如你改变了你的激活函数,重复这一过程。

  在神经网络中,大的数值累积效应(叠加叠乘)并不是功德,除上述方法之外,尚有其他的方法来控制你的神经网络中数据的数值巨细,譬如归一化激活函数和权重,我们会在以后讨论这些技能。

  以下为相干阅读:

  ShouldIstandardizetheinputvariables(columnvectors)?(ftp://ftp.sas.com/pub/neural/FAQ2.html#A_std)

  HowToPrepareYourDataForMachineLearninginPythonwithScikit-Learn(https://machinelearningmastery.com/prepare-data-machine-learning-python-scikit-learn/)

  4)数据变更

  这里的数据变更与上述的重缩放方法雷同,但必要更多工作。

  你必须非常认识你的数据。通过可视化来观察离群点。

  推测每一列数据的单变量分布。

  列数据看起来像偏斜的高斯分布吗?思量用Box-Cox变更调解偏态。

  列数据看起来像指数分布吗?思量用对数变更。

  列数据看起来有一些特性,但是它们被一些显着的东西掩蔽了,实行取平方大概开平方根来转换数据

  你能离散化一个特性大概以某种方式组合特性,来更好地突出一些特性吗?

  依靠你的直觉,实行以下方法。

  你能利用雷同PCA的投影方法来预处理惩罚数据吗?

  你能综合多维特性至一个单一数值(特性)吗?

  你能用一个新的布尔标签去发现题目中存在一些风趣的方面吗?

  你能用其他方法探索出如今场景下的其他特别布局吗?

  神经网层善于特性学习(featureengineering)。它(本身)可以做到这件事。但是假如你能更好的发现题目到网络中的布局,神经网层会学习地更快。你可以对你的数据就差别的转换方式举行抽样观察,大概实行特定的性子,来看哪些有效,哪些没用。

  以下是相干阅读:

  HowtoDefineYourMachineLearningProblem(https://machinelearningmastery.com/how-to-define-your-machine-learning-problem/)

  DiscoverFeatureEngineering,HowtoEngineerFeaturesandHowtoGetGoodatIt(https://machinelearningmastery.com/discover-feature-engineering-how-to-engineer-features-and-how-to-get-good-at-it/)

  HowToPrepareYourDataForMachineLearninginPythonwithScikit-Learn(https://machinelearningmastery.com/prepare-data-machine-learning-python-scikit-learn/)

  5)特性选择

  一样平常说来,神经网络对不相干的特性是具有鲁棒的(校对注:即不相干的特性不会很大影响神经网络的练习和结果)。它们会用近似于0的权重来弱化那些没有猜测本领的特性的贡献。

  只管云云,这些无关的数据特性,在练习周期仍旧要淹灭大量的资源。以是你能去除数据里的一些特性吗?

  有很多特性选择的方法和特性紧张性的方法,这些方法可以或许给你提供思绪,哪些特性该保存,哪些特性该剔除。最简单的方式就是对比全部特性和部分特性的结果。

  同样的,假如你偶然间,我发起在同一个网络中实行选择差别的视角来对待你的题目,评估它们,来看看分别有怎样的性能。

  大概你利用更少的特性就能到达划一乃至更好的性能。而且,这将使模子变得更快!

  大概全部的特性选择方法都剔除了同样的特性子集。很好,这些方法在没用的特性上告竣了同等。

  大概筛选过后的特性子集,能带给特性工程的新思绪。

  以下是相干阅读:

  AnIntroductiontoFeatureSelection(https://machinelearningmastery.com/an-introduction-to-feature-selection/)

  FeatureSelectionForMachineLearninginPython(https://machinelearningmastery.com/feature-selection-machine-learning-python/)

  6)重新架构你的题目

  偶然间要试试从你当前界说的题目中跳出来,想想你所网络到的观察值是界说你题目的唯一方式吗?大概存在其他方法。大概其他构建题目的方式可以或许更好地显现待学习题目的布局。

  我真的很喜好这个实行,由于它迫使你打开本身的思绪。这确实很难,尤其是当你已经对当前的方法投入了大量的时间和款子时。

  但是咱们这么想想,纵然你列出了3-5个可供更换的建构方案,而且终极还是放弃了它们,但这至少阐明你对当前的方案更加自大了。

  看看可以或许在一个时间窗(时间周期)内对已有的特性/数据做一个归并。

  大概你的分类题目可以成为一个回归题目(偶然间是回归到分类)。

  大概你的二元输出可以变成softmax输出?

  大概你可以转而对子题目举行建模。

  细致思考你的题目,最幸亏你选定工具之前就思量用差别方法构建你的题目,由于此时你对办理方案并没有耗费太多的投入。除此之外,假如你在某个题目上卡住了,如许一个简单的实行能开释更多新的想法。

  而且,这并不代表你之前的工作白干了,关于这点你可以看看后续的模子嵌套部分。

  以下为相干阅读:

  HowtoDefineYourMachineLearningProblem(https://machinelearningmastery.com/how-to-define-your-machine-learning-problem/)

  2.通过算法提拔性能

  呆板学习固然是用算法办理题目。

  全部的理论和数学都是刻画了应用差别的方法从数据中学习一个决定过程(假如我们这里只讨论猜测模子)。

  你已经选择了深度学习来表明你的题目。但是这真的是最好的选择吗?在这一节中,我们会在深入到怎样最大地发掘你所选择的深度学习方法之前,打仗一些算法选择上的思绪。

  下面是一个扼要列表:

  对算法举行抽样观察

  鉴戒已有文献

  重采样方法

  下面我表明下上面提到的几个方法。

  1)对算法举行抽样观察

  着实你事先无法知道,针对你的题目哪个算法是最优的。假如你知道,你大概就不必要呆板学习了。那有没有什么数据(办法)可以证明你选择的方法是精确的?

  让我们来办理这个困难。当从全部大概的题目中均匀来看各算法的性能时,没有哪个算法可以或许永久赛过其他算法。全部的算法都是划一的,下面是在nofreelunchtheorem中的一个总结。

  大概你选择的算法不是针对你的题目最优的谁人

  我们不是在实行办理全部题目,算法天下中有很多新热的方法,但是它们大概并不是针对你数据集的最优算法。

  我的发起是网络(证据)数据指标。担当更好的算法大概存在这一观点,而且给予其他算法在办理你的题目上“公平竞争”的机遇。

  抽样观察一系列可行的方法,来看看哪些还不错,哪些不抱负。

  起首实行评估一些线性方法,比方逻辑回归(logisticregression)和线性鉴别分析(lineardiscriminateanalysis)。

  评估一些树类模子,比方CART,随机丛林(RandomForest)和GradientBoosting。

  评估一些实例方法,比方支持向量机(SVM)和K-近邻(kNN)。

batch_batchnorm batch_batchnorm 优化资讯

  评估一些其他的神经网络方法,比方LVQ,MLP,CNN,LSTM,hybrids等

  选取性能最好的算法,然后通过进一步的调参和数据预备来提拔。尤其留意对比一下深度学习和其他通例呆板学习方法,对上述结果举行排名,比力他们的优劣。

  很多时间你会发如今你的题目上可以不消深度学习,而是利用一些更简单,练习速率更快,乃至是更轻易明白的算法。

  以下为相干阅读:

  AData-DrivenApproachtoMachineLearning(https://machinelearningmastery.com/a-data-driven-approach-to-machine-learning/)

  WhyyoushouldbeSpot-CheckingAlgorithmsonyourMachineLearningProblems(https://machinelearningmastery.com/why-you-should-be-spot-checking-algorithms-on-your-machine-learning-problems/)

  Spot-CheckClassificationMachineLearningAlgorithmsinPythonwithscikit-learn(https://machinelearningmastery.com/spot-check-classification-machine-learning-algorithms-python-scikit-learn/)

  2)鉴戒已有文献

  方法选择的一个捷径是鉴戒已有的文献资料。大概有人已经研究过与你的题目相干的题目,你可以看看他们用的什么方法。

  你可以阅读论文,册本,博客,问答网站,教程,以及任何能在谷歌搜刮到的东西。

  写下全部的想法,然后用你的方式把他们研究一遍。

  这不是复制别人的研究,而是开导你想出新的想法,一些你从没想到但是却有大概带来性能提拔的想法。

  发表的研究通常都黑白常赞的。天下上有非常多聪明的人,写了很多风趣的东西。你应当好好发掘这个“图书馆”,找到你想要的东西。

  以下为相干阅读:

  HowtoResearchaMachineLearningAlgorithm(https://machinelearningmastery.com/how-to-research-a-machine-learning-algorithm/)

  GoogleScholar(https://scholar.google.com/)

  3)重采样方法

  你必须知道你的模子结果怎样。你对模子性能的估计可靠吗?

  深度学习模子在练习阶段非常迟钝。这通常意味着,我们无法用一些常用的方法,比方k层交错验证,去估计模子的性能。

  大概你在利用一个简单的练习集/测试集分割,这是通例套路。假如是如许,你必要确保这种分割针对你的题目具有代表性。单变量统计和可视化是一个好的开始。

  大概你能利用硬件来加快估计的过程。比方,假如你有集群大概AWS云端服务(AmazonWebServices)账号,你可以并行地练习n个模子,然后获取结果的均值和标准差来得到更鲁棒的估计。

  大概你可以利用hold-out验证方法来相识模子在练习后的性能(这在早停法(earlystopping)中很有效,背面会讲到)。

  大概你可以先隐蔽一个完全没用过的验证集,比及你已经完成模子选择之后再利用它。

  而偶然间别的的方式,大概你可以或许让数据集变得更小,以及利用更强的重采样方法。

  有些环境下你会发如今练习集的一部分样本上练习得到的模子的性能,和在整个数据集上练习得到的模子的性能有很强的相干性。大概你可以先在小数据集上完成模子选择和参数调优,然后再将终极的方法扩展到全部数据集上。

  大概你可以用某些方式限定数据集,只取一部分样本,然后用它举行全部的建模过程。

  以下为相干阅读:

  EvaluatethePerformanceOfDeepLearningModelsinKeras(https://machinelearningmastery.com/evaluate-performance-deep-learning-models-keras/)

  EvaluatethePerformanceofMachineLearningAlgorithmsinPythonusingResampling(https://machinelearningmastery.com/evaluate-performance-machine-learning-algorithms-python-using-resampling/)

  3.通过算法调参提拔性能

  这通常是工作的关键地点。你常常可以通过抽样观察快速地发现一个或两个性能良好的算法。但是假如想得到最优的算法大概必要几天,几周,乃至几个月。

  为了得到更优的模子,以下是对神经网络算法举行参数调优的几点思绪:

  诊断(Diagnostics)

  权重初始化(WeightInitialization)

  学习速率(LearningRate)

  激活函数

  网络拓扑(NetworkTopology)

  批次和周期(BatchesandEpochs)

  正则化

  优化和丧失

  早停法

  你大概必要练习一个给定“参数设置”的神经网络模子很多次(3-10次乃至更多),才华得到一个估计性能不错的参数设置。这一点险些实用于这一节中你可以或许调参的全部方面。

  关于超参数优化请参阅博文:

  HowtoGridSearchHyperparametersforDeepLearningModelsinPythonWithKeras(https://machinelearningmastery.com/grid-search-hyperparameters-deep-learning-models-python-keras/)

  1)诊断

  假如你能知道为什么你的模子性能不再进步了,你就能得到拥有更好性能的模子。

  你的模子是过拟合还是欠拟合?永久牢记这个题目。永久。

  模子总是会碰到过拟合大概欠拟合,只是程度差别罢了。一个快速相识模子学习举动的方法是,在每个周期,评估模子在练习集和验证集上的表现,并作出图表。

[!360!]  

  假如练习集上的模子总是优于验证集上的模子,你大概碰到了过拟合,你可以利用诸如正则化的方法。

  假如练习集和验证集上的模子都很差,你大概碰到了欠拟合,你可以提拔网络的容量,以及练习更多大概更久。

  假如有一个拐点存在,在那之后练习集上的模子开始优于验证集上的模子,你大概必要利用早停法。

  常常画一画这些图表,学习它们来相识差别的方法,你可以或许提拔模子的性能。这些图表大概是你能创造的最有代价的(模子状态)诊断信息。

  另一个有效的诊断是网络模子判定对和判定错的观察值。

  对于难以练习的样本,大概你必要更多的数据。

  大概你应该剔除练习会合易于建模的多余的样本。

  也答应以实行对练习集分别差别的地区,在特定地区中用更专长的模子。

  以下为相干阅读:

  DisplayDeepLearningModelTrainingHistoryinKeras(https://machinelearningmastery.com/display-deep-learning-model-training-history-in-keras/)

  OverfittingandUnderfittingWithMachineLearningAlgorithms(https://machinelearningmastery.com/overfitting-and-underfitting-with-machine-learning-algorithms/)

  2)权重初始化

  履历法则通常是:用小的随机数举行初始化。

  在实践中,这大概仍旧结果不错,但是对于你的网络来说是最佳的吗?对于差别的激活函数也有一些开导式的初始化方法,但是在实践应用中并没有太多差别。

  固定你的网络,然后实行多种初始化方式。

  记取,权重是你的模子真正的参数,你必要找到他们。有很多组权重都能有不错的性能表现,但我们要只管找到最好的。

  实行全部差别的初始化方法,观察是否有一种方法在其他环境稳固的环境下(结果)更优。

  实行用无监督的方法,比方主动编码(autoencoder),来举行预先学习。

  实行利用一个已经存在的模子,只是针对你的题目重新练习输入层和输出层(迁徙学习(transferlearning))

  必要提示的一点是,改变权重初始化方法和激活函数,乃至优化函数/丧失函数精密相干。

  以下为相干阅读:

  Initializationofdeepnetworks(https://deepdish.io/2015/02/24/network-initialization/)

  3)学习率

  调解学习率很多时间也是行之有效的时段。

  以下是可供探索的一些想法:

  实行很大和很小的学习率

  格点搜刮文献里常见的学习速率值,观察你能学习多深的网络。

  实行随周期递减的学习率

  实行颠末固定周期数后按比例减小的学习率。

  实行增长一个动量项(momentumterm),然后对学习速率和动量同时举行格点搜刮。

  越大的网络必要越多的练习,反之亦然。假如你添加了太多的神经元和层数,得当提拔你的学习速率。同时学习率必要和练习周期,batchsize巨细以及优化方法接洽在一起思量。

  以下为相干阅读:

  UsingLearningRateSchedulesforDeepLearningModelsinPythonwithKeras(https://machinelearningmastery.com/using-learning-rate-schedules-deep-learning-models-python-keras/)

  Whatlearningrateshouldbeusedforbackprop?(ftp://ftp.sas.com/pub/neural/FAQ2.html#A_learn_rate)

  4)激活函数

  你大概应该利用修正激活函数(rectifieractivationfunctions)。他们大概能提供更好的性能。

  在这之前,最早的激活函数是sigmoid和tanh,之后是softmax,线性激活函数,大概输出层上的sigmoid函数。我不发起实行更多的激活函数,除非你知道你本身在干什么。

  实行全部三种激活函数,而且重缩放你的数据以满意激活函数的边界。

  显然,你想要为输出的情势选择精确的转达函数,但是可以思量一下探索差别表现。比方,把在二元分类题目上利用的sigmoid函数切换到回归题目上利用的线性函数,然后后置处理惩罚你的输出。这大概必要改变丧失函数使之更符合。详情参阅数据转换那一节。

  以下为相干阅读:

  Whyuseactivationfunctions?(ftp://ftp.sas.com/pub/neural/FAQ2.html#A_act)

  5)网络拓扑

  网络布局的改变能带来长处。

  你必要多少层以及多少个神经元?歉仄没有人知道。不要问这种题目...

  那怎么找到实用你的题目的设置呢?去实行吧。

  实行一个隐蔽层和很多神经元(广度模子)。

  实行一个深的网络,但是每层只有很少的神经元(深度模子)。

  实行上述两种方法的组合。

  鉴戒研究题目与你的雷同的论文内里的布局。

  实行拓扑模式(扇出(fanout)然后扇入(fanin))和册本论文里的履历法则(下有链接)

  选择总是很困难的。通常说来越大的网络有越强的代表本领,大概你必要它。越多的层数可以提供更强的从数据中学到的抽象特性的本领。大概必要它。

  深层的神经网络必要更多的练习,无论是练习周期还是学习率,都应该相应地举行调解。

  以下为相干阅读:

  这些链接会给你很多开导该实行哪些事变,至少对我来说是的。

  HowmanyhiddenlayersshouldIuse?(ftp://ftp.sas.com/pub/neural/FAQ3.html#A_hl)

  HowmanyhiddenunitsshouldIuse?(ftp://ftp.sas.com/pub/neural/FAQ3.html#A_hu)

  6)Batches和周期

  batchsize巨细会决定末了的梯度,以及更新权重的频度。一个周期(epoch)指的是神经网络看一遍全部练习数据的过程。

  你是否已经试验了差别的批次batchsize和周期数?

  之前,我们已经讨论了学习率,网络巨细和周期之间的关系。

  在很深的网络布局里你会常常看到:小的batchsize配以大的练习周期。

  下面这些大概能有助于你的题目,也大概不能。你要在本身的数据上实行和观察。

  实行选取与练习数据同巨细的batchsize,但留意一下内存(批次学习(batchlearning))

  实行选取1作为batchsize(在线学习(onlinelearning))

  实行用格点搜刮差别的小的batchsize(8,16,32,…)

  分别实行练习少量周期和大量周期。

  思量一个靠近无穷的周期值(连续练习),去记录到如今为止能得到的最佳的模子。

  一些网络布局对batchsize更敏感。我知道多层感知器(MultilayerPerceptrons)通常对batchsize是鲁棒的,而LSTM和CNNs比力敏感,但是这只是一个说法(仅供参考)。

  以下为相干阅读:

  Whatarebatch,incremental,on-line…learning?(ftp://ftp.sas.com/pub/neural/FAQ2.html#A_styles)

  Intuitively,howdoesmini-batchsizeaffecttheperformanceof(stochastic)gradientdescent?(https://www.quora.com/Intuitively-how-does-mini-batch-size-affect-the-performance-of-stochastic-gradient-descent)

  7)正则化

  正则化是一个克制模子在练习集上过拟合的好方法。

  神经网络里最新最热的正则化技能是dropout方法,你是否试过?dropout方法在练习阶段随机地跳过一些神经元,驱动这一层其他的神经元去捕获松弛。简单而有效。你可以从dropout方法开始。

  格点搜刮差别的丢失比例。

  分别在输入,隐蔽层和输出层中试验dropout方法

  dropout方法也有一些拓展,比如你也可以实行dropconnect方法。

  也可以实行其他更传统的神经网络正则化方法,比方:

  权重衰减(Weightdecay)行止罚大的权重

  激活束缚(Activationconstraint)行止罚大的激活值

  你也可以试验处罚差别的方面,大概利用差别种类的处罚/正则化(L1,L2,大概二者同时)

  以下是相干阅读:

  DropoutRegularizationinDeepLearningModelsWithKeras(https://machinelearningmastery.com/dropout-regularization-deep-learning-models-keras/)

  WhatisWeightDecay?(ftp://ftp.sas.com/pub/neural/FAQ3.html#A_decay)

  8)优化和丧失

  最常见是应用随机梯度降落法(stochasticgradientdescent),但是如今有非常多的优化器。你试验过差别的优化(方法)过程吗?

  随机梯度降落法是默认的选择。先好好利用它,配以差别的学习率和动量。

  很多更高级的优化方法有更多的参数,更复杂,也有更快的收敛速率。好与坏,是不是必要用,取决于你的题目。

  为了更好的利用好一个给定的(优化)方法,你真的必要弄明白每个参数的意义,然后针对你的题目通过格点搜刮差别的的取值。困难,斲丧时间,但是值得。

  我发现了一些更新更盛行的方法,它们可以收敛的更快,而且针对一个给定网络的容量提供了一个快速相识的方式,比方:

  ADAM

  RMSprop

  你还可以探索其他优化算法,比方,更传统的(Levenberg-Marquardt)和不那么传统的(geneticalgorithms)。其他方法可以或许为随机梯度降落法和其他雷同方法提供好的出发点去改进。

  要被优化的丧失函数与你要办理的题目高度相干。然而,你通常还是有一些余地(可以做一些微调,比方回归题目中的均方误(MSE)寂静均绝对偏差(MAE)等),偶然间变更丧失函数尚有大概得到小的性能提拔,这取决于你输出数据的规模和利用的激活函数。

  以下是相干阅读:

  Anoverviewofgradientdescentoptimizationalgorithms(https://sebastianruder.com/optimizing-gradient-descent/)

  Whatareconjugategradients,Levenberg-Marquardt,etc.?(ftp://ftp.sas.com/pub/neural/FAQ2.html#A_numanal)

  OnOptimizationMethodsforDeepLearning,2011PDF(https://ai.stanford.edu/~ang/papers/icml11-OptimizationForDeepLearning.pdf)

  9)EarlyStopping/早停法

  一旦练习过程中出现(验证集)性能开始降落,你可以克制练习与学习。这可以节流很多时间,而且乃至可以让你利用更细致的重采样方法来评估你的模子的性能。

  早停法是一种用来克制模子在练习数据上的过拟合的正则化方式,它必要你监测模子在练习集以及验证集上每一轮的结果。一旦验证集上的模子性能开始降落,练习就可以克制。

  假如某个条件满意(衡量正确率的丧失),你还可以设置查抄点(Checkpointing)来储存模子,使得模子可以或许继承学习。查抄点使你可以或许早停而非真正的克制练习,因此在末了,你将有一些模子可供选择。

  以下是相干阅读:

  HowtoCheck-PointDeepLearningModelsinKeras(https://machinelearningmastery.com/check-point-deep-learning-models-keras/)

  Whatisearlystopping?(ftp://ftp.sas.com/pub/neural/FAQ3.html#A_stop)

  4.通过嵌套模子提拔性能

  你可以组合多个模子的猜测本领。刚才提到了算法调参可以进步末了的性能,调参之后这是下一个可以提拔的大范畴。

  究竟上,你可以常常通过组合多个“充足好的”模子来得到良好的猜测本领,而不是通过组合多个高度调参的(脆弱的)模子。

  你可以思量以下三个方面的嵌套方式:

  组合模子

  组合视角

  堆叠(Stacking)

  1)组合模子

  偶然间我们干脆不做模子选择,而是直接组合它们。

  假如你有多个差别的深度学习模子,在你的研究题目上每一个都表现的还不错,你可以通过取它们猜测的均匀值来举行组合。

  模子差别越大,最闭幕果越好。比方,你可以应用非常差别的网络拓扑大概差别的技能。

  假如每个模子都结果不错但是差别的方法/方式,嵌套后的猜测本领将更加鲁棒。

  每一次你练习网络,你初始化差别的权重,然后它会收敛到差别的终极权重。你可以多次重复这一过程去得到很多网络,然后把这些网络的猜测值组合在一起。

  它们的猜测将会高度相干,但是在那些难以猜测的特性上,它会给你一个不测的小提拔。

  以下是相干阅读:

  EnsembleMachineLearningAlgorithmsinPythonwithscikit-learn(https://machinelearningmastery.com/ensemble-machine-learning-algorithms-python-scikit-learn/)

  HowtoImproveMachineLearningResults(https://machinelearningmastery.com/how-to-improve-machine-learning-results/)

  2)组合视角

  同上述雷同,但是从差别视角重构你的题目,练习你的模子。

  同样,目标得到的是结果不错但是差别的模子(比方,不相干的猜测)。得到差别的模子的方法,你可以依靠我们在数据那一末节中摆列的那些非常差别的放缩和转换方法。

  你用来练习模子的转换方法越差别,你构建题目的方式越差别,你的结果被提拔的程度就越高。

  简单利用猜测的均值将会是一个好的开始。

  3)stacking/堆叠

  你还可以学习怎样最佳地组合多个模子的猜测。这称作堆叠泛化(stackedgeneralization),大概简短来说就叫堆叠。

  通常上,你利用简单线性回归方法就可以得到比取猜测均匀更好的结果,像正则化的回归(regularizedregression),就会学习怎样给差别的猜测模子赋权重。基线模子是通过取子模子的猜测均值得到的,但是应用学习了权重的模子会提拔性能。

  StackedGeneralization(Stacking)(https://machine-learning.martinsewell.com/ensembles/stacking/)

  别的的可参考资源

  别的地方有很多很好的资源,但是险些没有能将全部想法串联在一起的。假如你想深入研究,我列出了如下资源和相应的博客,你能发现很多风趣的东西。

  NeuralNetworkFAQ(ftp://ftp.sas.com/pub/neural/FAQ.html)

  HowtoGridSearchHyperparametersforDeepLearningModelsinPythonWithKeras(https://machinelearningmastery.com/grid-search-hyperparameters-deep-learning-models-python-keras/)

  MustKnowTips/TricksinDeepNeuralNetworks(https://lamda.nju.edu.cn/weixs/project/CNNTricks/CNNTricks.html)

  Howtoincreasevalidationaccuracywithdeepneuralnet?(https://stackoverflow.com/questions/37020754/how-to-increase-validation-accuracy-with-deep-neural-net)

  后记

  这是一篇很长的博客,我们报告了很多内容。你并不必要去做全部事,大概这内里的某一点就足以给你好的想法去提拔性能。简单说来大概包罗下面这些:

  选取一个方向

  数据

  算法

  调参

  嵌套模子

  在某一方向里选取一种方法

  在选取的方法中选取一件事变去实行

  比力结果,假如性能有提拔,则保存

  不绝重复

  文章泉源:大数据文摘

  《呆板读心术之神经网络与深度学习》用最普通的语言,从出发点开始,由浅入深讲授这些呆板范畴里最深奥的知识,使纵然底子不踏实,明白本领不超群的大众,也能通过课程把握这些前沿范畴的细节技能,而且应用在本身的场景里去完成某些事变。点击下方二维码查察课程详情


标签:  batch batchnorm

给我们留言

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。