牛顿法

article/2025/9/14 23:00:40

《牛顿法》

  牛顿法(Newton method)和拟牛顿法(quasi Newton method)是求解无约束最优化问题的常用方法,有收敛速度快的优点。牛顿法是迭代算法,每一步都需求解目标函数的海塞矩阵(Hessian Matrix),计算比较复杂。拟牛顿法通过正定矩阵近似海塞矩阵的逆矩阵或海塞矩阵,简化了这一计算过程。

Key Words:牛顿法、函数零点、最优化


Beijing, 2020

作者:RaySue

Code:

Agile Pioneer  

简介

  牛顿迭代法(Newton’s method)是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。

  连续可微的方程多数不存在求根公式,因此求精确根非常困难,甚至不可解,从而寻找方程的近似根就显得特别重要。牛顿法使用函数 f ( x ) f(x) f(x) 的泰勒级数的前面几项来迭代寻找方程 f ( x ) = 0 f(x) = 0 f(x)=0 的根。

  f(x)在 x 0 x_0 x0处的泰勒展开式:
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + 1 2 f ′ ′ ( x 0 ) ( x − x 0 ) 2 + . . . + 1 n ! f ( n ) ( x 0 ) ( x − x 0 ) n + R n ( x ) f(x) = f(x_0) + f'(x_0)(x - x_0) + \frac{1}{2} f^{''}(x_0)(x - x_0)^2 + ... + \frac{1}{n!}f^{(n)}(x_0)(x - x_0)^n + R_n(x) f(x)=f(x0)+f(x0)(xx0)+21f(x0)(xx0)2+...+n!1f(n)(x0)(xx0)n+Rn(x)

  牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程 f ( x ) = 0 f(x) = 0 f(x)=0 的单根附近平方收敛,而且该法还可以用来求方程的重根、复根,此时线性收敛,也可通过一些方法变成超线性收敛,该方法广泛用于计算机编程中。

牛顿法的应用场景

求解函数零点问题(方程的根)

在原函数的某一点处用一个一次函数近似原函数,然后用这个一次函数的零点作为原函数的下一个迭代点。

  上面的动图生动的诠释了利用牛顿法进行方程根求解的过程,所以该方法也称为“切线法”

例如:利用牛顿法求解 f ( x ) = x 2 − C f(x) = x^2 - C f(x)=x2C (x > 0) 的根

