【深度学习】深度学习基础

news2024/9/20 14:50:15

李宏毅深度学习笔记

局部极小值与鞍点

鞍点其实就是梯度是零且区别于局部极小值和局部极大值的点。
鞍点的叫法是因为其形状像马鞍。鞍点的梯度为零,但它不是局部极小值。我们把梯度为零的点统称为临界点(critical point)。损失没有办法再下降,也许是因为收敛在了临界点,但不一定收敛在局部极小值,因为鞍点也是梯度为零的点。
在这里插入图片描述

判断临界值种类的方法
走到临界点的时候,这个临界点到底是局部极小值还是鞍点,是一个值得去探讨的问题。因为如果损失收敛在局部极小值,我们所在的位置已经是损失最低的点了,往四周走损失都会比较高,就没有路可以走了。但鞍点没有这个问题,旁边还是有路可以让损失更低的。只要逃离鞍点,就有可能让损失更低。

主要是通过计算海森矩阵来判断是哪种临界点(太复杂了看不懂)

但实际上,我们几乎不会真的把海森矩阵算出来,因为海森矩阵需要算二次微分,计算这个矩阵的运算量非常大,还要把它的特征值跟特征向量找出来,所以几乎没有人用这个方法来逃离鞍点。还有一些其他逃离鞍点的方法的运算量都比要算海森矩阵小很多。

从经验上看起来,局部极小值并没有那么常见。多数的时候,我们训练到一个梯度很小的地方,参数不再更新,往往只是遇到了鞍点。

批量(批量梯度下降法和随机梯度下降法)

实际上在计算梯度的时候,并不是对所有数据的损失 L 计算梯度,而是把所有的数据分成一个一个的批量(batch),每个批量的大小是 B ,即带有 B 笔数据。每次在更新参数的时候,会去取出 B 笔数据用来计算出损失和梯度更新参数。遍历所有批量的过程称为一个回合(epoch)。
在这里插入图片描述
在把数据分为批量的时候,我们还会进行随机打乱。随机打乱有很多不同的做法,一个常见的做法是在每一个回合开始之前重新划分批量,也就是说,每个回合的批量的数据都不一样。

不同批量大小之间对比

  • 批量大小为训练数据的大小,这种使用全批量(full batch)的数据来更新参数的方法即批量梯度下降法(Batch Gradient Descent,BGD)。此时模型必须把 20 笔训练数据都看完,才能够计算损失和梯度,参数才能够更新一次。
  • 批量大小等于 1,此时使用的方法即随机梯度下降法(Stochastic Gradient Descent,SGD),也称为增量梯度下降法。批量大小等于 1 意味着只要取出一笔数据即可计算损失、更新一次参数。如果总共有 20 笔数据,那么在每一个回合里面,参数会更新 20 次。用一笔数据算出来的损失相对带有更多噪声,因此其更新的方向是曲曲折折的 。

批量梯度下降并没有“划分批量”:要把所有的数据都看过一遍,才能够更新一次
参数,因此其每次迭代的计算量大。但相比随机梯度下降,批量梯度下降每次更新更稳定、更准确。
随机梯度下降的梯度上引入了随机噪声,因此在非凸优化问题中,其相比批量梯度下降更容易逃离局部最小值。

考虑并行运算,批量梯度下降花费的时间不一定更长;对于比较大的批量,计算
损失和梯度花费的时间不一定比使用小批量的计算时间长 。批量大小从 1 到 1000,需要耗费的时间几乎是一样的,因为在实际上 GPU 可以做并行运算,这 1000 笔数据是并行处理的,所以 1000笔数据所花的时间并不是一笔数据的 1000 倍。当然 GPU 并行计算的能力还是存在极限的,当批量大小很大的时候,时间还是会增加的。
因为有并行计算的能力,因此实际上当批量大小小的时候,要“跑”完一个回合,花的时间是比较大的
大的批量更新比较稳定,小的批量的梯度的方向是比较有噪声的。但实际上有噪声的的梯度反而可以帮助训练

批量梯度下降在更新参数的时候,沿着一个损失函数来更新参数,走到一个局部最小值或鞍点显然就停下来了。梯度是零,如果不看海森矩阵,梯度降就无法再更新参数了 。但小批量梯度下降法(mini-batch gradient descent)每次是挑一
个批量计算损失,所以每一次更新参数的时候所使用的损失函数是有差异的。选到第一个批量的时候,用 L1 计算梯度;选到第二个批量的时候,用 L2 计算梯度。假设用 L1 算梯度的时候,梯度是零,就会卡住。但 L2 的函数跟 L1 又不一样,L2 不一定会卡住,可以换下个批量的损失 L2 计算梯度,模型还是可以训练,还是有办法让损失变小,所以这种有噪声的更新方式反而对训练其实是有帮助的。
在这里插入图片描述

