【深度学习】日常笔记2

news2024/11/16 3:27:44

一直以来其实对调参这个词不太熟悉,后面知道了比如学习率就为超参数,是被调参的对象:

↑标量方程对向量的导数

大概就是↓

在对矩阵求导时,我们需要使用矩阵微积分中的求导法则。对于一个标量函数 f(x),它关于向量 x 的导数可以表示为:

∂f(x) / ∂x = [∂f(x) / ∂x1, ∂f(x) / ∂x2, ..., ∂f(x) / ∂xn]

其中 xi 表示向量 x 中的第 i 个分量。

对于一个向量函数 f(x),它关于向量 x 的导数可以表示为一个矩阵:

∂f(x) / ∂x = [∂f1(x) / ∂x1, ∂f1(x) / ∂x2, ..., ∂f1(x) / ∂xn; ∂f2(x) / ∂x1, ∂f2(x) / ∂x2, ..., ∂f2(x) / ∂xn; ... ∂fm(x) / ∂x1, ∂fm(x) / ∂x2, ..., ∂fm(x) / ∂xn]

这里放上实例:

这里是线性回归的解析解推导过程:

我们的目标是最小化损失函数 L(w) = y - Xw^2,其中 y n 维数据列向量,X n * p 的特征矩阵,w p 维权重列向量。

将损失函数展开,得到 L(w) = (y - Xw)(y - Xw) = (y + (-Xw))(y - Xw) = yy - 2wXy + wXXwvu = uv,其中 v u 都是向量)

L(w) w 求导数,

其中,第一项 yy 是常数,对 w 的偏导数为 0

第二项可以应用矩阵求导法则,即:

∂/∂w (-2wXy) = ∂/∂w (-2 yXw) ,根据下面的常用公式1

那么∂/∂w (-2wXy) = -2Xy

对于第三项∂/∂w (wXXw),我们也可以应用矩阵求导法则:

根据下面的常用公式2

注意是分母布局,XX刚好是个对称矩阵,那结果就呼之欲出了,∂/∂w (wXXw) = XXw + (XX)w = 2 XXw

结合以上三项,得到梯度 g(w) = -2Xy + 2XXw

令梯度为零,即 2XXw = 2Xy,解出 w 使得上式成立,得到:

w* = (XX)^-1 Xy

其中 (XX)^-1 表示 XX 的逆矩阵。所以,最小化损失函数时,权重向量的解析解就是 w* = (XX)^-1 Xy

↑向量方程对向量的导数

如果是分子布局的话,对例子来说求导所得的矩阵就是2x3的矩阵了。

↑常用公式1

↑常用公式2

↑常用公式2的例子

学到这里,发现自己数学一的线性代数貌似不够用了…所以打算先去补下矩阵微积分的知识。

线性回归对应到神经网络图的话,这种每个输入都与每个输出相连,这种变换被称为全连接层。所以线性回归模型也是一个简单的神经网络。

做下p95的题目:

答:

1.

在最小化平方误差的问题中,我们要找到一个常数b,使得∑(xi − b)^2最小化。为了解决这个问题,可以先对该式进行展开:

∑(xi − b)^2 = ∑xi^2 - 2b∑xi + nb^2

对b求导数并令导数为0,有:

d/db(∑(xi − b)^2) = -2∑xi + 2nb = 0

解出b,有:

b = (x1 + x2 + ... + xn) / n

因此,最优值b的解析解为所有数据的平均值。

2.

这个问题与正态分布的关系在于,如果我们假设这些数据是从一个服从正态分布的总体中抽取出来的样本,并且忽略掉方差,则最小化 ∑(xi−b)2 的问题就等价于用最小二乘法估计这个正态分布总体的均值参数 μ 的问题。具体地说,最小化 ∑(xi−b)2 可以看作是寻找一个使误差平方和最小的 b,而这个 b 就等价于这个样本的均值 x̄。

在正态分布中,样本均值是对总体均值的一个无偏估计,而这个估计的方差与样本量 n 成反比,即随着样本量的增加,样本均值的估计精度会提高。

最小二乘法通过最小化残差平方和来确定输入变量与输出变量之间的线性关系,其中残差指的是观测值与估计值之间的差异。

因此在正态分布中,最小二乘法可以被用来估计均值参数 μ。具体地说,我们可以将最小化 ∑(xi−b)2 看作是寻找一个使误差平方和最小的 b,而这个 b 就等价于这个样本的均值x̄。

