当前位置: 首页 > news >正文

梯度下降,牛顿法 ,高斯牛顿法

出处:https://blog.csdn.net/wuaini_1314/article/details/79562400

 

线性最小二乘问题,我们可以通过理论推导可以得到其解析解,但是对于非线性最小二乘问题,则需要依赖迭代优化的方法,。 
梯度下降主要是从一阶目标函数的一阶导推导而来的,形象点说,就是每次朝着当前梯度最大的方向收敛;二牛顿法是二阶收敛,每次考虑收敛方向的时候,还会考虑下一次的收敛的方向是否是最大(也就是梯度的梯度)。可以参考下图:

 
红线为牛顿法,绿线为梯度下降。

高斯-牛顿和LM法则主要是针对非线性最小二乘问题提出的解决方案。由于牛顿法需要求解二阶导,也就是hessian matrix,运算量大,不利于实现,,所以通常在牛顿法的基础上用去掉二阶项,用一阶项来近似二阶导,从而保证了计算效率。LM方法,则是由于高斯-牛顿方法在计算时需要保证矩阵的正定性,于是引入了一个约束,从而保证计算方法更具普适性。

1.梯度下降与牛顿法[2] 
梯度下降法: 
梯度是上升最快的方向,那么如果我想下山,下降最快的方向呢,当然是逆着梯度了(将一点附近的曲面近似为平面),这就是梯度下降法,由于是逆着梯度,下降最快,又叫最速下降法。(一句话就是,朝着梯度方向收敛,可以参考梯度的定义)

迭代公式: 
b=aγF(a)b=a−γ∇F(a) ,γγ是步长。

牛顿法: 
最优化问题中,牛顿法首先则是将问题转化为求 f‘(x) = 0 这个方程的根。 
首先得到一个初始解 x0, 
一阶展开:f(x)f(x0)+(xx0)f(x0)f′(x)≈f‘(x0)+(x-x0)f″(x0) 
f(x0)+(xx0)f(x0)=0f‘(x0)+(x-x0)f″(x0)=0 
求解得到x,相比于x0,f(x)<f(x0)f‘(x)<f′(x0)

总结一下

其实我们不知道函数的极值点(一阶导的0解),但是我们不知道这个函数是什么样的

但是我们知道每个点的函数

所以,梯度法就是直接求导然后朝着这个点下降最快的方向走一步

牛顿法是用这个点二阶导去近似这个函数的一阶导,然后求0解

 

优缺点: 
梯度法:又称最速下降法,是早期的解析法,收敛速度较慢。 
牛顿法:收敛速度快,但不稳定,计算也较困难。

 

2.高斯牛顿和LM方法 
推导过程可以参考 
http://blog.csdn.net/zhubaohua_bupt/article/details/74973347 
http://fourier.eng.hmc.edu/e176/lectures/NM/node36.html 
http://blog.csdn.net/dsbatigol/article/details/12448627

需要注意的是 高斯牛顿方法 在求解hessian matrix时 做了一个简化

目标函数可以简写: 
S=mi=1r2iS=∑i=1mri2

梯度向量在方向上的分量: 
gj=2mi=1ririβjgj=2∑i=1mri∂ri∂βj (1)

Hessian 矩阵的元素则直接在梯度向量的基础上求导: 
Hjk=2mi=1(riβjriβk+ri2riβjβk).Hjk=2∑i=1m(∂ri∂βj∂ri∂βk+ri∂2ri∂βj∂βk).

高斯牛顿法的一个小技巧是,将二次偏导省略,于是: 
Hjk2mi=1JijJikHjk≈2∑i=1mJijJik (2)

将(1)(2)改写成 矩阵相乘形式: 
g=2Jrr,H2JrJr.g=2Jr⊤r,H≈2Jr⊤Jr.

Levenberg-Marquardt方法: 
高斯-牛顿法中为了避免发散,有两种解决方法 
1.调整下降步伐:βs+1=βs+α Δ.0<α<1βs+1=βs+α Δ.0<α<1 
2.调整下降方向:(JTJ+λD)Δ=JTr(JTJ+λD)Δ=JTr

λ+λ→+∞时:Δ/λJTrΔ/λ→JTr,即方向和梯度方向一样,变成了梯度下降法。

相反,如果λ为0,就变成了高斯牛顿法。 
Levenberg-Marquardt方法的好处在于可以调节: 
如果下降太快,使用较小的λ,使之更接近高斯牛顿法 
如果下降太慢,使用较大的λ,使之更接近梯度下降法

此外,高斯牛顿法中涉及求逆矩阵的操作,(JTJ)(JTJ) 加入λ 也可以保证该矩阵为一个正定矩阵。

【reference】: 
[1]http://fourier.eng.hmc.edu/e176/lectures/NM/node36.html 【理论推导很完善】 
[2].http://blog.csdn.net/dsbatigol/article/details/12448627

有关梯度下降法: 
http://www.cnblogs.com/shixiangwan/p/7532858.html 
https://www.zhihu.com/question/19723347 
http://www.cnblogs.com/maybe2030/p/5089753.html 
梯度下降与牛顿法: 
https://www.cnblogs.com/shixiangwan/p/7532830.html

 

转载于:https://www.cnblogs.com/shensobaolibin/p/9322513.html

相关文章:

  • 小程序实践(八):验证码倒计时功能
  • CSS 提示工具(Tooltip)
  • 开放平台下从事开发工作的苦水
  • BigDecimal的用法详解(保留两位小数,四舍五入,数字格式化,科学计数法转数字,数字里的逗号处理)...
  • 分发系统介绍、 expect脚本远程登录、远程执行命令、传递参数
  • 欧几里得扩展算法扩展欧几里得
  • Spring Boot 2.0 整合 ES 5 文章内容搜索实战
  • HyperLedger Fabric ca正式环境部署
  • mysql-ubuntu14.04彻底卸载mysql
  • 检测对象或数组
  • Python--作业2--对员工信息文件,实现增删改查操作
  • BAT面试常的问题和最佳答案
  • MFS分布式文件系统服务搭建
  • redis系列:通过文章点赞排名案例学习sortedset命令
  • 自抗凝透析器研究取得系列进展
  • classpath对获取配置文件的影响
  • Go 语言编译器的 //go: 详解
  • java概述
  • JSDuck 与 AngularJS 融合技巧
  • Koa2 之文件上传下载
  • mysql_config not found
  • MySQL主从复制读写分离及奇怪的问题
  • php面试题 汇集2
  • Python进阶细节
  • underscore源码剖析之整体架构
  • webgl (原生)基础入门指南【一】
  • 数据科学 第 3 章 11 字符串处理
  • 小程序开发之路(一)
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • # .NET Framework中使用命名管道进行进程间通信
  • # 数据结构
  • # 透过事物看本质的能力怎么培养?
  • #pragma multi_compile #pragma shader_feature
  • #QT项目实战(天气预报)
  • $NOIp2018$劝退记
  • (06)Hive——正则表达式
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (C++)八皇后问题
  • (C语言)fread与fwrite详解
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (Python第六天)文件处理
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (七)c52学习之旅-中断
  • (七)Knockout 创建自定义绑定
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (生成器)yield与(迭代器)generator
  • (顺序)容器的好伴侣 --- 容器适配器
  • (学习日记)2024.02.29:UCOSIII第二节
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • .NET CORE使用Redis分布式锁续命(续期)问题