总结:
在有并行计算的情况下,小的批量跟大的批量运算的时间并没有太大的差距。除非大的批量非常大,才会显示出差距。但是一个回合需要的时间,小的批量比较长,大的批量反而是比较快的,所以从一个回合需要的时间来看,大的批量是较有优势的。 而小的批量更新的方向比较有噪声的,大的批量更新的方向比较稳定。但是有噪声的更新方向反而在优化的时候有优势,而且在测试的时候也会有优势。所以大的批量跟小的批量各有优缺点,批量大小是需要去调整的超参数。
在这里插入图片描述

动量

动量法(momentum method)是另外一个可以对抗鞍点或局部最小值的方法

引入动量后,每次在移动参数的时候,不是只往梯度的反方向来移动参数,而是根据梯度的反方向加上前一步移动的方向决定移动方向。
在这里插入图片描述
η 是学习率,λ 是前一个方向的权重参数,也是需要调的

自适应学习率

要走到一个临界点其实是比较困难的,多数时候训练在还没有走到临界点的时候就已经停止了。

情景:梯度并没有真的变得很小,但是损失不再下降了,如下图的情况
在这里插入图片描述
学习率决定了更新参数的时候的步伐,学习率设太大,步伐太大就无法慢慢地滑到山谷里面,可以试着把学习率设小一点。

在梯度下降里面,所有的参数都是设同样的学习率,这显然是不够的,应该要为每一个参数定制化学习率,即引入自适应学习率(adaptive learning rate)的方法,给每一个参数不同的学习率。如果在某一个方向上,梯度的值很小,非常平坦,我们会希望学习率调大一点;如果在某一个方向上非常陡峭,坡度很大,我们会希望学习率可以设得小一点。

AdaGrad(Adaptive Gradient)是典型的自适应学习率方法,其能够根据梯度大小自动调整学习率。AdaGrad 可以做到梯度比较大的时候,学习率就减小,梯度比较小的时候,学习率就放大

RMSprop(Root Mean Squared propagation),同一个参数的同个方向,学习率也是需要动态调整的

Adam (Adaptive moment estimation),是最常用的优化的策略或者优化器(optimizer)。Adam 可以看作 RMSprop 加上动量,其使用动量作为参数更新方向,并且能够自适应调整学习率。PyTorch 里面已经写好了 Adam 优化器,这个优化器里面有一些超参数需要人为决定,但是往往用 PyTorch 预设的参数就足够好了

学习率调度

加上自适应学习率以后,使用AdaGrad 方法优化的结果如图所示。一开始优化的时候很顺利,在左转的时候,有 AdaGrad 以后,可以再继续走下去,走到非常接近终点的位置。走到 BC 段时,因为横轴方向的梯度很小,所以学习率会自动变大,步伐就可以变大,从而不断前进。接下来的问题走到图 中红圈的地方,快走到终点的时候突然“爆炸”了
在这里插入图片描述

在这里插入图片描述

通过学习率调度(learning rate scheduling)可以解决这个问题。之前的学习率调整方法中 η 是一个固定的值,而在学习率调度中 η 跟时间有关。
学习率调度中最常见的策略是学习率衰减(learning rate decay),也称为学习率退火(learning rate annealing)。随着参数的不断更新,让 η 越来越小。

预热,是让学习率先变大后变小,至于变到多大、变大的速度、变小的速度是超参数。残差网络里面是有预热的,在残差网络里面,学习率先设置成 0.01,再设置成 0.1,并且其论文还特别说明,一开始用 0.1 反而训练不好。除了残差网络,BERT 和 Transformer 的训练也都使用了预热。

分类问题

引入独热向量来表示类

如果有三个类,标签 y 就是一个三维的向量,比如类 1 是 [1, 0, 0]T,类 2 是 [0, 1, 0]T,类3 是 [0, 0, 1]T。如果每个类都用一个独热向量来表示,就没有类 1 跟类 2 比较接近,类 1 跟类 3 比较远的问题。如果用独热向量计算距离的话,类两两之间的距离都是一样的

带有 softmax 的分类
y 是独热向量,所以其里面的值只有 0 跟 1,但是 ˆy 里面有任何值。既然目标只有 0 跟 1,但 ˆy 有任何值,可以先把它归一化到 0 到 1 之间,这样才能跟标签的计算相似度。

一般有两个类的时候,我们不套 softmax,而是直接取 sigmoid。当只有两个类的时候,sigmoid 和 softmax 是等价的。

