Machine Learning 学习笔记 (2) —— 使用牛顿法寻找极值
2015-05-01 22:27
363 查看
本系列文章允许转载,转载请保留全文!
[b]【请先阅读】【说明&总目录】/article/5553408.html[/b]
1. 用牛顿法解方程
牛顿法是一种求解方程的迭代算法,也可以用于方程组的求解。其思想是利用方程(尤其是非线性方程)的线性部分,对原方程进行近似。不失一般性,考虑方程f(x)=0。对f(x)在x=t处进行泰勒展开,可得f(x)=f(t)+f'(t)(x-t)+...
取线性部分代替f(x),带入方程f(x)=0,可得f(t)+f'(t)(x-t)=0 ,进而解出x=t-f(t)/f'(t)。将方程的解写为迭代形式,可以得到牛顿法的迭代公式:
![](http://latex.codecogs.com/gif.latex?x^{(k+1)}=x^{(k)}-\frac{f(x^{(k)})}{f'(x^{(k)})})
[例]使用牛顿法解方程x3+x=2
第一步:求f(x)及f'(x),即f(x)=x3+x-2, f'(x)=3x2+1
第二步:选择迭代初始值。初始值一般应选在解的附近,以防算法不收敛。这里选择x(0)=2
第三步:根据迭代公式和初始值迭代求解。迭代过程如下:
结论:经过4次迭代后,函数取值变为0,即原方程的根已找到。
牛顿法的收敛条件及收敛速度的分析略去。在机器学习的应用中,可以采用尝试不同初始值的方法减少不收敛现象的发生;若牛顿法收敛,一般可以达到二阶收敛的收敛速度,与梯度下降法相比,迭代次数明显减少。
2. 用牛顿法解方程组
在本系列上一篇文章中,我们使用梯度下降法求解损失函数J的极小值;而从上面的描述来看,牛顿迭代只是用来求解方程的根,这与多元函数的极小值又有什么联系呢?其实,要求多元函数的极小值,只需令多元函数对每一个自变量的偏导数为0,并解出此时每一个自变量的取值即可。于是,多元函数极小值问题,被转化为多元非线性方程组求解问题。
首先考虑多元函数的泰勒展开。不失一般性,以f1(x1,x2,...,xn)为例,在点(t1,t2,...,tn)的泰勒展开式如下:
![](http://latex.codecogs.com/gif.latex?f_1(x_1,x_2,\ldots ,x_n)=\sum_{i=0}^{\infty}\frac{1}{i!}(\sum_{j=1}^{n}(x_j-t_j)\frac{\partial}{\partial t_j} )^{i} f_1(t_1,t_2,\ldots ,t_n))
取线性部分代替f1(x),并令其为0,有:
![](http://latex.codecogs.com/gif.latex?f_1(t_1,t_2,\ldots ,t_n) + \sum_{j=1}^{n}(x_j-t_j)\frac{\partial f_1(t_1,t_2,\ldots ,t_n)}{\partial t_j}=0)
将其整理为向量形式,并分离出自变量,可以得到:( 为了简便,以下使用f1代替f1(t1,t2,...,tn) )
![](http://latex.codecogs.com/gif.latex?\begin{bmatrix} \frac{\partial f_1}{\partial t_1} & \ldots & \frac{\partial f_1}{\partial t_n} \end{bmatrix} \begin{bmatrix} x_1 \\ \vdots \\x_n \end{bmatrix} = \begin{bmatrix} \frac{\partial f_1}{\partial t_1} & \ldots & \frac{\partial f_1}{\partial t_n} \end{bmatrix} \begin{bmatrix} t_1 \\ \vdots \\ t_n \end{bmatrix}-f_1)
假定方程组由一系列方程{f1=0, f2=0, ..., fn=0}组成,可以将上式整理为矩阵形式:
![](http://latex.codecogs.com/gif.latex?\begin{bmatrix} \frac{\partial f_1}{\partial t_1} & \ldots & \frac{\partial f_1}{\partial t_n} \\ \vdots & \ddots & \vdots \\ \frac{\partial f_n}{\partial t_1} & \ldots & \frac{\partial f_n}{\partial t_n} \end{bmatrix} \begin{bmatrix} x_1 \\ \vdots \\x_n \end{bmatrix} = \begin{bmatrix} \frac{\partial f_1}{\partial t_1} & \ldots & \frac{\partial f_1}{\partial t_n} \\ \vdots & \ddots & \vdots \\ \frac{\partial f_n}{\partial t_1} & \ldots & \frac{\partial f_n}{\partial t_n} \end{bmatrix} \begin{bmatrix} t_1 \\ \vdots \\ t_n \end{bmatrix}- \begin{bmatrix}f_1 \\ \vdots \\ f_n \end{bmatrix})
上式中的n*n矩阵为雅可比矩阵(Jacobian Matrix),简记为J(F)。同时,将自变量(x1,...,xn)记为X,将(t1,...,tn)记为T,将(f1,...,fn)记为F,则有:
![](http://latex.codecogs.com/gif.latex? \textbf{J}(F)X=\textbf{J}(F)T-F)
化简后可得:
![](http://latex.codecogs.com/gif.latex? X=T-\textbf{J}(F)^{-1}F)
将方程组的解写为迭代形式,即可得到适用于方程组求解的牛顿法迭代公式:
![](http://latex.codecogs.com/gif.latex? X^{(k+1)}=X^{(k)}-\textbf{J}(F(X^{(k)}))^{-1}F(X^{(k)}))
至此可以发现,虽然牛顿法的迭代次数比梯度下降法小得多,但是在每一次迭代过程中,都需要重新计算J(F)的逆矩阵。若n为特征维数,则通常逆矩阵的计算需要Θ(n3)的时间复杂度。使用Strassen方法可以使逆矩阵计算的时间复杂度降至Θ(nlog27),也可以使用数值方法近似求解逆矩阵,但当特征维数较大时,这两种方法仍然很慢。因此,仅在特征维数较小时,牛顿法才能够快速收敛。特殊地,当取n=1时,上式可退化为本文第1节推导出的,用于求解单个方程的牛顿迭代公式。
3. 使用牛顿法求函数的极值
若用▽Xf(X)表示函数f(X)的梯度向量,带入普通牛顿法迭代公式中,即可得到用于求函数极值的迭代公式:
![](http://latex.codecogs.com/gif.latex? X^{(k+1)}=X^{(k)}-\textbf{J}(\bigtriangledown_X f(X^{(k)}))^{-1}\bigtriangledown_X f(X^{(k)}))
考虑到:
![](http://latex.codecogs.com/gif.latex? \textbf{J}(\bigtriangledown_X f(X^{(k)})) = \begin{bmatrix} \frac{\partial \frac{\partial f}{\partial x_1^{(k)}} }{\partial x_1^{(k)}} & \ldots & \frac{\partial \frac{\partial f}{\partial x_1^{(k)}} }{\partial x_n^{(k)}} \\ \vdots & \ddots & \vdots \\ \frac{\partial \frac{\partial f}{\partial x_n^{(k)}}}{\partial x_1^{(k)}} & \ldots & \frac{\partial \frac{\partial n}{\partial x_n^{(k)}}}{\partial x_n^{(k)}} \end{bmatrix} = \begin{bmatrix} \frac{\partial^2 f}{\partial x_1^{(k)}\partial x_1^{(k)}} & \ldots & \frac{\partial^2 f}{\partial x_1^{(k)}\partial x_n^{(k)}} \\ \vdots & \ddots & \vdots \\ \frac{\partial^2 f}{\partial x_n^{(k)}\partial x_1^{(k)}} & \ldots & \frac{\partial^2 f}{\partial x_n^{(k)}\partial x_n^{(k)}} \end{bmatrix} \\ = \textbf{H}(f(X^{(k)})))
迭代公式可以在形式上进一步化简:
![](http://latex.codecogs.com/gif.latex? X^{(k+1)}=X^{(k)}-\textbf{H}(f(X^{(k)}))^{-1}\bigtriangledown_X f(X^{(k)}))
其中,H(f)表示函数f(x1,...,xn)的海森矩阵(Hessian Matrix)。
就具体问题而言,本系列上一篇文章需要求损失函数的极小值。除了之前介绍的梯度下降法之外,还可以使用本文章介绍的牛顿法。对应的迭代公式为:
![](http://latex.codecogs.com/gif.latex? \theta^{(k+1)}=\theta^{(k)}-\textbf{H}(J(\theta^{(k)}))^{-1}\bigtriangledown_\theta J(\theta^{(k)}))
4. 补充 [2015-05-07]
关于牛顿法,补充一个证明。
相信很多初学者都有这样的疑问:为什么牛顿法会收敛;若牛顿法收敛,为什么能收敛到方程的一组解?
简单起见,以牛顿法的最简单形式x(k+1)=x(k)-f(x(k))/f'(x(k))进行讨论,同时假定x0为方程f(x)的某一单根,且f(x)在x=x0附近二阶连续。不加证明的给出以下定理:(证明可参考数值分析相关教材)
局部收敛定理 设x0是方程x=g(x)的根,若g'(x)在x=x0处连续,且|g'(x0)|<1,则存在x0的某一邻域S,使得对于任意x(0)∈S,迭代格式x(k+1)=g(x(k))收敛于x0。
在之前的假设下,对牛顿法收敛性的证明如下:
记g(x)=x-f(x)/f'(x),则有g'(x)=f(x)f''(x)/(f'(x))2,易知g'(x0)=0<1。根据局部收敛定理可知,迭代格式x(k+1)=g(x(k))收敛于x0,即x(k+1)=x(k)-f(x(k))/f'(x(k))收敛于x0。
[b]【请先阅读】【说明&总目录】/article/5553408.html[/b]
1. 用牛顿法解方程
牛顿法是一种求解方程的迭代算法,也可以用于方程组的求解。其思想是利用方程(尤其是非线性方程)的线性部分,对原方程进行近似。不失一般性,考虑方程f(x)=0。对f(x)在x=t处进行泰勒展开,可得f(x)=f(t)+f'(t)(x-t)+...
取线性部分代替f(x),带入方程f(x)=0,可得f(t)+f'(t)(x-t)=0 ,进而解出x=t-f(t)/f'(t)。将方程的解写为迭代形式,可以得到牛顿法的迭代公式:
[例]使用牛顿法解方程x3+x=2
第一步:求f(x)及f'(x),即f(x)=x3+x-2, f'(x)=3x2+1
第二步:选择迭代初始值。初始值一般应选在解的附近,以防算法不收敛。这里选择x(0)=2
第三步:根据迭代公式和初始值迭代求解。迭代过程如下:
k | x(k) | f(x(k)) |
0 | 2.00 | 8.00 |
1 | 1.38 | 2.04 |
2 | 1.08 | 0.35 |
3 | 1.00 | 0.02 |
4 | 1.00 | 0.00 |
牛顿法的收敛条件及收敛速度的分析略去。在机器学习的应用中,可以采用尝试不同初始值的方法减少不收敛现象的发生;若牛顿法收敛,一般可以达到二阶收敛的收敛速度,与梯度下降法相比,迭代次数明显减少。
2. 用牛顿法解方程组
在本系列上一篇文章中,我们使用梯度下降法求解损失函数J的极小值;而从上面的描述来看,牛顿迭代只是用来求解方程的根,这与多元函数的极小值又有什么联系呢?其实,要求多元函数的极小值,只需令多元函数对每一个自变量的偏导数为0,并解出此时每一个自变量的取值即可。于是,多元函数极小值问题,被转化为多元非线性方程组求解问题。
首先考虑多元函数的泰勒展开。不失一般性,以f1(x1,x2,...,xn)为例,在点(t1,t2,...,tn)的泰勒展开式如下:
取线性部分代替f1(x),并令其为0,有:
将其整理为向量形式,并分离出自变量,可以得到:( 为了简便,以下使用f1代替f1(t1,t2,...,tn) )
假定方程组由一系列方程{f1=0, f2=0, ..., fn=0}组成,可以将上式整理为矩阵形式:
上式中的n*n矩阵为雅可比矩阵(Jacobian Matrix),简记为J(F)。同时,将自变量(x1,...,xn)记为X,将(t1,...,tn)记为T,将(f1,...,fn)记为F,则有:
化简后可得:
将方程组的解写为迭代形式,即可得到适用于方程组求解的牛顿法迭代公式:
至此可以发现,虽然牛顿法的迭代次数比梯度下降法小得多,但是在每一次迭代过程中,都需要重新计算J(F)的逆矩阵。若n为特征维数,则通常逆矩阵的计算需要Θ(n3)的时间复杂度。使用Strassen方法可以使逆矩阵计算的时间复杂度降至Θ(nlog27),也可以使用数值方法近似求解逆矩阵,但当特征维数较大时,这两种方法仍然很慢。因此,仅在特征维数较小时,牛顿法才能够快速收敛。特殊地,当取n=1时,上式可退化为本文第1节推导出的,用于求解单个方程的牛顿迭代公式。
3. 使用牛顿法求函数的极值
若用▽Xf(X)表示函数f(X)的梯度向量,带入普通牛顿法迭代公式中,即可得到用于求函数极值的迭代公式:
考虑到:
迭代公式可以在形式上进一步化简:
其中,H(f)表示函数f(x1,...,xn)的海森矩阵(Hessian Matrix)。
就具体问题而言,本系列上一篇文章需要求损失函数的极小值。除了之前介绍的梯度下降法之外,还可以使用本文章介绍的牛顿法。对应的迭代公式为:
4. 补充 [2015-05-07]
关于牛顿法,补充一个证明。
相信很多初学者都有这样的疑问:为什么牛顿法会收敛;若牛顿法收敛,为什么能收敛到方程的一组解?
简单起见,以牛顿法的最简单形式x(k+1)=x(k)-f(x(k))/f'(x(k))进行讨论,同时假定x0为方程f(x)的某一单根,且f(x)在x=x0附近二阶连续。不加证明的给出以下定理:(证明可参考数值分析相关教材)
局部收敛定理 设x0是方程x=g(x)的根,若g'(x)在x=x0处连续,且|g'(x0)|<1,则存在x0的某一邻域S,使得对于任意x(0)∈S,迭代格式x(k+1)=g(x(k))收敛于x0。
在之前的假设下,对牛顿法收敛性的证明如下:
记g(x)=x-f(x)/f'(x),则有g'(x)=f(x)f''(x)/(f'(x))2,易知g'(x0)=0<1。根据局部收敛定理可知,迭代格式x(k+1)=g(x(k))收敛于x0,即x(k+1)=x(k)-f(x(k))/f'(x(k))收敛于x0。
相关文章推荐
- 如何寻找使用案例及其注意事项,学习笔记
- 遗传算法与直接搜索工具箱学习笔记 五-----使用GPS算法寻找一个函数的最小值
- 遗传算法与直接搜索工具箱学习笔记 五-----使用GPS算法寻找一个函数的最小值
- React-Native傻瓜式学习笔记(一):ListView的简单使用
- SpringMVC注记方式验证学习笔记——在注记消息中使用注记参数
- Laravel5.3使用学习笔记---控制器
- Phoenix学习笔记 --- 命令使用
- Java Web 学习笔记之四:Cookie介绍及使用
- Docker学习笔记五 在测试中使用Docker
- Universal Image Loader 学习笔记-基本使用
- iOS学习笔记(十六)――详解数据库操作(使用FMDB)
- 【收藏学习笔记】使用supervisor提高node.js调试效率
- 安卓学习笔记---Fragmnet使用之add,show,hide,remove以及replace方法
- WPF学习笔记-使用自定义资源字典(style)文件
- Hive学习笔记 --- Array, Map, Struct类型使用
- ubuntu playframework 使用 ebean 连接 MySQL 学习笔记
- GH Bladed 软件使用学习笔记(3)
- 学习maven使用笔记
- android 开发零起步学习笔记(二十):Android开发笔记:如何使用预先制作好的SQLite数据库(整理自网络)
- 第三天02 使用IDE(学习笔记)