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

本文探讨随机梯度下降与梯度下降的区别,解释两种方法在更新参数上的差异,并通过实例说明。梯度下降通过考虑所有样本的导数累加更新参数,而随机梯度下降则每次仅使用一个样本的导数进行更新。此外,还提到了随机梯度下降的动量优化策略。

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

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

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

遍历i从1到n{
w = w − α ∗ ( x i ( w x i − l a b e l ) ) w=w-\alpha* {(x_i(wx_i - label))} w=wα(xi(wxilabel))
}

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

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) w=w+αf(w),然后加了动量的就变成了:
v = γ v v=\gamma v v=γv
w = w + v + α ∗ f ′ ( w ) w=w+v+\alpha*f'(w) w=w+v+α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)  
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值