【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)=x2+1

使用梯度下降法求 f(x)=x2+1(10x10) 的最小值

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

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

1、目标函数,即 f(x)=x2+1

def func_target(x):
    return x ** 2 + 1
AI 代码解读

2、求解梯度,即 f(x)=2x

def func_gradient(x):
    return x * 2
AI 代码解读

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)
AI 代码解读

image.png

例2:求 image.png 的极值

通过梯度下降的方法成功求得了 的最小值之后是不是信心大增呢,接下来让我们逐步加深难度:使用梯度下降法求多项式 12[(x1+x24)2+(2x1+3x27)2] 的极值

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

image.png

1、目标函数,即 12[(x1+x24)2+(2x1+3x27)2

def func_target(x1, x2):
    return ((x1 + x2 - 4) ** 2 + (2*x1 + 3*x2 -7) ** 2) * 0.5
AI 代码解读

2、求解梯度,即 fx1=(x1+x24)+2(2x1+3x27)fx2=(x1+x24)+3(2x1+3x27)

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
AI 代码解读

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()
AI 代码解读

image.png

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

二维问题

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

image.png

f(x,y)=e(x2+y2)

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

1、目标函数,即 f(x,y)=e(x2+y2)

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

2、求解梯度,即 fx=2xe(x2+y2)fy=2ye(x2+y2)

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])
AI 代码解读

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
AI 代码解读

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

image.png

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

image.png

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

局限性

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

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

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

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

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

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

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

后记

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

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

参考:

目录
打赏
0
0
0
0
0
分享
相关文章
【重磅发布】 免费领取阿里云百炼AI大模型100万Tokens教程出炉,API接口实战操作,DeepSeek-R1满血版即刻体验!
阿里云百炼是一站式大模型开发及应用构建平台,支持开发者和业务人员轻松设计、构建大模型应用。通过简单操作,用户可在5分钟内开发出大模型应用或在几小时内训练专属模型,专注于创新。
545 89
【重磅发布】 免费领取阿里云百炼AI大模型100万Tokens教程出炉,API接口实战操作,DeepSeek-R1满血版即刻体验!
DeepSeek加持的通义灵码2.0 AI程序员实战案例:助力嵌入式开发中的算法生成革新
本文介绍了通义灵码2.0 AI程序员在嵌入式开发中的实战应用。通过安装VS Code插件并登录阿里云账号,用户可切换至DeepSeek V3模型,利用其强大的代码生成能力。实战案例中,AI程序员根据自然语言描述快速生成了C语言的base64编解码算法,包括源代码、头文件、测试代码和CMake编译脚本。即使在编译错误和需求迭代的情况下,AI程序员也能迅速分析问题并修复代码,最终成功实现功能。作者认为,通义灵码2.0显著提升了开发效率,打破了编程语言限制,是AI编程从辅助工具向工程级协同开发转变的重要标志,值得开发者广泛使用。
7909 68
DeepSeek加持的通义灵码2.0 AI程序员实战案例:助力嵌入式开发中的算法生成革新
JVM实战—3.JVM垃圾回收的算法和全流程
本文详细介绍了JVM内存管理与垃圾回收机制,涵盖以下内容:对象何时被垃圾回收、垃圾回收算法及其优劣、新生代和老年代的垃圾回收算法、Stop the World问题分析、核心流程梳理。
JVM实战—3.JVM垃圾回收的算法和全流程
Spring AI与DeepSeek实战二:打造企业级智能体
本文介绍如何基于Spring AI与DeepSeek模型构建企业级多语言翻译智能体。通过明确的Prompt设计,该智能体能自主执行复杂任务,如精准翻译32种ISO标准语言,并严格遵循输入格式和行为限制。代码示例展示了如何通过API实现动态Prompt生成和翻译功能,确保服务的安全性和可控性。项目已开源,提供更多细节和完整代码。 [GitHub](https://github.com/zlt2000/zlt-spring-ai-app) | [Gitee](https://gitee.com/zlt2000/zlt-spring-ai-app)
82 11
【最佳实践系列】AI程序员让我变成全栈:基于阿里云百炼DeepSeek的跨语言公告系统实战
本文介绍了如何在Java开发中通过跨语言编程,利用阿里云百炼服务平台的DeepSeek大模型生成公告内容,并将其嵌入前端页面。
|
12天前
|
Spring AI与DeepSeek实战一:快速打造智能对话应用
在 AI 技术蓬勃发展的今天,国产大模型DeepSeek凭借其低成本高性能的特点,成为企业智能化转型的热门选择。而Spring AI作为 Java 生态的 AI 集成框架,通过统一API、简化配置等特性,让开发者无需深入底层即可快速调用各类 AI 服务。本文将手把手教你通过spring-ai集成DeepSeek接口实现普通对话与流式对话功能,助力你的Java应用轻松接入 AI 能力!虽然通过Spring AI能够快速完成DeepSeek大模型与。
290 11
通义灵码 AI实战《手把手教你用通义灵码写一个音乐电子小闹钟》
通义灵码DeepSeek版本相比qwen2.5,增强了深度思考和上下文理解能力,显著提升了开发效率,尤其适合代码能力较弱的运维人员,真正实现了“代码即服务”。
111 1
容器化AI模型的安全防护实战:代码示例与最佳实践
本文基于前文探讨的容器化AI模型安全威胁,通过代码示例展示如何在实际项目中实现多层次的安全防护措施。以一个基于TensorFlow的图像分类模型为例,介绍了输入验证、模型加密、API认证和日志记录的具体实现方法,并结合最佳实践,如使用安全容器镜像、限制权限、网络隔离等,帮助构建更安全的AI服务。
容器化AI模型部署实战:从训练到推理
在上一篇中,我们探讨了AI技术如何赋能容器化生态。本篇聚焦于AI模型的容器化部署,通过图像分类任务实例,详细介绍了从模型训练到推理服务的完整流程。使用PyTorch训练CNN模型,Docker打包镜像,并借助Kubernetes进行编排和部署,最终通过FastAPI提供推理服务。容器化技术极大提升了AI模型部署的便利性和管理效率,未来将成为主流趋势。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等