最速下降法

目录

前言

一、梯度下降相关数学概念

二、最速下降法实战

2.1、例图1

2.2、Matlab代码实现

2.3、例题2

三、小结      


前言

        最速下降法,在SLAM中,作为一种很重要求解位姿最优值的方法,缺点很明显:迭代次数太多,尽管Newton法(保留目标函数的二阶项Hessian矩阵)改善了“迭代次数过多”这一缺点,但是Hessian矩阵规模庞大(参考:特征匹配点成百对),计算较为困难。Gaussian-Newton法在Newton原有基础上,用的是一阶雅克比的转置*一阶雅克比 JTJ 来近似 Hessian, 但是,这里的近似替换 JTJ并不一定正定。一般,主流非线性优化方法:Levenberg-Marquadt、Dog-leg较为常用,这里不作介绍。

        在深度学习中是一样的道理,模型训练参数可能有几百万到几千万,每次训练前向传播要计算loss,一阶偏导数,然后依据最速下降法更新梯度。

一、梯度下降相关数学概念

个人理解:

是方向偏导数,我们不仅要使得梯度下降,还要以最快的步伐下降。

x* 是无约束问题的局部最优解 =》 x*是其目标函数的驻点

(回想起SVM当中求解有约束目标函数最优值,利用拉格朗日乘子法进行转换。)

例如:在 y = x^3的曲线当中,x = 0处是 极大值点,也不是极小值点,称作:鞍点。

理解定理3:我们翻开书,看到如下概念:

性质

(1)如果一个函数f(x)在某个区间I上有f''(x)(即二阶导数)>0恒成立,那么对于区间I上的任意x,y,总有:

f(x)+f(y)≥2f[(x+y)/2],如果总有f''(x)<0成立,那么上式的不等号反向。 

几何的直观解释:如果一个函数f(x)在某个区间I上有f''(x)(即二阶导数)>0恒成立,那么在区间I上f(x)的图象上的任意两点连出的一条线段,这两点之间的函数图象都在该线段的下方,反之在该线段的上方。

(2)判断函数极大值以及极小值。

结合一阶、二阶导数可以求函数的极值。当一阶导数等于0,而二阶导数大于0时,为极小值点。当一阶导数等于0,而二阶导数小于0时,为极大值点;当一阶导数和二阶导数都等于0时,为驻点。

(3)函数凹凸性。

设f(x)在[a,b]上连续,在(a,b)内具有一阶和二阶导数,那么,

(1)若在(a,b)内f''(x)>0,则f(x)在[a,b]上的图形是的;

(2)若在(a,b)内f’‘(x)<0,则f(x)在[a,b]上的图形是的。

二、最速下降法实战

2.1、例图1

来做一道数学题,如能理解,便能深刻理解算法。

2.2、Matlab代码实现

准备相关脚本函数(Matlab脚本):

function [ y ] = GDMin2(fx,var,x,e,MAX)
% 最速梯度下降法求解函数极小点
% 参数描述------------------------------
%   fx  符号表达式 如fx = (x1-2)^4+(x1-2*x2)^2;
%   var 符号变量列表 如:syms x1 x2;var= [x1;x2];
%   x  起始位置
%   e 精度控制
%   MAX 最大迭代次数控制
% ------------------------------

if nargin < 5
    MAX = 10;%设置默认最大迭代次数
end
precision = 3;%显示精度控制

%开始循环迭代
%direction存贮搜索方向
%step 存贮步长

