梯度下降法和牛顿法计算开根号

本文将介绍如何不调包,只能使用加减乘除法实现对根号x的求解。主要介绍梯度下降和牛顿法者两种方法,并给出 C++ 实现。

梯度下降法

思路/步骤

  1. 转化问题,将 x \sqrt{x} x ​ 的求解转化为最小化目标函数: L ( t ) L(t) L(t), L ( t ) = ( t 2 − x ) L(t)=(t^2-x) L(t)=(t2−x) ,当 L L L 趋近于 0 时, t t t 就是我们想要的结果;
  2. 迭代寻找使得 L L L 变小的 t t t ,
  3. 最终得到足够小的 L L L 时的 t t t ,即使得 L → 0 L\rightarrow 0 L→0, 得到结果 t t t
  4. 求解 L L L 的极小值,就是导数为 0 的点

如何迭代

OK,现在的问题就是要如何进行迭代,从而得到尽可能小的 L L L,为此,我们要使得随着每一次迭代中 t t t 的变化, L L L 都朝着更小的方向变化一个合适的步长

确定如何迭代,无非就是要确定每次迭代的方向步长

最自然的想法,我们使得 t t t 朝政府两个方向都移动一个很小的步长,然后比一比,看哪个的 L L L 更小了,就向哪个方向移动。即:

  • 若 L ( t + Δ t ) < L ( t ) L(t+\Delta t)<L(t) L(t+Δt)<L(t) ,则 t 1 = t + Δ t t_1=t+\Delta t t1​=t+Δt;
  • 若 L ( t − Δ t ) < L ( t ) L(t-\Delta t)<L(t) L(t−Δt)<L(t) ,则 t 1 = t − Δ t t_1=t-\Delta t t1​=t−Δt;

注意这里的 Δ t \Delta t Δt 应当是一个大于零的无穷小数,即 0 + 0^+ 0+ 。

我们接下来再对上面的式子进行一点变化:

  • 若 L ( t + Δ t ) − L ( t ) < 0 L(t+\Delta t)-L(t)<0 L(t+Δt)−L(t)<0 ,则 t 1 = t + Δ t t_1=t+\Delta t t1​=t+Δt;
  • 若 L ( t ) − L ( t − Δ t ) > 0 L(t)-L(t-\Delta t)>0 L(t)−L(t−Δt)>0 ,则 t 1 = t − Δ t t_1=t-\Delta t t1​=t−Δt;

将这两个式子写在一起:
t 1 = t − L ( t + Δ t ) − L ( t ) ∣ L ( t + Δ t ) − L ( t ) ∣ ⋅ Δ t t_1=t-\frac{L(t+\Delta t)-L(t)}{|L(t+\Delta t)-L(t)|}\cdot \Delta t t1​=t−∣L(t+Δt)−L(t)∣L(t+Δt)−L(t)​⋅Δt
这里的 L ( t + Δ t ) − L ( t ) ∣ L ( t + Δ t ) − L ( t ) ∣ \frac{L(t+\Delta t)-L(t)}{|L(t+\Delta t)-L(t)|} ∣L(t+Δt)−L(t)∣L(t+Δt)−L(t)​ 用来指示正负号。再进行一点变形:
t 1 = t − L ( t + Δ t ) − L ( t ) ∣ L ( t + Δ t ) − L ( t ) ∣ ⋅ Δ t = t − L ( t + Δ t ) − L ( t ) Δ t ∣ L ( t + Δ t ) − L ( t ) Δ t ∣ ⋅ Δ t = t − L ( t + Δ t ) Δ t Δ t ∣ L ( t + Δ t ) − L ( t ) Δ t ∣ = t − α L ′ ( t ) , α = Δ t ∣ L ( t + Δ t ) − L ( t ) Δ t ∣ → 0 + , L ′ ( t ) = L ( t + Δ t ) − L ( t ) Δ t \begin{align} t_1&=t-\frac{L(t+\Delta t)-L(t)}{|L(t+\Delta t)-L(t)|}\cdot \Delta t\\ &=t-\frac{\frac{L(t+\Delta t)-L(t)}{\Delta t}}{|\frac{L(t+\Delta t)-L(t)}{\Delta t}|}\cdot \Delta t\\ &=t-\frac{L(t+\Delta t)}{\Delta t}\frac{\Delta t}{|\frac{L(t+\Delta t)-L(t)}{\Delta t}|}\\ &=t-\alpha L'(t), \ \ \ \alpha=\frac{\Delta t}{|\frac{L(t+\Delta t)-L(t)}{\Delta t}|}\rightarrow 0^+,\ \ \ L'(t)=\frac{L(t+\Delta t)-L(t)}{\Delta t} \end{align} t1​​=t−∣L(t+Δt)−L(t)∣L(t+Δt)−L(t)​⋅Δt=t−∣ΔtL(t+Δt)−L(t)​∣ΔtL(t+Δt)−L(t)​​⋅Δt=t−ΔtL(t+Δt)​∣ΔtL(t+Δt)−L(t)​∣Δt​=t−αL′(t),   α=∣ΔtL(t+Δt)−L(t)​∣Δt​→0+,   L′(t)=ΔtL(t+Δt)−L(t)​​​

  1. 当a取无穷小时,虽然一定保证下降,但效率太慢

  2. 日常设计的很多函数,可以允许使用相对大一些的步长,比如 α = 0.01 \alpha = 0.01 α=0.01。理由是,若步长大了,出现跳过合适位置,使得 L ( t 1 ) > L ( t 0 ) L(t1) > L(t0) L(t1)>L(t0)。再下一个时刻,依旧可能跳回来使得 L ( t 2 ) < L ( t 1 ) L(t2) < L(t1) L(t2)<L(t1)

  3. 大的步长不能保证一定收敛,但是大部分时候是可以很好的工作,也因此,步长 α \alpha α,我们称之为学习率,通常会给一个相对小的数字,但不会太小。

  4. 总之,学习率一般需要在不同的模型任务中手动调试。

