计算主义
首发于计算主义
基于函数二阶特性的优化

基于函数二阶特性的优化

内容


  • 多元函数的导(雅克比);
  • 多元函数的方向导;
  • 多元函数的二阶导(赫森);
  • 牛顿法;
  • 共轭方向法。


本文粗体小写字母表示向量。粗体大写字母表示矩阵,有必要时用下标注明矩阵维度。细体小写希腊字母表示标量——实数)。


一、多元函数的导


如果我们有函数:


\textbf{y}=f\left(\textbf{x}\right) \quad \textbf{x} \in R^{n}\ \textbf{y} \in R^{m} \ \left[1.1\right]


fR^n \rightarrow R^m 的映射。说 f 在点 \textbf{x} 可导是指能够用一个仿射函数(affine function) 在 \textbf{x} 附近的小区域内很好地拟合 f 。这里提到“仿射函数”和“很好地拟合”,这两个概念需要解释。


如果函数 f 满足:


f\left(\alpha\textbf{x}+\beta\textbf{y}\right)=\alpha f\left(\textbf{x}\right)+\beta f\left(\textbf{y}\right) \ \left[1.2\right]


其中 \alpha\beta 是标量。则 f 是一个线性函数。如果 f:R^{n}\rightarrow R^{m} 是线性的,那么可以找到一个矩阵 \textbf{A}_{m\times n} 来表示它。即存在一个矩阵 \textbf{A}_{m\times n} 使:


\forall \textbf{x} \in R^n\ :f\left(\textbf{x}\right)=\textbf{A}\textbf{x} \ \left[1.3\right]


为什么线性函数有此特性?任何一个 n 元向量 \textbf{x} 都可以被 n 维线性空间 R^n 的标准基线性表出:


\textbf{x}=x_1\textbf{e}_1+x_2\textbf{e}_2+...+x_n\textbf{e}_n=\sum_{i=1}^{n}{x_i\textbf{e}_i} \ \left[1.4\right]


\textbf{e}_i 是第 i 个元素为 1 其余元素为 0 的列向量。 \textbf{e}_{i \ i=1...n} 构成 R^n 的标准基。其中 x_1,\ x_2,\ ...x_n 是向量 \textbf{x}n 个元素。因为 f 是线性的,有:


f\left(\textbf{x}\right)=f\left(\sum_{i=1}^{n}{x_i\textbf{e}_i}\right)=\sum_{i=1}^{n}{x_if\left(\textbf{e}_i\right)} \ \left[1.5\right]


其中 f\left(\textbf{e}_i\right)m 元向量,是对标准基的第 i 个向量 e_i 施加 f 的结果。 f\left(\textbf{x}\right) 是以 x_1,\ x_2,\ ...x_n 为系数对 f\left(\textbf{e}_i\right)_{\ i=1...n} 的线性组合。将 f\left(\textbf{e}_i\right)_{\ i=1...n} 作为列组成一个 m\times n 的矩阵 \textbf{A}_{m \times n} ,显然有:


f\left(\textbf{x}\right)=\left[f\left(\textbf{e}_1\right),f\left(\textbf{e}_2\right),...f\left(\textbf{e}_n\right)\right]\textbf{x}=\textbf{A}\textbf{x} \ \left[1.6\right]


所以一切线性函数 f 都可以用一个矩阵 \textbf{A} 表示。 \textbf{A} 的列是对自变量空间的标准基施加 f 的结果。对 \textbf{x} 施加 f 等于用 \textbf{A} 左乘 \textbf{x}


如果 fR^n\rightarrow R 的线性函数,那么 f 的矩阵就是一个 1\times n 矩阵,也就是一个行向量 \textbf{a}^T 。有:


f\left(\textbf{x}\right)=\textbf{a}^T\textbf{x} \ \left[1.7\right]


f 的图形是 n+1 维空间中一张超平面(hyperplane)。如果自变量是 2 维则 f 的图形是 3 维空间中一张平面。线性函数一定过原点,因为:


f\left(\textbf{0}\right)=f\left(0\textbf{x}\right)=0f\left(\textbf{x}\right)=\textbf{0} \ [1.8]


