随机梯度下降与梯度下降的区别?

如果你还不了解梯度下降请参考:知乎@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)  
原文地址:https://www.cnblogs.com/ailitao/p/11787538.html