代码

float sqrt_grad_decent(float x) {float t = x / 2;float L = (t * t - x) * (t * t - x);float alpha = 0.001;while ( L > 1e-5 ) {float delta = 2 * (t * t - x) * 2 * t;t = t - alpha * delta;L = (t * t - x) * (t * t - x);printf("t=%f\n", t);}return t;
}

总结

  1. 梯度下降法是通过观察局部,决定如何调整的算法。如果函数具有多个极值,则可能陷入局部极值,此时初始点的选择直接影响收敛结果

  2. 大的步长在一定程度上可能跨过局部极值,但也可能造成震荡导致不收敛

  3. 步长的选择,需要根据函数的特性来找到合适取值,若导数特别大时,则步长取小,导数小时,步长可大。否则很容易造成收敛问题

  4. 存在一类算法,可以在一定范围内搜索一个合适步长,使得每一次迭代更加稳定

牛顿法1

梯度下降法常用语求解函数极小值的情况,而牛顿法常用于求解函数零点的情况,即 L = 0 L=0 L=0 时方程的根。

思路/步骤

  1. 转化问题,将求解 x \sqrt{x} x ​ 转换为求解 L ( t ) = t 2 − x = 0 L(t)=t^2-x=0 L(t)=t2−x=0 时的根,即函数的零点
  2. 迭代寻找 t t t

如何迭代

用曲线在 t 0 t_0 t0​ 处切线与 x x x 轴的交点作为 t 1 t_1 t1​ ,来逼近函数的零点。图/牛顿法

切线斜率,同样可以用导数来表示 。

考虑两个坐标系:原坐标系 o 1 o1 o1 ,新坐标系 o 2 o2 o2 ,其中 o 2 o2 o2 以 o 1 o1 o1 中的 ( x 1 , f ( x 1 ) ) (x_1,f(x_1)) (x1​,f(x1​)) 为原点。则在 o 2 o2 o2 坐标系中,下图红色切线可表示为:
f o 2 ( x ) = f ′ ( x 1 ) x f_{o2}(x)=f'(x_1)x fo2​(x)=f′(x1​)x
则该切线与 x x x 轴交点:
f o 2 ( x 2 ) = f ′ ( x 1 ) ( x 2 − x 1 ) = − f ( x 1 ) f_{o2}(x_2)=f'(x_1)(x_2-x_1)=-f(x_1) fo2​(x2​)=f′(x1​)(x2​−x1​)=−f(x1​)
则有:
x 2 − x 1 = − f ( x 1 ) f ′ ( x 1 ) x 2 = x 1 − f ( x 1 ) f ′ ( x 1 ) x_2-x_1=-\frac{f(x_1)}{f'(x_1)}\\ x_2=x_1-\frac{f(x_1)}{f'(x_1)} x2​−x1​=−f′(x1​)f(x1​)​x2​=x1​−f′(x1​)f(x1​)​

代码

