梯度下降算法过程及为什么负梯度方向是下降最快方向(附代码)

简介: 笔记

对于梯度下降算法我们熟知的一个例子就是下山问题,当我们位于山的某一点处,沿着当前位置寻找山坡最陡方向以一定步长进行移动,直到走到山脚。那么这个过程具体是怎么做到的?为什么说负梯度方向是下降最快方向呢?


首先我们设定一个初始值15.gif【相当于我们在山上的一个初始位置】,优化的目标函数为f(x)【可以理解为将山体轮廓作为目标函数f(x)】,接下来我们可以在15.gif处进行一阶泰勒展开【对函数局部的线性近似】:

17.gif18.gif

我们期望的是在下一个位置17.gif处有16.gif【山体的下一个位置的值低于前面的值才说明我们正在下山,这个过程才是有效的】,我们令19.gif则有:

20.gif

进一步得到:21.gif


为了保证22.gif可以设23.gif,又为了需要使24.gif距离尽可能的小以减小误差,引入步长系数25.gif,则有:

26.gif

27.gif


这里只是举例的一元函数,如果是多元函数,上式为偏导数。根据上述过程不停的迭代寻找最优解。【上述公式也就是我们常看到的权重更新 28.gif  】


那么又为什么是负梯度方向才是下降的最快方向呢?


首先29.gif也是一个向量,这个向量的大小(模值)也其实就是步长系数30.gif【注:步长是一个标量】,如果我们再引入一个单位向量31.gif,那么向量32.gif可表示为:

33.gif

那么泰勒展开则为:           34.gif        

我们又希望        35.gif                        

40.png

代码实现:  

# 假如目标函数为f(x) = 2(x - 5)² # 可以知道当函数值为0的时候,x=5
# 定义函数
def f(x):
    return 2 * (x - 5) ** 2
# 函数求导
def df(x):
    return 4 * (x - 5)
# 定义学习率(步长)
learning_rate = 0.1
res_x = []  # 保存每次更新后x的值
res_y = []  # 保存每次更新x后y的值
x0 = 1  # 初始位置
y = f(x0)  # 初始值
y_current = 0  # y当前值
# 循环20次
for epoch in range(20):
    x0 = x0 - learning_rate * df(x0)  # 权重更新  梯度下降
    tmp = f(x0)  # 将初始位置先放在一个临时变量中
    y_current = tmp  # 将临时变量中的值赋值为当前值
    res_x.append(x0)  # 记录x的变化
    res_y.append(y_current)  # 记录y的变化

打印一下x的输出结果:可以看出x的值越来越接近于5了

2.6
3.56
4.136
4.4816
4.68896
4.813376
4.8880256
4.93281536
4.959689216
4.9758135296
4.98548811776
4.991292870656
4.9947757223936
4.9968654334361595
4.998119260061696
4.998871556037018
4.999322933622211
4.999593760173327
4.999756256103996
4.999853753662398
print("{:.10f}".format(res_y[-1])) #无限接近0

输出为:0.0000000428

可视化:可以看到x的值越来越趋近于5,y的值越来越接近于041.png

目录
相关文章
|
1月前
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)
|
5月前
|
机器学习/深度学习 算法 PyTorch
【从零开始学习深度学习】38. Pytorch实战案例:梯度下降、随机梯度下降、小批量随机梯度下降3种优化算法对比【含数据集与源码】
【从零开始学习深度学习】38. Pytorch实战案例:梯度下降、随机梯度下降、小批量随机梯度下降3种优化算法对比【含数据集与源码】
|
2月前
|
机器学习/深度学习 算法
深度学习中的优化算法:从梯度下降到Adam
本文深入探讨了深度学习中的核心——优化算法,重点分析了梯度下降及其多种变体。通过比较梯度下降、动量方法、AdaGrad、RMSProp以及Adam等算法,揭示了它们如何更高效地找到损失函数的最小值。此外,文章还讨论了不同优化算法在实际模型训练中的表现和选择依据,为深度学习实践提供了宝贵的指导。
89 7
|
1月前
|
机器学习/深度学习 算法
机器学习入门:梯度下降算法(上)
机器学习入门:梯度下降算法(上)
|
3月前
|
机器学习/深度学习 算法 数据挖掘
|
3月前
|
机器学习/深度学习 算法 Python
探索机器学习中的梯度下降优化算法
【8月更文挑战第1天】在机器学习的广阔天地里,梯度下降法如同一位勇敢的探险家,指引我们穿越复杂的数学丛林,寻找模型参数的最优解。本文将深入探讨梯度下降法的核心原理,并通过Python代码示例,展示其在解决实际问题中的应用。
73 3
|
5月前
|
机器学习/深度学习 分布式计算 并行计算
算法金 | 再见!!!梯度下降(多图)
**梯度下降及其优化算法简述** 梯度下降是一种优化算法,广泛用于机器学习和深度学习,通过迭代更新模型参数以最小化损失函数。它有几种变体,包括批梯度下降(使用全部数据)、随机梯度下降(单个样本)和小批量梯度下降(小批量样本)。每种形式在计算效率和稳定性上各有优劣。
69 4
算法金 | 再见!!!梯度下降(多图)
|
5月前
|
算法
梯度下降算法(二)
梯度下降法中,学习率选择至关重要。0.3的学习率导致无法找到最小值且产生震荡,而0.01则使结果接近最优解(2.99998768)。当学习率进一步减小至0.001,点远离最低点。通过迭代次数增加至1000次,可更接近最低点(2.999999999256501)。梯度下降用于最小化损失,学习率控制参数更新步长,需平衡收敛速度和稳定性。迭代次数和初始点也影响模型性能,合适的初始化能加速收敛并避开局部极小值。
|
5月前
|
机器学习/深度学习 存储 算法
梯度下降算法(一)
梯度下降是一种迭代优化算法,用于找到多变量函数的最小值。它不直接求解方程,而是从随机初始点开始,沿着梯度(函数增大幅度最大方向)的反方向逐步调整参数,逐步逼近函数的最小值。在单变量函数中,梯度是导数,而在多变量函数中,梯度是一个包含所有变量偏导数的向量。通过计算梯度并乘以学习率,算法更新参数以接近最小值。代码示例展示了如何用Python实现梯度下降,通过不断迭代直到梯度足够小或达到预设的最大迭代次数。该过程可以类比为在雾中下山,通过感知坡度变化来调整前进方向。
|
5月前
|
机器学习/深度学习 算法 C语言
【深度学习】优化算法:从梯度下降到Adam
【深度学习】优化算法:从梯度下降到Adam
152 1