动手学深度学习 05

敖炜 Lv5

线性代数

坦诚的讲,线性代数的知识已经遗忘了很多,就跟着沐神回顾一下吧

标量

标量

向量


向量

矩阵




矩阵
F范数比较简单,因此通常使用F范数;矩阵范数算起来比较麻烦,一般是不去算的
矩阵
矩阵就是把空间进行扭曲

特殊矩阵


特殊矩阵

线性代数的实现

标量

  1. 标量由只有一个元素的张量表示,下面为torch框架中定义标量并运算的方法
    1
    2
    3
    4
    5
    6
    import torch

    x = torch.tensor(3.0)
    y = torch.tensor(2.0)

    x + y, x * y, x / y, x**y

向量

  1. 向量可以被视为标量值组成的列表哦。这些标量值被称为向量的元素或分量。当向量表示数据集中的样本时,它们的值有一定的现实意义。人们通过一维张量表示向量。一般来说,张量可以具有任意擦汗那个读,取决于机器的内存限制。下面定义分量为0-3的一维张量
    1
    x = torch.arange(4)
  2. 可使用下标来引用向量的任一元素(分量)。在代码中,我们通过张量的索引来访问任一元素,索引从0开始
    1
    x[3]
  3. 单个向量的默认方向为列向量

长度、维度和形状

  1. 向量的长度通常称为向量的维度(dimension),可通过python内置的len()函数来访问张量的长度
    1
    len(x)
  2. 当用张量表示一个向量(只有一个轴)时,我们可以通过.shape属性访问向量的长度。形状是一个元素组,列出了张量沿每个轴的长度(维数)。对于只有一个轴的张量,形状(shape)只有一个元素
    1
    2
    x.shape
    Out: torch.Size([4])
  3. 维度这个词在不同上下文时往往会有不同的含义。在此明确一下:向量的维度被用来表示向量的长度,即向量或轴的元素数量。张量的维度用来表示张量具有的轴数。因此,张量的某个轴的维数就是这个轴的长度

矩阵

  1. 向量将标量从零阶推广到一阶,矩阵将向量从一阶推广到二阶。矩阵在代码中表示为具有两个轴的张量。当矩阵具有相同数量的行和列时,其形状将变为正方形,被称为方阵(square matrix)。当调用函数来实例化张量时,我们可以通过指定两个分量m和n来创建一个形状为m * n的矩阵
    1
    A = torch.arange(20).reshape(5, 4)
  2. 当我们交换矩阵的行和列时,结果称为矩阵的转置(transpose),下面是在代码中访问矩阵的转置
    1
    A.T
  3. 作为方阵的一种特殊形式,对称矩阵(symmetric matrix)等于其转置
  4. 在表示表格数据集的矩阵中,将每个数据样本作为矩阵中的行向量更为常见
  5. 沿着张量的最外轴,我们可以访问或遍历小批量的样本数据

张量

  1. 就像向量是标量的推广,矩阵是向量的推广一样,我们可以构建具有更多轴的数据结构。张量是描述具有任意数量轴的n维数组的通用方法,它们的索引机制与矩阵类似。当我们开始处理图像时,张量将变得更加重要,图像以n维数组的形式出现,其中3个轴对应于高度、宽度,以及一个通道(channel)轴,用于表示颜色通道(红色、绿色和蓝色),以下构建3维张量
    1
    X = torch.arange(24).reshape(2, 3, 4)