我们经过上一小节已经知道迭代的方法:
t 1 = t − L ( t ) L ′ ( t ) t_1=t-\frac{L(t)}{L'(t)} t1​=t−L′(t)L(t)​
代码:

float sqrt_newton1(float x) {float t = x / 2;float L = t * t - x;while ( abs(L) > 1e-5 ) {float dL = 2 * t;t = t - L / dL;L = t * t - x;}return t;
}

牛顿法2

思路

既然牛顿法是对函数求零点,那我们能不能对函数的导函数求零点呢?这样就可以得到函数的极值了。

与梯度下降法的目标函数 L ( t ) = ( t 2 − x ) L(t)=(t^2-x) L(t)=(t2−x) 是相同的,而区别在于,迭代式不同 t 1 = t − f ′ ( t ) f ′ ′ ( t ) t_1=t-\frac{f'(t)}{f''(t)} t1​=t−f′′(t)f′(t)​,并且其中步长(学习率)为 1。

代码

float sqrt_newton2(float x) {float t = x / 2;float L = (t * t - x) * (t * t - x);while ( L > 1e-5 ) {float dL = 2 * (t * t - x) * 2 * t;float d2L = 12 * t * t - 4 * x;t = t - dL / d2L;L = (t * t - x) * (t * t - x);}return t;
}

Ref

  1. 牛顿法

梯度下降法和牛顿法计算开根号相关推荐

  1. 机器学习中梯度下降法和牛顿法的比较

    在机器学习的优化问题中,梯度下降法和牛顿法是常用的两种凸函数求极值的方法,他们都是为了求得目标函数的近似解.在逻辑斯蒂回归模型的参数求解中,一般用改良的梯度下降法,也可以用牛顿法.由于两种方法有些相似 ...

  2. 关于梯度下降法和牛顿法的数学推导

    作者:LogM 本文原载于 https://blog.csdn.net/qq_28739605/article/details/80862810,不允许转载~ 文章难免有错误之处,请在原文评论处指出~ ...

  3. GBDT与xgb区别,以及梯度下降法和牛顿法的数学推导

    为什么要介绍梯度下降法和牛顿法那? 这里提及两个算法模型GBDT和XGBoost,两个都是boosting模型. GBDT和xgb的目标函数是不同的,同时针对其目标函数中的误差函数 L(θ) 的拟合方 ...

  4. 最优化方法之梯度下降法和牛顿法

    大部分的机器学习算法的本质都是建立优化模型,通过最优化方法对目标函数(或损失函数)进行优化,从而训练出最好的模型.最常见的最优化方法有梯度下降法.牛顿法. 最优化方法: 最优化方法,即寻找函数极值点的 ...

  5. 梯度下降法和牛顿法优化原理

    我们假设任何规律都是一个函数,机器学习要做的就是设计模型来拟合这个函数,如何使自己的模型更能贴近这个函数就是我今天要讲的优化问题. 首先假设我们的模型为函数f(x),给定一个输入x,得到预测结果f(x ...

  6. python牛顿法寻找极值_python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例...

    Rosenbrock函数的定义如下: 其函数图像如下: 我分别使用梯度下降法和牛顿法做了寻找Rosenbrock函数的实验. 梯度下降 梯度下降的更新公式: 图中蓝色的点为起点,橙色的曲线(实际上是折 ...

  7. 八、梯度下降法和拟牛顿法

    1.梯度 2.梯度上升和梯度下降 3.梯度下降算法详解 3.1 直观解释 3.2 梯度下降相关概念 3.3 梯度下降的矩阵描述 3.4 梯度下降的算法调优 4.梯度下降法大家族 5.梯度下降法和其他无 ...

  8. 梯度下降、牛顿法凸优化、L1、L2正则化、softmax、Batchnorm、droupout、Targeted Dropout详解

    一.梯度下降 问题提出:虽然给定一个假设函数,我们能够根据cost function知道这个假设函数拟合的好不好,但是毕竟函数有这么多,总不可能一个一个试吧?因此我们引出了梯度下降:能够找出cost ...

  9. 梯度下降法和随机梯度下降法

    1. 梯度 在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度.比如函数f(x,y), 分别对x,y求偏导数,求得的梯度向量就是(∂f/∂x, ∂f/∂y) ...

最新文章

  1. 关于jquery动态改变css样式后,对象获取不到的解决办法
  2. css box 等高布局,css实现等高布局有哪些方式
  3. 快速消费品行业的营销费用的管理(3)----营销费用预算管理
  4. TensorFlow笔记(8) LeNet-5卷积神经网络
  5. idea中出现Please, configure Web Facet first问题
  6. oracle进入到root用户,Linux环境中普通用户切换到root用户问题
  7. 白板机器学习笔记 P60-P65 EM算法
  8. php可变方法,php 函数使用可变数量的参数方法
  9. 有安全研究者混入了 PHP 8.0 开发组!
  10. python与金融风险管理_怎么学习金融风险管理?
  11. 9个offer,12家公司,35场面试,计算机应届毕业生求职之路
  12. 文件模式为 rw-r r linux,linux中-rw-rw-r-- l 是什么意思啊,linux 里命令ls -l 后,文件类型权...
  13. 潜在数学中 放眼数学外——记中国科学院院士、复旦大学教授李大潜zz
  14. 来晚了,秋招五投大厂,成功拿下三家Offer,最终入职美团,分享我的美团1-4面(Java岗)
  15. 对区块链技术的一些新思考
  16. GHOST的口诀:备份122、还原123
  17. SVN如何本地拉取项目
  18. 全国计算机等级考试三级数据库知识点总结!
  19. python中的阶乘,python中阶乘怎么表示
  20. 设计模式之七大原则——里氏替换原则(LSP)(三)

热门文章

  1. 云原生架构的核心技术
  2. c语言在测绘工程中的作用,测绘C程序设计实习报告
  3. 无符号整数与有符号整数相加问题
  4. python-opencv学习笔记(八):判断是否雾天与图像能见度测算
  5. 搜索引擎关键词优化可以怎么做?
  6. centos7升级Apache2.4.6到2.4.54
  7. 【蓝桥杯】 历届试题 国王的烦恼(并查集)
  8. 网络的分类(计算机网络)
  9. Tesra超算网络,解决AI开发困境
  10. Loner_li 机试题 将数字 例如12345.7895”,用程序实现显示壹万贰仟叁佰肆拾伍圆柒角玖分的方式