Machine Learning From Scratch¶
Eamon’s 机器学习资料库¶
系统梳理机器学习的各个知识点,概念+原理+代码。
警告
本项目仍在早期开发阶段,如果读者发现问题或疑惑或有其他精彩想法,欢迎提交 issue
单变量微积分 Calculus Part1¶
1. 微积分简介¶
微积分最关键的概念,是帮助理解函数是如何随着时间而变化的(导数),以及如何计算一定时间内累计的总量(积分)。微积分帮助我们能用精确的语言来描述函数的这种性质。本章节将会尽量以简洁易懂的语言来讲解微积分中最核心的几个概念。
另外,如果你抽象思维能力比较差,强烈推荐 3blue1brown 的教学视频。这个系列以非常直观、可视化的方式帮助人们理解微积分和其中各种公式的意义。哪怕是已经熟读微积分的朋友,看过这个视频系列也一定会有新的收获。
微积分与机器学习的联系
机器学习中很多优化算法会用到导数的概念。例如,梯度下降中会使用导数来决定是增加还是减小权重来使得目标函数到达极值。
2. 函数与极限¶
2.1 映射与函数¶
映射 两个非空的集合A和B,如果存在一套法则f,使得A中的每个元素按照该法则都有Y中的唯一元素与其对应,则称f是A到B的映射。映射又称为算子。如果A、B是实数集(或其子集),则这个映射通常也称为函数。
函数 函数描述了一组输入与输出之间的映射关系,对于每个输入,总有唯一的确定的输出与之对应。输入也称为自变量,输出称为因变量;自变量的有效取值范围记为定义域,因变量的全体元素构成的集合称为值域。
2.2 极限的定义¶

通俗的讲,当自变量 x 的值无限接近于某个确定的数 a 的过程中(无论从 a 的左侧还是右侧接近),如果对应的函数值 f(x) 无限接近于某个确定的数值L,那么就说 L 是函数 f(x) 在 x 无限趋近于 a 时的极限。这个 a 可以是一个有限值,也可以是正负无穷大。
2.3 左极限与右极限¶
和函数极限的定义相同,唯一区别是左极限只考虑 x 从左侧趋近于 a,右极限只考虑 x 从右侧趋近于 a。如果函数在某处存在极限,则其充分必要条件是函数在该处的左极限与右极限各自存在且相等。
2.6 函数的连续性与间断点¶
2.6.1 函数的连续性¶
设函数 f(x) 在点 x0 的某一个邻域内有定义,如果 x 趋近于 x0 时,f(x)的值趋近于 f(x0),则称函数 f(x) 在点x0连续。或者说,当x的增量趋于0时,函数y对于的增量也趋于0,则函数在该点连续。在区间内的每一点都连续的函数,叫做该区间上的连续函数。
从几何意义理解,连续函数的图像是一条连续不间断的曲线。
基本初等函数在其定义域内都是连续的。包括:三角函数、指数函数、幂函数、对数函数等。
2.6.3 介值定理¶

通俗的讲,设函数 f(x) 在闭区间 [a,b] 上连续,且在该区间的端点各自取值 f(a)=A, f(b)=B, 那么对于 A 和 B 之间的任意一个数 M,在开区间 (a,b) 内至少有一个点 c 使得 f(c)=M 。
3. 导数¶
3.1 如何理解导数¶
导数的意义是,当一个变量(例如x)发生了微小的变化 dx 时,相应的另一个变量(例如y)的变化量 dy 与 dx 的比值,关键词是“微小的变化”。
从物理学角度而言,我们可以把 dx 看作是极短的一段时间, dy 是物体做直线运动经过的距离,导数 dy/dx 即某时间点上直线运动的瞬时变化率(距离/时间)。从几何学角度而言,导数就是曲线某点处的切线的斜率。下面我们从几何学的角度探讨下导数的由来。
几何学的定义
几何学中,斜率(slope)代表的是一条线段的陡峭程度,即给定一个特定的 x 方向上的变动,y 会如何改变?

基于上述定义,我们可以很容易的计算两点之间的斜率,但如果我们想知道曲线上某个特定点处(切线)的斜率呢?导数就能帮助我们解答这个问题。
在深入例子之前,我们先来明确一下切线的定义。圆的切线指的是与曲线只有一个交点的直线,但对于广义上曲线,这个定义并不精确,因为与一条曲线只有一个交点的直线可能有两条(考虑x轴和y轴相对于二次函数抛物线)。因此,更精确的定义如下:

下面我们来看如何求曲线上某特定点处切线的斜率。考虑下图 \(f(x) = x^2 + 3\) 的函数图像:

