深度学习笔记之梯度下降、反向传播与内置优化器
文章目录
- 1. 梯度下降法
- 2. 反向传播算法
- 3. PyTorch内置的优化器
- 3.1 SGD优化器
- 3.2 RMSprop优化器
- 3.3 Adam优化器
1. 梯度下降法
笔者往期的机器学习笔记: 机器学习之梯度下降算法
梯度下降法是一种致力于找到函数极值点的算法。
所谓“训练”或“学习”就是改进模型参数,以便通过大量训练步骤将损失最小化的过程。
训练过程就是求解损失函数最小值的过程,在此过程中将梯度下降法应用于寻找损失函数的极值点便构成了依据输入数据的模型学习。
梯度下降法的思路很简单,就是沿着损失函数下降最快的方向改变模型参数,直到到达最低点。在此过程中,需要求解模型参数的梯度,梯度是一种数学运算,它与导数类似,是微积分中一个很重要的概念,在单变量的函数中,梯度其实就是函数的微分,代表函数在某个给定点的切线的斜率;在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向。因此梯度可应用于输入为一个向量、输出为一个标量的函数,损失函数就属于这种类型。
因为梯度的方向就是损失函数变化最快的方向,所以当参数沿着梯度相反的方向改变时,就能让函数值下降得最快。所以,我们的训练就是重复利用这个方法反复求取梯度、修改模型参数,直到最后达到损失函数的最小值。
梯度的输出是一个由若干偏导数构成的向量,它的每个分量对应于函数对输入向量的相应分量的偏导,在求偏导时,可将当前变量以外的所有变量视为常数,然后运用单变量求导法则。有一点需要注意,当提及损失函数的输入变量时,指的是模型的参数(权重和偏置),而非实际数据集的输入特征。一旦给定数据集和所要使用的特征类型,这些输入特征便固定下来,无法进行优化。
我们所计算的偏导数是损失函数相对于模型中的每个参数而言的,为了更简洁地解释损失优化过程,我们绘制了一个假设的损失函数曲线,如下图所示:
假设上述曲线对应于损失函数曲线,箭头所在的点代表模型参数的当前值,即现在所在的位置。我们需要沿着梯度的反方向移动,在上图中用箭头表示,因此,为了减小损失,需要沿着箭头向左移动。此外,箭头的长度概念化地表示了如果在对应的方向移动,损失能够下降多少。在训练过程中,我们沿着箭头的方向移动,再次计算梯度,并重复这个过程,直到梯度的模为0,将到达损失函数的极小值点。这正是训练的目标,这个过程的图形化表示可参考下图:
权重的优化过程可以用公式表示如下:
W e i g h t s i + 1 = W e i g h t s i − l r × ∇ W e i g h t s i Weightsi+1=Weightsi-lr×∇Weightsi Weightsi+1=Weightsi−lr×∇Weightsi
式中,lr表示学习速率(learning rate),用来对梯度进行缩放,新的权重等于当前权重减去权重的梯度乘以学习速率,学习速率并不是模型需要推断的值,它是一个超参数(hyperparameter)。
所谓超参数是指那些需要我们手工配置的参数,需要为它指定正确的值。如果学习速率太小,则找到损失函数极小值点时可能需要许多轮迭代,训练过程会非常慢;如果学习速率太大,则算法可能会“跳过”极小值点并且周期性地来回“跳跃”而且永远无法找到极小值点,这种现象被称为“超调”,如下图所示:
因此,在设定学习速率的值时,我们既希望学习速率足够大,能够快速地进行梯度下降学习,又希望学习速率不能太大,甚至越过最低点,导致模型的损失函数在最低点附近来回跳跃。
学习速率是在训练过程中需要特别注意的一个超参数,在实际应用中,过大的学习速率很容易引起梯度的震荡,导致训练失败。当我们观察损失变化曲线时,如果发现损失没有下降趋势,反而在震荡,首先应该想到调整学习速率。
在实践中,可在模型训练的初期使用较大的学习速率,在训练接近极值点时使用较小的学习速率,从而逼近损失函数极小值点。
大家可能会有疑问,为什么要使用学习速率对梯度进行缩放呢?如果不设置学习速率对梯度进行缩放,那么梯度的变化几乎决定于当前训练批次,而忽略了所有之前的训练样本,这显然是不合适的,我们不希望单个样本或者单个批次的样本主导模型学习,而是希望模型能从所有的样本中学习,这就需要通过学习速率对梯度进行缩放,模型在训练循环中,从每一个批次中都得到学习,同时模型参数的变化又不是由单个批次主导的,这样训练出的模型泛化能力才足够好。
除了学习速率,还有一些其他问题也会影响梯度下降算法的性能。例如,损失函数的局部极值点。我们再次回到之前的损失函数曲线示例,如果权值的初值靠近损失函数右侧的“谷底”,则该算法的工作过程如下图所示:
如果权重的起始点落在了上图中第一个箭头位置,随着训练,模型参数将沿着梯度下降的方向移动,直到到达最低点并终止迭代,因为模型认为已经找到了一个极值点,在这个极值点,梯度的模为0,但显然这不是全局最小极值点。梯度下降法无法区分迭代终止时到底是到达了全局最小点还是局部极小点,后者往往只在一个很小的邻域内为最优。
在深度学习发展的今天,局部极值问题已经不再是研究的重点,因为我们可通过更好的权值随机初始化来改善局部极值点问题。如果权值随机落在了左边,模型就可以找到全局最小值点。通过使用随机值初始化权重,可以增加从靠近全局最优点附近开始下降的机会。从实际训练来看,损失函数总能下降到全局最小点。
2. 反向传播算法
反向传播(back propagation,BP)算法
是一种高效计算数据流图中梯度的算法,在多层神经网络的训练中具有举足轻重的地位。
多层神经网络的参数多,梯度计算比较复杂,反向传播算法可以用来解决深层参数训练问题。
神经网络训练是通过误差反向传播实现的,通过这种方法,根据前一次运行获得的错误率对神经网络的权值进行微调。
详细来说,计算分为两个过程,首先是前馈,也就是输入经过网络得到预测输出,并用预测输出与真实值计算损失;然后反向传播算法根据损失进行后向传递,计算网络中模型的每一个权值的梯度;最后根据梯度调整模型的权值。正确地采用这种方法可以降低错误率,提高模型的可靠性。
总结这个监督学习过程,就是试图找到一个将输入数据映射到正确输出的函数,从而较好地实现某个特定的功能(如分类就是将猫的图片映射到猫这个标签)。
具体到前馈神经网络,需要实现的目的很简单,就是希望损失函数达到最小值,因为只有这样,实际输出和预期输出的差值(损失)才最小。
那么,如何从众多网络参数(神经元之间的连接权值和偏置)中找到最佳的参数使得损失最小呢?这就应用到了梯度下降的方法找极值,其中最关键的是,如何计算梯度呢?那就用到了反向传播算法。
在多层神经网络中要计算每一层的梯度,就需要从输出层开始逐层计算,反向传播算法利用链式法则,避开了这种逐层计算的冗余。
神经网络中每一层的导数都是后一层的导数与前一层输出之积,这正是链式法则的奇妙之处,误差反向传播算法利用的正是这一特点避免了计算冗余。
前馈时,从输入开始逐一计算每个隐藏层的输出,直到输出层;然后开始计算导数,并从输出层经各隐藏层逐一反向传播。为了减少计算量,还需对所有已完成计算的元素进行复用,这便是反向传播算法名称的由来。
3. PyTorch内置的优化器
PyTorch框架内置了自动求导模块和优化器,自动求导模块可以根据损失函数对模型的参数进行求梯度运算,这个过程中使用了反向传播算法,而优化器会根据计算得到的梯度,利用一些策略去更新模型的参数,最终使得损失函数下降。
可以看出,优化器的功能就是管理和更新模型中可学习参数的值,并通过一次次训练使得模型的输出更接近真实标签。
下面重点讲解PyTorch中的优化器,在PyTorch中,torch.optim模块实现了各种优化算法,最常用的优化方法已经得到内置支持,可以直接调用。
3.1 SGD优化器
SGD(stochastic gradient descent,torch.optim.SGD)
是最为简单的优化器,它所实现的就是前面介绍的梯度下降算法,当然在梯度下降过程中要使用学习速率缩放梯度。SGD的缺点在于收敛速度慢,可能在鞍点处震荡,并且,如何合理地选择学习速率是SGD的一大难点。针对SGD可能在鞍点处震荡这个缺点,可以为其引入动量Momentum加速SGD在正确方向的下降并抑制震荡,具体使用中可通过参数momentum设置。
3.2 RMSprop优化器
RMSprop优化器
(torch.optim.RMSprop)是对AdaGrad算法的一种改进。在原始的优化算法中,目标函数自变量的每一个元素在相同时间步都使用同一个学习速率来自我迭代,但是统一的学习速率难以适应所有维度变化不同的问题,因此RMSprop根据自变量在每个维度的梯度值的大小来调整各个维度上的学习速率,并且增加了一个衰减系数来控制历史信息的获取多少。也就是说,设置全局学习速率之后,每次通过全局学习速率逐参数除以经过衰减系数控制的历史梯度平方和的平方根,使得每个参数的学习速率不同。
经验上,RMSprop被证明是有效且实用的深度学习网络优化算法,特别是针对序列问题的训练,使用RMSprop会有不错的效果。
3.3 Adam优化器
Adam优化器
(torch.optim.Adam)可以认为是RMSprop和Momentum的结合。Adam不仅对二阶动量使用指数移动平均,还对一阶动量也使用指数移动平均计算。这就相当于在RMSProp基础上对小批量随机梯度也做了指数加权移动平均。
Adam主要包含以下几个显著的优点。
-
实现简单,计算高效,对内存需求少。
-
参数的更新不受梯度的伸缩变换影响。
-
超参数具有很好的解释性,且通常无须调整或仅需很少的微调。
-
更新的步长能够被限制在大致的范围内(初始学习速率)。
-
能自动调整学习速率。
-
适合应用于大规模的数据及参数的场景。
-
适用于不稳定目标函数。
-
适用于梯度稀疏或梯度存在很大噪声的问题。
工程上,Adam是目前最常用的优化器,在很多情况下,作为默认优化器都可以获得不错的效果。因此在以后的学习和训练中,可以优先选择使用Adam优化器。
相关文章:

