老饼讲解-神经网络 机器学习 神经网络 深度学习
BP算法-自实现
1.BP神经网络自实现-开篇导读与回顾
2.BP神经网络的初始化与梯度公式
3. BP神经网络-训练算法
4.BP神经网络-代码自实现

【原理】LM算法思想与介绍

作者 : 老饼 发表日期 : 2022-06-09 04:37:44 更新日期 : 2024-03-23 20:00:29
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com




Levenberg-Marquardt(列文伯格-马跨特)法是高斯牛顿法和梯度下降法的结合

它就是matlab的BP神经网络工具箱中默认的训练方法---trainlm法

本文对LM法的基本原理进行讲解,并展示相关迭代公式




   01.列文伯格-马跨特(LM)法   


本节简单介绍LM法的思想和迭代公式


     LM法的思想    


LM算法视频:《 BP的trainlm算法是什么
学习LM算法(Levenberg-Marquardt)必须先学习高斯-牛顿法梯度下降法
因为LM算法其实就是简单的将高斯-牛顿法与梯度下降法进行结合
如下,LM法的迭代量为:

可以看到,
(1) 当   很大的时候,上式近似于   它相当于一个梯度下降,          
(2 )当    很小的时候,上式近似于 ,相当于高斯牛顿法    
✍️说明
 由于LM法是基于高斯-牛顿法,
而高斯-牛顿法只适用于优化多个函数的平方和这类目标函数
因此,LM法也只适用于优化多个函数的平方和这类目标函数




     LM算法的迭代公式    


LM法的适用条件
当目标函数为多个函数的平方和时
即 时,可用LM算法

 LM法的迭代公式
LM算法的迭代公式如下
 
 其中
 

  

  是雅克比矩阵:
  
 






    02. LM算法中mu的自适应机制    



本节补充讲解LM法中u的自适应机制



    u的自适应机制    


u的意义
LM法中的并不是固定的
由于   很大的时候,LM法相当于梯度下降法 
由于   很小的时候,LM法相当于高斯牛顿法 
因此
 的意义是让LM法近似梯度下降还是近似高斯牛顿法
 
     u的自适应机制    
 
u的自适应调整机制可设置如下:
 

可以看到,它在距离解较远的时候,使用梯度下降法,
在距离解较近的时候,使用高斯牛顿法,加快收敛     





    mu的自适应机制的伪代码    


   关于mu自适应机制的伪代码
 参考自“matlab神经网络工具箱的traimlm法代码”
 %matlab神经网络工具箱里,trainlm法的mu的自适应代码。
%本代码是伪代码,仅为提供思路。

while (1)      
    Jmat = getJmat();  %计算雅克比矩阵
    je   = Jmat * e';      %JF
    jj   = Jmat * Jmat'; %JJ
    while (mu <= mu_max)
        dX   = -(jj + ii*mu) \ je; %计算当前mu下的dx
        newX = X + dX;           %当前mu下的新解newX
        [newE] = cal(newX);      %计算当前误差
        if (newE < E)            %若果误差比之前更小
            X = newX;            %则接受newX作为X
            mu =max(mu * mu_dec,1e-20);%下降mu
            break;
        end
        mu = mu * mu_inc;         %否则增大mu,使它更接近梯度下降法
    end
 
    if ('终止条件') %判断是否终止
        break; %若是,则退出训练
    end  
end





    03. L-M法总结    



本节对LM法进行简单总结与提炼



    LM法的总结   


列文伯格-马跨特法是高斯-牛顿法与梯度下降法的结合,
通过参数u来控制是使用高斯-牛顿法,还是梯度下降法
也即通过u来控制迭代时用二次曲面,还是一次切面

由于牛顿-高斯法是利用了目标函数里的平方运算,
所以LM法也只适用于二次均方最小值问题的
如果换了其它目标函数,那么LM法就不一定适用了



    老饼小故事   


        很久以前就在使用matlab神经网络工具箱中的trainlm法
直到工作,才弄明白了它的原理,
感觉到的确是一种不错的方法
怪不得matlab神经网络工具箱会将它作为默认的训练算法
然后综合自己的看法,写了这篇文章,希望对大家有所帮助





    参考文献    


本文大部分借鉴于文献《methods for non-linear least squares problems》,有兴趣的同学可以直接阅读文献。
然后推荐沈乐君老师的《Levenberg-Marquardt快速入门教程(荐)》《Levenberg-Marquardt最优化C++源码(OpenCV版)》



联系老饼