线性代数-标量、向量、矩阵、张量

 

22 人赞同了该文章

本文从标量、向量入手,讲解到矩阵、张量,并讲解了矩阵与张量的运算规则,对于神经网络来说,张量之间更多的是:矩阵相乘 (卷积提取特征)、矩阵内积 (transformer 计算自注意力)

什么是标量 (scalar)?

  • 一个标量表示一个单独的数
      >>> x=torch.tensor([3.0])
      >>> y=torch.tensor([2.0])
      >>> x+y,x*y,x/y,x**y
      (tensor([5.]), tensor([6.]), tensor([1.5000]), tensor([9.]))
    

什么是向量(vector)?

  • 由标量(scalar)组成的列表,标量值称为向量的元素或分量
  • 通常赋予向量粗体的小写变量名称,比如xx。向量中的元素可以通过带脚标的斜体表示。向量𝑋的第一个元素是𝑋1,第二个元素是𝑋2
      >>> x=torch.arange(6)
      >>> x
      tensor([0, 1, 2, 3, 4, 5])
    
      # 使用下标访问
      >>> x[3:]
      tensor([3, 4, 5])
      
      # 获取向量属性
      >>> len(x)
      6
      >>> x.shape
      torch.Size([6])
    

什么是矩阵(matrix)?

  • 向量(vector)将标量(scalar)从零阶推广到一阶,矩阵将向量从一阶推广到二阶
      >>> import torch
      >>> torch.arange(20).reshape(5,4)
      tensor([[ 0,  1,  2,  3],
              [ 4,  5,  6,  7],
              [ 8,  9, 10, 11],
              [12, 13, 14, 15],
              [16, 17, 18, 19]])
    

什么是张量(tensor)?

  • 就像向量(vector)是标量(scalar)的推广,矩阵(matrix)是向量的推广一样,张量指具有任意数量轴的n维数组的通用方法
    >>> import torch
    >>> A=torch.arange(20).reshape(5,4)
    >>> B=A.clone()
    >>> A+B
    tensor([[ 0,  2,  4,  6],
            [ 8, 10, 12, 14],
            [16, 18, 20, 22],
            [24, 26, 28, 30],
            [32, 34, 36, 38]])
    

标量、向量、矩阵、张量之间的关系?

  • 标量(scalar)是0阶张量,向量(vector)是一阶张量,矩阵(matrix)是二阶张量
  • 标量就是知道棍子的长度,但是你不会知道棍子指向哪儿
  • 向量就是不但知道棍子的长度,还知道棍子指向前面还是后面
  • 张量就是不但知道棍子的长度,也知道棍子指向前面还是后面,还能知道这棍子又向上/下和左/右偏转了多少

向量的数乘?

  • 一个数乘以向量中的每个元素

    2×(123)=(246)

向量的内积 (点积、数量积、标量积、dot product)?

  • 又称数量积或标量积,是一种接受两个等长的数字序列(通常是坐标向量)、返回单个数字的代数运算

    (0123)(1111)=0×1+1×1+2×1+3×1=6

      >>> import torch
      >>> x=torch.arange(4,dtype=torch.float)
      >>> y=torch.ones(4,dtype=torch.float32)
      >>> x,y,torch.dot(x,y)
      (tensor([0., 1., 2., 3.]), tensor([1., 1., 1., 1.]), tensor(6.))
      # torch.dot应用非1D张量上会报错
      >>> x,y=torch.arange(6).reshape(3,2),torch.ones(2).reshape(2,1)
      >>> x,y,torch.dot(x,y)
      Traceback (most recent call last):
        File "", line 1, in 
      RuntimeError: 1D tensors expected, but got 2D and 2D tensors
    

向量的外积(叉积、叉乘、向量积)?

  • 与点积不同,它的运算结果是向量,并且两个向量的叉积与这两个向量组成的坐标平面垂直

  • 对于2个向量,𝑎=(𝑥1,𝑦1,𝑧1),𝑏=(𝑥2,𝑦2,𝑧2) ,外积如下,其中𝑖=(1,0,0)j=(0,1,0)k=(0,0,1)

    𝑎×𝑏=|ijk𝑥1𝑦1𝑧1𝑥2𝑦2𝑧2|=(𝑦1𝑧2−𝑦2𝑧1,−(𝑥1𝑧2−𝑥2𝑧1),𝑥1𝑦2−𝑥2𝑦1)

  • 在三维几何中,向量a和向量b的叉乘结果是一个向量,更为熟知的叫法是法向量,该向量垂直于a和b向量构成的平面;如果两个向量方向相同或相反(即它们没有线性无关的分量),亦或任意一个的长度为零,那么它们的外积为零

矩阵的数乘?

  • 用一个数乘以矩阵中的每个元素

    5×[123000]=[51015000]