深度学习笔记之梯度下降、反向传播与内置优化器
文章目录 1. 梯度下降法2. 反向传播算法3. PyTorch内置的优化器3.1 SGD优化器3.2 RMSprop优化器3.3 Adam优化器 1. 梯度下降法 笔者往期的机器学习笔记: 机器学习之梯度下降算法 梯度下降法是一种致力于找到函数极值点的算法。 所谓“训练”或“学习”就是改进…...

Visual Studio 2022 搭建GLFW OpenGL开发环境
最近工作需要 需要写一个全景的视频播放器 网上搜了下大概解决方案是 ffmpegopengl b站有很多视频 按照视频 搭建了OpenGL的开发环境 先去GLFW的网站下载 windows平台的库文件 为什么使用GLFW 因为GLFW是跨平台的 我下的是64位版本解压后有目录如下 包含了动态库和静态…...

四元数快速入门【Quaternion】
四元数(Quaternion)是用于旋转和拉伸向量的数学运算符。 本文提供了一个概述,以帮助理解在空间导航等应用程序中对四元数的需求。 推荐:用 NSDT场景设计器 快速搭建3D场景。 可以通过多种方式在空间中准确定位、移动和旋转物体。 …...
为什么我们要使用向量化运算
问题背景 如果你是matlab用户,你一般都会使用向量化运算进行编程。原因也许很简单,因为matlab针对向量化运算在底层做了深度优化,尤其是针对矩阵乘法调用了MKL之类的高度优化的第三库来加速。所以我们在推演算法的阶段,尽量的以向…...

