DataWhale AI夏令营-《李宏毅深度学习教程》笔记

DataWhale AI夏令营-《李宏毅深度学习教程》笔记

  • 第三章 深度学习基础
    • 补充一些基础
    • 临界点及其种类
    • 逃离临界点方法
      • 批量
      • 动量
      • 自适应学习率
      • 学习率调度

之前一直接触的LLM大模型做一些应用,或者传统的自然语言处理,都是直接拿别人的模型用,要不就是在网上找些源码自己改,还有一些视觉识别任务,大多都是应用层面的知识,刚好DataWhale有这次机会可以补充一下深度学习的基础知识。
书籍地址:https://github.com/datawhalechina/leedl-tutorial
也非常建议大家购买纸质版书籍,必看pdf方便多了

第三章 深度学习基础

要想更好地优化神经网络,首先,要理解为什么优化会失败,收敛在局部极限值与鞍点会导致优化失败。

补充一些基础

在本章中会经常提到一些概念,对于一些新手或者数学不是很好的人(example me)来说可能理解起来没那么容易,所以插一节补点基础知识,后续我也会把想到的一些知识都补充在这个部分。

梯度:说到梯度,简单点就是导数,其实梯度和导数主要的不同就是,通常我们的数学思维停留在一维空间,在一维空间中函数 f(x)是指f(x)函数在某一点的变化率或斜率。而梯度就是在一个多维空间f(x,y)需要考虑更多的变化,梯度告诉了你函数在每个方向上的变化率(偏导数)。
泰勒级数近似:假设你有一个函数,想知道它在某个点附近的值。直接计算可能很复杂,所以我们用一个“近似”的方法来替代。泰勒级数就是一个这样的近似工具。泰勒级数就是通过加上一阶、二阶、三阶……这样一层一层的近似,把一个复杂的函数变得更容易处理。

临界点及其种类

一般深度学习任务中,当梯度为零(梯度不在下降,模型收敛在了临界点)的时候大多数考虑的都是局部最小值点。但除了局部最小值点之外还有一个梯度为零的点就是鞍点
如果损失收敛在局部极小值,我们所在的位置已经是损失最低的点了,往四周走损失都会比较高,就没有路可以走了。但鞍点没有这个问题,旁边还是有路可以让损失更低的。只要逃离鞍点,就有可能让损失更低。
在这里插入图片描述
(本文属于读书笔记图片均来自《李宏毅深度学习教程》)
判断一个临界点到底是局部极小值还是鞍点需要知道损失函数的形状。可是如何直到损失函数的形状呢,而且随着网络的变化损失函数可能各不相同,虽然想知道损失函数的形状几乎不可能,但是可以近似,通过泰勒级数近似我们可以大致估算出损失函数的形状。
在这里插入图片描述
到这数学不好的可能有些蒙了其实没什么难的,这个公式就是之前知识补充中提到的三项泰勒级数近似,这里的第二项因为含有g(梯度)我们在考虑的时候可以把他去除,因为我们考了就是梯度为零的情况,这样式子就已经简化了很多了,接下来其实我们就可以根据第三项来推断临界点附近的形状了。
如果第三项>0,就意味着**L(θ)>L(θ′)**也就是在只要 θ 在 θ′ 附近,L(θ) 都大于 L(θ′). 这代表 L(θ′) 是附近的一个最低点,所以它是局部极小值。
如果第三项<0,这意味着对任意θ,L(θ)<L(θ′),θ′ 是附近最高的一个点,L(θ′) 是局部极大值。
如果对于第三项有时候大于零,有时候小于零。这意味着在 θ′ 附近,有时候L(θ) > L(θ′),有时候 L(θ) < L(θ′). 因此在 θ′ 附近,L(θ′) 既不是局部极大值,也不是局部极小值,而是鞍点。
其实说到这即使你不懂也没关系,因为公示的第三项涉及到了二次微分计算,对矩阵运算的话计算量很大,所以这不是一个常用的方法去逃离局部最小值点或者鞍点。

