Hessian矩阵与多元函数极值
海塞矩阵(Hessian Matrix),又译作海森矩阵,是一个多元函数的二阶偏导数构成的方阵。虽然它是一个具有悠久历史的数学成果。可是在机器学习和图像处理(比如SIFT和SURF特征检測)中,我们也经常遇到它。所以本文就来向读者道一道Hessian Matrix的来龙去脉。本文的主要内容包括:
多元函数极值问题
回忆一下我们是怎样处理一元函数求极值问题的。
比如。f(x)=x2<script id="MathJax-Element-213" type="math/tex">f(x)=x^2</script>,我们会先求一阶导数,即f′(x)=2x<script id="MathJax-Element-214" type="math/tex">f'(x)=2x</script>,依据费马定理极值点处的一阶导数一定等于 0<script id="MathJax-Element-215" type="math/tex">0</script>。但这仅是一个必要条件。而非充分条件。对于f(x)=x2<script id="MathJax-Element-216" type="math/tex">f(x)=x^2</script>来说,函数的确在一阶导数为零的点取得了极值,可是对于f(x)=x3<script id="MathJax-Element-217" type="math/tex">f(x)=x^3</script>来说,显然只检查一阶导数是不足以下定论的。
这时我们须要再求一次导,假设二阶导数 f″<0<script id="MathJax-Element-218" type="math/tex">f''<0</script>,那么说明函数在该点取得局部极大值;假设二阶导数 f″>0<script id="MathJax-Element-219" type="math/tex">f''>0</script>,则说明函数在该点取得局部极小值;假设 f″=0<script id="MathJax-Element-220" type="math/tex">f''=0</script>。则结果仍然是不确定的,我们就不得不再通过其它方式来确定函数的极值性。
假设要在多元函数中求极值点,方法与此相似。
作为一个演示样例。最好还是用一个三元函数 f=f(x,y,z)<script id="MathJax-Element-221" type="math/tex">f=f(x,y,z)</script> 来作为演示样例。首先要对函数中的每一个变量分别求偏导数,这会告诉我们该函数的极值点可能出如今哪里。即
∂f∂x=0∂f∂y=0∂f∂x=0
<script id="MathJax-Element-222" type="math/tex; mode=display">\frac{\partial f}{\partial x}=0\\
\frac{\partial f}{\partial y}=0\\
\frac{\partial f}{\partial x}=0</script>
接下来。要继续求二阶导数,此时包括混合偏导数的情况一共同拥有
9<script id="MathJax-Element-223" type="math/tex">9</script> 个。假设用矩阵形式来表示的话就得到
H=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂2f∂x∂x∂2f∂y∂x∂2f∂z∂x∂2f∂x∂y∂2f∂y∂y∂2f∂z∂y∂2f∂x∂z∂2f∂y∂z∂2f∂z∂z⎤⎦⎥⎥⎥⎥⎥⎥⎥
<script id="MathJax-Element-224" type="math/tex; mode=display">\mathbf{H}=\begin{bmatrix} \frac{\partial^2f}{\partial x\partial x} & \frac{\partial^2f}{\partial x\partial y} & \frac{\partial^2f}{\partial x\partial z} \\ \frac{\partial^2f}{\partial y\partial x} & \frac{\partial^2f}{\partial y\partial y} & \frac{\partial^2f}{\partial y\partial z} \\\frac{\partial^2f}{\partial z\partial x}&\frac{\partial^2f}{\partial z\partial y}&\frac{\partial^2f}{\partial z\partial z} \end{bmatrix}</script>
这个矩阵就称为Hessian矩阵。当然上面所给出的不过一个三阶的Hessian矩阵。
稍作扩展。我们能够对一个在定义域内二阶连续可导的实值多元函数 f(x1,x2,⋯,xn)<script id="MathJax-Element-225" type="math/tex">f(x_1, x_2, \cdots, x_n)</script> 定义其Hessian矩阵H<script id="MathJax-Element-226" type="math/tex">\mathbf{H}</script>例如以下
H=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢∂2f∂x21∂2f∂x2∂x1⋮∂2f∂xn∂x1∂2f∂x1∂x2∂2f∂x22⋮∂2f∂xn∂x2⋯⋯⋱⋯∂2f∂x1∂xn∂2f∂x2∂xn⋮∂2f∂x2n⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥
<script id="MathJax-Element-227" type="math/tex; mode=display">\mathbf{H}=\begin{bmatrix}
\frac{\partial^2f}{\partial x_1^2} & \frac{\partial^2f}{\partial x_1\partial x_2} & \cdots &\frac{\partial^2f}{\partial x_1\partial x_n} \\
\frac{\partial^2f}{\partial x_2\partial x_1} & \frac{\partial^2f}{\partial x_2^2} & \cdots &\frac{\partial^2f}{\partial x_2\partial x_n} \\ \vdots & \vdots & \ddots & \vdots \\
\frac{\partial^2f}{\partial x_n\partial x_1}&\frac{\partial^2f}{\partial x_n\partial x_2}&\cdots &\frac{\partial^2f}{\partial x_n^2} \end{bmatrix}</script>
当一元函数的二阶导数等于 0<script id="MathJax-Element-228" type="math/tex">0</script> 时,我们并不能确定函数在该点的极值性。相似地,面对Hessian矩阵,仍然存在无法断定多元函数极值性的的情况。即当Hessian矩阵的行列式为 0<script id="MathJax-Element-229" type="math/tex">0</script> 时。我们无法确定函数能否取得极值。甚至我们可能会得到一个鞍点,也就是一个既非极大值也非极小值的的点。
基于Hessian矩阵,就能够推断多元函数的极值情况了。结论例如以下
- 假设是正定矩阵,则临界点处是一个局部极小值
- 假设是负定矩阵,则临界点处是一个局部极大值
- 假设是不定矩阵,则临界点处不是极值
怎样推断一个矩阵是否是正定的,负定的,还是不定的呢?一个最经常使用的方法就是顺序主子式。实对称矩阵为正定矩阵的充要条件是的各顺序主子式都大于零。当然这个判定方法的计算量比較大。
对于实二次型矩阵另一个判定方法:实二次型矩阵为正定二次型的充要条件是的矩阵的特征值全大于零。为负定二次型的充要条件是的矩阵的特征值全小于零,否则是不定的。
假设你对二次型的概念仍然不非常熟悉,这里也稍作补充。定义含有 n<script id="MathJax-Element-230" type="math/tex">n</script>
个变量 x1,x2,⋯,xn<script id="MathJax-Element-231" type="math/tex">x_1,x_2,\cdots,x_n</script> 的二次齐次函数
f(x1,x2,⋯,xn)=a11x21+a22x22+⋯+annx2n+2a12x1x2+2a13x1x3+⋯+2an−1,nxn−1xn
<script id="MathJax-Element-232" type="math/tex; mode=display">f(x_1,x_2,\cdots,x_n)=a_{11}x_1^2+a_{22}x_2^2+\cdots+a_{nn}x_n^2+2a_{12}x_1x_2+2a_{13}x_1x_3+\cdots+2a_{n-1,n}x_{n-1}x_n</script>
为二次型。取
aij=aji<script id="MathJax-Element-233" type="math/tex">a_{ij}=a_{ji}</script>,则
2aijxixj+ajixjxi<script id="MathJax-Element-234" type="math/tex">2a_{ij}x_ix_j+a_{ji}x_jx_i</script>,于是上式能够写成
f==a11x21+a12x1x2+⋯+a1nx1xn+a21x2x1+a22x22+⋯+a2nx2xn+⋯+an1xnx1+an2xnx2+⋯+annx2n∑i,j=1naijxixj
<script id="MathJax-Element-235" type="math/tex; mode=display">\begin{align}f=&a_{11}x_1^2+a_{12}x_1x_2+\cdots+a_{1n}x_1x_n\\
&+a_{21}x_2x_1+a_{22}x_2^2+\cdots+a_{2n}x_2x_n+\cdots\\
&+a_{n1}x_nx_1+a_{n2}x_nx_2+\cdots+a_{nn}x_n^2\\
=&\sum_{i,j=1}^na_{ij}x_ix_j\end{align}</script>
更进一步,假设用矩阵对上式进行改写,则有
f===x1(a11x1+a12x2+⋯+a1nxn)+x2(a21x1+a22x2+⋯+a2nxn)+⋯+xn(an1x1+an2x2+⋯+annxn)(x1,x2,⋯,xn)⎡⎣⎢⎢⎢⎢a11x1+a12x2+⋯+a1nxna21x1+a22x2+⋯+a2nxn⋮an1x1+an2x2+⋯+annxn⎤⎦⎥⎥⎥⎥(x1,x2,⋯,xn)⎡⎣⎢⎢⎢⎢a11a21⋮an1a12a22⋮an2⋯⋯⋱⋯a1na2n⋮ann⎤⎦⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢x1x2⋮xn⎤⎦⎥⎥⎥⎥
<script id="MathJax-Element-236" type="math/tex; mode=display">\begin{align}f=&x_1(a_{11}x_1+a_{12}x_2+\cdots+a_{1n}x_n)+\\
&x_2(a_{21}x_1+a_{22}x_2+\cdots+a_{2n}x_n)+\cdots+\\
&x_n(a_{n1}x_1+a_{n2}x_2+\cdots+a_{nn}x_n)\\=&(x_1,x_2,\cdots,x_n)
\begin{bmatrix}a_{11}x_1+a_{12}x_2+\cdots+a_{1n}x_n\\
a_{21}x_1+a_{22}x_2+\cdots+a_{2n}x_n\\\vdots\\
a_{n1}x_1+a_{n2}x_2+\cdots+a_{nn}x_n
\end{bmatrix}\\
=&(x_1,x_2,\cdots,x_n)
\begin{bmatrix}
a_{11}&a_{12}&\cdots&a_{1n}\\
a_{21}&a_{22}&\cdots&a_{2n}\\
\vdots&\vdots&\ddots&\vdots\\
a_{n1}&a_{n2}&\cdots&a_{nn}
\end{bmatrix}\begin{bmatrix}x_1\\x_2\\\vdots\\x_n\end{bmatrix}
\end{align}</script>
记
A=⎡⎣⎢⎢⎢⎢a11a21⋮an1a12a22⋮an2⋯⋯⋱⋯a1na2n⋮ann⎤⎦⎥⎥⎥⎥,x=⎡⎣⎢⎢⎢⎢x1x2⋮xn⎤⎦⎥⎥⎥⎥
<script id="MathJax-Element-237" type="math/tex; mode=display">\mathbf{A}=\begin{bmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\
a_{21}&a_{22}&\cdots&a_{2n}\\
\vdots&\vdots&\ddots&\vdots\\
a_{n1}&a_{n2}&\cdots&a_{nn}
\end{bmatrix},\mathbf{x}=
\begin{bmatrix}x_1\\x_2\\\vdots\\x_n\end{bmatrix}</script>
则二次型可记作
f=xTAx<script id="MathJax-Element-238" type="math/tex">f=\mathbf{x}^T\mathbf{A}\mathbf{x}</script>,当中
A<script id="MathJax-Element-239" type="math/tex">\mathbf{A}</script>为对称阵。
设有二次型
f=xTAx<script id="MathJax-Element-240" type="math/tex">f=\mathbf{x}^T\mathbf{A}\mathbf{x}</script>,假设对不论什么
x≠0<script id="MathJax-Element-241" type="math/tex">x\not=0</script>,都有
f>0<script id="MathJax-Element-242" type="math/tex">f>0</script>,则称
f<script id="MathJax-Element-243" type="math/tex">f</script> 为正定二次型。并称对称矩阵
A<script id="MathJax-Element-244" type="math/tex">\mathbf{A}</script> 是正定的。假设对不论什么
x≠0<script id="MathJax-Element-245" type="math/tex">x\not=0</script>,都有
f<0<script id="MathJax-Element-246" type="math/tex">f<0</script>,则称
f<script id="MathJax-Element-247" type="math/tex">f</script> 为负定二次型,并称对称矩阵
A<script id="MathJax-Element-248" type="math/tex">\mathbf{A}</script> 是负定的。
正定矩阵一定是非神秘的。对阵矩阵
A<script id="MathJax-Element-249" type="math/tex">\mathbf{A}</script> 为正定的充分必要条件是:
A<script id="MathJax-Element-250" type="math/tex">\mathbf{A}</script> 的特征值全为正。由此还可得到以下这个推论:对阵矩阵
A<script id="MathJax-Element-251" type="math/tex">\mathbf{A}</script> 为正定的充分必要条件是
A<script id="MathJax-Element-252" type="math/tex">\mathbf{A}</script> 的各阶主子式都为正。
假设将正定矩阵的条件由 xTAx>0<script id="MathJax-Element-253" type="math/tex">\mathbf{x}^T\mathbf{A}\mathbf{x}>0</script> 弱化为 xTAx≥0<script id="MathJax-Element-254" type="math/tex">\mathbf{x}^T\mathbf{A}\mathbf{x}\geq0</script>。则称对称矩阵 A<script id="MathJax-Element-255" type="math/tex">\mathbf{A}</script> 是半正定的。
泰勒展开式与Hessian矩阵
主页君已经在之前的《图像处理中的数学原理具体解释》系列文章中介绍过泰勒展开式了。
但那个时候我们给出的是一元函数的泰勒公式,最好还是先来复习一下。
设一元函数 f(x)<script id="MathJax-Element-44" type="math/tex">f(x)</script> 在包括点x0<script id="MathJax-Element-45" type="math/tex">x_0</script>的开区间 (a,b)<script id="MathJax-Element-46" type="math/tex">(a,b)</script> 内具有 n+1<script id="MathJax-Element-47" type="math/tex">n+1</script> 阶导数。则当 x∈(a,b)<script id="MathJax-Element-48" type="math/tex">x\in (a,b)</script> 时。有
f(x)=f(x0)+f′(x0)(x−x0)+f″(x0)2!(x−x0)2+⋯+f(n)(x0)n!(x−x0)n+Rn(x)
<script id="MathJax-Element-49" type="math/tex; mode=display">f(x)=f(x_0)+f'(x_0)(x-x_0)+\frac{f''(x_0)}{2!}(x-x_0)^2+\cdots+\frac{f^{(n)}(x_0)}{n!}(x-x_0)^n+R_n(x)</script>
当中
Rn(x)=f(n+1)(ξ)(n+1)!(x−x0)n+1
<script id="MathJax-Element-50" type="math/tex; mode=display">R_n(x)=\frac{f^{(n+1)}(\xi)}{(n+1)!}(x-x_0)^{n+1}</script>
而且。
ξ<script id="MathJax-Element-51" type="math/tex">\xi</script> 在
x<script id="MathJax-Element-52" type="math/tex">x</script> 和
x0<script id="MathJax-Element-53" type="math/tex">x_0</script>之间,这被称作是拉格朗日余项。上式被称为
f(x)<script id="MathJax-Element-54" type="math/tex">f(x)</script> 的
n<script id="MathJax-Element-55" type="math/tex">n</script> 阶泰勒公式。在不须要余项的精确表达式时。
Rn(x)<script id="MathJax-Element-56" type="math/tex">R_n(x)</script> 能够记作
o[(x−x0)n]<script id="MathJax-Element-57" type="math/tex">o[(x-x_0)^n]</script>,这被称为是皮亚诺余项。
如今我们把上面这个结论略微做一下推广,从而给出二元函数的泰勒公式。设二元函数 z=f(x,y)<script id="MathJax-Element-58" type="math/tex">z=f(x,y)</script> 在点 (x0,y0)<script id="MathJax-Element-59" type="math/tex">(x_0,y_0)</script> 的某一邻域内连续且有直到 n+1<script id="MathJax-Element-60" type="math/tex">n+1</script> 阶的连续偏导数,则有
f(x,y)=f(x0,y0)+[(x−x0)∂∂x+(y−y0)∂∂y]f(x0,y0)+12![(x−x0)∂∂x+(y−y0)∂∂y]2f(x0,y0)+⋯++1n![(x−x0)∂∂x+(y−y0)∂∂y]nf(x0,y0)+1(n+1)f[x0+θ(x−x0),y0+θ(y−y0)]
<script id="MathJax-Element-61" type="math/tex; mode=display">\begin{align}f(x,y)&=f(x_0,y_0)+[(x-x_0)\frac{\partial}{\partial x}+(y-y_0)\frac{\partial}{\partial y}]f(x_0,y_0)\\
&+\frac{1}{2!}[(x-x_0)\frac{\partial}{\partial x}+(y-y_0)\frac{\partial}{\partial y}]^2f(x_0,y_0)+\cdots +\\
&+\frac{1}{n!}[(x-x_0)\frac{\partial}{\partial x}+(y-y_0)\frac{\partial}{\partial y}]^nf(x_0,y_0)\\
&+\frac{1}{(n+1)!}[(x-x_0)\frac{\partial}{\partial x}+(y-y_0)\frac{\partial}{\partial y}]^{(n+1)}f[x_0+\theta(x-x_0),y_0+\theta(y-y_0)]\end{align}</script>
当中,
0<θ<1<script id="MathJax-Element-62" type="math/tex">0<\theta<1</script>,记号
[(x−x0)∂∂x+(y−y0)∂∂y]f(x0,y0)
<script id="MathJax-Element-63" type="math/tex; mode=display">[(x-x_0)\frac{\partial}{\partial x}+(y-y_0)\frac{\partial}{\partial y}]f(x_0,y_0)</script>
表示
(x−x0)fx(x0,y0)+(y−y0)fy(x0,y0)
<script id="MathJax-Element-64" type="math/tex; mode=display">(x-x_0)f_x(x_0,y_0)+(y-y_0)f_y(x_0,y_0)</script>
记号
[(x−x0)∂∂x+(y−y0)∂∂y]2f(x0,y0)
<script id="MathJax-Element-65" type="math/tex; mode=display">[(x-x_0)\frac{\partial}{\partial x}+(y-y_0)\frac{\partial}{\partial y}]^2f(x_0,y_0)</script>
表示
(x−x0)2fxx(x0,y0)+2(x−x0)(y−y0)fxy(x0,y0)+(y−y0)2fyy(x0,y0)
<script id="MathJax-Element-66" type="math/tex; mode=display">(x-x_0)^2f_{xx}(x_0,y_0)+2(x-x_0)(y-y_0)f_{xy}(x_0,y_0)+(y-y_0)^2f_{yy}(x_0,y_0)</script>
一般地,记号
[(x−x0)∂∂x+(y−y0)∂∂y]mf(x0,y0)
<script id="MathJax-Element-67" type="math/tex; mode=display">[(x-x_0)\frac{\partial}{\partial x}+(y-y_0)\frac{\partial}{\partial y}]^mf(x_0,y_0)</script>
表示
∑p=0mCpm(x−x0)p(y−y0)(m−p)∂mf∂xp∂y(m−p)∣∣∣(x0,y0)
<script id="MathJax-Element-68" type="math/tex; mode=display">\sum_{p=0}^m{C_m^p (x-x_0)^p (y-y_0)^{(m-p)}\frac{\partial^mf}{\partial x^p\partial y^{(m-p)}}}\bigg|_{(x_0,y_0)}</script>
当然。我们能够用一种更加简洁的形式来重写上面的和式,则有
f(x,y)=∑k=0n1k![(x−x0)∂∂x+(y−y0)∂∂y]kf(x0,y0)+1(n+1)f[x0+θ(x−x0),y0+θ(y−y0)],(0<θ<1)
<script id="MathJax-Element-69" type="math/tex; mode=display">\begin{align}f(x,y)&=\sum_{k=0}^n\frac{1}{k!}[(x-x_0)\frac{\partial}{\partial x}+(y-y_0)\frac{\partial}{\partial y}]^kf(x_0,y_0)\\
&+\frac{1}{(n+1)!}[(x-x_0)\frac{\partial}{\partial x}+(y-y_0)\frac{\partial}{\partial y}]^{(n+1)}f[x_0+\theta(x-x_0),y_0+\theta(y-y_0)], (0<\theta<1)
\end{align}</script>
当余项
Rn(x,y)<script id="MathJax-Element-70" type="math/tex">R_n(x,y)</script>採用上面这样的形式时称为拉格朗日余项,假设採用皮亚诺余项,则二元函数的泰勒公式能够写成
f(x,y)=∑k=0n1k![(x−x0)∂∂x+(y−y0)∂∂y]kf(x0,y0)+o(ρn)
<script id="MathJax-Element-71" type="math/tex; mode=display">f(x,y)=\sum_{k=0}^n\frac{1}{k!}[(x-x_0)\frac{\partial}{\partial x}+(y-y_0)\frac{\partial}{\partial y}]^kf(x_0,y_0)+o(\rho ^n)</script>
特别低。对于一个多维向量
X<script id="MathJax-Element-72" type="math/tex">\mathbf{X}</script>, 以及在点
X0<script id="MathJax-Element-73" type="math/tex">\mathbf{X}_0</script> 的邻域内有连续二阶偏导数的多元函数
f(X)<script id="MathJax-Element-74" type="math/tex">f(\mathbf{X})</script> ,能够写出该函数在点
X0<script id="MathJax-Element-75" type="math/tex">\mathbf{X}_0</script> 处的(二阶)泰勒展开式
f(X)=f(X0)+(X−X0)T∇f(X0)+12!(X−X0)T∇2f(X0)(X−X0)+o(∥X−X0∥2)
<script id="MathJax-Element-76" type="math/tex; mode=display">f(\mathbf{X})=f(\mathbf{X}_0)+(\mathbf{X}-\mathbf{X}_0)^T\nabla f(\mathbf{X}_0)+\frac{1}{2!}(\mathbf{X}-\mathbf{X}_0)^T\nabla^2 f(\mathbf{X}_0)(\mathbf{X}-\mathbf{X}_0)+o(\|\mathbf{X}-\mathbf{X}_0\|^2)</script>
当中,
o(∥X−X0∥2)<script id="MathJax-Element-77" type="math/tex">o(\|\mathbf{X}-\mathbf{X}_0\|^2)</script> 是高阶无穷小表示的皮亚诺余项。而
∇2f(X0)<script id="MathJax-Element-78" type="math/tex">\nabla^2 f(\mathbf{X}_0)</script> 显然就是一个Hessian矩阵。所以上述式子也能够写成
f(X)=f(X0)+(X−X0)T∇f(X0)+12(X−X0)TH(X0)(X−X0)+o(∥X−X0∥2)
<script id="MathJax-Element-79" type="math/tex; mode=display">f(\mathbf{X})=f(\mathbf{X}_0)+(\mathbf{X}-\mathbf{X}_0)^T\nabla f(\mathbf{X}_0)+\frac{1}{2}(\mathbf{X}-\mathbf{X}_0)^T\mathbf{H}(\mathbf{X}_0)(\mathbf{X}-\mathbf{X}_0)+o(\|\mathbf{X}-\mathbf{X}_0\|^2)</script>
我们已经知道对于 n<script id="MathJax-Element-80" type="math/tex">n</script> 元函数 u=f(x1,x2,⋯,xn)<script id="MathJax-Element-81" type="math/tex">u=f(x_1,x_2,\cdots ,x_n)</script>在点 M<script id="MathJax-Element-82" type="math/tex">M</script> 处有极值,则有
∇f(M)={∂f∂x1,∂f∂x2,⋯,∂f∂xn}M=0
<script id="MathJax-Element-83" type="math/tex; mode=display">\nabla f(M)=\left \{\frac{\partial f}{\partial x_1},\frac{\partial f}{\partial x_2},\cdots, \frac{\partial f}{\partial x_n}\right\}_M=0</script>
也就是说这是一个必要条件,而充分条件则由上一节中之结论给出 。
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('