Datawhale X 李宏毅苹果书 AI夏令营 学习笔记(二)

自适应学习率

我们梯度下降在参数更新上,公式是 W t = W t − 1 − η g t , η 是学习率, g t 是梯度 W_t=W_{t-1}-\eta g_t,\eta是学习率,g_t是梯度 Wt=Wt1ηgtη是学习率,gt是梯度

最简单的梯度下降算法,会出现类似下图的情况,损失下不去,梯度来回震荡,收敛缓慢。究其原因是学习率太大,导致参数变化太大,但下一次为了降低损失,得到了反方向的梯度,最终表现为梯度来来回回。
在这里插入图片描述

下面这张图更好的做了对比,这张图是误差平面,蓝色点表示当w、b为对应的值时,对应的loss。而蓝色点连成线,就像一条等高线,与等高线垂直的方向就是loss下降最快,即梯度最大的方向。而与等高线平行的方向,梯度变化很小,几乎平坦,这种也称为“凸的”误差平面(即一个轴的方向梯度变化大,另一个轴的方向梯度几乎不变)。
我们要从A点到达黄X。当学习率过大时,参数(看纵轴)来回变动,一会大于0一会小于0。而学习率过小时,虽然一开始能缓慢地根据梯度变化趋势下降,但在平坦的方向上就几乎不会动了。

因此我们得到结论,学习率不能固定为一个初设值(或者说梯度不能直接乘一个固定值),应该根据当前情况动态调整,即自适应。如果在某一个方向上,梯度的值很小,非常平坦,我们会希望学习率调大一点;如果在某一个方向上非常陡峭,坡度很大,我们会希望学习率可以设得小一点。
在这里插入图片描述

AdaGrad(Adaptive Gradient)

我们还是保留 η \eta η 这个固定不变的超参数,但是我们不能让 Δ W t = η g t \Delta W_t=\eta g_t ΔWt=ηgt,我们需要 Δ W t = η σ t i g t i \Delta W_t=\frac{\eta}{\sigma_t^i}g_t^i ΔWt=σtiηgti,其中 t 还是表示第 t 次迭代,i 表示对于第 i 个参数,因为自适应的学习率,在每次迭代、每个参数上都不一样。重点是 σ t i \sigma_t^i σti 必须在梯度大时大,梯度小时小,这样被 η \eta η一除,就能满足梯度大时 Δ W \Delta W ΔW 小,梯度小时 Δ W \Delta W ΔW 大。

在Ada中, σ 0 i = ( g 0 i ) 2 , σ 1 i = 1 2 [ ( g 0 i ) 2 + ( g 1 i ) 2 ] , σ 2 i = 1 3 [ ( g 0 i ) 2 + ( g 1 i ) 2 + ( g 2 i ) 2 ] \sigma^i_0=\sqrt {(g_0^i)^2},\sigma^i_1=\sqrt {\frac{1}{2}[(g_0^i)^2+(g_1^i)^2]},\sigma^i_2=\sqrt {\frac{1}{3}[(g_0^i)^2+(g_1^i)^2+(g_2^i)^2]} σ0i=(g0i)2 ,σ1i=21[(g0i)2+(g1i)2] ,σ2i=31[(g0i)2+(g1i)2+(g2i)2] ,依此类推。即是使用到了过去所有梯度的均方根。如果梯度 g t i g_t^i gti较小,由于取平均值导致 σ t i \sigma_t^i σti减少,进而导致了学习率的增加,加速通过平坦路况。

RMSProp(Root Mean Squared propagation)

