向量空间
为了定义向量空间,首先需要定义向量的加法和标量乘法运算:
将集合 V 上的加法定义为一个函数,要求对于 u,v ∈ V,需要满足 u + v ∈ V,这个性质也称为这个集合对于加法封闭 closed under addition
将集合 V 上的标量乘法定义为一个函数,要求对于任意 λ ∈ F, v ∈ V,需要满足 λv ∈ V,这个性质也称为这个集合对于标量乘法封闭 closed under scalar multiplication
向量空间 Vector Space 本质上是一个定义了上述加法和标量乘法的向量的集合,且进一步要求向量空间中的加法和标量乘法运算符合如下性质:
加法的交换性 commutativity:对所有 u,v ∈ V,满足 u + v = v + u
加法和标量乘法的结合性 associativity:对所有 u,v,w ∈ V 和 a,b ∈ F,满足 (u + v) + w = u + (v + w) 和 (ab)v = a(bv)
唯一加法单位元 additive identity:即存在元素 0 ∈ V 使得对于所有 v ∈ V,满足 0 + v = v,且这个 0 是唯一的
唯一的加法逆元 additive inverse:对每个 v ∈ V 都存在 w,使得 v + w = 0,且 w 是唯一的
乘法单位元 multiplicative identity:对所有 v ∈ V 都有 1v = v
分配性质 distributive properties:对所有 a,b ∈ F 和 u,v ∈ V,满足 a(u + v) = au + av 和 (a+b)v = av + bv,这一性质将加法和标量乘法联系在一起
由于上述向量空间的标量乘法依赖于 F,因此为了清楚展示二者之间的关系,我们会说 V 是 F 上的向量空间,更具体地,Rn 是 R 上的向量空间,Cn 是 C 上的向量空间。
前面这些性质的定义是为了满足数学严谨性和证明的需要,为了便于直观的理解这些定义的必要性,举例说明如下:
针对加法的定义:最基本的我们需要这个运算不会对增加向量的维度,即加法运算后的向量应该仍属于这个空间,更具体地,两个 3 维向量相加的结果可以是 2 维向量,但不能是 4 维向量
加法的交换性、加法和标量乘法的结合性:这在线性变换中可以保证这两个运算的结果不受运算顺序的影响,更具体地,在通过对行或列做初等变换求矩阵的秩的时候,不同的操作者采用不同的操作顺序,在计算正确的前提下结果是一致的
线性组合 linear combination 和张成空间 span
对于一个向量组中的向量分别施加标量乘法后再做加法运算的结果就是这个向量组的线性组合,更加正式的定义为——向量组 v1 , ... , vm 的线性组合是构建于如下计算形式的一个向量:a1v1 + ... + amvm,其中 a1 , ... , am ∈ F。例如 (17, -4, 2) = 6(2, 1, -3) + 5(1, -2, 4),因此 (17, -4, 2) 是 (2, 1, -3) 和 (1, -2, 4) 的一个线性组合。如果一个向量可以由另一个向量组的线性组合来构建,则称这个向量可以由这个向量组线性表示。
相应地,一个向量组 v1 , ... , vm 的所有可能的线性组合 a1v1 + ... + amvm 得到的向量的全体构成的空间称为这个向量组张成的空间 span,记为 span(v1 , ... , vm),对应前面的例子:(17, -4, 2) ∈ span((2, 1, -3), (1, -2, 4))。
作为一个非英语国家的学生,在学习的时候可能会遇到很多由于翻译西方著作而来的概念而非常让人费解,如果去查看对应的英文书籍,对应的单词很可能更容易让人理解。例如上面提到的 span 这个词,最初学习的时候书上翻译为“张成的空间”,就非常难以理解,后来查看原版书籍才恍然大悟。对应 span 的一个更为具体的例子是机械手的各个关节的转动和移动最终使得执行机构的工作空间在某个范围内,对应这个范围就是 span。
内积空间
内积空间就是在加法和数乘的基础上定义了内积的向量空间。
数学对象及表示
线性代数中主要用到的数学对象及在 Deep Learning 这本书中的符号表示如下:
标量 Scalar:一个数字,通常为实数,用斜体小写字母表示 s
向量 Vector:一组数字,可以是行向量,但默认是列向量,用黑体小写字母表示 x,其中向量的第 i 个元素用 xi 表示,在 Numpy 中的表示形式是 1 维数组,在 Pandas 中对应一个 Series
矩阵 Matrix:一个包括行和列的二维数字表,用黑斜体大写字母表示 A,对于 m 行 n 列的矩阵用 Amxn 来表示,在 Numpy 中的表示形式是 2 维数组,在 Pandas 中对应一个无嵌套索引的 DataFrame
张量 Tensor:这是一个相对较新的概念,可以理解为多张并列的表,或者一个矩形的数据箱,用黑体字母 A 来表示,相应的在 Numpy 中的表示形式是 2 维以上的数组,在 Pandas 中对应一个嵌套索引的 DataFrame
注意这里每一个低序号的数学对象都可以理解为后面高序号数学对象的一个特殊实例,例如标量可以理解为 1 维向量,也可以理解为一个 1 x 1 的矩阵,还可以理解为一个 0 维张量。推而广之,向量是 1 维张量,矩阵是 2 维张量,一个卷积神经网络中的 3 层过滤器则可以理解为 3 维张量。
矩阵和向量的运算
向量的点乘 dot product
对于 Rn 中的向量 x,y,定义运算 x · y = x1y1 + ... + xnyn 为向量 x 与向量 y 的点乘,其结果是一个标量。
点乘按相应位置元素乘积再相加的运算形式是被定义规定好的,这个定义的一个重要意义就是它可以与范数完美的结合起来,即: x · y = ||x||2||y||2cosθ,其中 θ 在二维空间中可以直观的理解为两个向量的夹角,而当 x = y 时,点乘的结果就是 L2 范数的平方。
当 x,y 都是列向量时,x · y = xTy,这个运算是矩阵和向量相乘的基石。
矩阵和向量相加
在线性代数中,两个矩阵能够加减运算则二者必须是同型的,即行和列都相等。在深度学习中,如果使用过 Numpy 这个库的人可以知道矩阵是可以和标量、向量相加的:
当矩阵和标量相加时,会将标量加到矩阵的每一个元素中
当矩阵和向量相加时,则是将向量加到矩阵的每一行,即 Ci,j = Ai,j + bj,这里隐含要求向量的维数等于矩阵的列数,这样定义的原因目前我还没找到
矩阵和向量乘法
矩阵和向量的乘法就是对向量施加线性变换,在线性代数中如果已知 A,b,且 A 可逆,则 Ax = b 的求解可以通过 x = A-1b 来进行,但在实际运算中 A-1 由于在计算机中只能由有限精度的数字表示,所以一般不采用这种方法,而是利用 b 的值。
Ax = b 按照元素展开得到一个非齐次线性方程组,其求解时还可以对增广矩阵进行高斯消元,并比较增广矩阵和参数矩阵的秩的情况:
- 如果 r(A) < r(A, b) :方程组无解
- 如果 r(A) = r(A, b) = n:方程组有唯一解
- 如果 r(A) = r(A, b) < n:方程组有无穷多个解
当 b = 0 时,方程组称为齐次线性方程组,其必有 0 解,其有非 0 解的充分必要条件是 r(A) < n。
范数
向量的 Lp 范数的定义为:Lp = ||x||p = (Σ|xi| p)1/p,其中 p 为 ≥ 1 的实数,可以直观的将范数理解为向量距离原点的距离,或者说长度。当 p = 2 时,也称为欧几里德范数。
在机器学习中,L2 范数的平方使用最为广泛,其中的一个优点是其对于各项的偏导数是相应项的函数 2xi ,而 L2 范数本身对各项的偏导数则是所有项的函数,最典型的 L2 范数应用场合是当模型出现过拟合时的 L2 正则化。但当向量距离原点较近,其各项均取很小的值时,L2 范数的平方增长很慢,此时如果算法对于结果是否取 0 值还是接近 0 的很小值有要求的时候,一般用 L1 范数代替。
另一个较为重要的范数是 max 范数: L∞ = ||x||∞ = max|xi|,表示向量中取最大值的元素的绝对值。
几个特殊的矩阵
对角矩阵 Diagonal matrix
标准的对角矩阵的定义要求其一个方阵,且除了对角线上的元素外,其他元素均为 0,用 diag(v) 来表示用向量 v 中的元素作为对角线元素的对角阵。将矩阵通过初等变换转换成对角阵后为计算提供了很多的便利:
矩阵和向量的乘法相当于对于向量 x 各个位置的元素 xi 乘以 v 的相应位置的元素 vi
可以直观的看出矩阵是否可逆
实际应用中的对角阵并不总是方阵,而如果能通过初等变换将矩阵的某一子块转化成对角阵,也能够为计算提供很多便利,对于一个非方阵的对角阵 D,D⋅x 的结果处理如下:
当 D 的行数超过列数时,可以在结果的末尾添加相应行的 0
当 D 的列数超过行数的时候,可以考虑将结果的末尾几个数字忽略
对阵矩阵 Symmetric matrix
对称矩阵 A = AT,实际使用中一般有某些特定功能的函数来生成,如当 A 的各个位置的元素是相应位置的两个点之间的距离,此时其就是一个对称矩阵。
正交矩阵 Orthogonal matrix
两个非 0 向量正交的定义是 xTy = 0,当一个矩阵 A 当中的向量彼此两两正交,此时 ATA 的结果是一个对角阵。进一步地,如果这个对角阵对角线上的元素都为 1 ,也即这些向量的范数都是 1 的时候,这个矩阵进一步被称为正交矩阵,此时 ATA = AAT = I,也即对于正交阵来说,AT = A-1。这里需要注意正交矩阵不仅要求其中的向量彼此正交,还要求各个向量的范数均为 1,这点很容易被忽略,对于向量彼此正交但各个向量范数不是 1 的矩阵没有专门称谓。
矩阵分解 Decomposition
我们之所以讨论矩阵的分解,是因为很多数学对象在按照一定的方式分解成相应的组成部分后会更加容易理解,很多性质也可以一目了然的得以呈现,例如将整数分解为质数相乘:对于 12 = 2 x 2 x 3,我们可以直观的知道 12 能够被 3 整除而不能被 5 整除。同样地,矩阵也可以通过一定的方式进行分解,使得我们可以透过向量组这种表示方式来看到一些更重要的特性。一个比较常用的矩阵分解的方式是将其分解为一系列本征向量和本征值构成的矩阵的方式,称为本征值分解。
相似矩阵
在讨论本征值分解之前我们先理解一下相似矩阵,以及矩阵相似的意义。
在线性代数中,我们看到的任何矩阵中的数值都是对应在某一个基 basis 下的坐标,大多数情况下我们看到矩阵其默认的基都是主对角线元素都是 1 其他位置元素都为 0 的自然基,这个矩阵在英文中也被称作单位矩阵 Identity matrix,也可以理解为它是对于一类以其为基的矩阵的“身份”的确认标准。
import numpy as np
In [2]:
np.identity(4)
Out[2]:
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])
对于同一个向量来说,其在不同基下的坐标是不同的,这就是我们想要讨论基的置换的原因。如果我们通过左乘一个矩阵对这个向量施加一个线性变换,那么对应同一个线性变换,例如完成同样角度的旋转,或相同比例和方向的拉伸,来自不同基下的矩阵的坐标表示形式也是不同的,有些表示形式异常简单,有些表示形式则异常复杂,这两个对应同一个线性变换的不同基下的矩阵之间的关系就是线性代数语境中的“相似"。
例如对于 [ -1, 2 ]T 这个列向量来说,其在自然基下的线性组合系数就是向量坐标本身 [ -1, 2 ]T = -1 x [ 1, 0 ]T + 2 x [ 0, 1 ]T,如果我们通过施加线性变换线性变换将前面自然基的两个列向量变换成了 [ 1, -2 ]T 和 [ 3, 0 ]T 构成一个新的基,注意这里施加线性变换的矩阵就是新基的两个列向量构成的矩阵,这两个列向量既是基变换的原因,又是基变换的结果,并且新的基的基还是自然基。此时,在这个新的基下 [ -1, 2 ]T 的坐标将变成 [ 5, 2 ]T,但由于做的是同一个线性变换,所以线性组合系数并未发生改变,即 [ 5, 2 ]T = -1 x [ 1, -2 ]T + 2 x [ 3, 0 ]T,这里有些绕,但请仔细体会。
在线性代数中所见到的相似矩阵的定义:P-1AP = B ,这其中默认隐含 A 与 B 的坐标是基于标准基的。式中 P 对应的英文单词是 Permutation,翻译为”置换“,实际上 P 就是对于不同基进行切换的置换矩阵,并且实现基的置换的方法就是通过 P 左乘想要置换基的矩阵和向量即可,这实际是矩阵左乘实现线性变换的一个特殊实例。
对上式左乘一个 P,即 AP = PB,此时,这个公式中又暗含一个秘而不宣的“易证”:矩阵 A 和矩阵 P 的基都是自然基底 E,相应的,PB 这个矩阵当中的数值表示也是基于自然基定下来的。如果采用 PB 这个矩阵对任何向量 x 进行一个线性变换,变换后的向量的坐标也是基于自然基确定的。
上文中如果 B 是对角阵这个简单的形式,我们就说矩阵 A 可以相似对角化,而讨论相似对角化的目的是通过 B 矩阵这个简洁的形式来完成和观察同样的变换操作。
本征值分解 Eigendecomposition
这里需要稍作扩展的是,通过矩阵施加线性变换的结果不外乎三种形式:
通过正交矩阵施加旋转
通过对角矩阵施加拉伸
通过非方矩阵施加投影
对于有一类方阵来说,其对于某些向量的线性变换相当于对这个向量左乘一个标量来对向量进行一个缩放而不产生平移或旋转,这个矩阵和向量的关系就是向量称为矩阵的本征向量。相应的把这个矩阵分解成由特征向量构成的正交阵和一个由标量构成的对角阵的乘积的形式称为本征分解,相关说明如下:
本征向量和本征值:对于一个 n x n 方阵 A 来说,如果存在一个非 0 向量 v 使得 Av = λv,其中 λ 为一个标量,此时称 v 为 A 的一个本征向量,而 λ 为对应这个本征向量 v 的本征值
直观的理解矩阵和本征向量的关系就是通过矩阵施加线性变换后会将本征向量所在的空间在特定的方向上进行缩放
如果 v 是方阵 A 的本征向量,则对它乘以任意一个标量,其结果也是 A 的本征向量,因此在取得本征向量后会将其缩放为范数为 1 的向量
如果 A 有 n 个线性无关的本征向量和相应的 n 个本征值,则可以将这 n 个本征向量组成一个新的矩阵 V = [v(1), ... , v(n)],再将这 n 个本征值构成一个对角阵 diag(λ),此时可以通过计算得知,A = Vdiag(λ)V -1,即将 A 分解为三个由其本征向量和本征值构成的矩阵的乘积
本征分解不总是存在的,也有时本征值是一个复数而非实数
特别地,实对称矩阵的本征值都是实数,且都可以通过本征分解展开成 A = QΛQT= QΛQ-1,其中 Q 为正交矩阵,Λ 为本征值构成的对角阵
由于不同的本征向量本征值可以是相同的,此时这些本征向量的线性组合也是对应这个矩阵的本征向量,因此只有在本征值都不同的情况下本征分解才是唯一的
本征值都是正数的矩阵称为正定矩阵,这个矩阵的一个特点是对于任意向量 x,xTAx 的结果永远是正数
根据相似矩阵的定义有 P-1AP = B ,对比相似矩阵和本征分解的公式的关系可以知道本征分解中的原矩阵与分解后的对角阵是相似的关系
矩阵的本征分解的意义就在于使得我们可以清楚的看出线性变换的形变主要发生在哪个方向上,根据特征值和特征向量的定义 Ax = λx,其最为关键的变化在于在特征向量的方向上进行一个本征值大小的缩放,这也就是我们称之为“本征”的意义。
上面这一部分是书中内容的一个总结,后续我可能会继续添加一些其他关于本征分解的内容。如果当时上学的时候的教材里对这一部分是这样介绍的,那么线性代数学习起来就不会这么的抽象和枯燥。
奇异值分解 Singular value decomposition
由于本征分解只能对正方形的矩阵进行操作,因此应用的场合比较有限,奇异值分解则提供了矩阵分解的另一种方法,且任何矩阵都可以进行奇异值分解。其分解形式为:
A = UDV -1,假设 A 是一个 m x n 的矩阵,则分解后 U 为一个 m x m 的正交矩阵,D 为 m x n 的对角矩阵,V 则为一个 n x n 的正交矩阵
对角矩阵 D 对角线上的元素称为 A的奇异值,U 的列向量称为左奇异向量,V 的列向量称为右奇异向量
奇异值分解和本征分解的关系为:矩阵 A 的左奇异向量是 AAT 的本征向量,右奇异向量是 ATA 的本征向量
参考阅读
关于相似矩阵的更精彩和直观的解释请见马同学高等数学,作者讲解的比我清楚 100 倍。之所以做这个笔记是因为即便读了再多遍,没有内化的知识也是浅薄的,我希望可以通过笔记的方式记录并真正的消化这些知识。在这里强烈推荐这个公众号,这可能是国内最好的关于数学的公众号,并且绝对原创。我承认这是一个广告,但是是出于个人喜好的无利益支持。
另外这个笔记里也参考了 Linear Algebra Done Right 这本书。