Makefile零基础教学(一)初识makefile
从这篇文章开始就开始进入 Makefile 的零基础教程,相信只要看了本教程的都可以对 Makefile 有一个清晰的理解和正确的运用。那么现在就开始我们的 Makefile 学习之路。 文章目录 一、什么是 Makefile,优点?二、什么是 make, 为什么使用make?…...

如何使用SpringMVC之常用注解
❣️关注专栏:JavaEE Spring MVC ⌛️ 1. Spring MVC 创建和连接⌛️ 1.1 RequestMapping⌛️ 1.2 GetMapping⌛️ 1.3 PostMapping ⌛️ 2. 获取参数⌛️ 2.1 传递/获取单个参数⌛️ 2.2 传递/获取多个参数⌛️ 2.3 传递/获取对象⌛️ 2.4 参数重命名⌛️ 2.4.1 …...

Vue3的axios请求封装,请求拦截,相应拦截
对于三者放在Service.js中封装,方便使用 axios.create 的作用是创建一个新的 axios 实例,该实例可以具有自定义配置。通过使用 axios.create,您可以为任何 API 生成一个客户端,并在使用同一客户端的任何调用中重复使用相同的配置…...

ZC706P试验PL_DDR3内存条的步骤方法
ZC706P 板卡完全兼容XILINX官方的ZC706,当然也支持PL外挂的1G的DDR3内存条,这个片BLOG我提供从官方下载的一个文档和一个项目,演示一下验证DDR3的步骤。 步骤1:准备好板子,安装好软件。 链接:https://pan.baidu.com/s…...

