机器学习深度学习——预备知识(下)

news2024/11/24 19:52:17

机器学习&&深度学习——预备知识(下)

  • 4 微积分
    • 4.1 导数和微分
    • 4.2 偏导数
    • 4.3 梯度
    • 4.4 链式法则
  • 5 自动微分
    • 5.1 简单例子
    • 5.2 非标量变量的反向传播
    • 5.3 分离计算
    • 5.4 Python控制流的梯度计算
  • 6 概率
    • 6.1 基本概率论
      • 6.1.1 概率论公理
    • 6.2 处理多个随机变量
      • 6.2.1 联合概率
      • 6.2.2 条件概率
      • 6.2.3 贝叶斯定理
      • 6.2.4 边际化
      • 6.2.5 独立性
    • 6.3 期望与方差
  • 7 查阅文档
    • 7.1 查找模块中的所有函数和类
    • 7.2 查找特定函数和类的用法

4 微积分

4.1 导数和微分

知道概念和性质就可以过

4.2 偏导数

知道概念和性质就可以过

4.3 梯度

连结一个多元函数对其所有变量的偏导数,以得到该函数的梯度向量。关于概念和规则如下:
在这里插入图片描述
推导都很容易

4.4 链式法则

上面的方法可能难以找到梯度,因为深度学习中的多元函数通常是复合的,但链式法则可以以用来微分复合函数,推导如下,其实也都学过的:
在这里插入图片描述

5 自动微分

求导当然简单,但是对于复杂的模型,收工更新是很痛苦的事情。
深度学习框架通过自动计算导数,即自动微分来加快求导。实际上,根据设计好的模型,系统会构建一个计算图,来跟踪计算是哪些数据通过哪些操作组合起来产生输出。自动微分使系统能够随后反向传播梯度。反向传播意味着跟踪整个计算图,填充每个参数的偏导数

5.1 简单例子

对函数y=2xTx关于列向量x求导:

import torch

x = torch.arange(4.0)
# 不要在每次对一个参数求导时都分配新内存
# 通过调用requires_grad_来为一个张量的梯度分配内存
x.requires_grad_(True)
# 可使用x.grad访问,默认全0

# 计算y
y = 2 * torch.dot(x, x)

#  接下来,通过调用反向传播函数来自动计算y关于x每个分量的梯度,并打印这些梯度。
y.backward()
print(x.grad)

# 上述输出结果为tensor([ 0.,  4.,  8., 12.]),则其关于x的梯度为4x
# 可以验证:
print(x.grad == 4*x)

# 现在计算x的求和函数
x.grad.zero_() # 默认情况下pytorch会累积梯度,需清除之前的值
y = x.sum()
y.backward()
print(x.grad)

结果:

tensor([ 0.,  4.,  8., 12.])
tensor([True, True, True, True])
tensor([1., 1., 1., 1.])

5.2 非标量变量的反向传播

当y不是标量时,向量y关于向量x的导数的最自然解释是一个矩阵。对于高阶和高维的y、x,求导结果可以是一个高阶张量。
当调用向量的反向计算时,常会计算一批训练样本中每个组成部分的损失函数的导数。这里的目的不是计算微分矩阵,而是单独计算批量中每个样本的偏导数之和。

import torch

x = torch.arange(4.0)
x.requires_grad_(True)
# 对非标量调用backward需要传入一个gradient参数,该参数指定微分函数关于self的梯度
# 这里只想求偏导数的和,所以传递一个1的梯度是合适的
y = x * x
# 等价于y.backward(torch.ones(len(x)))
y.sum().backward()
print(x.grad)

结果:
tensor([0., 2., 4., 6.])
看到这里如果懵了记得把矩阵/向量的点积和乘积的概念搞好,推导都是很容易的

5.3 分离计算