矩阵和向量相乘?

  • 矩阵和向量相乘表示对矩阵进行遍历求和

      >>> A,x=torch.arange(20,dtype=torch.float32).reshape(5,4),torch.ones(4,dtype=torch.float32)
      >>> A
      tensor([[ 0.,  1.,  2.,  3.],
              [ 4.,  5.,  6.,  7.],
              [ 8.,  9., 10., 11.],
              [12., 13., 14., 15.],
              [16., 17., 18., 19.]])
      >>> x
      tensor([1., 1., 1., 1.])
      >>> A.shape,x.shape,torch.mv(A,x)
      (torch.Size([5, 4]), torch.Size([4]), tensor([ 6., 22., 38., 54., 70.])) 
    

矩阵之间的乘法?

  • 线性代数里面的矩阵乘法,要求第一个矩阵的列数和第二个矩阵的行数相等

    𝐶=𝐴𝐵=(123456)(142536)=(1×1+2×2+3×31×4+2×5+3×64×1+5×2+6×34×4+5×5+6×6)=(14323277)

矩阵之间的哈达玛积(Hadamard product)?

  • 两个相乘的矩阵维度一致,逐元素相乘(矩阵点乘)
      >>> import torch
      >>> 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]])
      >>> B=A.clone()
      >>> A*B
      tensor([[  0,   1,   4,   9],
              [ 16,  25,  36,  49],
              [ 64,  81, 100, 121],
              [144, 169, 196, 225],
              [256, 289, 324, 361]])  
    

矩阵之间的克罗内克积(Kronecker product)?

  • 两个任意大小的矩阵间的运算,被称为直积或张量积

    [1231]⊗[0321]=[1⋅01⋅32⋅02⋅31⋅21⋅12⋅22⋅13⋅03⋅31⋅01⋅33⋅23⋅11⋅21⋅1]=[0306214209036321]