对于Ada,由于使用了历史梯度平方,且每个历史梯度都没有权重,历史的较大值会产生长远的影响。
RMSProp将Ada的取平均改为权重(衰减因子)。 σ 0 i = ( g 0 i ) 2 , σ 1 i = α ( σ 0 i ) 2 + ( 1 − α ) ( g 1 i ) 2 , σ 2 i = α ( σ 1 i ) 2 + ( 1 − α ) ( g 2 i ) 2 \sigma^i_0=\sqrt {(g_0^i)^2},\sigma^i_1=\sqrt {\alpha (\sigma_0^i)^2+(1-\alpha)(g_1^i)^2},σ^i_2=\sqrt {\alpha(\sigma_1^i)^2+(1-\alpha)(g_2^i)^2} σ0i=(g0i)2 ,σ1i=α(σ0i)2+(1α)(g1i)2 ,σ2i=α(σ1i)2+(1α)(g2i)2 ,依此类推,注意历史梯度用到的是 σ t − 1 i 而不是 g t − 1 i \sigma_{t-1}^i而不是g_{t-1}^i σt1i而不是gt1i
通过设置较小的 α \alpha α,可以更看重最新算出的梯度。

Adam(Adaptive moment estimation)

最常用的优化器(optimizer),可以看作在RMSProp基础上,把梯度 g t i g_t^i gti换成动量 m t i m_t^i mti
注意,虽然在 η σ t i m t i 中, σ t i 和 m t i \frac{\eta}{\sigma_t^i}m_t^i中,\sigma_t^i和m_t^i σtiηmti中,σtimti都用到了历史梯度,但是前者只是标量,后者是向量,他们不会相互抵消。

学习率调度

上面的都是说让梯度乘上一个变化的值,但学习率还是固定的。而这里的新策略是学习率 η t \eta_t ηt 也是随时间变化的。

  • 学习率衰减:随着训练进行,逐步减少学习率,尽量防止震荡以加快收敛。
  • 预热:在训练初期使用较低的学习率,逐渐收集统计数据找到合理路径。之后逐渐增加以加快收敛。有一个Adam的预热版本RAdam。

分类问题

对于训练集,我们每个样本的y要表示该样本对应的类,我们可以使用one-hot编码,比如有n个类,当前样本类型是1,就用一个除第n维是1之外、其他维为0的n维向量表示。比如3个类,[0,1,0]表示该样本属于第二类。这个也可以看做一个概率分布,即这个样本属于第二类的概率为1。最后计算损失时,就可以用 y ^ \hat y y^和y计算相似度。

如果还是用回归的方式得到 y ^ \hat{y} y^,值很可能不是一个概率分布,n维每个值的和不等于1。所以这里需要用到归一化,我们使用softmax。 y i ′ = e x p ( y i ) ∑ j e x p ( y i ) , 其中, 0 < y i ′ < 1 , ∑ i y i ′ = 1 。 y'_i =\frac{exp(y_i)}{\sum_jexp(y_i)},其中,0<y'_i<1,\sum_i y'_i = 1。 yi=jexp(yi)exp(yi),其中,0<yi<1iyi=1效果如下,同时softmax还会让原本大的值跟小的值的差距更大。注意当只有两个类的时候,sigmoid 和 softmax 是等价的。
在这里插入图片描述
那么接下来就要计算损失了。比较常用的是最小化交叉熵,其实也是极大似然。
e = − ∑ i y i l n y i ′ e=-\sum_i y_i ln y_i' e=iyilnyi
相比于均方误差的好处还没细看。只关注到了一个结论,交叉熵能更容易的利用优化器优化。
改变损失函数可以改变优化的难度
在这里插入图片描述

图像分类例子

代码见 Datawhale/LeeDL-HW3-CNN

例子使用了pytorch搭建了一个CNN
重点大概是

  • 将图像加载为tensor,并对训练集进行数据增强
  • 定义了一个cnn,里面的卷积层使用卷积核对图像提取特征,通过批归一化层处理后,过一下Relu激活函数,最后池化操作是取2*2像素内的Max值。
  • 定义了一个全连接神经网络,对输入特征进行线性变换和Relu非线性变换。
  • 前向传播时先将样本传入cnn,再传入fc获得最终 y ′ y' y
  • 使用了交叉熵作为损失函数,并使用了Adam优化器

进一步的优化方向

因为我不是搞cv的就不详细了解了,看个大概,太多太多了,但是确实确实很有用!有些在其他方向也能用到!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

03_React 收集表单数据和 组件生命周期

