本站原创文章,转载请说明来自《老饼讲解-BP神经网络》www.bbbdata.com
Levenberg-Marquardt(列文伯格-马跨特)法是高斯牛顿法和梯度下降法的结合
它就是matlab的BP神经网络工具箱中默认的训练方法---trainlm法
本文对LM法的基本原理进行讲解,并展示相关迭代公式
本节简单介绍LM法的思想和迭代公式
LM法的思想
LM(Levenberg-Marquardt)法的思想是,
将高斯-牛顿法与梯度下降法进行结合
如下,LM法的迭代量为:
可以看到,
(1) 当 很大的时候,上式近似于 它相当于一个梯度下降,
(2 )当 很小的时候,上式近似于 ,相当于高斯牛顿法
✍️说明
由于LM法是基于高斯-牛顿法,
因此,LM法也只适用于优化多个函数的平方和这类目标函数
LM法的迭代公式
LM法的适用条件
当目标函数为为多个函数的平方和时
即
可用LM法
LM法的迭代公式
LM法的迭代公式如下
其中
是雅克比矩阵:
本节补充讲解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
本节对LM法进行简单总结与提炼
LM法的总结
列文伯格-马跨特法是高斯-牛顿法与梯度下降法的结合,
通过参数u来控制是使用高斯-牛顿法,还是梯度下降法
也即通过u来控制迭代时用二次曲面,还是一次切面
由于牛顿-高斯法是利用了目标函数里的平方运算,
所以LM法也只适用于二次均方最小值问题的
如果换了其它目标函数,那么LM法就不一定适用了
老饼小故事
很久以前就在使用matlab神经网络工具箱中的trainlm法
直到工作,才弄明白了它的原理,
感觉到的确是一种不错的方法
怪不得matlab神经网络工具箱会将它作为默认的训练算法
然后综合自己的看法,写了这篇文章,希望对大家有所帮助
参考文献
本文大部分借鉴于文献《methods for non-linear least squares problems》,有兴趣的同学可以直接阅读文献。
然后推荐沈乐君老师的《Levenberg-Marquardt快速入门教程(荐)》, 《Levenberg-Marquardt最优化C++源码(OpenCV版)》