zoukankan      html  css  js  c++  java
  • 随机梯度下降与梯度下降的区别?

    如果你还不了解梯度下降请参考:知乎@Ai酱:{高中生能看懂的}梯度下降是个啥?

    随机梯度下降与梯度下降之间有什么区别?

    假设你已经懂了梯度下降的原理与公式。接下来我会举个例子来讲随机梯度下降与梯度下降的区别。
    假如损失(误差)函数对参数w的导数是x(wxlabel)x(wx - label),然后我们需要更新的参数是ww,学习率是αalpha
    现在有一堆数据(x1,label1),(x2,label2),(xi,labeli),(xn,labeln){(x_1,label_1),(x_2,label_2),(x_i,label_i),(x_n,label_n)}.
    那么梯度下降会这么更新参数w:
    w=wαi=1n(xi(wxilabel))w=w-alpha*sum_{i=1}^n {(x_i(wx_i - label))}
    随机梯度下降会这么做:

    遍历i从1到n{
    w=wα(xi(wxilabel))w=w-alpha* {(x_i(wx_i - label))}
    }

    可以看到梯度下降中的导数部分是把所有样本代入到导数中,然后累加,然后更新参数。而随机梯度下降则是选一个样本计算一个导数,然后马上更新参数
    下面我用伪代码表示下随机梯度下降与梯度下降之间的区别:
    梯度下降

    x = [...]
    lable = [...]
    w = 0.666
    learning_rate = 0.001
    for(循环很多次){
    	df_dw = 0
    	for i in range(len(x)):
    		df_dw += x[i]*(w*x[i]-label[i])
    	pass
    	w = w - learning_rate*df_dw
    }
    

    随机梯度下降

    x = [...]
    lable = [...]
    w = 0.666
    learning_rate = 0.001
    for(循环很多次){
    	for i in range(len(x)):
    		df_dw = x[i]*(w*x[i]-label[i])
    		w = w - learning_rate*df_dw
    }
    

    然后随机梯度下降有很多变种,比如增加动量来加速收敛。
    本来是
    w=w+αf(w)w=w+alpha*f'(w),然后加了动量的就变成了:
    v=γvv=gamma v
    w=w+v+αf(w)w=w+v+alpha*f'(w)

    import math  
    def f(x):  
            return x**3-2*x - 10 +x**2  
      
    def derivative_f(x):  
             return 3*(x**2)+2*-2  
      
      
    x=0.0  
    y=0.0  
    learning_rate = 0.001  
    gradient=0  
    e=0.00000001  
      
    b1 = 0.9  
    b2 = 0.995  
      
    m = 0  
    v = 0  
    t = 0  
      
    for i in range(10000):  
      
      
        print('x = {:6f}, f(x) = {:6f},gradient={:6f}'.format(x,y,gradient))  
        if(abs(gradient)>0.00001 and (abs(gradient)<0.0001)):  
            print("break at "+str(i))  
            break  
        else:  
      
            gradient = derivative_f(x)  
      
            t=t+1  
      
            'mt ← β1 · mt−1 + (1 − β1) · gt '  
            m = b1*m + (1-b1)*gradient  
      
            'vt ← β2 · vt−1 + (1 − β2) · g2'  
            v = b2*v +(1-b2)*(gradient**2)  
      
            'mt ← mt/(1 − βt1)'  
            mt = m/(1-(b1**t))  
      
            'vbt ← vt/(1 − βt2)'  
            vt = v/(1-(b2**t))  
      
      
            x = x- learning_rate * mt/(math.sqrt(vt)+e)  
      
            y=f(x)  
    
  • 相关阅读:
    POJ-2253 Frogger---最短路变形&&最大边的最小值
    POJ-2263 Heavy Cargo---最短路变形&&最小边的最大值
    POJ-2570 Fiber Network---Floyd+二进制表示集合
    POJ-3259 Wormholes---SPFA判断有无负环
    POJ-3268 Silver Cow Party---正向+反向Dijkstra
    Floyd算法
    View相关面试问题-ListView缓存面试问题讲解
    View相关面试问题-事件分发面试问题讲解
    Android基础相关面试问题-binder面试问题详解
    Android异常与性能优化相关面试问题-其他优化面试问题详解
  • 原文地址:https://www.cnblogs.com/ailitao/p/11787538.html
Copyright © 2011-2022 走看看