机器学习是一门人工智能的分支学科,通过算法和模型让计算机从数据中学习,进行模型训练和优化,做出预测、分类和决 作为一门以数据及其模型为研究对象的学科,优化模型、分析模型性能等都需要数学手段的帮助。和其他学科一样,数学可以帮我们更清晰地描述和理解机器学习算法,也可以从理论上证明算法的有效性,是机器学习中必不可少的一环。本文将会介绍机器学习中常用的数学工具,为后面的学习打下基础。
一、向量
向量(vector),在数学中指具有大小和方向的量。与向量相对,只具有大小、不具有方向的量则称为标量(scalar)。简单来说,我们可以将向量理解为由
n个数构成的
n元组,其中
n称为向量的维数。向量通常有两种写法,如下所示的竖排写法称为列向量:
\boldsymbol{x} = \begin{pmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{pmatrix} 横排写法
\boldsymbol{x}=(x_1,x_2,\ldots,x_n) 称为行向量。一个向量如果不加说明即默认为列向量,但实际中为了节省空间,我们通常将列向量写成
\boldsymbol{x}=(x_1, x_2, \ldots, x_n)^\mathrm{T} 的形式。其中上标
\mathrm{T}表示转置(transpose),即将行和列翻转过来,行向量转置后就变成了列向量。例如,向量
\boldsymbol x = (1,2) 的转置为:
\boldsymbol x^\mathrm{T} = \begin{pmatrix}1 \\ 2\end{pmatrix} 关于向量的含义,我们既可以将其看成
n维空间中的一个点,其中向量每一维的值代表坐标;也可以将其看成从原点指向该坐标点的有向线段,具有长度和方向。无论哪种理解,每一个
n维向量都与一个
n维空间中的点相对应,因此,全体
n维向量构成的空间与
\mathbb{R}^n是等价的。在没有额外说明的情况下,对于向量
\boldsymbol{x} \in \mathbb{R}^n,我们用
x_i (1\le i\le n) 来表示其第
i维的分量。此外,记所有分量全部为0的向量为零向量
\boldsymbol{0}=(0,0,\ldots,0)^\mathrm{T}。
设向量
\boldsymbol{x}, \boldsymbol{y} \in \mathbb{R}^n,标量
a\in\mathbb{R},向量的常见运算有:
\boldsymbol{x} + \boldsymbol{y} =(x_1+y_1,x_2+y_2,\ldots,x_n+y_n)^\mathrm{T}。
a\boldsymbol{x} = \boldsymbol{x}a = (ax_1,ax_2,\ldots,ax_n)^\mathrm{T}。当
a=0 或
\boldsymbol x = \boldsymbol 0 时,结果即为
\boldsymbol 0。
- 向量内积(inner product),也称向量点积(dot product):
\boldsymbol{x}\cdot\boldsymbol{y} = \sum\limits_{i=1}^n x_iy_i,注意两个向量的内积结果是标量。从式中可以看出,向量内积满足交换律,即
\boldsymbol{x}\cdot\boldsymbol{y} = \boldsymbol{y}\cdot\boldsymbol{x}。
为了衡量向量的“长度”,我们定义范数(norm)函数
\| \cdot \| \colon \mathbb{R}^n \to \mathbb{R}。一个函数是范数,当且仅当其满足下面3个条件:
(1)正定性:
\|\boldsymbol{x}\| \ge 0,当且仅当
\boldsymbol{x}=\boldsymbol{0} 时,
\|\boldsymbol{x}\|=0;
(2)绝对齐次性:
\| a\boldsymbol{x} \| = |a|\|\boldsymbol{x}\|;
(3)三角不等式:
\| \boldsymbol{x} + \boldsymbol{y} \| \le \|\boldsymbol{x}\| + \|\boldsymbol{y}\|。
在各种各样的向量范数中,
L_p范数(又称
p范数)是一类相对常用的范数,其定义为
\|\boldsymbol{x}\|_p = \left( \sum_{i=1}^n |x_i|^p \right)^{1/p},\quad p \ge 1 其中,又以下面几种
L_p范数最为常见:
L_2范数,又称欧几里得范数,其结果是向量对应的点到原点的欧氏距离,也称为向量的模长:
\|\boldsymbol{x}\|_2 = \sqrt{\sum_{i=1}^n x_i^2} 由于其应用最广,我们有时会省略
L_2范数的下标,直接写为
\|\boldsymbol{x}\|。
L_1范数,又称绝对值范数,为向量各个分量的绝对值之和,其结果是向量所表示的点到原点的曼哈顿距离:
\|\boldsymbol{x}\|_1 = \sum_{i=1}^n |x_i|L_\infty范数,又称无穷范数,由对
L_p范数的定义取极限
p\to+\infty 得到,其结果是向量中绝对值最大的分量:
\|\boldsymbol{x}\|_\infty = \max_{i=1,\ldots,n} |x_i| 当
0 < p < 1 时,按与上面相同的方式定义的函数并不满足范数的条件。但是为了方便,我们常将下面的函数也称为“范数”:
L_0范数,由对
L_p范数的定义取极限
p \to 0^+ 得到,其结果是向量中不为
0的元素的个数:
\|\boldsymbol{x}\|_0 = \sum_{i=1}^n \mathbb{I}(x_i \neq 0)二、矩阵
向量是一些数在一维上构成的元组,如果把它朝二维扩展,我们就得到了矩阵(matrix)。与向量相比,矩阵由于有了更多的维数,具有更大的灵活性,还可以定义新的运算。下面,我们就来介绍矩阵的基本概念和本书中可能会用到的简单性质。
(一)矩阵的基本概念
矩阵是由一些数构成的矩形元组。一个
m行
n列的矩阵通常称为
m \times n 的矩阵,记为
\boldsymbol{A} = \begin{pmatrix} a_{11} &a_{12} &\cdots &a_{1n} \\ a_{21} &a_{22} &\cdots &a_{2n} \\ \vdots &\vdots\ & &\vdots \\ a_{m1} &a_{m2} &\cdots &a_{mn} \end{pmatrix} 对具体的元素不关心时,我们也将其记为
\boldsymbol{A}_{m\times n}或
\boldsymbol A。默认情况下,我们用
a_{ij}或者
\boldsymbol{A}_{ij}来表示矩阵
\boldsymbol{A}中位于第
i行第
j列的元素,有时也反过来用
(a_{ij})_{m\times n} 表示元素为
a_{ij}的
m行
n列矩阵。与向量相似,
m\times n 的实数矩阵构成的空间即与
m\times n 维的实数空间等价,一般记为
\mathbb{R}^{m\times n}。向量实际上是一种特殊的矩阵,列向量的列数为1,行向量的行数为1。同时,矩阵也可以看作由一组向量构成。设
\boldsymbol{a}_i=(a_{1i}, a_{2i},\ldots, a_{mi})^\mathrm{T},那么
\boldsymbol{A}=(\boldsymbol{a}_1, \boldsymbol{a}_2, \ldots, \boldsymbol{a}_n)。与向量相似,矩阵同样存在转置操作,表示将矩阵的行和列交换。一个
m\times n 矩阵
(a_{ij})_{m\times n} 转置后会得到
n \times m 矩阵
(a_{ji})_{n\times m}。例如,矩阵
\boldsymbol A = \begin{pmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{pmatrix} 的转置为
\boldsymbol A^\mathrm{T} = \begin{pmatrix} 1 & 3 & 5 \\ 2 & 4 & 6 \end{pmatrix} 特别地,行数和列数均为
n的矩阵称为
n阶方阵。如果
n阶方阵
\boldsymbol D只有左上到右下的对角线上的元素不为0,则称该方阵为对角矩阵(diagonal matrix),记为
\mathrm{diag}(a_1,a_2,\ldots,a_n)。例如
\mathrm{diag}(1, 2, 3) 代表的矩阵为
\mathrm{diag}(1,2,3) = \begin{pmatrix} 1 & 0 & 0\\ 0 & 2 & 0 \\ 0 & 0 & 3 \end{pmatrix} 进一步,如果对角矩阵对角线上的元素全部为1,则称该方阵为
n阶单位矩阵(identity matrix)或单位阵,用
\boldsymbol{I}_n表示。阶数明确时,也可以省略下标的阶数,记为
\boldsymbol{I}。例如,三阶单位阵为
\boldsymbol I_3 = \begin{pmatrix} 1 &0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix} 所有元素为零的矩阵称为单位零矩阵,记为
\boldsymbol 0。
(二)矩阵运算
设矩阵
\boldsymbol{A},\boldsymbol{B} \in \mathbb{R}^{m\times n},
\boldsymbol{C} \in \mathbb{R}^{n\times l},
\boldsymbol{D} \in \mathbb{R}^{l\times k},
\boldsymbol{P} \in \mathbb{R}^{m\times l}。向量
\boldsymbol{x} \in \mathbb{R}^n,标量
\lambda \in \mathbb{R}。矩阵的常用运算有:
\boldsymbol{A} + \boldsymbol{B} = \boldsymbol{B} + \boldsymbol{A} = (a_{ij} + b_{ij})_{m\times n} 要求两个矩阵行列数目都相同。
\lambda\boldsymbol{A}=\boldsymbol{A}\lambda=(\lambda \cdot a_{ij})_{m\times n}。
- 矩阵与矩阵相乘,要求第一个矩阵的列数与第二个矩阵的行数相同。设
\boldsymbol{P}=\boldsymbol{A}\boldsymbol{C},则有
p_{ij} = \sum_{t=1}^n a_{it}c_{tj}最终得到的
\boldsymbol{P}是
m\times l 维的矩阵。这一运算方式可以理解为,
\boldsymbol P的第
i行
j列的元素
p_{ij}是由
\boldsymbol A的第
i行和
\boldsymbol B的第
j列做向量内积得到的。这也说明了为什么矩阵乘法要求第一个矩阵的列数(即行向量的维数)与第二个矩阵的行数(即列向量的维数)相同,因为只有维数相等的向量才能进行内积。例如:
\begin{pmatrix} 1 & 0 & 2 \\ 0 & 2 & 1 \end{pmatrix} \times \begin{pmatrix} 2 & 0 \\ 1 & 3 \\ 3 & 2 \end{pmatrix} = \begin{pmatrix} 8 & 4 \\ 5 & 8 \end{pmatrix} 其中,
\boldsymbol P第1行第1列的8的计算过程为
(1,0,2) \begin{pmatrix} 2 \\ 1 \\ 3 \end{pmatrix} = 1\times 2 + 0 \times 1 + 2 \times 3 = 8 其余元素以此类推。
应当注意,由于矩阵乘法对行数和列数的要求,将
\boldsymbol{A}\boldsymbol{C}交换成
\boldsymbol{C}\boldsymbol{A}并不一定还符合乘法的定义。即使
\boldsymbol{A}与
\boldsymbol{C}的维数形如
m \times n 和
n \times m,交换后仍然满足乘法定义,其交换前后相乘的结果也不一定相等,即
\boldsymbol{A}\boldsymbol{C} \neq \boldsymbol{C}\boldsymbol{A}。例如:
\begin{pmatrix} 1 & 1 \\ 0 & 1 \end{pmatrix} \times \begin{pmatrix} 0 & 1 \\ 1 & 1 \end{pmatrix} = \begin{pmatrix} 1 & 2 \\ 1 & 1 \end{pmatrix},\quad \begin{pmatrix} 0 & 1 \\ 1 & 1 \end{pmatrix} \times \begin{pmatrix} 1 & 1 \\ 0 & 1 \end{pmatrix} = \begin{pmatrix} 0 & 1 \\ 1 & 2 \end{pmatrix} 不过,虽然矩阵的乘法不满足交换律,但依然满足结合律,即
(\boldsymbol{A}\boldsymbol{C})\boldsymbol{D} = \boldsymbol{A} (\boldsymbol{C}\boldsymbol{D})。另外,对于转置操作,有
(\boldsymbol{A}\boldsymbol{C})^\mathrm{T} = \boldsymbol{C}^\mathrm{T} \boldsymbol{A}^\mathrm{T}。
由于向量也是一种特殊的矩阵,向量内积其实是矩阵乘法的一种特殊形式。但是,两个
n \times 1 维的列向量并不满足矩阵乘法对维数的要求。为了将向量的内积与矩阵乘法统一,我们通常将其中一个向量转置成
1 \times n 维的行向量,再按矩阵乘法的规则进行计算,即:
\boldsymbol x \cdot \boldsymbol y = \boldsymbol y^\mathrm{T} \boldsymbol x 此外,内积也常用尖括号写为
\langle \boldsymbol x, \boldsymbol y \rangle。该写法只是一种形式,其计算规则和上面是相同的。
矩阵可以与向量相乘,其计算方式与矩阵乘法相同。设
\boldsymbol{z} = \boldsymbol{A}\boldsymbol{x},那么
z_i = \sum_{t=1}^n a_{it}x_t 得到的
\boldsymbol{z}是
m维向量。例如:
\begin{pmatrix} 1 & 0 & 2 \\ 2 & 1 & 1 \end{pmatrix} \times \begin{pmatrix} 0 \\ 3 \\ 1 \\ \end{pmatrix} = \begin{pmatrix} 2 \\ 4 \end{pmatrix} 类似于实数中的
1,任何矩阵与维度相符的单位阵相乘都等于自身,即
\boldsymbol{A}_{m\times n} \boldsymbol{I}_n = \boldsymbol{I}_m \boldsymbol{A}_{m\times n} = \boldsymbol{A}_{m\times n}。进一步,在实数中,相乘等于
1的两个数互为倒数。利用单位矩阵,我们也可以定义矩阵的“倒数”——逆矩阵(inverse)。对于
n阶方阵
\boldsymbol{A},如果存在
n阶方阵
\boldsymbol{B}满足
\boldsymbol{A}\boldsymbol{B}=\boldsymbol{I},则称
\boldsymbol{B}是
\boldsymbol{A}的逆矩阵,记为
\boldsymbol{B} = \boldsymbol{A}^{-1}。逆矩阵之间的乘法是可交换的,即
\boldsymbol{A}\boldsymbol{A}^{-1} = \boldsymbol{A}^{-1}\boldsymbol{A} = \boldsymbol{I}。例如:
\begin{pmatrix} 1 & 1 \\ 0 & 1 \end{pmatrix} \times \begin{pmatrix} 1 & -1 \\ 0 & 1 \end{pmatrix} = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix},\quad \begin{pmatrix} 1 & -1 \\ 0 & 1 \end{pmatrix} \times \begin{pmatrix} 1 & 1 \\ 0 & 1 \end{pmatrix} = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} 转置操作与求逆操作之间的顺序可以交换,即
(\boldsymbol{A}^\mathrm{T})^{-1} = (\boldsymbol{A}^{-1})^\mathrm{T}。
(三)矩阵与线性方程组
矩阵的逆并不是一定存在的。例如,二阶矩阵
\boldsymbol A = \left(\begin{matrix} 1 & -1 \\ -1 & 1 \end{matrix}\right) 就不存在逆矩阵。显然,零矩阵也不存在逆矩阵。那么,什么情况下矩阵的逆存在呢?我们可以从多元一次方程组的角度来理解。设矩阵
\boldsymbol A_{n\times n}\in \mathbb{R}^{n\times n},向量
\boldsymbol x \in \mathbb{R}^n。将方程
\boldsymbol A\boldsymbol x = \boldsymbol 0 按矩阵与向量的乘法展开,得到
\begin{cases} a_{11}x_1 + a_{12}x_2 + \cdots + a_{1n}x_n = 0 \\ a_{21}x_1 + a_{22}x_2 + \cdots + a_{2n}x_n = 0 \\ \quad\quad\vdots \\ a_{n1}x_1 + a_{n2}x_2 + \cdots + a_{nn}x_n = 0 \\ \end{cases} 这是一个
n元一次方程组,且显然有解
\boldsymbol x= \boldsymbol 0。如果该方程组只有这一个解,那么矩阵
\boldsymbol A的逆存在;反之,如果方程组存在非零解,则矩阵的逆不存在。设
\boldsymbol x_1是方程的一个非零解,满足
\boldsymbol A \boldsymbol x_1 = \boldsymbol 0,假设矩阵的逆存在,那么:
\boldsymbol 0 = \boldsymbol A^{-1}\boldsymbol 0 = \boldsymbol A^{-1}\boldsymbol A \boldsymbol x_1 = \boldsymbol I \boldsymbol x_1 = \boldsymbol x_1 由此得到
\boldsymbol x_1=\boldsymbol 0,与
\boldsymbol x_1是非零解矛盾,故矩阵的逆不存在。
我们用上面举的二阶矩阵的例子来进一步说明这一现象,该矩阵对应的方程组为
\begin{cases} +x_1 &- x_2 &= 0 \\ -x_1 &+ x_2 &= 0 \end{cases} 可以发现,如果将第一个方程乘上-1,就得到了第二个方程。因此,这两个方程事实上是一样的,方程组其实只包含一个方程
x_1-x_2=0。最终,方程组有两个未知数,但只有一个方程,就存在无穷多组解,从而矩阵的逆不存在。
如果方程组
\boldsymbol {Ax} = \boldsymbol0 存在非零解,不妨设解向量中的前
m维
x_1,x_2,\ldots, x_m 不为零。否则,我们总可以重排矩阵和向量行的顺序来使不为零的维度变成前
m维。设矩阵
\boldsymbol A的列向量为
\boldsymbol a_1, \boldsymbol a_2, \ldots, \boldsymbol a_n,那么非零解就对应着下面的关系:
x_1 \boldsymbol a_1 + x_2 \boldsymbol a_2 + \cdots + x_m \boldsymbol a_m = \boldsymbol 0 也就是说,原方程组中至少有一个方程可以由其他方程线性组合得到。像这样,对于向量
\boldsymbol u_1, \ldots, \boldsymbol u_n,如果以
t_i为未知数的方程
\sum_{i=1}^n t_i \boldsymbol u_i = \boldsymbol 0 有非零解,就称向量组
\boldsymbol u_1, \ldots, \boldsymbol u_n 是线性相关的;反之,如果该方程只有零解,就称向量组是线性无关的。而对于线性相关的向量组,设其中存在
m个向量线性无关,而任取
m+1个向量都线性相关,则称该向量组的秩(rank)为
m,记为
\mathrm{Rank}(\boldsymbol u_1, \ldots, \boldsymbol u_n) = m。线性无关的向量组的秩就等于其包含向量的个数。将这一概念应用到矩阵上,可以定义矩阵
\boldsymbol A的秩
\mathrm{Rank}(\boldsymbol A)为其列向量组成的向量组的秩。于是,我们可以用矩阵的秩来判断其是否可逆:方阵
\boldsymbol A_{n\times n}可逆的充分必要条件是
\mathrm{Rank}(\boldsymbol A)=n。
直观上来说,矩阵的秩可以衡量矩阵包含的信息,也就是矩阵的复杂程度。例如在上面的线性方程组中,虽然它包含两个方程,但由其中一个方程可以推出另一个,说明它包含的信息与仅有一个方程没有什么区别。对于矩阵来说,矩阵的秩越低,其列向量之间的相关性就越强,说明其实际上包含的信息就越少。
(四)矩阵范数
与向量类似,在矩阵上同样可以定义范数函数
\| \cdot \| \colon \mathbb{R}^{m\times n} \to \mathbb{R},其需要满足的条件也与向量范数相同。
(1)正定性:
\|\boldsymbol{A}\| \ge 0,且
\|\boldsymbol{A}\| = 0 当且仅当
\boldsymbol{A}的所有元素都为
0。
(2)绝对齐次性:
\| a\boldsymbol{A} \| = |a|\| \boldsymbol{A} \|。
(3)三角不等式:
\| \boldsymbol{A} + \boldsymbol{B} \| \le \| \boldsymbol{A} \| + \| \boldsymbol{B} \|。
在机器学习中,较为常用的矩阵范数是弗罗贝尼乌斯范数(Frobenius norm),简称
\mathrm{F}范数,定义为矩阵每个元素的平方之和的平方根:
\| \boldsymbol{A} \|_\mathrm{F} = \left( \sum_{i=1}^m \sum_{j=1}^n a_{ij}^2 \right)^{\frac{1}{2}}\mathrm{F}范数与向量的
L_2范数的定义较为类似,直观来说,可以用来衡量矩阵整体的“大小”,或者可以理解为将矩阵拉成向量后,向量对应的模长。
三、梯度
在机器学习中,我们经常会将问题抽象成数学模型,经过一系列推导后,将其转化为在一定约束条件下,求某个函数在空间上的最小值的问题,这样的问题就叫做优化问题。给定函数
f\colon \mathbb{R}^n \to \mathbb{R},最简单也是最自然的优化问题是寻找函数的最小值:
\min_{\boldsymbol{x}} f(\boldsymbol{x}) 要求解这一优化问题,就必须分析该函数的性质,尤其是函数的变化趋势。试想,如果知道了函数在空间的每一个地方沿着任一方向是上升还是下降,就可以不断沿着函数值下降的方向走,直到向周围的所有方向函数值都上升为止。这时,我们就找到了函数的一个局部极小值。当然,这里描述的只是某种直观的感受,并不完全严谨,但也提示了函数的变化趋势在优化问题中的重要性。而梯度,就是描述函数变化速率和方向的工具。
假设有一定微积分的基础,下面给出梯度(gradient)的定义。对于向量的标量值函数
f \colon \mathbb{R}^n \to \mathbb{R},其在
\boldsymbol{x}处的梯度为
\nabla_{\boldsymbol{x}} f(\boldsymbol{x}) = \left( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \cdots, \frac{\partial f}{\partial x_n} \right)^\mathrm{T} 其中,
\nabla_{\boldsymbol{x}}表示对变量
\boldsymbol{x}求梯度。在不引起混淆的情况下,下标
\boldsymbol{x}可以省略。可以看出,
\nabla f也是一个
n维向量,与
\boldsymbol{x}形状相同,其每一维均由
f对
\boldsymbol{x}的对应维度求偏导数得到。我们知道,多元函数对其中一个变量的偏导数代表了函数在该变量方向上的变化速率和方向。如果将向量函数的变量
\boldsymbol{x}看作是
n个独立的标量变量,那么
f也可以认为是有
n个变量的多元函数
f(x_1, \ldots, x_n)。并且在直角坐标系中,由于向量的每一维都对应一个坐标轴,
f对每个维度的偏导数,就指示了函数在这一坐标轴方向上的变化情况。最终由各个偏导数组合而成的向量,则代表函数在空间中完整的变化速率与方向。
值得注意的是,梯度向量所指的方向有非常特殊的性质。如图1所示,图中是函数
f(x,y) = -x - 2y 在
xy平面上的等值线图,在每条直线上函数的值都相等,且颜色越偏红的地方函数值越大,越偏蓝的地方函数值越小。按照上面的运算规则,可以算出函数在点
(1,1) 处的梯度是
(-1,-2)。图中画出了以
(1,1) 为起点的一些箭头,图例中标明了箭头的方向,其中蓝色实线箭头是梯度方向。这些箭头的长度都相等。可以看出,虽然沿所有箭头的方向函数值都在增大,但是蓝色的箭头跨过了最多的等值线,说明沿该方向函数值增大最快。
图1 梯度与函数值变化
或许有人对图1有疑问,认为函数非线性的情况与图中展示的线性情况不同,函数值增大最快的方向应当是从起点指向最大值点的方向。然而,仿照一元函数的泰勒展开
f(x) \approx f(x_0) + f'(x_0)(x-x_0),我们也可以利用梯度对标量值函数在局部进行线性近似,即
f(\boldsymbol x) \approx f(\boldsymbol x_0) + \nabla f(\boldsymbol x_0)^\mathrm{T} (\boldsymbol x - \boldsymbol x_0) 在遇到的情境中,函数
f的性质通常都足够好,可以进行上面的线性近似。因此,当我们讨论函数在一个很小局部内的变化时,总是可以认为函数是线性的。这样,参照上面线性函数的例子,就可以从直观上推出:在某一点函数值上升最快的方向就是函数在该点梯度的方向。更严格的数学证明应当考虑函数在起点
\boldsymbol x_0沿不同方向的方向导数
\begin{aligned}\frac{\partial f(\boldsymbol x_0)}{\partial \boldsymbol s}\end{aligned},其中
\boldsymbol s表示空间中的某个方向。该导数的含义是,自变量从
\boldsymbol x_0沿方向
\boldsymbol s变为
\boldsymbol x_0 + \mathrm{d}\boldsymbol s时,函数值的变化为
\begin{aligned}\left\lVert \frac{\partial f(\boldsymbol x_0)}{\partial \boldsymbol s} \right\rVert\end{aligned}。利用方向导数可以证明,当函数值变化最大时,
\boldsymbol s就是梯度方向。
图2展示了几个有代表性的二元函数在空间中部分点的梯度,分别是抛物面
f(x,y)=x^2+y^2,马鞍面
f(x,y)=x^2-y^2,以及
f(x,y)=\sin(x)\sin(y)。
(a) 抛物面
f(x,y)=x^2+y^2 的梯度
(b) 马鞍面
f(x,y)=x^2-y^2 的梯度
(c)
f(x,y)=\sin(x)\sin(y) 的梯度
图2 几种二元函数的梯度示意
上文介绍的函数以向量为自变量,函数值是标量。除此之外,在机器学习中我们还会经常遇到自变量和函数值都是向量的函数,称为向量值函数。设
\boldsymbol{f} \colon \mathbb{R}^n \to \mathbb{R}^m 是向量值函数,那么函数值的每一维都是一个
n元标量函数:
\boldsymbol f(\boldsymbol x) = \left(f_1(x_1,\ldots,x_n), f_2(x_1,\ldots,x_n), \cdots, f_m(x_1,\ldots,x_n)\right)^\mathrm{T} 向量值函数其实并不少见,半径为
r的圆的参数方程
x=r\cos\theta, y=r\sin\theta 就可以看成自变量为
\theta、函数值为向量
(x,y)的函数。假如我们要描述空间中的风速,那么也需要一个从空间坐标
(x,y,z)到风速
(v_x,v_y,v_z)的向量值函数。而在机器学习中,我们最常见的是向量之间的线性变换
\boldsymbol f(\boldsymbol x) = \boldsymbol A\boldsymbol x,其中
\boldsymbol A是矩阵。
向量值函数同样也可以对自变量求导数,但这时导数的结果就变成矩阵,称为雅可比矩阵(Jacobian matrix),通常用
\nabla \boldsymbol f或者
\boldsymbol J_{\boldsymbol f}表示。设
\boldsymbol{f} \colon \mathbb{R}^n \to \mathbb{R}^m,其对自变量
\boldsymbol x的梯度是一个
m \times n 维的矩阵:
\nabla_{\boldsymbol x} \boldsymbol f = \begin{pmatrix} \nabla_{\boldsymbol x}^\mathrm{T} f_1 \\ \vdots \\ \nabla_{\boldsymbol x}^\mathrm{T} f_m \end{pmatrix} = \begin{pmatrix} \begin{aligned}\frac{\partial f_1}{\partial x_1}\end{aligned} & \begin{aligned}\cdots\end{aligned} & \begin{aligned}\frac{\partial f_1}{\partial x_n}\end{aligned} \\ \begin{aligned}\vdots\end{aligned} & \begin{aligned}\end{aligned} & \begin{aligned}\vdots\end{aligned} \\ \begin{aligned}\frac{\partial f_m}{\partial x_1}\end{aligned} & \begin{aligned}\cdots\end{aligned} & \begin{aligned}\frac{\partial f_m}{\partial x_n}\end{aligned} \end{pmatrix} 其中
\nabla^\mathrm{T}表示先求梯度再转置。虽然严格意义上来说,雅可比矩阵已经不是梯度,但由于其与梯度的含义和形式都高度相似,也可以将其看作是梯度的推广。因此简单起见,统一用梯度来称呼标量值函数与向量值函数的导数,并用
\nabla符号表示求梯度或雅可比矩阵。
特别的,标量值函数的梯度是向量。类比于二阶导数,如果对梯度
\nabla f再求一次梯度,得到的矩阵就称为
f的黑塞矩阵(Hessian matrix):
\boldsymbol{H}_f = \nabla^2 f(\boldsymbol{x})=\begin{pmatrix} \begin{aligned}\frac{\partial^2 f}{\partial x_1^2}\end{aligned} & \begin{aligned}\cdots\end{aligned} & \begin{aligned}\frac{\partial^2 f}{\partial x_1 \partial x_n}\end{aligned} \\ \begin{aligned}\vdots\end{aligned} & \begin{aligned}\end{aligned} & \begin{aligned}\vdots\end{aligned} \\ \begin{aligned}\frac{\partial^2 f}{\partial x_n \partial x_1}\end{aligned} & \begin{aligned}\cdots\end{aligned} & \begin{aligned}\frac{\partial^2 f}{\partial x_n^2}\end{aligned} \end{pmatrix} 我们直接给出向量求导的一些常用公式。读者可以发现,这些公式与一元标量函数的求导并无太大差别,只是需要注意向量和矩阵的转置来使维度相符。如无特殊标明,下面所有的求导都是对向量
\boldsymbol x进行的。其中
a是标量,
\boldsymbol y是向量,
\boldsymbol A是矩阵。带有下角标的
\boldsymbol\alpha_{\boldsymbol{x}}, \boldsymbol\beta_{\boldsymbol{x}} 是
\boldsymbol x的向量值函数。
\begin{aligned} & \nabla \boldsymbol y^\mathrm{T}\boldsymbol x = \nabla \boldsymbol x^\mathrm{T}\boldsymbol y = \boldsymbol y && \nabla \boldsymbol x^\mathrm{T}\boldsymbol x = 2\boldsymbol x && \nabla \lVert \boldsymbol x \lVert_2 = \boldsymbol x / \lVert \boldsymbol x \lVert_2 \\ &\nabla \boldsymbol\alpha_{\boldsymbol{x}}^\mathrm{T} = (\nabla_{\boldsymbol{x}^\mathrm{T}} \boldsymbol\alpha_{\boldsymbol{x}})^\mathrm{T} && \nabla \boldsymbol y^{\mathrm{T}}\boldsymbol A\boldsymbol x = \boldsymbol A^{\mathrm{T}}\boldsymbol y &&\nabla \boldsymbol x^{\mathrm{T}}\boldsymbol A\boldsymbol x = (\boldsymbol A + \boldsymbol A^\mathrm{T})\boldsymbol x \\ &\nabla \boldsymbol\alpha_{\boldsymbol{x}}^\mathrm{T}\boldsymbol\beta_{\boldsymbol{x}} = (\nabla\boldsymbol\alpha_{\boldsymbol{x}}^\mathrm{T}) \boldsymbol\beta_{\boldsymbol{x}} + \boldsymbol\alpha_{\boldsymbol{x}}^\mathrm{T} (\nabla \boldsymbol\beta_{\boldsymbol{x}}) && \nabla \boldsymbol A \boldsymbol x = \boldsymbol A^\mathrm{T} &&\nabla a\boldsymbol x = a \boldsymbol I \end{aligned} 与标量函数类似,函数
f(\boldsymbol{x})在
\boldsymbol{x}_0处取到极大值或者极小值的必要条件是在该点的梯度为零向量:
\nabla f(\boldsymbol{x})|_{\boldsymbol{x}_0} = \boldsymbol{0} 虽然仅有这一条件并不充分,比如图2(b)展示过的
f(x,y)=x^2-y^2,其在
(0,0)处的梯度为零,但该点显然并非局部极小值。然而,进一步讨论需要用到
\boldsymbol H_f较为复杂的性质,且梯度为零在函数光滑时是必要条件。因此,我们暂且先对梯度与极值的关系有一个基本认识,在需要深入时再具体介绍分析的方法。
四、凸函数
梯度为零并不能说明函数取到极值点。那么,是否存在一类函数,由梯度为零就可以直接推出极值点呢?考虑最简单的开口向上的二次函数
y=x^2,显然函数在顶点
x=0 处的梯度为零,同时该点也是函数的极小值点。进一步分析可以发现,在自变量
x由小变大的过程中,函数的导数(梯度)
y' = 2x 是单调增加的。所以,如果导数存在零点
x_0,在零点左边导数始终小于0,函数值单调减小;在零点右边导数始终大于0,函数值单调增加。这样,导数为零的点一定是函数的极小值点。
当函数的自变量由一元扩展到多元、导数扩展成梯度的时候,我们同样需要把上面的直觉扩展,找到在不同情况下都适用的描述方法。直观上来说,如果梯度为零就可以推出极小值点,函数的图像应当是没有“起伏”的,这种性质该如何描述呢?这里直接给出定义:考虑函数
f(\boldsymbol x),对任意
\boldsymbol x_1, \boldsymbol x_2 和
0 < \alpha < 1,如果都有
\alpha f(\boldsymbol x_1) + (1-\alpha)f(\boldsymbol x_2) \ge f(\alpha\boldsymbol x_1 + (1-\alpha) \boldsymbol x_2) 就称
f是凸函数(convex function)。
图3是一个凸函数的示意图,我们通过这张图来简单说明凸函数定义式的几何含义。上式左边是
f(\boldsymbol x_1)和
f(\boldsymbol x_2)的加权平均,随着
\alpha从0变化到1,它的轨迹就是连接
(\boldsymbol x_1, f(\boldsymbol x_1))和
(\boldsymbol x_2, f(\boldsymbol x_2))两点的线段。上式右边则是
\boldsymbol x_1和
\boldsymbol x_2两个点先加权平均得到
\alpha \boldsymbol x_1 + (1-\alpha) \boldsymbol x_1、再求函数值的结果。要让上式成立,就需要左边表示的线段始终在右边对应位置的函数值上方,和上面我们希望的函数图像没有“起伏”是一致的。否则,我们就可以在函数图像有“鼓包”的地方找到两个点,使它们的连线在函数下方了。
图3 凸函数定义的几何解释
图4展示了常见的凸函数
f(x)=|x| 和
f(x)=e^x,以及非凸函数
f(x)=x^3 和
f(x)=\cos(x), 0\le x\le 2\pi。非凸函数的图像上还画出了一条红色虚线,表示该函数违反凸函数定义的地方。可以自行验证这些函数确实满足或不满足凸函数的定义。
图4 凸函数与非凸函数示例
从这些例子中,我们需要说明几个与上面的“直觉”不完全相同的地方,也提醒注意严谨的数学表达是比直觉更可靠的工具。第一,凸函数不一定在所有点可导(可求梯度)。例如
|x| 在
x=0 处的梯度就不存在。但我们在机器学习中遇到的大多数函数,都可以通过合理规定不可导点的导数来尽量弥补这一缺陷,比如规定
|x| 在
x=0 的导数为
0。第二,凸函数不一定存在极值点,例如
e^x在定义域内是单调递增函数,不存在导数为零的地方。第三,存在全局唯一极小值点的不一定是凸函数,例如
\cos(x)在
[0,2\pi] 区间上存在唯一极值点
x=\pi,且该点的导数为
-\sin(\pi)=0。甚至
\cos(x)在极值点左边导数
-\sin(x) 始终为负、在极值点右边导数始终为正,与我们在本节最开始的描述相同,但它仍然不是凸函数。
与凸函数相反,如果将定义式中的
\ge改为
\le,即
\alpha f(\boldsymbol x_1) + (1-\alpha)f(\boldsymbol x_2) \le f(\alpha \boldsymbol x_1 + (1-\alpha) \boldsymbol x_2) 就得到了凹函数(concave function)。类比图2凸函数的几何解释,凹函数的图像应当是向上“鼓起”的,从而任意两点的连线都在图像的下方。因此,凸函数常常与最小化关联,凹函数常常与最大化关联。对比两者的定义式可以发现,如果
f(\boldsymbol x)是凸函数,那么
-f(\boldsymbol x)一定是凹函数。相应来说,最小化凸函数
f(\boldsymbol x)与最大化凹函数
-f(\boldsymbol x)是等价的。因此,我们只需要选取凸函数进行研究,就可以得到凹函数的所有性质。
凸函数在机器学习中非常常见,一般向量范数都是凸函数。由于凸函数的良好性质,它的优化问题通常有简单且理论上严格的解法。因此,在后续所有的模型中,我们都希望尽可能找到某种形式的凸函数作为优化问题的目标。