【AI】浅谈梯度下降算法(实战篇)

简介: 在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法。目前正在学习这方面相关的内容,因此简单谈谈。

前言

在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)  是最常采用的方法之一,另一种常用的方法是最小二乘法。

【AI】浅谈梯度下降算法(理论篇) 这篇博文中,我们已经学习了梯度下降算法的一些基本概念以及理论推导,接下来,我们将通过结合代码进行实战,理论与实践相结合,加深对知识点的理解;

大家族

尽管说是梯度下降,但其实它还是个庞大的家族,就类似于编程语言有 C、Java、Python 等之分,梯度下降算法也被分为了几大类,主要的有 BGD、SGD、MBGD:

  • 批量梯度下降法(Batch Gradient Descent) : 梯度下降法最常用的形式,具体做法也就是在更新参数时使用所有的样本来进行更新;
    image.png
    优点:全局最优解,易于并行实现;

    缺点:计算代价大,数据量大时,训练过程慢;
  • 随机梯度下降法(Stochastic Gradient Descent) : 和批量梯度下降法原理类似,区别在于求梯度时,没有用所有的 $m$ 个样本的数据,而是仅仅选取一个样本 $j$ 来求梯度;
    image.png
    优点:训练速度快;

    缺点:准确度下降,并不是全局最优,不易于并行实现;
  • 小批量梯度下降法(Mini-batch Gradient Descent) : 小批量梯度下降法是批量梯度下降法和随机梯度下降法的折中,也就是对于 $m$ 个样本,我们采用 $x$ 个样本来迭代,$1<x<m$。一般可以取 $x=10$,当然根据样本的数据量,可以调整这个 $x$ 的值;
    image.png
    前两种方法的性能折中;

一维问题

例1:求 image.png 的最小值

image.png

$$ f(x) = x^2 + 1 $$

使用梯度下降法求 $f(x) = x^2 + 1 \quad (-10 \leq x \leq 10)$ 的最小值

因为 $f(x) = x^2 + 1$ 是凸函数,从图中也可以一眼看出,其最小值就在 $x=0$ 处;

接下来就使用梯度下降法进行求解:

1、目标函数,即 $f(x) = x^2 + 1$ :

def func_target(x):
    return x ** 2 + 1