逃离临界点方法

李老师在这里补充了一个点,我觉得还是很有必要的,就是维度,因为深度学习之所以被称为黑盒子很大原因是因为他大多数计算都是高位空间的数据计算,而这个人脑很难理解。这里老师举了一个具体的例子。比如在一维空间中某个点可能是我们无法处理的局部最小值点,然如果我们给他加了一个参数,把他加到二维空间他很和可能会变成一个可以逃离的鞍点,那么在加一个参数到三维空间会不会这个点就是一个正常的收敛点呢?
老师在书中也提到了“多数的时候,我们训练到一个梯度很小的地方,参数不再更新,往往只是遇到了鞍点。”
请添加图片描述

批量

批量就是batch,这个其实比较好理解也是我们经常接触的参数。每次在更新参数的时候,会去取出B笔数据用来计算出损失和梯度更新参数。遍历所有批量的过程称为一个回合(epoch)。
这部分李老师提出了一个经验概念,就是越小的批量,可能会引入更多的噪声,但对于模型逃离局部极小值点和鞍点有更好地帮助。
假设用L1 算梯度的时候,梯度是零,就会卡住。但L2的函数跟L1又不一样,L2不一定会卡住,可以换下个批量的损失L2 计算梯度,模型还是可以训练,还是有办法让损失变小,所以这种有噪声的更新方式反而对训练其实是有帮助的。
请添加图片描述
小批量虽然在多数情况下可能对损失下降有一定的帮助,但是对于模型的训练速度可能会降低,同一个epoch,小批量需要更多长的训练时间。

动量

动量法(momentum method)是另外一个可以对抗鞍点或局部最小值的方法。类似与物理学中的概念当一个物体从高处滚落,遇到一个凹点他不会马上停住而会因为惯性继续向前。
请添加图片描述
引入动量后,每次在移动参数的时候,不是只往梯度的反方向来移动参数,而是根据梯度
的反方向加上前一步移动的方向决定移动方向。

自适应学习率

临界点其实不一定是在训练一个网络的时候会遇到的最大的障碍,有时候,训练一个网络,训练到后来发现损失不再下降的时候,有时候不是卡在局部最小值或鞍点,只是单纯的损失无法再下降。这个时候往往需要通过调整更适合的学习率来帮助模型收敛。
换句话说,当梯度大的时候,学习率就小一些,梯度小的时候,学习率就大一些。
请添加图片描述
如图对于平坦的山谷,梯度比较小,我们也就需要迈步子更大一些,帮助模型更好的走出局部最小值点和鞍点,当更尖锐的山谷时,梯度变化较大,所以学习率也要适当减小,减少步子,以免偏差太大。
这部分书中提到了三种优化器:

  1. AdaGrad:AdaGrad(Adaptive Gradient)是典型的自适应学习率方法,其能够根据梯度大小自动调整学习率。
  2. RMSProp:与AdaGrad不同之处在于,通过可调节的超参数α来决定那些梯度更重要,而AdaGrad的梯度都是同等重要的。
  3. Adam:最常用的优化的策略或者优化器(optimizer)是Adam(Adaptive moment estima
    tion)。Adam 可以看作 RMSprop 加上动量,其使用动量作为参数更新方向,并且能够自
    适应调整学习率。PyTorch 里面已经写好了 Adam 优化器,这个优化器里面有一些超参数需
    要人为决定,但是往往用PyTorch预设的参数就足够好了。

学习率调度

在深度学习中,学习率决定了每次更新参数的步伐。如果学习率太大,模型可能会在损失函数的最小值附近来回跳动,甚至错过最优解。如果学习率太小,模型的训练速度会非常慢,而且可能陷入局部最优解。学习率衰减(学习率退火)是一种逐渐减小学习率的策略,通常在训练的后期使用,以便模型能够更精细地调整参数,从而找到更好的局部最优解。其实就是到训练后期了,适当的让学习率低一些,以免出现一些差错。
除了学习率下降以外,还有另外一个经典的学习率调度的方式—预热。预热的方法是让学习率先变大后变小,至于变到多大、变大的速度、变小的速度是超参数。残差网络里面是有预热的,在残差网络里面,学习率先设置成0.01,再设置成0.1,并且其论文还特别说明,一开始用0.1反而训练不好。除了残差网络,BERT和Transformer的训练也都使用了预热。

