深度学习(deep learning)作为深度学习领域的殿堂级作品,囊括了数学领域包括线性代数、概率论、信息论等知识,以及机器学习中的相关内容,同时还介绍了工业界实践者用到的深度学习技术,是深度学习领域最为全面、权威的著作,笔者对于这本书早有耳闻,但是因为其内容充实、数学公式较多一直未敢涉足,借这个夏天的空闲时光,拜读这部作品,希望有所收获。本篇博客内容涉及花书第二章内容,主要介绍机器学习的重要的数学武器——线性代数。
线性代数广泛应用于科学和工程中。面向连续数学,是学习机器学习相关知识的必备武器。
标量: 一个单独的数,通常用斜体表示。
向量: 一列数,有序排列。通常用小写粗体表示,如x。如果向量中每个元素都属于
R
\mathbb{R}
R,并且该向量有n个元素,那么该向量属于实数集
R
\mathbb{R}
R的n次笛卡尔乘积构成的集合,记为
R
n
\mathbb{R^n}
Rn。向量也可以看做空间上的点,每个元素是不同坐标轴的坐标。符号-表示补集索引,
x
−
1
x_{-1}
x−1表示除了
x
1
x_{1}
x1外的所有元素。
矩阵: 二维数组,每个元素由两个索引确定。通常赋予矩阵粗体的大写变量名称,比如
A
A
A。如果一个实数矩阵高宽为m和n,那么就说
A
∈
R
m
×
n
A\in \mathbb{R^{m\times n }}
A∈Rm×n。“:”表示某行或者某列的所有元素。
张量: 一个数组中的元素分布在若干维坐标的规则网格中,称之为张量。
转置操作是矩阵重要操作。以对角线为轴镜像。
矩阵的形状如果相同,可以进行标量加法,标量乘法就是矩阵每个位置的元素与标量相乘。
在深度学习中,允许矩阵和向量相加,产生另一个矩阵,换言之,即向量和矩阵的每一行相加,这种隐式复制向量到很多位置的方式称为广播。
两个矩阵
A
A
A和
B
B
B相乘,为了使乘法可被定义,矩阵
A
A
A的列数一定要和矩阵
B
B
B的行数相等。如果
A
A
A的形状是
m
×
n
m \times n
m×n,
B
B
B的形状是
n
×
p
n \times p
n×p,那么乘积结果矩阵
C
C
C的形状是
m
×
p
m \times p
m×p。
C
=
A
B
C=AB
C=AB
具体地,乘法操作定义为:
C
i
,
j
=
∑
k
A
i
,
k
B
k
,
j
C_{i,j}=\sum_{k}A_{i,k}B_{k,j}
Ci,j=k∑Ai,kBk,j
元素对应元素乘积: 又称Hadamard乘积,与两个矩阵标准乘积不同,表示为
A
⊙
B
A\odot B
A⊙B。
两个相同维度的向量点积,可以看做矩阵乘积
x
⊤
y
x^\top y
x⊤y。
矩阵乘积满足的数学规律:
单位矩阵: 任意向量和单位矩阵相乘,都不会改变。将n维向量不变的单位矩阵记作
I
n
I_n
In。形式上,
I
n
∈
R
n
×
n
I_n\in \mathbb{R^{n\times n }}
In∈Rn×n。
∀
x
∈
R
n
,
I
n
x
=
x
\forall x\in \mathbb{R^{n}},I_nx=x
∀x∈Rn,Inx=x
单位矩阵的结构很简单,所有沿主对角线的元素都是1,其他位置的所有元素都是0,如下图所示:

逆矩阵: 记作
A
−
1
A^{-1}
A−1,其定义的矩阵满足如下条件:
A
−
1
A
=
I
n
A^{-1}A=I_n
A−1A=In
逆矩阵的用法在于计算线性方程组
A
x
=
b
Ax=b
Ax=b中的向量
x
x
x。

