梯度下降及一元线性回归[python代码](一)

第一章、AI人工智能入门之梯度下降及一元线性回归(1)



前言

随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


一、什么是梯度下降?

       梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent,可简称GD)是最常采用的方法之一,另一种常用的方法是最小二乘法,包括一元线性回归和矩阵分解。

       梯度下降法是一个最优化算法,常用于机器学习和人工智能当中用来递归性地逼近最小偏差模型,寻找极小点时,从负梯度的方向寻找。

二、梯度下降的基本思想

1.场景假设

       假设我们爬山,如果想最快的上到山顶,那么我们应该从山势最陡的地方上山。也就是山势变化最快的地方上山。

同样,如果从任意一点出发,需要最快搜索到函数最大值,那么我们也应该从函数变化最快的方向搜索。

函数变化最快的方向是什么呢?
函数的梯度。
如果函数为一元函数,梯度就是该函数的导数。

如果为二元函数,梯度定义为:

 

如果需要找的是函数极小点,那么应该从负梯度的方向寻找,该方法称之为梯度下降法。(如下图所示)要搜索极小值C点,在A点必须向x增加方向搜索,此时与A点梯度方向相反;在B点必须向x减小方向搜索,此时与B点梯度方向相反。总之,搜索极小值,必须向负梯度方向搜索。

        首先,我们有一个可微分的函数。这个函数就代表着一座山。我们的目标就是找到这个函数的最小值,也就是山底。根据之前的场景假设,最快的下山的方式就是找到当前位置最陡峭的方向,然后沿着此方向向下走,对应到函数中,就是找到给定点的梯度 ,然后朝着梯度相反的方向,就能让函数值下降的最快!因为梯度的方向就是函数之变化最快的方向,所以,我们重复利用这个方法,反复求取梯度,最后就能到达局部的最小值,这就类似于我们下山的过程。

2.核心公式

