精华内容
下载资源
问答
  • 本资源包含灰狼优化算法(GWO)代码以及粒子群算法(PSO),主函数为使用灰狼优化和粒子群优化对不同函数进行寻优并将两种算法的比较结果绘图显示
  • 超参数优---贝叶斯优化及其改进(PBT优化

    千次阅读 多人点赞 2020-01-08 21:14:34
    贝叶斯优化 参考文献: 自动机器学习超参数调整(贝叶斯优化)—介绍了例子 贝叶斯优化(Bayesian Optimization)深入理解 贝叶斯优化(BayesianOptimization) 简介 所谓优化,实际上就是一个求极值的过程,数据...

    参考文献:

    自动机器学习超参数调整(贝叶斯优化)—介绍了例子
    贝叶斯优化(Bayesian Optimization)深入理解
    贝叶斯优化(BayesianOptimization)
    贝叶斯网络,看完这篇我终于理解了(附代码)!
    贝叶斯优化: 一种更好的超参数调优方式

    简介

    所谓优化,实际上就是一个求极值的过程,数据科学的很多时候就是求极值的问题。那么怎么求极值呢?很显然,很容易想到求导数,这是一个好方法,但是求导即基于梯度的优化的条件是函数形式已知才能求出导数,并且函数要是凸函数才可以。然而实际上很多时候是不满足这两个条件的,所以不能用梯度优化,贝叶斯优化应运而生了。

    贝叶斯优化常原来解决反演问题,

    (反演问题是指由结果及某些一般原理(或模型)出发去确定表征问题特征的参数(或模型参数))

    贝叶斯优化的好处在于只需要不断取样,来推测函数的最大值。并且采样的点也不多。

    贝叶斯优化方法为什么好

    贝叶斯优化通过基于目标函数的过去评估结果建立替代函数(概率模型),来找到最小化目标函数的值。贝叶斯方法与随机或网格搜索的不同之处在于,它在尝试下一组超参数时,会参考之前的评估结果,因此可以省去很多无用功。

    超参数的评估代价很大,因为它要求使用待评估的超参数训练一遍模型,而许多深度学习模型动则几个小时几天才能完成训练,并评估模型,因此耗费巨大。贝叶斯调参发使用不断更新的概率模型,通过推断过去的结果来“集中”有希望的超参数。

    贝叶斯优化的适用条件

    黑盒优化
    不知道函数的具体形态即表达式,但是如果给定一个x,可以计算y。如果(x,y)够多了,那么就基本知道函数图像的走势了。

    适用于小于20维的空间上优化

    贝叶斯优化的历史与在神经网络中的应用

    Bayesian Optimization(BO)是超参数优化最受欢迎的算法之一,但是因为典型的BO toolboxes都是基于高斯过程,并且主要关注于低维连续优化问题,所以在NAS上没有应用。直到2013年,开始有了一些动作,Swersky et al.使用GP-based的BO算法来推导出用于搜索网络结构的核函数,但是迄今为止都没能找到state-of-the-art的模型。相反一些使用tree-based模型的方法,例如使用treed Parzen estimators的Bergstra et al. 2011,以及使用随机森林的Hutter et al. 2011等都成功地在一系列问题上找到了高维条件空间并且取得了最优的表现

    BO自从2013年开始在NAS领域取得早期的成功,如(Bergstra et al. 2013)得到了最先进的视觉模型,(Domhan et al. 2015)所构建的模型在CIFAR10(没有data augmentation)上取得了最好成绩,(Mendoza et al. 2016)是第一个自动化调参的神经网络模型,并且在与人类专家比赛中获得胜利。

    贝叶斯优化基本原理与流程

    贝叶斯优化是一种近似逼近的方法,用各种代理函数来拟合超参数与模型评价之间的关系,然后选择有希望的超参数组合进行迭代,最后得出效果最好的超参数组合。
    贝叶斯优化问题有四个部分:

    • 目标函数:我们想要最小化/最大化的内容,在这里,目标函数是机器学习模型使用该组超参数在验证集上的损失。
    • 域空间:要搜索的超参数的取值范围
    • 优化算法:构造代理函数,以及选择下一个超参数值的方法(采集函数)。
    • 结果历史记录:来自目标函数评估的存储结果,包括超参数和验证集上的损失。

    算法流程:

    • 1、初始化,随机选择若干组参数x,训练模型,得到相应的模型评价指标y
    • 2、用代理函数来拟合x,y(例如,高斯过程就是一种代理函数)
    • 3、用采集函数来选择最佳的x*
    • 4、将x*带入模型,得到 新的y,然后进入第2步

    贝叶斯优化的经典变种及其文章

    参考:https://www.jianshu.com/p/3587b24f1a6d
    在这里插入图片描述

    • Bayesian Optimization(高斯过程回归)
      贝叶斯优化 (Bayesian Optimization),这个工作最初是由 J Snoek et.在 NIPS 2012 中提出的,并随后多次进行改进 [3, 4]。它要求已经存在几个样本点,并且通过高斯过程回归(假设超参数间符合联合高斯分布)计算前面 n 个点的后验概率分布,得到每一个超参数在每一个取值点的期望均值和方差,其中均值代表这个点最终的期望效果,均值越大表示模型最终指标越大,方差表示这个点的效果不确定性,方差越大表示这个点不确定是否可能取得最大值非常值得去探索,具体的细节分析可以参见这篇博客
      但是这个算法仅仅在低纬空间表现优于 Random Search,而在高维空间和 Random Search 表现相当。
      优点:在低维空间显著优于 Random Search
      缺点:在高维空间仅和 Random Search 相当

      注:这个算法的另一个名称为 Spearmint[2]
      原文:Snoek J, Larochelle H, Adams R P. Practical bayesian optimization of machine learning algorithms[C]//Advances in neural information processing systems. 2012: 2951-2959.

    • TPE
      TPE 算法来源于 Y Bengio 在顶会 NIPS2011 的工作 [7]。 TPE 依旧属于贝叶斯优化,其和 SMAC 也有着很深的渊源。其为一种基于树状结构 Parzen 密度估计的非标准贝叶斯优化算法。相较于其他贝叶斯优化算法,TPE 在高维空间表现最佳。
      优点 1:相比其他贝叶斯优化算法,高维空间的情况下效果更好
      优点 2:相比 BO 速度有显著提升
      缺点:在高维空间的情况下,与 Random Search 效果相当
      注:所有贝叶斯优化算法在高维空间下表现均和 Random Search 相当 [6]
      原文:Bergstra J S, Bardenet R, Bengio Y, et al. Algorithms for hyper-parameter optimization

    • SMAC
      SMAC 算法出自于期刊 LION 2011[5],其论文中表明,由于先前的 SMBO 算法,不支持离散型变量。SMAC 提出使用 Random Forest 将条件概率 p(y|λ) 建模为高斯分布,其中 λ 为超参的选择。这使得它能够很好的支持离散型变量,并在离散型变量和连续型变量的混合的时候有着不错的表现 [6]。
      优点 1:能很好的支持离散型变量,并针对高维空间有一定改善
      优点 2:相比 BO 速度有显著提升
      缺点:效果不稳定,高维空间表现和 Random Search 相当
      原文:Hutter F, Hoos H H, Leyton-Brown K. Sequential model-based optimization for general algorithm configuration

    Python中的贝叶斯优化库

    Python中有几个贝叶斯优化库,它们目标函数的替代函数不一样。
    1、Hyperopt,它使用Tree Parzen Estimator(TPE)。参考:自动化机器学习(AutoML)之自动贝叶斯调参
    2、Spearmint(高斯过程代理)
    3、SMAC(随机森林回归)。

    贝叶斯优化的缺点和解决办法

    • 陷入局部点。对于贝叶斯优化,一个主要需要注意的地方,是一旦它找到了一个局部最大值或最小值,它会在这个区域不断采样,所以它很容易陷入局部最值。
      解决办法:
      为了减轻这个问题,贝叶斯优化算法会在勘探和利用(exploration and exploitation)中找到一个平衡点:
      勘探(exploration),就是在还未取样的区域获取采样点。除了在曲线上扬的方向,在其它的区域也不忘寻找。
      利用(exploitation),就是根据后验分布,在最可能出现全局最值的区域进行采样。在明确的曲线上扬方向继续走,大概率获得更好的结果,但是容易陷入局部最优。

    • 需要消耗大量资源及时间。由于需要至少几十次迭代,即需要训练几十次的模型,因而会造成大量资源、时间消耗。基于这个特点,可以说贝叶斯优化算法适合传统AutoML ,对深度AutoML不是特别好。
      解决办法:将贝叶斯优化与多保真度(如bandit-based方法)相结合

    • 对于那些具有未知平滑度和有噪声的高维、非凸函数,BO算法往往很难对其进行拟合和优化,而且通常BO算法都有很强的假设条件,而这些条件一般又很难满足。
      解决办法:将贝叶斯优化与多保真度(如bandit-based方法)相结合

    • 效果不稳定。由于初始化存在随机性,其效果不稳定。也有论文表明,贝叶斯优化算法并不显著优于随机搜索(random search)

    贝叶斯优化算法(高斯回归过程)

    贝叶斯优化在不知道目标函数(黑箱函数)长什么样子的情况下,通过猜测黑箱函数长什么样,来求一个可接受的最大值。

    • 由于目标函数未知,故不能使用梯度优化算法。
    • 和网格搜索相比,优点是迭代次数少(节省时间),粒度可以到很小,缺点是不容易找到全局最优解。

    优化目标

    贝叶斯优化的主要目的是与大部分机器学习算法类似,学习模型的表达形式 ,在一定范围内求一个函数的最大(小)值:
    m a x f ( x ) max f(x) maxf(x)
    这类 f ( x ) f(x) f(x)往往很特殊:

        1. 没有解析表达或者形式未知,故而没办法用跟梯度有关的优化方法;
    
        2.  值的确定会受到一些外界干预(如人的干预)。
    

    优化流程与核心步骤、核心函数

    输入:
        target:黑箱函数
    	x:自变量取值范围
        Y:可以接受的黑箱函数因变量取值
    输出:
    	x:贝叶斯优化器猜测的最大值的x值
        target(xnew):贝叶斯优化器猜测的最大值的函数值
    

    贝叶斯优化流程图:
    在这里插入图片描述
    贝叶斯优化算法核心步骤如下:
    (1).通过样本点 D = { ( x 1 : t , y 1 : t ) } D=\{(x_{1:t}, y_{1:t})\} D={(x1:t,y1:t)}对高斯过程 进行估计和更新。(简称高斯过程回归)
    (2).通过提取函数 (acquisition function)来指导新的采样。(简称提取/采集)

    贝叶斯优化有两个核心函数,先验函数(Prior Function,PF)与采集函数(Acquisition Function,AC),
    (1)先验函数PF主要利用高斯过程回归(也可以是其它PF函数,但高斯过程回归用的多);
    (2)采集函数AC主要包括EI,PI,UCB这几种方法,同时exploration与exploitation的平衡,也是通过AC来完成的。(采集函数也可以叫效能函数(Utility Funtcion),但一般还是称呼为采集函数)

    高斯过程

    为什么采用高斯过程?
    可表达、平滑、良好校正的方差估计、封闭形式的计算性

    高斯过程(Gaussian process)
    高斯过程常在论文里面简写为GP。定义:如果随机过程的有限维分布均为正态分布,则称此随机过程为高斯过程或正态过程。

    1、第一个问题:什么是随机过程?
    随机过程就是一族随机变量{ X(t), t},其中,t是参数,它属于某个指标集T,T称为参数集。

    注:注意区分随机变量与随机过程。

    • 随机变量的概念,我们都很熟悉,例如:随机变量X,之所以称其为随机变量,是因为它的取值是随机的,即X可能取0,0.4,0.7(只是举例)等有限值。
    • 一般的,随机过程的参数t代表时间,当T={0,1,2,,,}时,随机过程也称为随机序列。
      所谓随机序列,就是当我们在N个间距相等的不同时刻分别观测X这个量,我们会得到一族随机变量,即N个随机变量,姑且记为X(0),X(1),X(2),X(3),X(N-1), 这N个元素每一个都是随机变量。
    • 当在时间T范围内取无数个时刻,即使相邻的时刻间隔趋近于0,则我们就得到随机过程{ X(t), t}了!所以,随机过程就是一个以时间为线索的随机变量的集合。
      -在随机过程{ X(t), t}中,如果固定时刻t,即观察随机过程中的一个随机变量。例如,固定时间为t0, 则X(t0)就是一个随机变量,其取值随着随机试验的结果而变化,变化有一定规律,叫做概率分布.

    随机过程在时刻取的值叫做过程所处的状态,状态的全体集合称为状态空间
    随机变量是定义在状态空间A中的,当固定一次随机实验,即取定 a 0 ∈ A a0 \in A a0A, 则X(t,a0 )$就是一条一个样本的样本路径,它是时间t的函数,可能是连续的,也可能有间断点和跳跃。

    样本空间就是图中蓝紫色的部分,在蓝紫色空间中随便画一条函数(随着X轴变化的函数),都是一个样本路径。(高斯过程取值是随机变量,并没有明显的边界。在此图中,蓝紫色空间的边界是高斯函数的均值+或者-1x方差作为边界,当然也可以取2x方差等作为边界)

    在这里插入图片描述
    2、第二个问题:什么是“随机过程的有限维分布均为正态分布”?
    我们先来看一个随机序列: { x 1 , x 2 . . . x n } \{x_1,x_2...x_n\} {x1,x2...xn}, 这是一个有限维n的序列,我们可以理解为一个无穷维序列 { x ( t ) , t ∈ T } \{x(t), t\in T\} {x(t),tT}进行的n次采样。在这里 t ∈ T t \in T tT可以理解为时间,但是更准确的应该理解为一个连续的指标集。因为其一般性,就可以看成是有限维分布。
    所以“随机过程的有限维分布均为正态分布”就好理解了,即 { x 1 , x 2 . . . x n } \{x_1,x_2...x_n\} {x1,x2...xn}服从一个n元正太分布。

    在贝叶斯优化算法中,我们通常假设 假设我们需要估计的模型 f ( x ) f(x) f(x)服从高斯过程,即:
    f ( x ) ∈ G P ( u , σ ) f(x)\in GP(u,\sigma) f(x)GP(u,σ)

    采集函数(acquisition function)

    从上述高斯过程可以看出,通过高斯过程给出了 f ( x ) f(x) f(x)的概率描述,即 f ( x ) f(x) f(x)在各个x值上的取值概率。那么很自然地,我们希望通过采样来精确这种描述,即选取合适的x点,使得 f ( x ) f(x) f(x)更加接近目标。

    我们看论文的时候经常会在论述acquisition function 的地方看到两种采样思路,一种是explore和exploit:
    acquisition function的目的就旨在平衡这两种采样过程。

    探索(exploration)与利用(exploitation)
      探索(exploration):简单来说就是尽量选择远离已知点的点为下一次用于迭代的参考点,即尽量探索未知的区域,点的分布会尽可能的平均。(也有的文章说,探索就是选择方差大的地方。本质上是一样的,因为根据高斯回归过程,远离已知点的地方方差更大)(在automl中,exploration指的是发现新的架构)
      利用(exploitation):简单来说就是尽量选择靠近已知点的点为下一次用于迭代的参考点,即尽量挖掘已知点周围的点,点的分布会出现一个密集区域,容易进入局部最大。(也有的文章说,利用就是选择方差小的)(在automl中,exploitation指的是利用或共享已经发现的架构中的有用信息,如参数)
      如下,上面的图表示贝叶斯优化器以利用为主,下面图表示贝叶斯优化器以探索为主。
    在这里插入图片描述

    实例阐述

    • 目的:本例的目的是求取最小值
    • 虚线是目标函数(真正的曲线)
    • 实线是通过高斯过程回归得出的均值线
    • 蓝色边界是高斯过程回归得出的不确定性边界(方差)
    • 黄色线由采集函数生成,黄色线上的点是经评估得出的下一个采样点
      在这里插入图片描述

    受约束的贝叶斯优化

    在贝叶斯优化问题中,存在很多约束,如存储空间、时间消耗。
    一个简单的办法是设置惩罚函数。
    高级办法:使用信息理论采集函数的贝叶斯优化框架允许解耦目标函数和约束的评估,从而动态地选择下一个评估。
    参见:book《Automated Machine Learning》—2019 springer出版
    文章 《Bayesian optimization with unknown constraints》—2014

    贝叶斯优化的一个完整例子

    假设我们想知道下面这个黑箱函数在(-2,10)之间的最大值,最大值大概是14,我们假定找到一个点其函数值大于13,就已经可以接受了,返回该函数值。
    在这里插入图片描述
    贝叶斯优化过程中,每一个step产生一个自变量x的采样点。
     (第一个图产生的两个点(红点)其实是初始化过程产生的,和贝叶斯优化没有什么关系,为了方便分析,这里默认初始化的两个点也是贝叶斯优化前两次迭代过程产生的)
     怎么看图?

    • 在经过几次迭代,即标题中的"After xxx Steps",就有几个点的值 ( x , y ) (x,y) (x,y)显示在每次迭代的上面的图中(红点标注)。
    • 每次迭代的上面的图是高斯过程,根据当前的已知点,给出了f(x)的随机过程,即各个x对应的可能 f ( x ) f(x) f(x),
    • 每次迭代的下面的图是采集过程(效用函数),根据UBC推测下一个合适的x点。

    看第9步迭代结果(有九个采样点),可见第9步迭代结果就已经很接近真实的最大值,如果我们认为大于13的结果我们就可以接受,所以第9个确定的点就是可以接受的点,这时贝叶斯优化器就会退出迭代,把该点的值和函数值返回。
    与网格搜索相比较,贝叶斯优化器可以很快地确定一个可以接受的的值,这在求黑箱函数任意函数值的时间复杂度很高时,显得尤其的有优势,同时贝叶斯优化器没有搜索细度的限制。缺点是返回的结果不一定是真实的最大值(网格搜索也不一定能找到)。
    在这里插入图片描述
    在这里插入图片描述)


    下面以第5次迭代到第6次迭代为例,讲解一下具体的步骤
    在这里插入图片描述
     如左上图,在经过了五次迭代后,左上图已经有五个确定的点(红点标出),但是此时的最大的已确定点3达不到预期的要求(假设我们要求找到的点的函数值一定要大于13,不大于13就继续猜),因此贝叶斯优化器需要根据已知的情况(五个确定的点)进一步猜测最大点在哪里,按照UCB策略,贝叶斯优化器就计算出左下的AC函数,AC函数图像我不说也能猜到,就是左上图中的蓝色边界上界,而AC函数最大值就是贝叶斯优化器猜的第六个点的位置,计算该点的函数值,看右上图,发现点6确实比点3好一点,但是还达不到要求,继续猜第7个点的位置,就是右下图新的AC函数取得最大值的位置。
      现在说一下左上图和右上图中的虚线和蓝色区间,虚线表示高斯回归过程求得的未知点的均值μ,同时高斯过程也会给出未知点的标准差σ(和已知点相比,未知点太多了),而蓝色区间就是μ±1.96σ,所以可见越是靠近已知点,标准差越小,越是远离已知点,标准差越大,此时说明高斯过程回归对这个未知点越不确定。

    完整的步骤见图下:
    在这里插入图片描述)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    TPE算法(Tree-Structured Parzen Estimator)

    原文:Bergstra J S, Bardenet R, Bengio Y, et al. Algorithms for hyper-parameter optimization—nips2011
    TPE 依旧属于贝叶斯优化,其和 SMAC 也有着很深的渊源。其为一种基于树状结构 Parzen 密度估计的非标准贝叶斯优化算法。相较于其他贝叶斯优化算法,TPE 在高维空间表现最佳。
    优点 1:相比其他贝叶斯优化算法,高维空间的情况下效果更好
    优点 2:相比 BO 速度有显著提升
    注:所有贝叶斯优化算法在高维空间下表现均和 Random Search 相当 .

    TPE能处理的数据类型

    原文中关于数据类型的描述:

    the configuation space is described using uniform, log-uniform, quantized log-uniform, and categorical variables. In these cases, the TPE algorithm makes the following replacements:
    uniform → truncated Gaussian mixture,
    log-uniform → exponentiated truncated Gaussian mixture,
    categorical → re-weighted categorical

    Python 环境下有一些贝叶斯优化程序库,它们目标函数的代理算法有所区别。本部分主要介绍「Hyperopt」库,它使用树形 Parzen 评估器(TPE)作为搜索算法。该库中可以优化四种参数类型:
    choice(categorial):类别变量
    quniform:离散均匀分布(在整数空间上均匀分布)
    uniform:连续均匀分布(在浮点数空间上均匀分布)
    loguniform:连续对数均匀分布(在浮点数空间中的对数尺度上均匀分布)

    为什么说TPE是树形结构

    参数配置空间是树形的。前面的参数决定了后续要选择使用哪些参数,以及参数的取值范围

    参考:What makes a Tree-Structured Parzen Estimator “tree-structured?”
    It means that your hyperparameter space is tree-like: the value chosen for one hyperparameter determines what hyperparameter will be chosen next and what values are available for it.
    From a HyperOpt example, in which the model type is chosen first, and depending on that different hyperparameters are available:

    space = hp.choice('classifier_type', [
    {
        'type': 'naive_bayes',
    },
    {
        'type': 'svm',
        'C': hp.lognormal('svm_C', 0, 1),
        'kernel': hp.choice('svm_kernel', [
            {'ktype': 'linear'},
            {'ktype': 'RBF', 'width': hp.lognormal('svm_rbf_width', 0, 1)},
            ]),
    },
    {
        'type': 'dtree',
        'criterion': hp.choice('dtree_criterion', ['gini', 'entropy']),
        'max_depth': hp.choice('dtree_max_depth',
            [None, hp.qlognormal('dtree_max_depth_int', 3, 1, 1)]),
        'min_samples_split': hp.qlognormal('dtree_min_samples_split', 2, 1, 1),
    },
    ])
    

    原文:

    In this work we restrict ourselves to tree-structured configuration spaces. Configuration spaces are tree-structured in the sense that some leaf variables (e.g. the number of hidden units in the 2nd layer of a DBN) are only well-defined when node variables (e.g. a discrete choice of how many layers to use) take particular values.

    PBT优化(deepmind 2017年)

    《Population Based Training of Neural Networks》论文解读

    问题分析

    神经网络的训练受模型结构、数据表征、优化方法等的影响。而每个环节都涉及到很多参数(parameters)和超参数(hyperparameters),对这些参数的调节决定了模型的最终效果。通常的做法是人工调节,但这种方式费时费力且很难得到最优解。
    两种常用的自动调参的方式是并行搜索(parallel search)和序列优化(sequential optimisation)。

    • 并行搜索就是同时设置多组参数训练,比如网格搜索(grid search)和随机搜索(random search)。
    • 序列优化很少用到并行,而是一次次尝试并优化,比如人工调参(hand tuning)和贝叶斯优化(Bayesian optimisation)。

    并行搜索的缺点在于没有利用相互之间的参数优化信息。而序列优化这种序列化过程显然会耗费大量时间。
      还有另一个问题是,对于有些超参数,在训练过程中并不是一直不变的。比如监督训练里的学习率,强化学习中的探索度等等。通常的做法是给一个固定的衰减值,而在强化学习这类问题里还会随不同场景做不同调整。这无疑很难找到一个最优的自动调节方式。

    具体方法

    作者提出了一种很朴素的思想,将并行优化和序列优化相结合。既能并行探索,同时也利用其他更好的参数模型,淘汰掉不好的模型。
      在这里插入图片描述
      如图所示,(a)中的序列优化过程只有一个模型在不断优化,消耗大量时间。(b)中的并行搜索可以节省时间,但是相互之间没有任何交互,不利于信息利用。©中的PBT算法结合了二者的优点。
      首先PBT算法随机初始化多个模型,每训练一段时间设置一个检查点(checkpoint),然后根据其他模型的好坏调整自己的模型。若自己的模型较好,则继续训练若不好,则替换(exploit)成更好的模型参数,并添加随机扰动(explore)再进行训练。其中checkpoint的设置是人为设置每过多少step之后进行检查。扰动要么在原超参数或者参数上加噪声,要么重新采样获得。作者还写了几个公式来规范说明这个问题,看起来逼格更高一点,我个人觉得没有必要再写在这里了。
    PBT是一种很通用的方法,可以用于很多场景,其一般套路如下:

    • Step:对模型训练一步。至于一步是一次iteration还是一个epoch还是其它可以根据需要指定。
    • Eval:在验证集上做评估。
    • Ready: 选取群体中的一个模型来进行下面的exploit和explore操作(即perturbation)。这个模型一般是上次做过该操作后经过指定的时间(或迭代次数等)。
    • Exploit: 将那些经过评估比较烂的模型用那些比较牛叉的模型替代。
    • Explore: 对上一步产生的复制体模型加随机扰动,如加上随机值或重采样。

    现有项目

    Google Vizier

    前面已经介绍了Grid search、Random search和Bayesian Optimization等算法,但并不没有完,因为我们要使用这些自动调参算法不可能都重新实现一遍,我们应该关注于自身的机器学习模型实现而直接使用开源或者易用的调参服务。

    近期Google就开放了内部调参系统Google Vizier的论文介绍,感兴趣可以在这里阅读
    paper https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/46180.pdf

    与开源的hyperopt、optunity不同,Vizier是一个service而不是一个library,也就是算法开发者不需要自己部署调参服务或者管理参数存储,只需要选择合适的调参算法,如贝叶斯优化,然后Vizier就会根据模型的一些历史指标推荐最优的超参数组合给开发者,直接使用这些超参数会比自己瞎猜或者遍历参数组合得到的效果更好。当然开发者可以使用Vizier提供的Algorithm Playground功能实现自己的自动调参算法,还有内置一些EarlyStopAlgorithm也可以提前发现一些“没有前途”的调优任务提前结束剩下计算资源。

    目前Google Vizier已经支持Grid search、Random search已经改良过的Bayesian optimization,为什么是改良过的呢?前面提到贝叶斯优化也需要几个初始样本点,这些样本点一般通过随机搜索要产生,这就有冷启动的代价了,Google将不同模型的参数都归一化进行统一编码,每个任务计算的GaussianProcessRegressor与上一个任务的GaussianProcessRegressor计算的残差作为目标来训练,对应的acquisition function也不是简单的均值乘以n倍方差了,这相当于用了迁移学习模型的概念,从paper的效果看基本解决了冷启动的问题,这个模型被称为(Stacked)Batch Gaussian Process Bandit。

    Google Vizier除了实现很好的参数推荐算法,还定义了Study、Trial、Algorithm等非常好的领域抽象,这套系统也直接应用到Google CloudML的HyperTune subsystem中,开发者只需要写一个JSON配置文件就可以在Google Cloud上自动并行多任务调参了。

    Advisor开源项目

    Google Vizier是目前我看过最赞的超参数自动调优服务,可惜的是它并没有开源,外部也只有通过Google CloudML提交的任务可以使用其接口,不过其合理的基础架构让我们也可以重现一个类似的自动调参服务。

    Advisor就是一个Google Vizier的开源实现,不仅实现了和Vizier完全一致的Study、Trial、Algorithm领域抽象,还提供Grid search、Random search和Bayesian optimization等算法实现。使用Advisor很简单,我们提供了API、SDK、Web以及命令行等多种访问方式,并且已经集成Scikit-learn、XGBoost和TensorFlow等开源机器学习框架,基本只要写一个Python函数定义好模型输入和指标就可以实现任意的超参数调优(黑盒优化)功能。

    Advisor使用Python实现,基于Scikit-learn的GPR实现了贝叶斯优化等算法,也欢迎更多开发者参与,开源地址 tobegit3hub/advisor

    Advisor在线服务

    hypertune.cn 是我们提供的在线超参数推荐服务,也是体验Advisor调参服务的最好入口,在网页上我们就可以使用所有的Grid search、Random search、Bayesian optimization等算法功能了。
    首先打开 http://hypertune.cn , 目前我们已经支持使用Github账号登录,由于还没有多租户权限隔离因此不需要登录也可以访问全局信息。在首页我们可以查看所有的Study,也就是每一个模型训练任务的信息,也可以在浏览器上直接创建Study。
    这里需要用户定义Study configuration,也就是模型超参数的search space,和Google Vizier一样我们支持Double、Integer、Discrete和Categorical四种类型的超参数定义,基本涵盖了数值型、字符串、连续型以及离散型的任意超参数类别,更详细的例子如下图。
    定义好Study好,我们可以进入Study详情页,直接点击“Generate Suggestions”按钮生成推荐的超参数组合,这会根据用户创建Study选择的调参算法(如BayesianOptimization)来推荐,底层就是基于Scikit-learn实现的联合高斯分布、高斯过程回归、核技巧、贝叶斯优化等算法实现。
    在这里插入图片描述
    当然我们也可以使用Grid search、Random search等朴素的搜索算法,生成的Trial就是使用的该超参数组合的一次运行,默认是没有objective value的,我们可以在外部使用该超参数进行模型训练,然后把auc、accuracy、mean square error等指标在网页上回填到参数推荐服务,下一次超参数推荐就会基于已经训练得到模型数据,进行更优化、权衡exploritation和exploration后的算法推荐。对于Eearly stop算法,我们还需要每一步的性能指标,因此用户可以提供Training step以及对应的Objective value,进行更细化的优化。
    除了提供在网页上集成推荐算法,我们也集成了Scikit-learn、XGBoost和TensorFlow等框架,在命令行只要定义一个函数就可以自动实现创建Study、获取Trial以及更新Trial metrics等功能,参考 https://github.com/tobegit3hub/advisor/tree/master/examples 。对于贝叶斯优化算法,我们还提供了一维特征的可视化工具,像上面的图一样直观地感受均值、方差、acquisition function的变化,参考 https://github.com/tobegit3hub/advisor/tree/master/visualization 。

    展开全文
  • 粒子群算法及其改进算法

    万次阅读 多人点赞 2019-07-01 19:27:08
    粒子群优化(PSO)算法是KennedyEberhart受 鸟群群体运动的启发于1995年提出的一种新的群智能优化算法[1]。大概的意思就是一片森林里有一群鸟在找一块食物,它们不知道食物具体在哪,但是可以通过感官(例如嗅觉)...

    标准粒子群算法及其改进算法

    首先在这里介绍一下,这个里主要介绍粒子群算法以及一个改进的二阶振荡粒子群算法。

    原理

    粒子群优化(PSO)算法是Kennedy和Eberhart受 鸟群群体运动的启发于1995年提出的一种新的群智能优化算法[1]。大概的意思就是一片森林里有一群鸟在找一块食物,它们不知道食物具体在哪,但是可以通过感官(例如嗅觉)去察觉到自己当前位置距离食物的远近。鸟可以记住自己走过的位置并且知道自己做过的最优位置。这一群鸟的运动都是随机的,这类似于一种穷举法。

    标准粒子群算法

    粒子群算法一般用来找一个函数的最优值。这个函数一般就是适应度函数。
    函数中未知量的个数就是这个查找的空间维度。

    假设有N个粒子组成一个种群S

    Xi是代表粒子i所在的位置,i=1,2,…,N

    Vi代表粒子i在位置Xi处的速度,i=1,2,…,N

    pi是记录粒子i到走过的最优位置,i=1,2,…,N

    pg是所有粒子走过的最优的位置,i=1,2,…,N

    w 为惯性权重

    c1 、 c2 为学习因子

    r1,r2为[ 0 , 1 ]之间均匀分布的参数

    接下来种群中每个粒子按照公式更新速度和位置:

    Vi( t +1 ) =w * Vi( t ) + c1 * r1 * (pi - xi( t ) ) + c2 * r2 * ( pg - xi( t ) ) (1)
    xi( t + 1 ) = xi( t ) + vi( t + 1 ) (2)

    PS:这里的r1、r2是每一步迭代都需要更新的随机数
    c1、c2和w =则是一开始给定的一些参数,至于参数的给定取决于你自己每次测试这个程序所得到的经验–即哪些参数你跑出的结果比较好就选择哪些参数。
    在这里再插一句,在我的实践中认为没有必要去限制迭代过程中速度和位置是否超过最大值,如果在给定区间内存在最优值那么最后还是会迭代回来。只需要在给定的区间内初始化就OK了。在我最开始的测试过程中限制速度和位置是使程序变慢了的,但是我一开始的思路出了问题,到很后面才改正过来也么有再去测试这个,所以就不加评论了。

    算法流程

    在这里插入图片描述

    标准PSO算法代码

    function [xm,fv]=Pso(N,c1,c2,w,M,D)
    %c1:自我学习因子
    %c2:社会学习因子

    %w:惯性权重
    %N:种群数量`
    %M:最大迭代次数
    %D:维数

    %初始化种群、速度和位置
    tic
    for i=1:N
    for j=1:D
    x(i,j)=unifrnd(-10,10);
    v(i,j)=unifrnd(-10,10);
    end
    end

    %根据适应度计算适应度值,初始化pi和pg
    for i=1:N
    y(i)=test(x(i,:));
    pi(i,:)=x(i,:); %y(i,:)为最优位置
    end
    k = find( y == min(y) ) ;
    pg=x(k(1), : ) ;
    %更新位置与速度
    for t=1:M
    for i=1:N
    v(i,:)=wv(i,:)+c1rand*(pi(i,:)-x(i,:))+c2rand(pg-x(i,:));
    x(i,:)=x(i,:)+v(i,:);
    if test(x(i,:))<y(i)
    y(i)=test(x(i,:));
    pi(i,:)=x(i,:);
    end
    if y(i)<test(pg)
    pg=pi(i,:);
    end
    end
    pbest(t)=test(pg);
    end

    %输出结果
    disp(‘最优位置’);
    xm=pg
    disp(‘最优值’);
    fv=test(pg)
    plot(pbest)
    toc

    test函数–就是适应度函数

    function y = test( V )
    y=0;
    b=length(V);
    for i=1:b
    y=y+i*V(i)^2;
    end

    标准粒子群算法的局限性

    为进一步说明标准粒子群算法的局限性,做如下推理:
    设 φ1=c1*r1 ,φ2=c2r2 ,w=1,由式(1)、(2)可转化 为式(3)、(4):
    Vi( t+1) =Vi( t) +φ1(pi -xi(t))+φ2(pg -xi(t)) (3)
    xi(t+1)=xi(t)+vi(t+1) (4)
    已知速度公式Vi+1=Vi +a×Δt ,可得: a=φ1(pi -xi(t))+φ2(pg -xi(t))=xi(t)″ (5)
    化简可得: xi(t)″+(φ1+φ2)xi(t)-(φ1pi +φ2pg)=0 (6)
    式(6)是二阶微分方程,通过二阶微分方程求解公式,求得搜索位置在 t 代的 x(t)的位置路径公式: xi(t)=C1 cos( φ1+φ2t)+C2 sin( φ1+φ2t) (7)
    由式(7)可知,xi(t) 在一个固定区间内波动,即在 该区间中寻找每个粒子第 t 次迭代后的位置,位置函数 xi(t) 没有振荡收敛,算法容易陷入局部最优。
    例如,令 C1=1,C2=1, φ1+φ2 =1 ,可得位置函数 xi(t)=cos(t)+ sin(t)的图像,如图1所示。在该图像中, 对于t∈[ -∞,+∞] , xi(t) 始终在固定上下限 [- 2, 2] 内范围波动,没有振 荡收敛,容易陷入局部最优。因此,在算法中加入振荡 收敛,是跳出局部最优解,提高粒子群算法搜索性能和精度较有效的方法。[1]

    在这里插入图片描述

    改进标准粒子群算法的思想

    胡建秀,曾建潮通过在标准二阶粒子群算法速度迭 代方程中引入二阶振荡环节的方法改进算法,来增加粒 子的多样性,提高算法的全局搜索能力,是改进位置函 数搜索区域较好的改进方法。使用二阶振荡环节后,算法前期具有较强的全局搜索能力,振荡收敛;而在后期强局部搜索,渐近收敛。 该粒子群算法的进化方程如下:
    Vi( t+1) =w×Vi( t ) + φ1(pi -(1+ξ1)xi(t)+ξ1xi(t-1))+ φ2(pg -(1+ξ2)xi(t)+ξ2xi(t-1)) (8) xi(t+1)=xi(t)+vi(t+1) (9) 算法振荡收敛:
    ξ1<2 φ1 -1 φ1 ,
    ξ2<2 φ2 -1 φ2 (10)
    算法渐进收敛:
    ξ1 ≥2 φ1 -1 φ1 ,
    ξ2 ≥2 φ2 -1 φ2 (11) 振荡收敛和渐进收敛示意图如图2和图3所示。[ 1 ]
    在这里插入图片描述

    改进后二阶振荡粒子群算法的迭代公式

    Vi( t+1 ) =w×Vi( t ) + φ1(pi -(1+ξ1)xi(t)+ξ2xi(t-1))+ φ2(pg -(1+ξ3)xi(t)+ξ4xi(t-1)) (12) xi(t+1)=xi(t)+vi(t+1)

    这个公式的实在上面的二阶振荡粒子群算法的基础上进行的改进,这里ξ虽然是随机数但是取值是有限制的:
    设最大迭代次数为Gmax ,
    0<ξ2<1+ξ1 2 ,0<ξ4 <1+ξ3 2 ,0<ξ1<1,0<ξ3<1 当 t < Gmax / 2时,
    ξ1<ξ2-1,ξ3<ξ4 -1,0<ξ2<1,0<ξ4 <1 当 t > Gmax / 2 时
    这么做的意义在于可以时算法在迭代的前半段振荡收敛;
    在迭代的后半段使其渐进收敛。
    这里的证明和上面的二阶振荡粒子群算法的类似,我这就不展开了,感兴趣的可以自己去找我参考的文献。
    PS:关于改进算法的流程图和标准算法的类似,无非就是加了一个迭代次数前一半和后一半参数的改变,这里就不加上去了。

    改进二阶振荡粒子群算法代码

    function [ z , best ] = PSO_1( w , Gmax ,lizishu , weidu ,a , b )
    %这个测试函数的最小值是0,取值范围是[-10 , 10]
    % z是最优点的适应值,best是记录最优位置的坐标

    %lizishu输入需要的粒子数
    %weidu函数的自变量个数
    %a下界
    %b上界
    q=zeros(1,Gmax);
    tic
    p = inf * ones( 1 , lizishu ) ;%初始的最优解默认为inf
    % pg = 0 ;
    A = unifrnd( a , b , lizishu , weidu ) ;%A矩阵是位置矩阵,用于储存每一步计算出的位置
    B = unifrnd( a , b , lizishu , weidu ) ;%B是速度矩阵,用于储存每一布计算出的V
    C = A ;%用于记录每个粒子的最优位置
    D = unifrnd( a , b , lizishu , weidu ) ;%位置矩阵,用于记录上一次迭代的位置
    c = 2 ; %c通常取1.5 , 这是一个经验值
    y = [] ;%给y申请空间
    for i = 1 : lizishu
    y = [ y , test( A( i ,: ) ) ] ;
    end

    for i = 1 : lizishu
    if p( i ) > y( i )
    C( i , : ) = A( i , : ) ;
    end
    p( i ) = min( [ p( i ) , y( i ) ] ) ;%更新局部最优解
    end

    %初始化全局最优解
    k = find( p == min( p ) ) ;
    pg = C( k( 1 ) , : ) ;
    q( i ) = test( pg ) ;

    for i = 1 : Gmax
    i
    r1 = unifrnd( 0 , 1 ) ;
    r2 = unifrnd( 0 , 1 ) ;
    u1 = r1 * c ;
    u2 = r2 * c ;
    if i < Gmax / 2
    g1 = unifrnd( 0 , 1 ) ; % 这里g1是[ 0 , 1 ]上均匀分布的随机数
    g2 = ( 1 + g1 ) / 2 ;
    g3 = unifrnd( 0 , 1 ) ;
    g4 = ( 1 + g3 ) / 2 ;
    for j = 1 : lizishu
    B( j , : ) = w * B( j , : ) + u1 * ( C( j , : ) - ( 1 + g1 ) * A( j , : ) + g2 * D( j , : ) ) + u2 * ( pg - ( 1 + g3 ) * A( j , : ) + g4 * D( j , : ) ) ;
    D = A ;
    A( j , : ) = A( j , : ) + B( j , : ) ;
    end
    else
    g2 = unifrnd( 0 , 1 ) ; % 这里g2是[ 0 , 1 ]上均匀分布的随机数
    g1 = ( g2 - 1 ) / 4 ;
    g4 = unifrnd( 0 , 1 ) ;
    g3 = ( g4 - 1 ) / 4 ;
    for j = 1 : lizishu
    B( j , : ) = w * B( j , : ) + u1 * ( C( j , : ) - ( 1 + g1 ) * A( j , : ) + g2 * D( j , : ) ) + u2 * ( pg - ( 1 + g3 ) * A( j , : ) + g4 * D( j , : ) ) ;
    D = A ;
    A( j , : ) = A( j , : ) + B( j , : ) ;
    end
    end
    y = [] ;%下一次迭代前清空y
    for j = 1 : lizishu
    y = [ y , test( A( j ,: ) ) ] ;
    end

       for j = 1 : lizishu
          if p( j ) > y( j )
            C( j , : ) = A( j , : ) ;
          end
            p( j ) = min( [ p( j ) , y( j ) ] ) ;
       end
    
        k = find( p == min( p ) ) ;%找到最优解的位置
        pg = C( k( 1 ) , : ) ; %保存最优解坐标
        q(i) = test( pg ) ;
    

    end
    z = q( Gmax ) ;
    best = pg ;
    toc
    plot(q)

    test函数

    function y = test( V )
    y=0;
    b=length(V);
    for i=1:b
    y=y+i*V(i)^2;
    end

    两个算法的比较

    PS:上面我只给了一个test函数,要测试其他的函数直接更改test函数即可。
    下面是两个维度跑出来的结果
    1、标准PSO算法:
    在这里插入图片描述
    在这里插入图片描述
    2、改进的二阶振荡PSO算法:
    在这里插入图片描述

    在这里插入图片描述
    在低维度上这两个算法没有太大差别,改进的算法速度上要稍微快一点。

    下面把维度提升到100维:
    PS:为了便于观看我改了一下程序,最后都只输出一个最优值。
    1、这是标准PSO算法跑出的结果:在这里插入图片描述
    很明显这并没有达到最优值,只是一个局部最优。

    2、改进的PSO算法:
    在这里插入图片描述
    可以看到改进的算法的结果在100维下依旧不错,而且很快。

    下面我们尝试1000维:
    改进的PSO算法结果如下:在这里插入图片描述

    我也试过一些最小值是无穷的函数(X^3),以及一些振荡函数(sinx+cosx),都可以跑出结果,这里就不一个个的给出结果了。

    PS:因为第一个算法不是我写的原因,是我同学写的我拿来用的,所以两个代码在风格上差别有点大。
    这个博客的证明部分基本上我都是从下面的文献里直接拿过来的。
    最后如果找出我的错误请告诉我,我会及时改正的。

    参考文献

    [ 1 ] 蒋丽,叶润周,梁昌勇等,改进的二阶振荡粒子群算法[J],计算机工程与应用,2009,55(9):130-139

    展开全文
  • 粒子群算法优化的粒子滤波,非常基础。程序可下载,不懂可以私信问我。希望能够帮助到大家,谢谢
  • 2017年深度学习优化算法最新进展:如何改进SGDAdam方法 转载的文章,把个人觉得比较好的摘录了一下 AMSGrad 这个前期比sgd快,不能收敛到最优。 sgdr 余弦退火的方案比较好 最近的一些研究(Dozat and Manning...

    2017年深度学习优化算法最新进展:如何改进SGD和Adam方法

    转载的文章,把个人觉得比较好的摘录了一下

    AMSGrad 这个前期比sgd快,不能收敛到最优。

    sgdr 余弦退火的方案比较好

    最近的一些研究(Dozat and Manning, 2017[13]、Laine and Aila, 2017[16])通过实验发现,调低β2值,影响了Adam方法中过去平方梯度的指数移动平均值的贡献度。一般来说,β2的默认值为0.999,设置为0.99或0.9后,在不同任务中表现更好,这表明可能存在指数移动平均值的问题。

    关于这个,在yolov3的环境里,我试了一下,没有发现更好

    Zhang在2017年的一个研究表明[2],在调整学习率退火方案和动量参数后,该SGD方法的性能与Adam有得一拼,而且收敛速度更快。另一方面,我们可能认为Adam方法中学习率的自适应性可能模仿了学习速率退火,但是一个明确的退火方案仍然是有帮助的。因为,如果我们把SGD方法中的学习率退火添加到Adam中,它能在机器翻译任务中表现得比SGD方法更好,且更快地收敛[4]。

    事实上,学习率退火方案似乎是一种新的特征工程,因为我们发现,改进的学习率退火方案能改善模型的最终收敛性能。Vaswani等人在2017年给出了一个有趣的例子

    展开全文
  • 神经网络优化和优化算法要点总结

    千次阅读 2020-08-12 20:20:37
        神经网络相比于传统机器学习的最大的特点在于极大地...优化困难:神经网络模型往往拟合的是一个非凸函数,难以找到全局最优值点,且现有的模型大多参数较多,模型复杂,训练效率较低。 ...

        神经网络相比于传统机器学习的最大的特点在于极大地降低了特征提取的难度。但应用过程中仍然存在两个难点:

    • 优化困难:神经网络模型往往拟合的是一个非凸函数,难以找到全局最优值点,且现有的模型大多参数较多,模型复杂,训练效率较低。
    • 泛化困难:神经网络拟合能力过强,在训练集上产生过拟合,在训练过程中需要加入正则化防止过拟合。

    网络优化

    难点:

    1. 网络结构的多样性
    2. 高维变量的非凸优化:低维非凸优化问题主要难点在于如何初始化参数和逃离局部最优点,而高维非凸优化问题难点之一在于怎么逃离鞍点,鞍点在某些维度上梯度为0,但是最优化的目标是找到所有维度上梯度都为0的点,此外,还有容易陷入平坦最小值,由于神经网络的参数存在一定的冗余性,损失函数的局部最小值附近是一个平坦的区域,称为平坦最小值。

    优化算法

    梯度下降的各种方法

        目前,深层神经网络主要通过梯度下降的方式来进行模型优化,梯度下降具体可以分为:批量梯度下降、随机梯度下降以及小批量梯度下降三种形式。
    批量梯度下降:用所有训练数据计算梯度更新值
        优点:保证收敛,如果是凸函数则可收敛到全局最小值
        缺点:计算速度慢,数据量大则对内存要求高,不能够在线学习
    随机梯度下降:每次用一个样本计算梯度更新值
        优点:计算速度快,支持在线学习
        缺点:计算结果方差大,不抗噪声,难以使用矩阵运算加速
    小批量梯度下降:一次用一部分数据(通常选择16,32,64个样本)计算梯度
        优点:抗噪声,可使用矩阵运算加速
        缺点:batch的大小为超参数,需要调参
    总结如下图:
    在这里插入图片描述
    以上明显可以看出小批量梯度下降是最优的选择,也是目前实验使用最为广泛的方法。下面从三个方面详细讨论这种方法:1) 批量大小的选择,2) 学习率 α \alpha α的调整 3) 参数更新方向

    1) 批量大小(Batch Size)

        一般而言,批量大小不影响随机梯度的期望,但是会影响随机梯度的方差,批量越大,方差越小,引入的噪声也越少,训练越稳定,因此可以设置更大的学习率。一个简单有效的方法就是线性缩放规则,当批量大小增加n倍后,学习率也增加n倍,适用于批量大小比较小的时候。

    2)学习率调整

    2.1)学习率衰减(Learning Rate Decay)

    也被称为学习率退火(Learning Rate Annealing),简单来说就是在学习的过程中逐渐降低学习率,方法较多,下面展示一下多种学习率衰减方法的效果图:
    在这里插入图片描述

    2.2) 学习率预热(Learning Rate Warmup)

    在批量较大时,学习率也较大,但由于一开始学习上参数是随机初始化的,梯度往往较大,如果此时使用较大的学习率则会使得训练不稳定。为了提高训练的稳定性,则在最初的几轮迭代中使用较小的学习率,等梯度下降到一定程度后再调高学习率。一种常用的方式就是逐渐预热,假设预热的波数是 T ′ T' T,初始学习率是 α 0 \alpha_0 α0,则预热过程中每次更新学习率为 α t ′ = t T ′ α 0 \alpha_t'=\frac{t}{T'}\alpha_0 αt=Ttα0
    预热完成后,再选择一种学习率衰减方法来降低学习率。

    2.3)周期性学习率调整

    为了使得梯度下降方法能够逃离局部最小值或鞍点,一种经验性的方式是在训练过程中周期性地增大学习率。虽然增加学习率可能短期内有损网络的收敛稳定性,但从长期来看有助于找到更好的局部最优解。周期性学习率调整可以使得梯度下降方法在优化过程中跳出尖锐的局部极小值,虽然会短期内会损害优化过程,但最终会收敛到更加理想的局部极小值。主要介绍两种方法:循环学习率和带热重启的随机梯度下降。效果图如下:
    在这里插入图片描述

    2.4)AdaGrad( Adaptive Gradient)

    在标准的梯度下降方法中,每个参数在每次迭代时都使用相同的学习率。由于每个参数的维度上收敛速度都不相同,因此根据不同参数的收敛情况分别设置学习率,AdaGrad算法借鉴L2正则化的思想,每次迭代时自适应地调整每个参数的学习率。在第t迭代时,先计算每个参数梯度平方的累计值:在这里插入图片描述
    在 Adagrad算法中,如果某个参数的偏导数累积比较大,其学习率相对较小;
    相反,如果其偏导数累积较小,其学习率相对较大。但整体是随着迭代次数的增
    加,学习率逐渐缩小。Adagrad 算法的缺点是在经过一定次数的迭代依然没有找到最优点时,由于这时的学习率已经非常小,很难再继续找到最优点。

    2.5)RMSprop 算法

    RMSprop算法是 一种自适应学习率的方法,可以在有些情况下避免 AdaGrad 算法中学习率不断单调下降以至于过早衰减的缺点。
    在这里插入图片描述

    更详细的对比参考深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)

    3)更新方向优化:

    3.1)动量法

    除了调整学习率之外,还可以通过使用最近一段时间内的平均梯度来代替当前时刻的梯度来作为参数更新的方向
    在这里插入图片描述
    这样,每个参数的实际更新差值取决于最近一段时间内梯度的加权平均值。当某个参数在最近一段时间内的梯度方向不一致时,其真实的参数更新幅度变小;相反,当在最近一段时间内的梯度方向都一致时,其真实的参数更新幅度变大,起到加速作用。一般而言,在迭代初期,梯度方向都比较一致,动量法会起到加速作用,可以更快地到达最优点。在迭代后期,梯度方向会取决不一致,在收敛值附近震荡,动量法会起到减速作用,增加稳定性。

    3.2)Adam算法( Adaptive Moment Estimation)

    自适应动量估计 ( Adaptive Moment Estimation,Adam)算法可以看作是动量法和 RMSprop的结合,不但使用动量作为参数更新方向,而且可以自适应调整学习率。
    Adam算法一方面计算梯度平方 g t 2 g_t^2 gt2的指数加权平均(和 RMSprop类似),另
    一方面计算梯度 g t g_t gt 的指数加权平均(和动量法类似)。
    M t = β 1 M t − 1 + ( 1 − β 1 ) g t M_t=\beta_1M_{t-1}+(1-\beta_1)g_t Mt=β1Mt1+(1β1)gt

    G t = β 2 G t − 1 + ( 1 − β 2 ) g t ⨀ g t G_t=\beta_2G_{t-1}+(1-\beta_2)g_t\bigodot g_t Gt=β2Gt1+(1β2)gtgt
    M t M_t Mt可以看作是梯度的均值, G t G_t Gt可以看作是均值的为减去均值的方差,迭代初期 M t M_t Mt G t G_t Gt的值会比真实的均值和方差要小,因此需要对偏差进行修正。
    在这里插入图片描述

    3.3)梯度截断

    梯度爆炸也是影响学习率的主要因素,当梯度突然增大,用大的梯度进行梯度进行参数更新时,反而会使得其远离最优点,为了避免这种情况,当梯度的值大于一定的阈值后就对梯度进行截断,称为梯度截断。截断有两种方式,一种是按值截断一种是按模截断。
    按值截断:
    g t = m a x ( m i n ( g t , b ) , a ) g_t=max(min(g_t, b), a) gt=max(min(gt,b),a)
    按模截断:
    g t = b ∣ ∣ g t ∣ ∣ g t g_t=\frac{b}{||g_t||}g_t gt=gtbgt

    主要参考:
    邱锡鹏《神经网络与深度学习》

    展开全文
  • 时结果的差别很大,这样就导致了算法优化结果不稳定。 针对粒子群优化算法存在的问题,论文提出了一种新的改进 算法—基于粒子进化的多粒子群优化算法。该算法采用局部版的粒子 群优化方法,从“粒子进化”“多种...
  • 深度学习的基本目标,就是寻找一个泛化能力强的最小值,模型的快速性可靠性也是一个加分点。 随机梯度下降(SGD)方法是1951年由RobbinsMonro提出的[1],至今已有60年历史。在当前的深度学习研究中,这种方法...
  • 粒子群算法改进思路

    万次阅读 2019-03-19 09:13:58
    粒子群优化算法(Partical Swarm Optimization PSO),粒子群中的每一个粒子都代表一个问题的可能解,通过粒子个体的简单行为,群体内的信息交互实现问题求解的智能性.由于PSO操作简单、收敛速度快,因此在函数优化...
  • 粒子群算法PSO万有引力算法GSA结合优化FNN神经网络进行标准数据集的分类,可运行
  • TopOpt | 针对99行改进的88行拓扑优化程序完全注释

    千次阅读 多人点赞 2020-09-14 20:39:23
    Code top88.m References Efficient topology optimization in MATLAB using 88 lines of code The Related Articals (Click in): TopOpt | 99行拓扑优化程序完全注释 >TopOpt | 针对99行改进的88行拓扑优化程序...
  • 组内的相似性(同质性)越大,组间差别越大,聚类就越好。 聚类可以看作是一种分类,它用簇标号创建对象的标记。然而,只能从数据中导出这些标记,它与分类(例如分类决策树等)不同,分类是监督分类,即使用...
  • 性能优化第一课:性能指标

    千次阅读 2020-05-07 22:02:20
    其实“调优”是一个诊断处理手段,我们最终的目标是让系统的处理能力,也就是“性能”达到最优化,这个过程我们就像是一个医生,诊断治疗“应用系统”这位病人。我们以作为医生给系统看病作为对比,“性能优化”...
  • 优化QoS的基于LEACH的无线传感器网络路由协议的改进,刘强,刘晓文,无线传感器网络要求支持多种业务的差别服务和全网范围的资源有效利用,服务质量路由是解决该问题的关键技术之一。在分析无线传感
  • 1、侧重于语言编程应用的廖雪峰 https://www.liaoxuefeng.com/ 2、侧重于高大上算法开源库介绍的莫烦 https://morvanzhou.github.io/ 第二,加深对机器学习算法的理解。 个人理解:经典机器学习算法,例如SVM...
  • 基于人工智能的5G无线网规划和优化

    千次阅读 2018-12-28 20:50:07
    在这方面,本文分析了如何在AI概念的基础上构建未来5G系统中无线接入网规划和优化的自组织网络。提出了一个框架,通过基于学习的分类、预测聚类模型,对来自多个来源的输入数据进行处理,提取相关知识,以驱动5G自...
  • 截至目前为止,还没有深入的刨析kmeans算法的工作原理(会用知道怎么用,跟理解背后深刻的数学原理是有本质区别的,我对此深感敬畏)。今天站在工程应用的角度,刨析kmeans在应用过程的应用和优化。主要是弥补我上篇...
  • SLAM流程之优化后端

    千次阅读 2019-07-09 20:28:19
    SLAM的优化后端完成工作主要是对视觉前端得到的不够准确的相机位姿重建地图进行优化微调。在视觉前端中,不管是进行位姿估计还是建图,都是利用相邻帧之间的关系来完成的,这种依赖局部约束且不停地链式进行的算法...
  • 传统优化算法VS智能优化算法

    千次阅读 2020-12-20 11:05:40
    传统优化算法一般是针对结构化的问题,有较为明确的问题条件描述,如线性规划,二次规划,整数规划,混合规划,带约束不带约束条件等,即有清晰的结构信息;而智能优化算法一般针对的是较为普适的问题描述,普遍...
  • YUV图像实时去雾算法的优化改进

    千次阅读 2016-06-13 15:36:13
    摘要:针对已有的基于DSP的实时去雾算法出现的问题进行优化和改进。在降采样倍数过大时,去雾效果会出现一些副作用,包括纹理细节丢失、块效应亮度偏暗。针对这三个问题,本文采用均值降采样、双线性插值升采样、...
  • LSTM 的几种改进方案

    千次阅读 2020-09-22 11:57:22
    在前面我们很细致地介绍了基本 LSTM 的理论,其实学者们还提出了多种 LSTM 的变种,如 Coupled LSTM、Peephole LSTM、GRU 等等,今天就来看看其中两个比较流行的变体 Peephole connections GRU,它们都可应对梯度...
  • k-means聚类的传统算法和优化

    千次阅读 2018-08-13 21:28:37
     在本篇文章中将对四种聚类算法(K-means,K-means++,ISODATAKernel K-means)进行详细介绍,并利用数据集来真实地反映这四种算法之间的区别。  首先需要明确的是上述四种算法都属于"硬聚类”算法,即数据...
  • 传统优化算法与遗传算法之间的优缺点特点比较

    万次阅读 多人点赞 2017-01-15 09:26:04
    优缺点比较: 传统优化算法优点:1:利用了解空间的特性,如可微等。  2:理论较为完善,计算量小。  3:收敛速度快。  4:具有确定的终止准则。 传统优化算法缺点:1:仅能求出优化问题的局部最优解。
  • PostgreSQL 优化器入门

    千次阅读 2018-11-06 11:49:11
    “这门课从 SQL 示例入手,深入浅出地介绍了 PostgreSQL 优化器技术内幕,让读者能够快速熟悉 PostgreSQL 优化器,对 SQL 优化有非常好的指导作用,值得推荐!” ——谭峰,网名 francs,《PostgreSQL 实战》作...
  •  爱奇艺知识技术团队经过不断探索实践,在《爱奇艺知识音视频通用播放架构实践》文章介绍的播放架构基础上,总结针对性的优化方案,最终实现了多播放场景的平滑切换的极致用户体验,秒播率37%左右的提升。...
  • EEMD算法通过加入噪声来减小EMD的模态效应,CEEMDAN算法通过加入自适应的噪声来进一步减小模态效应,而且具有更好的收敛性。
  • 在看了uwa之前发布的《Unity项目常见Lua解决方案性能比较》,决定动手写一篇关于lua+unity方案的性能优化文。 整合lua是目前最强大的unity热更新方案,毕竟这是唯一可以支持ios热更新的办法。然而作为一个重度ulua...
  • 人们对 GA 进行了大量的研究,提出了各种改进算法用于提高算法的收敛速度精确性. 遗传算法采用选择,交叉,变异操作,在问题空间搜索最优解.经典遗传算法首先对参数进行编码,生成一定数目的个体,形成初始种群...
  • Synchronized原理jdk1.8后的优化

    千次阅读 2020-03-06 15:45:40
    偏向锁 偏向锁无锁的标志位在Mark Work中的标志位都为01,只不过区别在于是否生效来,这也说明任何一个对象被创建出来,都可能是偏向的,具体是否偏向要看具体实现。从偏向锁的定义上可以看出,该锁的着重点在于...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 132,068
精华内容 52,827
关键字:

优化和改进的区别