当然,前提条件是能否找到逆矩阵 A − 1 A^{-1} A−1。
如果逆矩阵 A − 1 A^{-1} A−1存在,那么式 A x = b Ax=b Ax=b肯定对于每个向量b恰好存在一个解。但对于方程组而言,对于b的某些值,可能不存在解,可能无限多个解,但不存在多于一个解但少于无限多个解的情况。这是因为如果 x x x和 y y y都是某方程组的解, 那么 z = α x + ( 1 − α ) y z=\alpha x+(1-\alpha)y z=αx+(1−α)y也是方程组的解( α \alpha α取任意实数),z的形式可以很多种。
A的列向量可以看做从原点出发的不同方向,从而确定有多少种方法可以达到向量b。在这种观点下,向量
x
x
x中的每个元素表示我们应该沿着这些方向走多远,即
x
i
x_i
xi表示我们需要沿着第
i
i
i个向量方向走多远。
A
x
=
∑
i
x
i
×
A
:
,
i
Ax=\sum_{i}x_i \times A_{:,i}
Ax=i∑xi×A:,i
这种操作称为线性组合。形式上,一组向量的线性组合,是指每个向量乘以对应标量系数之后的和,即
∑
i
c
i
v
(
i
)
\sum_{i}c_iv^{(i)}
i∑civ(i)
一维向量的生成子空间,是原始向量线性组合后所能抵达的点的集合。
所以确定 A x = b Ax=b Ax=b是否有解,即确定向量 b b b是否在 A A A的列向量生成子空间中。这个特殊的生成子空间又称为 A A A的列空间或者 A A A的值域。
为了使方程\mathbb{R^{m}}对于任意向量 b ∈ R m b\in \mathbb{R^{m}} b∈Rm都存在解,要求 A A A的列向量空间构成整个 R m \mathbb{R^{m}} Rm。如果 R m \mathbb{R^{m}} Rm中的某一个点不在 A A A的列向量空间中,那么该点对应的 b b b无解。这就要求 A A A至少有m列,否则 A A A的列空间维度小于m。 n ⩾ m n\geqslant m n⩾m仅是方程对每一点都有解的必要条件,因为向量可能相同,出现冗余,这种冗余即线性相关。
线性无关: 如果一组向量中的任意一个向量都不能表示成其他向量的线性组合,则成为线性无关,反之为线性相关。
充要条件: 因此,如果一个矩阵的列空间涵盖整个 R m \mathbb{R^{m}} Rm,那么该矩阵必须包含至少一组m个线性无关的向量。这才是 A x = b Ax=b Ax=b有解的充要条件。
可逆条件: 需要保证 A x = b Ax=b Ax=b对于每个 b b b至多一个解,为此,要确保该矩阵至多有m个列向量。
最终成立条件: 矩阵为方阵,并且所有列向量线性无关,这种矩阵称为非奇异矩阵。
范数用来衡量向量的大小。形式上,
L
p
L^p
Lp范数定义如下:
∣
∣
x
∣
∣
p
=
(
∑
i
∣
∣
x
i
∣
∣
p
)
1
p
||x||_p=(\sum_{i}||x_i||^p)^{\frac{1}{p}}
∣∣x∣∣p=(i∑∣∣xi∣∣p)p1
其中
p
∈
R
p\in \mathbb{R}
p∈R,
p
⩾
1
p\geqslant 1
p⩾1。
范数是将向量映射到非负值的函数。直观上说,向量 x x x的范数衡量从原点到 x x x的距离。更严格说,范数是满足下列性质的任意函数:
当
p
=
2
p=2
p=2时,
L
2
L^2
L2范数称为欧几里得范数,表示从原点到确定点的欧几里得距离。平方
L
2
L^2
L2范数经常衡量向量的大小,可以通过
x
⊤
x
x^\top x
x⊤x计算得出。
平方
L
2
L^2
L2范数在原点附近增长十分缓慢,但是在某些机器学习情况下,区分恰好是零的元素和非零但值很小的元素是很重要的。这时候,
L
1
L^1
L1范数通常用来解决机器学习中零和非零元素之间的差异。
L
∞
L^\infty
L∞: 又称最大范数,表示向量中具有最大幅值的元素的绝对值:
∣
∣
x
∣
∣
∞
=
max
i
∣
x
i
∣
||x||_\infty=\max_i{|x_i|}
∣∣x∣∣∞=imax∣xi∣
有时候为了衡量矩阵的大小,深度学习中最常见的方法是使用Frobenius范数,即:
∣
∣
A
∣
∣
F
=
∑
i
,
j
A
i
,
j
2
||A||_F=\sqrt{\sum_{i,j}A^{2}_{i,j}}
∣∣A∣∣F=i,j∑Ai,j2
该方法类似于向量的
L
2
L^2
L2范数,前者是对向量操作,后者是对矩阵操作。
向量的点积也可用范数表示,具体如下:
x
⊤
y
=
∣
∣
x
∣
∣
2
∣
∣
y
∣
∣
2
c
o
s
θ
x^\top y=||x||_2||y||_2cos\theta
x⊤y=∣∣x∣∣2∣∣y∣∣2cosθ
其中, θ \theta θ表示两个向量之间的夹角。
对角矩阵: 只在主对角线上含有非零元素,其他位置都是零。用 d i a g ( v ) diag(v) diag(v)表示对角元素由向量 v v v中元素给定的对角方阵。
对称矩阵: 转置和自己相等的矩阵,即:
A
=
A
⊤
A=A^{\top}
A=A⊤
单位向量: 具有单位范数的向量,即:
∣
∣
x
∣
∣
2
=
1
||x||_2=1
∣∣x∣∣2=1
如果
x
⊤
y
=
0
x^\top y=0
x⊤y=0,那么向量
x
x
x和向量
y
y
y互相正交。如果两个向量都有非零范数,那么两个向量之间的夹角为90°。在
R
n
\mathbb{R}^n
Rn中,至多有n个范数非零向量互相正交,如果这些向量不但互相正交,而且范数为1,那么称为标准正交。
正交矩阵: 正交矩阵是指行向量和列向量是分别标准正交的方阵,即:
A
⊤
A
=
A
A
⊤
=
I
A^ \top A=AA^\top=I
A⊤A=AA⊤=I
这意味着:
A
−
1
=
A
⊤
A^{-1}=A^{\top}
A−1=A⊤
正交矩阵的优点在于求逆计算代价小。
许多数学对象可以通过将它们分解成多个组成部分或者找到它们的一些属性来更好地理解。
特征分解是使用最广的矩阵分解之一,将矩阵分解成一组特征向量和特征值。
方阵
A
A
A的特征向量是指与
A
A
A相乘后相当于对该向量进行缩放的非零向量
v
v
v:
A
v
=
λ
v
Av=\lambda v
Av=λv
其中标量
λ
\lambda
λ称为这个特征向量对应的特征值。如果
v
v
v是
A
A
A的特征向量,那么任意缩放后的向量
s
v
sv
sv也是
A
A
A的特征向量。此外,
s
v
sv
sv与
v
v
v有相同的特征值,所以通常只考虑单位特征向量。
假设矩阵
A
A
A有n个线性无关的特征向量
{
v
(
1
)
,
.
.
.
,
v
(
n
)
}
\left \{v^{(1)},...,v^{(n)}\right \}
{v(1),...,v(n)},对应着特征值
{
λ
1
,
.
.
.
,
λ
n
}
\left \{\lambda_1,...,\lambda_n\right \}
{λ1,...,λn}。将特征向量连接成一个矩阵
V
=
[
v
(
1
)
,
.
.
.
,
v
(
n
)
]
V=[v^{(1)},...,v^{(n)}]
V=[v(1),...,v(n)],使得每列是个特征向量。同理连接特征值
λ
=
[
λ
1
,
.
.
.
,
λ
n
]
⊤
\lambda=[\lambda_1,...,\lambda_n]^\top
λ=[λ1,...,λn]⊤。因此
A
A
A的特征分解可以记作:
A
=
V
d
i
a
g
(
λ
)
V
−
1
A=V{\rm diag}(\lambda)V^{-1}
A=Vdiag(λ)V−1
不是每一个矩阵都可以分解成特征值和特征向量。具体来说,每个实对称矩阵都可以分解成特征向量和特征值:
A
=
Q
Λ
Q
⊤
A=Q\Lambda Q^{\top}
A=QΛQ⊤
其中
Q
Q
Q是
A
A
A的特征向量组成的正交矩阵,
Λ
\Lambda
Λ是对角矩阵。特征值
Λ
i
,
i
\Lambda_{i,i}
Λi,i对应的特征向量是矩阵
Q
Q
Q的第
i
i
i列,记作
Q
:
,
i
Q_{:,i}
Q:,i。因为Q是正交矩阵,可以将
A
A
A看做Q沿方向
v
(
i
)
v^{(i)}
v(i)延展
λ
i
\lambda_i
λi倍的空间,如图所示:

