精华内容
下载资源
问答
  • 先前的研究已经分析了梯度下降(GD)优化器所产生的权重尺度不变的好处:由于步长的自动调整,它导致了稳定的训练。但是,我们表明,结合基于动量的算法,尺度不变性往往会导致权重规范的过度增长。这反过来又过度...

    论文:https://arxiv.org/pdf/2006.08217.pdf
    代码:https://github.com/clovaai/AdamP

    摘要

    诸如batch normalization(BN)等正则化技术已导致深度神经网络性能的显著改善。先前的研究已经分析了梯度下降(GD)优化器所产生的权重尺度不变的好处:由于步长的自动调整,它导致了稳定的训练。但是,我们表明,结合基于动量的算法,尺度不变性往往会导致权重规范的过度增长。这反过来又过度抑制了训练过程中的有效步长,可能会导致深度神经网络中的次优表现。我们在理论和经验上都分析了这种现象。我们提出了一种简单有效的解决方案:在对尺度不变权重(例如,BN层之前的Conv权重)应用基于动量的GD优化器(例如SGD或Adam)的每次迭代中,我们都会删除径向分量(即与权重平行)向量)。直观地,该操作防止了沿径向的不必要的更新,该更新仅增加了重量标准而无助于损失的最小化。我们验证修改后的优化器SGDP和AdamP成功正则了norm增长并改善了广泛模型的性能。我们的实验涉及的任务包括图像分类和检索,目标检测,鲁棒性基准测试和音频分类。

    使用方法

    使用方法,很简单,源码都已封装好,直接调用API替代原有优化器即可。
    先安装:

    pip3 install adamp
    

    其次调包使用:

    from adamp import AdamP
    
    # define your params
    optimizer = AdamP(params, lr=0.001, betas=(0.9, 0.999), weight_decay=1e-2)
    from adamp import SGDP
    
    # define your params
    optimizer = SGDP(params, lr=0.1, weight_decay=1e-5, momentum=0.9, nesterov=True)
    

    后面有时间尝试一下效果。
    好简单复制粘贴是不是?溜了溜了。。。。。。。。

    -------------------------------------更新时间2020.06.23 23:05------------------------------------------------------
    尝试了一下使用SGDP替代SGD,但是精度下降3,4个点。。。。。。。。。。。。。。。
    说明还是要看数据集的。。

    展开全文
  • 模型优化-动量方法

    千次阅读 2019-06-02 18:05:11
    动量梯度下降(Gradient Descent With Momentum),简称为动量方法(Momentum),运行速度几乎总是快于标准的梯度下降算法,并且能够解决随机梯度下降所遇到的山谷震荡以及鞍部停滞问题,这部分内容请阅读上一篇博客...

    动量梯度下降(Gradient Descent With Momentum),简称为动量方法(Momentum),运行速度几乎总是快于标准的梯度下降算法,并且能够解决随机梯度下降所遇到的山谷震荡以及鞍部停滞问题,这部分内容请阅读上一篇博客梯度下降算法

    根据梯度下降算法的参数更新公式:
    w = w − η ∂ L ( w ) ∂ w w = w - \eta\frac{\partial L(w)}{\partial w} w=wηwL(w)
    参数的更新仅仅取决于当前位置的梯度以及步长,试想一下这样一个情境:我们将某一个物品往山谷里丢,在梯度下降算法的规则下,该物品仅仅收到当前触碰在它身上的力,而忽略其他的力,例如重力、空气阻力等等。我们可以把它想象成一张纸团。

    • 山谷:在山谷中不可避免地撞在山壁,由于质量小受山壁弹力的干扰大,从一侧山壁反弹回来撞向另一侧山壁,结果来回震荡地滚下。
    • 鞍部:纸团来到鞍部时,由于质量小,速度很快减为零,无法冲出鞍部区域。

    如果此时,该物品拥有了大质量,例如是一个铁球,

    • 山谷:那么它沿着山谷滚下时,就不容易受到途中旁力的干扰,轨迹会更稳更直。
    • 鞍部:在惯性的作用下继续滚动,从而有机会冲出鞍部。

    在中学物理中,刻画惯性的物理量是动量,这也是该算法名字的由来。沿山谷滚下的铁球会收到沿坡道向下的力和与左右山壁碰撞的弹力。向下的力(重力)稳定不变,产生的动量不断累积,速度越来越快;左右的弹力总是在不停切换,动量累积的结果是相互抵消,减弱了球的来回震荡。因此,与随机梯度下降相比,动量方法的收敛速度更快,收敛曲线也更稳定,见下图。

    随机梯度下降与动量方法比较.png

    相比标准的梯度下降算法,动量梯度下降是算法将动量纳入了参数更新公式中。

    【计算公式】:
    v t = γ v t − 1 + η ∂ L ( w ) ∂ w w = w − v t v_t = \gamma v_{t-1} + \eta \frac{\partial L(w)}{\partial w} \quad w = w - v_t vt=γvt1+ηwL(w)w=wvt
    其中, γ \gamma γ 是衰减系数,扮演阻力的作用。前进步伐 v t v_t vt 由两部分组成:

    • 标准的梯度下降算法部分,也就是步长乘上当前位置的梯度: η ∂ L ( w ) ∂ w \eta \frac{\partial L(w)}{\partial w} ηwL(w)
    • 带衰减的前一次步伐 v t − 1 v_{t-1} vt1

    在该公式中,惯性就体现在对前一次步伐信息的利用。类比中学物理知识,当前梯度就好比当前时刻受力产生的加速度,而步长则是时间,前一次步伐好比前一时刻的速度。标准梯度下降算法在每次行动时,都忽略前一时刻的速度,而重新根据当前时刻的加速度和时间来行走,因此当加速度趋于零时就很难继续移动。而动量方法则考虑前一时刻速度和当前加速度的共同作用。

    不同的文献对于动量方法的计算公式也略有不同,吴恩达老师推荐使用下述的计算公式。
    v t = β v t − 1 + ( 1 − β ) ∂ L ( w ) ∂ w w = w − η v t v_t = \beta v_{t-1} + (1 - \beta)\frac{\partial L(w)}{\partial w} \\ w = w - \eta v_t vt=βvt1+(1β)wL(w)w=wηvt
    至于孰优孰劣暂无定论,大家可各按喜好进行选择。

    动量方法可以嵌入到标准的梯度下降算法中,例如使用动量的随机梯度下降、使用动量的批量梯度下降等等。无论对哪个梯度下降算法,加入动量后都可以加快收敛速度。对于随机梯度下降而言,还可以在一定程度上解决鞍部停滞问题。

    【代码实现】:

    def BatchGradientDescentM(x, y, step=0.001, iter_count=500, beta=0.9):
        length, features = x.shape
        
        # 初始化参数和动量以及整合 x'
        data = np.column_stack((x, np.ones((length, 1))))
        w = np.zeros((features + 1, 1))
        v = np.zeros((features + 1, 1))
        
        # 开始迭代
        for i in range(iter_count):
            # 计算动量
            v = (beta * v + (1 - beta) * np.sum((np.dot(data, w) - y) * data, axis=0).reshape((features + 1, 1))) / length    
            # 更新参数
            w -= step * v        
        return w
    

    同样,增量方法也可以嵌入到小批量梯度下降以及随机梯度下降算法中,具体代码请参考 传送门

    我们也可以将这些算法都整合到一块,通过 batch_size 的大小来判断是批量梯度下降算法,还是随机梯度下降算法。

    【代码实现】:

    def Momentum(x, y, step=0.01, iter_count=1000, batch_size=4, beta=0.9):
        length, features = x.shape
        
        # 初始化参数和动量以及整合 x'
        data = np.column_stack((x, np.ones((length, 1))))
        w = np.zeros((features + 1, 1))
        v = np.zeros((features + 1, 1))
        start, end = 0, batch_size
        
        # 开始迭代
        for i in range(iter_count):
            v = (beta * v + (1 - beta) * np.sum((np.dot(data[start:end], w) - y[start:end]) * data[start:end], axis=0).reshape((features + 1, 1))) / length         
            w -= step * v
            start = (start + batch_size) % length
            if start > length:
                start -= length
            end = (end + batch_size) % length
            if end > length:
                end -= length
        return w
        
    
    # 批量梯度下降
    print(Momentum(x, y, batch_size=(x.shape[0] - 1)))
    # 输出:
    array([[5.00311478],
           [0.8307453 ]])
           
    # 小批量梯度下降
    Momentum(x, y, batch_size=5)
    # 输出:
    array([[4.98144568],
           [1.43164128]])
           
    # 随机梯度下降
    Momentum(x, y, batch_size=1)
    # 输出:
    array([[4.99294353],
           [0.83128473]])
    

    牛顿动量

    受 Nesterov 加速梯度算法启发,Sutskever 提出动量方法的一个变种。与 Momentum 不同的是,Nesterov 先用当前的速度更新参数,再用更新后的临时参数计算梯度。

    【代码实现】:

    def Nesterov(x, y, step=0.01, iter_count=1000, batch_size=4, beta=0.9):
        length, features = x.shape
        data = np.column_stack((x, np.ones((length, 1))))
        w = np.zeros((features + 1, 1))
        v = np.zeros((features + 1, 1))
        start, end = 0, batch_size
        for i in range(iter_count):
            # 先更新参数
            w_temp = w - step * v
            # 再计算梯度与速度
            v = (beta * v + (1 - beta) * np.sum((np.dot(data[start:end], w_temp) - y[start:end]) * data[start:end], axis=0).reshape((features + 1, 1))) / length         
            w -= step * v
            start = (start + batch_size) % length
            if start > length:
                start -= length
            end = (end + batch_size) % length
            if end > length:
                end -= length
        return w
    

    牛顿增量相当于添加了矫正因子的 Momentum 方法,在批量梯度下降算法中能进一步缩小误差,但对于随机梯度下降而言,牛顿增量没有任何改进。

    参考

    • 吴恩达老师的深度学习课程
    • 《百面机器学习》- 深度学习中的动量
    • 深度学习中的动量:https://blog.csdn.net/qq_29462849/article/details/80625063
      • Deep Learning 最优化方法之Nesterov(牛顿动量):https://blog.csdn.net/bvl10101111/article/details/72615961
    展开全文
  • matlab马科维茨代码动量交易优化 财务优化建模的最终项目 在这个项目中,我们结合了简单的动量交易策略和Markovitz投资组合优化。 在确定多头/空头股票清单之后的每个重新平衡日,我们将此股票清单放入markovitz ...
  • 深度学习——动量的最优化方法

    千次阅读 2019-07-19 19:40:41
    本文是Deep Learning 之 最优化方法系列文章的Momentum(动量)方法。主要参考Deep Learning 一书。 整个优化系列文章列表: Deep Learning 之 最优化方法 Deep Learning 最优化方法之SGD Deep Learning 最优化...

    本文是Deep Learning 之 最优化方法系列文章的Momentum(动量)方法。主要参考Deep Learning 一书。

    整个优化系列文章列表:

    Deep Learning 之 最优化方法

    Deep Learning 最优化方法之SGD

    Deep Learning 最优化方法之Momentum(动量)

    Deep Learning 最优化方法之Nesterov(牛顿动量)

    Deep Learning 最优化方法之AdaGrad

    Deep Learning 最优化方法之RMSProp

    Deep Learning 最优化方法之Adam

    先上结论:

    1.动量方法主要是为了解决Hessian矩阵病态条件问题(直观上讲就是梯度高度敏感于参数空间的某些方向)的。

    2.加速学习

    3.一般将参数设为0.5,0.9,或者0.99,分别表示最大速度2倍,10倍,100倍于SGD的算法。

    4.通过速度v,来积累了之间梯度指数级衰减的平均,并且继续延该方向移动:

    这里写图片描述

    再看看算法:
    这里写图片描述

    动量算法直观效果解释:

      如图所示,红色为SGD+Momentum。黑色为SGD。可以看到黑色为典型Hessian矩阵病态的情况,相当于大幅度的徘徊着向最低点前进。
      而由于动量积攒了历史的梯度,如点P前一刻的梯度与当前的梯度方向几乎相反。因此原本在P点原本要大幅徘徊的梯度,主要受到前一时刻的影响,而导致在当前时刻的梯度幅度减小。
      直观上讲就是,要是当前时刻的梯度与历史时刻梯度方向相似,这种趋势在当前时刻则会加强;要是不同,则当前时刻的梯度方向减弱。

    这里写图片描述

    从另一个角度讲:

      要是当前时刻的梯度与历史时刻梯度方向相似,这种趋势在当前时刻则会加强;要是不同,则当前时刻的梯度方向减弱。
      假设每个时刻的梯度g总是类似,那么由这里写图片描述我们可以直观的看到每次的步长为:

    这里写图片描述

    即当设为0.5,0.9,或者0.99,分别表示最大速度2倍,10倍,100倍于SGD的算法。

    展开全文
  • 快牛策略动量反转策略优化论文及Python代码分享给大家
  • 基于动量因子优化学习率的BP神经网络PID参数整定算法.pdf
  • 综述:神经网络的优化-优化器,动量,自适应学习率,批量归一化 xingbod@gmail.com 在本文中,我将讨论与神经网络优化有关的以下概念: 优化面临的挑战 动量 适应性学习率 参数初始化 批量归一化 优化面临的挑战 ...

    综述:神经网络的优化-优化器,动量,自适应学习率,批量归一化

    xingbod@gmail.com


    在本文中,我将讨论与神经网络优化有关的以下概念:

    • 优化面临的挑战
    • 动量
    • 适应性学习率
    • 参数初始化
    • 批量归一化

    优化面临的挑战

    当谈论神经网络中的优化时,我们其实是在讨论非凸优化问题(non-convex optimization)。

    与之对应,凸优化(Convex optimization)中,函数只有一个最优值,对应于全局最优值(最大值或最小值)。对于凸优化问题,没有局部最优的概念,这使得它们相对容易解决-这些是本科和研究生课程中的常见入门优化问题。

    非凸优化涉及具有多个最优值的函数,其中只有一个是全局最优值。根据损失曲面loss surface,很难找到全局最优值

    对于神经网络,我们这里所说的曲线或曲面称为损失曲面。由于我们试图使网络的预测误差最小,因此我们需要在此损失曲面上找到全局最小值-这是神经网络训练的目的。

    针对神经网络训练,有很多相关问题需要考虑:

    • 使用的合理学习率是多少?太小的学习率将花费太长时间才能收敛,而太大的学习率将意味着网络将不会收敛。

    • 我们如何避免陷入局部最优?一个局部最优可能被特别陡峭的损失函数所包围,并且可能难以“逃脱”该局部最优。

    • 如果损失曲面形态发生变化怎么办?即使我们可以找到全局最

    展开全文
  • 基于相似日和动量优化BP神经网络的光伏短期功率预测研究.pdf
  • 优化法——动量

    2021-03-13 18:25:04
    动量梯度下降(Gradient Descent With Momentum),简称为动量方法(Momentum),运行速度几乎总是快于标准的梯度下降算法,并且能够解决随机梯度下降所遇到的山谷震荡以及鞍部停滞问题,这部分内容请阅读上一篇博客...
  • 本文是Deep Learning 之 最优化方法系列文章的Momentum(动量)方法。主要参考Deep Learning 一书。 整个优化系列文章列表: Deep Learning 之 最优化方法 Deep Learning 最优化方法之SGD Deep Learning 最优化...
  • 20210813-华泰证券-深度研究:价值策略表现分析与结合动量优化.rar
  • 20210813-华泰证券-深度研究:价值策略表现分析与结合动量优化.pdf
  • 本文是Deep Learning 之 最优化方法系列文章的Nesterov(牛顿动量)方法。主要参考Deep Learning 一书。 整个优化系列文章列表: Deep Learning 之 最优化方法 Deep Learning 最优化方法之SGD Deep Learning 最...
  • 动量项盲源分离算法及其性能优化策略
  • 动量法 提出动机 在SGD的每次迭代中,梯度下降根据自变量当前位置,沿着当前位置的梯度更新自变量。然而,如果自变量的迭代方向仅仅取决于自变量当前位置可能会带来一些问题。 我们考虑一个二维输入向量x=[x1,x2]Tx ...
  • 在之前的文章《提高动量策略也不难》中跟大家说了一下动量策略的参数优化,今天我们继续优化这个策略。 上一次,这个策略取得的收益是20.3% 上一次优化的方向是持有的股票时间更短,统计股票的涨幅时间更长。 ...
  • 基于全局人工鱼群优化算法的动量常数模盲均衡算法
  • 虽然随机梯度下降仍然是非常受欢迎的优化方法,但其学习过程有时会很慢。动量方法旨在加速学习,特别是处理高曲率、小但一致的梯度,或是带噪声的梯度。动量算法积累了之前梯度指数级衰减的移动平均,并且继续沿该...
  • 文章目录Pytorch Note16 优化算法2 动量法(Momentum)动量法(Momentum)梯度下降法的问题MomentumNesterov Accelerated Gradient代码从0实现pytorch 内置优化器对比 动量 + 不加动量 的 SGD 全部笔记的汇总贴:Pytorch...
  • 动量法 梯度下降存在问题,因为是对整个梯度用学习率做的衰减和增强,所以所有的梯度分量都享受同一个权重学习率,容易造成有些分量衰减的过于缓慢,有些分量震荡的剧烈到最后发散的可能 动量法在一定程度上能解决...
  • 在深度学习中,动量法是用之前积累动量来代替真正的梯度,这样,每个参数实际更新差值取决于最近一段时间内梯度的加权平均值。 当某个参数在最近一段时间内的梯度方向不一致时,参数更新幅度变小;梯度方向一致时,...
  • 优化算法 Momentum 动量 梯度下降 缓解山谷与鞍点的影响 Momentum Nesterov
  • 基于自适应动量因子的BP神经网络优化方法研究.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,789
精华内容 5,515
关键字:

动量优化