通达信W底形态选股公式,也称双底形态
W底形态,也称双底形态,是一种经典的技术分析形态,代表了跌势的逆转。看起来像字母 "W",描述了一波下跌,反弹,再次下跌到与上一波下跌相同或相近的位置,最后是另一波反弹。W底形态两次…...

java语言与算法、数据结构的用法
Java语言是一种广泛使用的计算机编程语言,也是开发各种软件和操作系统的重要工具之一。除了具有高效性和可移植性之外,Java语言还具有丰富的算法和数据结构支持,可以帮助程序员轻松地解决各种问题。 算法和数据结构是计算机科学中的两个基本…...

中国社科院与美国杜兰大学金融管理硕士项目,引领你走在金融行业前沿
作为金融领域从业人员时刻都在关注行业最新资讯,只有掌握一手的前沿讯息,才能在职场上无往不胜。针对在职的你,如何利用业余时间让自己更增值呢,中国社科院与美国杜兰大学金融管理硕士项目引领你走在金融行业前沿。 金融管理硕士…...

第三十五章 Unity人形动画(下)
本章内容主要就是动画数据的独立文件使用方式。有了独立的动画文件,我们就可以将其应用到其他模型上面了。最简单的方式就是,我们可以给其他模型编辑动画控制器的时候,使用这些动画文件。Unity则给我们提供了更加高级的共享方式,就…...

vue导入导出excel、设置单元格背景色、文字居中、合并单元格、设置列宽(使用xlsx库和xlsx-style库)
xlsx xlsx是由SheetJS开发的一个处理excel文件的npm库 适用于前端开发者实现导入导出excel文件的经典需求 为了区别于xlsx文件,突出其应用语言,该库通常又被称为js-xlsx 导出js数据为Excel文件 需要以下步骤: 安装 xlsx 库 你可以使用 …...

java 线程池
线程池 是 一个 容器,其中管理着多个线程(预先创建并维护一定数量的线程),当有一个任务a需要一个线程去完成时,从容器(线程池)中获取一个线程A去执行任务a,当线程A完成任务a后,线程A…...

音频焦点使用及原理
音频焦点使用及原理 本博客代码基于Android 10源码 为什么会有音频焦点这一概念? 在Android音频领域中,应用层所有的App播放音频,最终都是走到音频回播线程PlaybackThread中,如果多个App都走到同一个PlaybackThread中去࿰…...

PyQt5桌面应用开发(8):从QInputDialog转进到函数参数传递
本文目录 PyQt5桌面应用系列How old are you, Dialog?QInputDialog minimalistwhy not lambdaand how partial worksSummary PyQt5桌面应用系列 PyQt5桌面应用开发(1):需求分析 PyQt5桌面应用开发(2):事件…...

2.0 Vue框架设计的核心要素
本章主要讲解,一个好的框架在构建的时候,需要考虑到的要素,包含报错信息反馈、警告信息反馈、减少打包体积、良好的输出、特性开关(兼容)等 1、提升用户开发体验 提升用户开发体验主要体现在用户使用框架进行开发时&…...

“智慧赋能 强链塑链”——精细化工行业仓储物流数字化转型探讨
精细化工行业作为衡量国家化学工业水平高低的重要标志,为国民经济提供重要的终端产品支持,相比较大化工产品,精细化工产品需要高度专业技能和工艺,其生产过程需要复杂的化学反应,以及严格的控制条件,产出的…...