把一个线性函数加上一个常向量 \textbf{b} 就形成了一个仿射函数:


f\left(\textbf{x}\right)=\textbf{A}\textbf{x}+\textbf{b} \ \left[1.9\right]


如果仿射函数 fR^2 \rightarrow R 的,则它的图形是 3 维空间中一个(不一定过原点的)平面。


上面说 f\textbf{x}^* 可导是指 f\textbf{x}^* 附近可以被一个仿射函数很好地近似,这个“很好”是在极限的意义上说的。即:


\lim_{||\textbf{x}-\textbf{x}^*|| \rightarrow 0}\frac{||f\left(\textbf{x}\right)-\left(\textbf{A}\left(\textbf{x}-\textbf{x}^*\right)+\textbf{b}\right)||}{||\textbf{x}-\textbf{x}^*||}=0 \ \left[1.10\right]


随着 \textbf{x}\textbf{x}^* 靠近(即 ||\textbf{x}-\textbf{x}^*|| \rightarrow 0 ), f\left(\textbf{x}\right) 与仿射函数 \textbf{A}\left(\textbf{x}-\textbf{x}^*\right)+\textbf{b} 之间的差距消失得更快。为满足这个极限必须有:


\textbf{b}=f\left(\textbf{x}^*\right) \ \left[1.11\right]


于是这个近似仿射函数是:


f_{affine}\left(\textbf{x}\right)=f\left(\textbf{x}^*\right)+\textbf{A}\left(\textbf{x}-\textbf{x}^*\right) \ \left[1.12\right]


f_{affine}f\textbf{x}^* 相等。在其他点可以不相等。但随着向 \textbf{x}^* 靠近,它们之间的差距消失,且消失得比自变量点靠近得要快。还差一个问题:矩阵 \textbf{A} 是什么?


选取某一个坐标轴 i 。让自变量点沿着坐标轴 i 靠近 \textbf{x}^* 。由可导的定义,有:


\lim_{\alpha \rightarrow 0}\left|\left|\frac{f\left(\textbf{x}^*+\alpha\textbf{e}_i\right)-f\left(\textbf{x}^*\right)}{\alpha}-\textbf{A}\textbf{e}_i\right|\right|=0 \ \left[1.13\right]


只要将 [1.10] 中的 \textbf{x} 替换为 \textbf{x}^*+\alpha\textbf{e}_i 容易得到 [1.13] 。随着 \alpha 取值变化,自变量 \textbf{x}^*+\alpha\textbf{e}_i 沿着坐标轴 i 运动。 \textbf{A} \textbf{e}_i 是矩阵 \textbf{A} 的第 i 列。[1.13] 表明: \textbf{A} 的第 i 列是 f\left(\textbf{x}\right) 的各个分量 f_j\left(\textbf{x}\right)_{\ j=1...m} 对第 i 个自变量 x_i 的在 \textbf{x}^* 的偏导数组成的列向量:


\textbf{A}_i = \left(\begin{array}{ccc}\frac{\partial f_1}{\partial x_i}\left(\textbf{x}^*\right) \\ \frac{\partial f_2}{\partial x_i}\left(\textbf{x}^*\right) \\ \vdots \\ \frac{\partial f_m}{\partial x_i} \left(\textbf{x}^*\right)\end{array}\right) \ \left[1.14\right]


于是 \textbf{A} 就由 f\left(\textbf{x}\right) 的各个分量 f_j\left(\textbf{x}\right)_{\ j=1...m}\textbf{x} 的个分量 x_i 的偏导数组成:


\textbf{A}_{m \times n}=\left(\begin{array}{ccc}\frac{\partial f_1}{\partial x_1}\left(\textbf{x}^*\right) \\\frac{\partial f_2}{\partial x_1}\left(\textbf{x}^*\right) \\\vdots\\\frac{\partial f_m}{\partial x_1}\left(\textbf{x}^*\right) \end{array}\begin{array}{ccc}\frac{\partial f_1}{\partial x_2}\left(\textbf{x}^*\right) \\\frac{\partial f_2}{\partial x_2}\left(\textbf{x}^*\right) \\\vdots\\\frac{\partial f_m}{\partial x_2}\left(\textbf{x}^*\right)\end{array}\begin{array}{ccc}\cdots\\\cdots\\\ddots\\\cdots\end{array}\begin{array}{ccc}\frac{\partial f_1}{\partial x_n}\left(\textbf{x}^*\right) \\\frac{\partial f_2}{\partial x_n}\left(\textbf{x}^*\right) \\\vdots\\\frac{\partial f_m}{\partial x_n}\left(\textbf{x}^*\right)\end{array}\right) \ \left[1.15\right]


