最优化理论与算法是一个重要的数学分支,顾名思义,这是一门研究在众多解决方案中确定什么样的方案是最优方案以及如何找到最优方案的学科。现如今,随着计算机科学的飞速发展,最优化理论与算法也迅速发展起来,成为了求解的有力工具,发挥着越来越来的作用。于是,为了给机器学习提供有力的理论支撑,现以清华大学出版社出版、 陈宝林编著的《最优化理论与算法》 为教材,开始学习这门课。学习的顺序根据同时在学习的《机器学习》的需要有所调整。
在解决无约束问题的算法中,大致可以分为两类:一类要利用目标函数的导数,另一类只用到目标函数,称为直接方法。本章学习的是前一类使用导数的最优化方法中的最速下降法、牛顿法、阻尼牛顿法。
为了求解目标函数的最小值时,从点 x 0 x_0 x0出发,我们可以自然地想到沿着函数值在 x 0 x_0 x0点下降最快的方向有利于尽快找到极小值点,于是数学家们根据这一思想提出了最速下降法。
对于刚刚说的“下降最快方向”,根据高等数学知识,一般地(指欧式度量意义)在负梯度方向下为最速下降方向,即:
d = − ∇ f ( x ) \textbf{d}=-∇f(\textbf{x}) d=−∇f(x)
回到刚开始的设想,现在我们找到了下降最快的方向来寻找最小值点,显然我们要经过多次寻找来逐渐逼近极小值点,所以要从 x 0 \textbf{x}_0 x0沿最速下降方向搜索多远找到下一个点 x 1 \textbf{x}_1 x1呢?
我们不妨假设变量,称为一维搜索的步长:
x 1 = x 0 + λ d 0 \textbf{x}_1=\textbf{x}_0+\lambda \textbf{d}_0 x1=x0+λd0
也就是说 x 1 x_1 x1是关于的变量,那么 f ( x 1 ) f(\textbf{x}_1) f(x1)也是关于的变量,由于求目标函数的最小值,所以我们在此令 f ( x 1 ) f(\textbf{x}_1) f(x1)取最小值,求此时的,即:
λ 0 = argmax λ f ( x 1 ) \mathop{\lambda _0=\underset{\lambda}{\operatorname{argmax}} f(x_1)} λ0=λargmaxf(x1)
于是,我们可以得到,以此类推:
x 2 = x 1 + λ 1 d 1 \textbf{x}_2=\textbf{x}_1+\lambda _1 \textbf{d}_1 x2=x1+λ1d1
… … …… ……
当最速下降方向的模足够小时,我们认为已经足够逼近最小值点,即:
∥ d k ∥ < ϵ \| \textbf{d}_k\|<\epsilon ∥dk∥<ϵ
停止迭代,最小值点为 x k \textbf{x}_k xk。
所以,最速下降算法步骤为:
第二种方法是牛顿法,我们先来看下图。
对于函数 y = f ( x ) y=f(x) y=f(x),我们希望找到它的其中一个零点 x 0 x_0 x0。
于是我们从任意一点 x 1 x_1 x1出发,
从点 x 1 x_1 x1作曲线的切线,切线与 y y y轴交于 x = x 2 x=x_2 x=x2;
再从点 x 2 x_2 x2作曲线的切线,切线与轴交于 x = x 3 x=x_3 x=x3;
… … … … ………… …………
可以看到 x 1 , x 2 , x 3 , . . . , x n x_1,x_2,x_3,...,x_n x1,x2,x3,...,xn逐渐向 x 0 x_0 x0逼近。
我们根据切线的表达式
y − f ( x k ) = f ′ ( x k ) ( x − x k ) y-f(x_k)=f'(x_k)(x-x_k) y−f(xk)=f′(xk)(x−xk)
令 y = 0 y=0 y=0,可以解得:
x k + 1 = x k − f ( x k ) f ′ ( x k ) x_{k+1}= x_k- {{f(x_k)}\over {f'(x_k)}} xk+1=xk−f′(xk)f(xk)
这就是牛顿法的图形解释,下面是数学推导。
数学推导:
对于函数 f ( x ) f(x) f(x),假设 x k x_k xk是 f ( x ) f(x) f(x)极小值点的一个估计,我们将 f ( x ) f(x) f(x)在 x = x k x=x_k x=xk处展开,得到:
f ( x ) ≈ ϕ ( x ) = f ( x k ) + f ′ ( x k ) ( x − x k ) + 1 2 f ′ ′ ( x k ) ( x − x k ) 2 f(x)\approx \phi(x)=f(x_k)+f'(x_k)(x-x_k)+\frac{1}{2}f''(x_k)(x-x_k)^2 f(x)≈ϕ(x)=f(xk)+f′(xk)(x−xk)+21f′′(xk)(x−xk)2
为求 ϕ ( x ) \phi(x) ϕ(x)的平稳点,便要使一阶导数等于零,令: ϕ ′ ( x ) = 0 \phi'(x)=0 ϕ′(x)=0
即: ϕ ′ ( x ) = f ′ ( x k ) + f ′ ′ ( x k ) ( x − x k ) = 0 \phi'(x)=f'(x_k)+f''(x_k)(x-x_k)=0 ϕ′(x)=f′(xk)+f′′(xk)(x−xk)=0
整理出 x x x的表达式,为:
x = x k − f ′ ( x k ) f ′ ′ ( x k ) x= x_k- {{f'(x_k)}\over {f''(x_k)}} x=xk−f′′(xk)f′(xk)
我们将上式作为的迭代公式,即:
x k + 1 = x k − f ′ ( x k ) f ′ ′ ( x k ) x_{k+1}= x_k- {{f'(x_k)}\over {f''(x_k)}} xk+1=xk−f′′(xk)f′(xk)
这里的 f ′ ( x ) f'(x) f′(x)其实就相当于图形中的 f ( x ) f(x) f(x)即需要找到零点的函数,且表达式与切线方程推导出的是相同的。
我们将其推广到高维函数,得:
x k + 1 = x k − ∇ 2 f ( x k ) − 1 ∇ f ( x k ) \textbf{x}_{k+1}= \textbf{\textbf{x}}_k- {\nabla ^2f(\textbf{x}_k)}^{-1}{\nabla f(\textbf{x}_k)} xk+1=xk−∇2f(xk)−1∇f(xk)
并且可以证明牛顿法是收敛的。(略)
阻尼牛顿法与牛顿法的区别在 x k + 1 = x k − ∇ 2 f ( x k ) − 1 ∇ f ( x k ) \textbf{x}_{k+1}= \textbf{\textbf{x}}_k- {\nabla ^2f(\textbf{x}_k)}^{-1}{\nabla f(\textbf{x}_k)} xk+1=xk−∇2f(xk)−1∇f(xk)的迭代公式中,仿照最速下降法的方法,加入参数 λ \lambda λ作为一维搜索步长,即:
x k + 1 = x k − λ k ∇ 2 f ( x k ) − 1 ∇ f ( x k ) \textbf{x}_{k+1}= \textbf{\textbf{x}}_k- \lambda_k{\nabla ^2f(\textbf{x}_k)}^{-1}{\nabla f(\textbf{x}_k)} xk+1=xk−λk∇2f(xk)−1∇f(xk)
这样看来拟牛顿法与最速下降法的区别就只是将最速下降下降方向-∇( k _k k)替换成牛顿方向 − λ k ∇ 2 f ( x k ) − 1 ∇ f ( x k ) - \lambda_k{\nabla ^2f(\textbf{x}_k)}^{-1}{\nabla f(\textbf{x}_k)} −λk∇2f(xk)−1∇f(xk)。
类似最速下降法,我们得到阻尼牛顿法的算法步骤:
另外一篇对数几率回归的博客中,使用 python实现了牛顿法以计算目标函数最小值
周志华《机器学习》西瓜书 小白Python学习笔记(二)————第三章 线性模型 (对数几率回归)附课后题3.3详解
阻尼牛顿法相比牛顿法的优势在于,阻尼牛顿法可以保证每次迭代后函数值下降或不变。可以证明阻尼牛顿法在适当的条件下具有全局收敛性,且为2级收敛。
注:教材中一般表示为 x ( k ) \textbf{x}^{(k)} x(k),本文表示为 x k \textbf{x}_k xk.