这里希望你把我们要计算偏导的时候,所谓用到的计算图的概念给搞懂,其实就和高数里面的概念差不多,只是计算图会把它画的跟个树似的
有时希望将某些计算移动到记录的计算图之外。例如:y是关于x的函数,而z是作为y和x的函数。这时候如果要计算z关于x的梯度,由于某种原因,希望将y视为常数,且只考虑x在y被计算后发挥的作用。
直接看例子:

import torch

x = torch.arange(4.0)
x.requires_grad_(True)
# 这里可以分离y来返回一个新变量u,u与y有相同值,但丢弃计算图中如何计算y的任何信息
# 也就是说,梯度不会向后流经u到x
# 下面的计算z=u * x关于x的偏导,将u作为常数处理,而不是z=x*x*x关于x的偏导
y = x * x
u = y.detach()
z = u * x

z.sum().backward()
print(x.grad == u)

# 由于记录了y的计算结果,现在可以在y上调用反向传播,得到y=x*x关于x的导数
x.grad.zero_()  # 这一步不要忘记了
y.sum().backward()
print(x.grad == 2 * x)

结果:

tensor([True, True, True, True])
tensor([True, True, True, True])

5.4 Python控制流的梯度计算

使用自动微分的好处就在这,即使构建函数的计算图要通过控制流,仍可以得到变量梯度:

import torch

def f(a):
    b = a * 2
    while a.norm() < 1000:
        b = b * 2
    if b.sum() > 0:
        c = b
    else:
        c = 100 * b
    return c


# 计算梯度
a = torch.randn(size=(), requires_grad=True)
d = f(a)
d.backward()

# 根据上述f函数,可得f(a)=k*a,因此可用d/a验证梯度是否正确
print(a.grad == d / a)

结果:
tensor(True)

6 概率

6.1 基本概率论

最常见的例子:掷骰子。
大数定律:随着测试次数增加,事件概率的估计值(事件出现次数/总次数)越来越接近真实的潜在概率
抽样:从概率分布中抽取样本(分布就先看成对事件的概率分配)
现在来进行验证,大家可以先搞懂Multinomial(分布式)函数:
Pytorch中的多项分布multinomial.Multinomial().sample()解析

import torch
from torch.distributions import multinomial
from d2l import torch as d2l

# 抽取一个掷骰子的样本,只需传入一个概率向量,输出的是另一个相同长度的向量:
# 它在索引i处的值是采样结果中i出现的次数
fair_probs = torch.ones([6])/6  # tensor([0.1667, 0.1667, 0.1667, 0.1667, 0.1667, 0.1667])
# 进行一次抽样
print(multinomial.Multinomial(1, fair_probs).sample())
# 进行十次抽样
print(multinomial.Multinomial(10, fair_probs).sample())
# 进行1000次抽样并计算相对频率,作为真实概率的估计:
counts = multinomial.Multinomial(1000, fair_probs).sample()
print(counts / 1000)

结果:

tensor([1., 0., 0., 0., 0., 0.])
tensor([2., 1., 2., 2., 1., 2.])
tensor([0.1670, 0.1540, 0.1780, 0.1600, 0.1700, 0.1710])

可以看出,前两个输出结果中的数字和为取样数;最后一个输出结果可以证明大数定律
我们也可以看到这些概率如何随着时间的推移收敛到真实概率。 让我们进行500组实验,每组抽取10个样本:

import torch
from torch.distributions import multinomial
from d2l import torch as d2l
fair_probs = torch.ones([6])/6
counts = multinomial.Multinomial(10, fair_probs).sample((500,))  # sample指定抽样次数,默认是1次
# print(counts)
cum_counts = counts.cumsum(dim=0)  # 计算行前缀和,即sum[i][j]=a[1][j]+a[2][j]+...+a[i][j],方便直观验证大数定律
# print(cum_counts)
estimates = cum_counts / cum_counts.sum(dim=1, keepdims=True)  # 每个行前缀和都除以当前行的和,以得到概率估计
d2l.set_figsize((6, 4.5))
for i in range(6):
    d2l.plt.plot(estimates[:, i].numpy(),
                 label=("P(die=" + str(i + 1) + ")"))
