梯度下降算法是一种求解局部最优的方法。对于F(x)在a点的梯度是F(x)增长最快的方向,那么他的相反方向则是该点下降最快的方向。
梯度下降算法分为批量梯度下降BGD(Batch Gradient Descent)、随机梯度下降SGD(Stochastic Gradient Descent)和小批量梯度下降MBGD(Mini-Batch Gradient Descent)
目标函数:
步骤:
1,初始化theta,沿着负梯度方向迭代,更新后的theya使得J(theta)更小。
在线性回归中,目标函数收敛而且为凸函数,是有一个极限值点,所以局部最小值也就是全局最小值。在梯度下降算法中,每次迭代找到一个局部最优解,不一定是全局最优,但是堪用。
2,梯度方向:
批量梯度下降Batch Gradient Descent——BGD
将样本集中的所有数据点的损失函数的偏导进行累和
在最小化损失函数顾鹏程中,需要不断的反腐的更新weights使得误差函数减小,更新过程如下:
每次参数更新的伪代码:
repeat{
(for every j =0,...n)
}
每次参数更新都用到所有的训练数据,使得BGD非常耗时
随机梯度下降Stochastic Gradient Descent ——SGD
利用每个样本的损失函数对 求偏导得到对应的梯度,来更新
参数更新的伪代码:
1,randomly shuffle dataset:
2,repeat{
for i=1,...m{
(for j=0,...n)
}
}
缺点:
SGD与BGD相比,噪音多,使得SGD并不是每次迭代都朝着整体最优的方向。
解决办法:
1,动态更改学习率a的大小,可以增大或减小
2,随机选择样本进行学习
小批量梯度下降Mini-Batch Gradient Descent,简称MBGD
目的是解决SGD和BGD的缺点,使得训练工程比较快,却保证最终参数的训练的准确率。
更新伪代码:
repeat{
for i=1,11,21,31,...991{
(for every j = 0,...,n)
}
}
#y = theta0x0+theta1x1------>x0=1
import numpy as np
X = np.arange(0.,10.,0.2)
m = len(X)
y = 2*X+5+np.random.randn(m)
#初始化参数
theta0 = tneta1 = 0
#学习率
alpha = 0.00001
#迭代次数
cnt = 0
#误差
error0 = error1 = 0
#指定阈值
threshold = 0.000000001
while True:
#梯度
diff=[0,0]
m = len(X)
x0 = 1
for i in range(m):
diff[0]+= (y[i]-(theta0+tneta1*X[i]))*x0
diff[1]+= (y[i] - (theta0+tneta1*X[i]))*X[i]
theta0 = theta0+alpha*diff[0]
tneta1= tneta1+alpha*diff[1]
#计算误差
for i in range(m):
error1+=(y[i]-(theta0+tneta1*X[i]))**2
error1/=m
if abs(error0-error1)<threshold:
break
else:
error0 = error1
cnt+=1