【Deep Learning 2】BGD梯度下降算法

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 🍊本文从行人下山过程引入梯度下降法,随后详细阐述其原理,并做了两个实验更好理解🍊实验一使用Pytorch来求解函数的最小值🍊实验二使用批量梯度下降算法、和机梯度下降算法来拟合函数最佳参数。

 image.gif编辑

🍊本文从行人下山故事引入梯度下降法,随后详细阐述其原理,并做了两个简单实验进行实战

🍊实验一使用Pytorch来求解函数的最小值

🍊实验二使用批量梯度下降算法和随机梯度下降算法来拟合函数求解最佳参数

一、Introduction

1.1 案例

梯度下降/上升算法是一种优化算法,主要用于ML中递归性逼近最小偏差模型,主要用于寻找目标函数的最值(也有可能是拟合函数参数,其本质上是求解Loss最小值),其主要思想如下图中所示,假设有一个人需要经过最短的时间爬到山脚(不考虑走陡坡比较累),怎么做呢?首先他以当前的位置为基准,随后寻找该位置最陡峭的地方,沿该方向行走,走了一段路程后重复上述操作走到山脚就会花费最小时间

image.gif编辑

1.2 抽象化

以数学的角度看待下山过程

目标函数
山顶 函数最值
陡峭方向

梯度正方向(找函数最大值)

梯度反方向(找函数最小值)

下山步子 学习率α
是否已到达山脚 阈值β,判断是否完成收敛
是否已到达山脚 阈值γ,判断是否达到最大迭代次数

因此梯度下降算法求解的过程就是对函数不断的求梯度,并使用学习率α进行约束的

学习率的设置比较灵活,设置的太小似跺小碎步,设置的太大容易扯到蛋。因为我们的最终目标是最短的时间内到达山顶,因此最理想的状态是先大步子下山,随后小碎步逼近山脚,但是这样又出现一个问题是在山脚跺小碎步要很久😕,因此还需要设置一个阈值来进行限制,阈值的设置主要有两种策略,第一种是判断是否收敛完成,第二种为判断是否到达最大迭代次数。

二、Principle

2.1 性质

    • BGD可以找到局部最优解,不一定是全局最优解
    • 若损失函数为凸函数,则BGD所求解一定为全局最优解
    • 所求函数必须为连续可微分

    2.2 单变量函数推导过程

    符号 含义
    θ 待求参数
    α 学习率
    ∇J(θ) 目标函数的梯度

    其推导公式如下

    =−α∗∇J()

    2.3 梯度下降三种形式

    形式 特点
    Batch Gradient Descent 批量梯度下降算法 直接整个数据集来训练,若数据量大将面临内存不足,收敛速度慢问题
    Stochastic Gradient Descent 随机梯度下降算法(在线学习) 一个一个数据来训练,每训练一个就更新一次参数,收敛速度较快,但是可能高频的参数更新导致方差过大最终导致目标函数数值震荡
    Mini-batch Gradient Descent 小批量梯度下降算法 综合BGD和SGD算法,每次取一小个batch数量的数据来计算,训练过程较稳定

    三、Experiment

    3.1 实验一:函数最小值求解

    题目:求解函数y=2.1-2.5x+1.3的最小值

    伪代码

    1 初始化函数、学习率、随机初始值
    2 计算函数梯度
    3 更新参数
    4 循环次数若小于阈值,则输出,若大于阈值则跳2

    image.gif

    代码

    # 求解f(x) = a*x**2 + b*x + c 的最小值
    import numpy as np
    import torch
    # 1 Initialize parameters
    x = torch.tensor(0.0, requires_grad=True)  # x需要被求导
    a = torch.tensor(2.1)
    b = torch.tensor(-2.5)
    c = torch.tensor(1.3)
    # 2 Design optimizer
    optimizer = torch.optim.SGD(params=[x], lr=0.01)  # SGD Stochastic Gradient Descent
    def f(x):
        result = a * torch.pow(x, 2) + b * x + c
        return (result)
    for i in range(500):
        optimizer.zero_grad()  # Initialize grad to zero
        y = f(x)
        y.backward()  # BP
        optimizer.step()  # Update parameters
    print("x=", x.data, "y=", f(x))

    image.gif

    3.2 实验二:函数拟合求参

    题目:已知有如下数据集,其对应的函数为y=ω*x,问如何拟合出最优的ω?

    image.gif编辑

    解题思路

    1  要拟合出最佳的ω,也就是让所有Loss之和最小,因此实际上还是一个求解最小值问题

    2 求解Loss之和的导数

    image.gif编辑

    3 求解更新公式

    image.gif编辑

    3.2.1 BGD梯度下降法

    import numpy as np
    import matplotlib.pyplot as plt
    # Initialize parameters
    x_data = [1.0, 2.0, 3.0]
    y_data = [2.0, 4.0, 6.0]
    w = 1.0
    # Define function
    def forward(x):
        return x * w
    # Define the loss function
    def cost(xs, ys):
        cost = 0
        for x, y in zip(xs, ys):
            y_pred = forward(x)
            cost += (y_pred - y) ** 2
            return cost / len(xs)
    # Gradient function
    def gradient(xs, ys):
        grad = 0
        for x, y in zip(xs, ys):
            grad += 2 * x * (x * w - y)
            return grad / len(xs)
    cost_list = []
    epoch_list = []
    # Trainging
    for epoch in range(100):
        epoch_list.append(epoch)
        cost_val = cost(x_data, y_data)
        cost_list.append(cost_val)
        grad_val = gradient(x_data, y_data)
        w -= 0.1 * grad_val
        print('Epoch:', epoch, 'w=', w, 'loss=', cost_val)
    # Visualize the results
    plt.plot(epoch_list, cost_list)
    plt.ylabel('Loss')
    plt.xlabel('Epoch')
    plt.show()

    image.gif

    image.gif编辑

    可以很明显的看到,随着训练的进行,Loss是平滑的收敛于0

    3.2.2 SGD随机梯度下降法

    SGD与BGD最大的不同在于每个epoch,SGD是一个一个数据来训练,BGD是所有数据一起训练

    import numpy as np
    import matplotlib.pyplot as plt
    # Initialize parameters
    x_data = [1.0, 2.0, 3.0]
    y_data = [2.0, 4.0, 6.0]
    w = 1.0
    # Define function
    def forward(x):
        return x * w
    # Define the loss function
    def loss(x, y):
        y_pred = forward(x)
        return (y_pred - y) ** 2
    # Gradient function
    def gradient(x, y):
        return 2 * x * (x * w - y)
    loss_list = []
    epoch_list = []
    # Trainging
    for epoch in range(100):
        for x, y in zip(x_data, y_data):
            grad = gradient(x, y)
            w -= 0.01 * grad
            Loss = loss(x, y)
            loss_list.append(Loss)
            epoch_list.append(epoch)
            print('Epoch:', epoch, 'w=', w, 'loss=', Loss)
    # Visualize the results
    plt.plot(epoch_list, loss_list)
    plt.ylabel('Loss')
    plt.xlabel('Epoch')
    plt.show()

    image.gif

    image.gif编辑

    可以看到明显的看到,随着训练的进行,Loss上下浮动的收敛于0

    参考资料

    《机器学习》周志华

    《深度学习与机器学习》吴恩达

    《神经网络与与深度学习》邱锡鹏

    《Pytorch深度学习实战》刘二大人

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