分类问题损失函数
常用交叉熵,相较于均方误差,交叉熵是被更常用在分类上
在这里插入图片描述
做分类时,选均方误差的时候,如果没有好的优化器,有非常大的可能性会训练不起来。改变损失函数可以改变优化的难度

批量归一化

https://blog.csdn.net/grizzly_whisper/article/details/134250154

批量归一化(Batch Normalization,通常简称为BatchNorm或BN)是一种用于深度神经网络的正则化技术,旨在加速训练并提高模型的稳定性和性能。它的主要思想是对每个批量的输入进行归一化,以使神经网络的每一层保持稳定的统计分布。

批量归一化的主要步骤包括:
1、对每个批量输入进行均值和方差的计算:对于每个批量中的数据,计算其均值和方差,通常是在每个通道上进行的。
2、对输入数据进行标准化:将输入数据减去均值,并除以标准差,以使数据的分布接近标准正态分布。
3、缩放和平移:对标准化后的数据进行线性变换,将其缩放(乘以一个尺度参数)并平移(加上一个偏移参数),以允许模型学习适当的平移和缩放。
4、反向传播:在训练过程中,通过反向传播来更新批量归一化层的参数,以便网络适应数据的分布。

批量归一化的主要优点包括:
1、提高训练速度:通过标准化输入数据,批量归一化有助于加速训练,因为它减少了梯度下降的收敛时间,允许使用更大的学习率。
2、增强模型稳定性:批量归一化可以减少训练过程中的内部协变量偏移,从而提高模型的稳定性和鲁棒性。
3、减少过拟合:批量归一化作为正则化技术之一,可以减少模型的过拟合风险,因为它降低了网络对训练数据中微小变化的敏感性。
4、可以使模型更深:批量归一化使得更深的神经网络更容易训练,因为它减少了梯度消失和梯度爆炸问题。

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

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

相关文章

【机器学习】自然语言处理的新前沿:GPT-4与Data Analysis

目录 1、生成二维码Prompt:请用二维码编码这个信息,我爱chatgpt2、分析PDFPrompt:请分析这篇pdf的主要内容,用中文输出分析结果,100字3、设计网站Prompt:请帮我设计一个网站,网站的主题是哪吒玩…

下穿隧道结构安全该如何保证,检测跟自动化监测该如何抉择

隧道监测背景: 隧道所处的地下环境较为复杂,易受地质条件恶化、结构损伤、退化失稳以及自然灾害等因素影响,引发隧道拱顶开裂、边墙开裂、衬砌损坏、隧道渗漏水、围岩大变形等病害,从而导致隧道安全事故发生,尤其在长期…

查普曼大学团队使用惯性动捕系统制作动画短片

道奇电影和媒体艺术学院是查普曼大学的知名学院,同时也是美国首屈一指的电影学院之一,拥有一流电影制作工作室。 最近,道奇学院的一个学生制作团队接手了一个项目,该项目要求使用真人动作、视觉效果以及真人演员和CG角色之间的互动…

斜光测距的原理及python实现

