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

李宏毅深度学习笔记

局部极小值与鞍点

鞍点其实就是梯度是零且区别于局部极小值和局部极大值的点。
鞍点的叫法是因为其形状像马鞍。鞍点的梯度为零,但它不是局部极小值。我们把梯度为零的点统称为临界点(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.mzph.cn/diannao/36966.shtml

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

相关文章

Docker Desktop 简易操作指南 (Windows, macOS, Linux)

1. 下载最新版本 Docker Desktop https://www.docker.com/products/docker-desktop/ 2.启动 Docker Desktop 3.常用命令(在 cmd 或 Terminal 中执行) #列出所有镜像(Images) docker images #列出所有容器(Containers&…

CSS 核心知识点 - grid

思维导图 参考网址: https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_grid_layout 一、什么是 grid? CSS Grid布局是在CSS3规范中引入的一种新的布局方式,旨在解决传统布局方法(如浮动、定位、表格布局)存在的许多问题。C…

DataWhale-吃瓜教程学习笔记(四)

学习视频:第3章-二分类线性判别分析_哔哩哔哩_bilibili 西瓜书对应章节: 3.4 文章目录 - 算法原理- 损失函数推导-- 异类样本中心尽可能远-- 同类样本方差尽可能小-- 综合 知识点补充 - 二范数二范数(2-norm)详解定义几何意义性质…

OpenHarmony开发实战:HDF驱动开发流程

概述 HDF(Hardware Driver Foundation)驱动框架,为驱动开发者提供驱动框架能力,包括驱动加载、驱动服务管理、驱动消息机制和配置管理。并以组件化驱动模型作为核心设计思路,让驱动开发和部署更加规范,旨在…

四川赤橙宏海商务信息咨询有限公司抖音开店靠谱吗?

在数字化浪潮席卷全球的今天,电商行业正以前所未有的速度发展。而在这个大潮中,四川赤橙宏海商务信息咨询有限公司凭借其专业的团队和前瞻性的战略眼光,专注于抖音电商服务,为广大商家提供了一站式解决方案,成为了行业…

Ubuntu20.04安装LibTorch并完成高斯溅射环境搭建

0. 简介 最近受到优刻得的使用邀请,正好解决了我在大模型和自动驾驶行业对GPU的使用需求。UCloud云计算旗下的Compshare的GPU算力云平台。他们提供高性价比的4090 GPU,按时收费每卡2.6元,月卡只需要1.7元每小时,并附带200G的免费…

接口自动化测试-项目实战

什么是接口自动化测试:使用工具或代码代替人对接口进行测试 测试项目结构(python包) 1、接口api包 2、script:业务脚本 3、data:数据 4、config.py :配置文件 5、reporter:报告 错误问题: 1、未打印任何东西。添加pip ins…

C语言 指针——缓冲区溢出与缓冲区溢出攻击

目录 缓冲区溢出攻击 缓冲区溢出攻击实例 字符串的安全输入方法​编辑 防止缓冲区溢出的两个要点 缓冲区溢出攻击 网络黑客常针对系统和程序自身存在的漏洞,编写相应的攻击程序  对缓冲区溢出漏洞的攻击 —— 最常见  几乎占到了网络攻击次数的一半以上…

Android (已解决)Gradle 编译失败 Unsupported class file major version 61

文章目录 一、报错原因二、解决方法 一、报错原因 新版本的 Android Studio 默认使用的是 Java 17 LTS,而这个历史项目的 Gradle 版本很低,不支持高版本的 Java。 具体原因:Java 17 (major version 61) 编译的 class 文件,如果在…

DevEco Studio有时会多出来.js和.map文件,导致项目不能运行

1、问题 在使用DevEco的时候有时候会出现啥都没干,但是在项目的目录下会自动生成和文件同名的.js和.js.map文件,至于为什么会生成目前我也不知道,如果想要更深了解可以到论坛讨论:华为开发者论坛。生成.js和.js.map文件优…

Terraform基础概念一

Terraform基础概念一 1.Infrastructure-as-Code(IaC)概念1.1 IaC优势1.2 IaC工具1.3 IaC的两种方式 2.Terraform基础概念2.1 Terraform工作原理2.2 Terraform 工作流 3.总结 1.Infrastructure-as-Code(IaC)概念 基础设施即代码(Infrastructure-as-Code,…

SVN 的忽略(Ignore)和递归(Recursively)以及忽略部分

SVN中忽略大家经常用到,但总是似懂非懂,下面就详细展开说明一下忽略如何设置。 两个忽略 通常设置忽略都是文件夹和里面的文件都忽略,通常只需要鼠标右键点击忽略就可以了,如图: 第一个忽略用的最多,就是…

排序算法(C语言版)

前言 排序作为生产环境中常见的需求之一,对整个产品有举足轻重的影响,可以说使用一个合适的排序算法是业务逻辑中比较重要的一部分。今天我们就来介绍常见的排序算法以及实现 排序 所谓排序无非就是按照特定的规则对一组数据就行顺序化。 常见的排序有…

Spring项目报错解读与全部报错详解

你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​ gitee https://gitee.com/Qiuner 🌹 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 想看更多 那就点个关注吧 我…

图像大模型中的注意力和因果掩码

AIM — 图像领域中 LLM 的对应物。尽管 iGPT 已经存在 2 年多了,但自回归尚未得到充分探索。在本文中,作者表明,当使用 AIM 对网络进行预训练时,一组图像数据集上的下游任务的平均准确率会随着数据和参数的增加而线性增加。 要运…

uniApp获取实时定位

通过你获取的key放到项目manifest.json里面&#xff0c;对应填写你所需要的key值&#xff0c;还有高德用户名 用户名&#xff1a; key值的位置&#xff1a; 代码&#xff1a; html: <view class"intList pdNone"><view class"label">详细地…

爬虫:爬取知乎热榜一级评论及回答2024不包含翻页

一、先上结果&#xff08;注:本文仅为兴趣爱好探究&#xff0c;请勿进行商业利用或非法研究&#xff0c;负责后果自负&#xff0c;与作者无关&#xff09; 1、爬标题及其具体内容 2、抓标题下的对应回答 3、爬取对应一级评论 二、上流程 1、获取cookies&#xff08;相信哥哥姐姐…

静心冥想训练入门|流静

在喧嚣的都市中&#xff0c;我们时常被琐事所困&#xff0c;心灵难以得到片刻的宁静。然而&#xff0c;静心冥想训练如同一扇通往内心宁静的门户&#xff0c;引领我们踏上一段静谧的旅程。 静心冥想&#xff0c;并非遥不可及的高深技艺&#xff0c;而是每个人都能掌握的心灵修炼…

优思学院|「按计划推动型」与「需求拉动型」的生产模式

针对生产架构做对比分类的用语&#xff0c;主要有按计划推进型与需求拉动型。 「按计划推动型」与「需求拉动型」两者乃是生产架构上常使用、成对比的两个用语。不过&#xff0c;有时不只用来指单纯的生产现场架构&#xff0c;也有人把它应用在更广泛的生产架构设计上。 按计划…

【yolov8系列】ubuntu上yolov8的开启训练的简单记录

前言 yolov8的广泛使用&#xff0c;拉取yolov8源码工程&#xff0c;然后配置环境后直接运行&#xff0c;初步验证自己数据的检测效果&#xff0c;在数据集准备OK的情况下 需要信手拈来&#xff0c;以保证开发过程的高效进行。 本篇博客更注意为了方便自己使用时参考。顺便也记录…