Skip to content

线性代数

介绍线性代数中的基本数学对象、算术和运算,并用数学符号和相应的代码实现来表示它们。

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)应该很简单。

假设有两个矩阵

用行向量表示矩阵的第行,并让列向量作为矩阵的第列。要生成矩阵积,最简单的方法是考虑的行向量和的列向量:

当我们简单地将每个元素计算为点积:

[我们可以将矩阵-矩阵乘法看作简单地执行次矩阵-向量积,并将结果拼接在一起,形成一个矩阵]。 在下面的代码中,我们在AB上执行矩阵乘法。 这里的A是一个5行4列的矩阵,B是一个4行3列的矩阵。 两者相乘后,我们得到了一个5行3列的矩阵。

京ICP备2024093538号-1