React 收集表单数据和 组件生命周期 一、收集表单数据1、例子1.1 需求&#xff1a;定义一个包含表单的组件&#xff0c;输入用户名密码后&#xff0c;点击登录提示输入信息 2、理解&#xff1a;包含表单的组件分类2.1 受控组件2.2 非受控组件 二、高阶函数\_函数柯里化1、复习-…

9 正则表达式:Java爬虫和正则表达式、String中的正则表达式方法(基本语法7)

文章目录 前言一、正则表达式1 [ ] 语法(1)[ABC] 和 [^ABC](2)[A-Z]和[a-zA-Z]小总结2 特殊字符语法(\w 这些)3 数量符4 \ 、()、 |5 锚点 ^ 和 $,\b,\B6 (?i) : 忽略其后面的大小写 ---- 这个Java是可以的,其他语言我不知道(正则表达式虽然大多通用,但也有部分是…

zabbix5.0与7.0版本区别 切换建议

Zabbix5.0和Zabbix7.0的区别 1. 性能和扩展性优化 1.1 高效的数据处理和存储 优化的数据库性能&#xff1a; Zabbix 7.0 在数据库层面进行了多项优化&#xff0c;以减少查询延迟和提高数据处理速度。这包括对数据库结构的改进和索引优化&#xff0c;使得大规模数据的读取和写…

Spark-driver和executor启动过程

一、上下文 《Spark-SparkSubmit详细过程》详细分析了从脚本提交任务后driver是如何调用到自己编写的Spark代码的&#xff0c;而我们的Spark代码在运行前必须准备好分布式资源&#xff0c;接下来我们就分析下资源是如何分配的 二、Spark代码示例 我们以一个简单的WordCount程…

打卡学习Python爬虫第五天|Xpath解析的使用

什么是Xpath&#xff1f;是在XML文档中搜索内容的一门语言&#xff0c;HTML可以看作是xml的一个子集。 目录 1、安装lxml模块 2、导入lxml中的etree子模块 3、Xpath使用方法 3.1.选择节点 3.2.选择属性 3.3.选择文本内容 3.4.使用通配符*过滤节点 3.5.使用中括号[]索引…

Java学习_20_File以及IO流

文章目录 前言一、FileFile中常见的成员方法判断和获取创建和删除获取和遍历 二、IO流IO流体系结构字节流字节输出流&#xff1a;FileOutputStream字节输入流FileInputStrea文件拷贝try……catch异常处理中文乱码现象 字符流字符流读取FileReader字符流输出FileWriter底层原理 …

Linux 命令集合

1. linux 系统版本 1.1 linux系统的分类 linux系统&#xff0c;主要分Debian系和RedHat系&#xff0c;还有其它自由的发布版本。 1、Debian系主要有Debian&#xff0c;Ubuntu&#xff0c;Mint等及其衍生版本&#xff1b; 2、RedHat系主要有RedHat&#xff0c;Fedora&#xf…

Springsecurity 自定义AuthenticationManager

一、认证流程 1、当用户提交了一个他的凭证(用户名、密码) AbstractAuthenticationProcessingFilter 将会创建一个凭证信息&#xff0c;最终&#xff0c;该请求会被UsernamePasswordAuthenticationFilter 拦截将请求中用户名和密码&#xff0c;封装为 Authentication 对象&…

C++ | Leetcode C++题解之第365题水壶问题

题目&#xff1a; 题解&#xff1a; class Solution { public:bool canMeasureWater(int x, int y, int z) {if (x y < z) {return false;}if (x 0 || y 0) {return z 0 || x y z;}return z % gcd(x, y) 0;} };

AI大模型进化之路:机器学习九大算法画图详解

机器学习算法对于了解AI大模型的意义非常重要&#xff0c;它们是构建、训练和应用AI大模型的基础和关键。今天给大家整理了一份机器学习核心算法资料&#xff0c;建议收藏学习。 集成学习是一种机器学习算法&#xff0c;它通过构建多个模型并整合它们的预测结果来提高性能。常…

ST 表算法

ST 表 ST 表&#xff0c;主要思想是空间换时间&#xff0c;用于解决可重复贡献问题和 RMQ 问题。 可重复贡献问题 指某个运算 o p op op&#xff0c;有 x o p x x x\ op\ x\ \ x x op x x 。例如 m a x ( x , x ) x m i n ( x , x ) x g c d ( x , x ) x max(x,x)x\…

【Docker】Docker学习01 | 什么是docker?

本文首发于 ❄️慕雪的寒舍 因为本人没有学习过docker&#xff0c;虽然部署过很多镜像&#xff0c;但是对于docker底层的实现一概不知。趁学习一个新项目的契机&#xff0c;将docker的相关概念了解清楚。 安装docker的教程请查看 Linux主机安装docker。 如果你想和我一起学习do…

TCP的连接建立及报文段首部格式

粘包问题&#xff1a; 原因&#xff1a;TCP流式套接字&#xff1b;数据与数据之间没有边界&#xff1b;导致可能多次的数据粘到一起。 解决办法&#xff1a; 规定一些数据与数据之间的间隔符&#xff0c;如&#xff1a;"\aa\", "\r\n"。指定要发送的数据…

exec函数簇

一、main 函数的参数定义 在C语言中&#xff0c;main 函数是程序执行的入口点。main 函数可以接受参数&#xff0c;这些参数通常用于从命令行接收输入。main 函数的参数定义通常遵循以下形式&#xff1a; int main(int argc, char *argv[]) 或者等价地&#xff1a; int mai…

91. UE5 RPG 实现拖拽装配技能以及解除委托的绑定

在上一篇文章里&#xff0c;实现了通过选中技能&#xff0c;然后点击下方的装备技能插槽实现了技能的装配。为了丰富技能装配功能&#xff0c;在这一篇里&#xff0c;我们实现一下通过拖拽技能&#xff0c;实现拖拽功能&#xff0c;我们需要修改两个用户控件&#xff0c;一个就…

杰发科技AC7840——CAN通信简介(8)_通过波特率和时钟计算SEG_1/SEG_2/SJW/PRESC

通过公式计算 * 波特率和采样点计算公式&#xff1a;* tSeg1 (S_SEG_1 2); tSeg2 (S_SEG_2 1).* BandRate (SCR_CLK / (S_PRESC 1) / ((S_SEG_1 2) (S_SEG_2 1))), SCR_CLK 为CAN 模块源时钟* SamplePoint (tSeg1 / (tSeg1 tSeg2)). {0x0D, 0x04, 0x04, 0x3B},…

文件IO和多路复用IO

目录 前言 一、文件 I/O 1.基本文件 I/O 操作 1.1打开文件 1.2读取文件内容 (read) 1.3写入文件 (write) 1.4关闭文件 (close) 2.文件指针 二、多路复用 I/O 1.常用的多路复用 I/O 模型 1.1select 1.2poll 1.3epoll 2.使用 select、poll 和 epoll 进行简单的 I/O…

软件测试最全面试题,了解一下

一、前言 近期有不少同学&#xff0c;朋友问我什么是软件测试&#xff0c;它是干什么的&#xff0c;我适不适合做、这行发展前景、工资怎么样等等等…在这里我把问题总结一下&#xff0c;整理一篇文章出来。 我也看过很多贴吧、论坛&#xff0c;在入行之前对这块都是迷茫的&a…

数据结构----栈

一丶概念 只能在一端进行插入和删除操作的线性表&#xff08;又称为堆栈&#xff09;&#xff0c;进行插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底 二丶特点 先进后出 FILO first in last out 后进先出 LIFO last in first out 三丶顺序栈 逻辑结构&…

Nginx: 配置项之http模块connection和request的用法以及limit_conn和limit_req模块

connection和request connection 就是一个连接, TCP连接 客户端和服务器想要进行通信的话&#xff0c;有很多种方式比如说, TCP的形式或者是UDP形式的通常很多应用都是建立在这个TCP之上的所以, 客户端和服务器通信&#xff0c;使用了TCP协议的话&#xff0c;必然涉及建立TCP连…