梯度下降可视化:Rosenbrock函数示例【附完整源码】

《博主简介》

小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。
更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~
👍感谢小伙伴们点赞、关注!

《------往期经典推荐------》

一、AI应用软件开发实战专栏【链接】

项目名称项目名称
1.【人脸识别与管理系统开发2.【车牌识别与自动收费管理系统开发
3.【手势识别系统开发4.【人脸面部活体检测系统开发
5.【图片风格快速迁移软件开发6.【人脸表表情识别系统
7.【YOLOv8多目标识别与自动标注软件开发8.【基于YOLOv8深度学习的行人跌倒检测系统
9.【基于YOLOv8深度学习的PCB板缺陷检测系统10.【基于YOLOv8深度学习的生活垃圾分类目标检测系统
11.【基于YOLOv8深度学习的安全帽目标检测系统12.【基于YOLOv8深度学习的120种犬类检测与识别系统
13.【基于YOLOv8深度学习的路面坑洞检测系统14.【基于YOLOv8深度学习的火焰烟雾检测系统
15.【基于YOLOv8深度学习的钢材表面缺陷检测系统16.【基于YOLOv8深度学习的舰船目标分类检测系统
17.【基于YOLOv8深度学习的西红柿成熟度检测系统18.【基于YOLOv8深度学习的血细胞检测与计数系统
19.【基于YOLOv8深度学习的吸烟/抽烟行为检测系统20.【基于YOLOv8深度学习的水稻害虫检测与识别系统
21.【基于YOLOv8深度学习的高精度车辆行人检测与计数系统22.【基于YOLOv8深度学习的路面标志线检测与识别系统
23.【基于YOLOv8深度学习的智能小麦害虫检测识别系统24.【基于YOLOv8深度学习的智能玉米害虫检测识别系统
25.【基于YOLOv8深度学习的200种鸟类智能检测与识别系统26.【基于YOLOv8深度学习的45种交通标志智能检测与识别系统
27.【基于YOLOv8深度学习的人脸面部表情识别系统28.【基于YOLOv8深度学习的苹果叶片病害智能诊断系统
29.【基于YOLOv8深度学习的智能肺炎诊断系统30.【基于YOLOv8深度学习的葡萄簇目标检测系统
31.【基于YOLOv8深度学习的100种中草药智能识别系统32.【基于YOLOv8深度学习的102种花卉智能识别系统
33.【基于YOLOv8深度学习的100种蝴蝶智能识别系统34.【基于YOLOv8深度学习的水稻叶片病害智能诊断系统
35.【基于YOLOv8与ByteTrack的车辆行人多目标检测与追踪系统36.【基于YOLOv8深度学习的智能草莓病害检测与分割系统
37.【基于YOLOv8深度学习的复杂场景下船舶目标检测系统38.【基于YOLOv8深度学习的农作物幼苗与杂草检测系统
39.【基于YOLOv8深度学习的智能道路裂缝检测与分析系统40.【基于YOLOv8深度学习的葡萄病害智能诊断与防治系统
41.【基于YOLOv8深度学习的遥感地理空间物体检测系统42.【基于YOLOv8深度学习的无人机视角地面物体检测系统
43.【基于YOLOv8深度学习的木薯病害智能诊断与防治系统44.【基于YOLOv8深度学习的野外火焰烟雾检测系统
45.【基于YOLOv8深度学习的脑肿瘤智能检测系统46.【基于YOLOv8深度学习的玉米叶片病害智能诊断与防治系统
47.【基于YOLOv8深度学习的橙子病害智能诊断与防治系统48.【基于深度学习的车辆检测追踪与流量计数系统
49.【基于深度学习的行人检测追踪与双向流量计数系统50.【基于深度学习的反光衣检测与预警系统
51.【基于深度学习的危险区域人员闯入检测与报警系统52.【基于深度学习的高密度人脸智能检测与统计系统
53.【基于深度学习的CT扫描图像肾结石智能检测系统54.【基于深度学习的水果智能检测系统
55.【基于深度学习的水果质量好坏智能检测系统56.【基于深度学习的蔬菜目标检测与识别系统
57.【基于深度学习的非机动车驾驶员头盔检测系统58.【太基于深度学习的阳能电池板检测与分析系统
59.【基于深度学习的工业螺栓螺母检测60.【基于深度学习的金属焊缝缺陷检测系统
61.【基于深度学习的链条缺陷检测与识别系统62.【基于深度学习的交通信号灯检测识别
63.【基于深度学习的草莓成熟度检测与识别系统64.【基于深度学习的水下海生物检测识别系统
65.【基于深度学习的道路交通事故检测识别系统66.【基于深度学习的安检X光危险品检测与识别系统

二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~

《------正文------》

引言

img

梯度下降是机器学习、深度学习和许多其他数据科学领域中使用的最基本的优化技术之一。它的主要功能是迭代地最小化成本或损失函数,从而获得更好的模型性能或更准确的解决方案。在本文中,我们将了解梯度下降是如何工作的,重点是一个经典的例子-Rosenbrock函数,并使用Python代码以一种引人入胜的逐步方式可视化优化过程,以运行和可视化它。

什么是梯度下降?

梯度下降是一种用于最小化函数值的优化算法。它通过迭代地调整参数(例如机器学习中的权重)来减少函数的值。在数学术语中,该算法计算成本函数相对于每个参数的梯度或斜率,并在与梯度相反的方向上调整参数。

img

梯度指向最陡上升的方向,因此向相反方向移动会导致成本函数减小。

其他优化技术和梯度下降变体:

  • 随机梯度下降
  • 基于动量的梯度下降
  • Adam优化器

Rosenbrock函数–一个复多元函数

