【动手学深度学习】 2预备知识

2023-05-16

李沫《动手学习深度学习》课程学习

需要预备的知识原因重点
线性代数处理表格数据矩阵运算
微积分决定以何种方式调整参数

损失函数(loss function)—— 衡量“模型有多糟糕”这个问题的分数

梯度(gradient)—— 连结一个多元函数对其所有变量的偏导数,简单理解就是求导

概率在不确定的情况下进行严格的推断

目录

2.1. 数据操作——张量

2.1.1. 入门

2.1.2. 运算符

2.1.3. 广播机制

 2.1.4. 索引和切片

2.1.5. 节省内存

2.1.6. 转换为其他Python对象

2.1.8. 练习

2.2. 数据预处理

2.3. 线性代数

2.3.1. 标量

2.3.2. 向量

2.3.3. 矩阵

2.3.4. 降维

2.3.4.1. 非降维求和——轴数不变

 2.3.5. 练习​编辑

2.4. 微积分

2.5. 自动微分

2.6. 概率


2.1. 数据操作——张量

一个名词——张量(tensor),指n维数组,其中具有一个轴的张量对应数学上的向量(vector); 具有两个轴的张量对应数学上的矩阵(matrix)

多维张量的几何理解 - 简书 (jianshu.com)

张量的几何理解

2.1.1. 入门

库名:torch

pytorch中基本的数值计算、张量创建
函数名作用例子例子意义结果
arange()创建行向量torch.arange(12)创建了一个包含以0开始的前12个整数的行向量

tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])  
zeros()设置张量所有元素均为0torch.zeros(2,3,4)创建一个形状为(2,3,4)的张量,其中所有元素都设置为0

ones()设置张量所有元素均为1torch.ones(2,3,4)创建一个形状为(2,3,4)的张量,其中所有元素都设置为1
randn()随机初始化张量中参数的值torch.randn(3,4)形状为(3,4)的张量。 其中的每个元素都从均值为0、标准差为1的标准高斯分布(正态分布)中随机采样。
tensor()提供包含数值的Python列表(或嵌套列表),来为所需张量中的每个元素赋予确定值。 在这里,最外层的列表对应于轴0,内层的列表对应于轴1。torch.tensor([[2,1,4,3],[1,2,3,4],[4,3,2,1]])指定张量
张量属性,设x=tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
函数名作用例子结果
shape访问张量(沿每个轴的长度)的形状x.shape

torch.Size([12])  
size()访问张量(沿每个轴的长度)的形状x.size()

torch.Size([12])  
numel()张量中元素的总数x.numel()

12  
reshape()改变一个张量的形状而不改变元素数量和元素值x.reshape(3,4)


   
3维张量的张量属性实例
注:len()函数二维张量时结果与numel()函数相同,三维就不同了

2.1.2. 运算符

——按元素(elementwise)运算