用DG备库做的rman备份恢复一个数据库
环境描述: 1.因为主库存储空间不足,于是将备份放在dg备库上做。 2.主库因为磁盘空间问题,数据文件有两个目录。 3.dg备库因为主库两个数据文件目录里面有两个同名数据文件,所有dg备库也有两个数据文件目录。 4.主库与备库与测…...

JAVA中的IO操作有哪些?
在Java编程语言中,输入/输出(IO)操作是很重要的部分,它允许程序从外部系统读取数据,或将数据输出到外部系统。Java提供了一组强大的IO类库,可以让开发人员方便地进行各种IO操作。 Java中的IO操作可以分为两…...

10:00面试,10:04就出来了 ,问的实在是太...
从外包出来,没想到竟然死在了另一家厂子 自从加入这家公司,每天都在加班,钱倒是给的不少,所以我也就忍了。没想到12月一纸通知,所有人都不许加班,薪资直降30%,顿时有吃不起饭的赶脚。 好在有个…...

wangzherongyao PMO
感谢【五一节】大家的相遇,总结下。 2023年05月02日,【第一组】组队开黑 我总结了下这天为什么打的那么好,首先赛季初段位在王者附近,大家心态重视程度也高,不轻敌,也不盲目,运营好兵线一步一步…...

Dart语法上
一、Dart介绍及环境 1.1 Dart介绍: Dart是由谷歌开发的计算机编程语言,它可以被用于web、服务器、移动应用 和物联网等领域的开发。Dart诞生于2011年,号称要取代JavaScript。但是过去的几年中一直不温不火。直到Flutter的出现现在被人们重新重视。 要学…...

SignOff Criteria——POCV(Parametric OCV) introduction
文章目录 1. O v e r v i e w Overview Overview2. P O C V A n a l y s i s POCV\ Analysis POCV Analysis3. P O C V F l o w POCV\ Flow POCV Flow4. P O C V R e p o r t POCV\ Report POCV Report 1. O v e r v i e w Overview Overview P r o c e s s v a r i a t i…...

Android 内存分析(java/native heap内存、虚拟内存、处理器内存 )
1.jvm 堆内存(dalvik 堆内存) 不同手机中app进程的 jvm 堆内存是不同的,因厂商在出厂设备时会自定义设置其峰值。比如,在Android Studio 创建模拟器时,会设置jvm heap 默认384m , 如下图所示: 当app 进程中java 层 new 对象(加起来总和)占用…...

产品思维与工程师思维
目录标题 什么是产品思维用户痛点体验价值 产品思维与工程师思维有什么区别?产品需要什么能力洞察需求的能力逻辑思维能力成本意识 场景化思维和用户体验数据分析和售后服务数据分析服务大多数用户原则 什么是产品思维 产品思维就是考虑产品的方方面面,…...
Android---启动速度优化
App 启动流程 1. 点击桌面 App 图标,Launcher 进程采用 Binder IPC 向 system_server 进程发起 startActivity 请求 ; 2. system_server 进程接收到请求后,向 zygote 进程发送创建进程的请求; 3. zygote 进程 fork 出新的子进程…...

使用 Mercury 直接从 Jupyter 构建 Web 程序
动动发财的小手,点个赞吧! 有效的沟通在所有数据驱动的项目中都至关重要。数据专业人员通常需要将他们的发现和见解传达给利益相关者,包括业务领导、技术团队和其他数据科学家。 虽然传达数据见解的传统方法(如 PowerPoint 演示文…...

Python基础(二)
目录 一、类型转换 1、为什么需要数据类型转换 2、数据类型转化的函数 3、str()函数类型转换使用 4、int()函数类型转换使用 4.1int()不能将str类型数据转换成int 4.2int()将bool类型转换成int 4.3int()将float转换成int 5、Float()函数类型转换使用 5.1Float()函数不…...

第41讲:Python循环语句中的break-else语法结构
文章目录 1.在循环正常结束后执行动作的思路2.通过控制布尔值变量的方式在循环正常结束后执行某些操作2.1.while循环语句2.2.for-in循环语句3.通过else从句来执行某些操作1.在循环正常结束后执行动作的思路 在执行while循环语句或者for循环语句时,如果循环是正常结束的,非执…...