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

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
大数据开发治理平台 DataWorks,不限时长
简介: 🍊本文从行人下山过程引入梯度下降法,随后详细阐述其原理,并做了两个实验更好理解🍊实验一使用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深度学习实战》刘二大人

    目录
    相关文章
    |
    13天前
    |
    算法 vr&ar Python
    R语言用极大似然和梯度下降算法估计GARCH(p)过程
    R语言用极大似然和梯度下降算法估计GARCH(p)过程
    12 0
    |
    2月前
    |
    机器学习/深度学习 算法
    反向传播原理的梯度下降算法
    反向传播原理的梯度下降算法
    |
    8月前
    |
    机器学习/深度学习 算法 大数据
    机器学习梯度下降算法
    机器学习梯度下降算法
    39 0
    |
    8月前
    |
    算法
    梯度下降算法详解(从下山比喻、数学推导到代码实现)
    梯度下降算法详解(从下山比喻、数学推导到代码实现)
    101 0
    |
    9月前
    |
    机器学习/深度学习 算法 Python
    数学和微分角度理解梯度下降算法
    数学和微分角度理解梯度下降算法
    |
    9月前
    |
    机器学习/深度学习 算法 PyTorch
    Gradient Descent Algorithm 梯度下降算法
    Gradient Descent Algorithm 梯度下降算法
    53 0
    |
    10月前
    |
    存储 机器学习/深度学习 算法
    线性回归 梯度下降算法大全与基于Python的底层代码实现
    梯度下降是一种常用的优化算法,它通过不断迭代来最小化一个损失函数。根据不同的损失函数和迭代方式,梯度下降可以被分为批量梯度下降(Batch Gradient Descent,BGD)、随机梯度下降(Stochastic Gradient Descent,SGD)、小批量梯度下降(Mini-batch Gradient Descent)、共轭梯度法(Conjugate Gradient,CG)等。
    |
    11月前
    |
    机器学习/深度学习 算法 PyTorch
    【Deep Learning 3】BP反向传播算法
    🍊本文从梯度下降算法开始介绍BP反向传播算法背景,并使用一个实际案例来模拟BP过程来讲解其原理。最后做了三个实验进行BP实战🍊实验一手撸一个y=ω*x模拟反向传播过程🍊实验二将BP应用到线性回归模型中进行参数拟合🍊实验三使用Pytorch重现实验二过程。
    107 0
    |
    11月前
    |
    算法
    【Deep Learning 1】GA遗传算法
    🍊本文以一个案例题目出发,详细描述了遗传算法过程,并做了两个实现复现了案例🍊实验一:纯手打原生代码复现案例🍊实验二:使用第三方库scikit-opt复现案例。
    185 0
    |
    12月前
    |
    算法
    单变量批量梯度下降算法与单变量随机梯度下降算法
    通过这些图形,我希望你能更好地理解这些代价函数J所表达的值是什么样的,它们对应的假设是什么样的,以及什么样的假设对应的点,更接近于代价函数的最小值。
    80 0

    热门文章

    最新文章