因此,最小化 ∑(xi−b)2 的问题就可以被视为用最小二乘法估计这个正态分布总体的均值参数 μ 的问题。

答:

要求负对数似然的最小值是因为原本的P(y | X)是要求最大的,毕竟是极大似然估计,但是优化通常都是说最小化而非最大化,所以求负对数似然-logPy X)的最小值其实就是求P(y | X)的最大罢了。

答:

1.

注意:,而yi=f(xi)+ ϵ,故ϵ=yi - f(xi)

数据的负对数似然为:

-log P(y|X) = -log ∏i=1^n P(yi|xi) = -∑i=1^n log P(yi|xi)

= -∑i=1^n log (1/2 exp(-|yi-f(xi)|))

= ∑i=1^n |yi-f(xi)| + n log 2

2.

要求模型的最小化损失函数,可以通过最小化负对数似然得到。将负对数似然代入后,有:

L(f) = ∑i=1^n |yi - f(xi)| + n log 2

对L(f)求导得到梯度G(f),为:

G(f) = -∑i=1^n sign(yi - f(xi))

sign函数是一个符号函数,其定义如下:

x>0时,sign(x)=1 x=0时,sign(x)=0 x<0时,sign(x)=-1

将G(f)设置为0,解出f的解析解:

f(x) = median(y1, y2, ..., yn)

median(y1, y2, ..., yn)为所有y1, y2, ..., yn的中位数

3.

随机梯度下降算法可以如下实现:

1)初始化 f_0

2)对于每个epoch:

a) 打乱数据集 X 和 y 的顺序

b) 对于每个样本 (xi, yi),计算梯度 G_i(f) = sign(yi - f(xi))

c) 更新模型参数:f_{t+1} = f_t - η G_i(f_t),其中 η 是学习率

3)重复步骤2直至收敛

在驻点附近可能会出现振荡或者停滞的情况,这是因为梯度下降算法在该点的梯度接近0,导致更新时只有微小的变化,难以跳出该驻点。解决这个问题可以采用一些改进的方法,例如动量、自适应学习率等。另外,在噪声较大的情况下,模型可能会过度拟合噪声,导致性能下降,需要使用正则化等方法来缓解。

学习的时候发现了py中的yield这个关键字。p97

yield 关键字用于暂停(挂起)函数并返回一个值给调用者,而不会终止该函数。在这种情况下,使用yield关键字可以将批量大小分割为一小部分,并逐个迭代这些小部分,以便能够处理大型数据集,而无需将整个数据集存储在内存中。

每次调用生成器时,它从上次离开的地方恢复,并继续运行然后从yield语句返回下一批数据,这些数据将被传递给调用者。当没有更多数据可供产生时,该函数会正常退出。

# 定义优化函数
# params为模型参数集合、lr为学习率、batch_size为批量大小

# SGD(Stochastic Gradient Descent)是一种随机梯度下降算法
def sgd(params, lr, batch_size): #@save
   
"""批量随机梯度下降"""
   
with torch.no_grad():
       
for param in params:
            param -= lr * param.grad / batch_size
            param.grad.zero_()

with torch.no_grad()上下文管理器包装的代码块内的操作不会被记录梯度信息。这个上下文管理器的作用是临时关闭PyTorch中的自动求导机制,以减少内存消耗并加速计算。在这种情况下,即使执行了需要梯度的操作,也不会构建计算图,因此也就不会对变量进行求导。这对于评估模型或者进行推理时非常有用。

在使用反向传播算法计算梯度时,梯度是会累加的,而不是被替换掉。因此,在每次更新模型参数之前需要将累积的梯度清零,以避免出现重复计算或错误更新的情况。param.grad.zero_()就是用来实现这个功能的。它将参数的梯度设置为0,以便下一次迭代计算新的梯度

在训练过程中,发现了一个BUG,原因貌似是因为
param -= lr * param.grad / batch_size和param =param  -  lr * param.grad / batch_size的区别。一开始写成第二个了。

所以报错:AttributeError: 'NoneType' object has no attribute 'zero_'

后面貌似发现原因了↓