张量算法的基本性质

  1. 任何按元素的一元运算都不会改变其操作数的形状。给定具有相同形状的任意两个张量,任何按元素二元运算的结果都将是相同形状的张量

    1
    2
    3
    A = torch.arange(20, dtype=torch.float32).reshape(5,4)
    B = A.clone() #通过分配新内存,将A的一个副本分配给B
    A + B
  2. 两个矩阵的按元素乘法称为Hadamard积(Hadamard product)(数学符号

    1
    A * B
  3. 将张量乘以或加上一个标量不会改变张量的形状,其中张量的每个元素都与标量相加或相乘

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        a = 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()
  4. 默认情况下,调用求和函数会沿所有的轴降低张量的维度,使它变为一个标量。我们还可以指定张量沿哪一个轴来通过求和降低维度。将矩阵沿0轴降维(即将行进行降维)

    1
    A_sum_axis0 = A.sum(axis=0)
  5. 一个与求和相关的量是平均值(mean or average)。我们可以调用函数来计算任意形状张量的平均值

    1
    A.mean(), A.sum() / A.numel()
  6. 同样,计算平均值的函数也可以沿指定轴降低张量的维度

    1
    2
    3
    4
    5
    6
        A.mean(axis=0), A.sum(axis=0) / A.shape[0]

    ### 非降维求和
    1. 调用函数来**计算总和或均值时保持轴数不变**,被求和的维度长度变为1,但仍保留该维度。
    ```python
    sum_A = A.sum(axis=1, keepdims=True)
  7. 好处是由于维度得到保留,可以通过广播机制将A除以sum_A

  8. 沿某个轴计算A元素的累积总和,比如axis=0(按行计算),可以调用cumsum函数,该函数不会沿任何轴降低输入张量的维度

    1
    A.cumsum(axis=0)

点积

  1. 点积是相同位置的按元素乘积的和
    1
    2
    3
    x = torch.arange(4, dtype = torch.float32)
    y = torch.ones(4, dtype = torch.float32)
    torch.dot(x, y)
  2. 我们可以通过执行按元素乘法,然后进行求和来表示两个向量的点积
    1
    torch.sum(x * y)
  3. 点积在很多方面都有用,比如说由点积求加权平均;将两个向量规范化得到单位长度后,点积表示它们夹角的余弦

矩阵-向量积

  1. 我们将矩阵用它的行向量表示:

    其中每个都是行向量,表示矩阵的第行。**矩阵向量积是一个长度为的列向量,其第个元素是点积**。在代码中使用张量表示矩阵-向量积,我们使用torch.mv(A, x)函数。A(矩阵)的列维数(沿轴1的长度)必须与x(向量)的维度(其长度相同)。

矩阵-矩阵乘法

  1. 我们可以将矩阵-矩阵乘法**A(n*k)B(k*m)**看作简单地执行m次矩阵-向量积,并将结果拼接在一起,形成一个n * m矩阵
    1
    2
    3
    A = torch.ones(5, 4)
    B = torch.ones(4, 3)
    torch.mm(A, B)
  2. 矩阵-矩阵乘法可以简单地称为矩阵乘法,不应与“Hadamard积”混淆

范数

  1. 线性代数中最有用的一些运算符是范数(norm)。非正式的讲,向量的范数是表示一个向量有多大。这里考虑的大小概念不涉及维度,而是分量的大小。

  2. 在线性代数中,向量范数是将向量映射到标量的函数。给定任意向量X,向量范数要满足一些属性。

    • 第一个性质是:如果我们按常数因子缩放向量的所有元素,其范数也会按照相同常数因子的绝对值缩放:
    • 第二个性质是熟悉的三角不等式:
    • 第三个性质简单的说范数必须是非负的,当且仅当向量全由0组成时取等:
  3. 范数是向量元素和的平方根:
    $$|\mathbf{x}|2 = \sqrt{\sum{i=1}^n x_i^2}$$
    其中,在范数中常常省略下标,也就是说等同于
    在代码中,我们可以按照如下方式计算向量的范数

    1
    2
    u =torch.tensor([3.0, -4.0])
    torch.norm(u)
  4. 深度学习中更经常使用范数的平方,也会经常遇到范数,它表示为向量元素的绝对值之和:
    $$|\mathbf{x}|1 = \sum{i=1}^n |x_i|.$$
    **和范数相比,范数受异常值的影响较小。为了计算范数,我们将绝对值函数和按元素求和组合起来

    1
    torch.abs(u).sum()
  5. 范数和范数都是更一般的范数的特例:

    $$|\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

  1. 为什么深度学习要用张量来表示?
    数学决定的,不必纠结
  2. copy和clone的区别?
    copy不一定复制内存,clone一定会复制内存
  3. 机器学习中的张量和数学中的张量,概念差别?
    机器学习的张量其实是一个多维数组,不是数学上的张量的概念。深度学习中大多数的运算都是矩阵运算
  • 标题: 动手学深度学习 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 进行许可。
评论