\textbf{A} 矩阵称作 f\textbf{x}^* 的雅克比矩阵(jacobi matrix)。它就是多元函数的导“数”。由于各个偏导数在 \textbf{x}^* 是唯一的,所以雅克比矩阵是唯一的。如果 fR^n \rightarrow R 的,那么它的雅克比矩阵是只有一行的矩阵,或者说行向量。这个行向量的转置称为 f\textbf{x}^* 的梯度(gradient)。


多元复合函数的求导链式法则与一元函数相同,仍是将多个函数的导“数”连乘 —— 多元情况下是将雅克比矩阵连乘。例如有两个函数 g:R^n \rightarrow R^m ,其雅克比矩阵为 \textbf{A}_{m \times n}f:R^m \rightarrow R^l ,其雅克比矩阵为 \textbf{B}_{l \times m} 。则复合函数 f\left(g\left(\textbf{x}\right)\right) 的雅克比矩阵为 \left(\textbf{B}\textbf{A}\right)_{l \times n}


接下来的小节只讨论 R^n \rightarrow R 的函数。这样的函数的雅克比矩阵是 1\times n 的行向量,其转置是梯度。梯度与函数的方向导数有关。下文详述。


二、方向导数


函数 f:R^n \rightarrow R 的自变量 \textbf{x}n 个分量 x_1,\ x_2,\ ...x_nfx_i\textbf{x}^* 点的偏导数是 \frac{\partial f}{\partial x_i}\left(\textbf{x}^*\right) 。用文字来说就是当把除 x_i 外的其他分量视作常数时, f\textbf{x}^* 点对 x_i 的瞬时变化率。用数学语言表述就是:


\frac{\partial f}{\partial x_i}\left(\textbf{x}^*\right)=\lim_{\alpha \rightarrow 0}{\frac{f\left(\textbf{x}^*+\alpha\textbf{e}_i\right)-f\left(\textbf{x}^*\right)}{\alpha}} \ \left[2.1\right]


n 个分量的偏导数是 f 分别沿 n 个坐标轴的变化率。标准基向量 \textbf{e}_i 是指向第 i 坐标轴正方向的单位向量。 R^n 中方向无数,不拘于坐标轴方向。取指向任一方向的单位向量 \textbf{d}_{\ ||\textbf{d}||=1} 替换进 [2.1] ,得到:


\lim_{\alpha \rightarrow 0}{\frac{f\left(\textbf{x}^*+\alpha\textbf{d}\right)-f\left(\textbf{x}^*\right)}{\alpha}} \ \left[2.2\right]


这个极限是,以单位向量 \textbf{d} 指向的方向为正方向(可以想象相当于指定了一个新的坐标轴)时 f 的变化率。也可以这样看待 [2.2] : 以 \alpha 为自变量的函数 f\left(\textbf{x}^*+\alpha\textbf{d}\right)\alpha=0 的导数。将这个函数视作复合函数:


f\odot g\left(\alpha\right)=f\left(g\left(\alpha\right)\right) =f\left(\textbf{x}^*+\alpha\textbf{d}\right)\ \left[2.3\right]


其中 g:R \rightarrow R^ng\left(\alpha\right)=\textbf{x}^*+\alpha\textbf{d} 。它的雅克比是 n \times 1 矩阵( n 元列向量)。容易看出这个雅克比矩阵就是向量 \textbf{d} 。根据链式法则,有:


\frac{df\odot g}{d\alpha}\left(0\right)=\left(\nabla f_{\textbf{x}^*}\right)^T\textbf{d} \ \left[2.4\right]