d2l.plt.axhline(y=0.167, color='black', linestyle='dashed')
d2l.plt.gca().set_xlabel('Groups of experiments')
d2l.plt.gca().set_ylabel('Estimated probability')
d2l.plt.legend()
d2l.plt.show()

结果:
在这里插入图片描述
每条直线对应于骰子的6个值中的一个,并给出骰子在每组实验后出现值的估计概率。数据越多,越向真实概率收敛

6.1.1 概率论公理

在这里插入图片描述

6.2 处理多个随机变量

举个例子,图像包含数百万像素,因此有数百万个随机变量,可将所有元数据视为随机变量,例如位置、时间、光圈和相机类型。

6.2.1 联合概率

P(A=a,B=b)表示A=a、B=b同时满足的概率,P(A=a,B=b)<=P(A=a)。

6.2.2 条件概率

根据联合概率的不等式可以推导出:
0 < = P ( A = a , B = b ) P ( A = a ) < = 1 0<=\frac{P(A=a,B=b)}{P(A=a)}<=1 0<=P(A=a)P(A=a,B=b)<=1
我们称这个比率为条件概率,记为P(B=b|A=a),表示:前提A=a已发生时,B=b的概率

6.2.3 贝叶斯定理

很重要的定理,根据乘法法则我们可以得到:
P ( A B ) = P ( B ∣ A ) P ( A ) P(AB)=P(B|A)P(A) P(AB)=P(BA)P(A)
根据对称性,我们可以得到:
P ( A B ) = P ( A ∣ B ) ( B ) P(AB)=P(A|B)(B) P(AB)=P(AB)(B)
假设P(B)>0,则:
P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ) P(A|B)=\frac{P(B|A)P(A)}{P(B)} P(AB)=P(B)P(BA)P(A)

6.2.4 边际化

根据求和法则,得:B的概率相当于计算A的所有可能选择,并将所有联合概率聚合在一起:
P ( B ) = ∑ A P ( A B ) P(B)=\sum_{A}P(AB) P(B)=AP(AB)
这也称为边际化,其结果概率为边际概率,结果分布为边际分布

6.2.5 独立性

当事件A、B无关时:
P ( A ∣ B ) = P ( A , B ) P ( B ) = P ( A ) P(A|B)=\frac{P(A,B)}{P(B)}=P(A) P(AB)=P(B)P(A,B)=P(A)
同样,给定一个随机变量C,则A、B是条件独立的,当且仅当:
P ( A B ∣ C ) = P ( A ∣ C ) ( B ∣ C ) P(AB|C)=P(A|C)(B|C) P(ABC)=P(AC)(BC)

6.3 期望与方差

期望
1、一个随机变量X的期望:
E [ X ] = ∑ x x P ( X = x ) E[X]=\sum_x{xP(X=x)} E[X]=xxP(X=x)
2、函数f(x)的输入是从分布P中抽取的随机变量时,f(x)的期望值为
E x   p [ f ( x ) ] = ∑ x f ( x ) P ( x ) E_{x~p}[f(x)]=\sum_x{f(x)P(x)} Ex p[f(x)]=xf(x)P(x)
方差
V a r [ x ] = E [ ( X − E [ X ] ) 2 ] = E [ X 2 ] − E [ X ] 2 Var[x]=E[(X-E[X])^2]=E[X^2]-E[X]^2 Var[x]=E[(XE[X])2]=E[X2]E[X]2

7 查阅文档

7.1 查找模块中的所有函数和类

调用dir函数,例如查询随机数生成模块中的所有属性:

print(dir(torch.distributions))

7.2 查找特定函数和类的用法

help(touch.ones)

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

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

相关文章

5.1 Bootstrap 插件概览

文章目录 Bootstrap 插件概览data 属性编程方式的 API避免命名空间冲突事件 Bootstrap 插件概览 在前面 布局组件 章节中所讨论到的组件仅仅是个开始。Bootstrap 自带 12 种 jQuery 插件&#xff0c;扩展了功能&#xff0c;可以给站点添加更多的互动。即使您不是一名高级的 Jav…

