深度学习系列--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 是动量优化器的一种改进版本。它在计算梯度时,先根据动量项大致预估下一个位置的参数值,然后在这个预估位置计算梯度,这样可以让优化器更有前瞻性,提前知道梯度的变化趋势,从而更快地收敛。
更新公式:
- 优点:比传统的动量优化器收敛速度更快,尤其在处理一些复杂的优化问题时表现更优。
- 缺点:同样需要调整动量系数和学习率等超参数。
相关文章:

深度学习系列--04.梯度下降以及其他优化器
目录 一.梯度概念 1.一元函数 2.二元函数 3.几何意义上的区别 二.梯度下降 1.原理 2.步骤 3.示例代码(Python) 4.不同类型的梯度下降 5.优缺点 三.动量优化器(Momentum) 适用场景 1.复杂地形的优化问题 2.数据具有噪声的问…...

2022java面试总结,1000道(集合+JVM+并发编程+Spring+Mybatis)的Java高频面试题
1、面试题模块汇总 面试题包括以下十九个模块: Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 。如下图所示…...

Ubuntu MKL(Intel Math Kernel Library)
Get Intel oneAPI Math Kernel Library wget https://registrationcenter-download.intel.com/akdlm/IRC_NAS/79153e0f-74d7-45af-b8c2-258941adf58a/intel-onemkl-2025.0.0.940_offline.sh sudo sh ./intel-onemkl-2025.0.0.940_offline.sh MKL库的配置和使用-CSDN博客 CMak…...

消费电子产品中的噪声对TPS54202的影响
本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时,也能帮助其他需要参考的朋友。如有谬误,欢迎大家进行指正。 一、概述 在白色家电领域,降压转换器的应用非常广泛,为了实现不同的功能就需要不同的电源轨。TPS542…...
第四十章:职场转折:突破困境,重新出发
从绍兴与岳父岳母温馨相聚归来后,小冷满心都是温暖与幸福,本以为生活与工作会继续平稳前行,然而,命运却悄然为他的职场之路埋下了转折的伏笔。 平静工作下的暗潮涌动 小冷所在的公司是一家专注于地图导航与位置服务的企业…...
c++ 不定参数,不定类型的 max,min 函数
MSVC\14.29.30133\include\utility(33,19): error C2064: 项不会计算为接受 2 个参数的函数 max min #include <iostream> #include <type_traits>// 自定义 min_gd(支持任意类型和数量参数) template <typename... Args> auto min_g…...

数据库的关系代数
关系就是表 属性(Attribute)是关系中的列.例如,关系 “学生” 中可能有属性 “学号”、“姓名”、“班级”。 元组(Tuple)是关系中的一行数据 1. 基本运算符 选择(Selection) 符号:σ 作用:从关…...
VSCode使用总结
1、VSCode左边资源窗口字体大小设置 方法一(使用,已成功) 进入安装目录Microsoft VS Code\resources\app\out\vs\workbench(如果是下载的压缩包,解压后resources\app\out\vs\workbench) 打开文件 workbench.desktop.main.css 搜…...

关系模型的数据结构及形式化定义
1 关系模型的核心结构 ①单一的数据结构(关系) 现实世界的实体以及实体间的各种联系均用关系来表示 ②逻辑结构(二维表) 从用户角度,关系模型中数据的逻辑结构是一张二维表,行代表元组(记录&a…...

【C++入门讲解】
目录 编辑 --------------------------------------begin---------------------------------------- 一、C简介 二、开发环境搭建 主流开发工具推荐 第一个C程序 三、核心语法精讲 1. 变量与数据类型 2. 运算符大全 3. 流程控制结构 4. 函数深度解析 5. 数组与容…...

数据表中的视图操作
文章目录 一、视图概述二、为什么要使用视图三、创建视图四、查看视图 一、视图概述 小学的时候,每年都会举办一次抽考活动,意思是从每一个班级里面筛选出几个优秀的同学去参加考试,这时候很多班级筛选出来的这些同学就可以临时组成一个班级…...

BFS算法篇——广度优先搜索,探索未知的旅程(上)
文章目录 前言一、BFS的思路二、BFS的C语言实现1. 图的表示2. BFS的实现 三、代码解析四、输出结果五、总结 前言 广度优先搜索(BFS)是一种广泛应用于图论中的算法,常用于寻找最短路径、图的遍历等问题。与深度优先搜索(DFS&…...
mongodb 使用内存过大分析
os 分析 内存使用 ps aux|head -1;ps aux|grep -v PID|sort -rn -k 4|head -10swap 使用 for i in $(ls /proc | grep "^[0-9]" | awk $0>100); do awk /Swap:/{aa$2}END{print "$i",a/1024"M"} /proc/$i/smaps;done| sort -k2nr | headmo…...
CNN-day5-经典神经网络LeNets5
经典神经网络-LeNets5 1998年Yann LeCun等提出的第一个用于手写数字识别问题并产生实际商业(邮政行业)价值的卷积神经网络 参考:论文笔记:Gradient-Based Learning Applied to Document Recognition-CSDN博客 1 网络模型结构 …...
登录到docker里
在Docker中登录到容器通常有两种情况: 登录到正在运行的容器内部:如果你想要进入到正在运行的容器内部,可以使用docker exec命令。 登录到容器中并启动一个shell:如果你想要启动一个容器,并在其中启动一个shell&…...
利用PHP爬虫开发获取淘宝分类详情:解锁电商数据新视角
在电商领域,淘宝作为中国最大的电商平台之一,其分类详情数据对于市场分析、竞争策略制定以及电商运营优化具有极高的价值。通过PHP爬虫技术,我们可以高效地获取这些数据,为电商从业者提供强大的数据支持。本文将详细介绍如何使用P…...

LeetCode 142题解|环形链表II的快慢指针法(含数学证明)
题目如下: 解题过程如下: 思路:快慢指针在环里一定会相遇,相遇结点到入环起始结点的距离 链表头结点到入环起始结点的距离(距离看从左往右的方向,也就是单链表的方向),从链表头结点…...

[图文]课程讲解片段-Fowler分析模式的剖析和实现01
解说: GJJ-004-1,分析模式高阶Fowler分析模式的剖析和实现,这个课是针对Martin Fowler的《分析模式》那本书里面的模式来讲解,对里面的模式来剖析,然后用代码来实现。 做到这一步的,我们这个是世界上独…...
Dify使用
1. 概述 官网:Dify.AI 生成式 AI 应用创新引擎 文档:欢迎使用 Dify | Dify GITHUB:langgenius/dify: Dify is an open-source LLM app development platform. Difys intuitive interface combines AI workflow, RAG pipeline, agent capabilities, model management, ob…...

解锁 DeepSeek 模型高效部署密码:蓝耘平台全解析
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...