梯度下降法+python代码实现解释

梯度下降法在统计学习还是深度学习中都得到了广泛的应用,我们通过构建合理的模型,将模型预测的输出和正确结果进行误差计算,通过优化模型参数使得输出的结果和正确结果的误差最小,我们往往会把误差损失函数构建成一个凸函数,这样使得参数的求解比较单一化,就像一元二次函数只有一个波峰或者波谷,那么求解答案就是寻找这个波峰或者波谷,如果把误差损失函数表达成类似sinx的函数,存在多个波峰波谷,那么求解的答案就会有多个,显然求解的众多个答案并非都是最优解。

我们现在来解释梯度下降法。
以一个一元二次函数举例。

y=-10*x+x**2

画图如下:
梯度下降法+python代码实现解释

假设这个表示我们模型的损失函数,现在我们的波谷,就是我们模型误差最小的参数点,此时认为x就是我们未知的参数,如何寻找x取值为多少才能达到这个波谷呢?

这就需要用到梯度下降法。
我们先对关于x的函数y求关于x的导函数,得到为

dy=-10+2*x

于是我们初始化x为一个随机值a

x=a

然后不断迭代下面的过程

x1=x0-dy=x0-lr*(-10+2*x0)
x0=x1

上面的lr为学习率,也叫步长,意思为每次x更新变动的数据大小。因为这是一个不断迭代的过程,我们有两种方法让这个迭代结束,一种是设置误差方法,让这个误差小于某个阈值就结束,当然这种方法容易陷入死循环,因为你无法判断一个模型最终拟合的数据误差有多大,第二种方法就是设置迭代次数,这也是比较合理的目前为止深度学习还是机器学习都比较常用的迭代结束判断条件。

好,现在解释下上面的迭代函数为啥可以找到这个波谷的近似位置,原因是,比如在波谷右边,波谷右边的函数曲线上的任意点斜率大于0,此时x1=x0-lrdy,会让点x向左移,直到找到左边的波谷位置,如果在波谷左边,波谷左边的函数曲线斜率小于0,那么x1=x0-lrdy,就会使得x数值增大,位置向右移,不断移动找到右边的波谷位置。

先利用我们的一元二次函数顶点公式求解出顶点的x=5,现在利用梯度下降法去找一下这个结果是否和我们的标准结果一致。

代码实现

import matplotlib.pyplot as plt
import numpy as np
import random
step=10000#设置迭代次数为10000
x0=random.randint(-10,10)#随机初始化一个数值
lr=0.001#设置学习率为0.001
for i in range(step):
    x1=x0-lr*(-10+2*x0)#梯度下降迭代
    x0=x1
print('梯度下降法求解结果:',x0)

梯度下降法+python代码实现解释

梯度下降法结果可以说非常接近我们的答案5了。

上一篇:【Python】常用数值方法的python实现


下一篇:java元注解(注解在注解上的注解)