所以 f \odot g \alpha0 点的导数,也就是 f\textbf{x}^* 点沿 \textbf{d} 方向的方向导数,是 f\textbf{x}^* 的梯度 \nabla f_{\textbf{x}^*}\textbf{d} 方向做投影的长度。梯度向某方向的投影的长度等于函数沿着该方向的方向导数。如果梯度向坐标轴 i 做投影,得到的是梯度的第 i 个元素,就是函数对第 i 个自变量的偏导数,也是函数沿着坐标轴 i 的方向导数。


注意:


\left(\nabla f\right)^T\textbf{d}=||\nabla f||\cdot||\textbf{d}||\cdot cos\ \theta=||\nabla f||\cdot cos\ \theta \ \left[2.5\right]


注意这里省略了梯度的下标,表示可以是任一点的梯度。第二个等号是因为 \textbf{d} 是单位向量,长度()为 1 。 \theta 是梯度与 \textbf{d} 之间的夹角。可见当夹角为 0 ,即 \textbf{d} 与梯度同方向时 f 方向导数最大(),增速最高。在与梯度相反的方向上 f 的方向导数最小(),下降最快。这也就是梯度下降法的依据。在与梯度垂直的方向上 f 的方向导数为 0 ,即增速为 0注意这是瞬时性质)。如果 f 在某一点的梯度本身是 \textbf{0} 向量,那么 f 沿任何方向的方向导数(瞬时增速)都为 0 。梯度为 \textbf{0} 的点是 f 点的驻点(stationary point ,又叫 critical point 。不是拐点,虽然现在新闻中有很多误用)。局部极小 / 极大点、鞍点都是驻点。


总结一下:


  1. f:R^n \rightarrow R 在某点的导,是一个 1 \times n 的矩阵(雅克比矩阵),该矩阵的转置是一个 n 元向量,是 f 在该点的梯度。
  2. f 在某点沿着某个方向的瞬时变化率是 f 在该方向的方向导数, f 在某点的各个偏导数是沿着各个坐标轴方向的方向导数。
  3. f 在某点沿某方向的方向导数等于 f 在该点的梯度向那个方向的投影长度,沿着梯度本身方向,方向导数最大。沿着梯度相反方向,方向导数最小。垂直于梯度方向,方向导数为 0

三、二阶导


二阶导是导函数的导函数。函数 f:R^n \rightarrow R 的导函数是将 x \in R^n 映射到 \left(\nabla f\right)^T \in R^{1\times n} 的函数。不必在乎因变量是横排还是竖排,总之是 n 个数。也就是说 f 的导函数是一个 R^n \rightarrow R^n 的函数。 f 的二阶导应该是一个 n \times n 的矩阵,其第 i 列由 \left(\nabla f\right)^T 的各分量对 x_i 的偏导构成:


\textbf{H}_{\textbf{x}^*}=\left(\begin{array}{ccc}\frac{\partial f}{\partial x_1\partial x_1}\left(\textbf{x}^*\right) \\\frac{\partial f}{\partial x_1\partial x_2}\left(\textbf{x}^*\right) \\\vdots\\\frac{\partial f}{\partial x_1\partial x_n}\left(\textbf{x}^*\right) \end{array}\begin{array}{ccc}\frac{\partial f}{\partial x_2\partial x_1}\left(\textbf{x}^*\right) \\\frac{\partial f}{\partial x_2\partial x_2}\left(\textbf{x}^*\right) \\\vdots\\\frac{\partial f}{\partial x_2 \partial x_n}\left(\textbf{x}^*\right)\end{array}\begin{array}{ccc}\cdots\\\cdots\\\ddots\\\cdots\end{array}\begin{array}{ccc}\frac{\partial f}{\partial x_n \partial x_1}\left(\textbf{x}^*\right) \\\frac{\partial f}{\partial x_n \partial x_2}\left(\textbf{x}^*\right) \\\vdots\\\frac{\partial f}{\partial x_n \partial x_n}\left(\textbf{x}^*\right)\end{array}\right) \ \left[3.1\right]