2、求解梯度,即 $f(x)^{'} = 2x$ :

def func_gradient(x):
    return x * 2

3、梯度下降算法,需要注意几个参数的意义:

  • x : 当前 x 的值,可以通过参数提供初始值;
  • learn_rate : 学习率,相当于设置的步长;
  • precision : 收敛精度;
  • max_iters : 最大迭代次数;
def SGD(x=1, learn_rate=0.1, precision=1e-5, max_iters=10000):
    for i in range(max_iters):
        grad_cur = func_gradient(x)
        if abs(grad_cur) < precision:
            break
        x = x - learn_rate * grad_cur
        print(f"第 {i+1} 次迭代: x 值为 {x}, y 值为 {func_target(x)}")
    
    print(f"\n最小值 x = {x}, y = {func_target(x)}")
    return x

if __name__ == '__main__':
    SGD(x=10, learn_rate=0.2)

image.png

例2:求 image.png 的极值

通过梯度下降的方法成功求得了 的最小值之后是不是信心大增呢,接下来让我们逐步加深难度:使用梯度下降法求多项式 $\frac{1}{2}[(x_1+x_2-4)^2 + (2x_1+3x_2-7)^2]$ 的极值

在使用梯度下降求解这道题的过程中,就不得不注意到一个问题:梯度下降可能在局部最小的点收敛

image.png

1、目标函数,即 $\frac{1}{2}[(x_1+x_2-4)^2 + (2x_1+3x_2-7)^2$ :

def func_target(x1, x2):
    return ((x1 + x2 - 4) ** 2 + (2*x1 + 3*x2 -7) ** 2) * 0.5

2、求解梯度,即 $\frac{∂f}{∂x_1} = (x_1+x_2-4)+2(2x_1+3x_2-7)$ 和 $\frac{∂f}{∂x_2} = (x_1+x_2-4)+3(2x_1+3x_2-7)$:

def func_gradient(x1, x2):
    grad_x1 = (x1 + x2 - 4) + 2 * (2*x1 + 3*x2 -7)
    grad_x2 = (x1 + x2 - 4) + 3 * (2*x1 + 3*x2 -7)
    return grad_x1, grad_x2

3、梯度下降算法:

def SGD(x1=0, x2=0, learn_rate=0.01, precision=1e-6, max_iters=10000):
    y1 = func_target(x1, x2)
    for i in range(max_iters):
        grad_x1, grad_x2 = func_gradient(x1, x2)
        x1 = x1 - learn_rate * grad_x1
        x2 = x2 - learn_rate * grad_x2
        y2 = func_target(x1, x2)
        if (y1 - y2) < precision:
            break
        if y2 < y1: y1 = y2
        print(f"第 {i+1} 次迭代: x1 值为 {x1}, x2 值为 {x2}, 输出值为 {y2}")
    
    print(f"该多项式的极小值为 {y2}, ({x1}, {x2})")
    return x1, x2, y2

if __name__ == '__main__':
    SGD()

image.png

中间的迭代过程就省略了;

二维问题

当你通过自己的努力完成前两个例子之后,你是不是已经不满足于一维问题了呢,那么接下来我们进入二维问题:使用梯度下降法求 $f(x,y) = -e^{-(x^2+y^2)}$ 在 $[0,0]$ 处有最小值

image.png

$$ f(x,y) = -e^{-(x^2+y^2)} $$

通过这个例子,我们会发现梯度下降的局限性,先在这里留个悬念;

1、目标函数,即 $f(x,y) = -e^{-(x^2+y^2)}$ :

def func_target(cell):
    :param cell: 二维向量
    return -math.exp(-(cell[0] ** 2 + cell[1] ** 2))

2、求解梯度,即 $\frac{∂f}{∂x} = 2xe^{-(x^2+y^2)}$ 和 $\frac{∂f}{∂y} = 2ye^{-(x^2+y^2)}$:

def func_gradient(cell):
    :param cell: 二维向量
    grad_x = 2 * cell[0] * math.exp(-(cell[0] ** 2 + cell[1] ** 2))
    grad_y = 2 * cell[1] * math.exp(-(cell[0] ** 2 + cell[1] ** 2))
    return np.array([grad_x, grad_y])

3、梯度下降算法:

def SGD(x=np.array([0.1, 0.1]), learn_rate=0.1, precision=1e-6, max_iters=10000):
    for i in range(max_iters):
        grad_cur = func_gradient(x)
        if np.linalg.norm(grad_cur, ord=2) < precision:
            break
        x = x - learn_rate * grad_cur
        print(f"第 {i+1} 次迭代: x 值为 {x}, y 值为 {func_target(x)}")
    
    print(f"\n最小值 x = {x}, y = {func_target(x)}")
    return x

4、当 $x0$ 的初始值设为 $[1,−1]$ 时,一切都显得很正常:

image.png

5、但当我们把 $x0$ 的初始值设为 $[3,−3]$ 时,结果是出乎意料的:

image.png

梯度下降法没有找到真正的极小值点!

局限性

继续讲述上面的非预期结果:

如果仔细观察目标函数的图像,以及梯度下降法的算法原理,你就很容易发现问题所在了。在 $[3,−3]$ 处的梯度就几乎为 0 了!

由于“梯度过小”,梯度下降法可能无法确定前进的方向了。即使人为增加收敛条件中的精度,也会由于梯度过小,导致迭代中前进的步长距离过小,循环时间过长。

梯度下降法实现简单,原理也易于理解,但它有自身的局限性,因此有了后面很多算法对它的改进。

对于梯度过小的情况,梯度下降法可能难以求解。

此外,梯度下降法适合求解只有一个局部最优解的目标函数,对于存在多个局部最优解的目标函数,一般情况下梯度下降法不保证得到全局最优解(由于凸函数有个性质是只存在一个局部最优解,所有也有文献的提法是:当目标函数是凸函数时,梯度下降法的解才是全局最优解)。

由于泰勒公式的展开是近似公式,要求迭代步长要足够小,因此梯度下降法的收敛速度并非很快的。

后记

上述就是本篇博文的所有内容了,通过实战对梯度下降知识点进行巩固和加深印象,并且层层收入,希望读者能有所收获!

对于理论还不是很清楚的读者,可以回看上篇博文:【AI】浅谈梯度下降算法(理论篇)

参考:

目录
相关文章
|
19天前
|
传感器 人工智能 监控
智慧工地 AI 算法方案
智慧工地AI算法方案通过集成多种AI算法,实现对工地现场的全方位安全监控、精准质量检测和智能进度管理。该方案涵盖平台层、展现层与应用层、基础层,利用AI技术提升工地管理的效率和安全性,减少人工巡检成本,提高施工质量和进度管理的准确性。方案具备算法精准高效、系统集成度高、可扩展性强和成本效益显著等优势,适用于人员安全管理、施工质量监控和施工进度管理等多个场景。
|
24天前
|
传感器 人工智能 监控
智慧电厂AI算法方案
智慧电厂AI算法方案通过深度学习和机器学习技术,实现设备故障预测、发电运行优化、安全监控和环保管理。方案涵盖平台层、展现层、应用层和基础层,具备精准诊断、智能优化、全方位监控等优势,助力电厂提升效率、降低成本、保障安全和环保合规。
智慧电厂AI算法方案
|
4天前
|
机器学习/深度学习 缓存 人工智能
【AI系统】QNNPack 算法
QNNPACK是Marat Dukhan开发的量化神经网络计算加速库,专为移动端优化,性能卓越。本文介绍QNNPACK的实现,包括间接卷积算法、内存重排和间接缓冲区等关键技术,有效解决了传统Im2Col+GEMM方法存在的空间消耗大、缓存效率低等问题,显著提升了量化神经网络的计算效率。
18 6
【AI系统】QNNPack 算法
|
4天前
|
存储 人工智能 缓存
【AI系统】Im2Col 算法
Caffe 作为早期的 AI 框架,采用 Im2Col 方法优化卷积计算。Im2Col 将卷积操作转换为矩阵乘法,通过将输入数据重排为连续内存中的矩阵,减少内存访问次数,提高计算效率。该方法首先将输入图像转换为矩阵,然后利用 GEMM 库加速计算,最后将结果转换回原格式。这种方式显著提升了卷积计算的速度,尤其适用于通道数较多的卷积层。
17 5
【AI系统】Im2Col 算法
|
4天前
|
存储 机器学习/深度学习 人工智能
【AI系统】Winograd 算法
本文详细介绍Winograd优化算法,该算法通过增加加法操作来减少乘法操作,从而加速卷积计算。文章首先回顾Im2Col技术和空间组合优化,然后深入讲解Winograd算法原理及其在一维和二维卷积中的应用,最后讨论算法的局限性和实现步骤。Winograd算法在特定卷积参数下表现优异,但其应用范围受限。
13 2
【AI系统】Winograd 算法
|
6天前
|
机器学习/深度学习 人工智能 JSON
【实战干货】AI大模型工程应用于车联网场景的实战总结
本文介绍了图像生成技术在AIGC领域的发展历程、关键技术和当前趋势,以及这些技术如何应用于新能源汽车行业的车联网服务中。
|
3天前
|
人工智能 自然语言处理 算法
AI时代的企业内训全景图:从案例到实战
作为一名扎根在HR培训领域多年的“老兵”,我越来越清晰地感受到,企业内训的本质其实是为企业持续“造血”。无论是基础岗的新人培训、技能岗的操作规范培训,还是面向技术中坚力量的高阶技术研讨,抑或是管理层的战略思维提升课,内训的价值都是在帮助企业内部提升能力水平,进而提高组织生产力,减少对外部资源的依赖。更为重要的是,在当前AI、大模型、Embodied Intelligence等新兴技术快速迭代的背景下,企业必须不断为人才升级赋能,才能在市场竞争中保持领先。
|
2月前
|
存储 人工智能 分布式计算
Parquet 文件格式详解与实战 | AI应用开发
Parquet 是一种列式存储文件格式,专为大规模数据处理设计,广泛应用于 Hadoop 生态系统及其他大数据平台。本文介绍 Parquet 的特点和作用,并演示如何在 Python 中使用 Pandas 库生成和读取 Parquet 文件,包括环境准备、生成和读取文件的具体步骤。【10月更文挑战第13天】
317 60
|
20天前
|
机器学习/深度学习 传感器 人工智能
智慧无人机AI算法方案
智慧无人机AI算法方案通过集成先进的AI技术和多传感器融合,实现了无人机的自主飞行、智能避障、高效数据处理及多机协同作业,显著提升了无人机在复杂环境下的作业能力和安全性。该方案广泛应用于航拍测绘、巡检监测、应急救援和物流配送等领域,能够有效降低人工成本,提高任务执行效率和数据处理速度。
智慧无人机AI算法方案
|
8天前
|
存储 人工智能 缓存
【AI系统】布局转换原理与算法
数据布局转换技术通过优化内存中数据的排布,提升程序执行效率,特别是对于缓存性能的影响显著。本文介绍了数据在内存中的排布方式,包括内存对齐、大小端存储等概念,并详细探讨了张量数据在内存中的排布,如行优先与列优先排布,以及在深度学习中常见的NCHW与NHWC两种数据布局方式。这些布局方式的选择直接影响到程序的性能,尤其是在GPU和CPU上的表现。此外,还讨论了连续与非连续张量的概念及其对性能的影响。
28 3