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)  
    
  • 相关阅读:
    Pure播放器
    WPF绑定并转换
    WPF的DataTrigger使用
    NancyFx框架之检测任务管理器
    Asp.Net MVC 5使用Identity之简单的注册和登陆
    AspNetCore使用MySQL
    Head First 设计模式之适配器模式与外观模式
    Head First 设计模式之命令模式(CommandPattern)
    Head First 设计模式之工厂模式(Factory Pattern)
    .NET设计规范————类型设计规范
  • 原文地址:https://www.cnblogs.com/ailitao/p/11787538.html
Copyright © 2011-2022 走看看