\textbf{H}_{\textbf{x}^*} 称为 fx^* 的赫森矩阵。 \frac{\partial f}{\partial x_j \partial x_i}\left(\textbf{x}^*\right) 表示 fx_i 的偏导数再对 x_j 做偏导。有一个结论:如果 \frac{\partial f}{\partial x_j \partial x_i}\left(\textbf{x}^*\right)\frac{\partial f}{\partial x_i \partial x_j}\left(\textbf{x}^*\right) 都在 \textbf{x}^* 是连续的,那么它们相等。也就是说在满足连续性的前提下,二阶偏导不依赖求偏导的次序。以下我们都假设满足连续性。如此 \textbf{H}_{\textbf{x}^*} 是对称矩阵: \textbf{H}_{\textbf{x}^*}^T=\textbf{H}_{\textbf{x}^*}


f 的方向导数是 f 在某方向的变化率。那么如何求得 f 在某方向上的二阶变化率 —— 二阶导呢?


\lim_{\alpha \rightarrow 0}{\frac{\nabla f\left(\textbf{x}^*+\alpha\textbf{d}\right)^T\textbf{d}-\nabla f\left(\textbf{x}^*\right)^T\textbf{d}}{\alpha}} \ \left[3.2\right]


[3.2] 极限的分子上相减的两项是 f\textbf{x}^*+\alpha\textbf{d}\textbf{x}^* 两个点上的沿 \textbf{d} 方向的方向导数。该极限就是 \textbf{d} 方向上的二阶导。同时这个式子也是 \nabla f\left(\textbf{x}^*+\alpha\textbf{d}\right)^T\textbf{d} 作为 \alpha 的函数,在 0 的导数。仍将其视为一个复合函数:


\alpha \rightarrow \textbf{x}^*+\alpha\textbf{d} \rightarrow \nabla f\left(\textbf{x}^*+\alpha\textbf{d}\right) \rightarrow \nabla f\left(\textbf{x}^*+\alpha\textbf{d}\right)^T\textbf{d} \ \left[3.3\right]


这是一个 R \rightarrow R^n \rightarrow R^n \rightarrow R 的函数。对这个函数运用链式法则求导,得到:


\lim_{\alpha \rightarrow 0}{\frac{\nabla f\left(\textbf{x}^*+\alpha\textbf{d}\right)^T\textbf{d}-\nabla f\left(\textbf{x}^*\right)^T\textbf{d}}{\alpha}}=\textbf{d}^T\textbf{H}_{\textbf{x}^*}\textbf{d} \ \left[3.4\right]


所以函数 f 在某点沿着 \textbf{d} 方向的二阶导数是 f 在该点的赫森矩阵 \textbf{H}_{\textbf{x}^*} 的一个二次型 \textbf{d}^T\textbf{H}_{\textbf{x}^*}\textbf{d}


刚才说 \textbf{H}_{\textbf{x}^*} 是一个对称矩阵。对称矩阵可以进行谱分解(spectrum decomposition):


\textbf{H}_{\textbf{x}^*}=\textbf{V} \Lambda \textbf{V}^T \ \left[3.5\right]


\Lambda 是一个 n \times n 的对角阵,对角线元素是 \textbf{H}_{\textbf{x}^*}n 个特征值 \lambda_1,\lambda_2,...\lambda_n\textbf{V} 是正交矩阵 \textbf{V}^T\textbf{V}=\textbf{V}\textbf{V}^T=\textbf{I} 。它的列是 \textbf{H}_{\textbf{x}^*}n 个特征值对应的 n 个特征向量。它们构成 n 维空间的一组基。对于任意一个方向 \textbf{d} ,其方向上 f 的二阶导是:


\textbf{d}^T\textbf{H}_{\textbf{x}^*}\textbf{d}=\left(\textbf{V}^T\textbf{d}\right)^T\Lambda\left(\textbf{V}^T\textbf{d}\right) \ \left[3.6\right]


如果:

  1. \textbf{H}_{\textbf{x}^*} 半正定(特征值都非负),那么在 \textbf{x}^* 朝任何方向 f 的二阶导数都是非负;
  2. \textbf{H}_{\textbf{x}^*} 正定(特征值都为正),那么在 \textbf{x}^* 朝任何方向 f 的二阶导数都是正数;
  3. \textbf{H}_{\textbf{x}^*} 负定或半负定与正定或半正定情况下类似;
  4. \textbf{H}_{\textbf{x}^*} 不定,有些方向上 f 二阶导为正,有些方向上 f 二阶导为负。