超参数优化 - 贝叶斯优化的实现

目录 1. 基于Bayes_opt实现GP优化 1.1 定义目标函数 1.2 定义参数空间 1.3 定义优化目标函数的具体流程 4. 定义验证函数&#xff08;非必须&#xff09; 5. 执行实际优化流程 2. 基于HyperOpt实现TPE优化 2.1 定义目标函数 2.2 定义参数空间 2.3 定义优化目标函数的…

Asp.Net WebForm ViewState

ViewState用于保存服务器控件(runat"server")状态便于在触发回调后&#xff08;PostBack&#xff09;恢复页面。 页面拖入一个Form id"form1" runat"server",里面添加一个<asp:Button id"Button1" Text"删除" OnClick&q…

python:对 GEDI 数据进行高斯滤波处理

作者:CSDN @ _养乐多_ 在本篇博客中,我们将学习如何使用 Python 对 GEDI(Global Ecosystem Dynamics Investigation)激光雷达数据进行高斯滤波处理。高斯滤波是一种平滑滤波方法,可以有效减少噪声和突变,提高数据的平滑性和连续性。我们将使用 pandas 和 scipy.signal 库…

STM32MP157驱动开发——LED 驱动( GPIO 子系统)

文章目录 编写思路GPIO子系统的LED驱动程序(stm32mp157)如何找到引脚功能和配置信息在设备树中添加 Pinctrl 信息leddrv.cledtest.cMakefile编译测试 编写思路 阅读&#xff1a;STM32MP157驱动开发——GPIO 和 和 Pinctrl 子系统的概念可知利用GPIO子系统去编写LED驱动&#x…

Mysql基础(下)之函数,约束,多表查询,事务

&#x1f442; 回到夏天&#xff08;我多想回到那个夏天&#xff09; - 傲七爷/小田音乐社 - 单曲 - 网易云音乐 截图自 劈里啪啦 -- 黑马Mysql&#xff0c;仅学习使用 &#x1f447;原地址 47. 基础-多表查询-表子查询_哔哩哔哩_bilibili 目录 &#x1f982;函数 &#x1f3…

Spark(35):Structured Streaming 概述

目录 0. 相关文章链接 1. 什么是Structured Streaming 2. Structure Streaming 快速入门 2.1. 导入依赖 2.2. 代码实现 2.3. 程序测试 2.4. 代码说明 0. 相关文章链接 Spark文章汇总 1. 什么是Structured Streaming 从 spark2.0 开始, spark 引入了一套新的流式计算模…

新Viewport单位

本文为翻译本文译者为 360 奇舞团前端开发工程师原文标题&#xff1a;New Viewport Units原文作者&#xff1a;Ahmad Shadeed原文地址&#xff1a;https://ishadeed.com/article/new-viewport-units/ 自 2012 年以来&#xff0c;我们一直在使用 CSS viewport 单位。它们对于帮助…

RGB简单人脸活体检测(Liveness Detection)

参考&#xff1a; https://github.com/minivision-ai/Silent-Face-Anti-Spoofing&#xff08;主要这个库&#xff09; https://github.com/computervisioneng/face-attendance-system&#xff08;使用案例&#xff09; ##概念&#xff1a; 活体检测是指针对人脸识别过程中的人脸…

TSDB - VictoriaMetrics 技术原理浅析

一、前言 在监控领域&#xff0c;通常需要指标存储组件TSDB&#xff0c;目前开源的TSDB组件比较多&#xff0c;各个组件性能、高可用性、维护成本等等各有差异。本文不分析选型问题&#xff0c;重点讲解VictoriaMetrics&#xff08;后面简称为vm&#xff09;。 有兴趣的朋友建议…

Linux中常用的一些shell命令

