精华内容
下载资源
问答
  • 带动量随机梯度下降算法中参数更新公式 设动量为 ,其动量更新公式: (是本次更新之前的动量,参考上面的指数加权平均) 动量v其实是负梯度(梯度方向表示上升最快的方向,反方向则表示下降最快的方向)的指数加权...

    1.指数加权平均

    类比n个数求平均:average=\frac{1+2+3+....+n}{n}

    如果 v_{t-1} 表示前 t-1 个数的平均,n_{t} 表示第 t 个数,那么 t 个数的指数加权平均定义为:

                                           v_{t}=\alpha v_{t-1}+\beta n_{t}       

    其展开为:

                                           v_{t-1}=\alpha v_{t-2}+\beta n_{t-1}

                                           v_{t-2}=\alpha v_{t-3}+\beta n_{t-2}

                                             ....

                                           v_{3}=\alpha v_{2}+\beta n_{3}

                                           v_{2}=\alpha v_{1}+\beta n_{2}

                                           v_{1}=\beta n_{1}

                              则有    v_{t}=\alpha (\alpha v_{t-2}+\beta n_{t-1})+\beta n_{t}=\alpha ^{2}v_{t-2}+\alpha \beta n_{t-1}+\beta n_{t}=.......

             全部展开有          v_{t}=\alpha ^{t-1}\beta n_{1}+\alpha ^{t-2}\beta n_{2}+\alpha ^{t-3}\beta n_{3}+.......+\alpha \beta n_{t-1}+\beta n_{t}

        将\beta提取出来得        v_{t}=\beta (\alpha ^{t-1} n_{1}+\alpha ^{t-2} n_{2}+\alpha ^{t-3} n_{3}+.......+\alpha n_{t-1}+ n_{t})

    可以看出来,括号中\alpha即为加权平均系数完整系数应该是\alpha\beta的乘积,为了便于理解此处忽略\beta),又因为\alpha为指数形式,所以称之为指数加权平均。                                

    2.动量

    众所周知,使用梯度下降算法更新参数的公式为:

                                             \Theta=\Theta -\epsilon \Delta\Delta为梯度,\epsilon是学习率)

    在具体的迭代过程中,上式只利用本次迭代计算的梯度更新参数,而加入动量机制则是考虑了之前每次迭代计算的梯度。

     

    3.带动量的随机梯度下降算法中参数更新公式

    设动量为  v  ,其动量更新公式:

                                           v=\alpha {v}'-\epsilon \Delta   ({v}'是本次更新之前的动量,参考上面的指数加权平均)

                                           \Theta =\Theta +v        

     动量v其实是负梯度(梯度方向表示上升最快的方向,反方向则表示下降最快的方向)的指数加权平均,所以v是负数,所以上面的参数更新公式中是加上v,算法如下:

    4.Nesterov动量

    相比于标准动量(上面描述的动量),Nesterov动量在计算梯度\Delta之前,首先用{v}'更新了参数:{\Theta }'=\Theta +\alpha {v}',然后再求梯度。

    其步骤除了求梯度之前更新了参数之外,其他步骤和标准动量的步骤一致,具体算法如下。

     

     

     

    展开全文
  • 梯度下降法不熟悉的可以参考梯度下降法,理解梯度下降法是理解动量梯度下降法的前提,除此之外要搞懂动量梯度下降法需要知道原始方法在实际应用中的不足之处,动量梯度下降法怎样改善了原来方法的不足以及其具体的...

    简介

    动量梯度下降法是对梯度下降法的改良版本,通常来说优化效果好于梯度下降法。对梯度下降法不熟悉的可以参考梯度下降法,理解梯度下降法是理解动量梯度下降法的前提,除此之外要搞懂动量梯度下降法需要知道原始方法在实际应用中的不足之处,动量梯度下降法怎样改善了原来方法的不足以及其具体的实现算法。依次从以下几个方面进行说明:

    • 小批量梯度下降法(mini-batch gradient descent)
    • 指数加权平均(exponential weight averages)
    • 动量梯度下降法(gradient descent with momentum)

    总结一下他们之间的关系:每次梯度下降都遍历整个数据集会耗费大量计算能力,而mini-batch梯度下降法通过从数据集抽取小批量的数据进行小批度梯度下降解决了这一问题。使用mini-batch会产生下降过程中左右振荡的现象。而动量梯度下降法通过减小振荡对算法进行优化。动量梯度下降法的核心便是对一系列梯度进行指数加权平均,下面时详细介绍。

    mini-batch梯度下降法

    在实际应用中,由于样本数量庞大,训练数据上百万是很常见的事。如果每执行一次梯度下降就遍历整个训练样本将会耗费大量的计算机资源。在所有样本中随机抽取一部分(mini-batch)样本,抽取的样本的分布规律与原样本基本相同,事实发现,实际训练中使用mini-batch梯度下降法可以大大加快训练速度。

    • 实现方法

    mini-batch梯度下降法的思想很简单,将样本总体分成多个mini-batch。例如100万的数据,分成10000份,每份包含100个数据的mini-batch-1到mini-batch-10000,每次梯度下降使用其中一个mini-batch进行训练,除此之外和梯度下降法没有任何区别。

    • 直观体验

    38356f5d7b19531339e9179f8ffb817f.png

    区别

    由于mini-batch每次仅使用数据集中的一部分进行梯度下降,所以每次下降并不是严格按照朝最小方向下降,但是总体下降趋势是朝着最小方向,上图可以明显看出两者之间的区别。

    对右边的图来说,动量梯度下降法并没有什么用处。梯度批量下降法主要是针对mini-batch梯度下降法进行优化,优化之后左右的摆动减小,从而提高效率。优化前后的对比如下图,可见动量梯度下降法的摆动明显减弱。

    80ed79f287f7abb8018e9a0fe1e547d7.png

    指数加权平均

    指数加权平均值又称指数加权移动平均值,局部平均值,移动平均值。加权平均这个概念都很熟悉,即根据各个元素所占权重计算平均值。指数加权平均中的指数表示各个元素所占权重呈指数分布。

    假设存在数列{ Q1 , Q2 , Q3 , Q4 . . . . . . . . . . . }

    令: V0 = 0

    V1 = βV0 + ( 1 − β ) Q1

    V2 = βV1 + ( 1 − β ) Q2

    V3 = βV2 + ( 1 − β ) Q3​

    . . . . . . . . .

    其中的 V1 , V2 , V3 . . . . 便称为该数列的指数加权平均。为了更好地理解指数两个字,我们展开 V100​中的所有V(为了方便书写,令 β = 0.9 , 则 1 − β = 0.1 )得到:

    V100​=0.1Q100 + 0.1∗0.9Q99 ​+ 0.1∗0.9∗0.9Q98​ + 0.1∗0.9∗0.9∗0.9Q97​+......+0.1∗0.9...∗0.9Q1​

    观察各项前面的系数不难得到从 Q1 到 Q100​各数权重呈指数分布。其权重大小如下图:

    4e12b692c862e4679acda8137a4cba22.png

    可以看出指数加权平均是有记忆平均,每一个V都包含了之前所有数据的信息。

    动量梯度下降法

    回顾一下梯度下降法每次的参数更新公式:

    W : = W − α dW

    b : = b − α db

    可以看到,每次更新仅与当前梯度值相关,并不涉及之前的梯度。而动量梯度下降法则对各个mini-batch求得的梯度dW,db使用指数加权平均得到 VdW , Vdb。并使用新的参数更新之前的参数。

    例如,在100次梯度下降中求得的梯度序列为:

    { dW1 , dW2 , dW3 . . . . . . . . . dW99 , dW100 }

    则其对应的动量梯度分别为:

    VdW0 = 0

    VdW1 = βVdW0 + (1−β)dW1

    VdW2​​ = βVdW1​​+(1−β)dW2​

    . . . . . . . . .

    VdW100​​=βVdW99​​+(1−β)dW100​

    使用指数加权平均之后梯度代替原梯度进行参数更新。因为每个指数加权平均后的梯度含有之前梯度的信息,动量梯度下降法因此得名。

    用处:

    当本次梯度下降方向与上次更新量的方向相同时,上次的更新量能够对本次的搜索起到一个正向加速的作用。

    当本次梯度下降方向与上次更新量的方向相反时,上次的更新量能够对本次的搜索起到一个减速的作用。

    既减少震荡,又大方向不变(本次梯度下降方向),从而保证了效率和正确的收敛。

    展开全文
  • 随机梯度下降动量详解

    千次阅读 多人点赞 2018-05-23 15:18:33
    随机梯度下降主要用来求解类似于如下求和形式的优化问题: f(x)=∑i=1nfi(w,xi,yi)f(x)=∑i=1nfi(w,xi,yi) f(x) = \sum_{i=1}^nf_i(w,x_i,y_i) 普通梯度下降算法: wt+1=wt−ηt+1∇f(wt)=wt−ηt+1∑i=1n∇fi...

    1. SGD图示

    随机梯度下降


    红色表示SGD的收敛路径,棕色表示梯度下降的收敛路径。普通的GD算法就是计算出每一时刻最陡的下降趋势(梯度),SGD在随机挑选某一分量的梯度方向进行收敛,详细解释可继续往下看。


    2. SGD公式理解


    注:这一部分引用自知乎用户Qi Qi,原回答链接

    随机梯度下降主要用来求解类似于如下求和形式的优化问题:

    f(x)=i=1nfi(w,xi,yi) f ( x ) = ∑ i = 1 n f i ( w , x i , y i )

    普通梯度下降算法:

    wt+1=wtηt+1f(wt)=wtηt+1i=1nfi(wt,xi,yi) w t + 1 = w t − η t + 1 ∇ f ( w t ) = w t − η t + 1 ∑ i = 1 n ∇ f i ( w t , x i , y i )

    n n 很大时,每次迭代计算所有的会非常耗时。fi随机梯度下降的想法就是: 每次在 fi ∇ f i 随机选取一个计算代替如上的 f ∇ f ,以这个随机选取的方向作为下降的方向。

    wt+1=wtηt+1fik(wt,xik,yik) w t + 1 = w t − η t + 1 ∇ f i k ( w t , x i k , y i k )

          由于 E[fik(wt,xik,yik)] E [ ∇ f i k ( w t , x i k , y i k ) ] = f(wt) ∇ f ( w t ) , 当选取学习率 ηt=O(1/t) η t = O ( 1 / t ) 时,算法在期望的意义下收敛。
          注意到在 wt w t 靠近极小值点 w w ∗ 时, f(w) ∇ f ( w ∗ ) ≠ 0,这导致随机梯度下降法精度低。由于方差的存在,要使得算法收敛,就需要 ηt η t 随t逐渐减小。因此导致函数即使在强凸且光滑的条件下,收敛速度也只有 O(1/T) O ( 1 / T ) . 后来提出的变种SAGSVRGSDCA都是在降方差,为了保证在 wt w t w w ∗ 时,方差趋于0。以上提到的几种变种都能达到线性收敛速度。


    3. momentum 动量

    “动量”这个概念源自于物理学,解释力在一段时间内作用所产生的物理量。我们没必要往复杂想,其实我们可以将动量约等于惯性。我们对惯性的基本理解就是: 当你跑起来,由于惯性的存在你跑起来会比刚起步加速的时候更轻松,当你跑过头,想调头往回跑,惯性会让你拖着你。
    在普通的梯度下降法 w=w+v w = w + v 中,每次 x x 的更新量v

    v=ηdw v = − η d w
    当使用动量时,则把每次 x x 的更新量v考虑为本次的梯度下降量 ηdw − η d w 与上次 w w 的更新量v乘上一个介于[0, 1]的因子momentum的和,即 v v
    vt=ηdw+vt1momentum

    如果这一时刻更新度 vt v t 与上一时刻更新度 vt1 v t − 1 的方向相同,则会加速。反之,则会减速。加动量的优势有两点:
    1. 加速收敛
    2. 提高精度(减少收敛过程中的振荡)

    展开全文
  • 文章目录1 SGD实现2 小批量SGD3 动量Momentum 1 SGD实现   以以下式子为例: f(x)=ax+b(y−f(x))2=(y−(ax+b))2dyda=−2x(y−(ax+b))dydb=−2(y−(ax+b)) \begin{aligned} f(x) &= a x+b \\ (y-f(x))^{2} &...

    1 SGD实现

      以以下式子为例:

    f ( x ) = a x + b ( y − f ( x ) ) 2 = ( y − ( a x + b ) ) 2 d y d a = − 2 x ( y − ( a x + b ) ) d y d b = − 2 ( y − ( a x + b ) ) \begin{aligned} f(x) &= a x+b \\ (y-f(x))^{2} & =(y-(a x+b))^{2} \\ \frac{d y}{d a} &=-2 x(y-(a x+b)) \\ \frac{d y}{d b} &=-2(y-(a x+b)) \end{aligned} f(x)(yf(x))2dadydbdy=ax+b=(y(ax+b))2=2x(y(ax+b))=2(y(ax+b))  测试样本生成函数如下:

    import numpy as np
    import matplotlib.pyplot as plt
    from sympy import symbols, diff
    
    
    def get_data():
        ret_x = np.linspace(-1, 1, 100)
        f_x = lambda x: 2 * x + 3
    
        return ret_x, [f_x(val) for val in ret_x]
    

    测试1:SGD简化版

    def test1():
        x, y = get_data()
        n = len(x)
        idx = list(range(n))
        a, b = 0, 0
        g_a, g_b = grad()
        move_a, move_b = [a], [b]
        lr, n_iter = 0.1, 10
        for i in range(n_iter):
            np.random.shuffle(idx)
            for j in idx:
                a -= lr * g_a.subs({"x": x[j], "y": y[j], "a": a, "b": b})
                b -= lr * g_b.subs({"x": x[j], "y": y[j], "a": a, "b": b})
                move_a.append(a)
                move_b.append(b)
    
        plt.plot(move_a[:100])
        plt.plot(move_b[:100])
        plt.show()
    
    
    if __name__ == '__main__':
        test1()
    


      这里与梯度下降GD的区别在于打乱了更新样本的顺序。

    2 小批量SGD

    测试2:小批量SGD

    import numpy as np
    import matplotlib.pyplot as plt
    from sympy import symbols, diff
    
    
    def get_data():
        ret_x = np.linspace(-1, 1, 100)
        f_x = lambda x: 2 * x + 3
    
        return ret_x, [f_x(val) for val in ret_x]
    
    
    def grad():
        x, y, a, b = symbols(["x", "y", "a", "b"])
        loss = (y - (a * x + b))**2
        grad_a = diff(loss, a)
        grad_b = diff(loss, b)
    
        return grad_a, grad_b
    
    
    def test2():
        x, y = get_data()
        n = len(x)
        idx = list(range(n))
        a, b = 0, 0
        g_a, g_b = grad()
        move_a, move_b = [a], [b]
        lr, n_iter, batch_size = 0.1, 100, 50
        shuffle = True
        for i in range(n_iter):
            if shuffle:
                np.random.shuffle(idx)
            batch_idxes = [idx[k: (k + batch_size)] for k in range(0, n, batch_size)]
            for idxes in batch_idxes:
                g_sum_a, g_sum_b = 0, 0
                for j in idxes:
                    g_sum_a += g_a.subs({"x": x[j], "y": y[j], "a": a, "b": b})
                    g_sum_b += g_b.subs({"x": x[j], "y": y[j], "a": a, "b": b})
                a -= lr * g_sum_a / batch_size
                b -= lr * g_sum_b / batch_size
                move_a.append(a)
                move_b.append(b)
    
        plt.plot(move_a)
        plt.plot(move_b)
        plt.show()
    
    
    if __name__ == '__main__':
        test2()
    
    


      更加稳定了。

    3 动量Momentum

      通过引入参数 γ \gamma γ而加速收敛:
    v t = γ v t − 1 + l r ∗ g r a d θ = θ − v t = θ − γ v t − 1 − l r ∗ g r a d \begin{aligned} v_t & = \gamma v_{t - 1} + lr * grad\\ \theta & = \theta - v_t = \theta - \gamma v_{t - 1} - lr * grad \end{aligned} vtθ=γvt1+lrgrad=θvt=θγvt1lrgrad
    测试3:动量版的小批量SGD

    def test3():
        x, y = get_data()
        n = len(x)
        idx = list(range(n))
        a, b, v_a, v_b = 0, 0, 0, 0
        g_a, g_b = grad()
        move_a, move_b = [a], [b]
        lr, n_iter, batch_size, gamma = 0.2, 10, 20, 0.5
        shuffle = True
        for i in range(n_iter):
            if shuffle:
                np.random.shuffle(idx)
            batch_idxes = [idx[k: (k + batch_size)] for k in range(0, n, batch_size)]
            for idxes in batch_idxes:
                g_sum_a, g_sum_b = 0, 0
                for j in idxes:
                    g_sum_a += g_a.subs({"x": x[j], "y": y[j], "a": a, "b": b})
                    g_sum_b += g_b.subs({"x": x[j], "y": y[j], "a": a, "b": b})
                v_a = gamma * v_a + lr * g_sum_a / batch_size
                v_b = gamma * v_b + lr * g_sum_b / batch_size
                a -= v_a
                b -= v_b
                move_a.append(a)
                move_b.append(b)
    
        plt.plot(move_a)
        plt.plot(move_b)
        plt.show()
    
    
    if __name__ == '__main__':
        test3()
    


      起飞了兄弟们( ̄︶ ̄)↗


    参考文献
    【1】https://towardsdatascience.com/stochastic-gradient descent-momentum-explanation-8548a1cd264e

    展开全文
  • 应该用梯度下降,随机梯度下降,还是Adam方法?这篇文章介绍了不同优化算法之间的主要区别,以及如何选择最佳的优化方法。优化算法的功能,是通过改善训练方式,来最小化(或最大化)损失函数E(x)。模型内部有些参数,...
  • 梯度下降、随机梯度下降、小批量梯度下降、动量梯度下降、Nesterov加速梯度下降法前言梯度下降法(Gradient Descent / GD)单变量线性回归模型(Univariate Linear Regression)批梯度下降法(Batch Gradient ...
  • 动量梯度下降的优势

    千次阅读 2018-07-13 14:13:23
    普通的梯度下降算法在寻找最优解的过程中会酱紫:可以看到是存在不断抖动的使用了带动量的梯度下降,由于梯度的计算使用了指数加权平均方法,使得本次梯度的计算和之前是有关联的,这样就能抵消比如梯度在上下摆动的...
  • 随机梯度下降法,支持动量参数,支持学习衰减率,支持Nesterov动量 参数: lr:大或等于0的浮点数,学习率 momentum:大或等于0的浮点数,动量参数 decay:大或等于0的浮点数,每次更新后的学习率衰减值
  • 随机梯度下降动量法 Momentum

    千次阅读 2019-05-21 18:45:10
    转自:https://blog.csdn.net/BVL10101111/article/details/72615621 (下面选中的这句话很直观)
  • 随机梯度下降、牛顿法、动量法、Nesterov、AdaGrad、RMSprop、Adam”随机梯度下降法牛顿法动量法Nesterov学习率应该慢慢减小的。AdaGradRMSpropAdamNadam 随机梯度下降法 怎么减小每次计算的参数量? 梯度下降法性...
  • 简述动量Momentum梯度下降

    万次阅读 多人点赞 2017-09-12 13:53:17
    在普通的随机梯度下降和批梯度下降当中,参数的更新是按照如下公式进行的:W = W - αdW b = b - αdb其中α是学习率,dW、db是cost function对w和b的偏导数。 随机梯度下降和批梯度下降的区别只是输入的数据分别...
  • 动量Momentum梯度下降

    2019-08-09 12:09:30
    在普通的随机梯度下降和批梯度下降当中,参数的更新是按照如下公式进行的: W = W - αdW b = b - αdb 其中α是学习率,dW、db是cost function对w和b的偏导数。 随机梯度下降和批梯度下降的区别只是输入的数据...
  • 应该用梯度下降,随机梯度下降,还是Adam方法?这篇文章介绍了不同优化算法之间的主要区别,以及如何选择最佳的优化方法。什么是优化算法?优化算法的功能,是通过改善训练方式,来最小化(或最大化)损失函数E(x)。...
  • BP 神经网络基础数学模型
  • 动量梯度下降法(gradient descent with momentum)

    万次阅读 多人点赞 2018-10-28 10:57:35
    梯度下降法不熟悉的可以参考梯度下降法,理解梯度下降法是理解动量梯度下降法的前提,除此之外要搞懂动量梯度下降法需要知道原始方法在实际应用中的不足之处,动量梯度下降法怎样改善了原来方法的不足以及其具体的...
  • 动量梯度下降法 Momentum

    千次阅读 2019-09-14 21:33:11
    动量梯度下降法是对梯度下降法的一种优化算法,该方法学习率可以选择更大的值,函数的收敛速度也更快。 梯度下降法就像下面这张图,通过不断的更新 w与b,从而让函数移动到红点,但是要到达最优解,需要我们不断的...
  • 首先来看看梯度下降的一个直观的解释。比如我们在一座大山上的某处位置,由于我们不知道怎么下山,于是决定走一步算一步,也就是在每走到一个位置的时候,求解当前位置的梯度,沿着梯度的负方向,也就是当前最陡峭的...
  • 动量梯度下降(momentum)

    千次阅读 2020-08-15 12:01:56
    梯度下降法不熟悉的可以参考梯度下降法,理解梯度下降法是理解动量梯度下降法的前提,除此之外要搞懂动量梯度下降法需要知道原始方法在实际应用中的不足之处,动量梯度下降法怎样改善了原来方法的不足以及其具体的...
  • 动量梯度下降法详解

    千次阅读 2019-04-25 16:49:54
    梯度下降法不熟悉的可以参考梯度下降法,理解梯度下降法是理解动量梯度下降法的前提,除此之外要搞懂动量梯度下降法需要知道原始方法在实际应用中的不足之处,动量梯度下降法怎样改善了原来方法的不足以...
  • 改动源数据地址即可运行
  • 在普通的随机梯度下降和批梯度下降当中,参数的更新是按照如下公式进行的: W = W - αdW b = b - αdb 其中α是学习率,dW、db是cost function对w和b的偏导数。 随机梯度下降和批梯度下降的区别是输入的数据分别...
  • 简述动量梯度下降

    2018-11-25 12:36:11
    梯度下降是机器学习中用来使模型逼近真实分布...在普通的随机梯度下降和批梯度下降当中,参数的更新是按照如下公式进行的: W = W - αdW  b = b - αdb 其中α是学习率,dW、db是cost function对w和b的偏导数。...
  • 随机梯度下降算法

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

    千次阅读 2018-08-31 15:15:44
    Gradient Descent with momentum In one sentence, the basic idea is to compute an exponentially weighted average of your gradients, and then use that gradient to update your weights instead. ...
  • SGD随机梯度下降2. Momentum3. Adagrad4. RMSprop5. Adam数据预处理1. 中心化2. 标准化3. PCA主成分分析4. 白噪声权重初始化1. 随机初始化2. 稀疏初始化3. 初始化偏置(bias)4. 批标准化(Batch Noemalization)...
  • 详解随机梯度下降法(Stochastic Gradient Descent,SGD)

    千次阅读 多人点赞 2021-02-28 22:18:28
    深度学习最常用的优化方法就是随机梯度下降法,但是随机梯度下降法在某些情况下会失效,这是为什么呢?着这个问题我们接着往下看。 一个经典的例子就是假设你现在在山上,为了以最快的速度下山,且视线良好,你...
  • 梯度下降法:对1到M这些给出的数据计算损失函数之和的均值求导更新参数,a为学习率(用于决定我们学习的步长)通俗一点将过程就相当于:1 遍历我们所有的数据(求损失函数均值)2 环顾四方,寻找一个最优(损失函数...
  • 然而,可以说深度学习的核心是一个梯度下降求极值的过程,本文主要从梯度的概念求法,偏微分的求导公式,梯度的求导公式,激活函数以及MSE损失和交叉熵损失以及pytorch中对应的API来浅层次的讲解原理,深层次的原理...
  • 请参考随机梯度下降。 梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。 梯度的定义本身...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,032
精华内容 3,612
热门标签
关键字:

带动量的随机梯度下降