梯度和赫森矩阵是分析函数直到二阶的特性的工具。看一个二次函数:


f\left(\textbf{x}\right)=a+\textbf{b}^T\textbf{x}+\frac{1}{2}\textbf{x}^T\textbf{H}\textbf{x} \ \left[3.7\right]


f 的梯度是 \nabla f\left(\textbf{x}\right)=\textbf{b}+\textbf{H}\textbf{x} ,赫森矩阵在所有点都是 \textbf{H} 。假设 \textbf{H} 是正定的。 f 的唯一驻点是 -\textbf{H}^{-1}\textbf{b}f 在任何一点朝任何方向的二阶导数都为正,方向导数都要变大。所以 -\textbf{H}^{-1}\textbf{b} 是唯一的驻点,是 f 唯一的全局最小点。


二次型 \textbf{d}^T\textbf{H}\textbf{d} 有这样的性质:


\textbf{v}_1=argmax_{||\textbf{d}||=1}\textbf{d}^T\textbf{H}\textbf{d} \\\textbf{v}_2=argmax_{||\textbf{d}||=1, \ d\bot\textbf{v}_1}\textbf{d}^T\textbf{H}\textbf{d}\ \left[3.8\right]


使 \textbf{d}^T\textbf{H}\textbf{d} 达到最大的单位向量是 \textbf{H} 的最大特征值 \lambda_1 对应的单位特征向量 \textbf{v}_1 。在与 \textbf{v}_1 正交的前提下使 \textbf{d}^T\textbf{H}\textbf{d} 达到最大的单位向量是 \textbf{H} 的第二大特征值 \lambda_2 对应的单位特征向量 \textbf{v}_2 。依此类推。


看以下这个二次函数:

图 1


它的式子是:


y=x_1^2+2x_2^2=\frac{1}{2}\left(x_1\ x_2\right)\left(\begin{array}{ccc}2\ 0\\0\ 4\end{array}\right)\left(\begin{array}{ccc}x_1\\x_2\end{array}\right) \ \left[3.9\right]


原点是它的唯一驻点(全局最小点)。它的赫森矩阵是 \textbf{H}=\left(\begin{array}{ccc}2\ 0\\0\ 4\end{array}\right)\textbf{H} 的最大特征值是 4 ,特征方向是 x_2 轴;最小特征值是 2 ,特征方向是 x_1 轴。所以在原点可以看到:沿 x_2 轴方向图形向上弯曲最强烈;沿 x_1 方向图形向上弯曲最平缓。


梯度下降法只基于函数一阶信息,有时候做不出最佳选择。因为梯度反方向虽然是函数下降最快的方向,但是如果这个方向上二阶导数很大,方向导将很快上升。沿着该方向前进一小步也许函数值不降反升。接下来我们看一看利用了函数二阶信息的优化算法。


四、牛顿法


在某一点 \textbf{x}_0 可以对函数 f 进行二阶泰勒展开(taylor expansion):


f\left(\textbf{x}\right)=f\left(\textbf{x}_0\right)+\left(\nabla f_{\textbf{x}_0}\right)^T\left(\textbf{x}-\textbf{x}_0\right)+\frac{1}{2}\left(\textbf{x}-\textbf{x}_0\right)^T\textbf{H}_{\textbf{x}_0}\left(\textbf{x}-\textbf{x}_0\right)+R\left(||\textbf{x}-\textbf{x}_0||^2\right) \ \left[4.1\right]


上式最后的余项 R||\textbf{x}-\textbf{x}_0||^2 的高阶无穷小,在极靠近 \textbf{x}_0 的区域可将其忽略。也就是说在极其靠近 \textbf{x}_0 的区域内可以用一个二次函数近似表示 f 。如果这个二次函数的赫森矩阵 \textbf{H}_{\textbf{x}_0} 是正定的,那么该二次函数具有唯一全局最小点,也就是它唯一的驻点:


\textbf{x}_1=\textbf{x}_0-\textbf{H}_{\textbf{x}_0}^{-1}\nabla f_{\textbf{x}_0} \ \left[4.2\right]


