梯度下降算法

梯度下降算法是一种求解局部最优的方法。对于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

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值