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,一经查实,立即删除!

相关文章

2024.8.23 刷题总结

2024.8.23 **每日一题** 198.打家劫舍&#xff0c;这道题是一道简单的入门动态规划问题&#xff0c;根据题目意思&#xff0c;我们不能取数组中相邻的元素然后还必须满足总结果最大&#xff0c;所以我们可以维护一个数组&#xff0c;用来保存在数组每个位置之前能取到的最大值&…

【openwrt-21.02】openwrt-21.02 T750 按键GPIO自动进入刷机模式功能实现

Openwrt版本 NAME="OpenWrt" VERSION="21.02-SNAPSHOT" ID="openwrt" ID_LIKE="lede openwrt" PRETTY_NAME="OpenWrt 21.02-SNAPSHOT" VERSION_ID="21.02-snapshot" HOME_URL="https://openwrt.org/" …

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

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

maven 从特定module(项目)重新开始编译

前言 一般情况下&#xff0c;多module的项目数量过少&#xff0c;可能不需要使用到这个功能&#xff0c;但是当项目过多就很有必要&#xff0c;例如有20个module 编译到最后一个报错了&#xff0c;那重新构建的话 就会从第一个项目再来一遍&#xff0c;是不是很烦躁。 实践 …

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

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

分发糖果

题目 老师想给孩子们分发糖果&#xff0c;有 N 个孩子站成了一条直线&#xff0c;老师会根据每个孩子的表现&#xff0c;预先给他们评分。 你需要按照以下要求&#xff0c;帮助老师给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。评分更高的孩子必须比他两侧…

前端面试——什么是原型和原型链

背景 最近看到了很有意思的东西&#xff0c;原型和原型链 我们首先看看MDN怎么讲&#xff1a;继承与原型链 - JavaScript | MDN 不过文档里面也没有给出原型的定义&#xff1f;&#xff1f;&#xff1f; 不过里面提到原型链&#xff0c;是指对象层层向上寻找原型形成的路径…

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

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

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

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

编程学习中的“知识宝库”打造秘籍

编程学习中的“知识宝库”打造秘籍 在编程学习的道路上&#xff0c;我们犹如航海家在知识的海洋中探索前行。而高效的笔记记录和整理方法&#xff0c;无疑就是那张珍贵的航海图&#xff0c;引领我们在浩瀚的编程知识海洋中找到方向。 一、为什么需要一个好的笔记系统 编程知…

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…

算法题目杂记

差分 来源 https://www.acwing.com/problem/content/799/ 题目 输入一个长度为 n的整数序列。 接下来输入 m个操作&#xff0c;每个操作包含三个整数 l,r,c&#xff0c;表示将序列中 [l,r] 之间的每个数加 c。 请你输出进行完所有操作后的序列。 输入格式 第一行包含两个整数…

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…

使用命令模式实现撤销与重做功能的完整指南

使用命令模式实现撤销与重做功能的完整指南 命令模式是一种行为型设计模式&#xff0c;它将请求封装成对象&#xff0c;以便于对请求进行参数化、排队和记录。命令模式不仅有助于实现撤销和重做功能&#xff0c;还能提高系统的灵活性和可维护性。在本文中&#xff0c;我们将详…

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…

数据结构-返回n年后牛的数量

第一年农场有1只成熟的母牛A,往后的每年: 每一只成熟的母牛都会生一只母牛每一只新出生的母牛都在出生的第三年成熟每一只母牛永远不会死 返回N年后牛的数量。 抽象公式就是 F(N) F(N-1) F(N-3). 矩阵公式: |F4, F3, F2| |F3,F2,F1| * 3阶矩阵 |F5, F4, F3| |F4,F3,F2| …

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参数值可在线调整的新特性&…

HTTP 414错误问题

问题描述&#xff1a; 在一次前端编辑报表完成&#xff0c;打开审核人选择弹出框的时候&#xff0c;layer直接报414错误。 问题分析&#xff1a; HTTP 414是HTTP协议中的一个状态码&#xff0c;表示请求的URI&#xff08;Uniform Resource Identifier&#xff09;过长&#…