1.前言 最近做了一个基于opencv的斜光测距的小项目,东西不多,但是很有意思,值得拿出来学一学。项目里面需要比较精确的定位功能,将前人matlab代码移植到python上,并且做了一些优化,简化逻辑(毕竟我是专业的…

智芯开发板----环境配置

一、软件准备 Keil IDE/ IAR IdeSupport_Install_Package已经上传到资源中自行下载即可。 二、IAR环境配置 1.首先将IdeSupport_Install_Package内的IAR文件复制到你的IAR安装路径中如图所示: 2.按如图所示的路径进行复制即可 3.以记事本的方式打开这个xml文件…

基于大数据架构的内容安全风控与分析

1 项目介绍 1.1 研究目的和意义 在数字化时代,内容安全成为了互联网企业面临的一个重要挑战。海量数据的产生与传播,伴随着不良信息和网络安全威胁的日益增加。因此,本课题旨在通过构建一个基于大数据架构的内容安全风控与分析系统&#xf…

绿盟又行了,漏管市场占有率第一

漏洞管理平台 吉祥学安全知识星球🔗除了包含技术干货:Java代码审计、web安全、应急响应等,还包含了安全中常见的售前护网案例、售前方案、ppt等,同时也有面向学生的网络安全面试、护网面试等。 今天看到不少朋友圈在转发&#xff…

用合成数据训练边缘侧火灾检测器

火灾是人类面临的重大威胁,检测火灾至关重要。目前的火焰传感器在距离检测方面存在局限性。为了克服这个问题,我的目标是使用机器学习方法创建一个轻量级且高度准确的火灾检测系统。当需要实时数据处理或机器学习模型可用的数据集很少时,这个…

《昇思25天学习打卡营第5天 | 昇思MindSpore网络构建》

第五天 今天学习了神经网络模型是由神经网络层和Tensor操作构成的,mindspore.nn提供了常见神经网络层的实现,在MindSpore中,Cell类是构建所有网络的基类,也是网络的基本单元。一个神经网络模型表示为一个Cell,它由不同…

大厂程序员上班猝死成常态?

大家好,我是瑶琴呀,拥有一头黑长直秀发的女程序员。 近日,连续看到大厂程序员猝死、低血糖晕倒的新闻,同为程序员感到很难受。互联网加班成常态这是既定事实,尤其在这个内卷严重、经济不景气的环境中,加班…

CAM350如何移动元素?

CAM350如何移动元素? 1、选择菜单栏Edit→Move 2、然后按W键,光标变为下图的形状,然后框选需要移动的元素。 3、框选元素后如下图所示,然后右击,退出框选命令。 4、然后点选一个原点开始移动所选的元素。 移动后如下图…

数据分析ClickHouse学习笔记

一、ClickHouse基础 1.1 ClickHouse介绍 ClickHouse是一个用于联机分析(OLAP)的列式DBMS。 简单来说,相比MySQL等行式数据库,数据存储方式是: Rowidis_deltitlesexcreateAt#021a12024/2/18 5:19#130b12024/2/18 8:10#241c12024/2/18 7:38…

车载测试工程师在行业中有哪些挑战需要面对?

车载测试工程师在行业中面临着多方面的挑战,这些挑战涵盖了技术、安全、法规以及市场环境等多个层面。 1. 技术挑战: 复杂性与集成性:现代汽车系统由众多模块和子系统组成,包括发动机控制、安全系统、娱乐系统、导航系统等。这些系…

新品Coming Soon!OAK-D-SR-PoE:使用3D+AI视觉结合ToF实现箱体测量和鉴别!

OAKChina 新品:OAK-D SR PoE结合ToF实现箱体检测 3DAI解决方案提供商 手动测量箱体、缺陷、大小等操作可能是一项繁琐并且劳累而机械的任务,但OAK中国本次将提供了更好的解决方案:3DAI视觉处理箱体的识别和检测,使用了即将发布的…

KVM性能优化之网络性能优化

1、使用virtio半虚拟化网卡 在Virt- Manager图形界面里指定下&#xff1a; 当然也可以编辑XML文件&#xff0c;添加<model typevirtio/> 如果你不指定&#xff0c;那么虚拟机会默认使用8139的全虚拟化网卡&#xff0c;8139网卡是Realtek的百兆。 2、使用vhost_net v…

Windows和Linux C++判断磁盘空间是否充足

基本是由百度Ai写代码生成的&#xff0c;记录一下。实现此功能需要调用系统的API函数。 对于Windows&#xff0c;可调用函数GetDiskFreeSpaceEx&#xff0c;使用该函数需要包含头文件windows.h。该函数的原型&#xff1a; 它的四个参数&#xff1a; lpDirectoryName&#xff0…

Gitlab上传代码时自动触发Jenkins构建代码配置

Jenkins配置构建触发器&#xff0c;勾选Build when a change is pushed to GitLab 记得记住对应url 在下面生成一个Jenkins的Secret token 打开Gitlab配置Webhooks 保存后测试 可正常构建并推送

DIY:在您的 PC 上本地使用 Stable Diffusion AI 模型生成图像

前言 随着DALL-E-2和Midjourney的发布&#xff0c;您可能听说过最近 AI 生成艺术的繁荣。这些人工智能模型如何在几秒钟内创造性地生成逼真的图像&#xff0c;这绝对是令人兴奋的。您可以在这里查看其中的一些&#xff1a;DALL-E-2 gallery和Midjourney gallery 但是这些模型…

Linux-引导过程与服务控制

目录 一、Linux操作系统引导过程 1、引导过程总览 2、引导过程详解 2.1、开机自检&#xff08;BIOS&#xff09; 2.2、 MBR引导 2.3、GRUB菜单 2.4、加载内核(kernel) 2.5、init进程初始化 3、系统初始化进程 3.1、Systemd单元类型 3.2、运行级别所对应的 Systemd 目…

湖北大学2024年成人高考函授报名专升本汉语言文学专业介绍

湖北大学&#xff0c;这所历史底蕴深厚的学府&#xff0c;自创办以来&#xff0c;始终致力于为社会各界人士提供高质量的成人高等继续教育。而今&#xff0c;为了满足广大成年人对于知识更新的渴求&#xff0c;学校特别开放了专升本汉语言文学专业的报名通道&#xff0c;为那些…