精华内容
下载资源
问答
  • Adam 设计用于处理随机梯度下降问题; 即当仅使用小批量数据来估计每次迭代的梯度时,或使用随机 dropout 正则化时 [2]。 有关示例,请参阅 GIT 存储库: https://github.com/DylanMuir/fmin_adam 用法: [x, fval...
  • fmin_adam:亚当随机梯度下降优化算法的Matlab实现
  • 1:随机梯度下降优化算法 一:普通的梯度下降算法在更新回归系数时要遍历整个数据集,是一种批处理方法,这样训练数据特别忙庞大时,可能出现如下问题: 收敛过程可能非常慢; 如果误差曲面上有多个局极小值,那么...

    1:随机梯度下降优化算法

    一:普通的梯度下降算法在更新回归系数时要遍历整个数据集,是一种批处理方法,这样训练数据特别忙庞大时,可能出现如下问题:

    1. 收敛过程可能非常慢;
    2. 如果误差曲面上有多个局极小值,那么不能保证这个过程会找到全局最小值。

    随机梯度下降法随机抽取一个样本来计算误差,然后更新权值
    二: 随机梯度下降
    为了解决上面的问题,实际中我们应用的是梯度下降的一种变体被称为随机梯度下降。
    上面公式中的误差是针对于所有训练样本而得到的,而随机梯度下降的思想是根据每个单独的训练样本来更新权值,这样我们上面的梯度公式就变成了:
    在这里插入图片描述
    经过推导后,我们就可以得到最终的权值更新的公式:
    在这里插入图片描述
    有了上面权重的更新公式后,我们就可以通过输入大量的实例样本,来根据我们预期的结果不断地调整权值,从而最终得到一组权值使得我们的算法能够对一个新的样本输入得到正确的或无限接近的结果。

    举例:图像数字识别

    ①:MNIST数据集:
    官方下载地址:http://yann.lecun.com/exdb/mnist/
    ②:tensorflow
    自行用pip进行安装(window适用于python3.6及以上的版本)
    ③:直接在Pycharm里面建立一个MNIST_data文件夹,将压缩文件导入进去

    # -*- coding:utf-8 -*-
    #@Time  : 2019/7/22 15:20
    import tensorflow as tf
    from tensorflow.examples.tutorials.mnist import input_data
    
    mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
    
    batch_size = 100
    
    n_batch = mnist.train.num_examples // batch_size
    
    x = tf.placeholder(tf.float32, [None, 784])
    y = tf.placeholder(tf.float32, [None, 10])
    
    W = tf.Variable(tf.zeros([784, 10]))
    b = tf.Variable(tf.zeros([10]))
    prediction = tf.nn.softmax(tf.matmul(x, W)+b)
    
    loss = tf.reduce_mean(tf.square(y-prediction))
    
    train_step = tf.train.GradientDescentOptimizer(0.2).minimize(loss)
    init = tf.global_variables_initializer()
    
    correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(prediction, 1))
    
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    
    with tf.Session() as sess:
        sess.run(init)
        for epoch in range(21):
            for batch in range(n_batch):
                batch_xs,batch_ys = mnist.train.next_batch(batch_size)
                sess.run(train_step, feed_dict={x:batch_xs, y:batch_ys})
            acc = sess.run(accuracy, feed_dict={x:mnist.test.images, y:mnist.test.labels})
            print("Iter"+str(epoch)+",Testinng Accuracy"+str(acc))
    

    运行结果:
    Iter0,Testinng Accuracy0.8327
    Iter1,Testinng Accuracy0.87
    Iter2,Testinng Accuracy0.881
    Iter3,Testinng Accuracy0.8884
    Iter4,Testinng Accuracy0.894
    Iter5,Testinng Accuracy0.8971
    Iter6,Testinng Accuracy0.8994
    Iter7,Testinng Accuracy0.9009
    Iter8,Testinng Accuracy0.9034
    Iter9,Testinng Accuracy0.905
    Iter10,Testinng Accuracy0.9059
    Iter11,Testinng Accuracy0.9065
    Iter12,Testinng Accuracy0.9084
    Iter13,Testinng Accuracy0.9097
    Iter14,Testinng Accuracy0.9103
    Iter15,Testinng Accuracy0.9106
    Iter16,Testinng Accuracy0.9123
    Iter17,Testinng Accuracy0.9121
    Iter18,Testinng Accuracy0.9129
    Iter19,Testinng Accuracy0.9129
    Iter20,Testinng Accuracy0.9133

    2:基于冲量的优化算法(Gradient descent with momentum)

    为什么会出现这个算法:

    在我们寻找最优解的时候,出现了一些原因导致机械认为它已经找到了最优解:
    下面三个就是伪最优解:
    ①:plateau(稳定的水平);
    ②:saddle point(鞍点);
    ③:local minima(局部最小点);
    我们这个方法就能够避免出现这种情况,具体的做法如下:
    在现实生活中如何避免小球在局部的最低点停留的情况
    在这里插入图片描述
    由于小球是具有惯性的,这样小球在达到最低点的时候就不会停下,在我们梯度下降法中也给它加上一个冲量,让它在达到那些伪最优解的时候能够冲出去。
    那我们先看看对于我们很一般的梯度下降算法我们要如何去做呢?

    common gradient descent
    在这里插入图片描述
    gradient descent with momentum
    在这里插入图片描述
    通过两个曲线的对比,很直观的感觉就是使用momentum的曲线,

    振荡的幅度变小了;
    而且到达一定地点的时间变短了;
    这就是下面使用momentum的另一个好处,其实这个地方主要是移动加权平均的作用,才使得momentum有如此的优点。

    那在通过直观的去感受一些momentum的应用:
    在这里插入图片
    ===============momentum有可能跳出local minima-----------------------------------

    当然不是说使用了momentum就一定可以达到最优解。下面说明一下这几个点(红色代表梯度下降的方向,虚线绿色代表momentum的方向,蓝色代表实际移动的方向):

    ①:对于第一个点来说。梯度下降的方向是往右的,但是由于我们设置的[公式],所以初始时并没有momentum的作用,所以此时实际移动的方向就是梯度下降的方向。
    ②:对于第二个点来说。梯度下降的方向是向右的,但是此时球现在还有一个向右的冲量(momentum),这个冲量会使小球继续往右移动。
    ③:对于第三个点来说。由于此时是local minima,所以此时的梯度值为0。如果对于普通的梯度下降来说,他就会卡在这个地方。但是我们还有向右的一个冲量值,所以使用momentum的话,实际是会向右边继续走。
    ④:对于第四个点来说。此时我们的梯度下降的方向是向左的,我们可以假设如果此处的冲量值>梯度的值。此时计算,在此处小球就会朝着冲量的方向继续走,他甚至可以冲出山峰,跳出local minima。

    当然这只是momentum的其中一个好处:可以很轻松的跳出伪最优解。下面还有有一个好处,使用速度上来说的。使用gradient descent with momentum,其速度回比传统的梯度下降算法快的多。我们不论是使用bach gradient descent还是使用mini-bachs gradient descent的方法,我们寻找最优解的道路通产都是曲折的,也就是下面这种情况。
    在这里插入图片描述

    寻找最优解
    我们的期望就是想让寻找最优解的曲线能够不那么振荡、波动,希望让他能够更加的平滑,能够在水平方向的速度更快。那怎么去做呢?

    ##知乎:
    ###https://zhuanlan.zhihu.com/p/32335746

    使用能够使得曲线不那么振荡技术,也就是指数移动加权平均。这就是我们momentum技术的原理所在。下面正式的给出momentum的公式:

    在这里插入图片描述
    上面说过使用momentum好处是可以很轻松的跳出伪最优解,其实对于在速度上的解释,就完全可以通过移动加权平均来进行解释。详细的可以看上面的指数移动平均。
    (部分文章来源于知乎深度学习与机器学习算法
    触摸壹缕阳光・关于专栏)

    3:TensorFlow中的优化算法API

    下面是 TensorFlow 中的优化器,
    https://www.tensorflow.org/api_guides/python/train
    在这里插入图片描述
    首先来看一下梯度下降最常见的三种变形 BGD,SGD,MBGD,
    这三种形式的区别就是取决于我们用多少数据来计算目标函数的梯度,
    这样的话自然就涉及到一个 trade-off,即参数更新的准确率和运行时间。

    1. Batch gradient descent

    梯度更新规则:
    BGD 采用整个训练集的数据来计算 cost function 对参数的梯度:
    缺点:
    由于这种方法是在一次更新中,就对整个数据集计算梯度,所以计算起来非常慢,遇到很大量的数据集也会非常棘手,而且不能投入新数据实时更新模型

    我们会事先定义一个迭代次数 epoch,首先计算梯度向量 params_grad,然后沿着梯度的方向更新参数 params,learning rate 决定了我们每一步迈多大。

    Batch gradient descent 对于凸函数可以收敛到全局极小值,对于非凸函数可以收敛到局部极小值。

    1 Stochastic gradient descent

    梯度更新规则:
    和 BGD 的一次用所有数据计算梯度相比,SGD 每次更新时对每个样本进行梯度更新, 对于很大的数据集来说,可能会有相似的样本,这样 BGD 在计算梯度时会出现冗余, 而 SGD 一次只进行一次更新,就没有冗余,而且比较快,并且可以新增样本。

    缺点:
    SGD 因为更新比较频繁,会造成 cost function 有严重的震荡,此外SGD对噪声比较敏感。
    在这里插入图片描述

    BGD 可以收敛到局部极小值,当然 SGD 的震荡可能会跳到更好的局部极小值处。

    当我们稍微减小 learning rate,SGD 和 BGD 的收敛性是一样的。

    1. Mini-batch gradient descent

    梯度更新规则:
    MBGD 每一次利用一小批样本,即 n 个样本进行计算, 这样它可以降低参数更新时的方差,收敛更稳定, 另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。
    和 SGD 的区别是每一次循环不是作用于每个样本,而是具有 n 个样本的Batch。

    超参数设定值:
    n 一般取值在 50~200

    缺点:
    Mini-batch gradient descent 不能保证很好的收敛性,

    ①learning rate 如果选择的太小,收敛速度会很慢,如果太大,loss function 就会在极小值处不停地震荡甚至偏离。

    ②有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小 learning rate,不过这个阈值的设定需要提前写好,这样的话就不能够适应数据集的特点。此外,这种方法是对所有参数更新时应用同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新。

    ③另外,对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,因为鞍点周围的error 是一样的,所有维度的梯度都接近于0,SGD 很容易被困在这里。

    鞍点:一个光滑函数的鞍点邻域的曲线,曲面,或超曲面,都位于这点的切线的不同边。
    例如这个二维图形,像个马鞍:在x-轴方向往上曲,在y-轴方向往下曲,鞍点就是(0,0)
    在这里插入图片描述

    SGD 在 就是曲面的一个方向比另一个方向更陡,这时 SGD 会发生震荡而迟迟不能接近极小值:

    在这里插入图片描述

    梯度更新规则:
    Momentum 通过加入 ,可以加速 SGD, 并且抑制震荡

    当我们将一个小球从山上滚下来时,没有阻力的话,它的动量会越来越大,但是如果遇到了阻力,速度就会变小。
    加入的这一项,可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡。

    超参数设定值:
    一般 取值 0.9 左右。

    缺点:
    这种情况相当于小球从山上滚下来时是在盲目地沿着坡滚,如果它能具备一些先知,例如快要上坡时,就知道需要减速了的话,适应性会更好。

    1. Nesterov accelerated gradient(NAG)

    梯度更新规则:
    用 来近似当做参数下一步会变成的值,则在计算梯度时,不是在当前位置,而是未来的位置上

    超参数设定值:
    仍然取值 0.9 左右。
    效果比较:
    在这里插入图片描述
    蓝色是 Momentum 的过程,会先计算当前的梯度,然后在更新后的累积梯度后会有一个大的跳跃。
    而 NAG 会先在前一步的累积梯度上(brown vector)有一个大的跳跃,然后衡量一下梯度做一下修正(red vector),这种预期的更新可以避免我们走的太快。

    NAG 可以使 RNN 在很多任务上有更好的表现。

    目前为止,我们可以做到,在更新梯度时顺应 loss function 的梯度来调整速度,并且对 SGD 进行加速。

    我们还希望可以根据参数的重要性而对不同的参数进行不同程度的更新。

    1. Adagrad

    这个算法就可以对低频的参数做较大的更新,对高频的做较小的更新,也因此,对于稀疏的数据它的表现很好,很好地提高了 SGD 的鲁棒性,例如识别 Youtube 视频里面的猫,训练 GloVe word embeddings,因为它们都是需要在低频的特征上有更大的更新。

    梯度更新规则:
    其中的平方和。

    Adagrad 的优点是减少了学习率的手动调节

    超参数设定值:
    一般 η 就取 0.01。

    缺点:
    它的缺点是分母会不断积累,这样学习率就会收缩并最终会变得非常小。

    1. Adadelta

    这个算法是对 Adagrad 的改进,

    和 Adagrad 相比,就是分母的的衰减平均值。
    这个分母相当于梯度的均方根 root mean squared (RMS) ,所以可以用 RMS 简写:
    其中 E 的计算公式如下,t 时刻的依赖于前一时刻的平均和当前的梯度:

    梯度更新规则:

    此外,还将学习率 ,这样的话,我们甚至都不需要提前设定学习率了:
    在这里插入图片描述

    超参数设定值:
    γ 一般设定为 0.9,

    1. RMSprop

    RMSprop 是 Geoff Hinton 提出的一种自适应学习率方法。

    RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的。

    梯度更新规则:
    RMSprop 与 Adadelta 的第一种形式相同:

    超参数设定值:
    Hinton 建议设定 为 0.001。

    1. Adam

    这个算法是另一种计算每个参数的自适应学习率的方法。目前在DL领域,是最常见的优化器。

    除了像 Adadelta 和 RMSprop 一样存储了过去梯度的平方 的指数衰减平均值:

    在这里插入图片描述
    如果 被初始化为 0 向量,那它们就会向 0 偏置,所以做了偏差校正,
    通过计算偏差校正后的 mt 和 vt 来抵消这些偏差:
    在这里插入图片描述

    梯度更新规则:
    超参数设定值:
    建议 β1 = 0.9,β2 = 0.999,ϵ = 10e−8
    实践表明,Adam 比其他适应性学习方法效果要好。

    效果比较:

    在这里插入图片描述
    在这里插入图片描述

    如何选择?

    如果数据是稀疏的,就用自适应方法,即 Adagrad, Adadelta, RMSprop, Adam。

    RMSprop, Adadelta, Adam 在很多情况下的效果是相似的。

    Adam 就是在 RMSprop 的基础上加了 bias-correction 和 momentum。

    随着梯度变的稀疏,Adam 比 RMSprop 效果会好。

    整体来讲,Adam 是最好的选择。

    很多论文里都会用 SGD,没有 momentum 等。SGD 虽然能达到极小值,但是比其它算法用的时间长,而且可能会被困在鞍点。

    如果需要更快的收敛,或者是训练更深更复杂的神经网络,需要用一种自适应的算法。

    参考:
    http://sebastianruder.com/optimizing-gradient-descent/index.html#fn:24
    http://www.redcedartech.com/pdfs/Select_Optimization_Method.pdf
    https://stats.stackexchange.com/questions/55247/how-to-choose-the-right-optimization-algorithm

    (TensorFlow中的优化算法API
    原文:https://blog.csdn.net/junchengberry/article/details/81102058

    展开全文
  • 深度学习框架(例如:TensorFlow,Keras,PyTorch)中使用的常见梯度下降优化算法。梯度下降是一种用于寻找函数最小值的优化方法。它通常在深度学习模型中用于通过反向传播来更新神经网络的权重。 VanillaSGD 朴素...

    深度学习框架(例如:TensorFlow,Keras,PyTorch)中使用的常见梯度下降优化算法。梯度下降是一种用于寻找函数最小值的优化方法。 它通常在深度学习模型中用于通过反向传播来更新神经网络的权重。


    Vanilla SGD

    朴素随机梯度下降(Vanilla SGD)通过将当前权重减去其梯度的因子(即\alpha,学习率)来更新权重。​

    \omega_{t+1}=\omega_{t}-\alpha\frac{\partial L}{\partial \omega_{t}}

    该方程式的变化通常被称为随机梯度下降优化器。 它们有3种主要区别方式:

    1. 调整“梯度分量”(\partial L/\partial \omega
      代替像在随机梯度下降中那样仅使用单个梯度来更新权重,而是采用多个梯度的集合。 具体而言,这些优化器使用梯度的指数移动平均值。
    2. 调整“学习率”(\alpha
      根据梯度的大小来调整学习速率,代替保持恒定的学习速率。
    3. (1)和(2)
      调整梯度分量和学习率分量。

    SGD 的缺点在于收敛速度慢,可能在鞍点处震荡。并且,如何合理的选择学习率是 SGD 的一大难点。

    Momentum

    引入动量的梯度下降算法,梯度累积是指数移动平均值。

    \omega_{t+1}=\omega_{t}}-\alpha m_{t}}

    其中,

    m_{t}=\beta m_{t-1} +(1-\beta)\frac{\partial L}{\partial \omega_{t}}

    m初始化为0,一般

    \beta =0.9

    这使得参数中那些梯度方向变化不大的维度可以加速更新,并减少梯度方向变化较大的维度上的更新幅度。由此产生了加速收敛和减小震荡的效果。

    AdaGrad

    对于更新频繁的参数,我们则希望步长较小,使得学习到的参数更稳定,不至于被单个样本影响太多。通过将学习率除以v的平方根来作用于学习率分量, v的平方根是当前梯度与过去平方梯度(即 t-1)的累加和 。像SGD一样,梯度分量保持不变。

    \omega_{t+1}=\omega_{t}-\frac{\alpha}{\sqrt{v_{t}+\epsilon}}\frac{\partial L}{\partial \omega_{t}}

    其中,

    v_{t}=v_{t-1}+\left[ \frac{\partial L}{\partial \omega_{t}} \right]^{2}

    v初始化为0。注意,\epsilon被添加到分母。 Keras将此称为模糊因素,这是一个小的浮点值,可确保分母永远不必除以零。

    \alpha =0.01

    \epsilon=10^{-7}

    此方法在稀疏数据的场景下表现很好。

    RMSprop

    均方根prop或RMSprop是另一种尝试提高AdaGrad的自适应学习率。 而不是像AdaGrad取平方梯度的累加总和,取这些梯度的指数移动平均值。 与动量类似,此更新成为大多数优化程序的学习率组件的标准更新。

    \omega_{t+1}=\omega_{t}-\frac{\alpha}{\sqrt{v_{t}+\epsilon}}\frac{\partial L}{\partial \omega_{t}}

    其中,

    v_{t}=\beta v_{t-1}+(1-\beta )\left[ \frac{\partial L}{\partial \omega_{t}} \right]^{2}

    v=0\alpha =0.001\beta =0.9\epsilon=10^{-6}

    二阶动量采用指数移动平均公式计算,即可避免二阶动量持续累积的问题。

    Adadelta

    与RMSprop一样,Adadelta也是AdaGrad的另一项改进,重点是学习率分量。 Adadelta可能是“adaptive delta”的缩写,此处的delta是指当前权重和新更新的权重之间的差。

    Adadelta和RMSprop之间的区别在于,Adadelta通过将其替换为D(平方增量的指数移动平均值)来完全消除了学习速率参数的使用。

    \omega_{t+1}=\omega_{t}-\frac{\sqrt{D_{t-1}+\epsilon}}{\sqrt{v_{t}+\epsilon}}\frac{\partial L}{\partial\omega_{t}}

    其中

    D_{t}=\beta D_{t-1}+(1-\beta)\left[\Delta\omega_{t} \right]^{2}

    v_{t}=\beta v_{t-1}+(1-\beta)\left[ \frac{\partial L}{\partial \omega_{t}} \right]^{2}

    D=0v=0

    \Delta\omega_{t}=\omega_{t}-\omega_{t-1}

    \beta =0.95

    \epsilon=10^{-6}

    NAG

    投影梯度的指数移动平均值

    \omega_{t+1}=\omega_{t}-\alpha m_{t}

    其中

    m_{t}=\beta m_{t-1}+(1-\beta) \frac{\partial L}{\partial \omega^{*}}

    m=0 ,\beta =0.9

    \partial L/\partial \omega^{*}是投影梯度。 该值必须执行一次正向传播,然后才能最终执行反向传播。

    1. 更新当前\omega到投影权重\omega^{*}\omega^{*}=\omega_{t}-\alpha m_{t-1}
    2. 执行正向传播,要用投影权重
    3. 获得投影梯度\partial L/\partial \omega^{*}
    4. 计算m\omega

    Adam

    自适应矩估计或Adam只是动量和RMSprop的结合:梯度分量用指数移动平均值m和学习率\alpha除以v的平方根(平方梯度的指数移动平均值)(如RMSprop)来获得学习率分量

    \omega_{t+1}=\omega_{t}-\frac{\alpha}{\sqrt{\hat{ v }_{t}+\epsilon}}\hat{ m }_{t}

    其中,

    \hat{ m }_{t}=\frac{m_{t}}{1-\beta^{t}_{1}}

    \hat{v }_{t}=\frac{v_{t}}{1-\beta^{t}_{2}}

    是偏差校正

    m_{t}=\beta_{1} m_{t-1}+(1-\beta_{1})\frac{\partial L}{\partial \omega_{t}}

    v_{t}=\beta_{2} v_{t-1}+(1-\beta_{2})\left[ \frac{\partial L}{\partial \omega_{t}} \right]^{2}

    mv初始化为0

    \alpha=0.001

    \beta_{1}=0.9

    \beta_{2}=0.999

    \epsilon=10^{-8}

    AdaMax

    使用无穷范数(因此称为“ max”)对Adam优化器的改进。  v用梯度p范数的指数移动平均值,近似于最大函数。

    \omega_{t+1}=\omega_{t}-\frac{\alpha}{v_{t}}\hat{ m }_{t}

    其中

    \hat{ m }_{t}=\frac{m_{t}}{1-\beta^{t}_{1}}

    是偏差矫正

    m_{t}=\beta_{1}m_{t-1}+(1-\beta_{1})\frac{\partial L}{\partial \omega_{t}}

    v_{t}=max(\beta_{2}v_{t-1},\left|\frac{\partial L}{\partial \omega_{t}}\right|)

    mv初始化为0

    \alpha=0.002

    \beta_{1}=0.9

    \beta_{2}=0.999

    Nadam

    \omega_{t+1}=\omega_{t}-\frac{\alpha}{\sqrt{\hat{ v }_{t}+\epsilon}}\left( \beta_{1}\hat{ m }_{t-1}+\frac{1-\beta_{1}}{1-\beta^{t}_{1}} \frac{\partial L}{\partial \omega_{t}}\right)

    Nadam使用Nesterov通过将上述等式中的上一个\hat{ m }_{t-1}替换为\hat{ m }_{t}来提前更新梯度:

    \omega_{t+1}=\omega_{t}-\frac{\alpha}{\sqrt{\hat{ v }_{t}+\epsilon}}\left( \beta_{1}\hat{ m }_{t}+\frac{1-\beta_{1}}{1-\beta^{t}_{1}} \frac{\partial L}{\partial \omega_{t}}\right)

    其中,

    \hat{ m }_{t}=\frac{m_{t}}{1-\beta^{t}_{1}}

    \hat{v }_{t}=\frac{v_{t}}{1-\beta^{t}_{2}}

    是偏差校正

    m_{t}=\beta_{1} m_{t-1}+(1-\beta_{1})\frac{\partial L}{\partial \omega_{t}}

    v_{t}=\beta_{2} v_{t-1}+(1-\beta_{2})\left[ \frac{\partial L}{\partial \omega_{t}} \right]^{2}

    mv初始化为0

    \alpha=0.002

    \beta_{1}=0.9

    \beta_{2}=0.999

    \epsilon=10^{-7}

    AMSGrad

    ​重新更改Adam中的自适应学习率分量,并确保当前v始终大于上一个时间步长中的v

     \omega_{t+1}=\omega_{t}-\frac{\alpha}{\sqrt{\hat{ v }_{t}+\epsilon}}\hat{ m }_{t}

    其中

    \hat{ v }_{t}=\max(\hat{ v }_{t-1},v_{t})

    m_{t}=\beta_{1} m_{t-1}+(1-\beta_{1})\frac{\partial L}{\partial \omega_{t}}

    v_{t}=\beta_{2} v_{t-1}+(1-\beta_{2})\left[ \frac{\partial L}{\partial \omega_{t}} \right]^{2}

    \alpha=0.001

    \beta_{1}=0.9

    \beta_{2}=0.999

    \epsilon=10^{-7}

     

     

    展开全文
  • 数据特征是稀疏时 :使用自适应学习速率SGD优化方法(Adagrad、Adadelta、RMSprop与Adam),因为不需要在迭代过程中对学习速率进行人工调整。   RMSprop是Adagrad的一种扩展,与Adadelta类似,但是改进版的Adadelta...

    数据特征是稀疏时 :使用自适应学习速率SGD优化方法(Adagrad、Adadelta、RMSprop与Adam),因为不需要在迭代过程中对学习速率进行人工调整。   RMSprop是Adagrad的一种扩展,与Adadelta类似,但是改进版的Adadelta使用RMS去自动更新学习速率,并且不需要设置初始学习速率。而Adam是在RMSprop基础上使用动量与偏差修正。RMSprop、Adadelta与Adam在类似的情形下的表现差不多。Adam略优于RMSprop,因为其在接近收敛时梯度变得更加稀疏。因此,Adam可能是目前最好的SGD优化方法。

    下降速度 : AdaGrad,RMSProp与AdaDelta的下降速度明显快于SGD,而Adagrad与RMSProp速度相差不大快于AdaDelta。两个动量优化器Momentum,NAG初期下降较慢,后期逐渐提速,NAG后期超过Adagrad与RMSProt。
    Momenum、NAG > AdaGrad,AdaDelta,RMSProp > SGD

    鞍点 :自适应学习率优化器没有进入,Momentum与NAG进入后离开并迅速下降。而SGD进入未逃离鞍点。

    收敛:动量优化器有走岔路,三个自适应优化器中Adagrad初期走了岔路,但后期调整,与另外两个相比,走的路要长,但在快接近目标时,RMSProp抖动明显。SGD走的过程最短,而且方向比较正确。

    展开全文
  • 文章目录线性回归学习目标2.5 梯度下降法介绍1 全梯度下降算法(FG)2 随机梯度下降算法(SG)3 小批量梯度下降算法(mini-bantch)4 随机平均梯度下降算法(SAG)5 算法比较6 梯度下降优化算法(拓展) 学习目标 ...

    线性回归

    学习目标

    • 掌握线性回归的实现过程
    • 应用LinearRegression或SGDRegressor实现回归预测
    • 知道回归算法的评估标准及其公式
    • 知道过拟合与欠拟合的原因以及解决方法
    • 知道岭回归的原理及与线性回归的不同之处
    • 应用Ridge实现回归预测
    • 应用joblib实现模型的保存与加载

    2.5 梯度下降法介绍

    在这里插入图片描述
    上一节中给大家介绍了最基本的梯度下降法实现流程,常见的梯度下降算法有:

    • 全梯度下降算法(Full gradient descent),
    • 随机梯度下降算法(Stochastic gradient descent),
    • 随机平均梯度下降算法(Stochastic average gradient descent)
    • 小批量梯度下降算法(Mini-batch gradient descent),

    它们都是为了正确地调节权重向量,通过为每个权重计算一个梯度,从而更新权值,使目标函数尽可能最小化。其差别在于样本的使用方式不同。

    1 全梯度下降算法(FG)

    计算训练集所有样本误差,对其求和再取平均值作为目标函数。

    权重向量沿其梯度相反的方向移动,从而使当前目标函数减少得最多。

    因为在执行每次更新时,我们需要在整个数据集上计算所有的梯度,所以批梯度下降法的速度会很慢,同时,批梯度下降法无法处理超出内存容量限制的数据集。

    批梯度下降法同样也不能在线更新模型,即在运行的过程中,不能增加新的样本。

    其是在整个训练数据集上计算损失函数关于参数θ的梯度:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZarB83Iz-1583244679496)(../images/GD%E4%B8%8B%E9%99%8D%E5%85%AC%E5%BC%8F.png)]

    2 随机梯度下降算法(SG)

    由于FG每迭代更新一次权重都需要计算所有样本误差,而实际问题中经常有上亿的训练样本,故效率偏低,且容易陷入局部最优解,因此提出了随机梯度下降算法。

    其每轮计算的目标函数不再是全体样本误差,而仅是单个样本误差,即每次只代入计算一个样本目标函数的梯度来更新权重,再取下一个样本重复此过程,直到损失函数值停止下降或损失函数值小于某个可以容忍的阈值。

    此过程简单,高效,通常可以较好地避免更新迭代收敛到局部最优解。其迭代形式为

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GOpsuAVn-1583244679496)(../images/SG%E4%B8%8B%E9%99%8D%E5%85%AC%E5%BC%8F.png)]

    每次只使用一个样本迭代,若遇上噪声则容易陷入局部最优解。

    其中,x(i)表示一条训练样本的特征值,y(i)表示一条训练样本的标签值

    但是由于,SG每次只使用一个样本迭代,若遇上噪声则容易陷入局部最优解。

    3 小批量梯度下降算法(mini-bantch)

    小批量梯度下降算法是FG和SG的折中方案,在一定程度上兼顾了以上两种方法的优点。

    每次从训练样本集上随机抽取一个小样本集,在抽出来的小样本集上采用FG迭代更新权重。

    被抽出的小样本集所含样本点的个数称为batch_size,通常设置为2的幂次方,更有利于GPU加速处理。

    特别的,若batch_size=1,则变成了SG;若batch_size=n,则变成了FG.其迭代形式为

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HgBknoun-1583244679497)(../images/mini-batch%E4%B8%8B%E9%99%8D%E5%85%AC%E5%BC%8F.png)]

    4 随机平均梯度下降算法(SAG)

    在SG方法中,虽然避开了运算成本大的问题,但对于大数据训练而言,SG效果常不尽如人意,因为每一轮梯度更新都完全与上一轮的数据和梯度无关。

    随机平均梯度算法克服了这个问题,在内存中为每一个样本都维护一个旧的梯度,随机选择第i个样本来更新此样本的梯度,其他样本的梯度保持不变,然后求得所有梯度的平均值,进而更新了参数。

    如此,每一轮更新仅需计算一个样本的梯度,计算成本等同于SG,但收敛速度快得多。

    5 算法比较

    为了比对四种基本梯度下降算法的性能,我们通过一个逻辑二分类实验来说明。本文所用的Adult数据集来自UCI公共数据库(http://archive.ics.uci.edu/ml/datasets/Adult)。 数据集共有15081条记录,包括“性别”“年龄”“受教育情况”“每周工作时常”等14个特征,数据标记列显示“年薪是否大于50000美元”。我们将数据集的80%作为训练集,剩下的20%作为测试集,使用逻辑回归建立预测模型,根据数据点的14个特征预测其数据标记(收入情况)。

    以下6幅图反映了模型优化过程中四种梯度算法的性能差异。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-545HSBfe-1583244679497)(../images/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E5%85%AC%E5%BC%8F%E7%AE%97%E6%B3%95%E6%AF%94%E8%BE%83.png)]

    在图1和图2中,横坐标代表有效迭代次数,纵坐标代表平均损失函数值。图1反映了前25次有效迭代过程中平均损失函数值的变化情况,为了便于观察,图2放大了第10次到25次的迭代情况。

    从图1中可以看到,四种梯度算法下,平均损失函数值随迭代次数的增加而减少FG的迭代效率始终领先,能在较少的迭代次数下取得较低的平均损失函数值。FG与SAG的图像较平滑,这是因为这两种算法在进行梯度更新时都结合了之前的梯度;SG与mini-batch的图像曲折明显,这是因为这两种算法在每轮更新梯度时都随机抽取一个或若干样本进行计算,并没有考虑到之前的梯度。

    从图2中可以看到**虽然四条折现的纵坐标虽然都趋近于0,但SG和FG较早,mini-batch最晚。**这说明如果想使用mini-batch获得最优参数,必须对其进行较其他三种梯度算法更多频次的迭代。

    在图3,4,5,6中,横坐标表示时间,纵坐标表示平均损失函数值。

    从图3中可以看出使用四种算法将平均损失函数值从0.7降到0.1最多只需要2.5s,由于本文程序在初始化梯度时将梯度设为了零,故前期的优化效果格外明显。其中SG在前期的表现最好,仅1.75s便将损失函值降到了0.1,虽然SG无法像FG那样达到线性收敛,但在处理大规模机器学习问题时,为了节约时间成本和存储成本,可在训练的一开始先使用SG,后期考虑到收敛性和精度可改用其他算法。

    从图4,5,6可以看出,随着平均损失函数值的不断减小,SG的性能逐渐反超FG,FG的优化效率最慢,即达到相同平均损失函数值时FG所需要的时间最久。

    综合分析六幅图我们得出以下结论:

    (1**)FG方法由于它每轮更新都要使用全体数据集,故花费的时间成本最多,内存存储最大。**

    (2)SAG在训练初期表现不佳,优化速度较慢。这是因为我们常将初始梯度设为0,而SAG每轮梯度更新都结合了上一轮梯度值。

    (3)综合考虑迭代次数和运行时间,SG表现性能都很好,能在训练初期快速摆脱初始梯度值,快速将平均损失函数降到很低。但要注意,在使用SG方法时要慎重选择步长,否则容易错过最优解。

    (4)mini-batch结合了SG的“胆大”和FG的“心细”,从6幅图像来看,它的表现也正好居于SG和FG二者之间。在目前的机器学习领域,mini-batch是使用最多的梯度下降算法,正是因为它避开了FG运算效率低成本大和SG收敛效果不稳定的缺点。

    6 梯度下降优化算法(拓展)

    以下这些算法主要用于深度学习优化

    • 动量法
      • 其实动量法(SGD with monentum)就是SAG的姐妹版
      • SAG是对过去K次的梯度求平均值
      • SGD with monentum 是对过去所有的梯度求加权平均
    • Nesterov加速梯度下降法
      • 类似于一个智能球,在重新遇到斜率上升时候,能够知道减速
    • Adagrad
      • 让学习率使用参数
      • 对于出现次数较少的特征,我们对其采用更大的学习率,对于出现次数较多的特征,我们对其采用较小的学习率。
    • Adadelta
      • Adadelta是Adagrad的一种扩展算法,以处理Adagrad学习速率单调递减的问题。
    • RMSProp
      • 其结合了梯度平方的指数移动平均数来调节学习率的变化。
      • 能够在不稳定(Non-Stationary)的目标函数情况下进行很好地收敛。
    • Adam
      • 结合AdaGrad和RMSProp两种优化算法的优点。
      • 是一种自适应的学习率算法

    参考链接:https://blog.csdn.net/google19890102/article/details/69942970

    展开全文
  • 梯度下降优化算法综述

    万次阅读 多人点赞 2016-09-09 00:21:27
    梯度下降优化算法综述   该文翻译自An overview of gradient descent optimization algorithms。   总所周知,梯度下降算法是机器学习中使用非常广泛的优化算法,也是众多机器学习算法中最常用的优化方法。几乎...
  • 梯度下降优化算法

    千次阅读 2020-05-12 11:44:37
    梯度下降优化算法一、简介二、梯度下降方法2.1 批量梯度下降法BGD2.2 随机梯度下降法SGD2.3 小批量梯度下降法MBGD三、传统梯度下降法面临的挑战四、改进的梯度下降算法4.1 Momentum4.2 Nesterov accelerated ...
  • 随机梯度下降SGD算法理解

    万次阅读 多人点赞 2019-05-29 10:13:21
    随机梯度下降算法(Stochastic gradient descent,SGD)在神经网络模型训练中,是一种很常见的优化算法。这种算法是基于梯度下降算法产生的,所以要理解随机梯度下降算法,必须要对梯度下降算法有一个全面的理解。 ...
  • 文章目录2.5 梯度下降法介绍学习目标1 全梯度下降算法(FG)2 随机梯度下降算法(SG)3 小批量梯度下降算法(mini-batch)4 随机平均梯度下降算法(SAG)5 小结 2.5 梯度下降法介绍 学习目标 知道全梯度下降算法的...
  • 梯度下降优化算法总结

    万次阅读 多人点赞 2017-07-21 22:44:54
    本次介绍梯度下降优化算法。主要参考资料为一篇综述《An overview of gradient descent optimization algorithms》
  • 神经网络优化——梯度下降常用算法:min-batch、随机梯度下降、批处理梯度下降、Momentum、move average、RMSprop、Adma 简介 梯度下降算法是应用于神经网络反向传播过程的计算梯度,然后更新参数,最终找到最优的...
  • 随机梯度下降算法

    千次阅读 2019-03-08 14:57:52
    主要内容:提供不同算法的原理以及效果直观展示,并希望读者能够在实际问题中更合理的选用梯度下降类算法。 目录: 1.简介梯度下降法 2.随机梯度下降 3.随机梯度下降的问题与...4.随机梯度下降优化算法(主要内容)
  • 梯度下降优化算法概述

    万次阅读 2016-02-05 11:24:16
    梯度下降优化算法概述  梯度下降是优化过程中最流行的方法之一并且并广泛运用在优化神经网络的过程中.
  • 在机器学习领域中,梯度下降的方式有三种,分别是:批量梯度下降法BGD、随机梯度下降法SGD、小批量梯度下降法MBGD,并且都有不同的优缺点。下面我们以线性回归算法(也可以是别的算法,只是损失函数(目标函数)不同...
  • 1 简介 梯度下降算法是最常用的神经网络优化算法。常见的深度学习库也都包含了多种算法进行梯度...本文第二部分先简单叙述了常见的梯度下降优化算法;第三部分叙述了神经网络训练过程中存在的挑战;第四部分,我...
  • 梯度下降法、随机梯度下降算法、批量梯度下降 梯度下降:梯度下降就是我上面的推导,要留意,在梯度下降中,对于θ的更新,所有的样本都有贡献,也就是参与调整θ 其计算得到的是一个标准梯度。因而理论上来说一次...
  • 机器学习中的随机梯度下降算法与批量梯度下降算法
  • 一文通透优化算法:从随机梯度、随机梯度下降法到牛顿法、共轭梯度       1 什么是梯度下降法 经常在机器学习中的优化问题中看到一个算法,即梯度下降法,那到底什么是梯度下降法呢? 维基百科给出的定义...
  • 梯度下降方法是目前最流行的神经网络优化方法,并且现在主流的深度学习框架(tensorflow,caffe,keras,MXNET等)都包含了若干种梯度下降迭代...参考文章:梯度下降优化方法总结   梯度下降(gradient descent,GD)...
  • 梯度下降优化算法综述    该文翻译自An overview of gradient descent optimization algorithms。    总所周知,梯度下降算法是机器学习中使用非常广泛的优化算法,也是众多机器学习算法中最常用的优化方法。...
  • 在机器学习领域,体梯度下降算法分为三种 - 批量梯度下降算法(BGD,...- 随机梯度下降算法(SGD,Stochastic gradient descent algorithm) - 小批量梯度下降算法(MBGD,Mini-batch gradient descent algorithm)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 45,931
精华内容 18,372
关键字:

随机梯度下降优化算法