梯度下降原理

本文借鉴了部分https://blog.csdn.net/u010358304/article/details/84324853文章的内容

梯度下降算法原理

1. 概述

  梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法。在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。在机器学习中,基于基本的梯度下降法发展了两种梯度下降方法,分别为随机梯度下降法和批量梯度下降法。本文主要讲述了批量梯度下降的方法
  在初学机器学习的时候学习线性回归遇到了如何求得最匹配的 w 0 和 w 1 w_0 和w_1 w0w1使得 y = w 0 + w 1 x y = w_0+w_1x y=w0+w1x最符合拟合的直线,在求解的过程中就使用了梯度下降的思想。但是拼接我浅薄的数学知识真的是有点难理解里面的公式,下面写上的理解吧

2. 损失函数

  在减少梯度下降之前先介绍一下损失函数吧

概念:

损失函数就是总样本误差关于模型参数的函数,该函数属于三维数学模型,即需要找到一组w0 w1使得loss取极小值

在线性回归中的运用

  通过求解损失函数的最小值来确定 y = w 0 + w 1 x y = w_0+w_1x y=w0+w1x公式中最合适的 w 0 和 w 1 w_0 和w_1 w0w1

3. 下山例子:

  对于梯度下降的理解,我们可以通过下山的例子来理解,现在你在山上,想要以最快的速度下到山下,那么就应该选择最陡峭的方向去走,这样就可以最快的速度到达山底
在这里插入图片描述
梯度下降用的就是这个原理,通过求解在每一个点的偏导数来得到和梯度更新
  在下山的例子中提到的最陡峭的方向我们给他一个名字就叫做梯度方向,沿着梯度方向,函数值增长最快,注意这里是增长最快,所以我们在使用梯度下降法的时候,都是沿着梯度反方向更新参数

梯度方向的计算

   那么梯度方向又要如何计算呢?很简单求解这一点的偏导数即可,偏导数的计算方法也是求导,以损失函数的表达式为例 loss = 1/2 Σ(w0 + w1x - y)2 注意我们是要求解 w 0 和 w 1 w_0和w_1 w0w1的最适值所以就要分别将 w 0 和 w 1 w_0和w_1 w0w1作为变量进行求导,从几何角度进行理解导数的该点切线和x轴形成的切线夹角的正切值,偏导数就是该点切线和y轴形成夹角的正弦值。

d0 = (w0 + w1 * x-y).sum()
d1 = (train_x * (w0 + w1 * x - y)).sum()
梯度更新
w0 = w0 - lrate * d0
w1 = w1 - lrate * d1

  这里,lrate通常叫做步长或者学习率,用于控制参数变动的幅度。这是一个需要调整的参数,lrate设置过大,会使得参数一下子变化太大,可能会让函数跳过局部最小点,而且容易扯到裆,从而永远找不到(局部)极小点;lrate设置过小,会使得参数变化太小,每次更新只变化一点点,学习太慢,需要很长时间才能找到极小点。

线性回归求损失值的代码
# 设置初始的w0和w1 随便设的因为我也不知道哪个比较好
w0, w1 = 1, 1
# 训练次数
times = 1000
# 步长
lrate = 0.01
# 循环更新
for i in range(1, times + 1):
    # 求损失函数关于w0与w1的偏导数,从而更新模型参数
    d0 = (w0 + w1 * train_x - train_y).sum()
    d1 = (train_x * (w0 + w1 * train_x - train_y)).sum()
    # 根据梯度下降公式,更新w0与w1
    w0 = w0 - lrate * d0
    w1 = w1 - lrate * d1
绘制出图像的完整代码
import numpy as np
import matplotlib.pyplot as mp

train_x = np.array([0.5, 0.6, 0.8, 1.1, 1.4])
train_y = np.array([5.0, 5.5, 6.0, 6.8, 7.0])

w0, w1 = 1, 1
times = 1000
lrate = 0.01
for i in range(1, times + 1):
    # 求损失函数关于w0与w1的偏导数,从而更新模型参数
    d0 = (w0 + w1 * train_x - train_y).sum()
    d1 = (train_x * (w0 + w1 * train_x - train_y)).sum()
    # 根据梯度下降公式,更新w0与w1
    w0 = w0 - lrate * d0
    w1 = w1 - lrate * d1
print('w0:', w0)
print('w1:', w1)

# 通过w0与w1模型参数,绘制回归线
linex = np.linspace(
    train_x.min(), train_x.max(), 100)
liney = w1 * linex + w0
# 画图
mp.figure('Linear Regression', facecolor='lightgray')
mp.title('Linear Regression', fontsize=18)
mp.grid(linestyle=':')
mp.scatter(train_x, train_y, s=80, marker='o',
           color='dodgerblue', label='Samples')
mp.plot(linex, liney, color='orangered',
        linewidth=2, label='Regression Line')
mp.legend()
mp.show()
缺点
  • 局部最小点:梯度下降可能得到函数的某一个极小值,而不是整个函数的最小值。如下图所示:
  • 鞍点:saddle point,一个方向上梯度大于0,一个方向上梯度小于0。在高维数据上容易发生。这种情况下,虽然梯度为0,但其实并不是极小值点。
  • 特征缩放比例:如果特征的取值范围不在相似范围的话,学习起来收敛速度回很慢,走很多弯路。这也是特征需要归一化的原因。

,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTAzNTgzMDQ=,size_16,color_FFFFFF,t_70)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值