等同于求 x \sqrt{x} x ,步骤如下:

  1. 先对 f ( x ) f(x) f(x) x k x_k xk处进行一阶泰勒展开为 f ( x ) = f ( x k ) + f ′ ( x k ) ( x − x k ) f(x) = f(x_k) + f'(x_k)(x - x_k) f(x)=f(xk)+f(xk)(xxk)

  2. 求根问题就变为了 f ( x k ) + f ′ ( x k ) ( x − x k ) = 0 f(x_k) + f'(x_k)(x - x_k) = 0 f(xk)+f(xk)(xxk)=0 x = x k − f ( x k ) f ′ ( x k ) x = x_k -\frac{f(x_k)}{f'(x_k)} x=xkf(xk)f(xk)

  3. 迭代式为 x k + 1 = x k − f ( x k ) f ′ ( x k ) x_{k + 1} = x_k -\frac{f(x_k)}{f'(x_k)} xk+1=xkf(xk)f(xk)

  4. x k x_k xk x k + 1 x_{k+1} xk+1的距离足够近的时候( fabs( x k x_k xk - x k + 1 x_{k+1} xk+1) < 1e-7 ),我们可以认为迭代完成

double E = 1E-7;
double C = x;
double x0 = x;
while(true)
{double x1 = 0.5 * (x0 + C / x0)if (fabs(x1 - x0) < E)break;x0 = x1;
}
return x1;

  所以诸如此类求零点问题都可以使用牛顿法来解决,而且牛顿法是二阶收敛的,速度比二分法要快很多。


求解最优化问题

  对于无约束的最优化问题 m i n f ( x ) min \space f(x) min f(x), 可根据极小点的必要条件 ∇ f ( x ) = 0 \nabla f(x) = 0 f(x)=0采用牛顿法求解,以一元函数为例:

  1. 先对函数进行二阶泰勒展开 f ( x k + 1 ) = f ( x k ) + f ′ ( x k ) ( x k + 1 − x k ) + f ′ ′ ( x k ) ( x k + 1 − x k ) 2 + . . . + R n ( x k ) f(x_{k + 1}) = f(x_k) + f'(x_k)(x_{k + 1} - x_k) + f^{''}(x_k)(x_{k + 1} - x_k)^2 + ... + R_n(x_k) f(xk+1)=f(xk)+f(xk)(xk+1xk)+f(xk)(xk+1xk)2+...+Rn(xk)

  2. f ′ ( x k + 1 ) = f ′ ( x k ) + f ′ ′ ( x k ) ( x k + 1 − x k ) = 0 f'(x_{k+1}) = f'(x_k) + f^{''}(x_k)(x_{k+1} - x_k) = 0 f(xk+1)=f(xk)+f(xk)(xk+1xk)=0

  3. x k + 1 = x k − f ′ ( x k ) f ′ ′ ( x k ) x_{k+1} = x_k - \frac{f'(x_k)}{f^{''}(x_k)} xk+1=xkf(xk)f(xk)

  4. 开始迭代

   在原函数的某一点处用一个二次函数近似原函数,然后用这个二次函数的极小值点作为原函数的下一个迭代点。

  当目标函数是二次函数时,海塞矩阵退化成一个常数矩阵,从任一初始点出发,牛顿法可一步到达,因此它是一种具有二次收敛性的算法。

  若原函数本身就是一个二次正定函数,则牛顿法一步到达最小值点。

  对于非二次函数,若函数的二次形态较强,或迭代点已进入极小点的邻域,则其收敛速度也是很快的,这是牛顿法的主要优点。

例如:利用牛顿法求解 f ( x ) = x 2 + 2 x f(x) = x^2 + 2x f(x)=x2+2x 的最小值

  对于二次函数而言,极值也是最值,极值点的x值也是我们上学时候必须记住的 x = − b 2 a x = -\frac{b}{2a} x=2ab,此题而言 x = − 1 x = -1 x=1 取得最优解,下式是牛顿法的迭代公式,你可以代入任何的 x k x_k xk值进去,你会发现得到的结果都是 -1,即二次函数,一次迭代即达到最小值点。

x k + 1 = x k − f ′ ( x k ) f ′ ′ ( x k ) x_{k+1} = x_k - \frac{f'(x_k)}{f^{''}(x_k)} xk+1=xkf(xk)f(xk)

多元函数使用牛顿法

  相比于一元函数来说,多元函数的泰勒展开式相对更加复杂,而且二阶导数组成了Hessian矩阵。

Hessian 矩阵

f ( x , y , z ) = 2 x 2 − x y + y 2 − 3 z 2 f(x,y,z) = 2x^2 - xy + y^2 - 3z^2 f(x,y,z)=2x2xy+y23z2 的Hessian矩阵如下:

( 4 − 1 0 − 1 2 0 0 0 − 6 ) \left( \begin{matrix} 4 & -1 & 0 \\ -1 & 2 & 0 \\ 0 & 0 & -6 \end{matrix} \right) 410120006

Hessian矩阵的作用:

与多元函数的凹凸性由密切的关系。
如果Hessian矩阵正定,则f(x,y,z)是凸函数
如果Hessian矩阵负定,则f(x,y,z)是凹函数

一元函数的极值判别法:

  • f ’ ( x ) = 0 f ’ ’ ( x ) > 0 f’(x)=0 \space\space\space\space f’’(x)>0 f(x)=0    f(x)>0 极小值
  • f ’ ( x ) = 0 f ’ ’ ( x ) < 0 f’(x)=0 \space\space\space\space f’’(x)<0 f(x)=0    f(x)<0 极大值
  • f ’ ( x ) = 0 f ’ ’ ( x ) = 0 f’(x)=0 \space\space\space\space f’’(x)=0 f(x)=0    f(x)=0 无法判断

多元函数的极值判别法:

  • ∇ f = 0 \nabla f = 0 f=0,Hessian矩阵正定,极小值点
  • ∇ f = 0 \nabla f=0 f=0 ,Hessian矩阵负定,极大值点
  • ∇ f = 0 \nabla f=0 f=0 ,Hessian矩阵不定,还需要看更高阶的导数

求解步骤

  由一维的牛顿公式推广到多维的公式如下:

x k + 1 = x k − H k − 1 ∇ f ( x k ) x_{k+1} = x_k - H^{-1}_k \nabla f(x_k) xk+1=xkHk1f(xk)

其中 H ( x ) H(x) H(x) f ( x ) f(x) f(x)的Hessian矩阵。

  1. 取初始点 x 0 x_0 x0
  2. 计算 ∇ f ( x k ) \nabla f(x_k) f(xk) 如果此时梯度为0则停止计算
  3. 计算 H k H_k Hk x k + 1 = x k − H k − 1 ∇ f ( x k ) x_{k+1} = x_k - H^{-1}_k \nabla f(x_k) xk+1=xkHk1f(xk)
  4. k = k + 1 执行 2 步

牛顿法&梯度下降法

  红色线代表牛顿法,绿色线代表梯度下降法,一般认为牛顿法可以利用到曲线本身的信息,比梯度下降法更容易收敛(迭代更少次数)。

  根据wiki上的解释,从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。

  对一个n阶可导的函数而言,在某点处进行泰勒展开,展开式保留的次数越多,在以改点为区间内与曲线贴合程度就越好,相应的也就计算量更多,但是对更远位置的把控就更准确。

思考

Q1: 为什么深度学习不采用牛顿法或拟牛顿法作为优化算法?

A1:

  • 原因一:牛顿法需要用到梯度和Hessian矩阵,这两个都难以求解。因为很难写出深度神经网络拟合函数的表达式,遑论直接得到其梯度表达式,更不要说得到基于梯度的Hessian矩阵了。

  • 原因二:即使可以得到梯度和Hessian矩阵,当输入向量的维度N较大时,Hessian矩阵的大小是N×N,所需要的内存非常大。

  • 原因三:在高维非凸优化问题中,鞍点相对于局部最小值的数量非常多,而且鞍点处的损失值相对于局部最小值处也比较大。而二阶优化算法是寻找梯度为0的点,所以很容易陷入鞍点。


Q2: 牛顿法优缺点:

A2:

  • 优点:

    • 收敛速度快,牛顿法收敛速度为二阶,对于正定二次函数一步迭代即达最优解。
  • 缺点:

    • 牛顿法是一种迭代算法,每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂。

    • 牛顿法是局部收敛的,当初始点选择不当时,往往导致不收敛,感兴趣的可以了解一下阻尼牛顿法。

    • Hessian矩阵不一定可逆


Q3: 梯度下降法优缺点:

A3:

  • 优点:

    • 当目标函数是凸函数时,梯度下降法的解是全局解
  • 缺点:

    • 靠近极小值时收敛速度减慢,求解需要很多次的迭代;

    • 直线搜索时可能会产生一些问题;

    • 可能会“之字形”地下降。

    • 鞍点

参考

https://zhuanlan.zhihu.com/p/46536960

https://blog.csdn.net/michaelhan3/article/details/82350047

https://blog.csdn.net/robert_chen1988/article/details/53137997

https://www.cnblogs.com/eilearn/p/9036776.html

https://blog.csdn.net/weixin_44264662/article/details/99866159


http://chatgpt.dhexx.cn/article/pd84ImYL.shtml

相关文章

使用Andriod Device Moniter时用正则表达式筛选指定日志

有时候我们想过滤出指定的一个或者几个日志&#xff0c;又或者屏蔽掉一些无意义的日志&#xff0c;那么可以创建一个筛选&#xff0c;在此页面的by Log Tag填写如下格式的表达式&#xff1a; 过滤出指定tag的日志信息&#xff1a;^(?:tag1|tag2|tag3) 忽略指定tag的日志信息…

使用Memberane Moniter监控HTTP SOAP requests

Memberane Moniter 使用方法见左侧Documentation 此工具可以监控到每一次发生在指定端口的http请求或者soap请求&#xff0c;如图所示。 但是个人认为仍然有几个问题&#xff1a; 1.不能真正的监控8080端口&#xff0c;我个人认为他的原理是类似于复制了一遍8080端口的内容&am…

linux( sudo bmon ) 流量监控工具----类似于 moniter interface

sudo bmon monitor bandwidth interface eth0 &#xff08;vyos 把 bmon 的linux 改为 了 moniter interface 了&#xff0c;底层还是调用的 bmon&#xff09; Linux:~$ sudo bmon -h bmon 3.5 Copyright (C) 2001-2013 by Thomas Graf <tgrafsuug.ch> Copyright (C) 2…

Android Device Moniter部分问题的解决办法:

一、Android Device Moniter中File explorer显示空白的问题不显示内容&#xff1a; 解决办法&#xff1a; 如上图所示 1.Tools->Android->Enable ADB Integration处于关闭状态。 2.重新打开Android Device Moniter。 3.若还处于空白状态&#xff0c;则极有可能是ja…

操作系统锁的实现方法有哪几种_深入理解多线程(四)——Moniter的实现原理...

本文是《深入理解多线程系列文章》的第四篇。点击查看原文&#xff0c;阅读该系列所有文章。 在深入理解多线程(一)——Synchronized的实现原理中介绍过关于Synchronize的实现原理&#xff0c;无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter…

操作系统锁的实现方法有哪几种_深入理解多线程(四)—— Moniter的实现原理

文章来源&#xff1a;深入理解多线程&#xff08;四&#xff09;—— Moniter的实现原理 原文作者&#xff1a;Hollis 来源平台&#xff1a;微信公众号 在深入理解多线程&#xff08;一&#xff09;——Synchronized的实现原理 中介绍过关于Synchronize的实现原理&#xff0c;无…

【深入理解多线程】 Moniter的实现原理(四)

在深入理解多线程&#xff08;一&#xff09;——Synchronized的实现原理中介绍过关于Synchronize的实现原理&#xff0c;无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter、monitorexit都是基于Monitor实现的&#xff0c;那么这篇来介绍下什么…

synchronized实现原理之---Moniter的实现原理

上一篇synchronized的实现原理提到了moniter&#xff0c;当时没有介绍它。 无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter、monitorexit都是基于Monitor实现的&#xff0c;那么这篇来介绍下什么是Monitor。 操作系统中的管程 如果你在大…

dubbokeeper-moniter部署指南

moniter在整个dubbo架构中的角色: 使用的1.0.1版本: ## 1.0.1版本变动内容 dubbokeeper在1.0.1版本对监控数据存储模块抽离出来&#xff0c;做为单独的应用部署&#xff0c;而不是和1.0.0版本和前端展示集成在一个应用里面在1.0.0版本中暂时提供了mysql以及1.0.0中已有的lucene…

Abaqus2022不能进行多核计算问题以及提交运算moniter不显示信息问题

近期换了新电脑&#xff0c;安装了abaqus2022&#xff0c;但出现了使用多核无法计算的问题&#xff0c;只能使用单核&#xff1b;另外使用单核计算时&#xff0c;moniter中不显示计算的信息&#xff0c;只能看到结果等。 问题如下&#xff1a; 在网上也找了好多的解决方式&…

深入理解多线程(四)— Moniter的实现原理

深入理解多线程&#xff08;四&#xff09;— Moniter的实现原理 在深入理解多线程&#xff08;一&#xff09;—Synchronized的实现原理中介绍过关于Synchronize的实现原理&#xff0c;无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter、mon…

锁机制初探(五)Moniter的实现原理

在深入理解多线程&#xff08;一&#xff09;——Synchronized的实现原理中介绍过关于Synchronize的实现原理&#xff0c;无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter、monitorexit都是基于Monitor实现的&#xff0c;那么这篇来介绍下什么…

Moniter

了解这个Moniter的实现原理之前&#xff0c;可以说大家已经初步了解了synchronized的底层原理了。无论是同步方法还是同步代码块&#xff0c;无论是ACC_SYNCHRONIZED还是monitorenter、monitorexit都是基于Monitor实现的。 那我们就简单了解下什么Monitor吧&#xff01;&#…

java什么是monitor和Monitor监视器锁、对象布局

文章目录 Monitor监视器锁什么是moniter对象布局 Monitor监视器锁 每个同步对象都有一个自己的Monitor(监视器锁)&#xff0c;加锁过程如下图所示&#xff1a; 任何一个对象都有一个Monitor与之关联&#xff0c;当且一个Monitor被持有后&#xff0c;它将处于锁定状态。Synchro…

Dense Teacher

“从稀疏到密集”的范式使SSOD的流程复杂化&#xff0c;同时忽略了强大的直接、密集的教师监督 - 最新半监督检测框架 论文地址&#xff1a;https://arxiv.org/pdf/2207.05536.pdf Mean-Teacher (MT) 方案在半监督目标检测 (SSOD) 中被广泛采用。在MT中&#xff0c;由教师的最…

Sequential模型、Flatten层、Dense层

Sequential模型 顺序模型 核心操作是添加layers,有两种方法 第一种:通过add()添加 model Sequential() model.add(tf.keras.layers.Dense(10,input_shape(1,)&#xff0c;activationrelu))#10表示输出数据的维度&#xff0c;后面表示输入的形状,激活函数为relu model.add(tf…

【Python-Keras】keras.layers.Dense层的解析与使用

1 Dense解析 keras.layers.Dense(units, activationNone, use_biasTrue, kernel_initializerglorot_uniform, bias_initializerzeros, kernel_regularizerNone, bias_regularizerNone, activity_regularizerNone, kernel_constraintNone, bias_constraintNone)实现神经网络里的…

tf.layers.dense()的用法

dense &#xff1a;全连接层 相当于添加一个层 函数如下&#xff1a; tf.layers.dense( inputs, units, activationNone, use_biasTrue, kernel_initializerNone, ##卷积核的初始化器 bias_initializertf.zeros_initializer(), ##偏置项的初始化器&#xff0c;默认初始化为…

DenseNet与ResNet

ResNet&#xff08;深度残差网络&#xff09; 深度残差网络 DenseNet 采用密集连接机制&#xff0c;即互相连接所有的层&#xff0c;每个层都会与前面所有层在channel维度上连接在一起&#xff0c;实现特征重用&#xff0c;作为下一层的输入。 这样不但缓解了梯度消失的现象…

DenseNet解读

Densely Connected Convolutional Networks ,作者清华姚班的刘壮&#xff0c;获得cvpr 2017 best paper。非常值得阅读。 DenseNet优势&#xff1a; &#xff08;1&#xff09;解决了深层网络的梯度消失问题 &#xff08;2&#xff09;加强了特征的传播 &#xff08;3&#xff…