![深度学习架构与实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/321/46055321/b_46055321.jpg)
第2章 深度学习相关数学基础
2.1 线性代数
线性代数广泛应用于科学和工程中。掌握好线性代数对于理解和从事机器学习算法的相关工作是很有必要的。
2.1.1 标量、向量、矩阵和张量
学习线性代数,会涉及以下几个数学概念:
· 标量(Scalars):标量是一个数,它是只具有数值大小,而没有方向的数,它与线性代数中研究的其他大部分对象(通常是多个数的数组)有所不同。标量通常用斜体和小写的变量名称来表示。标量分为实数标量和自然标量,在定义标量时,我们会说明它们是哪种类型的数。比如,在定义实数标量时,我们可能会说“令s∈R表示一天的温度变化”;在定义自然数标量时,我们可能会说“令n∈N表示温度低于10℃的天数”。
· 向量(Vectors):一个向量就是一列具有一定顺序的数,并且向量是有方向的。通过一定的顺序进行索引,我们可以确定每个向量中的元素。向量通常用小写黑体来表示。如果我们需要表示向量中确切的元素,可以将元素排列成一个方括号包围的纵列:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/26_01.jpg?sign=1739552651-mdyJDvSFus7abnhEc2e90BFdrvD59xxL-0-8263b733b865b63db675cb6d7610c294)
为了方便大家更好地理解,向量可以被看作空间中的点,其中的每一个元素表示不同的坐标轴上的坐标值。
· 矩阵(Matrices):矩阵是一个二维数组,其中两个索引就可以确定一个元素。我们通常用大写的黑体字母来表示矩阵的变量名称,比如A∈Rm×n。其中,m为这个实数矩阵的水平坐标,n为实数矩阵的垂直坐标。我们在表示矩阵中的元素时,元素名称通常以斜体形式表示,索引用逗号间隔。比如,A1,1表示矩阵A第1行、第1列的元素,Am,n表示矩阵A第m行、第n列的元素。通常我们用“:”表示水平坐标,以表示垂直坐标中的所有元素。比如Ai,:表示A中垂直坐标i上的一横排元素,这也被称为A的第i行。当需要明确表示矩阵中的元素时,我们用如下方括号括起来表示:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/27_01.jpg?sign=1739552651-iT2KUXZqodAuWfDuJEgVkGM2FyL5TNpD-0-4072b76d9a34b7b9228ae389cb0abe43)
· 张量(Tensors):某些情况下,当我们讨论坐标超过二维的数组时,我们就需要用到张量。张量即一个数组中的元素分布在若干维坐标的规则网络中。几何代数中定义的张量是基于向量和矩阵的推广,通俗一点理解的话,就是我们可以将标量视为零阶张量,向量视为一阶张量,矩阵就是二阶张量。
转置是矩阵的重要操作之一。矩阵的主对角线是从左上角到右下角的对角线,而矩阵的转置则是以主对角线为轴的镜像。我们用AT来表示A的转置,定义为
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/27_02.jpg?sign=1739552651-pL27VWhX3IsLLYfzLjGQfZmnwET0D18B-0-b890b468dc0547ab1c1b477f5bc3e149)
2.1.2 矩阵和向量相乘
· 矩阵乘法是矩阵运算中最重要的操作之一。矩阵乘法即两个矩阵A和B相乘得到第三个矩阵C。对此,我们要求矩阵A的列数必须和矩阵B的行数相等,这也是两个矩阵可以相乘的前提条件。矩阵乘法是将A的行乘以B的列作为C的元素,这个就需要和两个矩阵的对应元素相乘区别开来,不过,对应元素相乘的矩阵操作确实是存在的,这个称为元素对应乘积或者Hadamard乘积。
· 两个相同维数的向量x和y的点积可看作矩阵乘积xTy。我们可以把矩阵乘积C=AB中计算Ci,j的步骤看作A的第i行和B的第j列之间的点积。
· 矩阵乘积运算有许多有用的性质,从而使矩阵的数学分析以及计算方面更加方便。
· 矩阵乘法的分配律:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/27_03.jpg?sign=1739552651-7tZKMZBpOgqPa52ZXAdHeTWkpwG2bwMD-0-7f2b29788c6e31be18a6a1669580a4c9)
· 矩阵乘法的结合律:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/27_04.jpg?sign=1739552651-MzgVtAWyTeCqsRFExx4UDWcixPIW9kYY-0-8b6eb6b2ba58c28f76dac4b2482a666c)
· 不同于标量乘积,矩阵乘法不满足交换律(AB=BA的情况并非总是满足)。然而,两个向量的点积满足交换律:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/27_05.jpg?sign=1739552651-Qmr50wt8Km9rro1FUjnpklgQ7YEth0R0-0-b42bd7bee4759ddce1a98869eae02272)
· 矩阵乘法的转置的性质:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/27_06.jpg?sign=1739552651-8iVdPKsjTZ7XXooAt7p7d6kPsZnhR0OF-0-c5636629008b96932924e3ee9e9f5b36)
· 利用两个向量点积的结果是标量以及标量转置是自身的事实,我们可以证明式(2.6)
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/28_01.jpg?sign=1739552651-gBJXP7aXrVkmpGdNTrq6hB04LMRGsJoy-0-571779deff07470875754c4a9fb69a1c)
2.1.3 单位矩阵和逆矩阵
· 单位矩阵定义为所有沿主对角线的元素都是1,而其他位置的所有元素都是0,如图2-1所示。
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/28_02.jpg?sign=1739552651-uKvxXqLQMguNXhLRnu3RlBUnPrmYEEYk-0-c8d48a004dc5263ee5f4be3b0c405049)
图2-1 单位矩阵
· 任意向量和单位矩阵相乘之后还是原向量。我们将保持n维向量不变的单位矩阵记作In。
· 线性代数提供了称为矩阵逆的强大工具。对于大多数矩阵方程,我们都能通过矩阵的逆来进行求解,如:Ax=b。
· 矩阵A的逆矩阵记作A-1,它们满足如下条件:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/28_03.jpg?sign=1739552651-xMRveYAp2NzZPyUNxmvQkj2XAJDYGO1s-0-77319f433c0a1c279ed910684fc55cd1)
· 为了求解Ax=b,我们总结了以下步骤:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/28_04.jpg?sign=1739552651-ngjPHAALJYRyj6H5jEAXhQaSVzDCZurA-0-9f5df162b9dd66b31682a3cb611d8062)
· 由此可以看出,我们的重点在于找到一个逆矩阵A-1。当逆矩阵A-1存在时,有几种不同的算法都能找到它的闭解形式。理论上,相同的逆矩阵可用于多次求解不同向量b的方程。然而,逆矩阵A-1主要是作为理论工具使用的,并不会在大多数软件应用程序中实际使用。这是因为逆矩阵A-1在数字计算机中只能表现出有限的精度,有效使用向量b的算法通常可以得到更精确的x。
2.1.4 线性相关和生成子空间
·Ax=b的解有三种情况,可能恰好存在一个解,可能有无数个解,也可能无解。但不会存在多于一个解但是少于无限个解的情况,因为如果x和y都是某方程组的解,则
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/28_05.jpg?sign=1739552651-nPZnK1H1SFXf2Tvp4kXN7uXhRJWQG2Xy-0-0d20276dd1f68cf9a8d81e4435ab49e3)
(其中α取任意实数)也是该方程组的解。
· 分析方程有多少个解,方便理解的情况下我们可以将A的列向量看作是从原点(origin)(元素都是零的向量)出发的不同方向,来确定有多少种方法可以到达向量b。那么在这个观点下,向量x中的每个元素表示我们应该沿着这些方向走多远,即xi表示我们需要沿着第i个向量的方向走多远:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/29_01.jpg?sign=1739552651-tCagjvhockmNhevI5Fifukojgmtk599l-0-509f313a4bd733ab51ef30e8294d6e45)
·Ax=b一般而言,这种操作被称为线性组合(Linear Combination)。从形式上,一组向量的线性组合,是指每个向量乘以对应标量系数并相加求和,即
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/29_02.jpg?sign=1739552651-ywQ2QBzp5KkOA8zjtzxf3nMyK2z0cBdD-0-5d823df76105b6cab6a902261114cc31)
确定Ax=b是否有解相当于确定向量b是否在A列向量的生成子空间中。这个特殊的生成子空间被称为A的列空间(Column Space)或者A的值域(Range)。
为了使方程Ax=b对于任意向量b∈Rm都存在解,我们要求A的列空间构成整个Rm。如果Rm中的某个点不在A的列空间中,那么该点对应的b会使得该方程没有解。矩阵A的列空间是整个Rm的要求,意味着A至少有m列,即n≥m。否则,A的列空间的维数会小于m。例如,假设A是一个3×2的矩阵。目标b是三维的,但是x只有二维。所以无论如何修改x的值,也只能描绘出R3空间中的二维平面,当且仅当向量b在该二维平面中时,该方程有解。
不等式n≥m仅是方程对每一点都有解的必要条件。这不是一个充分条件,因为有些列向量可能是冗余的。假设有一个R2×2中的矩阵,它的两个列向量是相同的。那么它的列空间和它的一个列向量作为矩阵的列空间是一样的。换言之,虽然该矩阵有2列,但是它的列空间仍然只是一条线,不能涵盖整个R2空间。
正式地说,这种冗余被称为线性相关(Linear Dependence)。如果一组向量中的任意一个向量都不能表示成其他向量的线性组合,那么这组向量被称为线性无关(Linearly Independent)。如果某个向量是一组向量中某些向量的线性组合,那么我们将这个向量加入这组向量后不会增加这组向量的生成子空间。这意味着,如果一个矩阵的列空间涵盖整个Rm,那么该矩阵必须包含至少一组m个线性无关的向量。这是式Ax=b对于每一个向量b的取值都有解的充分必要条件。值得注意的是,这个条件是说该向量恰好有m个线性无关的列向量,而不是至少m个。不存在一个m维向量的集合具有多于m个彼此线性不相关的列向量,但是一个有多于m列向量的矩阵却有可能拥有不止一个大小为m的线性无关向量集。
要想使矩阵可逆,我们还需要保证式Ax=b对于每一个b值至多有一个解。为此,我们需要确保该矩阵至多有m个列向量。否则,该方程会有不止一个解。
综上所述,这意味着该矩阵必须是一个方阵(Square),即m=n,并且所有列向量都是线性无关的。一个列向量线性相关的方阵被称为奇异的(Singular)。
如果矩阵A不是一个方阵或者不是一个奇异的方阵,该方程仍然可能有解。但是我们不能使用矩阵逆去求解。
目前,我们已经讨论了逆矩阵左乘。我们也可以定义逆矩阵右乘:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/30_01.jpg?sign=1739552651-SIZhpIFj3heEW1v9RWxW4R3bvTqISqti-0-b9bc6eeb9404b1dc0b1f293429f2b641)
对于方阵而言,它的左逆和右逆是相等的。
2.1.5 范数
在机器学习中,当我们需要衡量一个向量的大小时,我们经常会使用到范数。范数(包括LP范数)是将向量映射到非负值的函数。方便理解地来说,向量x的范数就是从原点到点x的距离。更严格地说,范数是满足下列性质的任意函数:
· f(x)=0→x=0
· f(x+y)≤f(x)+f(y)(三角不等式)
∀α∈R,f(αx)=|α|f(x)形式上,LP范数定义如下:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/30_02.jpg?sign=1739552651-nzmAlOjfNXolJxXzCMIKGAS7GXeDz0dF-0-7c684cdc63791bb53e480640eee7da63)
式中,p∈R,p≥1。
当P=0时,也就是L0范数,由上面的性质可知,L0范数并不是一个真正的范数,它主要被用来度量向量中非零元素的个数。而向量的非零元素的数目不是范数,所以当我们对向量缩放α倍,并不会改变该向量非零元素的数目。因此,L1范数经常作为表示非零元素数目的替代函数。L1范数定义如下:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/30_03.jpg?sign=1739552651-HGk3d4W2vyRpDRmYQ6sRGDGKlXNVOkRk-0-543dd57ee2c1b1bb483705766a1d2979)
当P=2时,即L2范数称为欧几里得范数,经常简化表示为||x||,略去了角标2,代表原点出发到向量x确定的点的欧几里得距离。L2范数在机器学习中出现得非常频繁。平方L2范数也经常用来衡量向量的大小,它的计算方式可以简单地通过点积xTx计算出来。
平方L2范数在数学和计算上都比L2范数本身更方便。例如,平方L2范数对x中每个元素的导数只取决于对应的元素,而L2范数对每个元素的导数和整个向量相关。但是在某些机器学习应用中,当区分恰好是零的元素和非零但值很小的元素的时候,平方L2范数就不受欢迎,因为它在原点附近增长得十分缓慢。在这些情况下,我们就会考虑使用在各个位置斜率相同,同时保持简单的数学形式的函数如L1范数,来解决这个问题。每当x中某个元素从零增加ϵ,对应的L1范数也会增加ϵ。
在机器学习中,还会经常出现另外的范数:L∞范数,也被称为最大范数(Max Norm)。这个范数表示向量中具有最大幅值的元素的绝对值:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/30_04.jpg?sign=1739552651-Nz2QcCwXvk1qTfMyYk1Y896CaKbZoNrI-0-62f9a55ee8055329bac7043cc26b156b)
在深度学习中,对于衡量矩阵的大小,我们常使用Frobenius范数,即
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/31_01.jpg?sign=1739552651-v8xgrQTFnnNkM7LjEc8jVthAbxgHrcfm-0-545d9c7fe24420fff17a4e2051344cbb)
类似于向量的L2范数。
2.1.6 特殊类型的矩阵和向量
对角矩阵的定义是只在主对角线上含有非零元素,其他位置都是零。从形式上来说,矩阵D是对角矩阵,当且仅当对于所有的i≠j,Di,j≠0。前面我们已经提到过一个对角矩阵,即单位矩阵,其对角元素全部是1,其余元素都为0。我们用diag(v)表示一个对角方阵,其对角元素由向量v中的元素给定。对角矩阵与其他矩阵相比最大的优点在于对角矩阵的乘法计算很高效。比如计算乘法diag(v)x,我们只需要将x中的每个元素xi放大vi倍。换一种说法就是,diag(v)x=v⊙x。对角方阵的逆矩阵存在,当且仅当对角元素都是非零值,在这种情况下,diag(v)-1=diag([1/v1,…,1/vn]T)。在很多情况下,我们可以根据任意矩阵导出一些通用的机器学习算法,但通过将一些矩阵限制为对角矩阵,我们可以得到计算代价较低的算法。
对角矩阵不止局限于方阵,有的长方形的矩阵也有可能是对角矩阵。虽然非方阵的对角矩阵没有逆矩阵,但我们仍然可以高效地计算它们的乘积。比如对于一个长方形对角矩阵D而言,乘法Dx会涉及x中每个元素的缩放,如果D是瘦长型矩阵,那么在缩放后的末尾添加一些零;如果D是宽胖型矩阵,那么在缩放后去掉最后一些元素。
对称矩阵是转置和自己相等的矩阵,对称矩阵经常会出现在某些不依赖参数顺序的双参数函数生成元素时。例如,如果A是一个距离度量矩阵,Ai,j表示点i到点j的距离,那么Ai,j=Aj,i,因为距离函数是对称的。
单位向量是具有单位范数的向量,即
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/31_02.jpg?sign=1739552651-1hzT0nVeoyFD2sLwxb0D92iYpRE2MSif-0-2fbf4de7d7c241c4ac049c3b43ec09d7)
向量x和向量y互相正交,则xTy=0。如果两个向量都有非零范数,那么这两个向量之间的夹角是90°,在Rn中,至多有n个范数非零向量互相正交。如果这些向量不但互相正交,而且范数都为1,那么我们称它们是标准正交。
正交矩阵指行向量和列向量分别是标准正交的方阵,即
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/31_03.jpg?sign=1739552651-YbVqBv9muHScNJ7j0BwM8d2jIt1WjNK8-0-4db9d5279b5903408c397b3ef5273929)
这意味着
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/31_04.jpg?sign=1739552651-ei4I2P3f4BkAnwAJoMX6wojArBLb2Mg6-0-e4c562dbff1b248ac713b5e1e3d976d2)
正交矩阵因为求逆计算代价小,常受到关注。
2.1.7 特征分解
我们可以通过将一些数学对象分解成多个组成部分或者找到它们的一些属性,从而更好地理解它们的一些属性。这些属性不是由我们选择表示它们的方式所产生的,而是通用的。
例如,整数可以分解为质因数。14可以用不同的方式来进行表达,比如我们可以选择十进制或八进制等,但14=2×7永远是对的。因此从这个表示中我们可以获得一些有用的信息,比如14不能被3整除,或者14的倍数可以被2整除。
通过上述分解质因数来发现整数的一些内在性质的方式,我们也可以通过分解矩阵来发现矩阵表示成数组元素时不明显的函数性质。
目前来说,使用最广的矩阵分解之一是特征分解(Eigendecomposition),即我们将矩阵分解为由其特征值和特征向量表示的矩阵之积的方法。
方阵A的特征向量(Eigenvector)是指与A相乘后相当于对该向量进行缩放的非零向量:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/32_02.jpg?sign=1739552651-pw40HSmc1goOKBuK6iYqTD6ui63Bt0Ec-0-77b4facdf37ee9e8d568777c5e878bb2)
式中,标量λ称为这个特征向量对应的特征值(Eigenvalue)。通常我们更习惯于使用右特征向量(Right Eigenvector),但也可以定义左特征向量(Left Eigen vector)。
如果是A的特征向量,那么任何缩放后的向量
也是A的特征向量。此外,
和
有相同的特征值。基于这个原因,通常我们只考虑单位特征向量。
假如矩阵A有n个线性无关的特征向量{v(1),…,vn},它们分别对应着n个特征值{λ1,…,λn}。我们将特征向量连接成一个矩阵,使得每一列是一个特征向量:V=[v1,…,vn]。类似地,我们也可以将特征值连接成一个向量λ=[λ1,…,λn]T。因此A的特征分解可以记作:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/32_08.jpg?sign=1739552651-ApEL4j0TmpuUCmUKYlHL6DnRMQrRlUCt-0-58ee70afa9f50d927ef7418f809f32aa)
根据上面的描述,我们可以看出来构建具有特定特征值和特征向量的矩阵,能够使我们在目标方向上延伸空间。然而,当我们将矩阵分解成用特征值和特征向量来表达时,这就对我们分析矩阵的特定性质有所帮助,就像理解整数时我们应用质因数分解的方法。
但不是每一个矩阵都可以分解成特征值和特征向量的。有时候,特征分解存在,但是会得到复数。但是在本书中,我们分解的矩阵都比较简单易分解,且得到的都为实数。也就是说,每个实对称矩阵都可以分解成实特征向量和实特征值:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/33_01.jpg?sign=1739552651-13m5DobycC8gfdD3c2QcHPj2qoiBUioi-0-67ffc5276325ebf1beaf0ff424783ac8)
式中,Q是Λ的特征向量组成的正交矩阵;Λ是对角矩阵。特征值Λ:,i对应的特征向量是矩阵Q的第i列,记作Q:,i。因为Q是正交矩阵,可以将A看作沿方向v(i)延展λi倍的空间。
特征分解也有可能不唯一。如果两个或多个特征向量拥有相同的特征值,那么在由这些特征向量产生的子空间中,任意一组正交向量都是该特征值对应的特征向量。因此,我们可以等价地从这些特征向量中构成Q作为替代。按照惯例,我们通常按降序排列Λ的元素。在该约定下,特征分解唯一,当且仅当所有的特征值都是唯一的。
矩阵的特征分解给了我们很多关于矩阵的有用信息。矩阵是奇异的,当且仅当含有零特征值,实对称矩阵的特征分解也可以用于优化二次方程f(x)=xTAx,其中限制||x||2=1。当x等于A的某个特征向量时,f(x)将返回对应的特征值。在限制条件下,函数f(x)的最大值是最大特征值,最小值是最小特征值。
正定矩阵(Positive Definite)是所有特征值都是正数的矩阵;
半正定矩阵(Positive Semidefinite)是所有特征值都是非负数的矩阵;
负定矩阵(Negative Definite)是所有特征值都是负数的矩阵;
半负定矩阵(Negative Semidefinite)是所有特征值都是非正数的矩阵。
同时需要注意:半正定矩阵保证∀x,xTAx≥0,正定矩阵保证xTAx=0→x=0。
2.1.8 奇异值分解
在上一节中,我们探讨了如何将矩阵分解成特征向量和特征值。还有另一种分解矩阵的方法,称为奇异值分解(Singular Value Decomposition, SVD),是将矩阵分解为奇异向量(Singular Vector)和奇异值(Singular Value)。通过奇异值分解,我们会得到一些与特征分解相同类型的信息。然而,对比特征分解来讲,奇异值分解有更广泛的应用。每个实数矩阵都有一个奇异值分解,但不一定都有特征分解。例如,非方阵的矩阵没有特征分解,这时我们只能使用奇异值分解[11]。
回想一下,我们使用特征分解去分析矩阵A时,得到特征向量构成的矩阵V和特征值构成的向量λ,我们可以重新将A写作
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/33_02.jpg?sign=1739552651-OFFGwYvKjgbNy8mCReboOH9rTmQinPeE-0-e59563a750f51add4a382174560c9084)
奇异值分解是类似的,只不过这回我们将矩阵A分解成三个矩阵的乘积:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/33_03.jpg?sign=1739552651-SI0lGijp6ouh1XctHl4SBKqTrqnGUSvh-0-0a42183500a4580e8ccaecc50295f0f3)
假设A是一个m×n的矩阵,那么U是一个m×m的矩阵,D是一个m×n的矩阵,V是一个n×n矩阵。
这些矩阵经定义后都拥有特殊的结构。矩阵U和V都定义为正交矩阵,而矩阵D定义为对角矩阵。注意,矩阵D不一定是方阵[12]。
对角矩阵D对角线上的元素称为矩阵A的奇异值(Singular Value)。矩阵U的列向量称为左奇异向量(Left Singular Vector),矩阵V的列向量称为右奇异向量(Right Singular Vector)。
事实上,我们可以用与A相关的特征分解去解释A的奇异值分解。A的左奇异向量(Left Singular Vector)是AAT的特征向量。A的右奇异向量(Right Singular Vector)是ATA的特征向量。A的非零奇异值是ATA特征值的二次方根,同时也是AAT特征值的二次方根。
SVD最有用的一个性质可能是拓展矩阵求逆到非方矩阵上。我们将在下一节中探讨。
2.1.9 Moore-Penrose伪逆
对于非方矩阵而言,其逆矩阵没有定义。假设在下面的问题中,我们希望通过矩阵A的左逆B来求解线性方程:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/34_01.jpg?sign=1739552651-s3xnP4RpgdE8nu4px9KGfknFHMozMMgw-0-d36997e0b92ca193af14ac37e768942f)
等式两边左乘左逆B后,我们得到
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/34_02.jpg?sign=1739552651-m2G6OUp2D8X7e4sd2P4D9g2kUqMtf1je-0-c7b5269d119ccb5355ea8257de617ccb)
取决于问题的形式,我们可能无法设计一个唯一的映射将A映射到B。
当矩阵A的行数大于列数时,上述方程可能没有解。当矩阵A的行数小于列数时,上述矩阵可能有多个解。
Moore-Penrose伪逆(Moore-Penrose Pseudoinverse)使我们在这类问题上取得了一定的进展。矩阵A的伪逆定义为
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/34_03.jpg?sign=1739552651-rVig43hvxUWSzHnrFpVcFsBdXNelkStW-0-ca2ef2aeef759e62a196485586b66308)
计算伪逆的实际算法没有基于这个定义,而是使用下面的公式
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/34_04.jpg?sign=1739552651-NkgdPDUTw2pUIyuOMp8Jpl9YIRAxfi2g-0-b07cc5b3ef23a26c2b1faa569b99d3d1)
式中,矩阵U、D和V是矩阵A奇异值分解后得到的矩阵;对角矩阵D的伪逆D+是其非零元素取倒数之后再转置得到的。
当矩阵A的列数多于行数时,使用伪逆求解线性方程是众多可能解法中的一种。特别地,x=A+y是方程所有可行解中欧几里得范数||x||2最小的一个。
当矩阵A的行数多于列数时,可能没有解。在这种情况下,通过伪逆得到的x使得Ax和y的欧几里得距离||Ax-y||2最小。
2.1.10 迹运算
迹运算返回的是矩阵对角元素的和:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/35_01.jpg?sign=1739552651-EAgrZv6g6bFz5njTO0sKK6TZ45GcWtSh-0-091ea3678cfdb8e981f517d985ad449b)
迹运算在机器学习中应用比较频繁,因为在不用求和符号的前提下,矩阵乘法和迹运算可以清楚地表示矩阵运算。例如,迹运算提供了另一种描述矩阵Frobenius范数的方式:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/35_02.jpg?sign=1739552651-BrO09LYRquvsesWGrh1bPU65WPKltI0B-0-b278e8a9827e2e3d80dca55ff35873fa)
还有一点让大家广泛应用迹运算表达式表达的原因是我们可以使用很多有用的等式巧妙地来处理表达式。例如,迹运算在转置运算下是不变的:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/35_03.jpg?sign=1739552651-PlPqvZX4fDjveknNarT1uTgQ4bwIgg7D-0-b9eabb9a62bca6ce8825a4e7da50acba)
多个矩阵相乘得到的方阵的迹,和将这些矩阵中的最后一个挪到最前面之后相乘的迹是相同的。当然,我们需要考虑挪动之后矩阵乘积依然定义良好:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/35_04.jpg?sign=1739552651-4U3ceXQiLSAKCQNzN8j9VP998EWytxV0-0-63c6c20862d5a0d701e436006b17d817)
或者更一般地,
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/35_05.jpg?sign=1739552651-pro3RIjxpPc5SZqVmJ4ag3eKFCIQFdnl-0-ff3ba92d6dfb19dee9daef56803e849f)
虽然循环置换后矩阵乘积得到的矩阵形状变了,但迹运算的结果不变。例如,假设矩阵A∈Rm×n,矩阵B∈Rn×m,我们可以得到
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/35_06.jpg?sign=1739552651-hpJDOCNuknWFFg9g705OR7yeqpHUXdQO-0-552b0aa74e0a73ef8ab0c2f831302c5c)
尽管AB∈Rm×m和BA∈Rn×n。
另一个有用的事实是标量在迹运算后依然是它自己:a=Tr(a)。
2.1.11 行列式
行列式,记作det(A),是一个将方阵A映射到实数的函数。行列式等于矩阵特征值的乘积。行列式的绝对值可以用来衡量矩阵参与矩阵乘法后空间扩大或者缩小了多少。如果行列式是0,那么空间至少沿着某一堆完全收缩了,使其失去了所有的体积;如果行列式是1,那么这个转换保持空间体积不变。
2.1.12 主成分分析
主成分分析(Principal Components Analysis, PCA)是一个简单的机器学习算法,可以通过基础的线性代数知识推导。
当我们进行有损压缩时,就需要用到主成分分析。可以假设在Rn空间中有m个点x(1),…,xm,我们希望对这些点进行有损压缩。通过有损压缩,就可以达到使用较少的内存,同时损失一些精度去存储这些点。我们希望损失的精度尽可能少。
我们用低维表示来编码这些点。对于每个点x(i)∈Rn,会有一个对应的编码向量c(i)∈Rl。如果l比n小,那么我们便使用了更少的内存来存储原来的数据。我们希望找到一个编码函数,根据输入返回编码,f(x)=c;我们也希望找到一个解码函数,给定编码重构输入,x≈g(f(x))。
PCA由我们选择的解码函数而定。具体来讲,为了简化解码器,我们使用矩阵乘法将编码映射回Rn,即g(c)=Dc,其中D∈Rn×l是定义解码的矩阵。
到目前为止,所描述的问题可能会有多个解。因为如果我们按比例缩小所有点对应的编码向量ci,那么只需按比例放大D:,i,即可保持结果不变。为了使问题有唯一解,我们限制D中所有列向量都有单位范数[13]。
这个过程中最难的一个问题在于计算这个解码器的最优编码。为了使编码问题简单一些,PCA限制D的列向量彼此正交(注意,除非l=n,否则严格意义上D不是一个正交矩阵)[14]。
为了将这个基本想法变为我们能够实现的算法,首先我们需要明确如何根据每一个输入x得到一个最优编码c*。一种方法是最小化原始输入向量x和重构向量g(c*)之间的距离。我们使用范数来衡量它们之间的距离。在PCA算法中,我们使用L2范数
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/36_01.jpg?sign=1739552651-soPQLmw1kJ5wchWqUpdmCwLHEUanafmk-0-83d6447fdfd7d6cbd085918247263bf1)
我们可以用平方L2范数替代L2范数,因为两者在相同的c值上取得最小值。这是因为L2范数是非负的,并且平方运算在非负值上是单调递增的。
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/36_02.jpg?sign=1739552651-j7FO10efHrNIhoH9m6TVGlWxJmcukbgG-0-d8eda4ad5a749605a19185276ccef58c)
该最小化函数可以简化成
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/36_03.jpg?sign=1739552651-sWDj360id2LJH11bDvMLys8JjBqL7MsB-0-4893b54650798df7aaa96e4aad1299d4)
(L2范数的定义)
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/36_04.jpg?sign=1739552651-oDJQg2xKj2ErwvXkUrweTdKPe66T9f4A-0-01b379d668a29791922a8c0b9e56398a)
(分配律)
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/36_05.jpg?sign=1739552651-sCj14oF3A7nAVxlf8h1Km52RSLXY4dKk-0-6a00e798109b1079d58aa36c765f5546)
(因为标量g(c)Tx的转置等于自身)
因为第一项不依赖于c,所以我们可以忽略它,得到如下的优化目标:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/36_06.jpg?sign=1739552651-jEZLteZb1Md7SyIYaGTx0A2USTv7Fv3Q-0-a17df2262a2b424da542f57407e32617)
更进一步,代入g(c)的定义:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/36_07.jpg?sign=1739552651-Upji1HsO9AVg8usZkSZaYJQu0fAGhiFQ-0-c8bcaacd8a3ae6044ea2412620a59118)
(矩阵D的正交性和单位范数约束)
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/36_08.jpg?sign=1739552651-xfYhoZcb3TO1RajdSRp9KPKMNCUwjY4y-0-a89f7d0e806e1c5d4fc0985c9094098d)
我们可以通过向量微积分来求解这个最优化问题
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/37_01.jpg?sign=1739552651-KLAclj9eoEI9aCV2wLag2GG5TmXtv4xJ-0-e5c1ca46dc0d16ca1d900cce3dc657a7)
从而使得算法更加高效:只需要一个矩阵向量乘法操作,就可以获得最优编码x。为了获得编码向量,我们可以使用编码函数
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/37_02.jpg?sign=1739552651-O3ZtYELXkD97uq28mLrjCXtFdoOhqHO0-0-4a3865787779d079a8f4381839dfa80b)
进一步使用矩阵乘法,我们也可以定义PCA重构操作:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/37_03.jpg?sign=1739552651-xSqiYu2ieTZfv5SMWFoqupvKc95cbq4J-0-5a87cb00f085a02975023ba0be2533f1)
接下来,我们需要挑选编码矩阵D。要做到这一点,先来回顾最小化输入和重构之间L2距离的这个想法。由于对所有的点进行解码时,所用的矩阵D都是相同的,因此我们不能再孤立地看待每个点。反之,我们必须最小化所有维数和所有点上的误差矩阵的Frobenius范数:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/37_04.jpg?sign=1739552651-MV5TPyksTrzXmBN3jiXJlqd3iviNkUso-0-9cd4764fc79eeddd2e68e107e2cef39d)
为了推导用于寻求D*的算法,我们首先考虑l=1的情况。在这种情况下,D是一个单一向量d。简化D为d,则问题简化为
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/37_05.jpg?sign=1739552651-h6AOBUvlSvJ39zzuXhukovGsDsO4sdpf-0-fa58456d616992563fc4284777bb3645)
式(2.54)是直接代入得到的,但不是表述上最美观的方式。在式(2.54)中,我们将标量dTx(i)放在向量d的右边。将该标量放在左边的写法更为传统。于是我们通常写作:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/37_06.jpg?sign=1739552651-hqxsoJoJy3S020nAezbmV6jvbpwzrwVY-0-0afd11c9e8f2d2eb64ab6912192e9965)
或者,考虑到标量的转置和自身相等,我们也可以写作:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/37_07.jpg?sign=1739552651-1M7LAQel7MUS6yyTEu7YGC1Zfh1cyovf-0-457735c0fc780ac18b45125b5e3d893b)
此时,使用单一矩阵来重述问题,比将问题写成求和形式更有帮助。这有助于我们使用更紧凑的符号。将表示各点的向量堆叠成一个矩阵,记为X∈Rm×n,其中Xi,:=x(i)T,则原问题可重新描述为
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/37_08.jpg?sign=1739552651-tAx4Mp3wQ5tDBx18g00E3fr67RBjrQ3R-0-053034008d83bd3237a432942ef53906)
暂时不考虑约束,我们可以将Frobenius范数简化成下面的形式:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/37_09.jpg?sign=1739552651-0ujTRZ4ISYMjGUnFmfeuwHs8zYEIcwnL-0-71c95e9508f9cd8305af79b3506a3a01)
(因为与d的无关项不影响arg min)
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/38_01.jpg?sign=1739552651-QQ2WJzNQfMW05xDYP4yKP5NwTMhNOkra-0-ff7eea240e0eca3195a1bee3174a6fdb)
(因为循环改变迹运算中相乘矩阵的顺序不影响结果)
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/38_02.jpg?sign=1739552651-OG203pBlK32azYYjDAyPpuRbmDHAQp3u-0-cc37a2576f4b1bb66bb2949bd91ccab2)
(再次使用上述性质)
此时,我们再来考虑约束条件:
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/38_03.jpg?sign=1739552651-rx5jnAu9yYv51bdJHuWkDALneqF5sQb2-0-f59c31a9f3d731936d59f9e14b93fa42)
(因为约束条件)
![](https://epubservercos.yuewen.com/35D24C/25220508709645006/epubprivate/OEBPS/Images/38_04.jpg?sign=1739552651-qG1RjXXxOdrGXVCcuG00oUEtVTOz6aH2-0-616c96c2f7b6b36885f765da09e9ab75)
这个优化问题可以通过特征分解来求解。具体来讲,最优的d是XTX最大特征值对应的特征向量。
以上推导特定于l=1的情况,仅得到了第一个主成分。更一般地,当我们希望得到主成分的基时,矩阵D由前l个最大的特征值对应的特征向量组成。这个结论可以通过归纳法证明。
线性代数是理解深度学习必须掌握的基础数学学科之一,还有一门在机器学习中无处不在的重要数学学科是概率论,我们将在下一节进行探讨。