笔记先记到这,等学习完整个第三章我在把剩下的补上

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

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

相关文章

k8s 部署Ruoyi-Vue-Plus之vue打包镜像

在这里插入图片描述 在这篇文章中&#xff0c;解释如何通过容器化&#xff08;Docker&#xff09;来打包和部署前端项目&#xff0c;替代之前手动维护版本的方式 1.nginx配置 在 ruoyi-ui 项目的根目录下创建一个 nginx.conf 文件, 我没有使用monitor-admin和xxljob-admin模块…

语言基础/单向链表的构建和使用(含Linux中SLIST的解析和使用)

文章目录 概述简单的链表描述链表的术语简单实现一个单链表 Linux之SLIST机理分析结构定义单链表初始化单链表插入元素单链表遍历元素单链表删除元素 Linux之SLIST使用实践纯C中typedef重命名带来的问题预留 概述 本文讲述了数据结构中单链表的基本概念&#xff0c;头指针、头…

CPP中lamada表达式作用一览[more cpp-6]

一般语法 CPP中的lambda 表达式的本质就是匿名函数&#xff0c;它可以在代码中定义一个临时的、局部的函数.为什么需要lamada表达式&#xff1f; 因为命名是个大问题 想名字以及避免命名冲突是很劳神费力的事&#xff0c;这就是lamada表达式的优点(lamada优点表现为简洁性)总…

如何在不格式化的情况下解锁 Android 智能手机密码

如果您忘记密码&#xff0c;您的 Android 移动设备将锁定您。发生这种情况时&#xff0c;通常可以通过恢复出厂设置来重新获得对设备的访问权限。可悲的是&#xff0c;这将导致所有数据丢失。下面列出的是解锁锁定的Android 手机而不会丢失任何个人数据的有效方法。 Android 手…

Ps:首选项 - 界面

Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K Photoshop 首选项中的“界面” Interface选项卡可以定制 Photoshop 的界面外观和行为&#xff0c;从而创建一个最适合自己工作习惯和需求的工作环境。这些设置有助于提高工作效率&#xff0c;减轻眼…

单片机外部中断+定时器实现红外遥控NEC协议解码