什么是方程组?

  • 形式如下:

    {2𝑥−𝑦=0−4𝑥+2𝑦=0

  • 把方程组中所有系数写到了一个矩阵(matrix)里面,把所有未知数写到第二个框里,把所有等式右边的值写到第三个框里

    [2−1−42][𝑥1𝑥2]=[00]

  • 增广矩阵:将上面内容矩阵形式改为增广矩阵

    [2−10−420]

  • 方程组的等式右边全为0的方程组为齐次线性方程组,否则为非齐次线性方程组

方程组的初等变换?

  • 现有方程组

    {𝑥+2𝑦+𝑧=23𝑥+8𝑦+𝑧=124𝑦+𝑧=2

  • 表示为增广矩阵

    [1212381120412]

  • 消除(2,1)位置的元素,通过 Row 2=Row⁡2+Row⁡1×(−3) ,得

    [13212381120412]→(2,1)[121202−260412]

  • 消除(3,2)位置的元素,通过 Row3 = Row3 + Row 2×(−2) ,得

    [1212024−260412]→(3,2)[121202−26005−10]

  • 消元后的矩阵等式为

    [12102−2005][𝑥𝑦𝑧]=[26−10]

  • 解得, 𝑥=2,𝑦=1,𝑧=−2

什么是范数?

  • 在线性代数中,向量范数是将向量映射到标量的函数f
      >>> u=torch.tensor([3.0,4.0])
      # L1范数
      >>> torch.abs(u).sum()
      tensor(7.)
      # L2范数
      >>> torch.norm(u)
      tensor(5.)
    
  • 一个向量的范数告诉我们一个向量有多大。这里考虑的大小(size)概念不涉及维度,而是分量的大小

向量范数的归纳?

  • 定义一个向量为:𝑎→=[−5,6,8,−10]。任意一组向量设为𝑥→=(𝑥1,𝑥2,…,𝑥𝑁)。其不同范数求解如下

  • 向量的1范数:向量的各个元素的绝对值之和,上述向量𝑎→的1范数结果就是:29

    ‖𝑥→‖1=∑𝑖=1𝑁|𝑥𝑖|

  • 向量的2范数:向量的每个元素的平方和再开平方根,上述𝑎→的2范数结果就是:15

    ‖𝑥→‖2=∑𝑖=1𝑁|𝑥𝑖|2

  • 向量的负无穷范数:向量的所有元素的绝对值中最小的:上述向量𝑎→的负无穷范数结果就是:5

    ‖𝑥→‖−∞=min|𝑥𝑖|

  • 向量的正无穷范数:向量的所有元素的绝对值中最大的:上述向量𝑎→的正无穷范数结果就是:10

    ‖𝑥→‖+∞=max|𝑥𝑖|

  • 向量的p范数

    𝐿𝑝=‖𝑥→‖𝑝=∑𝑖=1𝑁|𝑥𝑖|𝑝𝑝

矩阵的范数归纳?

  • 定义一个矩阵𝐴=[−1,2,−3;4,−6,6]。 任意矩阵定义为:𝐴𝑚×𝑛,其元素为 𝑎𝑖𝑗 , 矩阵的范数定义为

    ‖𝐴‖𝑝:=sup𝑥≠0‖𝐴𝑥‖𝑝‖𝑥‖𝑝

  • 矩阵的1范数(列范数):矩阵的每一列上的元素绝对值先求和,再从中取个最大的,(列和最大),上述矩阵𝐴的1范数先得到[5,8,9],再取最大的最终结果就是:9

    ‖𝐴‖1=max1≤𝑗≤𝑛∑𝑖=1𝑚|𝑎𝑖𝑗|

  • 矩阵的2范数:矩阵𝐴𝑇𝐴的最大特征值开平方根,上述矩阵𝐴的2范数得到的最终结果是:10.0623 , 其中, 𝜆𝑚𝑎𝑥(𝐴𝑇𝐴) 为 𝐴𝑇𝐴 的特征值绝对值的最大值

    ‖𝐴‖2=𝜆𝑚𝑎𝑥(𝐴𝑇𝐴)

  • 矩阵的无穷范数(行范数):矩阵的每一行上的元素绝对值先求和,再从中取个最大的,(行和最大),上述矩阵𝐴的行范数先得到[6;16],再取最大的最终结果就是:16

    ‖𝐴‖∞=max1≤𝑖≤𝑚∑𝑗=1𝑛|𝑎𝑖𝑗|

  • 矩阵的核范数:矩阵的奇异值(将矩阵svd分解)之和,这个范数可以用来低秩表示(因为最小化核范数,相当于最小化矩阵的秩——低秩),上述矩阵A最终结果就是:10.9287

  • 矩阵的L0范数:矩阵的非0元素的个数,通常用它来表示稀疏,L0范数越小0元素越多,也就越稀疏,上述矩阵𝐴最终结果就是:6

  • 矩阵的L1范数:矩阵中的每个元素绝对值之和,它是L0范数的最优凸近似,因此它也可以表示稀疏,上述矩阵𝐴最终结果就是:22

  • 矩阵的F范数:矩阵的各个元素平方之和再开平方根,它通常也叫做矩阵的L2范数,它的优点在于它是一个凸函数,可以求导求解,易于计算,上述矩阵A最终结果就是:10.0995

    ‖𝐴‖𝐹=(∑𝑖=1𝑚∑𝑗=1𝑛|𝑎𝑖𝑗|2)

  • 矩阵的L21范数:矩阵先以每一列为单位,求每一列的F范数(也可认为是向量的2范数),然后再将得到的结果求L1范数(也可认为是向量的1范数),很容易看出它是介于L1和L2之间的一种范数,上述矩阵𝐴最终结果就是:17.1559

  • 矩阵的 p范数

    ‖𝐴‖𝑝=(∑𝑖=1𝑚∑𝑗=1𝑛|𝑎𝑖𝑗|𝑝)𝑝

如何判定矩阵为正定的?

  • 顺序主子式全大于0
  • 存在可逆矩阵𝐶使𝐶𝑇𝐶等于该矩阵
  • 正惯性指数等于𝑛
  • 合同于单位矩阵𝐸(即:规范形为𝐸)
  • 标准形中主对角元素全为正
  • 特征值全为正
  • 是某基的度量矩阵

什么是矩阵的特征值 (eigenvalue)、特征向量 (eigenvectors)?

  • 对于方阵 A,特征向量 𝑣 和特征值 𝜆 使此方程成立
    标量、向量、矩阵、张量-20230408153026-1
  • 举例:以上公式矩阵乘以向量,并得到与将量(只是一个数字)乘以该向量时相同的结果
    标量、向量、矩阵、张量-20230408153027

如何求特征值与特征向量?

  • 标量、向量、矩阵、张量-20230408153027-1
  • (1)从找到特征值开始,已知以下等式一定是正确的$$ A\nu = \lambda \nu $$
  • (2)加入一个恒等矩阵

𝐴𝜈=𝜆𝐼𝜈

  • (3) 如果 𝑣 不为 0,去掉后得到以下式子,在此基础上求解特征值

∣𝐴𝜈−𝜆𝜈∣=0

  • (4)得到特征值后,带入式子 (1)求解特征向量

奇异值与特征值有什么关系?

  • 将一个矩阵𝐴的转置乘以𝐴,并对𝐴𝑇𝐴求特征值,则有下面的形式

    (𝐴𝑇𝐴)𝑉=𝜆𝑉

  • 这里𝑉就是上面的右奇异向量,另外还有

    𝜎𝑖=𝜆𝑖,𝑢𝑖=1𝜎𝑖𝐴𝑉

    这里的𝜎就是奇异值,𝑢就是上面说的左奇异向量,奇异值𝜎跟特征值类似,在矩阵∑中也是从大到小排列,而且𝜎的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了, 也就是说,我们也可以用前 𝑟 ( 𝑟 远小于 𝑚、𝑛)个的奇异值来近似描述矩阵,即部分奇异值分解:

    𝐴𝑚×𝑛≈𝑈𝑚×𝑟∑𝑟×𝑟𝑉𝑟×𝑛𝑇

  • 右边的三个矩阵相乘的结果将会是一个接近于𝐴的矩阵,在这儿,𝑟越接近于𝑛,则相乘的结果越接近于𝐴

本文使用 Zhihu On VSCode 创作并发布

posted on 2025-05-18 21:00  漫思  阅读(79)  评论(0)    收藏  举报

导航