SGD函数中,我们使用param = param - lr * param.grad / batch_size这一行代码来更新每个参数。但是,在这个语句中,赋值运算符(=)会将右侧的计算结果分配给变量param,这将创建一个新的Tensor对象并将其分配给变量param,而不是原始的Tensor对象。因此,当我们调用param.grad.zero_()时,它实际上操作的是副本的属性grad,并没有对原始参数对象进行修改。而且,由于我们在函数中只是更新了副本的值,而不是原始对象的值,因此即使我们在函数中执行了零梯度操作,也不会直接影响到原始参数对象的grad属性。

当我们将 param = param - lr * param.grad / batch_size 改为 param -= lr * param.grad / batch_size 后,赋值运算符 -= 将使用减法运算符(-)和赋值运算符(=)组合成一个复合运算符(-=),这意味着 param -= lr * param.grad / batch_size 等价于 param = param - lr * param.grad / batch_size。这个复合运算符是原位(in-place)更新操作,可以直接修改原始对象的值,所以在调用param.grad.zero_()时就不会出现错误了。

通过↑打印前后地址即可证明。

p101的练习↓

答:这个问题其实也可以说“将权重都设置为1的话,合理吗?”。
其实都是不合理的,因为无论是将所有权重都初始化为0或1,则会破坏权重之间的不对称性,导致每个神经元输出相同的值。这种情况下,网络中的每个层将执行相同的功能,并且在进行反向传播时,每个权重都会获得相同的更新值,因此神经网络无法学习输入数据中的复杂模式,并且无法收敛到最优解。
所以应该使用其他更好的方法来初始化权重,如随机初始化或Xavier初始化,以确保权重之间有不对称性,并且神经网络能够有效地学习和训练。

答:计算二阶导数时可能会遇到以下问题:

1. 计算量大:计算高阶导数需要进行多次求导,每次都要重新计算并更新中间变量,因此计算量较大,尤其是在深度神经网络中。

2. 数值稳定性:在计算较高阶的导数时,由于存在舍入误差和数值不稳定性,可能导致结果不准确,并且误差会随着求导次数的增加而放大。

3. 内存消耗:在计算高阶导数时,需要存储更多的中间变量,以便在反向传播时使用。这可能会导致内存消耗过大,特别是在处理大规模数据集时。

为了克服这些问题,可以采用以下方法:

1. 通过符号计算来计算导数:符号计算可以直接对表达式进行求导,而无需计算数值。这种方法可以有效地减少计算量,并且可以得到精确的结果,但是它需要额外的计算时间和存储空间。

2. 利用自动微分工具:自动微分是一种自动计算导数的技术,它结合了符号计算和数值计算,可以非常快速地计算高阶导数。现代深度学习框架如PyTorch和TensorFlow都内置了自动微分功能,可以帮助开发人员方便地计算梯度和高阶导数。

3. 使用近似方法:在某些情况下,可以使用一些近似方法来计算高阶导数。例如,Hessian矩阵(海森矩阵、黑塞矩阵)可以通过有限差分法进行近似。这种方法计算简单,但可能存在数值误差和计算效率低的问题。

总之,在实际应用中,我们需要根据具体情况选择合适的方法来计算高阶导数,并在计算量、数值稳定性和内存消耗之间进行权衡。

7. 如果样本个数不能被批量⼤⼩整除,data_iter函数的⾏为会有什么变化?

答:

如果样本个数不能被批量大小整除,data_iter函数的行为会有所变化。在这种情况下,最后一个批次可能比其他批次要小。

具体来说,假设我们有n个样本和批量大小为b。当n不能被b整除时,最后一个批次将包含不到b个样本。

为了处理这种情况,通常会使用一些特殊的方法,例如填充缺失的样本或者丢弃最后一个不完整的批次。填充缺失的样本可以使用零向量或者其他默认值填充,以使所有批次的大小都相同。丢弃最后一个不完整的批次可以确保每个批次都有相同的大小,但是这样会导致某些样本未被使用。

p106习题

1. 如果将⼩批量的总损失替换为⼩批量损失的平均值,需要如何更改学习率?

答:

根据上面的公式,如果将小批量的总损失替换为小批量损失的平均值,那么学习率通常需要进行相应的调整。具体来说,如果用小批量损失的平均值来更新模型参数,则相当于使用了比原来更小的损失值进行梯度下降优化。因此,为了保持收敛速度不变,可以适当增加学习率

具体调整学习率的方法因不同的优化算法而异。以基本的随机梯度下降(SGD)算法为例,如果将小批量的总损失替换为小批量损失的平均值,则可以将学习率增加到原来的 batch_size 倍。

