动手学深度学习 05
线性代数
坦诚的讲,线性代数的知识已经遗忘了很多,就跟着沐神回顾一下吧
标量
向量
矩阵
F范数比较简单,因此通常使用F范数;矩阵范数算起来比较麻烦,一般是不去算的
矩阵就是把空间进行扭曲
特殊矩阵
线性代数的实现
标量
- 标量由只有一个元素的张量表示,下面为torch框架中定义标量并运算的方法
1
2
3
4
5
6import torch
x = torch.tensor(3.0)
y = torch.tensor(2.0)
x + y, x * y, x / y, x**y
向量
- 向量可以被视为标量值组成的列表哦。这些标量值被称为向量的元素或分量。当向量表示数据集中的样本时,它们的值有一定的现实意义。人们通过一维张量表示向量。一般来说,张量可以具有任意擦汗那个读,取决于机器的内存限制。下面定义分量为0-3的一维张量
1
x = torch.arange(4)
- 可使用下标来引用向量的任一元素(分量)。在代码中,我们通过张量的索引来访问任一元素,索引从0开始
1
x[3]
- 单个向量的默认方向为列向量
长度、维度和形状
- 向量的长度通常称为向量的维度(dimension),可通过python内置的
len()
函数来访问张量的长度1
len(x)
- 当用张量表示一个向量(只有一个轴)时,我们可以通过
.shape
属性访问向量的长度。形状是一个元素组,列出了张量沿每个轴的长度(维数)。对于只有一个轴的张量,形状(shape)只有一个元素1
2x.shape
Out: torch.Size([4]) - 维度这个词在不同上下文时往往会有不同的含义。在此明确一下:向量或轴的维度被用来表示向量或轴的长度,即向量或轴的元素数量。张量的维度用来表示张量具有的轴数。因此,张量的某个轴的维数就是这个轴的长度
矩阵
- 向量将标量从零阶推广到一阶,矩阵将向量从一阶推广到二阶。矩阵在代码中表示为具有两个轴的张量。当矩阵具有相同数量的行和列时,其形状将变为正方形,被称为方阵(square matrix)。当调用函数来实例化张量时,我们可以通过指定两个分量m和n来创建一个形状为m * n的矩阵
1
A = torch.arange(20).reshape(5, 4)
- 当我们交换矩阵的行和列时,结果称为矩阵的转置(transpose),下面是在代码中访问矩阵的转置
1
A.T
- 作为方阵的一种特殊形式,对称矩阵(symmetric matrix)等于其转置
- 在表示表格数据集的矩阵中,将每个数据样本作为矩阵中的行向量更为常见
- 沿着张量的最外轴,我们可以访问或遍历小批量的样本数据
张量
- 就像向量是标量的推广,矩阵是向量的推广一样,我们可以构建具有更多轴的数据结构。张量是描述具有任意数量轴的n维数组的通用方法,它们的索引机制与矩阵类似。当我们开始处理图像时,张量将变得更加重要,图像以n维数组的形式出现,其中3个轴对应于高度、宽度,以及一个通道(channel)轴,用于表示颜色通道(红色、绿色和蓝色),以下构建3维张量
1
X = torch.arange(24).reshape(2, 3, 4)
张量算法的基本性质
任何按元素的一元运算都不会改变其操作数的形状。给定具有相同形状的任意两个张量,任何按元素二元运算的结果都将是相同形状的张量
1
2
3A = torch.arange(20, dtype=torch.float32).reshape(5,4)
B = A.clone() #通过分配新内存,将A的一个副本分配给B
A + B两个矩阵的按元素乘法称为Hadamard积(Hadamard product)(数学符号
) 1
A * B
将张量乘以或加上一个标量不会改变张量的形状,其中张量的每个元素都与标量相加或相乘
1
2
3
4
5
6
7
8
9
10a = 2
X = torch.arange(24).reshape(2, 3, 4)
a + X, a * X
### 降维
1. 我们可以对任意张量进行的一个有用的操作是**计算其元素的和**,数学表示法使用$\sum$符号表示求和
向量求和
```python
x = torch.arange(4, dtype=torch.float32)
x, x.sum()表示任意形状张量的元素和
1
A.sum()
默认情况下,调用求和函数会沿所有的轴降低张量的维度,使它变为一个标量。我们还可以指定张量沿哪一个轴来通过求和降低维度。将矩阵沿0轴降维(即将行进行降维)
1
A_sum_axis0 = A.sum(axis=0)
一个与求和相关的量是平均值(mean or average)。我们可以调用函数来计算任意形状张量的平均值
1
A.mean(), A.sum() / A.numel()
同样,计算平均值的函数也可以沿指定轴降低张量的维度
1
2
3
4
5
6A.mean(axis=0), A.sum(axis=0) / A.shape[0]
### 非降维求和
1. 调用函数来**计算总和或均值时保持轴数不变**,被求和的维度长度变为1,但仍保留该维度。
```python
sum_A = A.sum(axis=1, keepdims=True)好处是由于维度得到保留,可以通过广播机制将
A
除以sum_A
沿某个轴计算
A
元素的累积总和,比如axis=0
(按行计算),可以调用cumsum
函数,该函数不会沿任何轴降低输入张量的维度1
A.cumsum(axis=0)
点积
- 点积是相同位置的按元素乘积的和
1
2
3x = torch.arange(4, dtype = torch.float32)
y = torch.ones(4, dtype = torch.float32)
torch.dot(x, y) - 我们可以通过执行按元素乘法,然后进行求和来表示两个向量的点积
1
torch.sum(x * y)
- 点积在很多方面都有用,比如说由点积求加权平均;将两个向量规范化得到单位长度后,点积表示它们夹角的余弦
矩阵-向量积
- 我们将矩阵
用它的行向量表示:
其中每个都是行向量,表示矩阵的第 行。**矩阵向量积 是一个长度为 的列向量,其第 个元素是点积 **。在代码中使用张量表示矩阵-向量积,我们使用 torch.mv(A, x)
函数。A
(矩阵)的列维数(沿轴1的长度)必须与x
(向量)的维度(其长度相同)。
矩阵-矩阵乘法
- 我们可以将矩阵-矩阵乘法**A(n*k)B(k*m)**看作简单地执行m次矩阵-向量积,并将结果拼接在一起,形成一个n * m矩阵
1
2
3A = torch.ones(5, 4)
B = torch.ones(4, 3)
torch.mm(A, B) - 矩阵-矩阵乘法可以简单地称为矩阵乘法,不应与“Hadamard积”混淆
范数
线性代数中最有用的一些运算符是范数(norm)。非正式的讲,向量的范数是表示一个向量有多大。这里考虑的大小概念不涉及维度,而是分量的大小。
在线性代数中,向量范数是将向量映射到标量的函数
。给定任意向量X,向量范数要满足一些属性。 - 第一个性质是:如果我们按常数因子
缩放向量的所有元素,其范数也会按照相同常数因子的绝对值缩放:
- 第二个性质是熟悉的三角不等式:
- 第三个性质简单的说范数必须是非负的,当且仅当向量全由0组成时取等:
- 第一个性质是:如果我们按常数因子
范数是向量元素和的平方根:
$$|\mathbf{x}|2 = \sqrt{\sum{i=1}^n x_i^2}$$
其中,在范数中常常省略下标 ,也就是说 等同于 。
在代码中,我们可以按照如下方式计算向量的范数 1
2u =torch.tensor([3.0, -4.0])
torch.norm(u)深度学习中更经常使用
范数的平方,也会经常遇到 范数,它表示为向量元素的绝对值之和:
$$|\mathbf{x}|1 = \sum{i=1}^n |x_i|.$$
**和范数相比, 范数受异常值的影响较小。为了计算 范数,我们将绝对值函数和按元素求和组合起来 1
torch.abs(u).sum()
范数和 范数都是更一般的 范数的特例: $$|\mathbf{x}|p = \left(\sum{i=1}^n \left|x_i \right|^p \right)^{1/p}.$$
类似于向量的
范数,[矩阵] 的Frobenius范数(Frobenius norm)是矩阵元素平方和的平方根(满足向量范数的所有性质,就像是矩阵形向量的 范数):
$$|\mathbf{X}|F = \sqrt{\sum{i=1}^m \sum_{j=1}^n x_{ij}^2}.$$1
torch.norm(torch.ones((4,9)))
QA
- 为什么深度学习要用张量来表示?
数学决定的,不必纠结 - copy和clone的区别?
copy不一定复制内存,clone一定会复制内存 - 机器学习中的张量和数学中的张量,概念差别?
机器学习的张量其实是一个多维数组,不是数学上的张量的概念。深度学习中大多数的运算都是矩阵运算
- 标题: 动手学深度学习 05
- 作者: 敖炜
- 创建于 : 2023-07-24 14:40:30
- 更新于 : 2024-04-19 09:27:54
- 链接: https://ao-wei.github.io/2023/07/24/动手学深度学习-05/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。