很多的时候我们知道有一个命令&#xff0c;但不知道它的详细用法&#xff0c;可以来搜索下。但有些时候压根不知道有这个命令&#xff0c;比如vimdiff和diff这两个命令&#xff0c;知道人就比较少。 本节内容主要汇总一下Linux中常用的一些shell命令。 1. 文件和目录操作 ls …

win11安装MySQL5.7.43的问题清单

文章目录 1、win11查看自己电脑有没有安装mysql法1法2 2、完全清除之前安装的mysql3、 mysql的安装法1法2 4、遇到的一些问题1) ‘mysql‘不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件2) 忘记mysql的密码3)mysql启动不了:本地计算机上的MySQL服务启动后停止4…

机器学习深度学习——torch.nn模块

机器学习&&深度学习——torch.nn模块 卷积层池化层激活函数循环层全连接层 torch.nn模块包含着torch已经准备好的层&#xff0c;方便使用者调用构建网络。 卷积层 卷积就是输入和卷积核之间的内积运算&#xff0c;如下图&#xff1a; 容易发现&#xff0c;卷积神经网…

汽车养护店服务难题,看帕凝怎样解决?

中国汽车市场庞大&#xff0c;入户已然成为标配&#xff0c;加之新能源汽车近些年高增量&#xff0c;更促进了行业增长。而汽车后市场也迎来了一系列变化&#xff0c;客户服务前后路径需完善&#xff0c;商家们应该如何数字化经营呢&#xff1f; 接下来让我们看看【帕凝汽车养…

提升内功之模拟实现库函数atoi

本文包含知识点&#xff1a; 库函数atoi的使用和模拟实现枚举常量的运用fgets代替gets函数读取字符串isspace isdigit库函数的使用 一、库函数atoi的介绍与使用atoi的介绍atoi的使用细节 二、库函数atoi的模拟实现 一、库函数atoi的介绍与使用 atoi的介绍 函数介绍 头文件——…

密码学学习笔记(十七 ):Edwards曲线数字签名算法 - edDSA

Edwards曲线数字签名算法(Edwards-curve Digital Signature Alogorithm, edDSA)由Daniel J. Bernstein等人在2011年提出&#xff0c;它是一种使用基于扭曲爱德华兹曲线的Schnorr签名变体的数字签名方案。 EdDSA的一个特殊之处在于&#xff0c;该方案不要求每次签名都是用全新的…

Spring项目如何创建?Bean对象是如何存储的?

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE进阶 目录 文章目录 一、创建Spring项目 1.1 创建Maven项目 2.2 配置国内源 二、Bean对象的存储和读取 2.1 添加spring配置文件 2.2 创建Bean对象 2.3 读取Bean对象 2.3.1 得到spring上下文对象…

前端技术Vue学习笔记--001

前端技术Vue学习笔记 文章目录 前端技术Vue学习笔记1、Vue2和Vue3比较2、Vue简介3、Vue快速上手4、插值表达式{{}}5、Vue响应式特性6、Vue指令6.1、v-html指令6.2、v-show指令和v-if指令6.3、v-else指令和v-else-if指令6.4、v-on指令6.4.1、v-on指令基础6.4.2、v-on调用传参 6.…

生命的样子

bbc纪录片《王朝》第一季就让我颇为震撼&#xff0c;第二季拖到现在才看&#xff0c;不过好在看了《晚酌de流派》之后&#xff0c;现在对待上好的游戏和视频都要颇有仪式感的情况下食用&#xff0c;夜深人静&#xff0c;配着暖灯&#xff0c;一杯茶&#xff0c;伴随大卫爱登堡的…

Lesson2——时间复杂度与空间复杂度

前言&#xff1a; 一个物品的好坏&#xff0c;我们可以通过体验、口碑、销量等因素判断。那一个算法的好坏我们怎么判断呢&#xff1f; 目录&#xff1a; 1. 算法的效率 2. 时间复杂度 3. 空间复杂度 4. 常见时间复杂度以及复杂度oj练习 一、算法的效率 1、如何衡量一个算…