特征分解唯一,当且仅当所有的特征值是唯一的。
正定: 所有的特征值都是正数的矩阵。
半正定: 所有的特征值都是非负数的矩阵。
负定: 所有的特征值都是负数的矩阵。
半负定: 所有特征值都是非正数的矩阵。
奇异值分解(SVD)是将矩阵分解为奇异向量和奇异值,可以得到一些与特征向量相同类型的信息。奇异值分解应用范围更广,每个实数矩阵都有奇异值分解,但不一定有特征分解。矩阵
A
A
A分解成三个矩阵的乘积:
A
=
U
D
V
⊤
A=UDV^{\top}
A=UDV⊤
假如
A
A
A是一个
m
×
n
m×n
m×n的矩阵,那么
U
U
U是一个
m
×
m
m×m
m×m的矩阵,
D
D
D是一个
m
×
n
m×n
m×n的矩阵,
V
V
V是一个
n
×
n
n×n
n×n的矩阵。
矩阵
U
U
U和
V
V
V都是正交矩阵,而矩阵
D
D
D定义为对角矩阵。
对角矩阵
D
D
D对角线上的元素称为矩阵
A
A
A的奇异值,矩阵
U
U
U的列向量称为左奇异向量,矩阵
V
V
V的列向量称为右奇异向量。其中
A
A
A的左奇异向量是
A
A
⊤
AA^\top
AA⊤的特征向量。
A
A
A的右奇异向量是
A
⊤
A
A^\top A
A⊤A的特征向量。
A
A
A的非零奇异值是
A
⊤
A
A^\top A
A⊤A和
A
A
⊤
AA^\top
AA⊤特征值的平方根。
SVD最有用的一个性质是拓展矩阵求逆到非方矩阵上。
对于问题:
A
x
=
y
Ax=y
Ax=y
希望通过矩阵
A
A
A的左逆
B
B
B来求解,得到:
x
=
B
y
x=By
x=By
但是可能无法设计一个唯一的映射将
A
A
A映射到
B
B
B。
如果矩阵
A
A
A的行数大于列数,那么上述方程可能无解,如果行数小于列数,那么上述矩阵可能有多个解。
Moore-Penrose伪逆可以解决上述问题。
矩阵
A
A
A的伪逆定义为:
A
+
=
lim
α
↘
0
(
A
⊤
A
+
α
I
)
−
1
A
⊤
A^+=\lim_{\alpha\searrow 0}(A^\top A+\alpha I)^{-1} A^\top
A+=α↘0lim(A⊤A+αI)−1A⊤
真正计算时,使用如下公式:
A
+
=
V
D
+
U
⊤
A^+=VD^+U^\top
A+=VD+U⊤
其中矩阵
U
、
V
、
D
U、V、D
U、V、D是矩阵
A
A
A奇异值分解后得到的矩阵。对角矩阵
D
D
D的伪逆
D
+
D^+
D+是其非零元素去倒数之后再转置得到的。
当矩阵
A
A
A的行数少于列数时,伪逆求解是线性方程众多解法中的一种,
x
=
A
+
y
x=A^+y
x=A+y是方程所有可行解中欧几里得范数
∣
∣
x
∣
∣
2
||x||_2
∣∣x∣∣2最小的一个。
当矩阵
A
A
A的行数多于列数时,可能没有解,这种情况下通过伪逆得到的
x
x
x使得
A
x
Ax
Ax和
y
y
y的欧几里得矩阵
∣
∣
A
x
−
y
∣
∣
2
||Ax-y||_2
∣∣Ax−y∣∣2最小。
迹运算返回的是矩阵对角元素的和:
T
r
(
A
)
=
∑
i
A
i
,
i
{\rm Tr}(A)=\sum_{i}{A_{i,i}}
Tr(A)=i∑Ai,i
通过矩阵乘法和迹运算符号可以清楚表示有些矩阵运算。例如,迹运算提供了另一种描述矩阵Frobenius范数的方式:
∣
∣
A
∣
∣
F
=
∑
T
r
(
A
A
⊤
)
||A||_F=\sum {{\rm Tr}(AA^\top)}
∣∣A∣∣F=∑Tr(AA⊤)
并且,迹运算在转置运算下是不变的。
多个矩阵相乘得到的方阵的迹,和这些矩阵中最后一个挪到最前面之后相乘的迹是相同的。
另一个有用的事实是标量迹运算后还是自身:
a
=
T
r
(
a
)
a={\rm Tr}(a)
a=Tr(a)。
行列式,记作 d e t ( A ) {\rm det}(A) det(A),将方阵 A A A映射到实数的函数。行列式等于矩阵特征值的乘积。行列式的绝对值可以用来衡量矩阵参与矩阵乘法后空间扩大或者缩小了多少。如果行列式为0,那么说明空间至少沿着某一维完全收缩了,失去了原有的体积,行列式为1,那么这个转换保持空间体积不变。
本章节内容涉及线性代数相关的基础知识,虽然在本科期间学习过,但是再次习得依旧收获颇丰,其中最让我受益匪浅的是对矩阵特征向量和特征值的解释。在本科学习期间,我对特征向量和特征值的理解只存于公式,一个特征向量对应一个特征值,然后进行相关运算,仅此而已,但是经过本章节的阅读,我总算对特征向量有了清晰的认识。首先回到向量本身,就是具有大小和方向的量,它可以形象化地表示为带箭头的线段。那么特征向量,一般只考虑单位特征向量,就是对矩阵的某些数学特征的解释,就像质因数分解、如6由素数2和3相乘得到,矩阵也是由多个相互正交的单位特征向量经过放缩得到的,而放缩的标准由特征值确定。这个理解对我来说如醍醐灌顶,恍然大悟。此外SVD,即奇异值分解,它对非方矩阵的数学性质的解释以及求伪逆的方式也让我眼前一亮,顿时觉得线性代数真是数学宇宙中充满魅力的一部分。
至于最后一小节,主成分分析,我并没有进行讲解,主要还是因为推理步骤太长,但是实际理解上并没有那么困难,它是一种线性的降维方法,在最大程度保留空间信息的前提下减少存储的内存空间。