精华内容
下载资源
问答
  • 2022-02-14 15:06:53


    前言

    本深度学习系列是根据paddle飞浆所简单整理的,需要可自行跳转学习。本节是关于深度学习-模型调优的相关内容,包括学习率、注意力机制、正则化、batch size、参数初始化等。这是只简单记录部分知识,目的是方便以后复习。


    一、学习率

    1.什么是学习率

    超参数之一,学习率是训练神经网络的重要超参数之一,它代表在每一次迭代中梯度向损失函数最优解移动的步长,通常用 η 表示。

    2.学习率对网络的影响

    因此,只有找到合适的学习率,才能保证代价函数以较快的速度逼近全局最优解。学习率过小或过大所带来的影响

    3.学习率的设置

    通常的,在训练网络的前期过程中,会选取一个相对较大的学习率以加快网络的收敛速度。而随着迭代优化的次数增多,逐步减小学习率,以保证最终收敛至全局最优解,而不是在其附近震荡或爆炸。下面将介绍几种常用的学习率衰减方法,包括:分段常数衰减、指数衰减、自然指数衰减、多项式衰减、间隔衰减、多间隔衰减、逆时间衰减、Lambda衰减、余弦衰减、诺姆衰减、loss自适应衰减、线性学习率热身等。

    1. 分段常数衰减(Piecewise Decay):在不同的学习阶段指定不同的学习率,在每段内学习率相同。
    2. 指数衰减(Exponential Decay):学习率随训练轮数成指数衰减,每次将当前学习率乘以给定的衰减率得到下一个学习率。
    3. 自然指数衰减 (Natural Exponential Decay):每次将当前学习率乘以给定的衰减率的自然指数得到下一个学习率。
    4. 多项式衰减(Polynomial Decay):通过多项式衰减函数,学习率从初始值逐渐衰减至最低学习率。其中,参数 cycle 代表学习率下降后是否重新上升。若 cycle=True,则学习率衰减至最低后会重新上升到一定值,再降低至最低学习率并进行循环。若 cycle=False,则学习率从初始值单调递减至最低值。
    5. 间隔衰减 (Step Decay):学习率按照指定的轮数间隔进行衰减
    6. 多间隔衰减(Multi Step Decay:学习率按特定间隔进行衰减,与间隔衰减的区别在于:间隔衰减的epoch间隔是单一且固定的,而多间隔衰减中的epoch间隔是预先指定的多间隔。
    7. 逆时间衰减(Inverse Time Decay):学习率大小与当前衰减次数成反比。
    8. Lambda衰减(Lambda Decay):使用lambda函数来设置学习率,其中lambda函数通过epoch计算出一个因子,使用该因子乘以初始学习率。
    9. 余弦衰减(Cosine Annealing Decay):使用 cosine annealing 的策略来动态调整学习率,学习率随step数变化成余弦函数周期变化。该方法为论文 SGDR:Stochastic Gradient Descent with Warm Restarts 中cosine annealing动态学习率。
    10. 诺姆衰减(Noam Decay):更多细节请参考 attention is all you need。
    11. loss自适应衰减(Reduce On Plateau): 当loss停止下降时,降低学习率。其思想是:一旦模型表现不再提升,将学习率降低 2-10 倍对模型的训练往往有益。此外,每降低一次学习率后,将会进入一个冷静期。在冷静期内不会监控loss变化也不会进行衰减。当冷静期结束后,会继续监控loss的上升或下降。
    12. 线性学习率热身(Linear Warm Up):线性学习率热身是一种学习率优化策略,在正常调整学习率前,先逐步增大学习率。

    二、注意力机制

    1. 注意力机制是什么

    在机器翻译中首先使用,即你的精神是聚焦在你关心的那些事物上,这其实就是注意力的体现,这种有意识的聚焦被称为聚焦式注意力(Focus Attention)。这种无意识地,往往由外界刺激引发的注意力被称为显著性注意力(Saliency-Based Attention)。但不论哪一种注意力,其实都是让你在某一时刻将注意力放到某些事物上,而忽略另外的一些事物,这就是注意力机制(Attention Mechanism)。在深度学习领域,模型往往需要接收和处理大量的数据,然而在特定的某个时刻,往往只有少部分的某些数据是重要的,这种情况就非常适合Attention机制发光发热。

    2. 经典注意力机制

    1. 用机器翻译任务带你看Attention机制的计算
    2. 注意力机制的正式引入

    3. 注意力机制的一些变体

    1. 硬性注意力机制
    2. 键值对注意力机制
    3. 多头注意力机制

    4. 自注意力机制

    三、正则化

    1. 正则化介绍

    什么是正则化?
    正则化是一种对学习算法稍加修改以使模型具有更好的泛化能力的技术。这反过来也提高了模型在看不见的数据上的性能。
    在正则化方面,一般全连接层用dropout,卷积层用BN。

    正则化如何帮助减少过度拟合?
    正则化惩罚系数。在深度学习中,它实际上惩罚节点的权重矩阵。正则化可以避免算法过拟合,过拟合通常发生在算法学习的输入数据无法反应真实的分布且存在一些噪声的情况。过去数年,研究者提出和开发了多种适合机器学习算法的正则化方法,如数据增强、L2 正则化(权重衰减)、L1 正则化、Dropout、Drop Connect、随机池化和早停等。

    2. 数据增强

    数据增强是提升算法性能、满足深度学习模型对大量数据的需求的重要工具。数据增强通过向训练数据添加转换或扰动来人工增加训练数据集。数据增强技术如水平或垂直翻转图像、裁剪、色彩变换、扩展和旋转通常应用在视觉表象和图像分类中。
    关于视觉领域的数据增强的方法详细请参考: 数据增广????

    3. L1 L2正则化

    L1 和 L2 正则化是最常用的正则化方法。L1 正则化向目标函数添加正则化项,以减少参数的绝对值总和;而 L2 正则化中,添加正则化项的目的在于减少参数平方的总和。根据之前的研究,L1 正则化中的很多参数向量是稀疏向量,因为很多模型导致参数趋近于 0,因此它常用于特征选择设置中。机器学习中最常用的正则化方法是对权重施加 L2 范数约束。????

    4. Dropout

    基础概念:Dropout指在训练神经网络过程中随机丢掉一部分神经元来减少神经网络复杂度,从而防止过拟合。Dropout实现方法很简单:在每次迭代训练中,以一定概率随机屏蔽每一层中若干神经元,用余下神经元所构成网络来继续训练。比如:计算其L1范数会比不使用Dropout时变小,但是预测时却没有丢弃神经元,这将导致训练和预测时数据的分布不一样。为了解决这个问题?????

    5. DropConnect

    DropConnect也是在ICML2013上发表的另一种减少算法过拟合的正则化策略,是 Dropout 的一般化。在 Drop Connect 的过程中需要将网络架构权重的一个随机选择子集设置为零,取代了在 Dropout 中对每个层随机选择激活函数的子集设置为零的做法。由于每个单元接收来自过去层单元的随机子集的输入,Drop Connect 和 Dropout 都可以获得有限的泛化性能。Drop Connect 和 Dropout 相似的地方在于它涉及在模型中引入稀疏性,不同之处在于它引入的是权重的稀疏性而不是层的输出向量的稀疏性。

    Dropout是随机将隐含层节点的输出清0,针对的是输出。
    DropConnect是将节点中的每个与其相连的输入权值以1-p的概率清0;针对的是输入。DropConnect只能用于全连接的网络层(和dropout一样)
    根据作者的观点,Dropout和DropConnect都类似模型平均,Dropout是2|m|个模型的平均,而DropConnect是2|M|个模型的平均。(m是向量,M是矩阵,取模表示矩阵或向量中对应元素的个数),从这点上来说,DropConnect模型平均能力更强,因为|M|>|m|

    6. 早停法

    早停法可以限制模型最小化代价函数所需的训练迭代次数。早停法通过确定迭代次数解决这个问题,不需要对特定值进行手动设置。

    四、batch size

    1. 什么是batch size

    超参数之一,我们需要决定在一次训练中,要选取多少样本喂给神经网络,这个要选择的样本个数,就是batch size。batch size的可取值范围为1到全体样本数。举个例子,传统的梯度下降法(Gradient Descent)就是采用了全部样本来进行训练和梯度更新,而它的变体随机梯度下降法(stochastic gradient descent),则设定batch size为1,即每次只将一个样本喂给神经网络,在mini-batch梯度下降法中,则采用了一个折中的方法,每次选择一部分数据用于训练。那么,不同大小的batch对网络训练有什么区别呢?我们又该如何进行选择呢?

    2. batch size对网络的影响

    凸与非凸问题,而传统的梯度下降法在这种情况下很容易陷入局部最优点或鞍点。当样本数很大时,每一次的计算将会非常耗时,也会导致内存爆炸。

    如果选取比较折中的batch size作为mini-batch来进行随机梯度下降,其优点是用部分样本来近似全部样本,梯度相对于batch size为1更为准确,同时相比与使用全部样本,计算量减小,计算速度和收敛速度都会得到提升。??

    3. batch size的选择

    在了解了batch size对于网络的影响后,很自然的,我们有一个疑问:如何选择一个适当的batch size呢?batch size的选取通常需要考虑一下几点:

    1. 更大的batch size会得到更精确的梯度估计值,但其估计梯度的回报是低于线性的。
    2. 如果训练集较小,可以直接使用梯度下降法,batch size等于样本集大小。
    3. Deep Learning书中提到,在某些硬件上使用特定大小的数组时,运行时间会更少。尤其是在使用GPU时,通常使用2的幂数作为batch size可以获得更少的运行时间。

    五、参数初始化

    在我们开始训练神经网络之前,首先要做的是给网络中的每一个权重和偏置赋值,这个赋值的过程就是参数初始化。
    那么,我们要如何对参数进行初始化呢?或许你有想到过将全部参数都设置为0,这看起来是一个简单又方便的办法,但遗憾的是神经网络中不能对权重进行全零初始化。在讨论如何对参数进行初始化前,我们先来看看为什么不能进行全零初始化。

    1. 为什么不能全零初始化?

    由此可见,更新后的参数在每一层内都是相同的。同时,无论经过多少次网络训练,相同网络层内的参数值都是相同的,这会导致网络在学习时没有重点,对所有的特征处理相同,这很可能导致模型无法收敛训练失败。这种现象被称为对称失效。
    同样地,当权重被初始化为相同的非零值时,也会出现上述情况,此时神经网络模型和一个线性模型的效果相似,失去了神经网络提取特征的意义。那么,有哪些可行的参数初始化方法呢?

    2. 常见的初始化方法

    1. 基于固定方差的参数初始化:一种非常常见的方式是采用高斯分布或均匀分布来对权重进行随机初始化。上述两种基于固定方差的初始随机化方法中,关键点在于如何设置方差 σ2。过大或过小的方差都会导致梯度下降缓慢,网络训练效果不好等问题???。为了降低固定方差对网络性能及优化效率的影响,基于固定方差的随机初始化一般要配合逐层归一化来使用。
    2. 基于方差缩放的参数初始化:方差缩放方法能够根据神经元的链接数量来自适应地调整初始化分布地方差,尽可能的保证每个神经元的输入和输出方差一致。那么,为什么要保证前后方差的一致性呢?这是因为如果输入空间和输出空间的方差差别较大,也就是说数据空间分布差异较大,那么在反向传播时可能会引起梯度消失或爆炸问题???。比如,当输入空间稀疏,输出空间稠密时,将在输出空间计算得到的误差反向传播给输入空间时,这个误差可能会显得微不足道,从而引起梯度消失。而当输入空间稠密,输出空间稀疏时,将误差反向传播给输入空间,就可能会引起梯度爆炸,使得模型震荡。
      ①Xavier初始化:Xavier 初始化因为基本保证了输入和输出的方差一致,使得样本空间和类别空间的分布差异相似,因此使得模型的训练速度和分类性能获得提升。但xavier初始化的推导基于激活函数是线性的假设,使其并不适合于ReLU、sigmoid等非线性激活函数 ②kaiming初始化(???):是一种针对ReLU的初始化方法,假定使用ReLU激活函数时,网络每一层都中有一半的神经元被激活,另一半为0,因此其分布的方差也近似为恒等函数的一半。

    更多相关内容
  • 深度学习调优深度学习模型

    千次阅读 2017-09-25 21:50:34
    深度学习调优

    前沿的迁移学习方向

    1、Reinforcement Transfer Learning

    怎么迁移智能体学习到的知识:比如我学会了一个游戏,那么我在另一个相似的游戏里面也是可以应用一些类似的策略的。

    2、Transitive Transfer Learning

    传递性迁移学习,两个domain之间如果相隔得太远,那么我们就插入一些intermediate domains,一步步做迁移。

    3、Source-Free Transfer Learning

    不知道是哪个源领域的情况下如何进行迁移学习。

    二、假如你目前有了一些代表性数据集,进入了温饱阶段,恨不得压榨出每一滴数据的价值,又害怕用力过以偏概全(俗称过拟合)。那么我们可能需要如下技巧。

    严防死守过拟合(所谓尽人事,听……)

    深度学习由于超参数的个数比较多,训练样本数目相对超参数来说略显不足,一不小心就容易发生过拟合。从本质上来说,过拟合是因为模型的学习能力太强,除了学习到了样本空间的共有特性外,还学习到了训练样本集上的噪声。因为这些噪声的存在,导致了模型的泛化性能下降。

    深度学习中有几种较为常用的改善过拟合方法:

    1、data augmentation

    data augmentation即数据增强,数据增强其实是增加训练样本的一种方法。以人脸识别为例,对于人脸识别的数据增强,一般有随机裁剪,随机加光照,随机左右翻转等。

    通过类似的手段,无论是图像处理,还是语音或者自然语言处理,我们都能有效地增加样本数量。更多的训练样本意味着模型能够学到更多的本质特征,具有对于噪声更好的鲁棒性,从而具有更好的泛化性能,能够有效地避免过拟合。

    2、early stopping

    early stopping,顾名思义,就是在训练次数没有达到预先设定的最大训练次数时,我们就让网络停止训练。采用early stopping需要我们在训练集合上划分出一小部分(大概10%~30%吧)作为验证集,验证集不参与训练,可以视为是我们知道结果的测试集。我们通过实时监控模型在验证集上的表现来(实时监控并不意味着每次迭代都去监控,可以每1000次去观察一次),一旦模型在验证集上的表现呈现下降趋势,我们就停止训练,因为再训练下去模型的泛化性能只会更差。

    而实际训练中,我们不可能一直坐在电脑旁观察验证集的准确率,更一般的做法是每隔一段时间(比如每1000次迭代)就保存一次模型,然后选择在验证集上效果最好的模型作为最终的模型。

    3、增加Dropout层

    Dropout(https://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf )原理非常简单,Dropout t的作用对象是layer,对于某一层中的每个节点,Dropout技术使得该节点以一定的概率p不参与到训练的过程中(即前向传导时不参与计算,bp计算时不参与梯度更新)。

    如上图所示,实验证明了,Dropout的效果非常爆炸,对于模型训练有非常好的效果。

    为什么Dropout能起到这么大作用呢?

    一个原因是通过Dropout,节点之间的耦合度降低了,节点对于其他节点不再那么敏感了,这样就可以促使模型学到更加鲁棒的特征;

    第二个是Dropout 层中的每个节点都没有得到充分的训练(因为它们只有一半的出勤率),这样就避免了对于训练样本的过分学习;

    第三个原因是在测试阶段,Dropout 层的所有节点都用上了,这样就起到了ensemble的作用,ensemble能够有效地克服模型的过拟合。

    在实际的模型训练中,ropout在一般的框架中初始默认的0.5概率的丢弃率是保守的选择,如果模型不是很复杂,设置为0.2就够了。

    不过也要注意到Dropout的缺点:

    (1)Dropout是一个正则化技术,它减少了模型的有效容量。为了抵消这种影响,我们必须增大模型规模。不出意外的话,使用Dropout时最佳验证集的误差会低很多,但这是以更大的模型和更多训练算法的迭代次数为代价换来的。对于非常大的数据集,正则化带来的泛化误差减少得很小。

    在这些情况下,使用Dropout和更大模型的计算代价可能超过正则化带来的好处。

    (2)只有极少的训练样本可用时,Dropout不会很有效。

    4、weight penality(L1&L2)

    第四种常用的办法就是weight decay,weight decay通过L1 norm和L2 norm强制地让模型学习到比较小的权值。

    这里有两个问题:

    (1)为什么L1和L2 norm能够学习到比较小的权值?

    (2)为什么比较小的权值能够防止过拟合?

    对于第一个问题:

    首先看一下L1和L2的定义:

       
     

    其中C0为未加上惩罚项的代价函数。那么L1和L2形式的代价函数会如何影响w的值呢?

    1)未增加惩罚项w的更新 

    2)L1下的w更新,其中u为学习率

    3)L2下的w更新,其中u为学习率

    由上面的(1)(2)(3)可以看出,加上惩罚项之后,w明显减少得更多。L1是以减法形式影响w,而L2则是以乘法形式影响w,因此L2又称为weight decay。

    对于第二个问题:

    过拟合的本质是什么呢?无非就是对于非本质特征的噪声过于敏感,把训练样本里的噪声当作了特征,以至于在测试集上的表现非常稀烂。当权值比较小时,当输入有轻微的改动(噪声)时,结果所受到的影响也比较小,所以惩罚项能在一定程度上防止过拟合。

    除了千方百计增加数据多样性,还要增加模型的多样性

    1、试试不断调整隐层单元和数量

    调模型,要有点靠天吃饭的宽容心态,没事就调调隐层单元和数量,省的GPU闲着,总有一款适合你。

    一般来说,隐层单元数量多少决定了模型是否欠拟合或过拟合,两害相权取其轻,尽量选择更多的隐层单元,因为可以通过正则化的方法避免过拟合。与此类似的,尽可能的添加隐层数量,直到测试误差不再改变为止。

    2、试试两个模型或者多个模型concat

    比如,两种不同分辨率的图像数据集,分别训练出网络模型a和网络模型b,那么将a和b的瓶颈层concat在一起,用一个全连接层(或者随便你怎么连,试着玩玩没坏处)连起来,,输入concat后的图片,训练结果可能比单个网络模型效果要好很多哦。

    loss函数那些事儿

    这里只从模型调优的tric角度来介绍下。

    Softmax-loss算是最常用的loss方法了,但是Softmax-loss不会适用于所有问题。比如在数据量不足够大的情况下,softmax训练出来的人脸模型性能差,ECCV 2016有篇文章(A Discriminative Feature Learning Approach for Deep Face Recognition)提出了权衡的解决方案。通过添加center loss使得简单的softmax就能够训练出拥有内聚性的特征。该特点在人脸识别上尤为重要,从而使得在很少的数据情况下训练出来的模型也能有很好的作用。此外,contrastive-loss和triplet-loss也有其各自的好处,需要采样过程,有兴趣的可以多了解下。

    花式调优

    1、batch size设置

    batch size一般设定为2的指数倍,如64,128,512等,因为无论是多核CPU还是GPU加速,内存管理仍然以字节为基本单元做硬件优化,2的倍数设置将有效提高矩阵分片、张量计算等操作的硬件处理效率。

    不同batch size的模型可能会带来意想不到的准确率提升,这个调节其实是有一定规律和技巧的。

    2、激励函数

    激励函数为模型引入必要的非线性因素。Sigmoid函数由于其可微分的性质是传统神经网络的最佳选择,但在深层网络中会引入梯度消失和非零点中心问题。Tanh函数可避免非零点中心问题。ReLU激励函数很受欢迎,它更容易学习优化。因为其分段线性性质,导致其前传,后传,求导都是分段线性,而传统的sigmoid函数,由于两端饱和,在传播过程中容易丢弃信息。ReLU激励函数缺点是不能用Gradient-Based方法。同时如果de-active了,容易无法再次active。不过有办法解决,使用maxout激励函数。

    3、权重初始化

    权重初始化常采用随机生成方法以避免网络单元的对称性,但仍过于太过粗糙,根据目前最新的实验结果,权重的均匀分布初始化是一个最优的选择,同时均匀分布的函数范围由单元的连接数确定,即越多连接权重相对越小。 
    Tensorflow的 word2vec程序中初始化权重的例子,权重初始值从一个均匀分布中随机采样:

    4、学习速率

    学习速率是重要的超参数之一,它是在收敛速度和是否收敛之间的权衡参数。选择0.01或者伴随着迭代逐步减少都是合理的选择,最新的方法开始研究学习速率的自动调整变化,例如基于目标函数曲率的动量或自适应调参等。

    5、选择优化算法

    传统的随机梯度下降算法虽然适用很广,但并不高效,最近出现很多更灵活的优化算法,例如Adagrad、RMSProp等,可在迭代优化的过程中自适应的调节学习速率等超参数,效果更佳。

    展开全文
  • 深度学习模型的调优,首先需要对各方面进行评估,主要包括定义函数、模型在训练集和测试集拟合效果、交叉验证、激活函数和优化算法的选择等。 那如何对我们自己的模型进行判断呢?请看详细解析以及案例实战!

    深度学习模型的调优,首先需要对各方面进行评估,主要包括定义函数、模型在训练集和测试集拟合效果、交叉验证、激活函数和优化算法的选择等。

    那如何对我们自己的模型进行判断呢?——通过模型训练跑代码,我们可以分别从训练集和测试集上看到这个模型造成的损失大小(loss),还有它的精确率(accuracy)。

    前言

    1. 最初可从分析数据集的特征,选择适合的函数以及优化器。
    2. 其次,模型在训练集上的效果。至少模型在训练集上得到理想的效果,模型优化方向:激活函数(activation function)、学习率(learning rate)。
    3. 再者,模型在训练集上得到好的效果之后,对测试集上的拟合程度更为重要,因为我们训练之后目的就是去预测并达到好的结果。模型优化方向:正则化(regularization)、丢弃参数(dropout)、提前停止训练(early stopping)。

    以下介绍具体的方法和过程,图文结合,一目了然,这样方便学习记忆!

    1、定义模型函数

    衡量方法通常用到真实f与预测f*的方差(variance)和偏差(bias),最后对数据集的拟合程度可分为4种情况。如下:

    bias/variancelowhigh
    low模型过于复杂
    high模型过于简单×

    这好比数据模型预测对准靶心后的偏移和分散程度,期望达到的效果就是(low,low),模型的偏差相当于与目标的偏离程度,而方差就是数据之间的分散程度。
    bias+variance
    定义一个模型函数后结果会遇到(low,high)和(high,low),显然,如果是(high,high)说明函数完全与模型不匹配,可重新考虑其他函数模型。那出现其他情况如何评估这个函数呢?

    1. 小偏差,大方差:所谓模型过拟合,在训练数据上得到好的效果,而在测试集上效果并不满意。优化方向:增加数据量;数据正则化处理。增加数据可以提高模型的鲁棒性,不被特殊数据影响整个模型的偏向;正则化是另一种方法,为了减小variance,但直接影响到bias,需要权衡。
    2. 大偏差,小方差:模型过于简单,在训练上没有得到好的效果。优化:增加模型参数(特征),更好去拟合数据。

    2、交叉验证(Cross-validation)

    在训练一个模型时候,通常会将数据分为:训练集,测试集,开放集(小型训练集)。这里交叉验证是在训练集上进行的,选择最优模型。
    交叉验证
    假设一个划分为:

    training-settesting-set
    90%10%

    这里进行十折交叉验证,每一轮训练去9份数据作为训练集,1份作为测试集,并且每一轮的训练集与测试集对换,实现了所有数据都作为样本训练,所得到的模型避免了过拟合与低拟合的问题。
    交叉验证演示
    K折交叉验证类似。
    优点:
    (1)每一轮训练中几乎所有的样本数据用于训练模型,这样最接近原始样本的分布,评估所得的结果比较可靠。
    (2)训练模型过程中较少随机特殊因素会影响实验数据,鲁棒性更好。

    3、优化算法

    模型优化算法选择根据要训练的模型以及数据,选择合适的算法,常用优化算法有:Gradient descent,Stochastic gradient descent,Adagrad,Adam,RMSprop

    前两种算法原理好理解,这里给出后面三种的算法原理如图,具体就不介绍了,写代码时候通常直接指定算法就行,算法原理理解就OK啦。

    Adagrad
    Adagrad
    RMSpropRMSprop
    AdamAdam

    4、激活函数(activation)

    选择合适的激活函数对模型训练也有很大的影响,需要适应训练任务,比如任务是二分类、多分类或许更新参数梯度问题等。常用的有:sigmoid、tanh、relu、softmax。

    sigmoid
    sigmoid
    功能特点:平滑函数,连续可导,适合二分类,存在梯度消失问题。

    tanh
    tanh
    功能特点:与sigmoid相同的缺点,存在梯度消失,梯度下降的速度变慢。一般用在二分问题输出层,不在隐藏层中使用。

    relu
    reluc
    功能特点:ReLU在神经网络中使用最广泛的激活函数。根据图像x负半轴的特点,relu不会同时激活所有的神经元,如果输入值是负的,ReLU函数会转换为0,而神经元不被激活。这意味着,在一段时间内,只有少量的神经元被激活,神经网络的这种稀疏性使其变得高效且易于计算。

    softmax
    softmax
    功能特点:又称归一化指数函数。它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。softmax通常在分类器的输出层使用。

    在模型训练任务中激活函数通过指定选择,我们理解原理后帮助选择正确的函数,具体无需自己实现。

    5、dropout

    它解决深度神经网络的**过拟合(overfitting)梯度消失(gradient vanishing)**问题。
    简单理解就是,当模型在训练集上得到较好的效果,而在测试集效果并不乐观,此时使用dropout对训练时候的参数进行优化调整(减少训练时候的参数),在学习过程中通过将隐含层的部分权重或输出随机归零,降低节点间的相互依赖性,使得模型在测试集上得到较好的结果的一种方法。
    相当于运用新的神经网络结构训练模型,在模型训练时候可在每一层指定设计。

    6、early stopping

    在训练时候观察模型在training-set和testing-set上的损失(loss),我们想要得到的模型是在测试时候损失误差更小,训练时候在训练集上可能不是最好的效果,所以需要提前停止保证了模型预测得到较好的结果。理解如图:
    early stopping

    模型训练实战案例

    (X_train, Y_train), (X_test, Y_test) = load_data()
    model = keras.Sequential()
    model.add(Dense(input_dim=28 * 28, units=690,
                    activation='relu'))  # tanh  activation:Sigmoid、tanh、ReLU、LeakyReLU、pReLU、ELU、maxout、softmax
    model.add(Dense(units=690, activation='relu'))
    model.add(Dense(units=690, activation='relu'))  # tanh
    
    model.add(Dense(units=10, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam',
                  metrics=['accuracy'])  # loss:mse,categorical_crossentropy,optimizer: rmsprop 或 adagrad、SGD(此处推荐)
    model.fit(X_train, Y_train, batch_size=100, epochs=20)
    result = model.evaluate(X_train, Y_train, batch_size=10000)
    print('Train ACC:', result[1])
    result = model.evaluate(X_test, Y_test, batch_size=10000)
    print('Test ACC:', result[1])
    

    案例中深度学习模型调优总结:
    1、前三层sigmoid,输出层softmax,损失函数categorical_crossentropy,优化器SGD,训练集上达到86%
    2、前三层换为relu,隐藏层加10层,其他不变,训练集上达到99.97%,测试集上95.9%,不加10层,Train-acc:100%,Test-acc:95.54%
    3、优化器adam,训练速度提高,99.98%和96.7%

    上面模型调优的理论方法,理解之后进行实战演练,可参考上一篇文章《mnist手写数字识别(tensorflow+keras+Sequential模型)》

    我的博客园:https://www.cnblogs.com/chenzhenhong/p/13437132.html
    我的CSDN博客:https://blog.csdn.net/Charzous/article/details/107822055

    展开全文
  • 深度学习模型调优建议 数据、算法、超参等领域的常用调优建议。 数据优化 data.01 确保各个分类中的样本数目相近 当数据集中各分类的样本数目不均衡时,需要进行调整以使每个分类对训练有程度相近的影响。可以考虑...

    深度学习模型调优建议

    数据、算法、超参等领域的常用调优建议。

    数据优化

    data.01 确保各个分类中的样本数目相近

    当数据集中各分类的样本数目不均衡时,需要进行调整以使每个分类对训练有程度相近的影响。可以考虑以下方法:

    基于数据重采样的方法:

    1. 对样本数较少的类过采样
    2. 对样本数目较多的类欠采样
    3. 混用上面两种方案。

    通过上述重采样,使得训练过程中每个类出现的样本数相对均衡。需要注意的是,过采样有过拟合的风险(Cao et al., 2019)。

    基于代价的方法:

    1. loss函数不变,根据每个类中的样本数目重新设置loss权重,其中,权重为每一类别样本数的平方根的倒数。
    2. 在loss函数中直接反映类不均衡的情况,迫使样本数较小的类同决策边界间的范围扩大。

    data.02 获取更多数据

    让模型效果更好的最直接方法就是获取更多数据,训练集越大,模型效果一般越好。

    data.03 归一化数据

    归一化数据是指将数据映射到同一尺度,常见的操作方法包括Resize、Rescale、Normalize等。按照激活函数的值域上下界来归一化数据通常可以取得不错的效果。例如,当使用sigmoid激活函数时,建议将输入归一化到0到1之间;当使用tanh激活函数时,推荐将输入数据归一化到-1到1之间。

    此外,可以系统性地尝试不同的数据归一化方法,包括把数据归一化到0-1、归一化到-1到1之间,或者是将数据标准化到均值为0,方差为1的分布上。然后针对每种数据归一化方法评估模型的表现。

    data.04 对数据做变换以使数据服从均匀分布

    对于数值类型的数据,可以考虑对数据进行转换以调整数据的分布。例如某列数据是指数分布,可以通过一个log变换将该列数据变换为均匀分布。

    算法优化

    alg.01 参考领域中的已有工作

    如果所要实现的算法已经有很多相关的研究工作,不妨参考一下相关的论文,并把论文中使用的各种方法记录下来,根据经验尝试各种可能的组合。例如,你可能在训练GAN网络时发现精度差几个百分点难以达标,此时你可以多参考一些研究工作,尝试它们使用的技巧,例如更改loss函数(例如WGAN,WGAN-GP等),修改训练方法(例如将每个step内Generator和Discriminator各训练1次改为各训练3次)等。

    alg.02 优化模型中每一层的大小

    在设计模型时,可以在一开始将每一层的尺寸(例如卷积层的输入输出大小)设计为相同的。有研究证明,将所有层的尺寸设置为相同的,其模型表现一般不会差于正金字塔(层的尺寸逐层增大)或者倒金字塔(层的尺寸逐层减小)的模型结构。

    推荐将第一个隐层的大小大于输入尺寸。相较于第一个隐层的大小小于输入大小的情况,第一个隐层的大小大于输入大小时模型的表现更好。

    alg.03 模型层数的选择和优化

    层数更多的模型有更大的机会来对数据中的抽象特征进行表达和重组,提供更强的表征能力,但是也更容易过拟合。层数较少的模型则容易出现欠拟合。

    alg.04 权重初始值的选择和优化

    权重初始值对训练效果的影响较大,在MindSpore的模型交付实践中, 常常有因为权重初始值引起的精度差异。在有标杆脚本时,应该确保MindSpore脚本的权重初始化方式和标杆脚本的权重初始化方式一致。特别要小心未指定权重初始化方式的场景,此时使用的是各个框架的默认初始化方式,而MindSpore、PyTorch、TensorFlow等框架的默认权重初始化方式常常不同。

    常见的权重初始化方式包括:

    1. 随机初始化
    2. Xavier初始化(Glorot & Bengio, 2010)
    3. Kaiming初始化(He et al., 2015) 等

    其中,Xavier初始化适用于使用tanh作为激活函数的网络而不适用于使用ReLU作为激活函数的网络,Kaiming初始化适合于使用ReLU作为激活函数的网络。不推荐使用常数初始化、全零初始化(bias除外),因为权重初始化为统一的常数(例如0/1)时,所有神经元学到的特征相同(梯度相同),进而导致模型表现较差。不推荐使用过大或过小的权重初始值。当权重初始值过小时,模型的收敛可能会很慢,在比较深的网络可能完全不能收敛。这是由于过小的权重容易导致激活值太小,梯度消失。当权重初始值过大时,模型可能完全无法收敛,这是由于较大的权重容易导致梯度爆炸,扰乱参数更新的方向。

    在Batch Normalization提出前,权重初始值的均值和方差是需要着重考虑的因素。简单来说,模型输出的大小和权重的乘积(以及激活函数的输出范围)相关,当权重值过小时,模型输出的大小也会变得很小,当权重值过大时,模型输出的大小也会变得很大,Xavier和Kaiming初始化都是基于稳定权重方差和激活函数输出范围的目的推到得到的。当网络中使用Batch Normalization时,一定程度上能减缓对权重初始值的依赖,但仍然建议使用前述推荐的权重初始化方式。

    如果不确定使用哪种权重初始化方式,可以固定其它因素,对多种权重初始化方式进行对比。

    alg.05 激活函数的选择和优化

    对于卷积神经网络(Convolutional Neural Network, CNN)等大部分网络,ReLU激活函数通常是一个不错的选择。如果ReLU效果不是很好,可以尝试Leaky ReLU或Maxout等变种。对于循环神经网络(Recurrent Neural Network,RNN),tanh函数也是一个不错的选择。除非您是这方面的专家,有明确的动机或者理论分析的支撑,通常不建议自行尝试学术界尚未证明效果的激活函数。

    在深度不是特别深的CNN中,激活函数的影响一般不会太大。

    alg.06 优化器的选择和优化

    优化器对模型精度和收敛速度(收敛所需的参数更新次数)都会有影响。通常Adam优化器是一个不错的选择。带有动量的优化器有助于提升大batch size下的训练速度。

    在选择优化器时,一方面要注意优化器之间有功能上的包含关系(Choi et al., 2019)。例如RMSProp优化器功能包含了Momentum优化器的功能。这是因为,令RMSProp中的decay参数取1,epsilon参数取0,则RMSProp即等效于动量为momentum/learning_rate的Momentum优化器。Adam优化器同样也包含了Momentum优化器的功能。MindSpore的Momentum优化器和SGD优化器的功能是类似的。另一方面也要注意,功能更强大的优化器,一般有更多参数,要花费更长时间才能找到合适的超参。

    alg.07 早停法

    一旦验证集上的表现下降时,就应该停止训练以免过拟合,也即早停法。

    超参优化

    狭义上讲,超参是指在训练开始前即手工确定好的变量。广义上讲,上文讨论过的模型设计选择也可以认为是超参,例如网络层数设计,激活函数选择等。需要说明的是,训练得到的结果不能算作超参,例如训练后得到的权重数据就不是超参。本节主要讲狭义超参的优化,下文中如没有特殊说明,指的都是狭义超参。

    进行超参优化时要注意:没有通用的最佳超参。选择最优超参没有一劳永逸的方法,既需要经验,也需要不断试错。

    hyper.01 学习率的选择和优化

    学习率是控制如何使用损失函数的梯度调整网络权重的超参数。学习率的取值对模型能否收敛,模型收敛的速度有重要影响。相较于固定学习率,在训练过程中循环变化学习率总体来说是有益于模型收敛的。循环变化学习率的最大值和最小值可以这样确定(Smith, 2017):选定一个足够大的学习率范围(例如从0到5),设置训练运行几个epoch(例如10个),在训练运行过程中,逐迭代地线性(或指数)增大学习率,就可以得到一个准确率和学习率的关系曲线,如下图。关注曲线中准确率开始上升和不再上升的的部分所对应的学习率,可以将准确率开始上升时的学习率当做学习率的下限,将准确率不再上升时的学习率当做学习率的上限,在上下限之间的学习率都可以认为是合理的。此外,在Neural Networks: Tricks of the Trade这本书中提供了一个经验法则:最优学习率一般为可以使网络收敛的最大学习率的二分之一。另一个经验法则是,0.01的学习率通常适用于大多数网络 。当然这些经验法则是否正确就需要各位读者自行判断了。

    在这里插入图片描述

    图 学习率与准确率的关系。此曲线通过8个epoch的训练得到。图片引用自(Smith, 2017)。

    以上文所述的合理学习率为起点,每个网络的最优值都需要根据具体情况(网络类型、batch size、优化器、其他相关超参等)实验和调整。

    hyper.02 batch size的选择和优化

    batch size是指一次训练,也即一次前向传播、反向传播、权重更新过程所使用的样本数目。batch size越大,就越有潜力达到快的训练速度,但是batch size不能无限增大。一方面,batch size越大,所需要的硬件内存就越多,硬件内存为可能的最大batch size设置了上界。另一方面,当batch size过大时,模型的泛化能力将下降(Keskar et al., 2016)。batch size较小时,可以起到正则化的效果,有助于减少过拟合(Masters & Luschi, 2018),但是不能充分发挥硬件的运算能力。

    在这里插入图片描述

    图 学习率不能无限增大。图中可见,当ResNet-50的batch size超过8k后,验证集上的误差开始迅速增大。图片引用自(Goyal et al., 2017)。

    基于上面的描述,需要较快的训练速度和正则化效果之间进行权衡。一般来讲,32是一个比较好的默认值(Bengio, 2012),64、128、256 也都值得尝试。batch size 学习率之间存在相互影响,将在下一节阐述。

    hyper.03 学习率和batch size的联合优化

    一旦在某个batch size下找到最优的学习率后,后续调整batch size时,应该同步调整学习率,使得batch size和学习率的比值保持固定,这被成为linear scaling rule。基于郎之万动力学,学习率和batch size在满足linear scaling rule时可以得到相等的动力学演化时间(Xie et al., 2020)。在做出一些假设后,当学习率同batch size的比值固定时,只需要训练相同的epoch数,训练效果应该是一样的。并行场景下利用这一点同步增大batch size和学习率能够有效缩短训练时间。但是需要注意的是,batch size及学习率过大时,会破坏一些假设,例如中心极限定理成立要求batch size远小于训练数据集大小,连续时间近似成立要求学习率足够小等。当这些假设被破坏时,linear scaling rule也就不成立了,此时需要适当降低batch size或学习率。

    hyper.04 动量值的选择和优化

    当使用带有动量的优化器(例如Momentum)时,动量和学习率一般应朝相反的方向调整,不同动量下的最佳学习率不同。当使用循环学习率时,同样推荐按照相反的方向循环变化动量值 ,也即,当学习率从大到小变化时,动量应从小到大变化。当学习率固定时,动量值也应保持固定。

    hyper.05 权重衰减参数的选择和优化

    权重衰减(weight decay)是指在在模型训练过程中对目标代价函数增加一个L2参数范数惩罚,权重衰减参数控制这一惩罚项的系数,请参考SGD优化器的weight_decay参数。实验证明,权重衰减参数最好在训练过程中保持恒定。0.001/0.0001/0.00001都是常见的取值。当数据集较小、模型深度较浅时,推荐使用大一些的参数值,当数据集较大、模型深度较深时,推荐使用小一些的参数值。这可能是因为,较大的数据集本身便提供了某种程度的正则化,从而降低了需要权重衰减提供的正则化。

    注: 本文改编自 https://www.mindspore.cn/mindinsight/docs/zh-CN/master/accuracy_optimization.html

    相关参考文献

    Bengio, Y. (2012). Practical Recommendations for Gradient-Based Training of Deep Architectures.

    Cao, K., Wei, C., Gaidon, A., Arechiga, N., & Ma, T. (2019). Learning Imbalanced Datasets with Label-Distribution-Aware Margin Loss. Advances in Neural Information Processing Systems, 32. https://arxiv.org/abs/1906.07413v2

    Choi, D., Shallue, C. J., Nado, Z., Lee, J., Maddison, C. J., & Dahl, G. E. (2019). On Empirical Comparisons of Optimizers for Deep Learning. https://www.tensorflow.org/

    Glorot, X., & Bengio, Y. (2010). Understanding the difficulty of training deep feedforward neural networks. Journal of Machine Learning Research, 9, 249–256.

    He, K., Zhang, X., Ren, S., & Sun, J. (2015). Delving deep into rectifiers: Surpassing human-level performance on imagenet classification. Proceedings of the IEEE International Conference on Computer Vision, 2015 Inter, 1026–1034. https://doi.org/10.1109/ICCV.2015.123

    Keskar, N. S., Mudigere, D., Nocedal, J., Smelyanskiy, M., & Tang, P. T. P. (2016). On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima. 5th International Conference on Learning Representations, ICLR 2017 - Conference Track Proceedings, 1–16. http://arxiv.org/abs/1609.04836

    Masters, D., & Luschi, C. (2018). Revisiting small batch training for deep neural networks. ArXiv, 1–18.

    Montavon, G., Orr, G. B., & Müller, K.-R. (Eds.). (2012). Neural Networks: Tricks of the Trade. 7700. https://doi.org/10.1007/978-3-642-35289-8

    Nwankpa, C., Ijomah, W., Gachagan, A., & Marshall, S. (2018). Activation Functions: Comparison of trends in Practice and Research for Deep Learning. http://arxiv.org/abs/1811.03378

    Goyal, P., Dollár, P., Girshick, R., Noordhuis, P., Wesolowski, L., Kyrola, A., Tulloch, A., Jia, Y., & He, K. (2017). Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour. https://arxiv.org/abs/1706.02677v2

    Smith, L. N. (2017). Cyclical learning rates for training neural networks. Proceedings - 2017 IEEE Winter Conference on Applications of Computer Vision, WACV 2017, 464–472. https://doi.org/10.1109/WACV.2017.58

    Xie, Z., Sato, I., & Sugiyama, M. (2020). A Diffusion Theory For Deep Learning Dynamics: Stochastic Gradient Descent Exponentially Favors Flat Minima. https://arxiv.org/abs/2002.03495v14

    展开全文
  • 机器学习中的两个需要克服的问题就是过拟合和欠拟合,所以在调优过程中,针对这两方面分别有以下调优的小方法(当然要选择合适的代价函数和正则项啦):1、针对过拟合(传统机器学习)1、获取更多训练样本,这样可以...
  • 越来越多的人工智能解决方案将深度学习作为其基本技术,然而构建深度学习模型并不是一件容易的事,为了获得满意的准确性和效率,通常需要数周的时间优化模型。 本下载源码为博客文章 ...
  • 深度学习模型进行调优

    千次阅读 2022-02-18 11:07:09
    对许多模型来说,除了准确率不够高,最核心的...解决方法:降低学习率lr或增加动量参数gamma,来帮助模型稳住迭代方向。如果使用的是Adam,则可以考虑增加值 3)模型的置信度低 解决方法:这种情况下,说明模型或架构
  • MIT版深度学习第8章 深度学习模型训练的优化 ,介绍各种优化算法:随机梯度下降算法,动量算法,自适应学习率的优化算法
  • 深度学习-超参数调优

    2021-06-03 09:13:49
    在机器学习中有很多调优的方式机器学习——超参数调优深度学习中也存在同样的方式
  • 深度学习算法调优trick总结

    千次阅读 2017-10-11 10:36:36
    1:优化器。机器学习训练的目的在于更新参数,优化目标函数,常见优化器有SGD,...学习速率决定了每次步进的大小,因此我们需要选择一个合适的学习速率进行调优学习速率太大会导致不收敛,速率太小收敛速度慢。因此SG
  • 深度学习领域由于在解决不同的问题上所用的模型都是不尽相同的,但有一些通用化的方法来解决问题。这一章节将讨论如何有效运作神经网络,内容涉及超参数调优,如何构建数据,以及如何确保优化算法快速运行,从而使...
  • 深度学习计算框架中的自动化调优,尤其是高性能算子自动生成是这几年非常火的话题。这个系列的文章主要是对之前看到的零碎信息做个简单的总结。尽管,由于有些方向比较艰深,笔者懂得十分浅薄,文章在很多方面也只能...
  • learnrate 学习速率,一般根据batch的大小设置,batch越大,学习速度应设置的越大,学习速度大容易在最优值附近震荡,学习速度小可能拟合 不了loss降不下去。通常的思路为起初学习速率大一点,到后面逐渐减小学习速率...
  • 基于深度学习的垃圾图像分类

    万人学习 2019-12-08 11:15:53
    Pytorch项目实战 垃圾分类 课程从实战的角度出发,基于真实数据集与实际业务需求,结合当下最新话题-垃圾分类问题为实际业务出发点,介绍最前沿的深度学习解决方案。     从0到1讲解如何场景业务...
  • 点击上方Java后端,选择设为星标优质文章,及时送达项目调优作为一名工程师,项目调优这事,是必须得熟练掌握的事情。在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数...
  • 本次实验训练了多个用于垃圾图片分类识别的模型,采用迁移学习的方法选取性能较好的模型进行调优改进,最终的模型识别准确率在93%以上(30个epoch);然后将训练好的模型部署在华为云上,生成API接口进行调用;最后...
  • 这份PPT,主要有7个主题,分别是:1、调整学习率;2、调整小批量的规模;3、调整优化器和权值衰减;4、调整特征和标签;5、调整特征和标签(mixup);6、调整初始条件;7、Shake-shake正则化。每一个主题,都基于...
  • 吴恩达深度学习——超参数调优

    千次阅读 2020-05-24 18:56:11
    本文主要介绍了如何进行超参数调优,包括如何选择合适的范围。其次介绍了Batch Norm批归一化以及Softmax回归,最后简单介绍了一下TensorFlow。
  • 深度模型调优

    2022-06-03 05:23:52
    深度网络模型调优
  • Spark+AI深度学习动手实践

    千人学习 2020-07-08 08:46:46
    《Spark大数据商业实战三部曲》...Spark上的深度学习内核解密:使用TensorFlow进行图片的分布式处理、数据模型源码剖析、逻辑节点源码剖析、构建索引源码剖析、深度学习下Spark作业源码剖析、性能调优最佳实践。  
  • 1:优化器。机器学习训练的目的在于更新参数,优化目标函数,常见优化器...学习速率决定了每次步进的大小,因此我们需要选择一个合适的学习速率进行调优学习速率太大会导致不收敛,速率太小收敛速度慢。因此SGD通...
  • 机器学习 深度学习 pytorch tensorflow 贝叶斯 神经网络 算法
  • JVM底层及深度调优面试宝典,很好的学习资料!!
  • 前一篇《(一)大话深度学习编译器中的自动调优·前言》介绍了深度学习编译器及早期算子自动调优的背景,在接下去更深入地聊自动调优具体方法之前,在这篇中想先聊下两个与之密切相关的重要基础概念:领域专用语言...
  • 常用深度学习模型调优方法

    千次阅读 2021-09-03 12:32:01
    常用调优建议 数据优化 确保各个分类中的样本数目相近 获取更多数据 归一化数据 对数据做变换以使数据服从均匀分布 算法优化 参考领域中的已有工作 优化模型中每一层的大小 模型层数的选择...
  • 行业分类-物理装置-一种深度学习模型的调优管理方法、装置、设备和介质
  • 点击打开链接
  • 越来越多的人工智能解决方案将深度学习作为其基本技术,然而构建深度学习模型并不是一件容易的事,为了获得满意的准确性和效率,通常需要数周的时间优化模型。 模型的优化通常包括网络结构本身和训练参数两个层级,...
  • 深一类 深入学习一类功能。 纸 依存关系 Python 3.6 张量流 凯拉斯 H5py(支持HDF5文件格式) 脾气暴躁的 OpenCV2的 Matplotlib

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,093
精华内容 12,437
关键字:

深度学习调优