随机梯度下降与梯度下降的区别?
如果你还不了解梯度下降请参考:知乎@Ai酱:{高中生能看懂的}梯度下降是个啥?。
随机梯度下降与梯度下降之间有什么区别?
假设你已经懂了梯度下降的原理与公式。接下来我会举个例子来讲随机梯度下降与梯度下降的区别。
假如损失(误差)函数对参数w的导数是,然后我们需要更新的参数是,学习率是。
现在有一堆数据.
那么梯度下降会这么更新参数w:
而随机梯度下降会这么做:
遍历i从1到n{
}
可以看到梯度下降中的导数部分是把所有样本代入到导数中,然后累加,然后更新参数。而随机梯度下降则是选一个样本计算一个导数,然后马上更新参数。
下面我用伪代码表示下随机梯度下降与梯度下降之间的区别:
梯度下降
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
}
然后随机梯度下降有很多变种,比如增加动量来加速收敛。
本来是
,然后加了动量的就变成了:
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.zhihu.com/people/yuanmuou/activities