深度学习系列--04.梯度下降以及其他优化器

目录

一.梯度概念

1.一元函数

2.二元函数

 3.几何意义上的区别

二.梯度下降

 1.原理

 2.步骤

3.示例代码(Python)

4.不同类型的梯度下降

 5.优缺点

 三.动量优化器(Momentum)

适用场景

1.复杂地形的优化问题

 2.数据具有噪声的问题

3.目标函数变化缓慢的问题

4.特征稀疏的问题

指定参数 

1. params

3. momentum(动量系数)

4. weight_decay(权重衰减)

5. nesterov(是否使用 Nesterov 动量)

 四.Adagrad(Adaptive Gradient Algorithm)

 五.Adadelta

 六.RMSProp(Root Mean Square Propagation)

 七.Adam(Adaptive Moment Estimation)

 八.Nesterov 加速梯度(Nesterov Accelerated Gradient,NAG)


一.梯度概念

梯度和导数既有联系又有区别,下面从一元函数、多元函数以及几何意义等方面为你详细解释:

1.一元函数

联系:在一元函数  中,梯度和导数本质上是相同的概念。导数表示函数在某一点处的变化率,它描述了函数值随自变量变化的快慢程度。其定义为函数在该点的极限:

 

 梯度在一元函数中也是指函数在某一点的变化率,所以此时梯度就是导数。例如,对于函数y=2x+1 ,其导数y`=2 ,这也是该函数在任意点的梯度。

  • 表示形式:在一元函数里,导数和梯度都可以用一个标量值来表示。

2.二元函数

  • 作用:偏导数只能反映函数在某一个坐标轴方向上的变化情况,而梯度则综合了函数在各个自变量方向上的变化信息,它指向函数值增长最快的方向,梯度的模表示函数在该方向上的最大变化率。

 3.几何意义上的区别

  • 导数(一元函数):一元函数的导数在几何上表示函数曲线在某一点处的切线斜率,反映了曲线在该点的倾斜程度。
  • 梯度(多元函数):多元函数的梯度在几何上表示函数在某一点处的一个向量,该向量垂直于函数在该点的等值面(或等高线),并且指向函数值增加的方向。

综上所述,在一元函数中梯度等同于导数,但在多元函数中,梯度是由多个偏导数组成的向量,与导数(偏导数)的概念不同。

二.梯度下降

 梯度下降(Gradient Descent)是一种常用的优化算法,主要用于寻找函数的最小值。在机器学习和深度学习领域,它被广泛应用于模型参数的优化,例如神经网络中权重和偏置的更新,以最小化损失函数。

 1.原理

梯度下降的核心思想基于函数的梯度特性。对于一个多元函数f=(x1,x2,x3.....) ,其梯度vf  是一个向量,它指向函数值增长最快的方向。那么,负梯度方向就是函数值下降最快的方向。梯度下降算法通过不断地沿着负梯度方向更新参数,逐步逼近函数的最小值

 2.步骤

1.初始化参数:随机初始化待优化的参数 θ = (θ1,θ2,θ3.....θn)

 2.计算梯度:计算损失函数 J(θ) 关于参数 θ 的梯度▽θ 

 3.更新参数:根据负梯度方向更新参数,更新公式为:

       θ:=θ - α▽J(θ)

其中, α学习率(Learning Rate),它控制着每次参数更新的步长。

 4.重复步骤 2 和 3:不断重复计算梯度和更新参数的过程,直到满足停止条件,例如达到最大迭代次数、梯度的模小于某个阈值等。

3.示例代码(Python)

以下是一个简单的示例,使用梯度下降算法来最小化一个简单的一元函数 :f(x) = x₂

import numpy as np# 定义目标函数
def f(x):return x**2# 定义目标函数的导数
def df(x):return 2 * x# 初始化参数
x = 2.0
# 学习率
alpha = 0.1
# 最大迭代次数
max_iter = 100# 梯度下降过程
for i in range(max_iter):# 计算梯度gradient = df(x)# 更新参数x = x - alpha * gradient# 输出当前迭代的结果print(f'Iteration {i+1}: x = {x}, f(x) = {f(x)}')print(f'Optimal x: {x}, f(x) = {f(x)}')

4.不同类型的梯度下降

  • 批量梯度下降(Batch Gradient Descent,BGD):在每次迭代中,使用整个训练数据集来计算梯度并更新参数。这种方法的优点是收敛稳定,能够保证收敛到全局最优解(对于凸函数),但计算开销大,尤其是当数据集较大时。
  • 随机梯度下降(Stochastic Gradient Descent,SGD):在每次迭代中,随机选择一个样本进行梯度计算和参数更新。这种方法的优点是计算速度快,能够快速跳出局部最优解,但收敛过程可能会比较震荡,不稳定。
  • 小批量梯度下降(Mini-Batch Gradient Descent,MBGD):结合了批量梯度下降和随机梯度下降的优点,在每次迭代中,随机选择一小部分样本(一个小批量)来计算梯度并更新参数。这种方法在计算效率和收敛稳定性之间取得了较好的平衡,是实际应用中最常用的方法。

 5.优缺点

  • 优点
    • 通用性强:适用于各种类型的损失函数和模型,只要损失函数可导,就可以使用梯度下降算法进行优化。
    • 易于实现:算法的原理和实现都比较简单,容易理解和掌握。
  • 缺点
    • 学习率选择困难:学习率  α的选择对算法的性能影响很大。如果学习率过大,算法可能会发散,无法收敛到最优解;如果学习率过小,算法的收敛速度会非常慢
    • 可能陷入局部最优解:对于非凸函数,梯度下降算法可能会陷入局部最优解,而无法找到全局最优解。不过,在实际应用中,通过一些技巧(如随机初始化、动量法等)可以在一定程度上缓解这个问题。

 三.动量优化器(Momentum)

  • 原理:动量优化器借鉴了物理中动量的概念,它在更新参数时不仅考虑当前的梯度,还会结合之前的梯度信息。在梯度下降的基础上,引入了一个动量项 ,用于累积之前的梯度。动量项可以帮助参数更新在相同方向上加速,减少在局部最优解附近的震荡,更快地越过局部极小值。

 更新公式

  • 优点:收敛速度通常比普通的梯度下降更快,能有效减少震荡,更快地收敛到最优解。
  • 缺点:需要额外的超参数(动量系数)进行调整。

适用场景

1.复杂地形的优化问题

具有高曲率或局部极小值的函数优化

  • 在目标函数的曲面具有复杂的形状,存在许多局部极小值和鞍点时,普通的梯度下降算法容易陷入局部最优解,或者在鞍点附近停滞不前。而动量优化器凭借动量项的累积效应,能够帮助算法更快地跳出局部极小值和鞍点区域。
  • 例如,在训练深度神经网络时,损失函数的地形通常非常复杂。以图像识别任务中的卷积神经网络为例,其损失函数可能存在大量的局部极小值。动量优化器可以让参数更新在遇到局部极小值时,利用之前累积的动量继续前进,从而更有可能找到全局最优解更好的局部最优解

 2.数据具有噪声的问题

随机梯度下降中的噪声影响缓解

  • 在使用随机梯度下降(SGD)处理大规模数据集时,每次迭代仅使用一个或一小部分样本计算梯度,这会导致梯度估计存在噪声,使得参数更新过程产生较大的震荡。动量优化器可以通过动量项平滑这些噪声的影响。
  • 例如,在推荐系统中,训练数据通常非常庞大且具有一定的噪声。当使用 SGD 进行模型训练时,梯度的波动会比较大。引入动量优化器后,动量项可以对梯度的波动进行平均,使得参数更新更加稳定,减少了噪声对训练过程的干扰,从而加快收敛速度。

3.目标函数变化缓慢的问题

加速收敛过程

  • 当目标函数在某些方向上的变化非常缓慢时,普通的梯度下降算法收敛速度会变得很慢。动量优化器可以在这些方向上累积动量,加快参数在这些方向上的更新速度。
  • 比如,在训练循环神经网络(RNN)处理序列数据时,由于梯度消失梯度爆炸问题,目标函数在某些方向上的变化可能极其缓慢。动量优化器能够在这些方向上积累动量,使得参数更新更快地朝着最优解的方向前进,从而显著提高训练效率。

4.特征稀疏的问题

更好地处理稀疏梯度

  • 在处理稀疏数据时,某些特征的梯度可能很少被更新。动量优化器可以记住之前的梯度信息,即使某个特征的梯度在当前迭代中为零,动量项也能利用之前的梯度推动参数更新。
  • 例如,在自然语言处理中的文本分类任务中,使用词袋模型表示文本时,特征向量通常是非常稀疏的。动量优化器可以有效地处理这种稀疏梯度,让模型更好地学习到稀疏特征与目标之间的关系,提高模型的性能。

指定参数 

1. params
  • 说明:这是必须指定的参数,它表示需要优化的模型参数。在 PyTorch 里,通常通过 model.parameters() 来获取模型中所有可训练的参数。

2. lr(学习率) 

  • 说明学习率控制着每次参数更新的步长,是一个非常关键的参数。如果学习率设置过大,模型可能会在最优解附近震荡甚至发散;如果学习率设置过小,模型的收敛速度会变得非常缓慢。
3. momentum(动量系数)
  • 说明动量系数决定了之前梯度信息在当前参数更新中所占的比重。合适的动量系数可以加速模型的收敛速度,减少震荡。一般来说,常见的动量系数取值在 0.9 左右。
4. weight_decay(权重衰减)
  • 说明权重衰减是一种正则化方法,用于防止模型过拟合。它通过在损失函数中添加一个正则化项,使得模型的参数在更新过程中逐渐变小。权重衰减系数通常设置为一个较小的正数,如 0.0001。
5. nesterov(是否使用 Nesterov 动量)
  • 说明:Nesterov 动量是动量优化器的一种改进版本,它在计算梯度时会考虑到下一个位置的参数值,具有更好的收敛性能。可以通过将 nesterov 参数设置为 True 来启用 Nesterov 动量。

 示例代码

import torch
import torch.nn as nn# 定义一个简单的线性模型
class SimpleModel(nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.linear = nn.Linear(10, 1)def forward(self, x):return self.linear(x)model = SimpleModel()
# 学习效率
learning_rate = 0.01
# 动量系数
momentum = 0.9
# 权重衰减
weight_decay = 0.0001
# 是否使用 Nesterov 动量
nesterov = True# 创建优化器
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, momentum=momentum,weight_decay=weight_decay, nesterov=nesterov)

 四.Adagrad(Adaptive Gradient Algorithm)

  • 原理Adagrad 是一种自适应学习率的优化器,它会根据每个参数的历史梯度信息自动调整学习率。对于那些经常更新的参数,学习率会逐渐减小;而对于不经常更新的参数,学习率会相对较大。这样可以让每个参数根据自身的特性进行更合理的更新。
  • 更新公式

  • 优点:无需手动调整学习率,能够自适应地为不同参数分配合适的学习率,在稀疏数据场景下表现良好。
  • 缺点:随着迭代次数的增加,学习率会不断减小,可能导致后期收敛速度过慢,甚至提前停止更新。

 五.Adadelta

  • 原理Adadelta 是对 Adagrad 的改进,它解决了 Adagrad 学习率单调递减的问题。Adadelta 不需要手动设置全局学习率,而是通过计算梯度的指数移动平均来动态调整学习率,使得学习率在训练过程中不会一直减小。
  • 优点:无需设置全局学习率,避免了 Adagrad 学习率衰减过快的问题,在不同的数据集和模型上都有较好的表现。
  • 缺点:需要调整的超参数相对较多,包括指数衰减率等。

 六.RMSProp(Root Mean Square Propagation)

  • 原理RMSProp 也是一种自适应学习率的优化器,它与 Adadelta 类似,通过计算梯度平方的指数移动平均来调整学习率。RMSProp 能够有效地缓解 Adagrad 学习率下降过快的问题,使得模型在训练过程中能够持续学习。
  • 更新公式

  • 优点:自适应调整学习率,在处理非凸优化问题时表现较好,收敛速度较快。
  • 缺点:仍然需要手动调整学习率和衰减率等超参数。

 七.Adam(Adaptive Moment Estimation)

  • 原理Adam 结合了动量优化器和自适应学习率的思想,它同时计算梯度的一阶矩估计均值)和二阶矩估计方差),并利用这些估计值来动态调整每个参数的学习率。Adam 具有较快的收敛速度和较好的稳定性。
  • 更新公式

  • 优点:收敛速度快,对不同类型的数据集和模型都有较好的适应性,在深度学习中被广泛使用。
  • 缺点:可能会在某些情况下出现过拟合的问题,需要进行适当的正则化处理

 八.Nesterov 加速梯度(Nesterov Accelerated Gradient,NAG)

  • 原理NAG 是动量优化器的一种改进版本。它在计算梯度时,先根据动量项大致预估下一个位置的参数值,然后在这个预估位置计算梯度,这样可以让优化器更有前瞻性,提前知道梯度的变化趋势,从而更快地收敛。

 更新公式:

  • 优点:比传统的动量优化器收敛速度更快,尤其在处理一些复杂的优化问题时表现更优。
  • 缺点:同样需要调整动量系数和学习率等超参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/69234.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编程AI深度实战:给vim装上AI

系列文章: 编程AI深度实战:私有模型deep seek r1,必会ollama-CSDN博客 编程AI深度实战:自己的AI,必会LangChain-CSDN博客 编程AI深度实战:给vim装上AI-CSDN博客 编程AI深度实战:火的编程AI&…

2025年2月6日(anaconda cuda 学习 基本命令)

查看电脑的显卡型号是否支持CUDA的安装 https://developer.nvidia.com/zh-cn/cuda-gpus 查看可以安装的CUDA版本 https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html CUDA安装地址 https://developer.nvidia.com/cuda-toolkit-archive Anaconda下载地址 htt…

自动化构建——make/makefile

目录 背景使用推导过程如果多个文件呢?? 背景 会不会写makefile,从侧面可以说明一个人是否具有完成大型工程的能力makefile带来的好处就是——”自动化编译“,一旦写好,只需要一个make命令,整个工程完全自…

深度整理总结MySQL——SQL的执行顺序和流程

SQL的执行顺序和流程 SQL的执行顺序执行一条select语句,发生了什么呢连接器查询缓存解析SQL执行SQL预处理器优化器执行器 总结 SQL的执行顺序 这是一条标准的查询语句: 但实际上并不是从上到下去解析的,真实的执行顺序是: 我们先执行from,join来确定表之间的连接关系&#x…

R语言 | 使用 ComplexHeatmap 绘制热图,分区并给对角线分区加黑边框

目的:画热图,分区,给对角线分区添加黑色边框 建议直接看0和4。 0. 准备数据 # 安装并加载必要的包 #install.packages("ComplexHeatmap") # 如果尚未安装 library(ComplexHeatmap)# 使用 iris 数据集 #data(iris)# 选择数值列&a…

11 享元(Flyweight)模式

享元模式 1.1 分类 (对象)结构型 1.2 提出问题 做一个车管所系统,将会产生大量的车辆实体,如果每一个实例都保存自己的所有信息,将会需要大量内存,甚至导致程序崩溃。 1.3 解决方案 运用共享技术有效…

2025年Android NDK超全版本下载地址

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分…

【CPP】CPP经典面试题

文章目录 引言1. C 基础1.1 C 中的 const 关键字1.2 C 中的 static 关键字 2. 内存管理2.1 C 中的 new 和 delete2.2 内存泄漏 3. 面向对象编程3.1 继承和多态3.2 多重继承 4. 模板和泛型编程4.1 函数模板4.2 类模板 5. STL 和标准库5.1 容器5.2 迭代器 6. 高级特性6.1 移动语义…

安卓开发,打开PDF文件

1、把PDF文件复制到raw目录下 &#xff08;1&#xff09;新建一个Android Resource Directory (2)Resource type 改成 raw (3) 把PDF文件复制到raw目录下 2、activity_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayoutxmlns:and…

渗透测试之文件包含漏洞 超详细的文件包含漏洞文章

目录 说明 通常分为两种类型&#xff1a; 本地文件包含 典型的攻击方式1&#xff1a; 影响&#xff1a; 典型的攻击方式2&#xff1a; 包含路径解释&#xff1a; 日志包含漏洞&#xff1a; 操作原理 包含漏洞读取文件 文件包含漏洞远程代码执行漏洞: 远程文件包含…

Git--使用教程

Git的框架讲解 Git 是一个分布式版本控制系统&#xff0c;其架构设计旨在高效地管理代码版本&#xff0c;支持分布式协作&#xff0c;并确保数据的完整性和安全性。 Git 的核心组件&#xff1a; 工作区&#xff08;Working Directory&#xff09;&#xff1a; 工作区是你在本…

Deepseek 接入Word处理对话框(隐藏密钥)

硅基流动邀请码&#xff1a;1zNe93Cp 邀请链接&#xff1a;网页链接 亲测deepseek接入word&#xff0c;自由调用对话&#xff0c;看截图有兴趣的复用代码&#xff08;当然也可以自己向deepseek提问&#xff0c;帮助你完成接入&#xff0c;但是提问逻辑不一样给出的答案是千差万…

Redis存储⑤Redis五大数据类型之 List 和 Set。

目录 1. List 列表 1.1 List 列表常见命令 1.2 阻塞版本命令 1.3 List命令总结和内部编码 1.4 List典型使用场景 1.4.1 消息队列 1.4.2 分频道的消息队列 1.4.3 微博 Timeline 2. Set 集合 2.1 Set 集合常见命令 2.2 Set 集合间命令 2.3 Set命令小结和内部编码 2.…

DeepSeek 的含金量还在上升

大家好啊&#xff0c;我是董董灿。 最近 DeepSeek 越来越火了。 网上有很多针对 DeepSeek 的推理测评&#xff0c;除此之外&#xff0c;也有很多人从技术的角度来探讨 DeepSeek 带给行业的影响。 比如今天就看到了一篇文章&#xff0c;探讨 DeepSeek 在使用 GPU 进行模型训练…

深入剖析 Bitmap 数据结构:原理、应用与优化策略

深入理解 Bitmap 数据结构 一、引言 在计算机科学领域&#xff0c;数据的高效存储和快速处理一直是核心问题。随着数据量的不断增长&#xff0c;如何用最少的空间和最快的速度来表示和操作数据变得至关重要。Bitmap&#xff08;位图&#xff09;作为一种简洁而强大的数据结构…

【后端开发】系统设计101——通信协议,数据库与缓存,架构模式,微服务架构,支付系统(36张图详解)

【后端开发】系统设计101——通信协议&#xff0c;数据库与缓存&#xff0c;架构模式&#xff0c;微服务架构&#xff0c;支付系统&#xff08;36张图&#xff09; 文章目录 1、通信协议通信协议REST API 对比 GraphQL&#xff08;前端-web服务&#xff09;grpc如何工作&#x…

DS图(中)(19)

文章目录 前言一、图的遍历广度优先遍历深度优先遍历 二、最小生成树Kruskal算法Prim算法两种方法对比 总结 前言 承上启下&#xff0c;我们来学习下图的中篇&#xff01;&#xff01;&#xff01; 一、图的遍历 图的遍历指的是遍历图中的顶点&#xff0c;主要有 广度优先遍历 …

DeepSeek 发布多模态 Janus-Pro

DeepSeek在接连发布大语言模型V3&#xff0c;推理模型R1之后&#xff0c;DeepSeek随后又发布两款多模态框架&#xff1a;Janus-Pro 与 JanusFlow &#xff0c;引领多模态模型新时代&#xff01; 而且依然是保持了一贯的风格&#xff0c;保持了完全开源&#xff0c;今天我们来看…

【QT笔记】使用QScrollArea实现多行文本样式显示

目录 一、QScrollArea 的基本概念 二、demo代码 三、实现效果 1、页面空间足够&#xff0c;无滚动条时显示效果 2、有滚动条时显示效果 一、QScrollArea 的基本概念 QScrollArea 是 Qt 框架中用于提供一个滚动条区域&#xff0c;允许用户滚动查看比当前可视区域更大的内容…

达梦数据库从单主模式转换为主备模式

目录标题 达梦数据库单主转主备配置笔记前期准备服务器环境数据库安装磁盘空间 流程流程图说明 详细步骤1. 检查主库归档模式2. 配置主库配置文件dm.ini 文件dmmal.ini 文件dmarch.ini 文件 3. 备份主库数据库4. 备库配置新建备库数据库配置备库配置文件dm.ini 文件复制主库的 …