bfound = 0;
for k=1:1:MAX
    direction = getNextDirecrion(fx,var,x);
    disp('------------------------------');
    fprintf('d[%d]=:',k);
    disp( vpa(direction',precision) );
    if normest(direction) <= e
        y = x;
        bfound = 1;%得到结果时置为1
        break;
    else
        step = getNextStep(fx,var, x,direction);%计算步长
        if isempty(step)
            error('can not find a proper step.');
        end
        %打印求解过程
        fprintf('X[%d]=:',k);
        disp( vpa(x',precision) );
        fprintf('step(%d)=: ', k);
        disp( vpa(step,precision) );
        disp('------------------------------');
        x = x+step*direction;%计算下一个位置
    end
end
if bfound == 1
    disp('min value of:');
    disp( vpa( subs(fx,var,y),precision) );
end
end

%根据位置xk,获取搜索方向
function [direction] = getNextDirecrion(fx,var,xk)

    gx = gradient(fx,var); %计算梯度函数
    direction = -subs(gx,var,xk);%计算搜索方向
end

%根据位置xk和方向dk,获取搜索步长step
%注意符号表达式求导数的根时返回值转换为double类型
function [step] =getNextStep(fx,var,xk,dk)

    syms lambda;
    phix = subs(fx,var,xk+lambda*dk);
    phix_diff = diff(phix);
    step = double(solve(phix_diff,'Real',true));%求取导函数的实数根
end

在MATLAB命令行键入:

clear all;
syms x1 x2;
X = [x1;x2];
fx = x1 - x2 + 2*x1^2 + 2*x1*x2 + x2^2;
x1 = [0;0];
e = 0.3;
minVal = GDMin2(fx,X,x1,e)

结果打印如下:

结果:

------------------------------
d[1]=:[ -1.0, 1.0]

X[1]=:[ 0, 0]

step(1)=: 1.0

------------------------------
------------------------------
d[2]=:[ 1.0, 1.0]

X[2]=:[ -1.0, 1.0]

step(2)=: 0.2

------------------------------
------------------------------
d[3]=:[ -0.2, 0.2]

min value of:
-1.2


minVal =

-4/5
6/5

和手动结算的结果是一样的在 x 取值 [-0.8,  1.2]的时候,取得满足精度的值。

2.3、例题2

这里再看一道简单的数学题,当梯度下降起始点x取值为3和2的时候,收敛步数是不一样的。

我们看前两步;画出其迭代路线:

clear all;
clc;
close all;
x = 0:0.1:8
fx = (x(1,:) - 4).^2


plot(x, fx);
hold on

%% 标出点
plot(3, 1, '-ro');
plot(4, 0, '-ro');
hold on

%% 连线
%% plot([x1,x2...], [y1,y2,...])
plot([3 4],[1 0], '-g');
hold off

两步就收敛;现在,如果我们将初始值(startpoints)改为:x = 2;再根据上述求解过程,画出迭代路线:

可以看到,起始点是 x  = 2 比 x = 3的迭代次数多一次,所以选取一个好的初始值十分重要;同样,  

三、小结      

  • 在SLAM当中,例如:3D-3D映射;我们在RANSAC框架下,基于PNP/ICP 计算出位姿初始值,这样一个初始值,在后续BA当中,是一个较为理想的初始值。
  • 在深度学习中,预训练模型能够加速收敛。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/125123.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux笔记——Ubuntu子系统从系统盘迁移到非系统盘

Linux笔记——Ubuntu子系统从系统盘迁移到非系统盘 一、子系统迁移1. 关闭linux子系统2. 使用move-wsl进行迁移 二、 虚拟机子系统瘦身 安了子系统还没用几天&#xff0c;C盘提示我没空间了。。。剩余0kb的那种。。。Ubuntu安装的时候默认按C盘了&#xff0c;所以还是移走腾点地…

现货白银的代码为什么不是ag

如果大家对求学时期所学的化学知识还记忆犹新&#xff0c;应该记得白银这种物质的化学元素符号是ag&#xff0c;但在参与伦敦银交易的时候&#xff0c;大家也许会发现&#xff0c;在大多数平台的交易软件中&#xff0c;它的代码并没有使用到这个简写符号。 其实在国际现货贵金属…

Git查询某次提交属于哪个分支

在Android studio&#xff08;JetBrains系列也类似&#xff09;左下角&#xff0c;可以看到所有提交信息。 选中某一次提交信息&#xff0c;右键&#xff0c;选择“Copy Revision Number”&#xff0c;如下图&#xff1a; 打开Android studio的Terminal&#xff0c;输入git b…

使用 promise 重构 Android 异步代码

背景 业务当中写Android异步任务一直是一项挑战&#xff0c;以往的回调和线程管理方式比较复杂和繁琐&#xff0c;造成代码难以维护和阅读。在前端领域中JavaScript其实也面临同样的问题&#xff0c;Promise 就是它的比较主流的一种解法。 在尝试使用Promise之前我们也针对And…

【BUG解决】服务器没报警但是应用接口崩了....

最近遇到一个突发问题&#xff1a;服务器没报警但是应用接口崩了… 为其他业务系统提供一个接口&#xff0c;平时好好的&#xff0c;突然就嚷嚷反馈说访问不了了&#xff0c;吓得我赶紧跳起来&#xff01; 正常情况下在系统崩溃前&#xff0c;我会收到很多系统报警&#xff0…

【Linux】补充:进程管理之手动控制进程,以及计划任务

目录 一、手动启动进程 1、理解前台启动与后台启动 2、如何完成前台启动后台启动的切换 3、完成并行执行多个任务 4、结束进程 1、kill 2、killall 2、pkill 二、计划任务 1、at一次性计划任务 2、实操 2、周期性计划任务 1、关于设置周期性任务的配置文件以及格式…

使用ffmpeg调用电脑自带的摄像头和扬声器录制音视频

1、打开cmd&#xff0c;执行chcp 65001,修改cmd的编码格式为utf8&#xff0c;避免乱码 2、执行指令ffmpeg -list_devices true -f dshow -i dummy,查看当前window的音频和视频名称 3、打开windows系统的"打开声音设置"–“麦克风隐私设置”–"允许应用访问你…

技术分享 | 测试平台开发-前端开发之数据展示与分析

测试平台的数据展示与分析&#xff0c;我们主要使用开源工具ECharts来进行数据的展示与分析。 ECharts简介与安装 ECharts是一款基于JavaScript的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表&#xff…

第七章《搞懂算法:线性回归是怎么回事》笔记

线性回归算法是机器学习算法中最简单的一类&#xff0c;线性回归算法主要用于连续值的预测问题。 7.1 什么是线性回归 这种刻画了不同变量之间关系的模型叫作回归模型&#xff0c;如果这个模型是线性的&#xff0c;则为线性回归模型。 线性回归主要是应用回归分析来确定两种…

EfficientNet 系列网络学习

EfficientNet V1 EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks 增加网络参数的方式有三种&#xff1a;深度、宽度和输入图像的分辨率。探究这三种方式对网络性能的影响&#xff0c;以及如何同时缩放这三种因素是 EifficentNet的主要贡献。 单独…

Centos7开放及查看端口

1、开放端口 firewall-cmd --zonepublic --add-port8888/tcp --permanent # 开放8888端口 firewall-cmd --zonepublic --remove-port8888/tcp --permanent #关闭8888端口 firewall-cmd --reload # 配置立即生效 2、查看防火墙所有开放的端口 firewall-cmd --zonepubl…

什么是数字化管理?产业园区如何进行数字化管理?

工业园区的数字化管理涉及利用技术和数据驱动的工具来优化工业园区环境中的运营、提高效率并改进决策流程。它通常包括使用各种数字技术和数据分析技术来监视、控制和增强公园运营的各个方面。 以下是工业园区数字化管理的一些关键方面以及如何实施&#xff1a; 1.数据收集和…

初识Java 17-4 反射

本笔记参考自&#xff1a; 《On Java 中文版》 接口和类型信息 interface关键字的一个重要目标就是允许程序员隔离组件&#xff0c;减少耦合。但我们可以通过类型信息来绕过接口的隔离&#xff0c;这使得接口不一定能够保证解耦。 为了演示这一实现&#xff0c;我们需要先创建一…

C/C++轻量级并发TCP服务器框架Zinx-游戏服务器开发005:守护进程与进程监控

文章目录 1 守护进程1.1 进程组和会话1.2 会话的相关概念1.3 守护进程的概念1.4 守护线程的特点1.5 守护进程创建的基本步骤1.6 本项目守护进程的实现 2 进程监控2.1 进程监控的实现 1 守护进程 1.1 进程组和会话 进程除了有进程的PID之外还有一个进程组&#xff0c;进程组是…

threejs (二) 相机

正交相机 const camera new THREE.OrthographicCamera(-aspect,aspect,aspect,-aspect,0.1, //进平面1000 //远平面); // 透视相机创建相机辅助线 const cameraHelper new THREE.CameraHelper(this.camera);创建一个透视相机观察正交相机 // 创建透视相机const watchCamera …

【算法与数据结构】39、LeetCode组合总和

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;这道题当中数字可以多次使用&#xff0c;那么我们在递归语句当中不能直接找下一个candidate的元素&…

两台linux虚拟机之间实现免密登录

主要实现两台虚拟机之间的免密登录&#xff0c;总所周知&#xff0c;虚拟机之间登录使用的协议是ssh协议&#xff0c;端口号是 22 主机 创建对应的加密文件 [rootweb-2 ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.s…

docker容器中运行jar 出现invalid or corrupt jarfile

1&#xff0c;背景&#xff1a; 在本地java开发完毕之后&#xff0c;想要打包成docker镜像&#xff0c;方便安装。由于本地没有docker环境&#xff0c;也懒得装了。有一台测试的linux机器可以使用&#xff0c;所以先在本地打包生成xxx.jar&#xff0c;然后拷贝到有docker环境的…

vite + electron引入itk报错

代码 import { readImageArrayBuffer } from itk-wasm console.log(readImageArrayBuffer)通过itk-wasm官网&#xff0c;创建新的项目vitevue&#xff08;vue2或者vue3&#xff09;&#xff0c;都没问题。加入electeon后包此错。通过排查&#xff0c;意外找到原因&#xff0c;…

抵御数字威胁的铠甲——发现迅软DSE加密软件在企业保护中的关键角色

目前国内有自主知识产权和研发成果的企业&#xff0c;它们的电子文档大都以明文的方式存储在计算机硬盘中&#xff0c;电子格式存储的重要机密信息却由于传播的便利性和快捷性&#xff0c;对分发出去的文档无法控制&#xff0c;大的增加了管理的复杂程度&#xff0c;这部分信息…