对于任意具有相同形状的张量, 常见的标准算术运算符(+-*/**)都可以被升级为按元素运算。 我们可以在同一形状的任意两个张量上调用按元素操作。

运算函数(部分不用再导入包)
程序中运算函数意义
+
-
*
/
**
torch.exp(input)

x.sum()

x指一个张量

对张量中的所有元素进行求和,会产生一个单元素张量

torch.cat(tensons,dim=0/1)

例如:torch.cat((x,y),dim=0),torch.cat((x,y),dim=1)

x,y均为(3,4)的张量

张量连结(concatenate)

dim指张量连接的维度

torch.cat 张量连结补充

名词解释:把给定张量端对端地叠起来形成一个更大的张量。 

torch.cat 张量连结例子

 上面的例子分别演示了当沿行(轴-0,形状的第一个元素) 和按列(轴-1,形状的第二个元素)连结两个矩阵时,会发生什么情况。 可以看到,第一个输出张量的轴-0长度(6)是两个输入张量轴-0长度的总和(3+3); 第二个输出张量的轴-1长度(8)是两个输入张量轴-1长度的总和(4+4)

2.1.3. 广播机制

——形状不同的张量通过调用 广播机制(broadcasting mechanism)来执行按元素操作。

广播机制工作方式:复制元素拓展数组,使两个张量具有相同的形状。

拓展方法:在大多数情况下,我们将沿着数组中长度为1的轴进行广播。

例子:ab分别是3×1和1×2矩阵,如果让它们相加,它们的形状不匹配。 我们将两个矩阵广播为一个更大的3×2矩阵,如下所示:矩阵a将复制列, 矩阵b将复制行,然后再按元素相加。

广播机制实例

 2.1.4. 索引和切片

 ——第一个元素的索引是0,最后一个元素索引是-1

索引、切片例子,X是一个tensor
例子意义
X[-1]选择最后一个元素
X[1:3]选择第二个和第三个元素
X[0:2,:]访问第1行和第2行,其中“:”代表沿轴1(列)的所有元素。

2.1.5. 节省内存

低层逻辑:运行一些操作可能会导致为新结果分配内存,机器学习运算量巨大,会导致内存不断被更新占用。

现实意义:节省内存,更重要的是防止需要引用最新值时由于一些问题还是指向了旧值地址,导致错误。

方法:切片表示法,例Y[:] = <expression>

Z = torch.zeros_like(Y)
print('id(Z):', id(Z))
Z[:] = X + Y
print('id(Z):', id(Z))

output:
id(Z): 140316199714544
id(Z): 140316199714544

2.1.6. 转换为其他Python对象

numpy转torch

A = X.numpy()
B = torch.tensor(A)
type(A), type(B)

output:
(numpy.ndarray, torch.Tensor)

torch张量转标量——item函数或Python的内置函数

a = torch.tensor([3.5])
a # tensor([3.5000])
a.item() # 3.5
float(a) # 3.5
int(a) # 3

2.1.8. 练习

  1. 运行本节中的代码。将本节中的条件语句X == Y更改为X < YX > Y,然后看看你可以得到什么样的张量。

    x<y:判断每一个元素是否满足 x<y 的要求,满足为 True,不满足为False ,张量形状为(3,4);x>y:判断每一个元素是否满足 x>y 的要求,满足为 True,不满足为False ,张量形状为(3,4).

  2. 用其他形状(例如三维张量)替换广播机制中按元素操作的两个张量。结果是否与预期相同

是相同的,但要注意两个问题:

(1) 第3个维度必须相同,否则相加报错

 (2)3维tensor元素与几何图之间的对应方法

2.2. 数据预处理

——运用pandas库

注:数据预处理是深度学习中很重要的一部分,pandas库是一个很常用且强大的库,本书中该部分并不是重点,内容较少,在此不总结,会再写一篇文章具体总结pandas库的一些详细用法,并跑几个例程。

2.3. 线性代数

2.3.1. 标量

——包含一个数值的叫标量(scalar)

1、实例

标量实例

2、数学知识

标量的一些数学知识

2.3.2. 向量

—— 一维张量,将标量从零阶推广到一阶

1、实例

向量实例

2、数学知识 

向量的一些数学知识1
向量的一些数学知识2
注:点乘、叉乘的区别可以看这 数学基础 —— 向量运算:点乘和叉乘 - 哔哩哔哩 (bilibili.com)

注:点乘和点积(dot product)是一个东西,给定两个向量相同位置的按元素乘积的和。

2.3.3. 矩阵

—— 二维张量,将向量从一阶推广到二阶

1、实例

矩阵实例

 2、矩阵基础知识 

特殊矩阵,设有一矩阵A
代码含义数学解释
A.T矩阵的转置

交换矩阵的行和列

A==A.T结果均为True对称矩阵Aij = Aji 
反对称矩阵Aij = -Aji 
正交矩阵

AAT=E(E为单位矩阵,AT表示“矩阵A的转置矩阵”)或ATA=E

什么是正交矩阵-百度经验 (baidu.com)

置换矩阵

A 是方阵,A 的每一行和每一列都有且仅有一个1,其余均为0

【2.7】P矩阵:置换矩阵 - 知乎 (zhihu.com)

方阵矩阵的行数与列数相等

补充知识:特征向量与特征值特征值与特征向量 (baidu.com)

 3、数学知识 

矩阵的一些数学知识1

Hadamard积:两个矩阵的按元素乘法

矩阵的一些数学知识2

矩阵乘法会对空间进行扭曲,公式不好理解,视频清楚:矩阵乘法的动画演示_哔哩哔哩_bilibili

矩阵的一些数学知识2
矩阵的一些数学知识3
注:这部分现阶段理解有点困难,先理解向量的概念吧 向量的【范数】:模长的推广,柯西不等式_哔哩哔哩_bilibili
矩阵的【范数】:也是一种长度_哔哩哔哩_bilibili

范数其实可以理解为一种长度,常见L1、L2范数 

在深度学习中,我们经常试图解决优化问题: 最大化分配给观测数据的概率; 最小化预测和真实观测之间的距离。 用向量表示物品(如单词、产品或新闻文章),以便最小化相似项目之间的距离,最大化不同项目之间的距离。 目标,或许是深度学习算法最重要的组成部分(除了数据),通常被表达为范数。

4、代码中的函数

运算函数
函数意义 
A+BA、B张量加法
A * BA、B张量的Hadamard积
torch.dot(x,y)x,y向量点积
torch.sum(x*y)执行按元素乘法,然后进行求和来表示两个向量的点积
torch.mv(A,x)矩阵A和向量x的矩阵-向量积,注意,A的列维数(沿轴1的长度)必须与x的维数(其长度)相同。
torch.mm(A,B)矩阵A和矩阵B乘法
torch.norm(u)u张量的L2范数(Frobenius范数)
torch.abs(u).sum()u张量的L1范数,将绝对值函数和按元素求和组合起来。

2.3.4. 降维

方法:

1、求和

直接求和——沿所有的轴降低张量的维度,变为一个标量,向量、矩阵均适用

 指定张量沿哪一个轴来求和:

 2、求平均

直接求平均:

 指定轴:

2.3.4.1. 非降维求和——轴数不变

1、cumsum函数不会沿任何轴降低输入张量的维度。

 2、由于sum_A在对每行进行求和后仍保持两个轴,我们可以通过广播将A除以sum_A。

 2.3.5. 练习

 

 

 

 

 

2.4. 微积分

  • 微分和积分是微积分的两个分支,前者可以应用于深度学习中的优化问题。

  • 导数可以被解释为函数相对于其变量的瞬时变化率,它也是函数曲线的切线的斜率。

  • 标量关于列向量的导数是一个行向量。

  • 列向量关于标量的导数是一个列向量。

  • 向量关于向量的导数结果是一个矩阵。

  • 梯度是一个向量,指向值最大的方向,其分量是多变量函数相对于其所有变量的偏导数。

  • 链式法则使我们能够微分复合函数。

不同情况下求导形状的变化

2.5. 自动微分

深度学习框架通过自动计算导数,即自动微分(automatic differentiation)来加快求导。 实际中,根据我们设计的模型,系统会构建一个计算图(computational graph),来跟踪计算是哪些数据通过哪些操作组合起来产生输出。 自动微分使系统能够随后反向传播(方向累积)梯度。 这里,反向传播(backpropagate)意味着跟踪整个计算图,填充关于每个参数的偏导数。

计算图(链式法则过程)

1、backward()反向传播函数和grad函数计算梯度

最基础例子:对函数y=2x⊤x(y等于标量2乘列向量x点积列向量x)关于列向量x求导(按照规则求导后结果为y=4x)

import torch

x = torch.arange(4.0)
x

x.requires_grad_(True)  # 等价于x=torch.arange(4.0,requires_grad=True),梯度存的位置
x.grad  # 默认值为None

y = 2 * torch.dot(x, x) # y为标量
y

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

 在默认情况下,pytorch会累积梯度,单运用同一个变量进行运算,需要清除之前的值,运用下面这行代码

x.grad.zero_()

2、非标量变量的反向传播

y不是标量时,机器学习中通常单独计算批量中每个样本的偏导数之和,如下代码所示。

# 对非标量调用backward需要传入一个gradient参数,该参数指定微分函数关于self的梯度。
# 在我们的例子中,我们只想求偏导数的和,所以传递一个1的梯度是合适的
x.grad.zero_()
y = x * x
# 等价于y.backward(torch.ones(len(x)))
y.sum().backward()
x.grad

3、运用detach()函数使在系统中函数类型转为常数类型

例子:计算z=u*x关于x的偏导数,同时将u作为常数处理, 而不是z=x*x*x关于x的偏导数。

x.grad.zero_()
y = x * x
u = y.detach()
z = u * x

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

output:tensor([True, True, True, True])


##由于记录了y的计算结果,可以随后在y上调用反向传播, 得到y=x*x关于的x的导数,即2*x。
x.grad.zero_()
y.sum().backward()
x.grad == 2 * x

output:tensor([True, True, True, True])

4、通过Python控制流(例如,条件、循环或任意函数调用),仍然可以计算得到的变量的梯度。

例子:在下面的代码中,while循环的迭代次数和if语句的结果都取决于输入a的值。

def f(a):
    b = a * 2
    while b.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()

a.grad == d / a

output:tensor(True)

小结:深度学习框架可以自动计算导数,首先将梯度附加到想要对其计算偏导数的变量上。然后记录目标值的计算,执行它的反向传播函数,并访问得到的梯度。

2.6. 概率

  • 我们可以从概率分布中采样。

  • 我们可以使用联合分布、条件分布、Bayes定理、边缘化和独立性假设来分析多个随机变量。

  • 期望和方差为概率分布的关键特征的概括提供了实用的度量形式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【动手学深度学习】 2预备知识 的相关文章

随机推荐

  • 深入详解PID三项的作用与特性(抛开公式,以常识认识PID)

    深入探讨PID三项作用与特性 xff08 纯以常识方式对PID进行数学理论分析 xff09 1 经典PID的理解 xff08 抛弃公式 xff0c 以常识认识PID xff09 源文献 PID指的就是比例 积分 微分三项的结合 xff0c
  • ADRC自抗扰控制,有手就行

    ADRC自抗扰控制 xff0c 有手就行 关于ADRC的优点本人不会赘述 xff0c 毕竟作为一个ADRC算法都推导不出来的应用工程师 xff0c 最希望看到的就是有手就行的操作方法 ARC的缺点就显而易见 xff0c 就是参数多 xff0
  • nuScenes数据集详细介绍

    本文为博主原创文章 xff0c 未经博主允许不得转载 本文为专栏 python三维点云从基础到深度学习 系列文章 xff0c 地址为 https blog csdn net suiyingy article details 12401771
  • fegin调用的时候数据格式转换为linkedhashmap

    在spring cloud项目开发中 xff0c 使用fegin进行远程调用 1 接口服务方返回类型为Map String Object 类型 2 接口调用方返回值类型也是Map String Object 3 通过fegin调用之后返回的
  • 一个字符串截取函数c语言

    刚开始学习c语言 xff0c 标准库中总是有很多函数没有 xff0c string h中的字符串处理函数好像不是很多 xff0c 在做栈的例子用需要用到一个字符串按位置截取的函数 xff0c 就自己写一个 xff0c 超简单 char su
  • RAF_DB数据集分类_3

    混淆矩阵 这里ECANet太长了 xff0c 我这里直接利用resnet代替一下 xff0c 你可以直接替换 xff0c 然后把权重对应好即可 xff0c 这只是一个简单的混淆矩阵生成 xff0c 没有太多美化 span class tok
  • docker镜像的创建

    目录 基于现有镜像创建 首先启动一个镜像 xff0c 在容器里做修改 然后将修改后的容器提交为新的镜像 xff0c 需要使用该容器的ID号创建新镜像 基于本地模板创建 导入镜像 基于Dockerfile创建 联合文件系统 xff08 Uni
  • ROS源码分析--子话题-catkin

    catkin简介 catkin简介 packagexml 格式1格式2 CMakeListtxtmeta package典型ROS应用添加自定义message文件 修改packagexml修改CMakeListtxt find packag
  • vnc安装和开机自启设置

    一 安装VNC 键入以下命令以在 Ubuntu 服务器上安装 TigerVNC xff1a sudo apt install tigervnc standalone server tigervnc common 现在安装了 VNC 服务器
  • 【Linux】线程安全篇Ⅰ

    文章目录 0 概述1 线程不安全举例1 1 前提知识铺垫1 2 场景模拟1 3 代码模拟 2 互斥2 1 什么是互斥2 2 互斥锁的原理 amp amp 特性2 3 互斥锁的计数器如何保证原子性2 4 互斥锁的接口2 4 1 初始化接口2
  • PX4/APM/飞控的学习笔记前言-Cxm

    开始了 开始了 终于有时间可以学习飞控了 此文章是用来当目录 我会持续更新我的学习之旅 希望能对各位有所帮助 如果有错误的地方还请各位前辈指点 此帖持续更新后续内容 其实从21年的一月就开始学习飞控一开始是从PX4开始学习 但是因为对liu
  • kubernetes 中文版

    这个文档非常好用 xff0c 建议收藏 无水印版 https pan baidu com s 1LSI46GBENd90Z06FnuaKmw lukb
  • SimpleBGC三轴云台用户手册

    SimpleBGC三轴云台用户手册 V1 00 硬件平台 xff1a STorM BGC V1 31 软件框架 xff1a SimpleBGC V1 00 本方案是采用俄版STorM BGC硬件平台 xff0c 软件采用SimpleBGC架
  • typedef和define有什么区别

    typedef和define都是替一个对象取一个别名 xff0c 以此增强程序的可读性 xff0c 区别如下 xff1a xff08 1 xff09 原理不同 define是C语言中定义的语法 xff0c 是预处理指令 xff0c 在预处理
  • 接口返回报错 resource notfound,plrase check path

    1 报错原因 post请求的content type application x www form urlencoded 但是请求体中设置的是json数据 34 date 34 34 2022 01 01 34 34 inclTransfe
  • Java中枚举的线程安全性及序列化问题

    一 枚举是如何保证线程安全的 要想看源码 xff0c 首先得有一个类吧 xff0c 那么枚举类型到底是什么类呢 xff1f 是enum吗 xff1f 答案很明显不是 xff0c enum就和class一样 xff0c 只是一个关键字 xff
  • Vscode配置Git

    vscode安装git 首先我们要确保我们下载了vscode和git xff0c 接下来就是给vscode配置git的步骤 xff1a 配置git环境变量 xff08 path值为git安装位置的cmd文件夹 xff09 xff0c 如图
  • SLAM-6视觉里程计里面特征点计算的缺点所做的改进

    缺点的改进方法 xff1a 由于之前的视觉里程计要计算关键点和描述子 xff0c 花费大量的时间 xff0c 有两种办法可以避免 1 只计算关键点 xff0c 通过光流法追踪关键点的运动 xff0c 可以得到同一个关键点在不同时刻图片的位置
  • SLAM8-后端的其他方法,BA与图优化,Pose Graph优化的理论与公式详解、因子图优化

    1 BA方法 Bundle Adjustment翻译过来是 光束调整 xff0c 意思是每个特征反射的光束 xff0c 通过调整它们的空间位置和相机姿态 xff0c 使它们都汇聚到相机光心 xff0c 这个过程叫BA 假定世界坐标系下的点p
  • 【动手学深度学习】 2预备知识

    李沫 动手学习深度学习 课程学习 需要预备的知识原因重点线性代数处理表格数据矩阵运算微积分决定以何种方式调整参数 损失函数 xff08 loss function xff09 衡量 模型有多糟糕 这个问题的分数 梯度 xff08 gradi