在这个新的点 \textbf{x}_1 上重复这个过程。这就是寻找函数最优点的牛顿法。用语言描述就是:在任意起始点附近用二次函数拟合原函数。计算该二次函数的最小点。再以这个最小点为起始点重复此过程。牛顿法迭代公式如下:


\textbf{x}^{t+1}=\textbf{x}^{t}-\textbf{H}_{\textbf{x}^t}^{-1}\nabla f_{\textbf{x}^t} \ \left[4.3\right]


如果 f 本身就是一个凸二次函数(赫森矩阵正定),那么在任何一点对 f 进行二阶泰勒展开得到的就是 f 本身。在这种情况下牛顿法一步就能找到 f 的全局最小点。


注意,对于二次函数,只有当赫森矩阵正定时,才存在唯一全局最小点,故上述讨论,都是在赫森矩阵正定的前提下。运用牛顿法需要求赫森矩阵的逆,其计算量有时是不可承受的。人们提出了一些拟牛顿法,例如 BFGS ,LBFGS 等,本文不做介绍。


五、共轭方向法


对于一个二次函数 f ,其赫森矩阵为 \textbf{H} 。选一个随机的起始点 \textbf{x}_0 和一个随机的起始方向 \textbf{d}_1||\textbf{d}_1||=1用一个单位向量来指示方向)。令自变量沿着 \textbf{d}_1 变化:


g\left(\alpha\right)=f\left(\textbf{x}_0+\alpha\textbf{d}_1\right)=f\left(\textbf{x}_0\right)+\alpha\left(\nabla f_{\textbf{x}_0}\right)^T\textbf{d}_1+\frac{\alpha^2}{2}\textbf{d}_1^T\textbf{H}\textbf{d}_1 \ \left[5.1\right]


\textbf{x}_0+\alpha\textbf{d} 代入 f\textbf{x}_0 处的二阶泰勒展开。因为 f 是二次函数,该展开就是 f 本身,所以第二个等号成立。 g 是关于 \alpha 的二次函数。它有全局最小点:


\alpha^*=-\frac{\left(\nabla f_{\textbf{x}_0}\right)^T\textbf{d}_1}{\textbf{d}_1^T\textbf{H}\textbf{d}_1} \ \left[5.2\right]


因为 \alpha^*f 沿着 \textbf{d}_1 方向的最小点,所以在 \textbf{x}_0+\alpha^*\textbf{d}_1f 沿 \textbf{d}_1 方向的导数为 0 。即:


\nabla f\left(\textbf{x}_0+\alpha^*\textbf{d}_1\right)^T\textbf{d}_1=0 \ \left[5.3\right]


现在假设有另一方向 \textbf{d}_2 满足:


\textbf{d}_2^T\textbf{H}\textbf{d}_1=\textbf{d}_1^T\textbf{H}\textbf{d}_2=0 \ \left[5.4\right]


\textbf{d}_2\textbf{d}_1 关于 \textbf{H} 共轭(conjugate)。我们看当自变量从任一点出发沿 \textbf{d}_2 运动时 f 沿着 \textbf{d}_1 方向的导数的变化率(二阶导)如何:


\frac{d\nabla f\left(\textbf{x}_0+\alpha\textbf{d}_2\right)^T\textbf{d}_1}{d\alpha}=\textbf{d}_1^TH\textbf{d}_2=0 \ \left[5.5\right]


上式第一步对一个三层的复合函数运用了链式法则。[5.4] 表明自变量沿着 \textbf{d}_2 方向运动时, f 沿 \textbf{d}_1 方向的二阶导为 0 。也就是 f 沿着 \textbf{d}_1 方向的导数无变化。那么如果从 [5.2] 中的 \textbf{x}_0+\alpha^*\textbf{d}_1 出发沿着 \textbf{d}_2 运动,则在此运动过程中 f 沿着 \textbf{d}_1 方向的导数保持为 0 。也就是运动过程中,沿着 \textbf{d}_1 方向 f 保持是最小点。所以可以首先沿着 \textbf{d}_1 使 f 达到该方向的最小,之后沿着 \textbf{d}_2 寻找最小,同时能保持 f 沿 \textbf{d}_1 方向是最小。


