本部分包含四个章节:线性代数、概率与信息论、数值计算和机器学习基础。在这部分介绍了深度学习所需的重要的基本数学概念。以及机器学习的基本目标,并描述了如何实现这些目标。四个章节层层递进,由浅入深逐步介绍到深度学习技术。
线性代数作为数学的一个分支,主要是面向连续数学而非离散数学,被广泛应用于科学和工程中。掌握好线性代数对于从事机器学习算法(尤其是深度学习算法)相关工作而言,是非常重要的。
如果已掌握线性代数相关知识,可以跳过本章。如果未接触或已忘记相关知识,可以通过本章学习与深度学习相关的线性代数知识。但是,本书中只是介绍了与深度学习相关的知识,需要参考其它资料共同学习,从而真正理解并掌握这些知识。另外,本书略去了很多重要的但是对于理解深度学习非必需的知识。
1、标量、向量、矩阵和张量
学习线性代数,会涉及以下几个数学概念:
标量:一个标量就是一个单独的数。在介绍标量时,我们会明确它是哪种类型的数,如实数,自然数等。在数学公式中,用小写的斜体字母来表示标量。实际上,标题就是一个数。
向量:一个向量就是一列数,这些数是有序排列的,通过索引可以获取向量中的单独的数。同样,也会明确向量中的元素是哪种类型的数。在数学公式中,用小写的粗体字母来表示向量,向量中的元素用带脚标的斜体字母表示,如
x
i
x_i
xi。实际上,向量就是纵向排列的一维的数组。
标准的向量是一纵列的数,当需要明确表示向量中的元素时,其写法如下:
x
=
[
x
1
x
2
⋮
x
n
]
(2.1)
\bm{x}= \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix} \tag{2.1}
x=
x1x2⋮xn
(2.1)
矩阵:矩阵是一个二维数组,其中每一个元素由两个索引所确定。在数学公式中,用大写的粗体字母来表示矩阵,如
A
\bm{A}
A,矩阵中的元素以带两个脚标的大写斜体字母表示,脚标用逗号隔开,如
A
i
,
j
A_{i,j}
Ai,j。此外,通过冒号来表示一整行或一整列元素,如
A
i
,
:
,
A
:
,
j
A_{i,:},A_{:,j}
Ai,:,A:,j。
当需要明确表示向量中的元素时,其写法如下:
A
=
[
A
1
,
1
A
1
,
2
…
A
1
,
n
A
2
,
1
A
2
,
2
…
A
2
,
n
⋮
⋮
⋱
⋮
A
m
,
1
A
m
,
2
…
A
m
,
n
]
(2.2)
\bm{A}= \begin{bmatrix} A_{1,1} & A_{1,2} & \dots & A_{1,n} \\ A_{2,1} & A_{2,2} & \dots & A_{2,n} \\ \vdots & \vdots & \ddots & \vdots \\ A_{m,1} & A_{m,2} & \dots & A_{m,n} \\ \end{bmatrix} \tag{2.2}
A=
A1,1A2,1⋮Am,1A1,2A2,2⋮Am,2……⋱…A1,nA2,n⋮Am,n
(2.2)
张量:张量是一个超过二维的数组,元素分布在若干维的规则网格中。在数学公式中,表示方法和矩阵相似又略有不同,如
A
\mathbf{A}
A。其元素同样用一组逗号分隔的脚标来表示,如
A
i
,
j
,
k
A_{i,j,k}
Ai,j,k.
转置(transpose)是矩阵的重要操作之一,矩阵的转置是以对角线为轴的镜像,这条从左上角到右下角的对角线被称为主对角线。在数学公式中矩阵的转置表示为
A
⊤
\bm{A}^\top
A⊤,其定义如下:
(
A
⊤
)
i
,
j
=
A
j
,
i
(2.3)
(\bm{A}^\top)_{i,j}=A_{j,i} \tag{2.3}
(A⊤)i,j=Aj,i(2.3)
矩阵转置示例如下,注意非方阵的对角线位置:
A
=
[
A
1
,
1
A
1
,
2
A
2
,
1
A
2
,
2
A
3
,
1
A
3
,
2
]
⟹
A
⊤
=
[
A
1
,
1
A
2
,
1
A
3
,
1
A
1
,
2
A
2
,
2
A
3
,
2
]
\bm{A}= {\begin{bmatrix} \red{\bcancel{A_{1,1}}} & A_{1,2} \\ A_{2,1} & \red{\bcancel{A_{2,2}}} \\ A_{3,1} & A_{3,2} \end{bmatrix}} \implies \bm{A}^\top= \begin{bmatrix} \red{\bcancel{A_{1,1}}} & A_{2,1} & A_{3,1} \\ A_{1,2} & \red{\bcancel{A_{2,2}}} & A_{3,2} \end{bmatrix}
A=
A1,1
A2,1A3,1A1,2A2,2
A3,2
⟹A⊤=[A1,1
A1,2A2,1A2,2
A3,1A3,2]
向量可以看作是只有一列的矩阵,对应的,向量的转置可以看作只有一行的矩阵。因此在文本行的书写中,可以通过将行矩阵进行转置作为标准的列向量来定义,比如:
x
=
[
x
1
,
x
2
,
x
3
]
⊤
\bm{x}=[x_1,x_2,x_3]^\top
x=[x1,x2,x3]⊤。
标量可以看作是只有一个元素的矩阵,标量的转置等于它本身,如
a
=
a
⊤
a=a^\top
a=a⊤。
矩阵形状一样时,可以对两个矩阵相加,即两个矩阵对应位置的元素相加,比如
C
=
A
+
B
\bm{C=A+B}
C=A+B,其中
C
i
,
j
=
A
i
,
j
+
B
i
,
j
C_{i,j}=A_{i,j}+B_{i,j}
Ci,j=Ai,j+Bi,j。
标量和矩阵相乘或是相加时,只需要将其与矩阵的每个元素相乘或相加,如
D
=
a
⋅
B
+
c
\bm{D}=a\cdot \bm{B}+c
D=a⋅B+c,其中
D
i
,
j
=
a
⋅
B
i
,
j
+
c
D_{i,j}=a\cdot B_{i,j}+c
Di,j=a⋅Bi,j+c。
特别的,在深度学习中,我们允许矩阵和向量相加,产生另一个矩阵,如 C = A + b \bm{C=A+b} C=A+b,其中 C i , j = A i , j + b j C_{i,j}=A_{i,j}+b_j Ci,j=Ai,j+bj。实际上,它是向量 b \bm{b} b和矩阵 A \bm{A} A的每一列相加,通过简写方法使我们无需在加法操作前先定义一个将向量 b \bm{b} b复制到每一列而生成的矩阵 B \bm{B} B。这种隐式地复制向量到很多位置的方式称为广播。
2、矩阵和向量相乘
矩阵乘法是矩阵运算中最重要的操作之一。只有当矩阵
A
\bm{A}
A的列数等于矩阵
B
\bm{B}
B的行数时,才可以实现两个矩阵的乘法运算。即
A
\bm{A}
A的形状是
m
×
n
m\times n
m×n,矩阵
B
\bm{B}
B的形状是
n
×
p
n\times p
n×p,其矩阵乘法结果是第三个矩阵
C
\bm{C}
C,其形状为
m
×
p
m\times p
m×p。矩阵乘法数学公式可以用两个或多个并列放置的矩阵来表示,例如:
C
=
A
B
(2.4)
\bm{C}=\bm{A}\bm{B} \tag{2.4}
C=AB(2.4)
其中,具体的乘法操作定义为:
C
i
,
j
=
∑
k
A
i
,
k
B
k
,
j
(2.5)
C_{i,j}=\sum_{k}A_{i,k}B_{k,j} \tag{2.5}
Ci,j=k∑Ai,kBk,j(2.5)
从上面定义可知,两个矩阵的标准乘积不是指两个矩阵中对应元素的乘积。对应元素的乘积操作称为Hadamard乘积,它的数学公式为:
A
⊙
B
\bm{A}\odot\bm{B}
A⊙B。
两个相同维数的向量
x
\bm{x}
x和
y
\bm{y}
y的点积可以看作是矩阵乘积
x
⊤
y
\bm{x}^\top\bm{y}
x⊤y。同样,我们可以把矩阵乘积
C
=
A
B
\bm{C}=\bm{A}\bm{B}
C=AB中计算
C
i
,
j
C_{i,j}
Ci,j的步骤看作
A
\bm{A}
A的第
i
i
i行和
B
\bm{B}
B的第
j
j
j列之间的点积。
矩阵的乘法运算有许多性质,如分配律:
A
(
B
+
C
)
=
A
B
+
A
C
(2.6)
\bm{A}(\bm{B}+\bm{C})=\bm{A}\bm{B}+\bm{A}\bm{C} \tag{2.6}
A(B+C)=AB+AC(2.6)
结合律:
A
(
B
C
)
=
(
A
B
)
C
(2.7)
\bm{A}(\bm{B}\bm{C})=(\bm{A}\bm{B})\bm{C} \tag{2.7}
A(BC)=(AB)C(2.7)
矩阵乘积不满足交换律(并不是所有
A
B
=
B
A
\bm{A}\bm{B}=\bm{B}\bm{A}
AB=BA都成立),但两个向量的点积满足交换律:
x
⊤
y
=
y
⊤
x
(2.8)
\bm{x}^\top\bm{y}=\bm{y}^\top\bm{x} \tag{2.8}
x⊤y=y⊤x(2.8)
矩阵乘积的转置有简单的形式:
(
A
B
)
⊤
=
B
⊤
A
⊤
(2.9)
(\bm{A}\bm{B})^\top=\bm{B}^\top\bm{A}^\top \tag{2.9}
(AB)⊤=B⊤A⊤(2.9)
除了上述矩阵乘法的性质,还有很多有用的性质。
此外,还可以用矩阵和向量的乘积符号来表达线性方程组,这种形式使得方程组的书写更加紧凑:
A
x
=
b
(2.11)
\bm{A}\bm{x}=\bm{b} \tag{2.11}
Ax=b(2.11)
其中,
A
∈
R
m
×
n
\bm{A}\in\R^{m\times n}
A∈Rm×n是一个已知矩阵,
b
∈
R
m
\bm{b}\in\R^{m}
b∈Rm是一个已知向量,
x
∈
R
n
\bm{x}\in\R^{n}
x∈Rn是要求解的未知向量。
矩阵
A
\bm{A}
A的每一行和
b
\bm{b}
b中对应元素构成一个约束方程,如:
A
1
,
:
x
=
b
1
A
2
,
:
x
=
b
2
⋮
A
m
,
:
x
=
b
m
\begin{gather} \bm{A_{1,:}x}=b_1 \\ \bm{A_{2,:}x}=b_2 \\ \vdots \\ \bm{A_{m,:}x}=b_m \tag{2.12} \end{gather}
A1,:x=b1A2,:x=b2⋮Am,:x=bm(2.12)
这些方程更详细明确的写法是:
A
1
,
1
x
1
+
A
1
,
2
x
2
+
⋯
+
A
1
,
n
x
n
=
b
1
A
2
,
1
x
1
+
A
2
,
2
x
2
+
⋯
+
A
2
,
n
x
n
=
b
2
⋮
A
m
,
1
x
1
+
A
m
,
2
x
2
+
⋯
+
A
m
,
n
x
n
=
b
m
\begin{gather} A_{1,1}x_1+A_{1,2}x_2+\dots+A_{1,n}x_n=b_1 \\ A_{2,1}x_1+A_{2,2}x_2+\dots+A_{2,n}x_n=b_2 \\ \vdots \\ A_{m,1}x_1+A_{m,2}x_2+\dots+A_{m,n}x_n=b_m \tag{2.16} \end{gather}
A1,1x1+A1,2x2+⋯+A1,nxn=b1A2,1x1+A2,2x2+⋯+A2,nxn=b2⋮Am,1x1+Am,2x2+⋯+Am,nxn=bm(2.16)
3、单位矩阵和逆矩阵
线性代数提供了称为矩阵逆的运算。对于大多数式(2-11):
A
x
=
b
\bm{A}\bm{x}=\bm{b}
Ax=b中的矩阵
A
\bm{A}
A,我们都能通过矩阵逆解析来求解方程组。
首先,定义一个单位矩阵:所有沿主对角线的元素都是
1
1
1,其它位置 的所有元素都
0
0
0。例如:
[
1
0
0
0
1
0
0
0
1
]
\begin{bmatrix} 1&0&0 \\ 0&1&0 \\ 0&0&1 \end{bmatrix}
100010001
在数学公式中,将保持
n
n
n维向量不变的单位矩阵记作
I
n
\bm{I}_{n}
In,形式上,
I
n
∈
R
n
×
n
\bm{I}_n\in\R^{n\times n}
In∈Rn×n。任意向量和单位矩阵相乘都不会改变,即:
∀
x
∈
R
n
,
I
n
x
=
x
(2.20)
\forall\bm{x}\in\R^{n},\bm{I}_n\bm{x}=\bm{x} \tag{2.20}
∀x∈Rn,Inx=x(2.20)
矩阵
A
\bm{A}
A的矩阵逆记作
A
-
1
\bm{A}^{\text{-}1}
A-1,其定义满足如下条件:
A
-
1
A
=
I
n
(2.21)
\bm{A}^{\text{-}1}\bm{A}=\bm{I}_{n} \tag{2.21}
A-1A=In(2.21)
此时,对于式(2-11)的方程组,可以通过以下步骤求解:
A
x
=
b
⇒
A
-
1
A
x
=
A
-
1
b
⇒
I
n
x
=
A
-
1
b
⇒
x
=
A
-
1
b
(2.25)
\begin{array}{l} &\bm{A}\bm{x}=\bm{b} \\ \rArr&\bm{A}^{\text{-}1}\bm{A}\bm{x}=\bm{A}^{\text{-}1}\bm{b} \\ \rArr&\bm{I}_{n}\bm{x}=\bm{A}^{\text{-}1}\bm{b} \\ \rArr&\bm{x}=\bm{A}^{\text{-}1}\bm{b} \tag{2.25} \end{array}
⇒⇒⇒Ax=bA-1Ax=A-1bInx=A-1bx=A-1b(2.25)
当然,这样求解是否可实现取决于能否找到一个逆矩阵
A
-
1
\bm{A}^{\text{-}1}
A-1,在接下来的章节中,会讨论逆矩阵
A
-
1
\bm{A}^{\text{-}1}
A-1的存在条件。
另外,逆矩阵
A
-
1
\bm{A}^{\text{-}1}
A-1主要是作为理论工具使用,并不会在大多数软件程序中实际使用。因为逆矩阵
A
-
1
\bm{A}^{\text{-}1}
A-1在计算机上只能表现出有限的精度,但有效的使用向量
b
\bm{b}
b的算法通常可以得到更精确的
x
\bm{x}
x。
PS:矩阵求逆的方法
对于2阶矩阵,一般用公式法: A - 1 = A ∗ ∣ A ∣ \bm{A}^{\text{-}1}=\frac {\bm{A}^*}{|\bm{A}|} A-1=∣A∣A∗。
对于3阶及以上矩阵,一般用初等变换法。
对于抽象矩阵,一般用公式推导证明。
4、线性相关和生成子空间
在求解式(2-11)表示的方程组
A
x
=
b
\bm{A}\bm{x}=\bm{b}
Ax=b过程中,如果假设矩阵
A
\bm{A}
A的逆矩阵
A
-
1
\bm{A}^{\text{-}1}
A-1存在,那么对于每一个向量
b
\bm{b}
b的值,式(2-11)都恰好存在一个唯一解。然而在事实上,对于向量
b
\bm{b}
b的某些值而言,方程组可能无解或存在无穷多个解。
需要额外说明的是,对于某个向量
b
\bm{b}
b,方程组有大于一个且小于无穷的有限数量的解的情况是不存在的,因为如果两个向量
x
\bm{x}
x和
y
\bm{y}
y都是某方程组的解,基于下面公式,对于任意实数
α
\alpha
α,向量
z
\bm{z}
z都是方程组的解。
z
=
α
x
+
(
1
−
α
)
y
(2.26)
\bm{z}=\alpha\bm{x}+(1-\alpha)\bm{y} \tag{2.26}
z=αx+(1−α)y(2.26)
从物理意义上讲,这个方程组的意义是:在规定每一步走的方向(矩阵
A
\bm{A}
A的每个列向量作为一个方向)的前提下,每一步走不同的距离(向量
x
\bm{x}
x的每个元素对应每一步走的距离),然后到达指定的位置(向量
b
\bm{b}
b)。从坐标原点出发到达向量
b
\bm{b}
b的位置有多少种走法,就有多少个解
x
\bm{x}
x。该观点可以用以下数学公式表示:
A
x
=
∑
i
x
i
A
:
,
i
(2.27)
\bm{Ax}=\sum_{i}x_{i}\bm{A}_{:,i} \tag{2.27}
Ax=i∑xiA:,i(2.27)
在数学上,上面公式中的运算操作又称之为线性组合。一组向量的线性组合,是指每个向量乘以一个与之对应的标量系数之后的和,其结果是一个新的向量。即:
∑
i
c
i
v
(
i
)
(2.28)
\sum_{i}c_{i}\bm{v}^{(i)} \tag{2.28}
i∑civ(i)(2.28)
一组向量的生成子空间,是指这组原始向量,经过任意线性组合操作后,所能到达的位置(即生成的新向量)的集合。
对于式(2-11)所表示的方程组而言,在给定
A
\bm{A}
A的条件下,不同的
x
\bm{x}
x得到不同的
b
\bm{b}
b。这些
b
\bm{b}
b所组成的集合,就叫做矩阵
A
\bm{A}
A列向量组的生成子空间。确定该方程组是否有解,相当于确定向量
b
\bm{b}
b是否在
A
\bm{A}
A列向量的生成子空间中。这个特殊的生成子空间,又叫作
A
\bm{A}
A的列空间或者
A
\bm{A}
A的值域。
为了使式(2.11)的方程组
A
x
=
b
\bm{Ax}=\bm{b}
Ax=b对任意向量
b
∈
R
m
\bm{b}\in\R^{m}
b∈Rm都存在解,则整个集合
R
m
\R^{m}
Rm都是由
A
\bm{A}
A的列空间构成的。因此,
A
\bm{A}
A至少有
m
m
m列,即
n
⩾
m
n\geqslant m
n⩾m。
但是,不等式
n
⩾
m
n\geqslant m
n⩾m只是方程组对每一个向量都有解的必要条件,但不是充分条件,因为有些列向量可能是冗余的。在数学上,这种冗余称为线性相关。如果一组向量中,任意一个向量都不能表示成其它向量的线性组合,那么这组向量称为线性无关。如果某个向量是一组向量中某些向量的线性组合,那么将这个向量加入到这组向量中,并不能增加这组向量的生成子空间。因此,如果一个矩阵的列空间构成了整个集合
R
m
\R^m
Rm,那么该矩阵至少含有一组
m
m
m个线性无关的列向量,这才是式(2-11)方程组
A
x
=
b
\bm{Ax}=\bm{b}
Ax=b对任意向量
b
∈
R
m
\bm{b}\in\R^{m}
b∈Rm都存在解的充分必要条件。需要特别说明的是,这个条件中说的
m
m
m个,是指矩阵的列空间恰好有
m
m
m个线性无关向量,而不是至少有
m
m
m个线性无关向量。这是因为不存在一个
m
m
m维向量的集合具有多于
m
m
m个彼此线性不相关的向量,但是,一个有多于
m
m
m个列向量的矩阵(即
n
>
m
n>m
n>m时),可能存在不只一组数量为
m
m
m个的线性无关向量集。(即,对于矩阵
A
∈
R
m
×
n
n
⩾
m
\bm{A}\in\R^{m\times n}\quad n\geqslant m
A∈Rm×nn⩾m来说,如果包含线性无关的列向量,则只能同时包含
m
m
m个,但是可能包含不只一组。)
上面的条件只是保证方程组至少有一个解,但如果要矩阵可逆,方程组必须只有唯一解。因此,还要保证矩阵
A
\bm{A}
A只有一组
m
m
m个线性无关的列向量。
综上所述,矩阵
A
\bm{A}
A必须是一个方阵,即
n
=
m
n=m
n=m,并且所有列向量都是线性无关的。另外,一个列向量线性相关的方阵被称为奇异的。如果矩阵
A
\bm{A}
A不是一个方阵或都是一个奇异的方阵,该方程可能仍然有解,但是不能使用矩阵逆求解,因为这个时候,逆矩阵不存在。
之前讨论了逆矩阵的左乘,同样,定义逆矩阵的右乘如下:
A
A
-
1
=
I
n
(2.29)
\bm{A}\bm{A}^{\text{-}1}=\bm{I}_{n} \tag{2.29}
AA-1=In(2.29)
对于方阵而言,它的左逆和右逆是相等的。
5、范数
在机器学习中,我们经常使用被称为范数的函数来衡量向量大小。在数学形式上,
L
p
L^{p}
Lp范数定义如下:
∣
∣
x
∣
∣
p
=
(
∑
i
∣
x
i
∣
p
)
1
p
(2.30)
||\bm{x}||_p=\big(\sum_i|x_i|^p\big)^{1\over p} \tag{2.30}
∣∣x∣∣p=(i∑∣xi∣p)p1(2.30)
其中,
p
∈
R
,
p
>
1
p\in\R,p>1
p∈R,p>1。
范数是将向量映射到一个非负值的函数,物理意义上,就是向量
x
\bm{x}
x表示的点到原点的距离。更严格的说,范数是满足下列性质的任意函数:
∙
f
(
x
)
=
0
⇒
x
=
0
∙
f
(
x
+
y
)
⩽
f
(
x
)
∗
f
(
y
)
(
三角不等式
)
∙
∀
α
∈
R
,
f
(
α
x
)
=
∣
α
∣
f
(
x
)
(z2.1)
\begin{array}{l} \bullet\quad f(\bm{x})=0\rArr\bm{x}=0 \\ \bullet\quad f(\bm{x+y})\leqslant f(\bm{x})*f(\bm{y}) &(三角不等式)\\ \bullet\quad \forall\alpha\in\R,f(\alpha\bm{x})=|\alpha|f(\bm{x}) \end{array} \tag{z2.1}
∙f(x)=0⇒x=0∙f(x+y)⩽f(x)∗f(y)∙∀α∈R,f(αx)=∣α∣f(x)(三角不等式)(z2.1)
当
p
=
2
p=2
p=2时,
L
2
L^2
L2范数称为欧几里得范数。它表示向量
x
\bm{x}
x代表的点到原点的欧氏距离。经常简单表示为
∣
∣
x
∣
∣
||\bm{x}||
∣∣x∣∣。平方
L
2
L^2
L2范数因为可以通过点积
x
⊤
x
\bm{x}^\top\bm{x}
x⊤x计算,也常被用来衡量向量大小。
在某些机器学习应用中,区分恰好是零的元素和非零但很小的元素是很重要的,这时,一般使用
L
1
L^1
L1范数来衡量向量的大小,
L
1
L^1
L1可以简写为:
∣
∣
x
∣
∣
1
=
∑
i
∣
x
i
∣
(2.31)
||\bm{x}||_1=\sum_i|x_i| \tag{2.31}
∣∣x∣∣1=i∑∣xi∣(2.31)
有时候需要统计向量中非零元素的数目,由于非零元素的数目不是范数,对向量缩放操作不会改变该向量非零元素的数目,因此,
L
1
L^1
L1经常作为表示非零元素数目的替代函数。
另外一个经常在机器学习中出现的范数是
L
∞
L^\infin
L∞范数,也被称为最大范数。这个范数表示向量中具有最大幅值(绝对值)的元素的绝对值:
∣
∣
x
∣
∣
∞
=
max
i
∣
x
i
∣
(2.32)
||\bm{x}||_\infin=\max_i|x_i| \tag{2.32}
∣∣x∣∣∞=imax∣xi∣(2.32)
有时候也希望衡量矩阵的大小,在深度学习中,常见的做法是使用Forbenius范数,类似于向量的
L
2
L^2
L2范数,即:
∣
∣
A
∣
∣
F
=
∑
i
,
j
A
i
,
j
2
(2.33)
||\bm{A}||_F=\sqrt{\sum_{i,j}A_{i,j}^2} \tag{2.33}
∣∣A∣∣F=i,j∑Ai,j2(2.33)
两个向量的点积可以用范数来表示,具体如下:
x
⊤
y
=
∣
∣
x
∣
∣
2
∣
∣
y
∣
∣
2
cos
θ
(2.34)
\bm{x}^\top\bm{y}=||\bm{x}||_2||\bm{y}||_2\cos\theta \tag{2.34}
x⊤y=∣∣x∣∣2∣∣y∣∣2cosθ(2.34)
其中,
θ
\theta
θ表示
x
\bm{x}
x和
y
\bm{y}
y之间的夹角。