在求最优解时,前面很多地方都用梯度下降(Gradient Descent)的方法,但由于最优步长很难确定,可能会出现总是在最优解附近徘徊的情况,致使最优解的搜索过程很缓慢。牛顿法(Newton's Method)在最优解的搜索方面有了较大改进,它不仅利用了目标函数的一阶导数,还利用了搜索点处的二阶导数,使得搜索算法能更准确地指向最优解。

我们结合下图所示的一个实例来描述牛顿法的思想。假设我们想要求得参数\(\theta\),使得\(f(\theta)=0\)。算法的描述如下:

  1. 随机猜测一个解\(\theta^{(0)}\),并令\(t=0\);
  2. 在\(\theta^{(t)}\)处用一根切线来近似\(f(\theta)\);
  3. 求得切线与横坐标的交点\(\theta^{(t+1)}\),作为下一个可能的解;
  4. \(t=t+1\);
  5. 重复2-4,直到收敛,即\(f(\theta^{(t)})\approx 0\)。

那么\(\theta^{(t+1)}\)与\(\theta^{(t)}\)之间存在怎样的迭代关系呢?由切线的斜率可知 \begin{equation} f'(\theta)=\frac{f(\theta)}{\vartriangle}\Rightarrow \vartriangle=\frac{f(\theta)}{f'(\theta)} \end{equation}