点 (1,4) 和点 (3,12) 之间的斜率计算很简单:
那么,如何计算特定点 (1,4) 处(切线)的斜率呢?自然我们会想到找到该点左右两边最近的两个点,计算这两点之间的斜率。导数的产生正来源于此,只不过我们可以用极限来替代找到两个点的过程。要求得已知曲线 f(x) 上某个特定点处切线的斜率,我们不妨在该曲线上任意位置(方便起见,假设在该点右侧好了)再取一个点,比如 (3,12),当该点沿着曲线 f(x) 无限趋近于点 (1,4) 时,此时如果上式
的极限存在,则此极限就是该点处切线的斜率。
3.2 导数的计算¶
我们以函数 \(f(x) = x^2\) 为例看下导数的计算过程。计算某点切线的斜率和计算两点之间的斜率一样,只不过现在计算的是给定点和与它无限接近的另一个点之间的斜率。我们用 h 来表示这个无穷小的距离。
- 给定函数
- 对 \(x\) 增加一个无穷小的量 \(h (h = Δx)\)
- 套用斜率计算公式
- 化简
- 将 \(h\) 设为 0 (因为 \(h\) 的极限是 0)
所以我们看到,对于二次函数 \(f(x) = x^2\), 在曲线上任何位置的斜率都等于 \(2x\).
3.3 导数的定义¶
从上节的例子中,我们总结下在特定点处切线的斜率计算公式(即如下极限)
由此,可以得到函数的导数概念:
设函数 \(y=f(x)\) 在点 \(x_0\) 的某个邻域内有定义,当自变量 \(x\) 在 \(x_0\) 处取得增量 \(h\) (点 \(x+h\) 仍在该邻域内)时,相应的函数取得增量 \(f(x_0+h)-f(x_0)\) ;如果这两者之比(即上述斜率计算公式)在 \(h\) 无限趋近于 0 时的极限存在(即左极限与右极限都存在且相等),则称函数 \(y=f(x)\) 在点 \(x_0\) 处可导,并称这个极限为函数 \(y=f(x)\) 在 \(x_0\) 处的导数,记为 \(y=f'(x_0)\)。
对于函数 \(y=f(x)\), 如果它在某开区间内每点都可导,则称函数在开区间内可导,这样对于该区间内任意一个 \(x\) 都对应了一个确定的导数值,这样就构成了一个新的函数,称为原函数 \(y=f(x)\) 的导函数 \(y=f'(x)\)。导函数也有其他几个等同的写法,如下。

从上述的例子我们可以看出,导数可以理解为曲线上某一点处切线的斜率。如果我们把曲线函数看成时间-路程的函数,那么某点处的导数也可以理解为该时间点处的瞬时速度;更精确的说,是 该时间点附近的变化率的最佳近似值 。

3.5 复合函数的求导法则: 链式法则 Chain Rule¶
对于两个函数组合起来的复合函数,其导数等于里层函数值代入外层函数的导数,乘以里层函数的导数。
更正式的定义: 如果 u=g(x) 在 x 处可导,而 y=f(u) 在点 u=g(x) 处可导,则复合函数 y=f[g(x)] 在点 x 处可导,其导数为 f’(g(x))*g’(x)
假设我们有一个复合函数如下:
它们各自对于的导数是:
计算该复合函数的导数:
下图是链式法则在特定函数上的应用:

3.6 高阶导数¶
f’(x) 是函数 f(x) 的一阶导数,对它再求导,即导数的导数叫做对 f(x) 的二阶导数,记作 f’‘(x),相应的还可以有更高阶的导数。高阶导数的写法如下图:

从几何意义上理解,一阶导数是曲线上某点切线的斜率,二阶导数是斜率的变化率,三阶导数的变化率的变化率…以此类推,阶数越高,对该点及其附近的情况描述的越精细。
3.8 几个重要的中值定理¶
3.7.1 罗尔定理¶
定理内容:如果 R 上的函数 f(x) 满足以下条件: (1)在闭区间 [a,b] 上连续 (2)在开区间 (a,b) 内可导 (3)f(a)=f(b) 则至少存在一个 ξ∈(a,b),使得 f’(ξ)=0

几何意义:若连续曲线 y=f(x) 在区间 [a,b] 上所对应的弧段 AB,除端点外处处具有不垂直于 x 轴的切线,且在弧的两个端点 A,B 处的纵坐标相等,则在弧 AB 上至少有一点 C,使曲线在C点处的切线平行于 x 轴。
3.7.2 拉格朗日中值定理¶
拉格朗日中值定理是罗尔中值定理的推广,它反映了可导函数在闭区间上的整体的平均变化率与区间内某点的局部变化率的关系。
定理内容:如果函数 f(x) 满足: (1)在闭区间 [a,b] 上连续 (2)在开区间 (a,b) 上可导 那么在 (a,b) 内至少有一点 c,使得 (f(b)-f(a))/(b-a) = f’(c)

几何意义:若连续曲线 y=f(x) 的弧 AB 上除了端点外处处具有不垂直于x轴的切线,那么曲线上至少有一点 C,使得曲线在 C 处的切线平行于弦 AB。
物理意义:对于直线运动,在任意一个运动过程中至少存在一个位置(或一个时刻)的瞬时速度等于这个过程中的平均速度。
3.7.3 柯西中值定理¶
定理内容:如果函数 f(x) 及 F(x) 满足:
(1)在闭区间 [a,b] 上连续 (2)在开区间 (a,b) 上可导 (3)对任一 x 属于 (a,b),F’(x)不等于0
那么在 (a,b) 内至少有一点 ξ,使等式
成立。
3.8 微分 Differentiation¶
3.8.1 微分的定义¶
微分和导数的概念紧密相关。
导数是指函数在某点处的 瞬时变化率 (或者说该点切线的斜率),即 y 的增量与 x 的增量的比值的极限。
微分是指函数在某点处的 变化量 ,其定义是,如果函数在某点处的增量 △y 可以分解为 A△x 与 o(△x) 两部分的和(o(△x) 是关于△x的高阶无穷小),则前者(线性主部)称为在该点相对于自变量增量 △x 的微分,记为 dy,当 △x 非常小时,△y 的值可以由这个微分来近似替代,而忽略 o(△x) 部分。这个 A 就等于该点处的导数 f’(x)。在f’(x)!=0的条件下,我们可以用微分 dy = f’(x)dx 来替代真正的增量 △y。
从几何意义来看,导数的值是曲线该点处切线的斜率,而微分的值 dy 是沿着切线方向向上纵坐标的增量,△y 的值是沿着曲线方向上纵坐标的增量,当 △x 非常小时,就可以用切线上的增量代替曲线上的增量,在数学上也称为非线性函数的局部线性化(在局部用切线段近似替代曲线段)。


对一元函数而言, 可导必可微, 可微必可导。
3.9 积分 Integration¶
3.9.1 积分的几何意义¶
函数 f(x) 的积分就对应了函数 f(x) 图像与垂线 x=a, x=b 以及x轴围成的区域面积,如下图:

a,b 两点称作积分的极限,符号 \(\int\) 源于拉丁字母 summa(求和的意思),积分表示的就是函数 f(x) 在a,b 这两个极限下的值的总和。
积分函数 F(c) 表示的是定义了积分上限的面积计算的函数:
其中,c定义了积分的上限,0是积分下限。我们记得导函数 f’(x) 表示了函数每点处的斜率,类似的,积分函数 F(c) 表示了在任意的极限下,函数图像下方的面积。要计算任意两点 a,b 之间的图像面积,我们可以通过计算 F(c) 的变化来获得:

3.9.2 积分的计算¶
那么如何计算这份面积呢?我们可以把函数图像下方的区域分割成很多微小的矩形,将矩形面积的和累加起来。例如下图是函数 \(f(x)=x^2\) 在 \(x=1\) 与 \(x=3\) 围成的区域,我们以间距 \(h=0.5\) 将这块区域切成4个矩形:

如果将矩形切分的越细,我们就能得到越近似的估计。
要找到给定函数 f(x) 的积分函数 F(x),实际上就是找到一个函数 F(x) ,其导数为 f(x)。 F(x) 也叫做 f(x) 的反导数。
例如,假设我们要寻找函数 \(f(x)=x^2\) 的积分函数 F(x),就是要找到这样一个函数使得:
通过导数公式的逆向推导,我们能得到这里的 F(x)为:
根据是否给出 a,b 这两处极限,我们把积分分为定积分与不定积分,具体定义如下:

可知,定积分是一个具体的数值(函数曲线与 x=a, x=b 以及x轴围成的区域面积),而不定积分是个函数表达式。
4. 导数的应用¶
4.2 函数单调性的判定方法¶
设函数 f(x) 在区间 I 上连续且可导:
- 如果在区间 I 内 f’(x)>0,则该区间内函数是单调增加的
- 如果在区间 I 内 f’(x)<0,则该区间内函数是单调减少的
- 如果在区间 I 内 f’(x)=0,则该区间内函数是个常数
4.3 曲线的凹凸性¶
- (向上)凸的曲线:在曲线上任取两点,连接这两点的弦总是位于曲线的下方(下图的曲线 ACB)
- (向上)凹的曲线:在曲线上任取两点,连接这两点的弦总是位于曲线的上方(下图的曲线 ADB)

4.4 凹凸性的判定方法¶
设函数 f(x) 在区间 I 上连续且具有一阶和二阶导数:
- 如果在区间 I 内 f’‘(x)>0,则该区间内函数是向上凹的
- 如果在区间 I 内 f’‘(x)<0,则该区间内函数是向上凸的
如何理解:以二次函数 \(f(x) = x^2\) 为例,其一阶导数等于 2x,其涵义即函数任何一点上的切线斜率,在 y轴右侧 2x的值恒 >0,因此该函数在 y轴右侧的区间内是单调增加的,同理在 y轴左侧是单调递减的;其二阶导数等于2,其涵义即函数任何一点上的切线斜率的变化率,在整个函数定义域内二阶导数恒 >0,因此每一点处的切线斜率会越来越大,函数图像向上凹。
4.5 曲线的拐点¶
如果在 x=c 处函数的凹凸性改变了,那么该点也称为函数曲线的拐点。寻找拐点的方法很简单,先求出令 f’‘(x)=0 的点或二阶导数不存在的点,观察这些点的左右两侧二阶导数的符号,如果两边符号相反,则该点是拐点。
4.6 函数极值、最大值与最小值¶
4.6.1 基本概念¶

极值定义:若函数 f(x) 在 x0 的一个邻域D有定义,且对D中除 x0 的所有点,都有 f(x)<f(x0) ,则称 f(x0) 是函数 f(x) 的一个极大值。同理,若对D的所有点,都有 f(x)>f(x0) ,则称 f(x0) 是函数 f(x) 的一个极小值。
对应的,函数最值的定义如下:
最小值:设函数 y=f(x) 的定义域为 I ,如果存在实数M满足:①对于任意实数 x∈ I ,都有 f(x)≥M ,②存在 x0∈I 。使得 f(x0)=M ,那么,我们称实数 M 是函数 y=f(x) 的最小值。
最大值:设函数 y=f(x) 的定义域为 I ,如果存在实数M满足:①对于任意实数 x∈I ,都有 f(x)≤M ,②存在 x0∈I 。使得 f(x0)=M ,那么,我们称实数 M 是函数 y=f(x) 的最大值。

鞍点(saddle point):目标函数在此点上的梯度(一阶导数)值为 0, 但从该点出发的一个方向是函数的极大值点,而在另一个方向是函数的极小值点。
4.6.2 费马引理(Fermat’s Theorem)¶
函数的每一个极值都是驻点,函数的导数在该点为零,或者是不可导的点。
4.6.3 如何寻找函数极值点¶
基于费马引理,我们可以通过求驻点(或不可导点)来找到函数极值点,再结合二阶导数来区分是极大还是极小值。步骤如下:
- 求导数 f’(x)
- 求函数的所有驻点(f’(x)=0 的点)和不可导点
- 观察 f’(x) 的符号在每个驻点和不可导点的左右邻近的情形,确定是否是极值点
- 如果 f(x) 在 x0 处具有二阶导数且 f’(x0)=0, f’‘(x0)!=0,则:
- 当 f’‘(x0)<0 时,函数在该点取得极大值(因为函数在该段区间是向上凸的)
- 当 f’‘(x0)>0 时,函数在该点取得极小值(因为函数在该段区间是向上凹的)
5. 泰勒公式¶
5.1 问题由来¶
假设有人问你,如何计算 cos(2) 的值?是不是觉得很困难?
有些函数,例如 f(x) = cos(x),进行函数值的计算很困难,那么有没有办法把这类函数替换成其他的近似函数,从而利用有限次的加减乘除的简单算术运算,便能求得其函数值?泰勒公式就是由此而来: 用一个多项式函数来近似任意的其他函数 。至于为什么是用多项式函数来近似而不是其他什么函数,是因为多项式函数在数学上非常“友好”,方便计算,方便求导,方便积分。
5.2 泰勒公式¶

泰勒公式的形式看似复杂,但只要理解了其本质,自己也能分分钟写出来。关于如何理解泰勒公式,知乎上排名第一的答案已经写的非常精彩了 https://www.zhihu.com/question/25627482 ,这里就不再详细展开,只把最核心的思想总结如下:
物理学上,如果想仿造一段曲线,那么首先应该保证曲线的起始点一样,其次保证起始点处位移随时间的变化率一样(速度相同),再次应该保证前两者相等的同时关于时间的二阶变化率一样(加速度相同)……如果随时间每一阶变化率(每一阶导数)都一样,那这两根曲线肯定是完全等价的。
泰勒公式的产生与上述思想完全一致:如果我们要模仿任意一个原函数 f(x),我们只需要构造这样一个多项式函数 g(x),保证这两个函数在某一点的初始值相等,1阶导数相等,2阶导数相等,……n阶导数相等,就可以做到一个很好的近似。
References
[1] | Calculus Cheat Sheet http://tutorial.math.lamar.edu/pdf/Calculus_Cheat_Sheet_All.pdf |
[2] | 《高等数学(第六版)》同济大学数学系 编,高等教育出版社 |
[3] | Essense of Calculus, 3Blue1Brown |
[4] | 麻省理工学院公开课:单变量微积分, http://open.163.com/special/sp/singlevariablecalculus.html |
多变量微积分 Calculus Part2¶
1. 偏导数¶
1.1 偏导数的定义¶
在单变量微积分中,我们已经知道了导数就是函数的变化率。对于多元函数,我们也可以研究其变化率。
以二元函数 z = f(x,y) 为例,如果将 y 看为是固定的,这时 z 就是 x 的一元函数,函数对 x 的导数就称为该二元函数 z 对 x 的偏导数。推广开来,一个多元的函数的偏导数,就是它关于其中一个变量的导数,而保持其他变量恒定。与单变量函数的导数类似,偏导数的公式如下:

如果多元函数 z 在定义域内每一点处对 x 的偏导数都存在,那这个偏导数就称为对自变量 x 的偏导函数。
需要注意的是,多元函数的偏导数存在只能保证某点 P 沿着平行于坐标轴的方向趋近于 P0 时,函数值 f(P) 趋于 f(P0),但不能保证 P 按任何方式趋近于 P0 时函数值都趋于 f(P0)。换句话说,偏导数只反映了函数沿着坐标轴正方向上的变化率,而不是任意方向。
偏导数的表示符号为 ∂,反映了多元函数沿坐标轴正方向的变化率。
2. 方向导数¶
前面提到了,函数的偏导数是函数沿着坐标轴正方向上的变化率,但如果我们要求函数在任意方向上的变化率该肿么办?这时就引入了方向导数的概念。

假设 z = f(x,y) 在 xyz 坐标系中是这样一个曲面,点 P(x0,y0) 是定义域中的一个点。我们已经知道通过求偏导数能知道该点 P 关于x轴和y轴的切线斜率,现在要求该点沿着单位向量 u =cosθ + sinθ (θ是该单位向量与x轴的正向夹角)方向的变化率(即P沿着射线L方向的变化率),类比一元函数导数的定义,如果下列极限存在:

则这个极限是函数f沿着u方向的方向导数。随着θ的变化,可以求出任意方向的方向导数。因此,方向导数反映的是多元函数在 P0 点沿着任意方向 u 的变化率,即函数的增量与 P 到 L 上另一点 P0 的距离的比值的极限。
在求上述极限时,除了用极限定义外,还可以用偏微分方法简化计算,直接得到方向导数公式:

方向导数公式的具体证明可以参考参考资料中同济大学高等数学教材 P102 页。
3. 梯度¶
在说明方向导数的时候,我们得到了方向导数公式:

设:

则这个方向导数的数量积为:

如果要让方向导数取得最大值,则夹角要为0度,即向量 I(即变化率最快的方向)与向量 A(当点P(x,y)确定时,该向量也确定)平行的时候,两者的数量积最大,函数 f(x) 的增长最快。A 即是梯度向量。换句话说,函数某点处的梯度就是函数对各个自变量的偏导数依次排序形成的向量。梯度即表示函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)增加最快,变化率最大(为该梯度的模)。
同样的,当向量I与向量A的夹角为180度时,函数值减少的最快,函数沿着这个方向的方向导数达到最小值。
最后,总结一下上面三节的关键概念:
- 方向导数:是一个数;反映的是f(x,y)在P0点沿方向u的变化率。
- 偏导数:是多个数(每元有一个),是指多元函数沿坐标轴方向的方向导数,因此二元函数就有两个偏导数。
- 偏导函数:是一个函数,是一个关于点的偏导数的函数。
- 梯度:是一个向量,每个元素为函数对一元变量的偏导数,它既有大小(其大小为最大方向导数),也有方向。
4. 多元函数的极值¶
与一元函数的情况一样,机器学习中我们经常会遇到多元函数求极值的问题。极大值和极小值统称为极值。需要注意的是,极值与最值不同,极值是一个局部概念,是在一个特定的邻域上的最大或最小值,因此也称为局部最大值或局部最小值。下面我们看如何求极值。
4.1 极值的必要条件¶
回忆一元函数求极值,如果 x 是极值点,且f’(x) 存在,则f’(x)必为0(或不可导点),但反过来导数为0的点不一定是极值点,此为一元函数极值的必要条件。
多元函数极值的必要条件也类似,以二元函数为例,设 z=f(x,y) 在某点取得极值,则该点处的梯度必为零向量,既每个偏导数都为零。
另外,定义梯度为零向量的点为多元函数的驻点。具有偏导数的多元函数的极值点必定是驻点,但驻点不一定是极值点。非极值点的驻点称为鞍点。
4.2 极值的充分条件¶
回忆一元函数求极值的过程: 如果 f(x) 在 x0 处具有二阶导数且 f’(x0)=0, f’‘(x0)!=0,则:
- 当 f’‘(x0)<0 时,函数在该点取得极大值(因为函数在该段区间是向上凸的)
- 当 f’‘(x0)>0 时,函数在该点取得极小值(因为函数在该段区间是向上凹的)
类似的,二元函数求极值过程如下:


5. 多元函数求导¶
5.1 Jacobian矩阵¶
将一个由m个函数组成的列向量,对输入向量 x=(x1,x2…xn)求导,则结果是一个一阶偏导数组成的矩阵,这样的矩阵称为雅克比矩阵(Jacobian)

例如,对下列函数求导的结果是:

5.2 Hessian矩阵¶
Hessian矩阵是由目标函数 f(x) 在点x处的二阶偏导数组成的n阶对称矩阵。函数在 x0 处的 Hessian 矩阵如下:

存在如下结论:
当G是正定矩阵时,函数f在X0处有极小值 当G是负定矩阵时,函数f在X0处有极大值 当G是不定矩阵时,函数f在X0不是极值点
Hession矩阵可以作为二阶泰勒级数在多元下的展开,因此可以使用在牛顿法求极值。
5.3 常用的函数求导等式¶

References
[1] | 《高等数学(第六版)》同济大学数学系 编,高等教育出版社 |
[2] | 《Mathematics for Machine Learning》, Marc Peter Deisenroth、A Aldo Faisal, Cheng Soon Ong, Cambridge University Press. https://mml-book.com |
线性代数¶
0. 要点汇总¶
本篇文章的要点整理如下
- 向量:抽象意义上,向量是可以对其进行加法和数乘运算的任意对象。计算机专业中,向量是一列数组。
- 标量:一个单独的数字,用来对向量进行缩放。比如乘以2相当于将这个向量拉长为原来的两倍。
- 张量:向量和矩阵的另一种说法。通俗一点理解的话,我们可以将标量视为零阶张量,向量(矢量)视为一阶张量,那么矩阵就是二阶张量,图像是三阶张量(高度、宽度、色彩通道)
- 线性组合:将向量进行缩放再相加的操作,如3i+2j。
- 张成空间:一组向量的全部线性组合所构成的向量集合
- 线性相关:向量组中至少有一个向量都可以用向量组中其他向量的线性组合来表示出来。
- 线性无关:向量组中的(任意)一个向量都无法用向量组中其他向量的线性组合表示出来。
- 基:如果向量空间中的一组向量满足:互相线性无关,张成 V,则它们是向量空间 V 的一组基。该空间的任意向量都能表达为基向量的线性组合。
- 线性变换:向量的运动,变换后保持加法和数乘两种运算。
- 矩阵:一个二维数组。本质是对运动的描述。
- 单位矩阵:任意向量与单位矩阵相乘,等于什么都没做。保持n维向量不变的矩阵叫做单位矩阵,其主对角线元素全是1,其余全是0.
- 矩阵的逆:与原矩阵相乘得到单位矩阵的矩阵。不是所有的矩阵都有逆矩阵。存在逆矩阵的矩阵也称为非奇异矩阵。
- 行列式:用来衡量矩阵参与矩阵乘法后空间扩大或者缩小了多少倍。如果行列式是0,那么空间至少沿着某一维完全收缩了,使其失去了所有的体积。
- 秩:经过线性变换后空间的维数,即该矩阵的线性无关的列(行)的最大数目。
- 范数:衡量向量“大小”的单位。常用范数有 L1 和 L2 范数(欧氏距离)。
- 对角矩阵:只在主对角线上含有非零元素,其他位置都是零。
- 单位向量:指模等于1(具有 单位范数)的向量。由于是非零向量,单位向量具有确定的方向。单位向量有无数个。
- 对称矩阵:转置和自己相等的矩阵。
- 正交矩阵:是指行向量和列向量是分别标准正交的方阵。
- 特征分解:使用最广的矩阵分解之一,即我们将矩阵分解成一组特征向量和特征值。一个变换(或者说矩阵)的特征向量就是这样一种向量,它经过这种特定的变换后保持方向不变,只是进行长度上的伸缩而已。
1. 向量 Vector¶
1.1 向量是什么¶
我们从最基础的向量的概念讲起。向量是线性代数最基本的元素,在不同学科中向量的涵义略微有所不同。

物理学中的向量:空间中的箭头,由长度和它所指的方向决定。物理学中的向量可以自由移动,只要长度与方向不变,向量就是同一个。
计算机专业中的向量:有序列表。
数学中的向量:抽象意义上,数学中的向量可以是任意的东西,只要可以对它们进行 加法和数乘 运算即可。这也意味着,加法和数乘是向量最底层的运算。一切复杂和抽象的东西归根结底都源自于这两种运算,这一点贯穿线性代数的始终。但为了方便起见,我们之后还是以直角坐标系中的箭头来理解向量。
和物理学中的向量一样,线性代数中的向量也是有大小和方向的,但必须注意的是:线性代数中的向量不能像物理学中的向量那样随意挪动。线性代数中的向量全部是以原点为起点的向量。
以二维平面直角坐标系为例,线性代数中,向量的坐标由一对数字构成。这一对数字指示了如何从向量的起点(即坐标原点)出发到达向量的终点。第 1 个数字 -2 告诉我们从原点出发沿 x 轴负方向移动 2 个单位的距离,第 2 个数字 3 告诉我们从原点出发沿 y 轴正方向移动 3 个单位的距离,然后我们就能到达向量的终点了。

关于“向量”的概念就先说到这里。虽然本章节使用的向量基本都是二维直角坐标系中可以用箭头来表示的几何向量,但记住向量可以是任何东西,可以是多项式,是数组,是函数等等,只要能满足特定的性质即可。
1.2 向量的运算¶
1.2.1 向量的加法¶
如果将向量看看成是某种形式的运动,那么两个向量相加就是相继执行向量对应的运动。以下图两个向量为例,先沿 x 轴正方向移动 1 + 3 个单位,再沿 y 轴正方向移动 2 + (-1) 个单位,最终的结果就是两个向量相加的结果。这也对应了向量加法的数学形式,即把向量中对应的元素相加。

1.2.2 向量的数乘¶
向量的数乘运算就是对向量进行缩放,更精确的说是将向量中的各个元素分别进行缩放。例如,乘以2相当于将这个向量拉长为原来的两倍,乘以1/3相当于将这个向量缩短为原来的1/3,乘以-1相当于将这个向量调转方向。这个拉伸、压缩以及反向的过程就称为“缩放”。这里的2、1/3、-1或任何用于缩放的数值,称为“标量” scalar。标量,就是一个单独的数字,一般用小写英文字母来表示。

2. 线性组合、张成的空间与基 Linear Combination, Span and Basis¶
2.1 运算封闭¶
运算封闭是数学中一个重要概念。对于一个集合,如果其中任意两个数在进行一种运算后,结果仍在这个集合中,那么我们说这个集合对于这种运算是封闭的。
换句话说,封闭研究这样一个问题:当我定义了一种运算后,所可能产生的所有结果是什么?对于向量而言,问题就是,当我初始拥有了一定数量的向量后,对他(们)进行加法和数乘运算,所可能产生的整个向量集合是什么?这就引出了向量空间的概念,我们之后会讲到。
2.2 线性组合¶
以二维平面直角坐标系为例,i, j 分别是沿xy坐标轴方向的单位向量(1,0) 与 (0,1)。那么,坐标平面上的任意一个向量,都可以看作是 i 和 j (称为基向量)的缩放再相加的结果。基向量缩放的倍数对应向量的各个分量,即向量对应的坐标。例如,向量 (3,-2) 就可以看成是 3倍i 与 -2倍j 相加的结果。

一组基向量就对应一个坐标系,选择不同的基向量就构造出了不同的坐标系。 同一个向量,在不同的坐标系下(即采用不同的基向量),其坐标值也要相应地发生变化。
这一“将向量进行缩放再相加”的操作,即 线性组合 。

2.2 向量张成的空间¶
在二维平面中,选取 2 个向量,然后考虑它们所有可能的线性组合,我们会得到什么呢?这取决于我们选择的 2 个向量。
通常情况下,我们会得到整个平面:

如果不巧,选择的 2 个向量恰好共线的话,那它们的线性组合就被局限在一条过原点的直线上了。

向量 v, w 的 全部线性组合所构成的向量集合称为向量 v, w 所 张成的空间 。张成的空间,实际上就是通过加法和数乘这两种运算,能获得的所有可能的向量集合是什么。

2.3 线性相关与线性无关¶
将线性组合的想法扩展到 3 维空间中。想象 3 个 3 维向量,它们所张成的空间会是什么样的呢?这取决于我们选择的 3 个向量。
- 通常情况下,我们会得到整个 3 维空间
- 当选择的 3 个向量共面时,它们所张成的空间是一个过原点的平面
- 当 3 个向量共线时,它们所张成的空间是一条过原点的直线
- 当 3 个向量都是零向量时,它们所张成的空间只包含零向量
显然,在考虑向量所张成的空间时,有些向量是多余的。例如,情况 b ,确定一个平面只需要 2 个向量,而我们却用了 3 个向量,这意味着,有 1 个向量是多余的;情况 c,确定一条直线只需要 1 个向量就够了,而我们用了 3 个向量,有 2 个向量是多余的。数学上,我们用线性相关来描述这样的现象。
当我们说几个向量所构成的向量组 线性相关 时,意思是向量组中至少有一个向量都可以用向量组中其他向量的线性组合来表示出来。换句话讲,这个向量已经落在其他向量所张成的空间中,它对整个向量组张成的空间是没有贡献的,把它从向量组中拿掉,并不会影响向量组所张成的空间。从几何角度举个例子,如果二维平面中两个向量线性相关,则其中一个向量可以写成另一个向量的倍数形式(两向量共线)。
线性无关 指的是,向量组中的(任意)一个向量都无法用向量组中其他向量的线性组合表示出来。换句话说,向量组中的每一个向量都为向量组所张成的空间贡献了一个维度,每一个向量都缺一不可,少了任何一个向量,都会改变向量组所张成的空间。
关于线性相关与线性无关,以下是一些重要性质:
- 一组向量组要么是线性相关,要么是线性无关,没有第三种情况。
- 如果一组向量中有至少一个零向量,或有两个相同的向量,那它们肯定线性相关。
3. 矩阵与线性变换 Linear Transformation/Mapping¶
3.1 线性变换¶
首先来理解线性变换。变换,本质就是函数。在微积分中,我们了解了函数描述了一种映射关系,输入内容,输出唯一与其对应的结果。在线性代数中,我们输入一个向量,输出另一个向量。
之所以用“变换”这个术语,其实暗示了我们能够以某种方式可视化 输入—-输出 关系,暗示我们要从运动的角度去理解这一过程。变换让向量从一个地方(对应输入向量),运动到了另一个地方(对应输出向量)。
如果用空间中的点来表示向量,则可以把变换可视化为下图这样:

经过变换后,所有点运动到了新的位置:

如果用等间距的平行网格来表示向量,则可以把变换可视化为下图这样:

经过变换后,网格变成了这样:

那么线性变换是什么意思呢?如果一个变换同时具有以下 2 条性质,则它是一个线性变换。
- 变换前后,所有的直线仍然是直线
- 变换前后,原点保持不变

放在二维直角坐标系这一特定场景下,具体的体现就是施加线性变换后,整个坐标系的原点不变,并使网络线保持平行且等距分布。

那么,我们要如何用数学语言描述一个线性变换呢?答案很简单,我们只需要知道变化前后的两个基向量i 和 j 的位置。
以平面直接坐标系为例,假定我们有一个向量 v = [-1,2] ,由上一节可知,我们可以将它看成是 2 个基向量 i, j 的线性组合 v = -1i + 2j。

在某个线性变换的作用下,i, j 以及 v 都运动到了新的位置。

线性变换前后网络线保持平行且等距分布,这一性质有一个重要的推论:线性变换后的 v 仍然是变换后的 i 和 j 的线性组合,并且线性组合的系数和变换前一样(仍然是 -1 和 2)。

本例子中,变换后的基向量 i 和 j 分别是 [1,-2] 和 [3,0]。由此,我们可以轻松计算出变换后的v 的坐标是 [5,2]。

事实上,我们只要知道线性变换之后的基向量 i, j 的位置(坐标),就可以计算出任意一个向量经过同样的线性变换之后的位置(坐标)。

这意味着,对于一个线性变换,我们只需要跟踪基向量在变换前后的变化,就可以掌握整个空间(即全部向量)的变化。我们将线性变换后的基向量坐标按列组合起来,可以拼接成一个矩阵。线性变换的全部信息便都包含在这个矩阵当中了。
对于二维空间的线性变换,用一个 2×2 的矩阵就可以完全确定。这个矩阵的 2 列 表示 2 个转换后的基向量的坐标,如下图所示。

那么,任何向量经过该线性变换之后,其新坐标的计算方法都是这样。记住,所有的变换都只是简单的“对基向量缩放再相加”。

通过这种方式,是否可以更轻松的理解矩阵与向量的乘法?我们可以把矩阵的每一列看作变换后的基向量,它描述了一种特定的线性变换,而矩阵与向量的相乘,就是将这个线性变换作用于给定向量。
简而言之,选定基之后, 向量刻画对象,矩阵刻画对象的运动,用矩阵与向量的乘法施加运动;矩阵的本质是运动的描述。 一旦理解了这点,线性代数之后的各个主题,包括矩阵乘法、基变换、特征值等都会非常直观易懂。
3.2 矩阵与基本运算¶
上一节中,我们从线性变换的角度解释了矩阵的本质,下面我们简单温习下矩阵的基本数学概念。这些概念在任何一本代数教材中都可以轻易找到。
3.2.3 矩阵乘法¶
矩阵加法和数乘都很好理解,让很多人头疼的矩阵乘法。 3.1 中我们提到,矩阵表示了一种线性变换。有些时候我们会进行多次线性变换,比如对向量先旋转再剪切,但无论经过多少次,最后的总体作用还是一个线性变换,这样的变换可以看做是由多个独立变换组合成的复合变换。
那么如何描述这类复合变换呢?一样道理。麻烦的方法是,我们把多个线性变换拆开分别看,例如下图,对向量先施加一个旋转变换,再施加一个剪切变换,注意矩阵是往左侧不断叠加的:

表示的就是对给定的向量先进行旋转,再进行剪切。但无论中间过程是什么,最后的结果都应该和复合变换的结果完全相同。复合矩阵反应的是旋转+剪切的总体效应。从这个角度来说,新的这个矩阵(复合矩阵)可以看做最初两个矩阵的积。

关键点到了。很多人对矩阵的乘法计算只知道死记硬背,但一旦理解了矩阵相乘内在的几何意义(即两个线性变换的相继作用),那么矩阵相乘就是手到擒来的事。
首先,需要记住一点,矩阵的相乘应该从右往左读,即先应用靠右边的变换,再依次向左。以下图的为例,假设我们的原始基向量是 i 和 j,经过矩阵 M1 和 M2 的作用后会变成怎样的新基向量呢?
可以看到,j 经过 M1 的作用后变成了 [-2,0], [-2,0]再经过 M2 的转换变成了 [0,-2],因此新的基向量 j 就是 [0,-2],也就是复合矩阵的第二列。和矩阵乘以向量的机制完全一样。

推广到任意矩阵,就得到了我们在教科书中常见的矩阵乘法公式:

或者更广义的:

如此,把矩阵乘法理解为 连续的几次线性变换 ,我们也能很容易理解,矩阵 A*B 的结果和矩阵 B*A 的结果是不一样的,因为操作顺序的不同,产生的影响也不同。比如,先对 i 和 j 基向量先往x轴方向拉伸一倍,再顺时针旋转90度,与先旋转90度再拉伸,结果肯定不一样。
同样,我们也能轻易的理解矩阵乘法的结合律为什么合理了。你当然可以通过数学的方法证明等式左右两边的计算结果一致,但当你明白矩阵乘法实际的意义是相继的进行线性变换后,那么答案简直不言自明—— (AB)C 与 A(BC) 做的完全就是同一件事:先进行C变换,再进行B变换,最后进行A变换,根本不需要证明什么。

需要注意的是,矩阵的标准乘积(如上所述)不是矩阵中对应元素的乘积,但那样的矩阵操作也是存在的,称为元素对应乘积(element-wise product)或 Hadamard 乘积。
3.2.4 单位矩阵¶
单位矩阵:对角线为1,其余位置都为0 的矩阵,通常记作 I。任意向量与单位矩阵相乘,都不会改变,得到自身。
把矩阵理解为施加的线性变换,矩阵的每一列就是线性变换后的新的基向量坐标组合起来,那么单位矩阵对应的变换就是——什么都没做,因为新的基向量和原始的基向量一模一样。如此,便可以轻松的理解单位矩阵的各种性质,例如 A * I = A = I * A。

5. 行列式 Determinant¶
之前通过网格线可视化线性变换的图片中我们可以看到,线性变换中有些将空间向外拉伸,有些将空间向内挤压,有件事对理解这些变换很有用,就是测量线性变换具体对空间产生了多少拉伸或压缩,换句话说,就是测量一个给定区域面积扩大或减小的比例。
以下图为例,假设我们的新基向量是[3,0] 和 [0,2],经过变换后,原先 1*1 的单位正方形区域的面积变成了 3*2 = 6 即原来的6倍。

实际上,我们只需要观察这个单位正方形变换后的面积变化比例,就等于知道了其他任意区域的面积变化比例,因为对于其他任意的方块来说都会有相同的变化,这是由线性变换产生网格线保持平行且等距分布这一特性推断出的。而这个变化的比例,就是我们常说的行列式。
如果说一个线性变换的行列式是3,那就是说它将一个区域的面积变化为原先的3倍。

如果一个线性变换的行列式为0,则说明它将原来的二维平面压缩到了一条线(甚至一个点)上,此时所有区域的面积都为0。换句话说,探究一个矩阵的行列式是否为0,就能了解这个矩阵对应的线性变换是否将空间压缩到了更低维度(例如从二维降维到一维空间)。

行列式还可能是负值。从几何意义上如何理解将面积变化为原来的负数倍呢?如果将二维空间想象成一张白纸,那么这个变换相当于将纸张翻转到了另一面。这类变换改变了空间的定向。因此,负值表示空间翻转了,但行列式的绝对值仍然表示区域面积的缩放比例。
放到三维空间中,行列式的意义依然相同,告诉我们单位体积(即1*1*1的立方体)在变换后的缩放比例。当行列式为0时,这个立方体降维成了一个平面或一条直线,甚至一个点。
行列式的计算
二维矩阵的行列式计算公式很简单,但下图可以帮我们理解为什么是这样。 ad - bc 的结果就是黄色平行四边形的面积,也就是相对于单位正方形变化的比例。

然而就我个人而言,这些计算完全可以由电脑完成,死记硬背行列式的计算公式、甚至三阶、四阶行列式的公式并无太大意义,理解背后的意义和原因才更重要。这也是很多人觉得学习线性代数痛苦的原因,国内的大部分课本只会让你沉浸于各种奇怪的计算数学符号中,却根本无法让你知道为什么会是这样。比如下面这个定理:

两个矩阵相乘的行列式,等于矩阵各自行列式的乘积。
如果用数值的方法证明,大概可以写5张A4纸。但如果你明白了行列式的本质,那又是不言自明:左边的等式代表先进行 M2 矩阵代表的线性变换再执行 M1 所代表的线性变换之后,面积或者体积所变化的比例。右边的式子是两个线性变换使面积或体积变化的比例的乘积。因为两边线性变换之后的结果是一样的(执行顺序一样),所以比例肯定也是一样的
6. 逆矩阵、秩、列空间、与零空间¶
6.1 逆矩阵¶
前面章节中,我们通过线性变换理解矩阵与向量的运算,这一章我们仍然用线性变换来理解逆矩阵、列空间与零空间这三大概念。Again,个人以为理解这些概念的意义比会计算重要的多,因此计算方法,例如高斯消元法、行阶梯形等不会在这里介绍。
我们都知道,矩阵的一大用途的帮助我们解方程组,比如,我们可以将一个方程组写为以下线性方程组的形式:

这里,矩阵代表了某个线性变换,所以从几何意义上理解,求解该方程组的未知量 x,y,z 等同于寻找一个向量 x,使得它在经过 A 的变换后与向量 v 重合。
我们来看一个二元方程组:

这个方程组 Ax = v 的解依赖于矩阵 A 所代表的变换,是将原始空间挤压到一个更低维空间,还是保持不变,即 A 的行列式是否是0.
如果行列式不为0,即空间的维度不变,那么只可能有一个向量在变换后与 v 重合,可以通过对 v 做逆变换来得到 x 向量。这里对 v 的逆变换就对应了另一个线性变换,也称为 A 的逆。例如,如果 A 变换是顺时针旋转90度,那么 A 的逆就是逆时针旋转90度。简单的说,如果先施加 A 变换,再施加 A 的逆,那么又回到原始状态。由此,我们给出逆矩阵的正式定义:

当我们通过计算机得到 A 的逆矩阵后,求解向量 x 也就迎刃而解了,在等式两边同左乘 A 的逆即可。其几何意义对应于对 v 进行逆向的变换,还原为 x。 值得注意的是,不是所有的矩阵都有逆矩阵。存在逆矩阵的矩阵也称为 非奇异矩阵 ,不存在逆矩阵的矩阵称为 奇异矩阵 。

如果行列式为0,矩阵 A 所代表的变换将空间压缩到了更低的维度上,此时 A 没有相应的逆变换 ,直观的理解就是我们没有办法将一个低维空间的东西变换到高维空间(比如把一条直线还原到一个平面),因为高维的空间包含更多的信息,压缩成低维后那些信息都已经丢失了,不可能恢复那些丢失的信息。
行列式为0时,方程式的解可能也存在,就要看变换后的向量 v 是否在变换后的空间内,如果不在,就无解,如果在,就有无数解。
在很多教科书上,你会读到这样一段解释: 方程组 Ax = v 有解当且仅当 v 是 A 的各列的线性组合 。细心体会一下,这与我们上一段说的其实是一回事。
除了用行列式为0来描述矩阵变换后的结果,我们还可以更精确的描述变换后空间的维数,这里就引入了一个新的概念:秩。
6.2 矩阵的秩 Rank¶
6.2.1 秩的定义¶
秩 就代表了变换后空间的维数。如果变换后所有的向量都落在一条直线上,那么这个变换的秩为1;如果变换后所有的向量都落在一个二维空间上,那么这个变换的秩为2。
对于一个 2*2 的矩阵来说,它的秩最大只能为2,因为它的2个基向量最多张成二维空间。对于 3*3 的矩阵,它变换后的结果可能为一个一维、二维或三维空间。
更正式的定义:一个矩阵 A 的列秩是 A 的线性无关的列的极大数目。类似地,行秩是 A 的线性无关的行的极大数目。矩阵的列秩和行秩总是相等的,因此它们可以简单地称作矩阵 A 的秩。
6.3 列空间 Column Space¶
对向量 x 施加线性变换,变换矩阵的各列可以看作基向量变换后的坐标,变换矩阵的各列张成的空间就是 列空间 。所以矩阵的秩也可以理解为,列空间的维数。秩最大的情况就是与矩阵的列数相等,称为满秩。
值得注意的是,零向量,即原点一定包含在任何列空间里,因为线性变换必须保持原点位置不变。对于满秩变换来说,原点是唯一变换前后不变的向量,但对于非满秩变换来说,可能有一系列的向量在变换后变成了零向量。为什么呢?
6.4 零空间 Null Space/Kernel¶
想象一下,如果一个线性变换将2D空间压缩到一条直线上,那么沿着某个特定方向直线上的所有点都会被压缩到原点(想象把一张纸压成一条线)。同样的,如果将一个3D空间压缩到一个平面上,也会有一整条直线上的向量变换后落在原点(想象把一个立方体压成一张纸),如果将一个3D空间压缩到一条直线上,那就会有一整个平面上的向量变换后落在原点。
变换后落在原点的向量的集合,称为矩阵的 零空间 或者核(kernel)。

如上图所示,假设 V → W 是一个线性变换, 象 (Image)指的就是所有V中的向量所能映射到的W中的所有向量, 核 (Kernel)指的就是V中映射为W中零向量的元素整体。根据定义,零空间就是线性齐次方程组 Ax = 0 的所有解的集合。
最后,总结一下,变换矩阵是满秩,等价于矩阵各列向量线性无关,等价于矩阵的行列式不为0,等价于 Ax=0 仅有唯一解零向量,等价于矩阵存在逆矩阵。
7. 非方阵¶
之前我们讨论的矩阵都是方阵,例如用 2*2 的矩阵表示二维向量到二维向量的变换。那么如何理解非方阵呢?很简单,仍然是线性变换,但是是从某个维度转换为另一个维度的坐标。
以一个 3*2 的矩阵为例,它的几何意义是将输入的二维空间映射到三围空间上。 矩阵有2列表示输入空间有2个基向量(因此是二维输入空间),有3行表示每一个基向量在变换后用3个独立的坐标来描述。
8. 模、点积与正交矩阵¶
8.1 向量的模 Norms¶
当我们在几何平面上表达向量时,我们容易理解一个向量的“长度”即它从原点到箭头终点的线段长度,这就引出了模的概念。

只要满足以上3条性质,就是广义上的模。最常见的模即 L1 和 L2 Norm,俗称曼哈顿距离和欧氏距离:


8.2 向量点积 Dot Product¶
向量的点积(也称为内积/数量积),就是对两个向量对应位置的元素一一相乘之后求和,结果是一个标量。如果对一个向量本身进行点积,得到的其实就是该向量的 L2 模的平方。

从几何角度理解,向量之间的点积就是其中一个向量在另一个向量上的投影长度,乘以另一个向量的长度。因此,点积的主要用途就是判断向量之间是否正交。

很显然的,如果两个向量方向垂直(正交),点积的结果为0。如果方向相反,点积的结果为负值。当方向完全一致时,点积的值最大。
这两者是如何联系起来的?
首先,我们有一个从二维空间到数轴的线性变换,假设我们并不知道什么向量的点积运算公式,而只是将空间上的点投影到数轴上。

因为这个变换是线性的,所以必然可以用一个1行2列的矩阵描述。这个矩阵 [ux uy] 即变换后的基向量 i 和 j 的坐标,也就是基向量在新数轴上的投影。

而又因为1*2矩阵与一个二维向量相乘的过程,和将这个矩阵转置过来,与向量做点积的过程相同,所以这个投影的变换必定与某个二维向量有关。

由此我们得到结论,任何时候一个线性变换,如果输出空间是一维的数轴,不管这个变换是如何定义的,空间都会存在一个唯一的向量与这个变换相关,施加该线性变换和做点积效果是一样的。换句话说,两个向量的点积,就是将其中一个向量转换为线性变换,施加在另一个向量上。
这是数学中对偶性的一个体现。一个向量的对偶,是它定义的线性变换。一个多维空间到一维空间的线性变换的对偶,就是多维空间中的某个特定向量。
8.3 正定矩阵¶
正定矩阵在机器学习,特别是矩阵分解中起着重要作用,它与向量点积密切相关。
定义:A是n阶对称方阵,如果对任何非零向量x,都有 \(x^{T}Ax > 0\) (其中 \(x^{T}\) 表示x的转置),就称A是正定矩阵。 如果把等式的符号改为 >=0,则称A是半正定矩阵。
从直观的角度理解,Ax 是对向量 x 施加线性变换A,假设变换后的向量 y = Ax,则正定矩阵可以改写为:xy > 0,即这两个向量的点积大于0,从几何上就是说,这两个向量的方向一致(夹角小于90度)。因此,正定、半正定矩阵表示的是一个向量经过该矩阵对应的线性变化后的向量,与其本身的夹角小于(等于)90度。
从正定矩阵的定义 \(x^{T}Ax > 0\) 我们也能推导出对于任何非零向量 x, Ax != 0 ,因此要让 Ax = 0 成立则 x 只能是零向量,即正定矩阵 A 的零空间只包含一个零向量。另外,正定矩阵的对角线上的元素全部为正,通过令 x 为单位向量即可证明得到。
8.4 夹角与正交性¶
8.4.1 向量的夹角¶
8.2 中我们已经提过,从几何角度理解,向量之间的点积就是其中一个向量在另一个向量上的投影长度,乘以另一个向量的长度,即两个向量的模(长度)的乘积,再乘以向量夹角的余弦值。因此,这个夹角的计算公式可以写为:

两向量的点积如果是0,则称它们互相正交。如果两个向量的模都等于1,则称为标准正交。
9. 叉积¶
两个二维向量的叉积的大小,等于这两个向量构成的平行四边形的面积。同时,这个面积也是有正负号的,如果向量 v 叉积 w,v 在 w 的左侧,则面积为负。


要计算叉积的值,就要用到之前行列式的概念。记得行列式表示的是线性变换后单位区域的面积缩放的比例,在这里就相当于我们要计算的平行四边形的面积,因为这个平行四边形就来源于面积为1的单位正方形。
两个三维向量的叉积,结果是一个新的三维向量。这个向量必然与原来两个向量确定的平面垂直,并且其长度与这两个向量张成的平行四边形的面积相同。

10. 基变换 Basis Change¶
在直角坐标系中,任何一个向量(点的坐标)都可以看做是对 基向量 i 和 j 缩放的标量 。将这两个经过缩放的基向量相加就是坐标要描述的向量。

这个视角下,任何一个向量的第一个数字可以看成是(从原点)向右的运动,第二个数字是向上的运动,而这个事实取决于与我们选择的基向量 i [1,0] 和 j [0,1],因为这两个向量是我们进行缩放的对象。那么如果我们使用不同的基向量会怎么样?
假设现在我们有了另一组基向量 b1 和 b2,在我们的原始坐标系中,我们用 [2,1] 来描述 b1,[-1,1] 来描述 b2.

于是,虽然我们关注的是空间中的同一个向量,但在原坐标系中它是[3,2],在新的坐标系中就是另一个表达了(不过记住,无论是什么坐标系,原点是同一个)。这就好比两种语言描述同一个事物。
那么如何在不同的坐标系之间互相转化呢?
先看如何把新坐标系中向量的坐标转换为老坐标系。很简单,用新坐标系中的向量的坐标,数乘用老坐标系表达的新基向量,就得到了在老坐标系中向量的对应表达(黄色向量)。

注意,这就是一个矩阵与向量的乘法。我们之前已经从几何上理解了,矩阵向量乘法相当于对向量做了一个特定的线性变换,这里也可以同样的方法去理解。这个由新坐标系中的基向量构成的矩阵可以看成是一个线性变换,它将老坐标系中的基向量 i 和 j 转换成新基向量 [2,1] [-1,1].
同理,已知老坐标系中向量的坐标,如何知道它在新坐标系中的坐标呢?很简单,逆向变换一下,用老坐标系中向量的坐标,乘以新的基向量构成的矩阵的逆就行了。
用两张图总结一下不同坐标系之间的相互转化:


上面我们讲了如何在不同坐标系上表达同一个向量,那么如何用类似的道理来描述不同坐标系上的同一个线性变换(矩阵)呢?例如,我们知道在老坐标系中,逆时针90度的旋转可以用矩阵:

来表示。注意,我们的原始基向量 i[1,0] 和 j[0,1] 经过90度旋转后变成了 [0,1] 和 [-1,0], 组合在一起就变成了我们的变换矩阵。那么如何在新坐标系中描述这个变换呢?
首先从新坐标系的任一向量出发,例如 [-1,2]。
然后,对其施加基变换,即乘以新的基向量构成的矩阵。这时得到了该向量在老坐标系中的表达。

接着,把结果左乘我们老坐标系下的线性变换矩阵,这时就得到了变换后的向量,不过是用老的坐标系描述的。

最后,左乘新基向量变换矩阵的的逆,大功告成!它接收任何用新坐标系描述的向量,输出用新坐标系描述的变换后的向量。

总的来说,每当我们遇到这样一个式子 \(A^{-1} MA\) 的时候,这就暗示着一种数学上的转移作用,中间的矩阵代表着一种所见的变换,另外两个矩阵代表着转移作用,也就是视角(坐标系基)的变化,矩阵的乘积还是代表着同一种变换,只不过是从其他人的视角来看的。
这里也引出了 相似矩阵 的概念。对于同一个线性变换,不同基下的矩阵,称为相似矩阵。对于相似矩阵,它们的特征值、行列式和矩阵的迹都一致,因此这几个参数就是描述一个线性变换的关键,因为它们都和矩阵选择的基无关。
11. 特征向量、特征值、特征分解与奇异值分解¶
11.1 特征向量与特征值¶
与行列式类似,矩阵的特征值和特征向量提供了一个新的角度来“描述”矩阵的特性。一个矩阵代表的线性变换通常可以由其特征值和特征向量完全描述。
对于矩阵向量乘积,有两种情况:大多数情况下,向量经过线性变换后离开了其所张成的空间(该向量所在直线所有向量的集合),但是一些特殊的向量留在他们张成的空间中。意味着 矩阵对它的作用仅仅是拉伸或者压缩 ,矩阵对于该向量的乘法作用只相当于一个标量。用数学的语言说,就是这样:

以下图中的变换矩阵为例,基向量 i 在该矩阵的变换作用后,仅仅是沿着x轴方向拉伸了3倍,而 i 张成的空间是x轴,因此向量 i 经过线性变换后仍然留在其张成的空间中。

这些特殊的向量就叫做特征向量,伸缩变换的比例叫做特征值。注意,特征值可以有正有负,对应着方向。此外,也容易看到,和基向量 i 共线的任意向量也和 i 一样,在矩阵的作用后只是拉伸为了原来的3倍,因此任意向量 ci 也是该矩阵的特征向量,具有相同的特征值。对于一个矩阵来说,相同特征值的特征向量的集合称之为 特征空间 。
二维线性变换矩阵不一定有特征向量,例如旋转90度就没有(严格的说是没有实数特征向量),因为每个向量都发生了旋转离开了它张成的空间。
另外,关于特征值,还有几个有趣的定理:
- 矩阵的行列式等于其特征值的乘积
- 矩阵的迹(对角线元素之和)等于其特征值之和
11.2 矩阵的对角化与特征分解¶
对角矩阵,即除了对角线之外所有元素都为0的矩阵,结构简单,计算行列式、矩阵的幂和逆都相当迅速。对角矩阵的行列式就是对角线上所有元素的乘积,其k次幂就是把对角线上每个元素进行k次幂计算,其逆矩阵就是对角线上每个元素的倒数(除了0之外)。因此,如果能把一个矩阵转换到对角矩阵的形式,会使得计算方便很多。
在知晓了特征向量和特征值的概念之后,如果转换矩阵的基向量恰好是特征向量的话,则将坐标系变换后(基向量变换后),对应的变换矩阵将变成一个对角矩阵,对角元是特征向量对应的特征值。如果变换矩阵有足够的特征向量来张成初始矩阵的列向量所张成的空间的话,那么就我们就可以通过变换坐标系,把原矩阵变成对角矩阵。
在上一节已经讲到可以通过 \(A^{-1} MA\) 这种形式将一个线性变换矩阵转移到另一个坐标系的表达,那么矩阵对角化就是将原矩阵转变到特征基的坐标系。
例如,我们已经知道原始变换矩阵:

对应的两个特征向量是 [1,0] [-1,1],那么经过

形式的变换,产生的新矩阵必然是对角矩阵,对角元对应特征值。要计算上述变换矩阵的100次幂,可以先将它转换到特征基,在那个新坐标系中计算100次幂,然后再转换回老的坐标系中。
因此,如果存在一个矩阵 A 使得原始矩阵 M 经过 \(D = A^{-1} MA\) 变换后能得到对角矩阵 D,则称 M 是可对角化的,换言之 M 是可对角化的等同于存在一个相似矩阵并且是对角矩阵。
对矩阵进行 特征分解 就是把原矩阵分解为其特征值与特征向量的矩阵之积的形式,即 \(M = ADA^{-1}\) ,也就是上述对角化的逆运算,本质上说的是一件事。D 是对角矩阵,对角线上的元素就是 M 的特征值,D 的维数就是 M 有多少个线性无关的特征向量(即 A 的秩)。
只有方阵才能进行特征分解。对于对称矩阵来说,它总是可对角化的。但如果不是对称矩阵,则不能保证可以转化为对角矩阵。那么对于非方阵,能不能进行类似的分解操作呢? 答案是奇异值分解,我们在下一章中介绍。
11.3 奇异值分解 Singular Value Decomposition¶
奇异值分解,简写 SVD,被认为是线性代数中最基本最核心的理论,因为它能作用于任何矩阵。在现实应用中,奇异值被广泛使用在图像压缩、推荐系统、主成份分析算法中。关于如何理解奇异值分解,知乎问答 已经有了非常精彩的解释,想要具体了解的同学可以移步学习。这里只简单记录一下其核心内容。
奇异值分解
假设 A 是一个 m*n 的矩阵,则如下的分解称为奇异值分解。

其中,U 是 m*m 的由一组标准正交基组成的矩阵,V 也是 n*n 的标准正交基组成的矩阵,Σ 矩阵在非对角线上的元素均为0,对角线上的元素>=0,代表奇异值。如果 Σ 矩阵的行多于列(即 m>n)则多余的行全部以0填充,反之亦然。
从数学形式上讲,奇异值分解将一个矩阵代表的线性变换,拆解成了三部分:首先,进行一次基的变化(VT),然后进行缩放,并可能在维度上有增减(Σ),最后,进行第二次基变化(U)。更简单的讲,奇异值分解将任何矩阵变化分为了三部分:将坐标系旋转,再拉伸,最后再旋转到最终位置。

从几何角度来理解,奇异值分解的涵义是,对于任何一个矩阵,首先找到一组两两正交的单位向量,使得矩阵作用于该单位向量组后得到的新向量仍然是两两正交的,奇异值的涵义就是变换后新向量各自对应的长度。

以上图为例,VT 起了一个基变化的作用,将原本的正交基向量(左上图的 v1 v2)转变到了新的正交基向量(左下图的 e1 e2)。注意由于 V 是由标准正交基组成的正交矩阵,因此 VT 就等于 V 的逆。
然后,奇异值矩阵 Σ 将新坐标系进行缩放(缩放比例即奇异值),并且可能增加或降低维度。图中的例子从二维变化到了三维。(右下图)
最后,U 又做了一次基变换,并且变化后的基向量扩充到了三维空间。(右上图)
低秩近似
奇异值分解的一大用途就是低秩近似,即将原来的大的矩阵用若干个小的简单的秩一矩阵的和来替代,从而大大减小消耗的存储量。方法即把原来的 SVD 分解表达式:

拆写为:

其中 r<k,每一项的系数 σ 即奇异值,且奇异值的大小依次降低,每一项的 uv 即一个单位向量与另一个单位向量的转置的乘积,结果就是一个秩一矩阵。保留前 r 个含有较大奇异值的项,就能得到原始矩阵的很好的近似。
注意,一个列向量和一个行向量(即uv)的积一定是个秩一矩阵,因为所得到的一个 m*n 矩阵的每一行(列)都是原行向量(列向量)的线性组合,因此该矩阵的秩一定为一。
12. 抽象的向量空间 Vector Space¶
我们再来回顾下什么是向量?是一个有方向的箭头,亦或是有序的列表?还是这两种观点是更深层次抽象事物的体现?
可以先讨论一个新的事物——函数,某种意义上函数也是一种向量,例如两个函数f(x)和g(x),可以将两个函数相加可以得到新函数(f+g)(x),这和向量对应坐标的相加类似,只不过某种程度来说,函数有无数多个坐标要相加。类似的,对于函数与另一个数的数乘 (2f)(x)=2f(x),也和向量对应坐标的数乘类似。
因此,以空间箭头为背景考虑的线性代数的概念和解决问题的手段也可以应用于函数,例如对函数的线性变换。那么怎么理解一个函数的变换是线性的呢?满足以下两条性质即可。

例如,对函数求导就是线性运算,因为它满足以上两条性质。两个函数相加再求导数,与分别求导数再相加的结果一致。乘法也一样。
矩阵求导
如果用矩阵来描述求导,该如何做?以多项式函数为例,我们可以把每一项的系数作为向量,把x的多次项作为基函数(基向量),而因为多项式的次数可以任意高,所以基函数集合也是无穷大的。因此,把一个多项式函数表达为矩阵就像下面这样:

对一个多项式函数求导,就能表达成下面这样:

所以,函数求导和矩阵向量乘法这两件事,看似毫无关联,其实完全可以理解成同一件事。实际上,线性代数中关于向量的很多概念,在应用于函数时有直接的类比。

所以,其实数学中有很多类似向量的事物,只要处理的对象集有数乘和相加的概念,无论是箭头、数组还是函数,线性代数中所有关于向量、线性变换和其它的概念都适用它。这些类似向量的事物,箭头也好函数也好,它们构成的集合叫做“向量空间”。
12.1 向量空间的公理¶
定义 令 V 为一个定义了加法和标量乘法运算的集合,这意味着对 V 中的每一对元素 v 和 w,可唯一对应于 V 中的一个元素 v+w,且对每一个 V 中的元素 x 和每一个标量 α,可唯一对应于 V 中的元素 αx 。如果集合 V 连同其上的加法和标量乘法运算满足以下的八条公理,则称为 向量空间 。

上边的八项公理,是建立一系列向量加法和数乘必须遵守的规则。因此如果要让所有建立好的理论和概念适用于一个向量空间,那么它必须满足上述的公理。
向量的具体形式并不重要,只要它们相加和数乘的概念遵守向量加法和数乘的八项规则,它就是向量。
12.2 向量子空间¶
如果有一个向量空间 V 的一个非空子集合 S,且 S 对于加法和标量乘法都封闭,则称 S 是 V 的 子空间 。以 S 为全集的数学系统连同从向量空间 V 继承的两个运算满足向量空间定义中的所有条件。向量空间的任何一个子空间仍然是向量空间。
12.3 仿射子空间¶
仿射子空间是一种更一般的空间。对于向量空间V中的一个非空的子集S,如果满足下面的条件,它就被称为仿射子空间:
集合S = { u - v | u, v是S中的向量}, S是V的一个线性子空间。
我们说,向量空间的向量可以理解为点与原点之间的位移和方向,而仿射空间的点则表示点与点的距离。仿射变换,就是在线性变换的基础上再加上一个平移变换。线性变换表达的是各种例如拉伸、旋转等变换,前提是变换前后原点不变,而仿射变换则是在此基础上进行平移。
References
[1] | 《Introduction to Linear Algebra 5th Edition》, Gilbert Strang |
[2] | Essense of Linear Algebra, 3Blue1Brown, 双语视频 https://www.bilibili.com/video/av6731067 |
[3] | 《Mathematics for Machine Learning》, Marc Peter Deisenroth、A Aldo Faisal, Cheng Soon Ong, Cambridge University Press. https://mml-book.com |
[4] | 知乎问答:奇异值的物理意义是什么?https://www.zhihu.com/question/22237507#answer-16927902 |
概率论¶
1. 基本概念¶
概率,通常指的是一个不确定事件发生的可能性。在机器学习和统计学中,有两个主要的流派:频率学派与贝叶斯学派。贝叶斯学派研究的是观察者对事物的看法,因此也称为主观概率;频率学派认为概率只能通过反复实验去逼近事件本身从而得到结果。频率学派试图描述的是事物本体,而贝叶斯学派试图描述的是观察者知识状态在新的观测发生后如何更新,描述的是观察这的对事物看法。
1.1 概率空间¶
1.1.1 定义¶
一个概率空间由三元组定义(Ω, F, P):
状态空间/样本空间 Ω
指一个试验所有可能出现的结果,一般用 Ω 表示。例如,连续投掷两次硬币的状态空间是 {正正,反反,正反,反正}。
事件空间 F
试验的每一个单一的结果为一个事件,它是状态空间的子集,而事件空间就是所有事件构成的集合。
概率 P(A)
对于每一个单独的事件 A(属于F),我们可以将其与一个数字 P(A) 联系起来,P(A) 即描述了该事件发生的可能性,也称为概率函数。对于单个事件,其概率必定在 [0,1] 之间;状态空间内所有可能结果的概率之和必定为等于1.
举个例子来理解上述三个概念。假如我们投掷一个6面骰子,那么样本空间 Ω = {1,2,3,4,5,6}。如果我们关注的事件是骰子点数是奇数还是偶数,那么事件空间就是 F = {∅,{1,3,5},{2,4,6}}
1.1.2 概率法则¶
给定一个事件空间F,概率函数P需要满足几个法则:
- 对于F中任意一个事件,其概率 P 在 [0,1] 之间
- 整个事件空间的概率之和为1
- 如果两事件互斥(即两事件不可能同时发生),那么这两个事件其中有一个发生的概率等于各个事件发生的(边缘)概率之和。即:对于所有 α,β∈F 和 α∩β=∅,P(α∪β)=P(α)+P(β)
第三个法则也叫互斥事件的加法法则。例如,投掷点数为偶数的概率为:P({2,4,6})=P({2})+P({4})+P({6})=3/6
1.2 随机变量¶
关于随机变量,有两个重要的误解:它既不是随机的,也不是一个变量。 它指的是把样本空间中某个特定结果与其发生的概率值(数字)关联起来的映射关系,本质是一个函数 。通常用一个大写字母来表示随机变量。
从某种意义上说,随机变量让我们可以将事件空间的形式概念抽象出来,通过定义随机变量来采集相关事件。例如,考虑掷骰子中投掷点数为奇/偶的事件空间,可以定义一个随机变量,当结果为奇数时取值为1,否则随机变量取值为0。
取值为 a 的随机变量 X 的概率可以记为:

同时,随机变量 X 的取值范围记作:Val(X)。
根据状态空间的不同,随机变量可以分为离散的和连续的。比如,一次掷10个硬币,定义随机变量为有多少个硬币正面朝上,则该随机变量就是离散的,因为只能取有限多个值。相反,能取无限多个值的随机变量就是连续随机变量。
1.3 联合分布、边缘分布与条件分布¶
1.3.1 概率分布¶
概率分布,指的是随机变量取某一个特定值的概率,例如:假设在投掷一个骰子的样本空间 Ω 上定义一个随机变量 X,如果骰子是均匀的,则 X 的分布为: P(X=1) = P(X=2)…= P(X=6) = 1/6。 虽然这个例子形式上和事件发生的概率类似,但两者的语义不同:前者是指 某件具体事件发生的概率 ,而这里指的是一个 随机变量的概率分布 。我们用 P(X) 表示随机变量 X 的概率分布。
1.3.2 联合分布¶
联合分布指的就是由多于一个变量决定的概率分布,即多件事件同时发生的情况。例如,在投掷一个骰子的样本空间上定义一个随机变量 X。定义一个指示变量 Y,当抛硬币结果为正面朝上时取1,反面朝上时取0。假设骰子和硬币都是均匀的,则 X 和 Y 的联合分布如下:

一般用 P(X and Y) 或更简便的 P(X,Y) 来表示它们的联合分布。
1.3.3 边缘分布¶
边缘分布指的就是一个随机变量对于其自身的概率分布。简单的理解,就是一个事件自身发生的概率分布,而不考虑其他变量。换句话说,在联合分布的情境下,边缘分布就是把另一个变量的所有可能取值相加。之所以取名为边缘分布也是这个原因,它将联合分布中(假设是两个变量组成的联合分布)其中的一个变量相加,把结果写在边缘。
1.3.4 条件分布¶
条件分布是已知某(些)事件已经发生的前提下,另一(些)事件发生的概率的分布。正式地,给定 Y=b 时,X=a 的条件概率定义为:

假设我们已知一个骰子投出的点数为奇数,想要知道投出的点数为“1”的概率。令 X 为代表点数的随机变量, Y 为指示变量,当点数为奇数时取值为1,那么我们期望的概率可以写为:

条件概率的思想可以自然地扩展到一个随机变量的分布是以多个变量为条件时,即:

我们用 P(X|Y=b) 来表示当 Y=b 时随机变量 X 的分布,也可以用 P(X|Y) 来表示 X 的一系列分布,其中每一个都对应不同的 Y 可以取的值。
1.4 连接概率类型:加法法则与乘法法则¶
1.4.1 加法法则¶
加法法则用来连接联合分布与边缘分布,即

对于连续随机变量:

换言之,当有两个以上随机变量构成的联合分布时,加法法则可以应用到其中任意一个(或多个)随机变量,得到该变量的边缘分布。
1.4.2 乘法法则(链式法则)¶
乘法法则是一个连接联合分布与条件分布的等式,任何多元随机变量的联合分布,都可以分解成其他两个类型概率相乘的形式,其一是第一个随机变量的边缘分布,另一个是第二个随机变量的条件分布,即 P(X,Y) = P(X)P(Y|X)。推广到n个随机变量:

乘法法则通常用于计算多个随机变量的联合概率,特别是在变量之间相互为(条件)独立时会非常有用。注意,在使用乘法法则时,我们可以选择展开随机变量的顺序;选择正确的顺序通常可以让概率的计算变得更加简单。
1.4.3 贝叶斯定理¶
将加法法则与乘法法则结合在一起,就得到了我们的贝叶斯公式。首先,根据乘法法则 P(X,Y) = P(X)P(Y|X),由于随机变量的顺序是人为设定的,所以交换顺序也成立: P(X,Y) = P(X)P(Y|X) = P(Y)P(X|Y),两边同时除以P(Y)(假设不为0),就得到了贝叶斯定理:

2. 定义概率分布¶
之前提到过,根据状态空间的不同,随机变量可以是离散的(只能取有限个值)或者连续的(可以取无限个值),那么它们对应的概率分布也分为离散分布与连续分布。
2.1 离散分布:概率质量函数¶
在定义一个离散分布时,我们可以简单地列举出随机变量取每一个可能值的概率。这种列举方式称为概率质量函数(probability mass function, PMF),因为它将(总概率的)每一个单元块分开,并将它们和随机变量可以取的不同值对应起来。这个可以类似的扩展到联合分布和条件分布。
假设X是抛硬币的结果,反面取值为0,正面取值为1。则在状态空间 {0, 1}中, X=x 的概率都是0.5,其概率质量函数是:

2.2 连续分布:概率密度函数¶
连续分布相比离散分布来说是一种更加需要揣摩的情况,因为如果我们将每一个值取非零质量数,那么总质量相加就会是一个无限值,这样就不符合总概率相加等于1的要求。
在定义一个连续分布时,我们会使用概率密度函数(probability density function, PDF)。概率密度函数是一个非负,可积(分)的函数,类似于:

连续型随机变量 X 的概率分布可以用如下公式计算:

值得注意的是,虽然概率质量函数和概率密度函数的总概率质量之和都必须为1,但其中会有一些细微的差别,对于离散随机变量而言,每一个事件的概率必须在[0,1]之间,因为它只能取有限个值,而对于连续随机变量而言却不一定满足这一点,下图是用均匀分布在离散和连续随机变量举的例子:

注意到,对于连续随机变量,概率密度的高度可能大于1,但记住总的概率密度和为1。
2.3 累积分布函数¶
有时我们也会讨论累积分布函数,这种函数给出了随机变量在小于某一值的概率。累积分布函数F和基本概率密度函数f的关系如下:

要将连续分布的定义扩展到联合分布,需要把概率密度函数扩展为多个参数,即:

3. 描述统计与独立性¶
很多时候我们想在随机变量之间进行总结和对比,这时就需要描述统计。一个变量的描述统计信息告诉了我们变量的一些基本行为特点,其中最重要的是期望与方差。
3.1 期望¶
数学期望是试验中每次可能结果的概率乘以其结果的总和。它是最基本的数学特征之一,反映随机变量平均值的大小,也称为一阶矩,记作 E(x)。公式如下:

当遇到随机变量的和时,一个最重要的规则之一是线性期望。令 X1,X2,…,XnX1,X2,…,Xn 为(可能独立的)随机变量:

它们的期望为线性函数。
期望的线性 非常强大,因为它对于 变量是否独立没有限制 。当我们对随机变量的结果进行处理时,通常没什么可说的,但是,当随机变量 X Y 相互独立时,有:

3.2 方差¶
一个随机变量的方差描述的是它的离散程度,也就是该变量离其期望值的偏离程度。一个实随机变量的方差也称为它的二阶矩或二阶中心动差,恰巧也是它的二阶累积量。方差的算术平方根称为该随机变量的标准差。
方差公式:

随机变量的方差通常记为 σ2,给它取平方的原因是因为我们通常想要找到 σ,也就是标准差。方差就是标准差的二次方。
为了找到随机变量 X 的方差,通常用以下替代公式更简单。这种形式在机器学习的计算中更常用。

注意,不同于期望,方差不是关于随机变量 X 的线性函数,事实上,我们可以证明 (aX+b) 的方差为:

如果随机变量X和Y相互独立,那么:

3.3 协方差¶
有时我们也会讨论两个随机变量的协方差,它可以用来度量两个随机变量的相关性,定义如下:

即两个随机变量各自与其期望的偏差的乘积的期望值。一个变量与自身的协方差就是上一节里提到的方差。从直觉上我们可以知道协方差体现的是两个变量的互相依赖度。
3.4 独立性与条件独立性¶
3.4.1 独立性¶
在概率论中,独立性是指随机变量的分布不因知道其它随机变量的值而改变。在机器学习中,我们通常都会对数据做这样的假设。例如,我们会假设训练样本是从某一底层空间独立提取;并且假设样例i的标签独立于样例 j(i≠j)的特性。违反这一假设会对某些算法带来严重的影响。
从数学角度来说,随机变量 X 独立于 Y,即 X 的结果不会影响 Y 的发生,则 X 的概率分布 = X 事件单独发生的概率,P(X) = P(X|Y) , 对任意 X 和 Y 可能的取值都成立。
如果 X 与 Y 独立,也容易获得 X 与 Y 同时发生的概率(联合分布)等于两者分别的乘积,即 P(X,Y) = P(X)P(Y)。 另外,两者的协方差也为0, Cov(X,Y) = 0。
反过来,如果 Y 的结果会影响 X 的发生,如:若头天下雨,则第二天下雨的可能性会增大,则 X 和 Y 的联合分布 P(X,Y) = P(X)P(Y|X)。
3.4.2 条件独立性¶
类似的,如果关于 X 和 Y 的条件概率分布对于 Z 的每一个值都可以写成乘积的形式,那么这两个随机变量 X 和 Y 在给定随机变量 z 时是条件独立的(conditionally independent): P(X,Y|Z) = P(X|Z)P(Y|Z)
我们可以采用一种简化形式来表示独立性和条件独立性: X⊥Y 表示 X 和 Y 相互独立, X⊥Y | Z 表示 X 和 Y 在给定 Z 时条件独立。
4. 大数定律¶
大数定律是指在随机试验中,每次出现的结果不同,但是大量重复试验出现的结果的平均值却几乎总是接近于某个确定的值。
其原因是,在大量的观察试验中,个别的、偶然的因素影响而产生的差异将会相互抵消,从而使现象的必然规律性显示出来。
5. 中心极限定理¶
中心极限定理是概率论中的一组定理。设从均值为μ、方差为σ^2;(有限)的任意一个总体中抽取样本量为n的样本,当n充分大时,样本均值的抽样分布近似服从均值为μ、方差为σ^2/n的正态分布。
References
[1] | Probability Theory Review for Machine Learning, Samuel Ieong |
[2] | 机器学习中概率论知识复习 https://blog.csdn.net/u012566895/article/details/51220127?utm_source=blogxgwz0 |
[3] | 掌握机器学习数学基础之概率统计 https://zhuanlan.zhihu.com/p/30314229 |
[4] | 《Mathematics for Machine Learning》, Marc Peter Deisenroth、A Aldo Faisal, Cheng Soon Ong, Cambridge University Press. https://mml-book.com |
统计学¶
最优化算法¶
训练机器学习算法很多时候本质上就是寻找一组最佳参数的过程,最佳是由目标函数或概率模型决定。给定了目标函数,我们通过优化算法找到最佳的值。
1. 梯度下降法 Gradient Descent¶
梯度下降法是最常用的最优算法之一。当目标函数是凸函数时,梯度下降法的解是全局解。一般情况下,其解不保证是全局最优解,梯度下降法的速度也未必是最快的。我们还需要假设函数是可微的,否则无法获得封闭解(即给出任意的自变量就可以求出其因变量)。
梯度下降法是一阶优化算法(因为只利用到了函数的一阶导数信息),其思想是用当前位置负梯度方向作为搜索方向,移动与当前位置负梯度成比例的一段步长。因为该方向为当前位置的最快下降方向,所以也被称为是最速下降法。梯度下降法的公式:

伪代码:

梯度下降法有两个缺点,一是靠近最优解的区域收敛速度明显变慢,二是固定学习率的情况下,可能在某点附近出现震荡,如下图表示的二维函数

在固定学习率的情况下,两种不同的学习率分别迭代20次的结果,起始点(x1,x2)=(0,0),最小值点(x1,x2)=(1,1)

可以看到如果学习率(步长)太小,随着迭代的增加,每次移动的距离越来越小,甚至难以逼近最优值,学习率太大,移动的轨迹在某值附近开始震荡,类似“之”形移动。对于这些缺点,可以通过使用可变学习率的方法优化,例如线性搜索等方法,每次迭代前寻找最优的学习率,再进行迭代;
基于基本的梯度下降法发展了几种梯度下降方法。
1.1 批量梯度下降法(Batch Gradient Descent,BGD)¶
批量梯度下降法是梯度下降法最原始的形式,它的具体思路是在更新每一参数时都使用所有的样本来进行更新。
优点:全局最优解;易于并行实现; 缺点:当样本数目很多时,训练过程会很慢。
1.2 随机梯度下降(Stochastic Gradient Descent,SGD)¶
随机梯度下降的思路是在每次迭代时,只使用一个样本,当样本个数很大的时候,随机梯度下降迭代一次的速度要远高于批量梯度下降方法。两者的关系可以这样理解:随机梯度下降方法以损失一部分精确度和增加一定数量的迭代次数为代价,换取了总体的优化效率的提升。增加的迭代次数远远小于样本的数量。如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经迭代到最优解了。
优点:训练速度快; 缺点:准确度下降,并不是全局最优。
对批量梯度下降法和随机梯度下降法的总结:
批量梯度下降—最小化所有训练样本的损失函数,使得最终求解的是全局的最优解,即求解的参数是使得风险函数最小,但是对于大规模样本问题效率低下。
随机梯度下降—最小化每条样本的损失函数,虽然不是每次迭代得到的损失函数都向着全局最优方向,但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近,适用于大规模训练样本情况。
1.3 批量梯度下降法(Mini-batch Gradient Descent,MBGD)¶
它的具体思路是在更新每一参数时都使用一部分样本(batch)来进行更新,可以选择对每个 batch 的梯度进行累加,或者取平均值。取平均值可以减少梯度的方差。可以看出该方法克服了上面两种方法的缺点,又同时兼顾两种方法的优点,是如今深度学习领域最常见的实现方式。
2. 牛顿法和拟牛顿法¶
2.1 牛顿法¶
上节介绍的梯度下降法只用到了目标函数的一阶导数,牛顿法是一种二阶优化算法,其核心思想是对函数进行泰勒展开。
2.1.1 用于方程求解¶
求解方程 f(x) = 0 的解:
- 选择一个接近函数f(x)=0 处的 x0,计算相应的f (x0) 和切线斜率f′(x0)
- 计算过点(x0,f(x0)) 并且斜率为f′(x0) 的直线和 X 轴的交点的 x 坐标,也就是求如下方程的解:f(x0)+f′(x0)∗(x−x0)=0
- 将新求得的点的 x 坐标命名为 x1,通常 x1 会比 x0 更接近方程f(x) = 0 的解。因此我们现在可以利用 x1 开始下一轮迭代。迭代公式可化简为如下所示:

由于牛顿法是基于当前位置的切线来确定下一次的位置,所以牛顿法又被很形象地称为是”切线法”。

或者这张图,更好理解:

已经证明,如果f’是连续的,并且待求的零点x是孤立的,那么在零点x周围存在一个区域,只要初始值 x0 位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果f’(x)不为0, 那么牛顿法将具有平方收敛的性能,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。
2.1.2 用于最优化¶
对于求模板书极大极小值的问题,可以转化为求函数f的导数为0的问题,这样问题就可以看成和方程求解一样的问题(f’=0),与用牛顿法求解很相似了。
- 先对 f(x) 进行二阶泰勒公式展开

- 然后对 f(x) 求导,得到:

注意,所有的 xk 和其导数都是已知的,视为常数项。
- 令 f’(x)=0 得到

关于牛顿法和梯度下降法的效率对比:
从本质上去看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。更通俗地说,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大(二阶导数信息)。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。(牛顿法目光更加长远,所以少走弯路;相对而言,梯度下降法只考虑了局部的最优,没有全局思想。)
从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。
牛顿法的优缺点总结:
优点:二阶收敛,收敛速度快; 缺点:牛顿法是一种迭代算法,每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂。
因此,如果在目标函数的梯度和Hessian矩阵比较好求的时候应使用Newton法。当模型的参数很多时Hessian矩阵的计算成本将会很大,导致收敛速度变慢,所以在深度学习中也很少使用牛顿法。
2.2 拟牛顿法¶
拟牛顿法是求解非线性优化问题最有效的方法之一,于20世纪50年代由美国Argonne国家实验室的物理学家W.C.Davidon所提出来。Davidon设计的这种算法在当时看来是非线性优化领域最具创造性的发明之一。不久R. Fletcher和M. J. D. Powell证实了这种新的算法远比其他方法快速和可靠,使得非线性优化这门学科在一夜之间突飞猛进。
拟牛顿法的本质思想是改善牛顿法每次需要求解复杂的Hessian矩阵的逆矩阵的缺陷,它使用正定矩阵来近似Hessian矩阵的逆,从而简化了运算的复杂度。拟牛顿法和最速下降法一样只要求每一步迭代时知道目标函数的梯度。通过测量梯度的变化,构造一个目标函数的模型使之足以产生超线性收敛性。这类方法大大优于最速下降法,尤其对于困难的问题。另外,因为拟牛顿法不需要二阶导数的信息,所以有时比牛顿法更为有效。如今,优化软件中包含了大量的拟牛顿算法用来解决无约束,约束,和大规模的优化问题。
牛顿法在基础机器学习中有用到,但在深度学习中很少用。这里不做展开。
3. 共轭梯度法 Conjugate Gradient¶
共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。 在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。
具体过程暂略。
4. 启发式优化方法¶
启发式方法指人在解决问题时所采取的一种根据经验规则进行发现的方法。其特点是在解决问题时,利用过去的经验,选择已经行之有效的方法,而不是系统地、以确定的步骤去寻求答案。启发式优化方法种类繁多,包括经典的模拟退火方法、遗传算法、蚁群算法以及粒子群算法等等。
还有一种特殊的优化算法被称之多目标优化算法,它主要针对同时优化多个目标(两个及两个以上)的优化问题,这方面比较经典的算法有NSGAII算法、MOEA/D算法以及人工免疫算法等。
具体的几种方法介绍可参考: http://www.cnblogs.com/maybe2030/p/4665837.html
5. 拉格朗日乘数法¶
5.1 基本思想¶
拉格朗日乘数法主要用于解决 带约束 的优化问题,基本的拉格朗日乘数法,就是求函数 f(x1,x2,…) 在 g(x1,x2,…)=C 的约束条件下的极值的方法。其主要思想是引入一个新的参数 λ (即拉格朗日乘子),将约束条件函数与原函数联系到一起,使能配成与变量数量相等的等式方程,从而求出得到原函数极值的各个变量的解。
5.2 示例¶
求双曲线函数 xy=3 上距离原点最近的点的坐标。
设(x,y) 是函数上的任意一点,则距离原点的距离为:

明显,两个函数的曲线相切的点就是我们要求的点。如果把双曲线看作自身的等高线,那么两个等高线相切时,二者在切点处的切线也相同,也就是说它们的梯度向量平行,即:

如果两个向量平行,则其中一个梯度向量可以写为另一个的常数倍:

这样,我们把问题转化为了一个含有3个未知变量的方程组:

到这里,已经可以用最简单的代入法求解了。这个方程组就称为拉格朗日方程组。λ 就是拉格朗日乘子。
拉格朗日乘数法并不会告诉我们最值的类型,结果可能是最大值、最小值或鞍点,那么如何判断是最大值还是最小值呢?只能通过将拉格朗日方程组的解代入问题方程来判断。
5.3 拉格朗日乘数法的基本形态¶
求函数 f(x,y) 在满足 g(x,y)=0 下的条件极值,可以转化为函数 F(x,y,λ) = f(x,y) + λg(x,y) 的无条件极值问题。可以用下图来帮助理解:

绿线标出的是约束 g(x,y)=c 的点的轨迹。蓝线是 f(x,y) 的等高线。箭头表示斜率,和等高线的法线平行。在最优解处,f 和 g 的斜率平行,梯度向量也平行。通过对 F(x,y,λ) 求偏导,即可得到方程组的解。
References
[1] | 常见的几种最优化方法 https://www.cnblogs.com/maybe2030/p/4751804.html |
[2] | 机器学习——优化算法:牛顿法-初探 https://blog.csdn.net/u013793732/article/details/79575507 |
..最小二乘法-线性回归 .. https://www.cnblogs.com/bigmonkey/p/8305145.html
模型评估与调优¶
1. 泛化能力¶
泛化能力指的是训练得到的模型对未知数据的预测能力。我们建模的目的是让模型不仅对已知数据,而且对未知数据都能有较好的预测能力。对模型预测能力的评估,可以通过样本上的训练误差和测试误差来估计。这里有三个概念:
- 损失函数:度量预测错误程度的函数
- 训练误差:训练数据集上的平均损失,虽然有意义,但本质不重要
- 测试误差:测试数据集上的平均损失,反应了模型对未知数据的预测能力
我们通常利用最小化训练误差的原则来训练模型,但真正值得关心的是测试误差。一般情况下我们通过测试误差来近似估计模型的泛化能力。对于一个好的模型,其训练误差约等于泛化误差。
2. 过拟合与欠拟合¶
2.1 基本概念¶
当机器学习模型对训练集学习的太好的时候,此时表现为训练误差很小,而泛化误差会很大,这种情况我们称之为过拟合,而当模型在数据集上学习的不够好的时候,此时训练误差较大,这种情况我们称之为欠拟合。具体表现如下图所示(来源Coursera的机器学习课程),第一幅图就是欠拟合,第三幅图就是过拟合。

2.1.1 欠拟合的产生¶
欠拟合产生的原因主要有两个:
模型过于简单 即模型形式太简单,以致于无法捕捉到数据特征,无法很好的拟合数据,如下图。在模型后加入一个二次项,拟合能力就提升了许多。

缺乏强预测能力的特征 很容易懂,可以通过组合、泛化等各种手段增加特征。
2.1.2 过拟合的产生¶
过拟合产生的原因主要有三个:
模型记住了数据中的噪音 意味着模型受到噪音的干扰,导致拟合的函数形状与实际总体的数据分布相差甚远。这里的噪音可以是标记错误的样本,也可以是少量明显偏离总体分布的样本(异常点)。通过清洗样本或异常值处理可以帮助缓解这个问题。
训练数据过少 导致训练的数据集根本无法代表整体的数据情况,做什么也是徒劳的。需要想方设法增加数据,包括人工合成假样本。
模型复杂度过高 导致模型对训练数据学习过度,记住了过于细节的特征,如下图(来源Coursera的机器学习课程)。

2.2 模型容量¶
通俗的讲,模型的容量是指模型拟合各种函数的能力。例如,模型是三次多项式构成的函数:

能拟合的函数包括一次函数、二次函数和三次函数。但它不能拟合更高阶的函数。另外,它输出的是参数的线性函数,无法描述非线性关系。
- 容量低的模型容易发生欠拟合,模型拟合能力太弱。
- 容量高的模型容易发生过拟合,模型拟合能力太强。
通过选择不同的假设空间可以改变模型的容量。模型的假设空间指的是:代表模型的函数集合,也称作模型的表示容量 representational capacity 。例如,线性回归算法将关于其输入的所有线性函数作为假设空间。由于额外的限制因素(比如优化算法的不完善),模型的有效容量 effective capacity 一般会小于模型的表示容量。通常在模型的假设空间中出最佳的函数是非常困难的优化问题,实际应用中只是挑选一个使得训练误差足够低的函数即可。
统计学习理论提供了量化模型容量的方法,其中最出名的是 VC 维理论 训练误差与泛化误差之间差异的上界随着模型容量增长而增长,随着训练样本增多而下降 。
虽然 VC 维理论对于机器学习算法有很好的指导作用,但是它在深度学习很难应用。原因有二:
- 边界太宽泛。
- 难以确定深度学习的容量。由于深度学习模型的有效容量受限于优化算法,因此确定深度学习模型的容量特别困难。
通常泛化误差是关于模型容量的 U 形函数。随着模型容量增大:
- 训练误差会下降直到逼近其最小值。
- 泛化误差先减小后增大。
- 泛化误差与训练误差的差值会增大。

3. Bias-Variance¶
3.1 偏差和方差¶
偏差:the difference between your model’s expected predictions and the true values. 衡量了模型期望输出与真实值之间的差别,刻画了模型本身的拟合能力。
方差:refers to your algorithm’s sensitivity to specific sets of training data. High variance algorithms will produce drastically different models depending on the training set. 度量了训练集的变动所导致的学习性能的变化,刻画了模型输出结果由于训练集的不同造成的波动。

高偏差,低方差的算法在不同训练集上训练得到的模型基本一致,但预测值与真实值差距较大;高方差,低偏差的算法得到的模型的预测值和真实值差距小,但在不同训练集上得到的模型输出波动大。
噪音:度量了在当前任务上任何学习算法所能达到的期望泛化误差的下界,刻画了学习问题本身的难度。
3.2 误差分解¶

如上图,泛化误差可以分解为偏差、方差和噪声之和。
偏差-方差分解表明:泛化性能是由学习算法的能力、数据的充分性以及学习任务本身的难度共同决定的。
偏差、方差与模型容量有关。用 MSE 衡量泛化误差时,增加容量会增加方差、降低偏差。
- 偏差降低,是因为随着容量的增大,模型的拟合能力越强:对给定的训练数据,它拟合的越准确。
- 方差增加,是因为随着容量的增大,模型的随机性越强:对不同的训练集,它学得的模型可能差距较大。
一般来说,偏差和方差是由冲突的,这称作偏差-方差窘境 bias-variance dilemma 。
给定学习任务:
- 在训练不足时模型的拟合能力不够强,训练数据的扰动不足以使模型产生显著变化,此时偏差主导了泛化误差。
- 随着训练程度的加深,模型的拟合能力逐渐增强,训练数据发生的扰动逐渐被模型学习到,方差逐渐主导了泛化误差。
- 在训练充分后模型的拟合能力非常强,训练数据发生的轻微扰动都会导致模型发生显著变化。
- 若训练数据自身的、非全局的特性被模型学到了,则将发生过拟合。
3.3 误差诊断¶
偏差-方差可以反映模型的过拟合与欠拟合。
- 高偏差对应于模型的欠拟合:模型过于简单,以至于未能很好的学习训练集,从而使得训练误差过高。例如,用 linear regression 去拟合非线性的数据集。此时模型预测的方差较小,表示预测较稳定。但是模型预测的偏差会较大,表示预测不准确。
- 高方差对应于模型的过拟合:模型过于复杂,以至于将训练集的细节都学到,将训练集的一些细节当做普遍的规律,从而使得测试集误差与训练集误差相距甚远。例如,不做任何剪枝的决策树,可以在任何训练集上做到极高的准确率。此时模型预测的偏差较小,表示预测较准确。但是模型预测的方差较大,表示预测较不稳定。
通过训练误差和测试误差来分析模型是否存在高方差、高偏差。
- 如果训练误差较高:说明模型的方差较大,模型出现了欠拟合。
- 如果训练误差较低,而训练误差较高:说明模型的偏差较大,出现了过拟合。
- 如果训练误差较低,测试误差也较低:说明模型的方差和偏差都适中,是一个比较理想的模型。
- 如果训练误差较高,且测试误差更高:说明模型的方差和偏差都较大。
上述分析的前提是:训练集、测试集的数据来自于同一个分布,且噪音较小。
3.4 误差缓解¶
过拟合和欠拟合的解决方法很多,并且针对不同算法有不同的方法。有时间系统的梳理一遍,这里只是简单罗列一些方法。

如果模型存在高偏差(欠拟合),则通过以下策略可以缓解:
- 选择一个容量更大、更复杂的模型。
- 增加更多有预测能力的强特征。
如果模型存在高方差(过拟合),则通过以下策略可以缓解:
- 数据清洗,避免由于噪音数据导致的模型问题。
- 增加更多的训练数据。它通过更多的训练样本来对模型参数增加约束,会降低模型容量。
- 使用正则化。在模型的优化目标里加入正则化项来对模型参数增加约束,以此降低模型复杂度。
- 神经网络中,可以增加 Dropout层,即让一部分的神经元以一定概率不工作。
- 神经网络中,还可以通过 Early Stopping 避免过拟合。在神经网络的训练过程中我们会初始化权值参数,此时模型的拟合能力较弱,通过迭代训练来提高模型的拟合能力。当验证集上的误差没有进一步改善时,算法提前终止。
- 集成学习,利用多个学习器组合在一起做出决策,弱化每个单独模型的特性。
- 对于决策树算法,剪枝是有效的防止过拟合手段。预剪枝通过在训练过程中控制树深、叶子节点数、叶子节点中样本的个数等来控制树的复杂度。后剪枝则是在训练好树模型之后,采用交叉验证的方式进行剪枝以找到最优的树模型。
4. 模型评价指标¶
前文提到了,衡量模型泛化能力可以通过在测试集上的测试误差来估计,而模型的评价指标就是如何将多个模型上的误差转变为可比较的一套方法。不同的评价指标对应了不同的误差计算方法,可能会导致不同的比较结论,因此需要结合业务场景选择一个最有意义的指标体系。
4.1 分类问题¶
4.1.1 混淆矩阵、精确率与召回率¶
混淆矩阵

混淆矩阵是分类任务中较常见的评价指标。对于二分类问题,通常将关注的类作为正类(比如欺诈交易),其他类作为负类(比如正常交易)。令:
- TP: TRUE POSITIVE 分类器将正类预测为正类的数量
- FN: FALSE NEGATIVE 分类器将正类预测为负类的数量
- FP: FALSE POSITIVE 分类器将负类预测为正类的数量
- TN: TRUE NEGATIVE 分类器将负类预测为负类的数量
基于此,我们可以定义以下指标:
准确率:Accuracy = (TP+TN)/(P+N) ,预测正确的样本(TP和TN)在所有样本中占的比例。
在各类样本不均衡时,准确率不能很好表示模型性能,因为会出现大类 dominating 的情况,即大类准确率高,而少数类准确率低。这样情况下,需要对每一类样本单独观察。
错误率:Error Rate = (FP+FN)/(P+N) ,即被预测错误的样本在所有样本中所占比例。
精确率(查准率): Precision = TP/(TP+FP),即所有被预测为正例的样本中,多少比例是真的正例。 召回率(查全率): Recall = TP/(TP+FN),即所有真的正例中,多少比例被模型预测出来了。
不同的问题中,有的侧重精确率,有的侧重召回率。
- 对于推荐系统,更侧重于精确率。即推荐的结果中,用户真正感兴趣的比例。因为给用户展示的窗口有限,必须尽可能的给用户展示他真实感兴趣的结果。
- 对于医学诊断系统,更侧重与召回率。即疾病被发现的比例。因为疾病如果被漏诊,则很可能导致病情恶化。
精确率和召回率是一对矛盾的度量。一般来说精确率高时召回率往往偏低,而召回率高时精确率往往偏低。
- 如果希望将所有的正例都找出来(查全率高),最简单的就是将所有的样本都视为正类,此时有
FN=0
。此时查准率就偏低(准确性降低)。 - 如果希望查准率高,则可以只挑选有把握的正例。最简单的就是挑选最有把握的那一个样本。此时有
FP=0
。此时查全率就偏低(只挑出了一个正例)。
F1 Score:精确率和召回率的调和平均。F1认为两者同等重要。

F-beta Score:F1 更一般的形式。

其中 Beta 度量了查全率对查准率的相对重要性。Beta大于1时,召回率更重要,在0-1之间时,精确率更重要。常用的Beta值有 2 和 0.5。
4.1.2 P-R 曲线¶
对二类分类问题,可以根据分类器的预测结果对样本进行排序:排在最前面的是分类器认为“最可能”是正类的样本,排在最后面的是分类器认为“最不可能”是正类的样本。
假设排序后的样本集合为 (x1,y1),(x2,y2)…,(xn,yn) ,预测为正类的概率依次为 (p1,p2,…pn) 。接下来,从高到低依次将 pi 作为分类阈值,即大于该阈值判断为正例,小于该阈值判断为负例:

此时计算得到的精确率记做 Pi ,召回率记做 Ri
。以精确率为纵轴、召回率为横轴作图,就得到
P-R
曲线。该曲线由点各个分类阈值水平下的 Recall-Precision
坐标组成。

P-R 曲线从左上角(0,1)
到右下角(1,0)
。
开始时第一个样本(最可能为正例的)预测为正例,其它样本都预测为负类。此时:
- 查准率很高,几乎为1。
- 查全率很低,几乎为0,大量的正例没有找到。
结束时所有的样本都预测为正类。此时:
- 查全率很高,正例全部找到了,查全率为1。
- 查准率很低,大量的负类被预测为正类。
P-R 曲线直观显示出分类器在样本总体上的查全率、查准率。因此可以通过两个分类器在同一个测试集上的 P-R 曲线来比较它们的预测能力:
如果分类器
B
的 P-R 曲线被分类器A
的曲线完全包住,则可断言:A
的性能好于B
。如果分类器
A
的 P-R 曲线与分类器B
的曲线发生了交叉,则难以一般性的断言两者的优劣,只能在具体的查准率和查全率下进行比较。此时一个合理的判定依据是比较 P-R 曲线下面积大小,但这个值通常不容易计算。
可以考察平衡点。平衡点
Break-Even Point:BEP
是P-R 曲线上查准率等于查全率的点,可以判定:平衡点较远的P-R 曲线较好。
4.1.3 ROC 曲线与AUC 值¶
定义真正例率(True Positive Rate
) 为:TPR = TP/(TP+FN)
,即正例的召回率。
定义假正例率(False Positive Rate
) 为:FPR = FP/(TN+FP)
,它刻画了模型将负例错误预测为正类的概率。
对二类分类问题,如果模型支持输出预测概率,则可以根据分类器的预测结果 (预测属于正例的概率) 对样本进行排序:排在最前面的是分类器认为“最可能”是正类的样本,排在最后面的是分类器认为“最不可能”是正类的样本。
假设排序后的样本集合为 (x1,y1),(x2,y2)…,(xn,yn) ,预测为正类的概率依次为 (p1,p2,…pn) 。接下来,从高到低依次将 pi 作为分类阈值,即:

当样本属于正例的概率大于等于 pi 时,我们认为它是正例,否则为负例,这样每次选择一个不同的阈值,计算得到的真正例率记做 TPRi ,假正例率记做 FPRi 。以真正例率为纵轴、假正例率为横轴作图,就得到ROC曲线。该曲线由点 {(TPR1,FPR1),(TPR2,FPR2)…(TPRn,FPRn)} 组成。易得,测试数据越多,能供选取的阈值越多,ROC 曲线就越平滑。

ROC 曲线从左下角(0,0)
到右上角(1,1)
。
开始时第一个样本(最可能为正例的)预测为正例,其它样本都预测为负类。此时:
- 真正例率很低,几乎为0,因为大量的正例未预测到。
- 假正例率很低,几乎为0,因为此时预测为正类的样本很少,所以几乎没有错认的正例。
结束时所有的样本都预测为正类。此时:
- 真正例率很高,几乎为1,因为所有样本都预测为正类。
- 假正例率很高,几乎为1,因为所有的负样本都被错认为正类。
在ROC曲线中:
- 对角线对应于随机猜想模型。
- 点
(0,1)
对应于理想模型:没有预测错误,FPR
恒等于0,TPR
恒等于1。 - 通常ROC曲线越靠近点
(0,1)
越好。
可以通过两个分类器在同一个测试集上的ROC
曲线来比较它们的预测能力:
如果分类器
A
的ROC曲线被分类器B
的曲线完全包住,则可断言:B
的性能好于A
。如果分类器
A
的ROC曲线与分类器B
的曲线发生了交叉,则难以一般性的断言两者的优劣。此时一个合理的判定依据是比较ROC曲线下面积大小,这个面积称作
AUC:Area Under ROC Curve
。
P-R 曲线和ROC曲线刻画的都是阈值的选择对于分类度量指标的影响。
通常一个分类器对样本预测的结果是一个概率结果,比如正类概率 0.7。但是样本是不是正类还需要与阈值比较。
这个阈值会影响了分类器的分类结果,比如:是阈值 0.5 还是阈值 0.9。
- 如果更重视查准率,则将阈值提升,比如为 0.9 。
- 如果更看重查全率,则将阈值下降,比如为 0.5 。
P-R 曲线和 ROC 曲线上的每一个点都对应了一个阈值的选择,该点就是在该阈值下的(查准率,查全率)
/(真正例率,假正例率)
。沿着横轴的方向对应着阈值的下降。
AUC 被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于 y=x 这条直线的上方,所以AUC的取值范围在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。
直观的理解,AUC 值是一个概率值,涵义是当你随机挑选一个正样本以及一个负样本,当前的分类算法根据计算得到的预测值将这个正样本排在负样本前面的概率就是AUC值。AUC值越大,当前的分类算法越有可能将正样本排在负样本前面,即能够更好的分类。
ROC 曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC 曲线能够保持不变,而 P-R 曲线的形状则会发生较大变化。在实际的数据集中经常会出现类不平衡现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化,此时使用对样本分布不敏感的评价指标就显得十分重要。
另外,ROC 曲线对于排序敏感,而对预测的具体分数则不怎么敏感。
4.1.4 K-S 曲线¶
常用的一种评价二元分类模型的方法,来源于 Kolmogorov-Smirnov Test。 KS值越大,说明模型能将两类样本区分开的能力越大。
KS 曲线的绘制很简单,先将实例按照模型输出值进行排序,通过改变不同的阈值得到小于(或大于)某个阈值时,对应实例集合中正(负)样本占全部正(负)样本的比例(即TPR 和 FPR,和 ROC 曲线使用的指标一样,只是两者的横坐标不同)。由小到大改变阈值从而得到多个点,将这些点连接后分别得到正、负实例累积曲线。正、负实例累积曲线相减得到KS曲线, KS曲线的最高点即KS值,该点所对应的阈值划分点即模型最佳划分能力的点。

在信贷风险评分场景中,KS值也是常见的一个评价指标,其绘制方式与上述稍有不同,其定义为各段信用评分组别中,好坏客户的累计占比曲线的最大差值,即横轴不再是模型的输出阈值,而是信用评分区间,一般把所有样本等分划为10等份,每一份计算该区间内的 KS。
一般,KS<0.3 表示模型的预测能力不佳,ks>0.3表示能力良好。
具体实践中,由于 KS 本身的限制(即只关注一个组别为代表,而不能反映所有区间上的区分效果),容易产生以偏概全的结论,因此在判断模型能力时,需要观察整条 KS 曲线在不同区间上的形状,或者搭配其他的评价指标共同权衡。KS值本身相对而言,更适合作为寻找最佳切分阈值的参考。
4.1.5 代价矩阵¶
实际应用过程中,不同类型的错误所造成的后果可能有所不同。如:将健康人诊断为患者,与将患者诊断为健康人,其代价就不同。为权衡不同类型错误所造成的不同损失,可以为错误赋予非均等代价(unequal cost)。
对于二类分类问题,可以设定一个“代价矩阵”(cost matrix),其中 costij 表示将第 i 类样本预测为第 j 类样本的代价。通常 costii=0 表示预测正确时的代价为0 。
预测:第0类 | 预测:第1类 | |
---|---|---|
真实:第0类 | 0 | cost01 |
真实:第1类 | cost10 | 0 |
在非均等代价下,希望找到的不再是简单地最小化错误率的模型,而是希望找到最小化总体代价total cost的模型。
在非均等代价下,ROC曲线不能直接反映出分类器的期望总体代价,此时需要使用代价曲线cost curve。
- 代价曲线的横轴就是正例概率代价。

其中 p 为正例(第0类)的概率。
- 代价曲线的纵轴为:

其中:FPR
为假正例率 。它刻画了模型将真实的负样本预测为正类的概率。FNR
为假负例率 。它刻画了模型将真实的正样本预测为负类的概率。
4.2 回归问题¶
回归问题接触的不多,简单的把常用指标罗列一下。
平均绝对误差mean absolute error:MAE
:

也称为 L1 范数损失,即绝对误差的平均值。取绝对值可以让误差的正负号作用抵消。缺点是该误差形式没有二阶导数,导致不能用某些方法优化。
均方误差mean square error:MSE
:
.. image:: images/均方误差.png
对大误差的样本有更多的惩罚,因此也对离群点更敏感。
均方根误差root mean squared error:RMSE
:

均方根对数误差root mean squared logarithmic error:RMSLE

为使得log
有意义,也可以使用:

使用均方根对数误差的优势:
当真实值的分布范围比较广时(如:年收入可以从 0
到非常大的数),如果使用MAE、MSE、RMSE
等误差,这将使得模型更关注于那些真实标签值较大的样本。而RMSLE
关注的是预测误差的比例,使得真实标签值较小的样本也同等重要。
当数据中存在标签较大的异常值时,RMSLE
能够降低这些异常值的影响。
5. 模型选择方法¶
测试样本用于测试模型对新样本的预测能力,即模型的泛化能力。比较不同模型泛化能力的强弱,从而帮助我们进行模型选择。模型选择通常有下列方法:
- 留出法 Hold-out
- K 折交叉验证法 k-fold cross validation
- 留一法 Leave-One-Out cross-validation
- 分层 K 折交叉验证法 Stratified k-fold cross validation
- 自助法 bootstrapping
5.1 留出法¶
留出法(Hold-out)是最经典也是最简单的评估模型泛化能力的方式。最简单的来讲,我们把数据集分为训练集和测试集两部分,前者用来训练模型,后者用来评估模型的泛化能力。大多数情况下我们需要做参数调优以进一步的提升模型表现(即模型选择步骤),例如调节决策树模型中树的最大深度。
一般情况下,我们根据模型在测试集上的表现进行参数调优,但如果我们一直用同一份测试集作为参考来调优,最后的结果很可能使得模型过拟合于这份测试集。因此,更好的做法是将数据集切分为三个互斥的部分——训练集、验证集与测试集,然后在训练集上训练模型,在验证集上选择模型,最后用测试集上的误差作为泛化误差的估计。我们可以在验证集上反复尝试不同的参数组合,当找到一组满意的参数后,最后在测试集上估计模型的泛化能力。整个过程如下图:

- 三部分划分比例,通常取 60%:20%:20%(或者两部分划分比例70%:30%)。如果训练集的比例过小,则得到的模型很可能和全量数据得到的模型差别很大;训练集比例过大,则测试的结果可信度降低。
- 数据集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响。若训练集、验证集、测试集中各个类别比例差别很大,则误差估计将由于训练/验证/测试数据分布的差异而产生偏差。
- 单次留出法得出的估计结果往往不够稳定可靠,通常会进行多次留出法,每次随机划分数据集,将多次得到的结果平均。多次重复进行留出法的方法即下一章将要介绍的K 折交叉验证。
5.2 K 折交叉验证¶
K 折交叉验证法(k-fold cross validation):数据随机划分为 K 个互不相交且大小相同的子集,利用 K-1个子集数据训练模型,利用余下的一个子集测试模型(一共有 K 种组合方式,训练得到 K 个模型)。
对 K 种组合依次重复进行,获取测试误差的均值,将这个均值作为泛化误差的估计。由于是在 K 各独立的测试集上获得的模型表现平均情况,因此相比留出法的结果更有代表性。利用 K 折交叉验证得到最优的参数组合后,一般在整个训练集上重新训练模型,得到最终模型。
K 折交叉验证的优点是每个样本都会被用作训练和测试,因此产生的参数估计的方差会很小。以10折交叉验证为例(下图),对模型的泛化能力评估由10份独立的测试集上的结果平均得到。

K 取太大,实验成本高,太小则实验的稳定性依然偏低。一般K取值为5或10。如果训练集数量不多,则可以再增加K的大小,这样每次训练会用到更多的样本,对泛化能力估计的偏差会小一些。
与留出法相似,将数据集划分为 K 个子集同样存在多种划分方式。为了减少因为样本划分不同而引入的差别, K 折交叉验证通常需要随机使用不同划分重复多次,多次 K 折交叉验证的测试误差均值作为最终的泛化误差的估计。
5.3 留一法¶
留一法(Leave-one-out cross validation):假设数据集中存在 N 个样本,令 K=1 则得到了 K 折交叉验证的一个特例。这个方法适合于数据集很小的情况下的交叉验证。
- 优点:由于训练集与初始数据集相比仅仅少一个样本,因此留一法的训练数据最多,模型与全量数据得到的模型最接近。
- 缺点:在数据集比较大时,训练 K 个模型的计算量太大。每个模型只有1条测试数据,无法有效帮助参数调优。
5.4 分层 K 折交叉验证法¶
如果样本类别不均衡,则常用分层 K 折交叉验证法。这个方法在进行 K 折交叉验证时,对每个类别单独进行划分,使得每份数据中各个类别的分布与完整数据集一致,保证少数类在每份数据中的数据量也基本相同,从而模型能力估计的结果更可信。
5.5 自助法¶
在留出法和 K 折交叉验证法中,由于保留了一部分样本用于测试,因此实际训练模型使用的训练集比初始数据集小(虽然训练最终模型时会使用所有训练样本),这必然会引入一些因为训练样本规模不同而导致的估计偏差。留一法受训练样本规模变化的影响较小,但是计算量太大。
自助法是一个以自助采样法(bootstrap sampling)为基础的比较好的解决方案。
自助采样法:给定包含 N 个样本的数据集 D ,对它进行采样产生数据集 D’:
- 每次随机从 D 中挑选一个样本,将其拷贝放入D’ 中,然后再将该样本放回初始数据集D 中(该样本下次采样时仍然可以被采到)。
- 重复这个过程 N 次,就得到了包含 N 个样本的数据集 D’。
显然,D 中有些样本会在 D’ 中多次出现; D 中有些样本在 D’ 中从不出现。D 中某个样本始终不被采到的概率为 (1-1/m)^m 。
根据极限:

即通过自助采样,初始数据集中约有 36.8% 的样本未出现在采样数据集 D’ 中。
将 D’ 用作训练集,D-D’ 用作测试集,这样的测试结果称作包外估计 out-of-bag estimate (OOB)。
自助法在数据集较小时很有用。
- 优点:能从初始数据集中产生多个不同的训练集,这对集成学习等方法而言有很大好处。
- 缺点:产生的数据集改变了初始数据集的分布,这会引入估计偏差。因此在初始数据量足够时,留出法和折交叉验证法更常用。
6. 模型与特征稳定性¶
训练完一个模型后,当它的泛化能力达到我们的要求,另一个重要的评估方面就是模型的稳定性。换句话说,假使模型在训练集、测试集上表现都很优异,我们也不能说在真实业务场景下可以放心的使用它,这主要源于两个方面的考虑:业务背景随着时间推移产生重大变化;业务针对的样本(比如人群)构成发生重大变化。
考察稳定性的通常方法是选取另外一个时间窗口/样本范围的数据进行预测,与实验环境的结果比较,观察其衰减程度是否可以接受。多比较和测试才有说服力。
稳定度指标(population stability index ,PSI) 是常用的检验模型稳定性的指标。关于 PSI 的介绍可以参考这篇文章。
计算公式:

评估标准:

同样的,特征层面也需要监测文档情况,包括:
- 特征是否稳定参与模型
- 特征权重的正负是否稳定
- 特征权重大小是否稳定
7. 训练集、验证集、测试集¶
7.1 样本选择¶
虽然常说,训练数据越多越好,但在某些条件下,过多的数据反而弊大于利。在有条件的情况下,需要对拥有的数据做一些预处理,目地主要有以下:
- 数据量如果过大,会消耗大量计算资源和时间。在资源有限的情况下,如果可以把数据集缩小到不影响模型效果的最小子集,则可以有效解决这一问题。
- 不是所有的样本/特征都对要预测的目标有用。携带冗余的数据对建模毫无用处,可以通过更细致的样本选择/特征筛选来缩小数据。
- 数据中如果含有噪音,则势必会影响模型的效果,但同时训练集中带有噪音也能提升模型的健壮性,因此如何处理噪音是个复杂的问题。这里的噪音包括错误标记,数据记录错误等。
7.5 验证集¶
大多数机器学习算法具有超参数,超参数的值无法通过学习算法拟合出来(比如正则化项的系数、控制模型容量的参数 )。为了寻找最优的超参数设置,可以引入验证集。将训练数据分成两个不相交的子集:训练集用于学习模型,验证集用于更新超参数。
通常要求验证集足够大。如果验证集很小,那么模型的超参数可能就记住了一个小验证集里的样本,模型将对验证集严重过拟合。
验证集通常会低估泛化误差。因此当超参数优化完成后,需要通过再在一份独立的测试集上来估计泛化误差。
7.6 测试集¶
测试集用于评估模型的泛化误差。理论上测试集越大,则模型的泛化误差评估的越准确。
测试集中的样本一定不能是训练样本。如果将训练样本放入测试集中,则会低估泛化误差。
测试集 vs 验证集:
- 测试集通常用于对模型的预测能力进行评估,它提供了模型预测能力的无偏估计。如果你不需要对模型预测能力的无偏估计,则不需要测试集。
- 验证集用于超参数的选择,因为模型依赖于超参数,而超参数依赖于验证集。因此验证集参与了模型的构建,这意味着模型已经考虑了验证集的信息。所以我们需要一份单独的测试集来估计模型的泛化能力。
7.7 拆分¶
对于小批量数据,数据的拆分的常见比例为:
- 如果未设置验证集,则将数据三七分:70% 的数据用作训练集、30% 的数据用作测试集。
- 如果设置验证集,则将数据划分为:60% 的数据用作训练集、20%的数据用过验证集、20% 的数据用作测试集。
对于大批量数据,验证集和测试集占总数据的比例会更小。
- 对于百万级别的数据,其中1万条作为验证集、1万条作为测试集即可。
- 验证集的目的就是验证不同的超参数;测试集的目的就是比较不同的模型。
- 一方面它们要足够大,才足够评估超参数、模型。
- 另一方面,如果它们太大,则会浪费数据(验证集和训练集的数据无法用于训练)。
在 k 折交叉验证中:先将所有数据拆分成 k 份,然后其中 1 份作为测试集,其他 k-1份作为训练集。这里并没有验证集来做超参数的选择。所有测试集的测试误差的均值作为模型的预测能力的一个估计。
7.8 分布不匹配¶
深度学习时代,经常会发生:训练集和验证集、测试集的数据分布不同。如:训练集的数据可能是从网上下载的高清图片,测试集的数据可能是用户上传的、低像素的手机照片。
- 必须保证验证集、测试集的分布一致,它们都要很好的代表你的真实应用场景中的数据分布。
- 训练数据可以与真实应用场景中的数据分布不一致,因为最终关心的是在模型真实应用场景中的表现。
如果发生了数据不匹配问题,则可以想办法让训练集的分布更接近验证集。
一种做法是:收集更多的、分布接近验证集的数据作为训练集合。
另一种做法是:人工合成训练数据,使得它更接近验证集。
该策略有一个潜在问题:你可能只是模拟了全部数据空间中的一小部分。导致你的模型对这一小部分过拟合。
当训练集和验证集、测试集的数据分布不同时,有以下经验原则:
确保验证集和测试集的数据来自同一分布。
因为需要使用验证集来优化超参数,而优化的最终目标是希望模型在测试集上表现更好。
确保验证集和测试集能够反映未来得到的数据,或者最关注的数据。
确保数据被随机分配到验证集和测试集上。
当训练集和验证集、测试集的数据分布不同时,分析偏差和方差的方式有所不同。
如果训练集和验证集的分布一致,那么当训练误差和验证误差相差较大时,我们认为存在很大的方差问题。
如果训练集和验证集的分布不一致,那么当训练误差和验证误差相差较大时,有两种原因:
- 第一个原因:模型只见过训练集数据,没有见过验证集的数据导致的,是数据不匹配的问题。
- 第二个原因:模型本来就存在较大的方差。
为了弄清楚原因,需要将训练集再随机划分为:训练-训练集、训练-验证集。这时候,训练-训练集、训练-验证集是同一分布的。
- 模型在
训练-训练集
和训练-验证集
上的误差的差距代表了模型的方差。 - 模型在
训练-验证集
和 验证集上的误差的差距代表了数据不匹配问题的程度。
8. 超参数调节¶
机器学习算法中,有两类参数:从训练数据学习得到的参数(例如,线性回归模型中每一项自变量的权重 ),和在开始学习过程之前设置好的参数,即超参数(例如神经网络训练时的学习率/隐藏层层数,或者决策树的最大深度)。超参数往往定义了关于模型的更高层次的概念,例如模型复杂程度或学习能力。
大多数学习算法都有些超参数需要设定。超参数配置不同,学得的模型性能往往有显著差别,这就是参数调节(parameter tuning):对每种超参数配置下都训练出一个模型,然后把对应最好模型的超参数作为最优结果。
由于很多超参数是在实数范围内取值,因此现实中常用做法是对每个超参数选定一个范围和变化步长。如在[0,1)
范围内以
0.2
为步长。这样选出的超参数可能不是最佳的,但是这是在计算开销和性能之间取折中的结果。
当模型选择完成后,学习算法和超参数配置已经选定,此时应该用所有训练数据重新训练模型,这才是最终提交的模型。
8.1 搜索策略¶
- 超参数搜索有三种常见的策略:
- 手动搜索:手动选择超参数。
- 网格搜索:当超参数的数据相对较少时,这个方法很实用。
- 随机搜索:通常推荐这种方式。
8.1.1 手动搜索¶
手动选择超参数需要十分清楚超参数的作用,它们是如何影响模型表现的,以及如何调整能达到预期的效果。这需要建模人员对模型和数据有非常大的把控能力。
8.1.2 网格搜索¶
最传统的超参数优化方法就是网格搜索(Grid search),即对一个指定范围内的超参数集合进行搜索。网格搜索的做法是:
- 对于每个超参数,选择一个较小的有限值集合去搜索。
- 然后这些超参数笛卡尔乘积得到多组超参数。
- 网格搜索使用每一组超参数训练模型,挑选验证集误差最小的超参数作为最好的超参数。
如何确定搜索集合的范围?
- 如果超参数是数值,则搜索集合的最小、最大元素可以基于先前相似实验的经验保守地挑选出来。
- 如果超参数是离散的,则直接使用离散值。
通常会根据实验的结果反复尝试并调整超参数的选择范围。假设在集合
{-1,0,1}
上网格搜索超参数a :
- 如果找到的最佳值是 1,那么说明可能低估了 a 的取值范围。此时重新在
{1,2,3}
上搜索。 - 如果找到的最佳值是 0,那么可以细化搜索范围以改进估计。此时重新在
{-0.1,0,0.1}
上搜索。
网格搜索的一个缺点是计算代价随着超参数数量呈指数级增长。如果有 m 个超参数,每个最多取 n 个值,那么所需的试验数将是 n的m次方 。
8.1.3 随机搜索¶
随机搜索是一种可以替代网格搜索的方法,它编程简单、使用方便、能更快收敛到超参数的良好取值。
- 首先为每个超参数定义一个边缘分布,如伯努利分布(对应着二元超参数)或者对数尺度上的均匀分布(对应着正实值超参数)。
- 然后假设超参数之间相互独立,从各分布中抽样出一组超参数。
- 使用这组超参数训练模型。
- 经过多次抽样 -> 训练过程,挑选验证集误差最小的超参数作为最好的超参数。
随机搜索的优点:
- 不需要离散化超参数的值,也不需要限定超参数的取值范围。这允许我们在一个更大的集合上进行搜索。
- 当某些超参数对于性能没有显著影响时,随机搜索相比于网格搜索指数级地高效,它能更快的减小验证集误差。
与网格搜索一样,通常会基于前一次运行结果来重复运行下一个版本的随机搜索。
随机搜索比网格搜索更快的找到良好超参数的原因是:没有浪费的实验。
在网格搜索中,两次实验之间只会改变一个超参数的值,而其他超参数的值保持不变。
如果这个超参数的值对于验证集误差没有明显区别,那么网格搜索相当于进行了两个重复的实验。
在随机搜索中,两次实验之间,所有的超参数值都不会相等,因为每个超参数的值都是从它们的分布函数中随机采样而来。因此不大可能会出现两个重复的实验。
如果该超参数与泛化误差无关,那么:
- 在网格搜索中,不同该超参数的值、相同的其他超参数值,会导致大量的重复实验。
- 在随机搜索中,其他超参数值每次也都不同,因此不大可能出现两个重复的实验(除非所有的超参数都与泛化误差无关)。
8.2 调整原则¶
通常先对超参数进行粗调,然后在粗调中表现良好的超参数区域进行精调。
超参数随机搜索,并不意味着是在有效范围内随机均匀取值。需要选择合适的缩放来进行随机选取。
对于学习率,假设其取值范围为
0.000001~1
。如果进行均匀取值,取10个,那么有 90% 的随机值都位于区间
[0.1,1]
。则[0.000001,0.1]
之间没有足够的探索。这种做法明显不合理。此时需要使用对数缩放,在对数轴上均匀随机取点。
对于指数加权移动平均的超参数 1/(1-b) 。假设其取值范围为
0.9~0.9999
。由于 1/(1-b) 刻画了结果使用过去多少个周期的数据来加权平均。因此如果进行均匀取值,则:
- 在
0.9~0.9005
之间取值时,1/(1-b) 变化不大。 - 在
0.9990~0.9995
之间取值时,1/(1-b) 变化非常大。
b 越接近 1,1/(1-b) 对于它的变化越敏感。此时,需要对 (1-b) 使用对数缩放,在对数轴上均匀随机取点。
- 在
如果选择了错误的缩放,如果取值的总量足够大,也可以得到不错的结果。尤其当配合了
粗调 -> 精调
策略时,最终还是会聚焦到合适的超参数范围上。
通常情况下,建议至少每隔几个月重新评估或者修改超参数。因为随着时间的变化,真实场景的数据会逐渐发生改变。由于这些变化,原来设定的超参数可能不再适用。