在数学最优化中,Rosenbrock函数是一个用来测试最优化算法性能的非凸函数,由Howard Harry Rosenbrock在1960年提出 。也称为Rosenbrock山谷或Rosenbrock香蕉函数,也简称为香蕉函数。
Rosenbrock函数的定义如下:
在这里插入图片描述
Rosenbrock函数的每个等高线大致呈抛物线形,其全域最小值也位在抛物线形的山谷中(香蕉型山谷)。它有一个狭窄的曲线谷,导致全局最小值(1,1)和几个局部最小值,使其成为梯度下降的挑战。

img

在这里插入图片描述
由于其结构,Rosenbrock函数是一个很好的测试,可以可视化梯度下降在面对局部最小值时的行为以及它如何逐渐收敛到全局最小值。

Rosenbrock函数的梯度下降

下面提供的代码演示了如何将梯度下降应用于Rosenbrock函数,从任意点开始并向全局最小值移动。它还可视化了梯度下降在迭代中遵循的路径。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import imageio
import os

# Create a directory to store the frames
if not os.path.exists("frames"):
    os.makedirs("frames")

# Rosenbrock function definition
def rosenbrock(x):
    return (1 - x[0])**2 + 100 * (x[1] - x[0]**2)**2

# Gradient descent for the Rosenbrock function
def gradient_descent_rosenbrock(starting_point, learning_rate=0.001, n_iterations=1000):
    x = np.array(starting_point, dtype=float)  # Starting point
    history = [x.copy()]  # Store the history of points

    for _ in range(n_iterations):
        # Compute the gradient
        grad = np.array([
            -2 * (1 - x[0]) - 400 * x[0] * (x[1] - x[0]**2),
            200 * (x[1] - x[0]**2)
        ])
        
        # Update the parameters
        x -= learning_rate * grad
        history.append(x.copy())

    return np.array(history)

# Run Gradient Descent starting from a specific point
starting_point = [-1.5, 2]  # An arbitrary starting point
history = gradient_descent_rosenbrock(starting_point)

# Create a meshgrid for the surface plot
x1_range = np.linspace(-2, 2, 100)
x2_range = np.linspace(-1, 3, 100)
x1, x2 = np.meshgrid(x1_range, x2_range)

# Calculate Rosenbrock function values over the grid
Z = rosenbrock(np.array([x1, x2]))

# Create frames for the GIF
for i in range(len(history)):
    fig = plt.figure(figsize=(10, 8))
    ax = fig.add_subplot(111, projection='3d')

    # Plot the Rosenbrock function surface
    ax.plot_surface(x1, x2, Z, alpha=0.5, cmap='viridis')
    
    # Plot gradient descent path
    ax.scatter(history[:i + 1, 0], history[:i + 1, 1], 
               rosenbrock(history[:i + 1].T), 
               color='red', label='Gradient Descent Path')
    
    # Plot the current point
    ax.scatter(history[i][0], history[i][1], rosenbrock(history[i]), 
               color='blue', s=100, label='Current Point')
    
    ax.set_xlabel('X1')
    ax.set_ylabel('X2')
    ax.set_zlabel('Rosenbrock Function Value')
    ax.set_title(f'Iteration {i + 1}')
    ax.legend()
    
    # Save frame
    plt.tight_layout()
    plt.savefig(f"frames/gradient_descent_rosenbrock_{i}.png")
    plt.close()

# Create a GIF from the saved frames
images = []
for i in range(len(history)):
    images.append(imageio.v2.imread(f"frames/gradient_descent_rosenbrock_{i}.png"))
imageio.mimsave('gradient_descent_rosenbrock_visualization.gif', images, duration=0.1)

# Clean up frames
for i in range(len(history)):
    os.remove(f"frames/gradient_descent_rosenbrock_{i}.png")

print("GIF created successfully: 'gradient_descent_rosenbrock_visualization.gif'")

这段代码模拟了Rosenbrock函数的梯度下降算法,从随机选择的点开始,向全局最小值(1,1)移动。它生成了梯度下降算法如何导航通过函数的谷,并避免局部极小值的收敛过程中的动态可视化。

梯度下降路径可视化

以下是交互式GIF中的完整过程,您可以在其中看到算法在每次迭代中的路径:
img

关键点

  1. 窄谷:Rosenbrock函数特有的窄谷显示了梯度下降如何难以取得快速进展,特别是在早期迭代中。它需要仔细调整学习率,以避免过冲或卡住。
  2. 局部最小值与全局最小值:(1,1)处的全局最小值是最终目标,但沿着,梯度下降可能会通过局部最小值。梯度下降算法的持久性和随着时间的推移找到全局最小值的能力是至关重要的优势,但这个过程可能很慢,而且很有条理,这取决于起点。
  3. 学习率敏感性:调整学习率至关重要。太大的学习率会导致算法超过最优解,而太小的学习率会导致收敛缓慢。在这个可视化中,我们使用了0.001的中等学习率来确保渐进和平滑的下降。

Rosenbrock函数的路径是梯度下降的力量及其局限性的一个奇妙的演示。这个例子说明了梯度下降如何导航充满局部最小值的复杂优化景观,以及调整学习率等关键参数如何影响算法的性能。

通过这个详细的可视化,我们不仅探索了梯度下降的机制,还更深入地了解了它在Rosenbrock等具有挑战性的函数上的行为。正如我们所看到的,通往全局最小值的道路可能并不总是那么简单,但是通过正确的方法,梯度下降始终会找到它的道路。


关注文末名片G-Z-H:【阿旭算法与机器学习】,发送【开源】可获取更多学习资源

在这里插入图片描述

好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿_旭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值