之后可以再寻找一个方向 \textbf{d}_3\textbf{d}_1\textbf{d}_2 关于 \textbf{H} 都共轭。那么 f 沿着 \textbf{d}_3 运动时,在 \textbf{d}_1\textbf{d}_2 方向上二阶导都为 0 。如果之前已经沿着 \textbf{d}_1\textbf{d}_2 方向找到了 f 在相应方向的最小,则沿着 \textbf{d}_3 寻找时在 \textbf{d}_1\textbf{d}_2 方向 f 仍保持最小。


如果有 n 个方向 \textbf{d}_{i\ i=1...n} 关于 \textbf{H} 是两两共轭的,那么它们是线性无关的。因为假如存在一组系数 \alpha_{i \ i=1...n} 满足:


\alpha_1\textbf{d}_1+\alpha_2\textbf{d}_2+...+\alpha_n\textbf{d}_n=\textbf{0} \ \left[5.6\right]


那么对任何一个 i 有:


\textbf{d}_i^T\textbf{H}\left(\alpha_1\textbf{d}_1+\alpha_2\textbf{d}_2+...+\alpha_n\textbf{d}_n\right)=\alpha_1\textbf{d}_i^T\textbf{H}\textbf{d}_1+\alpha_2\textbf{d}_i^T\textbf{H}\textbf{d}_2+...+\alpha_n\textbf{d}_i^T\textbf{H}\textbf{d}_n\\=\alpha_i\textbf{d}_i^T\textbf{H}\textbf{d}_i\\=0 \ \left[5.7\right]


\textbf{H} 正定,则 \textbf{d}_i^T\textbf{H}\textbf{d}_i>0 。于是必有 \alpha_i=0 。这对所有 i 都成立,所以 \textbf{d}_{i\ i=1...n} 线性独立。它们构成 R^n 的一组基。


当沿上述 n 个共轭方向依次完成最小值搜索,就沿着 R^n 的所有方向搜索到了 f 的全局最小点。这就是共轭方向法。对于凸二次函数(赫森矩阵正定),共轭方向法用 n 步找到全局最小点。对于图 1 中的二次函数,若选择 x_1 轴作为第一个方向,将沿着 x_1 轴运动到 x_2 轴上。 然后以 x_2 轴为第二个共轭方向运动到原点 —— 全局最小点。


如果 \textbf{v}_1, \textbf{v}_2,...\textbf{v}_n\textbf{H} 的标准正交基,任取其中两个,有:


\textbf{v}_i^T\textbf{H}\textbf{v}_j=\lambda_j\textbf{v}_i^T\textbf{v}_j=0 \ \left[5.8\right]



所以 \textbf{v}_1, \textbf{v}_2,...\textbf{v}_n 就是一组关于 \textbf{H} 的共轭方向。


对非二次函数 f 仍然可以运用共轭方向法。计算某一点 \textbf{x}_0 的赫森矩阵得到 n 个共轭方向(赫森矩阵的特征向量),进行 n 次线性搜索,找到一个新的点 \textbf{x}_1 ,就是 f\textbf{x}_0 点的近似二次函数的全局最小点(牛顿法可以一步找到它)。然后以 \textbf{x}_1 为初始点重复本过程。


共轭方向法可以选择任意 n 个共轭方向,不一定是 \textbf{H}n 个特征向量。比如可以从任一点选择该点的梯度反方向。这就是共轭梯度法,本文不详述。


可见,基于二阶的优化算法利用了函数局部的二阶特性。相比梯度下降法,它们参考了更多的信息。但是计算赫森矩阵的计算量是巨大的。虽然有一些二阶方法避免了赫森矩阵的计算,但是对于像神经网络训练这样的复杂非凸优化问题,二阶方法并不能保证有更好的优化性能。目前在深度学习中基于梯度的方法仍是主流。


六、参考书目


最优化导论 (豆瓣)book.douban.com图标深度学习 (豆瓣)book.douban.com图标

编辑于 2019-06-10

文章被以下专栏收录

    The future will be an ever more demanding struggle against the limitations of our intelligence, not a comfortable hammock in which we can lie down to be waited upon by our robot slaves. -- Norbert Wiener “The Human Use Of Human Beings”