很多人学了半天也没搞明白为什么要学线性代数?线性代数的本质是什么,又为何常常跟几何或者空间扯上关系?本节的目的不是越俎代庖,即讲解很多具体的线性代数的相关知识,而是希望你深刻理解它对学习人工智能的重要性,以及把握好需要学到什么程度。
我们先来回答与线性代数相关的这几个关键问题,然后快速回顾必要的基础概念。至于更多细节,则建议阅读相关图书自行学习了。
线性代数在人工智能,特别是深度学习领域中有很多重要应用。以下是一些主要原因。
● 数据经常被表示为向量和矩阵的形式。例如,一张图像可以被表示为一个二维像素矩阵,一段文字可以被表示为一个词频向量等。理解这些表示需要对线性代数有基本的理解。
● 许多算法的核心依赖线性代数的基本操作,如矩阵乘法、矩阵分解、向量内积、范数计算等。例如,在神经网络中,权重和输入数据的乘积以及之后的反向传播等操作,都涉及大量的线性代数知识。
● 很多算法,特别是神经网络,依赖优化算法(如梯度下降)来训练模型。这些优化算法需要计算梯度,这就需要对线性代数有深入的理解。
● 深度学习网络有大量的参数,并且它们的结构和操作往往与线性代数紧密相关。学习这些模型的工作原理时需要对线性代数有深入的理解。
总体来说,线性代数的知识不仅能帮助我们理解算法的工作原理,还能帮助我们更高效地实现算法。许多高效的数值计算库(如NumPy和TensorFlow)提供了进行矩阵和向量运算的优化函数。了解线性代数能帮助我们更好地利用这些库,从而处理大规模的数据。
线性代数这个名字源于它的主要研究对象是线性的。“线性”在这里主要有两层含义:
● 向量空间中的向量可以通过加法和标量乘法进行组合,这两种操作都是线性的;
● 线性代数研究的映射(如矩阵)保持向量的线性组合,也就是说映射的结果是线性的。
我们可以对线性代数理解得更通俗一些。真实世界中的许多系统其实是非线性的,但非线性问题很难直接予以解决。线性代数提供了理解和处理这些问题的一种方式,尽管它可能不会给出精确的解,但通常可以提供很好的近似解和洞见。比如,在物理、工程、经济、生物学等多种领域中,许多问题会先被简化为线性模型,然后用线性代数的方法进行求解。
当然,对于一些非线性问题,我们有时也会使用更复杂的数学工具,比如微分方程、非线性动力学、混沌理论等,来尝试更精确地描述和预测现象。然而,这些工具通常需要借助更深入的数学知识来理解和使用。
线性代数作为数学中的一个重要分支,主要研究向量、向量空间(也称为线性空间)、线性变换以及它们的性质和关系。这些研究对象在各种科学和工程问题中都有广泛的应用,而线性代数就是研究这些对象时所使用的数学工具。
向量是线性代数的基本研究对象,它可以被视为具有大小和方向的物理量,也可以被视为一组数(或坐标)。
向量空间是向量的集合,满足一些基本性质,如向量加法和标量乘法。这个性质极大地扩展了“空间”的概念,让我们能够在任意维度下工作,甚至在无穷维度下工作。
线性变换是从一个向量空间到另一个向量空间的映射,它保持向量的加法和标量乘法,提供了一种非常强大的工具,让我们能够在不同的向量空间之间转换。许多重要的数学概念和工具,如矩阵、行列式和特征值,都与线性变换有关。
线性系统是一组线性方程,它描述了各种变量之间的线性关系,也是科学和工程领域中许多问题的基础,解决这些问题需要对线性代数有深入的理解。
总结起来,线性代数的本质在于它提供了一套框架和工具,可以用来理解和处理这些线性对象和它们的关系,这使得它成为许多领域(包括物理、工程、计算机科学和数据科学等)的基础工具。
线性代数中的许多概念和结果都有深刻的几何意义,使我们能够用直观的方式理解它们,强调几何意义有以下几个原因。
● 几何解释能够帮助我们直观地理解抽象的数学概念。例如,向量可以被看作箭头,线性变换可以被看作拉伸、旋转或者剪切等操作,使得我们能够在脑海中形象地想象出这些概念和结果,这在人工智能的学习中经常用到。
● 线性代数中的许多概念和方法都能够应用到实际问题中。例如,在物理、工程和计算机科学中,我们经常需要处理空间中的对象和它们的变换,这时候线性代数就派上了用场,它常常是数学建模的有效工具。
● 理解线性代数的几何意义有助于我们建立更深入的理解,从而能够理解更复杂的概念和结果。例如,向量空间的概念就是通过考虑映射的几何效果得到的。
总之,学习和使用线性代数的过程中,要深入理解概念和运算的几何意义,数形结合是一种常见而且十分有用的学习方法。
在深度学习中,标量(scalar)是一种非常常见的数据表示方式。比如,很多超参数就是用它来表示的。简单地说,标量就是一个数,它只有大小,没有方向。房间的温度,银行的存款,秤上显示的体重,头发的根数,这些数都是数学意义上的标量。
标量通常用小写字母来表示,一些书上会用斜体来表示。一般在介绍标量时会说明数值的类型,比如我们可以用 w =75, n =3来表示一个人重75千克,只有3根头发。
当一组标量排成一行或者一列时就变成了向量(vector),这些标量值被称为向量的元素。向量中的元素在一个轴上是有序排列的,这个轴可以是行也可以是列。
向量通常用粗体小写字母来表示,元素可以通过带角标的斜体字母来表示。比如班里一次考试的成绩可以用向量 s 来表示,它的第一个元素 s 1 是学号为1的同学的成绩, s 2 是学号为2的同学的成绩,以此类推。
假设班里有 n 个同学,我们可以用如下的方括号包围的行或者列来表示:
或者
向量是数学物理、工程科学和人工智能领域中的核心概念,其重要性体现在很多方面。
● 向量有两个主要特性,即大小和方向。这使得它成为表示物理世界中的许多概念(如力、速度、加速度等)的理想工具。
● 通过向量可以用简洁的形式表示复杂的几何和物理问题。例如,向量的加法和数乘运算使我们可以以简单的方式表示位置、速度、力的改变等。
● 向量使得我们可以使用线性代数的工具(如矩阵和行列式)来处理复杂的问题。例如,在机器学习和数据分析中,我们经常需要处理高维数据,这时就可以将数据视为高维向量,并用向量和矩阵的运算来处理。
向量特别有用的一点是它与空间的关系。我们通常会将向量看作空间中的点或从空间原点指向该点的箭头,而一组向量可以生成一个向量空间。也就是说,向量空间中的每一个点都可以表示为这组向量的线性组合。这种方式使我们能够将抽象的线性代数问题转化为具体的几何问题,进而利用几何来直观理解和解决问题,因此向量成为我们理解和操作空间的主要工具。
向量有其自己的一些属性,比如维度(dimension)就是指向量中元素的个数。它通常可以被理解为所在空间坐标轴的数量。例如,二维向量存在于平面上,每个向量都有两个坐标值( x 和 y ),对应于平面的两个坐标轴;三维向量存在于三维空间中,每个向量都有三个坐标值( x 、 y 和 z ),对应于三维空间的三个坐标轴。
在机器学习或者深度学习中,我们可能会处理有几百甚至几千个维度的向量。虽然这些高维向量不能直观地在三维空间中表示,但仍然可以理解为存在于高维空间中,其中每个维度对应一个坐标轴,向量其实就是高维空间中的一个点。
在某些上下文中,人们可能会使用“长度”这个词来描述向量的维度或元素个数,特别是在编程和计算机科学的语境中。例如,Python中一个数组或列表的“长度”通常是指它包含的元素的数量,这类似于向量的维度。然而,这种描述可能会产生混淆,因为在数学和物理学中,向量的“长度”通常指的是其模长。
为了避免混淆,最好尽可能清楚地使用“维度”或“元素个数”来描述向量的组成部分的数量,而使用“模长”或“幅度”来描述向量的大小或长度。换句话说,“维度”是向量所在的空间的属性,它并不代表向量的“长度”,而是描述了向量的分量数或向量的自由度。
除了维度,向量还有一种度量方式称为模长(magnitude),表示向量在空间中的长度或者大小。二维向量的模长可以理解为平面直角坐标系内点 和原点 之间的距离,用|| a ||表示,读作 a 的模,它的值(也就是模长)等于 。扩展到 维也很简单, 维向量 a 的模长等于 。
与模长类似的还有一个术语称为范数(norm)。范数和模长可以视为相同的概念,但通常在不同的上下文中使用。模长一般在物理和几何中使用,范数则是更一般的概念,主要在数学和相关领域(如机器学习和数据分析)中使用。它的计算公式如下:
根据 的不同取值,有 等不同的范数。 范数又称为曼哈顿范数,它是 时的范数,度量的是向量中各个元素绝对值的和,这可以被视为在网格化城市(比如曼哈顿)中从一个地方移动到另一个地方所需的最短距离。前面讲的二维向量模长的计算方法其实就是求L2范数,也就是 时的范数,又被称为欧几里得范数。
这些看似奇怪的术语常常令人混淆,主要是很多人跳过了线数、实分析和函数分析等,一下子越级到人工智能领域不是很适应。不过也不一定非要再去补全那么多的数学知识,只要学会归类和对比学习,弄清楚基本概念后就会简单很多。
当向量的模长等于1时,这样的向量就被称为单位向量。因为单位向量的大小总是等于1,所以可以认为它表示的是向量在空间中的方向。当我们得到一个向量后,如果只需要考虑它的方向而非长度,可以把它转化为单位向量。在二维平面直角坐标系中,对于二维向量 ,其单位向量为 ,也就是把它的两个元素同时除以模长。扩展到 n 维的情况也是一样的。
如前文所述,向量表示的是空间中的一个点,也可以理解为从原点指向该点的箭头,具体取决于上下文,它有大小、方向等不同属性。
那么,怎么表示两个向量之间的关系呢?这就涉及向量运算了。基本的运算方法就是内积,也称为点乘、点积,是两个向量对应位置元素相乘再相加,其结果是一个标量。
假设我们要购入一批商品,用向量 表示购买商品的单价列表,记为 , 表示购买商品的数量列表,记为 ,那么总价 就可以用向量 和 b 的内积来表示,记为 ,也就是 。用向量表示是不是很简洁呢?
除了便于计算,内积还可以表示两个向量的线性相关度。比如我们将两个向量归一化得到单位向量后,内积就表示它们夹角的余弦值,即 ,其中 是 a 和 b 的夹角。从几何意义角度理解,这个值越接近1表示二者方向越一致,越相关;越接近0则表示二者越无关;等于0表示二者垂直,也称为正交,说明两个向量线性无关,如图2-2所示。
图2-2 向量内积示意
有内就有外,对于向量也可以计算外积。外积又称为向量叉积、叉乘等。不像内积的运算结果是一个标量,向量外积的运算结果是一个向量。
在三维空间中,两个向量的外积,其方向垂直于这两个向量所构成的平面,且其大小等于这两个向量所构成的平行四边形的面积值 ,其中 。
向量外积主要应用在于计算向量所构成的平面的面积、求解平面的法向量以及判断向量的共面性上,如图2-3所示。
图2-3 向量外积示意
向量内积和向量外积的定义和性质都有其深远的数学基础和几何直观性,这使得它们在很多数学、物理和数据分析问题中有重要的应用。
在深度学习中,相对更常用的是向量内积,向量外积不是很常用,不过在一些特定场景中也会用到,比如图形处理、机器人臂运动规划等。此外,如果一个深度学习模型或算法涉及三维空间中的运动或方向,向量外积可能会被用到。
当若干长度相同的行向量排成一列或者长度相同的列向量排成一行时,我们就得到了一个数据表格,也就是矩阵。它有两个轴,是一种二维数据结构,其中的每个数在矩阵中都有对应的行号和列号。矩阵通常用粗体大写字母来表示。
如果一个矩阵高度为 m ,宽度为 n ,我们就称矩阵 。 叫作矩阵的维度或者大小, 表示实数集。在表示矩阵元素的时候,通常使用索引的形式,比如 就表示第一行第一列的元素, 就表示第 m 行第 n 列的元素。具体表示方法如下——用一个方括号把元素括起来。
从几何角度来看,矩阵通常用于表示向量的线性变换,例如旋转、缩放、倾斜和反射等操作。
“维度”这个概念在不同语境中可能有不同的含义。在计算机科学中,数组的维度是指它的阶数或者定义它的索引数量。例如,一维数组有一个索引,二维数组有两个索引,以此类推。
向量维度指的是它包含的元素个数,或者所在向量空间的维度。例如,我们称一个包含3个元素的向量是三维的,这和计算机科学中一维数组的概念是一致的。
矩阵维度通常指的是它的行数和列数。例如,一个3×2的矩阵是包含3行2列的矩阵,我们称它的维度是3×2,这和计算机科学中二维数组的概念是一致的。
矩阵变换应该是不少读者学习线性代数时的难题,这里再简单介绍一下,然后告诉你在深度学习中需要掌握哪些概念,以及应该掌握到什么程度。
矩阵转置是以主对角线,也就是左上角到右下角这条线为轴,将矩阵进行镜像翻转。其定义很简单: ,原来 m 行 n 列的矩阵转置以后就变成了 n 行 m 列。通过下面这个例子,我们可以看出矩阵转置前后各个元素位置的变化。
由于该矩阵不是方阵,其行数大于列数,因此主对角线上的元素只有两个,其他元素则以此(即主对角线的这两个元素)为对角线进行镜像操作。
假设有如下 m 行 k 列的矩阵 A 和 k 行 n 列的矩阵 B :
矩阵乘法 C = AB 的计算方法就是左行乘以右列,逐行逐列计算对应向量的内积,结果仍然是一个矩阵。该矩阵对应位置元素的计算公式如下:
矩阵乘法的几何意义通常体现在表示线性变换的上下文中。如前文所述,一个矩阵可以看作从一个向量空间到另一个向量空间的映射或者变换,这个线性变换可以包括旋转、缩放、剪切等操作。因此,两个矩阵相乘可以看作两个线性变换的复合。
矩阵乘法是有顺序的, AB 和 BA 完全不同,甚至可能因顺序不同导致两个矩阵根本不能相乘,因此必须先看矩阵的维度,这是与通常意义上的乘法的最大区别,也是特别容易犯错的地方。
如果矩阵 A 的维度是 m × k ,矩阵 B 的维度是 k × n ,那么 AB 可以,因为 m × k × k × n 中两个 k 相等,相乘的对应元素的个数一致。反之 BA 就不行,因为此时 k × n × m × k 中 n 和 m 不相等,相乘的对应元素的个数不一致!在深度学习中,我们会大量使用矩阵运算,因此要特别注意其维度形状。
与向量内积类似,矩阵之间也可以计算内积,也称为点积,但此时要求两个矩阵的形状相同,内积就是对应元素的乘积之和,它是一个标量。
在几何上,矩阵内积(或者称为Frobenius内积)可以被看作一种度量两个矩阵之间“相似性”的方式。举例来说,如果我们有两个同样大小的图像(可以看作二维矩阵),那么这两个图像的矩阵内积就能表示这两个图像的相似程度。在统计意义上,当两个图像完全相同时,它们的矩阵内积会达到最大值,也就是对应元素平方和的总和。如果两个图像之间没有任何相似性,它们的矩阵内积会接近于0。
值得注意的是,就像向量内积一样,矩阵内积也受到矩阵的长度(或者范数)的影响。因此,在度量两个矩阵的相似性时,我们通常会考虑它们的归一化内积。
矩阵外积也称为克罗内克积或者张量积,在机器学习和深度学习中应用相对较少,远不如矩阵乘法那么常见。两个矩阵的外积记作 。
还有一种矩阵运算称为哈达玛积(Hadamard product),也称为逐元素对应乘积(element-wise product),要求两个矩阵大小相同。计算方法很简单,就是对应位置元素直接相乘,最后的结果是一个矩阵。
矩阵变换看似比向量一下子复杂不少,其实只是多了矩阵乘法,向量运算中并没有单独的向量乘法。后面讲的矩阵内积、外积在深度学习中的应用相对较少,反倒是元素级的哈达玛积应用比较多。符号上的区别可以记个小口诀:“内点外叉哈圆圈,矩阵乘法最重要。”总体来说,虽然线性代数的运算看上去很复杂,但在深度学习中,多数情况下只要熟悉向量内积和矩阵乘法就够了。
矩阵乘法有很多有用的性质,不同于标量运算中大家耳熟能详的乘法交换律,我们刚讲过矩阵运算不满足交换律,即 。但是,它满足分配率和结合律。
需要特别注意的是,矩阵运算本身比较复杂,索引下标太多容易乱,大家在今后的学习过程中,遇到相关问题不妨静下心来推导,相信一定会有所收获。
从标量到向量再到矩阵,可以看作数据的维度从零维开始升维的过程。每增加一维,就加入一个轴。比如,列是向量,增加一个轴(如行),就成了矩阵。继续增加维度,比如增加一个深度上的轴,又称为什么呢?其实这并没有一个特定的术语,可以叫作三阶张量,以此类推。
我们说张量是多维数据的抽象概括,可以看作向量和矩阵的推广。无论向量还是矩阵,本质上都是一种特殊的张量。因此,前面讲过的向量和矩阵的运算方法,对张量同样适用。
高维空间可以看作向量的集合,矩阵则是描述对这些向量进行线性变换的规则或操作,而张量既可以看成矩阵的变换(变换的变换),也可以看作一种更复杂的数据存储结构,尤其是在深度学习中,常用来存储和操作图像、声音和其他复杂数据集的数据。
我们常说向量是一维数组,矩阵是二维数组,张量是高维数组。其实,“数组”是计算机科学中的术语,用于描述数据的存储和操作,而“向量”“矩阵”“张量”是数学术语,描述的是数学对象和它们的性质。严格来说,它们是有本质区别的,这里的维度与高维空间中的维度的含义并不相同。人工智能的一大特色就是多种学科领域中相似的术语比较多,稍微不注意就容易混淆。
在本节中,我们讲了线性代数的预备知识,从标量到张量的过程一路在升维。正因如此,无论向量还是矩阵中出现的运算法则,对张量也是完全适用的。
熟练掌握向量和矩阵的运算,对理解张量运算有很大帮助。从二维到三维甚至更高维度,你所需掌握的不过是相同的原理和法则,再加一点点想象力就足够了。
张量的英文是tensor,大名鼎鼎的深度学习框架TensorFlow就得名于此。其实TensorFlow这个名字也道出了深度学习的本质就是若干张量的运算。由此可见,本节的内容对后续的学习非常重要,希望大家充分掌握。
2.2节将学习微积分的相关知识,大家加油!