训练数据常用算法之Levenberg–Marquardt(LM)

本文深入解析了LM算法的工作原理及其在优化问题中的应用。从传统BP算法出发,对比了梯度下降法与牛顿法的特点,并介绍了如何利用雅可比矩阵替代二阶导数计算以提高效率。同时,探讨了LM算法中参数u的调整策略及算法流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      引入问题

       神经网络训练数据的过程就是不断调整未知参数使得代价函数达到最小值,通常选择均值平方差函数MSE,即解决一个如下问题。

  

      

       传统BP算法更新参数使用的是最快梯度下降法,即沿梯度的反方向,按一定步长大小,进行参数更新,使的评价函数达到极小值。

                                                                                     hsd = -F'(x)

       但是此种方法忽略了二阶导数项,最终阶段为线性收敛,且速度较慢,因此,更多时候是将其作为优化初始阶段所采用方法。

       相反,牛顿法使用了二阶导数,最终阶段收敛速度快,收敛性好,但不适合初始阶段。因此常将其与最快梯度下降法结合使用。牛顿法简单推导:

    值得注意的是,牛顿法计算出的hn是下降方向是有前提条件的,条件是H(即F''(x))是正定矩阵

     因此,若F''(x)正定,则h = hn 否则  h= hsd。

        LM

      但是,牛顿法需要时刻计算H矩阵,即二阶导数信息,是很麻烦的一件事情,LM算法的核心思想就是用雅可比矩阵(易计算)代替H矩阵的计算,使得优化效率有了提升。

     下面是用雅可比矩阵代替二阶导数的推导

 

      下面用雅可比矩阵来解决问题,首先推导高斯-牛顿法,LM法就是在高斯-牛顿法的基础上加入了一个变量因子。注意F是f的平方,因此我的理解是f作一阶展开就相当于F作二阶展开了。

                    

求F(x)的极小值被转化为了求L(h)极小,求解过程简化。高斯牛顿与牛顿法很像,可以对比一下:

高斯牛顿:L''(h)hgn = -L'(0),牛顿:F''(x)hn= -F'(x)。这种转化使得不用再计算F的二阶导数


     L-M算法与高斯-牛顿类似,如下式描述:

(1)当u=0时,退化为高斯牛顿算法

(2)当u很大时,hlm = -(F'(x))/u,退化为步长较小的梯度下降法

     

        因此在解决了高斯-牛顿法基础之上,LM算法的重点就是如何确定u值。引入一个评价量

        该量描述了使用L的下降量对F下降量的近似程度,如果ro较大,说明近似效果较好(可以理解为L下降量很小,接近极值点),可以继续减小u使得LM更接近高斯-牛顿;如果ro较小,说明近似效果较差,因此增大u使得LM更接近梯度法。u和ro的曲线如下图

       此外,还需要规定迭代结束条件(3者之一达到即可):

       (1)下降梯度g小于某一阈值

       (2)前后两次x的差小于某一阈值

       (3)达到最大迭代次数kmax

       最后LM算法流程如下:


参考资料(推导非常详细):Miroslav Balda 的Methods for non-linear least square problems

 http://download.csdn.net/detail/mingtian715/9708842

MATLAB代码(基于LM的优化版本):http://download.csdn.net/detail/mingtian715/9709054



### Levenberg-Marquardt算法的应用场景 Levenberg-Marquardt (LM) 算法广泛应用于非线性最小二乘问题的求解,在多个领域有着重要应用。该算法特别适用于解决那些具有复杂误差表面的问题,能够有效地找到局部最优解[^1]。 #### 声源定位中的应用 在声学工程中,基于Levenberg-Marquardt算法可以实现高效的声源定位Matlab仿真。通过调整模型参数使预测值尽可能接近实际测量得到的声音传播特性,从而精确估计发声物体的位置信息[^2]。 #### 计算机视觉中的姿态评估 对于计算机视觉任务而言,如图像处理里的对象识别或三维重建等场合下,利用LM优化技术可提高特征匹配精度并加快计算速度。具体来说,在进行摄像机标定或者人体骨骼跟踪时,采用这种方法有助于更稳定地获取目标的姿态变化情况[^3]。 --- ### 实现方式概述 为了更好地理解如何编程实现这一强大的工具,下面给出Python版本的一个简单例子: ```python import numpy as np from scipy.optimize import least_squares def model_function(params, x_data): """定义待拟合数据生成函数""" a, b = params return a * np.exp(-b*x_data) def residuals(params, x_data, y_measured): """计算残差向量""" y_predicted = model_function(params, x_data) err = y_measured - y_predicted return err.flatten() # 初始化输入变量 initial_guess = [0.8, 0.5] xdata = np.linspace(0, 4, 50) ytrue = model_function([1., .7], xdata) noise = 0.2*np.random.randn(len(xdata)) ymeas = ytrue + noise result = least_squares(residuals, initial_guess, args=(xdata, ymeas), method='lm') # 使用LM算法作为优化器 print(f"Optimized parameters: {result.x}") ``` 上述代码展示了怎样借助`scipy`库内的`least_squares()`接口轻松调用内置的支持LM策略的功能模块完成一次完整的曲线拟合过程。这里的关键在于正确设置损失函数的形式以及合理选取初值范围以便于后续迭代操作顺利开展[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值