例如,如果原来使用的是学习率 lr=0.01 和 batch_size=32,则可以将学习率调整为 lr=0.01*32=0.32。这样做的目的是保持每个迭代步骤中梯度下降的大小不变,从而更好地利用数据集的信息,提高模型的训练效率和性能。

需要注意的是,学习率的调整通常需要根据实际情况进行微调,并综合考虑其他因素如模型复杂度、数据集大小等。

答:

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

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

相关文章

小程序项目—知识付费系统源码(多版本)

随着互联网的发展&#xff0c;知识付费成为了一种新的商业模式&#xff0c;越来越多的人开始通过知识付费来获取所需的知识和技能。为了更好地管理和运营知识付费系统&#xff0c;需要开发一个管理后台&#xff0c;本文将介绍知识付费系统管理后台的功能和实现。 产品介绍 &am…

云渲染对学生党有哪些好处和挑战?

云渲染是一种依托于云计算的云端服务&#xff0c;用户将本地任务提交到远程服务器&#xff0c;由远程的计算机集群资源进行运算操作&#xff0c;将上传的任务进行云端渲染后再返回本地。云渲染的优势是可以节省本地设备的性能和时间&#xff0c;提高渲染效率和质量。那么&#…

Flutter路由——Navigator2.0

Navigator 2.0提供了一系列全新的接口&#xff0c;可以实现将路由状态成为应用状态的一部分&#xff0c;新增的API如下&#xff1a; Page:用来表示Navigator路由栈中各个页面的不可变对象&#xff0c;Page是一个抽象类通常使用它的派生类&#xff1a;MaterialPage或CupertinoP…

Threejs进阶之十八:使用ExtrudeGeometry从二维图形创建三维几何体

目录 ExtrudeGeometry类构造函数options包含的参数 使用ExtrudeGeometry从二维图形创建三维图形的基本步骤1.创建二维图形2.创建轮廓线&#xff08;outline&#xff09;3.创建材质和网格对象补充内容&#xff1a;将拉伸图形生成为线框模式 上一节我们介绍了Threejs中二维图形相…

(转载)基于模拟退火算法的TSP问题求解(matlab实现)

1 理论基础 1.1 模拟退火算法基本原理 模拟退火(simulated annealing,SA)算法的思想最早是由Metropolis等提出的。其出发点是基于物理中固体物质的退火过程与一般的组合优化问题之间的相似性。模拟退火法是一种通用的优化算法&#xff0c;其物理退火过程由以下三部分组成&am…

【6.08 代随_51day】 最佳买卖股票时机含冷冻期、买卖股票的最佳时机含手续费

最佳买卖股票时机含冷冻期、买卖股票的最佳时机含手续费 最佳买卖股票时机含冷冻期1.方法图解步骤递归代码 买卖股票的最佳时机含手续费1.方法代码 最佳买卖股票时机含冷冻期 力扣连接&#xff1a;309. 最佳买卖股票时机含冷冻期&#xff08;中等&#xff09; 1.方法 1.具体…

【uniapp 小程序实现已授权用户直接自动登录,未授权用户展示授权页面并实现一键登录】

uniapp 小程序实现已授权用户直接自动登录,未授权用户展示授权页面并实现一键登录 前言一、实现思路1. 后端接口a. LoginByCodeb. LoginMpAlic. LoginMpWx 二、最终实现流程图1.流程图在这里插入图片描述 总结 前言 项目背景 : 项目是使用 uniapp 来实现的多端小程序 , 当前实…

LVS负载均衡群集部署——DR直接路由模式

这里写目录标题 一 、 LVS-DR 工作原理二、数据包流向分析三、LVS-DR 模式的特点四、ARP问题4.1 问题一&#xff1a;IP地址冲突4.2 问题二&#xff1a;第二次再有访问请求 五、部署LVS-DR集群5.1 配置Tomcat 多实例服务器5.2 配置web节点服务器配置web1节点服务器配置Nginx七层…

00后干一年跳槽就20K,测试老油条表示真怕被这个“卷王”干掉····

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&#x…

2023-06-05 stonedb-在聚合的场景查询为空无法执行case属性-问题分析-及定位问题的思路

目录 摘要: 查询SQL: 处理该问题的思路分析: 削减查询SQL的操作符 tianmu引擎的查询SQL innodb引擎的查询SQL mysql/sql和innodb执行分析: 执行过程的trace日志: 摘出一些涉及查询执行的部分 思路分析: mysql/sql层的核心处理: Item_func_case::fix_fields 调用堆…

