Appearance
线性代数
介绍线性代数中的基本数学对象、算术和运算,并用数学符号和相应的代码实现来表示它们。
1. 基础符号
1.1 标量
∈属于ℝ本书中表示所有(连续)实数标量的空间- 𝑥,𝑦 ∈ {0,1} 𝑥 和𝑦是值只能为0或1的数字。
1.2 向量
- 𝐱 ∈ ℝⁿ 向量 𝐱 由 𝑛 个实值标量组成
- 调用Python的内置len()函数来[访问张量的长度python
import torch x = torch.arange(4) x # tensor([0, 1, 2, 3]) len(x) # 4 - 也可以通过.shape属性访问向量的长度python
x.shape # torch.Size([4])
1.3 矩阵
- 𝐴 ∈ ℝᵐˣⁿ 矩阵 𝐴 由 𝑚 行 𝑛 列的实值标量组成python
A = torch.arange(20).reshape(5, 4) A # tensor([[ 0, 1, 2, 3], # [ 4, 5, 6, 7], # [ 8, 9, 10, 11], # [12, 13, 14, 15], # [16, 17, 18, 19]])
1.3-1 矩阵转置
当我们交换矩阵的行和列时,结果称为矩阵的转置(transpose) 当我们交换矩阵的行和列时,结果称为矩阵的转置(transpose)。 通常用来表示矩阵的转置,如果, 则对于任意和,都有。 因此,在 :eqref:eq_matrix_def中的转置是一个形状为的矩阵:
现在在代码中访问(矩阵的转置)。
python
A.T
# tensor([[ 0, 4, 8, 12, 16],
# [ 1, 5, 9, 13, 17],
# [ 2, 6, 10, 14, 18],
# [ 3, 7, 11, 15, 19]])- 作为方阵的一种特殊类型,[对称矩阵(symmetric matrix)等于其转置:]。
1.4 张量
- 张量 𝐗 ∈ ℝᵐˣⁿˣᵖ 由 𝑚 个 𝑛 行 𝑝 列的矩阵组成python
X = torch.arange(24).reshape(2, 3, 4) X
2. 张量算法的基本性质
标量、向量、矩阵和任意数量轴的张量, 有一些实用的属性。 例如,从按元素操作的定义中可以注意到,任何按元素的一元运算都不会改变其操作数的形状。 同样,给定具有相同形状的任意两个张量,任何按元素二元运算的结果都将是相同形状的张量。 例如,将两个相同形状的矩阵相加,会在这两个矩阵上执行元素加法。
- 将两个相同形状的矩阵
相加,会在这两个矩阵上执行元素加法。形状不变
python
A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
B = A.clone() # 通过分配新内存,将A的一个副本分配给B
A,
# (tensor([[ 0., 1., 2., 3.],
# [ 4., 5., 6., 7.],
# [ 8., 9., 10., 11.],
# [12., 13., 14., 15.],
# [16., 17., 18., 19.]]),
A + B
# tensor([[ 0., 2., 4., 6.],
# [ 8., 10., 12., 14.],
# [16., 18., 20., 22.],
# [24., 26., 28., 30.],
# [32., 34., 36., 38.]])- 两个矩阵的按元素乘法称为Hadamard积(Hadamard product)(数学符号
⊙), 会在这两个矩阵上执行元素乘法。形状不变
3. 降维(求和、平均值)
数学表示法使用 ∑ 符号表示求和
- 长度为 𝑑 的向量中元素的总和
- 矩阵中元素的和可以记为python
A.shape, A.sum() # (torch.Size([5, 4]), tensor(190.))
3.1 按轴求和
给定一个矩阵,我们可以根据指定的轴来求和。 例如,
- 通过求和所有行的元素来降维(轴0),可以在调用函数时指定axis=0, 由于输入矩阵沿0轴降维以生成输出向量,因此输入轴0的维数在输出形状中消失。python
A_sum_axis0 = A.sum(axis=0) A_sum_axis0, A_sum_axis0.shape # (tensor([40., 45., 50., 55.]), torch.Size([4])) - 指定axis=1将通过汇总所有列的元素降维(轴1)。因此,输入轴1的维数在输出形状中消失。python
A_sum_axis1 = A.sum(axis=1) A_sum_axis1, A_sum_axis1.shape # (tensor([ 6., 22., 38., 54., 70.]), torch.Size([5]))
3.2 平均值
- 一个与求和相关的量是平均值(mean或average)python
A.mean(), A.sum() / A.numel() # (tensor(9.5000), tensor(9.5000)) - 计算平均值的函数也可以沿指定轴降低张量的维度。python
A.mean(axis=0), A_sum_axis0 / A.shape[0] # (tensor([ 8., 9., 10., 11.]), tensor([ 8., 9., 10., 11.]))
3.3 非降维求和
有时在调用函数来计算总和或均值时保持轴数不变会很有用。
python
sum_A = A.sum(axis=1, keepdims=True)
sum_A
# tensor([[ 6.],
# [22.],
# [38.],
# [54.],
# [70.]])4. 点积-向量乘法
给定两个向量, 它们的点积(dot product) (或) 是相同位置的按元素乘积的和:。
python
x = torch.arange(4, dtype = torch.float32)
y = torch.ones(4, dtype = torch.float32)
x, y, torch.dot(x, y)
# (tensor([0., 1., 2., 3.]),
y
# tensor([1., 1., 1., 1.]),
torch.dot(x, y) # 点积
# tensor(6.))- 如果 向量x 和 y 长度不一致, 会截取端的向量相乘
5. 矩阵-向量乘法
假设 矩阵 和向量
- 向量 表示矩阵的第行
- 向量 表示的转置, 因此是
行向量 - 用行向量表示矩阵, 其中每个行向量 都是矩阵的第行
所以: 矩阵 * 向量 = 行向量表示矩阵 * 向量
所有有下面的关系:
6. 矩阵-矩阵乘法
理解了 点积和矩阵-向量积的知识后, 那么矩阵-矩阵乘法(matrix-matrix multiplication)应该很简单。
假设有两个矩阵和:
用行向量表示矩阵的第行,并让列向量作为矩阵的第列。要生成矩阵积,最简单的方法是考虑的行向量和的列向量:
当我们简单地将每个元素计算为点积:
[我们可以将矩阵-矩阵乘法看作简单地执行次矩阵-向量积,并将结果拼接在一起,形成一个矩阵]。 在下面的代码中,我们在A和B上执行矩阵乘法。 这里的A是一个5行4列的矩阵,B是一个4行3列的矩阵。 两者相乘后,我们得到了一个5行3列的矩阵。