单片机外部中断定时器实现红外遥控NEC协议解码 概述解码过程参考代码 概述 红外(Infrared&#xff0c;IR)遥控&#xff0c;是一种通过调制红外光实现的无线遥控器&#xff0c;常用于家电设备&#xff1a;电视机、机顶盒等等。NEC协议采用PPM(Pulse Position Modulation&#x…

Vue的计算属性:methods方法、computed计算属性、watch监听属性

1、methods 方法 在创建的 Vue 应用程序实例中&#xff0c;可以通过 methods 选项定义方法。应用程序实例本身会代理 methods 选项中的所有方法&#xff0c;因此可以像访问 data 数据那样来调用方法。 【实例】在 Vue 应用程序中&#xff0c;使用 methods 选项定义获取用户信…

实验16:定时器中断实验

无硬件图&#xff0c;用到D1灯 代码main.c #include<reg52.h>typedef unsigned int u16; typedef unsigned char u8;sbit LED1P2^0;void delay_10us(u16 n) {while(n--); }void delay_ms(u16 ms) {u16 i,j;for(ims;i>0;i--)for(j110;j>0;j--); }void time0_init(v…

2月公开赛Web-ssrfme

考点&#xff1a; redis未授权访问 源码&#xff1a; <?php highlight_file(__file__); function curl($url){ $ch curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_HEADER, 0);echo curl_exec($ch);curl_close($ch); }if(isset($_GET[url…

innodb_buffer_pool_size在线缩小操作

一、背景 测试数据库内存32G&#xff0c;只有MySQL数据库&#xff0c;但是innodb_buffer_pool_size设置了24G&#xff0c;导致经常出现lack of memory问题、lack of swap问题。 因为使用了MySQL5.7.36版本&#xff0c;利用innodb_buffer_pool_size参数值可在线调整的新特性&…

编程之路:在Bug的迷宫中寻找出口

编程是一种艺术&#xff0c;也是一种科学。它要求我们既要有创造性的思维&#xff0c;又要有严谨的逻辑。在这条充满挑战的道路上&#xff0c;每个人都会遇到挫折&#xff0c;这些挫折可能来自于一个难以解决的Bug&#xff0c;一个复杂的算法&#xff0c;或者是在实现某个功能时…

云手机解决了TikTok哪些账号运营难题?

随着社交媒体的蓬勃发展&#xff0c;TikTok作为一款风靡全球的短视频应用&#xff0c;成为许多个人和企业进行品牌推广、内容创作的首选平台。然而&#xff0c;随之而来的是TikTok账号运营的一系列难题。本文将深入探讨云手机是如何解决这些难题的。 1、多账号运营的便捷性&…

tomcat实战演练

一.tomcat介绍 Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c; Tomcat 具有处理 HTML 页面的功能&#xff0c;它还是一个 Servlet 和 JSP容器。Tomc…

C语言笔试题(指针、数组、整数在内存中的存储、结构体......)

文章目录 1.选择题2.代码题2.1 模拟实现strncat2.2 模拟实现strncpy2.3 编写判断大小端程序2.4 模拟实现atoi2.5 BC38 变种水仙花数2.6 BC98 序列中删除指定数字 今天我们一起来看一些题目 1.选择题 解析如下&#xff1a; 正确选项&#xff1a;B A.参数错误&#xff1b;D.返回…

Prettier+Vscode setting提高前端开发效率

文章目录 前言Prettier第一步&#xff1a;下载依赖&#xff08;团队合作&#xff09;或下载插件&#xff08;独立开发&#xff09;第二步&#xff1a;添加.prettierrc.json文件**以下是我使用的****配置规则** 第三步&#xff1a;添加.prettierignore文件**以下是我常用的****配…

LabVIEW多显示器环境下主显示器识别与管理

该程序使用 LabVIEW 图形化编程语言&#xff0c;涉及多显示器环境中主显示器的识别与信息提取。图像显示了两个不同的方法来获取主显示器的信息。 第一部分&#xff1a;方法一——基于显示器位置的主显示器识别 1. 当前监视器识别&#xff1a; 使用“FP.Monitor”属性节点获取…

plsql表格怎么显示中文 plsql如何导入表格数据

在Oracle数据库开发中&#xff0c;PL/SQL Developer是一款广泛使用的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它提供了丰富的功能来帮助开发人员高效地进行数据库开发和管理。在使用PL/SQL Developer时&#xff0c;许多用户会遇到表格显示中文的问题&#xff0c;以…

ansible:

ansible&#xff1a; 远程自动化运维 ansible是基于python开发的配置管理和应用部署工具。 也是自动化运维的重要工具。 可以批量配置&#xff0c;部署&#xff0c;管理上千台主机。 只需要在一台主机配置ansible就可以完成其他主机的操作。 操纵模式&#xff1a; 1、模…

EmguCV学习笔记 VB.Net 6.4 霍夫变换

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

ArcGIS Pro基础:如何将数据和引用地图样式一起打包分享

如上所示&#xff0c;有2个矢量图斑&#xff0c;一个是耕地地块&#xff0c;另一个是范围图斑&#xff0c;如果我们需要把此工程的所有数据以及引用地图一起分享给别人&#xff0c;就可以使用【打包工程】这个工具。 如上所示&#xff0c;在【地理处理】下输入【打包工程】&am…