【OpenCV DNN】Flask 视频监控目标检测教程 07

欢迎关注『OpenCV DNN Youcans』系列&#xff0c;持续更新中 【OpenCV DNN】Flask 视频监控目标检测教程 07 3.7 OpenCVFlask实时监控人脸识别cvFlask08 项目的文件树cvFlask08 项目的Python程序cvFlask08 项目的网页模板cvFlask08 项目的运行 本系列从零开始&#xff0c;详细…

2023上海国际嵌入式展 | 如何通过人工智能驱动的自动化测试工具提升嵌入式开发效率

2023年6月14日到16日&#xff0c;龙智将在2023上海国际嵌入式展&#xff08;embedded world China 2023&#xff09;A055展位亮相。同时&#xff0c;6月14日下午3:00-3:30&#xff0c;龙智资深DevSecOps顾问巫晓光将于创新技术及应用发展论坛第二论坛区&#xff08;A325展位&am…

idea代码检查插件

1&#xff0c;SonarLint Idea 安装 Sonar 插件提升代码质量_idea sonar插件_打代码的苏比特的博客-CSDN博客 2&#xff0c;immomo Mybatis XML Mapper SQL注入漏洞发现与一键修复-----项目静态代码安全审计idea插件工具MOMO CODE SEC INSPECTOR-Java_idea sql注入 插件_North…

【蓝桥刷题】备战国赛——交通信号

蓝桥杯2022国赛真题——交通信号 &#x1f680; 每日一题&#xff0c;冲刺国赛 &#x1f680; 题目导航&#xff1a; 交通信号 &#x1f387;思路&#xff1a; d i j k s t r a dijkstra dijkstra &#x1f531;思路分析&#xff1a; 要求从一点到另一点的最短距离&#xff0…

软件测试的生命周期、Bug

一、软件测试的生命周期 1、软件的生命周期&#xff1a; 需求分析&#xff1a;分析需求是否正确、完整。 设计&#xff1a;项目的上线时间、开始开发时间、测试时间、人员... 计划&#xff1a;设计技术文档、进行UI设计... 编码&#xff1a;写代码&#xff08;实现用户需求&am…

Tomcat启动闪退的详细解决方法(捕获的野生的java1.8.0_321和野生的Tomcat8实验)

1.实验说明 本实验将采用捕获的野生的java1.8.0_321和野生的Tomcat8进行实验。而且不需要安装服务。 2.配置声明&#xff1a; java -version javac -version CATALINA_HOME 说明&#xff1a;CATALINA_HOME配置到放置到tomcat的目录 Path 说明&#xff1a;Path路径配置到tomca…

如和使用matlab实现香农编码和解码

文章目录 前言效果截图如下代码解析完整代码完结 撒花 前言 在网上看了好多 , 都是对香农进行编码的案例 , 却没有 进行解码的操作 , 今天就来补齐这个欠缺 效果截图如下 代码解析 text 你好; % 待编码的文本定义一个字符串类型的变量text&#xff0c;其值为’你好’。 [en…

2023水博会新热门:北斗时空智能 助力水利数字孪生

当“北斗”遇上“智慧水利”将会碰撞出怎样的新意&#xff1f; 6月7日&#xff0c;2023中国水博会暨第十八届中国&#xff08;国际&#xff09;水务高峰论坛正式召开。会上&#xff0c;由千寻位置提出的“北斗时空智能助力水利数字孪生”理念及相应解决方案&#xff0c;受到了与…

肠道菌群、性激素与疾病:探索它们的交互作用

谷禾健康 我们的身体中有很多不同的器官&#xff0c;组织&#xff0c;腺体等会产生许多信号分子来精确控制和影响身体的反应和活动&#xff0c;这些信号分子包括激素、神经递质、生长因子、细胞因子等。它们可以促进或抑制细胞的生长和分化&#xff0c;调节细胞间的相互作用和通…

搭建lanproxy客户端与服务端实现内网穿透

一、首先要配置java环境 1.可以使用这个&#xff0c;或者官网下载&#xff0c;或者其他版本皆可。https://download.csdn.net/download/qq_44821149/87878658 2.采用jdk-8u144-linux-x64.zip压缩包。java version 为1.8.0_144。 3.具体操作为&#xff1a; mkdir /usr/java u…