观察\(\theta^{(t+1)}\)与\(\theta^{(t)}\)在横坐标上的关系,可知 \begin{equation} \theta^{(t+1)}=\theta^{(t)}-\vartriangle=\theta^{(t)}-\frac{f(\theta)}{f'(\theta)} \end{equation}

牛顿法给出了\(f(\theta)=0\)的求解算法,那么怎样将其运用到求使似然函数\(\mathcal{L}(\theta)\)最大化的参数上呢?一般最优参数\(\theta^{\star}\)在\(\mathcal{L}(\theta)\)的极值点出取得,即\(\mathcal{L}'(\theta^{\star})=0\)。那么,令上面的\(f(\theta)=\mathcal{L}'(\theta)\),我们很容易就得出了下列的迭代法则 \begin{equation} \theta^{(t+1)}=\theta^{(t)}-\frac{\mathcal{L}'(\theta^{(t)})}{\mathcal{L}''(\theta^{(t)})} \end{equation} 最终求得使\(\mathcal{L}'(\theta)=0\)的参数\(\theta^\star\),也就是令似然函数\(\mathcal{L}(\theta)\)最大的参数。

上面讨论的参数\(\theta\in\mathbb{R}\),我们现在将牛顿法则推广到\(n\)维向量\(\theta\in\mathbb{R}^n\),对应的迭代法则形式如下: \begin{equation} \theta^{(t+1)}=\theta^{(t)}-H^{-1}\nabla_{\theta}\mathcal{L} \end{equation} 其中\(H\)为\(\mathcal{L}\)对向量\(\theta^{(t)}\)的二阶偏导,称为Hessian矩阵,\(H_{ij}=\frac{\partial^2\mathcal{L}}{\partial\theta^{(t)}_i\partial\theta^{(t)}_j}\)。

接下来,我们从另外一个角度来考察牛顿法。用似然函数\(\mathcal{L}(\theta)\)的二阶泰勒展开\(\mathcal{F}(\theta)\)来对其进行逼近。 \begin{equation} \mathcal{L}(\theta)\approx\mathcal{F}(\theta)=\mathcal{L}(\theta^{(t})+\nabla_{\theta^{(t)}}\mathcal{L}(\theta-\theta^{(t)})+\frac{1}{2}(\theta-\theta^{(t)})^TH(\theta-\theta^{(t)}) \end{equation} 令\(\theta=\theta^{(t+1)}\),可得 \begin{equation} \begin{array}{ll} \mathcal{F}(\theta^{(t+1)})=&\mathcal{L}(\theta^{(t)})+\nabla_{\theta^{(t)}}\mathcal{L}^T(\theta^{(t+1)}-\theta^{(t)})\\ &+\frac{1}{2}(\theta^{(t+1)}-\theta^{(t)})^TH(\theta^{(t+1)}-\theta^{(t)}) \end{array} \end{equation} 现在,我们的目的是求得使\(\mathcal{F}(\theta^{(t+1)})\)最小的参数\(\theta^{(t+1)}\)。将上式对\(\theta^{(t+1)}\)求导并令导数为0,可得 \begin{equation} \frac{\partial\mathcal{F}(\theta^{(t+1)})}{\partial\theta^{(t+1)}}=\nabla_{\theta^{(t)}}\mathcal{L}+H(\theta^{(t+1)}-\theta^{(t)})=0 \end{equation} 等式两侧同时左乘\(H^{-1}\),化简得 \begin{equation} \theta^{(t+1)}=\theta^{(t)}-H^{-1}\nabla_{\theta}\mathcal{L} \end{equation}

我们用的是二阶泰勒展开式\(\mathcal{F}(\theta)\)逼近似然函数\(\mathcal{L}(\theta)\)。如果\(\mathcal{L}(\theta)\)确实为二次函数,那么\(\mathcal{F}(\theta)\)就是\(\mathcal{L}(\theta)\)的准确展开式,利用牛顿法一步就可以直接求得最优解。一般情况下,\(\mathcal{L}(\theta)\)并非二次函数,那么\(\mathcal{F}(\theta)\)也就存在逼近误差,使得一次迭代不能求得最优解,当\(\mathcal{L}(\theta)\)的次数很高时,往往要经历很多次迭代。一般而言,因为牛顿法利用了二阶导数来修正搜索方向和步长,收敛速度很更快。但是这同样也是要付出代价的,相比梯度下降而言,我们需要额外计算Hessian矩阵并求其逆,这两步的计算代价都很大。只要参数\(\theta\)的维度\(n\)不是很大,可以考虑用牛顿迭代。另外还有一点,如果目标函数不是严格的凸函数,Hessian矩阵\(H\)很可能是奇异矩阵,也就是存在特征值为0的情况,那么它的逆矩阵是不存在的,也就无法用牛顿法。

今年有一道面试题是要求我们写出一段程序,求解\(\sqrt{n}\)。如果把牛顿法用上去,问题就迎刃而解了。我们设定目标函数为\(f(x)=x^2-n\),那么令\(f(x)=0\)的解很显然就是\(\pm\sqrt{n}\)。要注意的是,我们要选择合理的迭代起始点,如果我们从正数开始迭代,求得的是\(\sqrt{n}\);如果从负数开始迭代,求得的就是\(-\sqrt{n}\);如果从0开始迭代,会出现未定义的计算(0作为除数)。我们根据前面讲的牛顿迭代法则,直接给出该题的迭代法则 \begin{equation} x^{(t+1)}=x^{(t)}-\frac{f(x^{(t)})}{f'(x^{(t)})}=x^{(t)}-\frac{(x^{(t)})^2-n}{2x^{(t)}}=\frac{1}{2}\left(x^{(t)}+\frac{n}{x^{(t)}}\right) \end{equation} 下面是由该算法写出的一段精简的code,浓缩了牛顿算法的精髓

 double mysqrt1(double n)
{
if (n<) return -;
if(n==) return ;
double eps=1e-;
double x=0.1;//start from a positive value
while(fabs(x*x-n)>=eps)
x=(x+n/x)/;//Newton's method
return x;
}

这道题我还想了另外一个算法,算法的启发点来源于\((x-1)(x+1)+1=x^2=n\)。用这个算法,我们的迭代起始点可以是0。算法的基本思想如下:给定一个初始步长step,从起始点开始每次向前走一个步长,直到超过了\(\sqrt{n}\);一旦超过了\(\sqrt{n}\),就要开始慢慢向最终解靠近,每次前进或后退的步长都缩减为以前的一半。很明显,这个算法没有牛顿迭代法快。我只用了少数几个测试用例,两段程序的计算结果都和sqrt库函数的计算结果一致。代码如下:

 double mysqrt2(double n)
{
if (n<) return -;
double x=;
double step=;
int threshold=;
double eps=1e-;
double res=x*x;
while(fabs(res-n)>=eps)
{
if(res<n)
{
//once we have passed the solution,we must walk forward slowly
if(threshold) step/=;
x+=step;//walking forward
}
else//walk
{
threshold=;//indicating we have passed the solution
step/=;//reducing the step size to its half
x-=step;//walking back
}
res=x*x;//compute x*x to estimate real n
}//end while
return x;
}

Newton's Method的更多相关文章

  1. 牛顿方法(Newton's Method)

    在讲义<线性回归.梯度下降>和<逻辑回归>中我们提到可以用梯度下降或梯度上升的方式求解θ.在本文中将讲解另一种求解θ的方法:牛顿方法(Newton's method). 牛顿方 ...

  2. 牛顿法(Newton's Method)

    Newton's Method 在求最优解时,前面很多地方都用梯度下降(Gradient Descent)的方法,但由于最优步长很难确定,可能会出现总是在最优解附近徘徊的情况,致使最优解的搜索过程很缓 ...

  3. 牛顿迭代法(Newton's Method)

    牛顿迭代法(Newton's Method) 简介 牛顿迭代法(简称牛顿法)由英国著名的数学家牛顿爵士最早提出.但是,这一方法在牛顿生前并未公开发表. 牛顿法的作用是使用迭代的方法来求解函数方程的根. ...

  4. Jacobian矩阵、Hessian矩阵和Newton's method

    在寻找极大极小值的过程中,有一个经典的算法叫做Newton's method,在学习Newton's method的过程中,会引入两个矩阵,使得理解的难度增大,下面就对这个问题进行描述. 1, Jac ...

  5. 【cs229-Lecture4】Newton’s method

    之前我们在求Logistic回归时,用的是梯度上升算法,也就是要使得似然函数最大化,利用梯度上升算法,不断的迭代.这节课引出牛顿方法,它的作用和梯度上升算法的一样的,不同的是牛顿方法所需的迭代次数更少 ...

  6. 牛顿迭代法(Newton's Method)

    牛顿迭代法(Newton's Method) 简介 牛顿迭代法(简称牛顿法)由英国著名的数学家牛顿爵士最早提出.牛顿法的作用是使用迭代的方法来求解函数方程的根.简单地说,牛顿法就是不断求取切线的过程. ...

  7. Logistic Regression and Newton's Method

    Data For this exercise, suppose that a high school has a dataset representing 40 students who were a ...

  8. Newton's method 分析

    大家都知道对于合理的函数和合理的值域牛顿迭代法是二次收敛(quadratic covergence)的(收敛速度定义见 https://en.wikipedia.org/wiki/Rate_of_co ...

  9. Matlab Newton‘s method

    定义函数 function y=f(x) y=f(x).%函数f(x)的表达式 end function z=h(x) z=h(x).%函数h(x)的表达式 end 主程序 x=X;%迭代初值 i=0 ...

随机推荐

  1. Ehcache和MemCached比较分析

    项目 Memcache Ehcache 分布式 不完全,集群默认不实现 支持 集群 可通过客户端实现 支持(默认是异步同步) 持久化 可通过第三方应用实现,如sina研发的memcachedb,将ca ...

  2. CentOS 7 安装 mariaDB

    1.安装数据库 [root@localhost ~]# yum -y  install mariadb-server mariadb mariadb-devel 2.启动数据库[root@localh ...

  3. c#.net与vb.net中读写Cookie的方法!

    Cookie (HttpCookie的实例)提供了一种在 Web 应用程序中存储用户特定信息的方法.例如,当用户访问您的站点时,您可以使用 Cookie 存储用户首选项或其他信息.当该用户再次访问您的 ...

  4. android捕获ListView中每个item点击事件

    转自:http://www.cnblogs.com/pswzone/archive/2012/03/10/2389275.html package com.wps.android;   import  ...

  5. WPF学习笔记 - 在XAML里绑定

    Binding除了默认构造函数外,还有一个可以传入Path的构造函数,下面两种方式实现的功能是一样的. <TextBlock x:Name="currentFolder" D ...

  6. 【JMeter】JMeter在linux下运行

    之前在用JMeter做性能测试时基本都用自己的笔记本电脑. 考虑到网络传输和占用系统资源情况时进行了以下分析: 1 在笔记本上,开始-cmd "ping 服务器",得到传输时间.在 ...

  7. Codeforces 628E Zbazi in Zeydabad 树状数组

    题意:一个n*m的矩阵,要么是 . 要么是 z ,问可以形成几个大z 分析:(直接奉上官方题解,我感觉说的实在是太好了) Let's precalculate the values zlij, zri ...

  8. 《Python基础教程(第二版)》学习笔记 -> 第三章 使用字符串

    本章讲话介绍如何使用字符串格式化其他的值,并简单了解一下利用字符串的分割.联接.搜索等方法能做些什么. 基本字符串操作 所有标准的序列操作(索引.分片.乘法.判断成员资格.求长度.取最大最小值)对字符 ...

  9. Python中的导入

    转自:http://bingotree.cn/?p=569 参考<Python学习手册>,强烈建议看下这本书的相关章节. 在一些规模较大的项目中,经常可以看到通过imp.__import_ ...

  10. 分享一个安卓中异步获取网络图片并自适应大小的第三方程序(来自github)

    安卓中获取网络图片,生成缓存 用安卓手机,因为手机流量的限制,所以我们在做应用时,要尽量为用户考虑,尽量少耗点用户的流量,而在应用中网络图片的显示无疑是消耗流量最大的,所以我们可以采取压缩图片或者将图 ...