​或

 其中η,α 为步长,也叫学习率,x`为新值,x为旧值。

三、梯度下降法的一般步骤

假设函数Sy=f(x_1,x_2,..., x_n)S只有一个极小点。
初始给定参数为Xo=(x1_0,x2_0,...,xn_0)从这个点如何搜索才能找到原函数的极小值点?

方法:
1.首先设定一个较小的正数α,ε ;
2.求当前位置出处的各个偏导数:

3.修改当前函数的参数值,公式如下:

4.如果参数变化量小于e,退出;否则返回第2步;

四、梯度下降的缺点

  • 靠近极小值时收敛速度减慢。

  • 直线搜索时可能会产生一些问题。

  • 可能会“之字形”地下降。

五、梯度下降三兄弟(BGD,SGD, MBGD)

5.1 批量梯度下降法(Batch Gradient Descent)

批量梯度下降法(BGD)每次都使用训练集中的所有样本更新参数。它得到的是一 个全局最优解,但是每迭代一步,都要用到训练集所有的数据,如果m很大,那么迭代速度就会变得很慢。
优点:可以得出全局最优解
缺点:样本数据集大时,训练速度慢。

对应散点图:

5.2 随机梯度下降法(Stochastic Gradient Descent)

随机梯度下降法(SGD)每次更新都从样本随机选择1组数据,因此随机梯度下降比 批量梯度下降在计算量上会大大减少。
SGD有一个缺点是,其噪音较BGD 要多,使得SGD并不是每次迭代都向着整体最优化方向。而且SGD因为每 次都是使用一个样本进行迭代,因此最终求得的最优解往往不是全局最优 解,而只是局部最优解。但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近
优点:训练速度较快。
缺点:过程杂乱,准确度下降。

对应散点图:

5.3小批量梯度下降法(Mini-batch Gradient Descent)

小批量梯度下降法(MBGD)对包含n个样本的数据集进行计算。综合了上述两种方法,既保证了训练速度快,又保证了准确度。

对应散点图:

 六、例题

例1

任给一个初始出发点,设为x0=-4,利用梯度下降法求函数y=x2/2-2x的极小值。

 计算过程如下:

计算机结果                                      手工结果 

1.400000000003402                   1.4                               
1.9399999999999453                 1.94
1.9939999999994997                 1.994
1.999399999999655                   1.9994
1.99994000000037
1.999993999999842
1.9999993999992896
1.9999999400003334
1.9999999940011373
1.999999999400818
1.9999999999403864
1.999999999993344
1.99999999999834
1.9999999999993392
1.9999999999993392
1.9999999999993392
1.9999999999993392
1.9999999999993392
1.9999999999993392
1.9999999999993392
1.9999999999993392
1.9999999999993392
1.9999999999993392
1.9999999999993392
1.9999999999993392
1.9999999999993392
1.9999999999993392
1.9999999999993392
1.9999999999993392
1.9999999999993392
initial x = -4
arg min f(x) of x = 1.9999999999993392
f(x) = -2.0

计算机结果和手工结果形成对比,手工计算的在第四步结束。

例1 函数图像

下面为例题1的相应代码如下:

import numpy as np
import matplotlib.pyplot as plt
def f(x):
    return (np.power(x, 2)/2-2*x)
def d_f_1(x):
    return  x-2
def d_f_2(f, x, delta=1e-4):
    return (f(x+delta) - f(x-delta)) / (2 * delta)
#plot the function
xs = np.arange(-8, 12)
plt.plot(xs, f(xs))
plt.show()
learning_rate = 0.9
max_loop = 30
x_init = -4
x = x_init
lr = 0.01
for i in range(max_loop):
    # d_f_x = d_f_1(x)
    d_f_x = d_f_2(f, x)
    x = x - learning_rate * d_f_x
    print(x)
print('initial x =', x_init)
print('arg min f(x) of x =', x)
print('f(x) =', f(x))

例2

任给一个初始出发点,设为x0=-4,利用梯度下降法求函数y=x^2的极小值。

计算过程如下:(我手工进行了5次循环的计算)然后使用计算机验证前五步的计算结果

计算机结果:

 3.199999999999207
-2.560000000014547
2.0480000000220357
-1.638400000024017
1.3107200000184207
-1.0485760000147302
0.8388608000113909
-0.6710886400088065
0.5368709120070516
-0.429496729605485
0.3435973836842695
-0.2748779069473468
0.2199023255578213
-0.17592186044621327
0.14073748835694877
-0.11258999068554026
0.09007199254844164
-0.07205759403875167
0.05764607523100612
-0.046116860184809066
0.036893488147849346
-0.02951479051828207
0.0236118324146253
-0.01888946593170001
0.015111572745359944
-0.012089258196287776
0.009671406557029985
-0.007737125245623883
0.006189700196499077
-0.004951760157199284
initial x = -4
arg min f(x) of x = -0.004951760157199284
f(x) = 2.451992865442628e-05

对比发现,我手工计算的是正确的

该函数图像

 下面为例题2的相应代码如下:

# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a temporary script file.
"""
import numpy as np
import matplotlib.pyplot as plt
def f(x):
    return (np.power(x, 2))
def d_f_1(x):
    return  2*x
def d_f_2(f, x, delta=1e-4):
    return (f(x+delta) - f(x-delta)) / (2 * delta)
#plot the function
xs = np.arange(-8, 12)
plt.plot(xs, f(xs))
plt.show()
learning_rate = 0.9
max_loop = 30
x_init = -4
x = x_init
lr = 0.01
for i in range(max_loop):
    # d_f_x = d_f_1(x)
    d_f_x = d_f_2(f, x)
    x = x - learning_rate * d_f_x
    print(x)
print('initial x =', x_init)
print('arg min f(x) of x =', x)
print('f(x) =', f(x))

总结

参考文献

[EB/OL].https://blog.csdn.net/qq_45004292/article/details/115710781,2021-4-17

[EB/OL].https://zhuanlan.zhihu.com/p/61119205,2019-4-2

[EB/OL].1 梯度下降法初步简介_哔哩哔哩_bilibili,2023-3-14

猜你喜欢

转载自blog.csdn.net/zhu_xian_gang/article/details/129967553