最小二乘法概述
前言:函数基底和函数空间的一些概念
相信大家在学习了高数上之后,对于Taylor展开有一定的了解。事实上除了 Taylor 展开之外,Fourier 变换也可以用函数基底来理解。相信大家在高中学习向量的时候就对向量的基底有比较清晰的概念,那么类比于向量基底,我们也可以使用不同的函数作为基底进行线性组合,去表示我们的目标函数。函数层面最典型的例子就是 Fourier 变换,对于空间内的任意方波我们都可以将它拆解为无数个正弦波的线性叠加组合,那么我们就可以把这无穷多个正弦信号看是函数基底,他们的组合的集合在几何上理解的就是函数空间。(tips:三角函数系具有正交性,满足作为基底的条件)
但是这样的表示方式往往都具有约束性,比如泰勒展开这种函数基底的表达方式只在很小的区间上具有很好的拟合效果,使用傅里叶级数要求目标函数是周期函数。非周期函数的傅里叶变换形式是在整个实轴上积分,而积分往往代表的是在这个区间内的无穷累加和,他们都无法用级数表示(无穷累加代表空间是无穷高维的,在整个实轴上积分同时也意味着空间的大小无穷大)
各位若还没有学过傅里叶变换或者是觉得上面表达较为抽象,请跳过,直接看下面蓝色部分的结论就可以了
因此,我们在这里提取出两个重点:首先,用函数基底去拟合目标函数的时候,我们需要目标函数满足一定特性。其次,函数大多只能在一定范围内近似表示。
正文:最小二乘的形式和几种求解最小二乘的方法
最小二乘干了什么
在视觉的工程项目中,它被广泛的运用于参数求解。从最简单的二次函数到难以理解的BA优化你都能使用它来求解或者是优化参数。数学上证明了一般的二次损失函数都是下凸函数,正是这个特性我们才能拓展最小二乘问题的求解方法,在提高求解问题效率的同时保证参数相对的准确。
最小二乘的一般形式
{Y}_i = \lVert \boldsymbol{f(X,t_i)} - \boldsymbol{S_{t_i}} \rVert^2 其中i表示第i个训练样本, Y表示损失,X表示你要求解的参数,S表示ti时刻你的观测值或者真实值,f表达式计算的是ti时刻含有待求解参数的表达式。
这里我们可以提取到两个很重要的信息:一是要先知道要求解的参数,并且大致知道你要用那种函数表达式去拟合参数。二是我们一定要有观测或者样本值,用来构造损失。
几种常见的最小二乘求解方式
总的来说,我们希望我们构造的参数方程尽可能多的包含我们的观测点或者训练数据,那么我们自然希望损失函数在理想参数上的值是最小的,这时候的问题就转变为如何找到目标损失函数的最小值点。对于比较简单的损失函数我们可以使用二分法或者三分法去逼近损失函数的极小值点,但对于比较复杂的多峰函数或者是多元函数的高维问题这两种方法就显得很力不从心。
那么,我们需要更好的方法去找到多元函数的极小值点,这里就引出了目前我们常用的几种最小二乘求解方法:梯度下降法,牛顿法,高斯牛顿法和LM法。
梯度下降法
网上对于梯度下降的原理解释以及讲解已经很详细了,我这里就不过多赘述。因为梯度是函数上升最快的方向,我们想要找极小值就是希望往下降最快的方向迭代,因此梯度下降法的表达式梯度前面用的是负号。这里需要注意的就是,对于曲线来说每一点的梯度大小和方向都不一样,因此我们每次只能在梯度方向上前进一小步。步长过大会很容易发散导致怎么也无法收敛到最终的极值,即使收敛了得到的结果也会相差很多。(想一想为什么,可以自己画一个下凸函数模仿梯度下降迭代)
牛顿法
牛顿法相当于是梯度下降的一种改进方式。网上关于牛顿法的推导和公式也很多了,我这里也不再赘述,只是讲讲我的理解。
首先为什么我们需要牛顿法
尽管有了梯度下降我们可以求解复杂损失函数的极值点了,但是当锚点很靠近极值点的时候,梯度下降的迭代速度就变得非常缓慢,并且得到的结果可能也并不精确。这时候,我们希望有一种方法可以解决下降过慢,或者是极值点跑掉的问题,牛顿法应运而生。
牛顿法的缺点
你可以试着画一个sigmoid类型的函数,并按照牛顿法的步骤进行迭代看看会发生什么,牛顿法在这种情况下还能找到极值吗。
这货二阶矩阵在多元函数问题中的维度怎会如此之高
对初始点位置的选取要求较高
要求函数必须二次可微
高斯牛顿法和LM算法
这两种方法放在一起的原因是,LM就是GA的优化。牛顿法很好用,但问题就出在它需要计算机去求解二阶的海森矩阵,对于多元函数或者参数很多的最小二乘来说这是致命的,这会导致矩阵维度和计算量大大增加。(你可以先随便构建一个多元方程,先求解一阶的雅可比矩阵,然后在这个基础上再去求解二阶海森矩阵,看看维度上变化了多少)
那么它们如何简化了计算呢,其实是利用了泰勒展开的性质,将目标损失函数作泰勒展开。还记得前言中我们得到的两个结论吗,一个函数想要用函数基底来表示的话要有一个范围,越靠近展开点它的拟合效果越好,因此在迭代步长上也不能太大,不然泰勒展开近似的结果会非常糟糕。先将损失函数作泰勒展开(线性化),我们会得到一阶,二阶以及高阶的表达式的和的形式。线性展开之后我们将二次方损失的括号打开(这里就不是泰勒展开了,只是单纯的去括号操作),这里我们特别留意二阶,展开后二阶项自变量前面的矩阵是一阶雅可比矩阵乘上它自己的转置。在步长很小的情况下我们扔掉高阶项,得到的剩下表达式和牛顿法表达式的构成类似,区别只是二阶项前面的矩阵由海森矩阵变成了雅可比矩阵乘上它的转置。我们用这个矩阵来近似表示二阶海森阵,从而减少了去计算高纬度矩阵的时间。
问题
从这里你就可以看出,为什么GA和LM法一般只适用于最小二乘问题了,因为它只是在最小二乘问题里近似求解出了一个二阶矩阵,并不是真的二阶。因此,对于非二次或者其它更复杂的损失函数当我们无法用这种方式来近似二阶导的时候,这两种方法就失效了。这里又可以呼应我前言提到的点,在使用方法解决问题的时候还要看目标函数的形式,这很重要。
欧克,那么最后讲讲我对LM算法的理解吧。除了网上所说的控制迭代步长还有解决矩阵半正定无法求逆的问题外,我个人对它还有多的两种理解。首先,这个加上的阻尼因子某种程度上也属于条件极值问题的解决方式,LM法的特色在于它能控制迭代步长始终趋于合理,那么就相当于在原来的最小二乘上加上步长的限制条件变成一个条件极值问题,条件极值我们使用拉格朗日乘数法求解的话就需要构建拉格朗日乘子,因此这种情况下的阻尼因子可以看成是拉格朗日乘子。 第二种理解方式是,原来的泰勒展开我们扔掉了高阶项,现在补上的这一项(阻尼因子),在步长很小的情况下它就相当于二阶展开,在步长很大的时候阻尼因子的值也会变大,就相当于一定程度上还原了我们原来扔掉的高阶项(大步长的情况下高阶展开项的值是无法忽略的),一定程度上缓解了因为步长过大泰勒展开不合理的问题。因为LM法是在前面的优化方法的基础上优化而来,非常多的优化方法在涉及到最小二乘问题时都使用了LM算法求解或者优化参数。
后记
讲到这,相信各位对于最小二乘也有一定的理解了,这里其实还有很多是我没有讲到或者是忽略的问题,也欢迎各位来找我探讨这些问题,并讲讲你们关于这些地方的理解。对于我讲到的问题,你们有自己的想法、看法的话,也欢迎交流。最后,如果文中有表述错误的地方,还请及时斧正,毕竟写这篇文章的人也是刚被这部分反复敲打的新登(sad)。
2024.9.16
作者:none
邮箱:2502148186@qq.com