机器学习中经常利用梯度下降法求最优解问题,通过大量的迭代来得到最优解,但是对于维度较多的数据,除了占用大量的内存还会很耗时,L-BFGS算法是一种在牛顿法基础上提出的一种求解函数根的算法,下面由简入深尽量用简洁的语言剖析算法的本质。
一.牛顿法
解决函数求根问题 f(x)函数在x1点的导数,是该函数在x1点的切线的斜率y/x,f(x1)=f(x1)/(x1-x2) ,x1-x3=f(x1)/f'(x1),得出x2=x1-f(x1)/f'(x1),当第k次迭代时:xk=xk-1-f(xk-1)/f'(xk-1)
牛顿法求根的流程:
1.已知函数f(x)的情况下随机产生x0
2.由已知的x0按照xk=xk-1-f(xk-1)/f'(xk-1)公式进行k次迭代
3.当迭代结果xk与上一次迭代结果xk-1相同或小于一定阈值时本次的结果即为函数f(x)的根
利用牛顿法求函数的驻点
当函数f(x)的一阶导数f'(x)=0时,点(x,f(x))为函数f(x)的驻点
求某函数的驻点即为求该函数的导函数的根,同样可以利用牛顿法进行求解
对于f(x)函数来说迭代公式为xk=xk-1-f'(xk-1)/f''(xk-1)
牛顿法求驻点的本质
任意函数在xk点附近的二阶泰勒展开公式为:
该公式表达的函数的几何意义为:通过2次函数对于原函数的最佳拟合
当时,
结果依然是xk=xk-1-f'(xk-1)/f''(xk-1)
对于多元函数一阶导数f'(x)->梯度:
二阶导数f''(x)->hessian矩阵:
多元函数下的牛顿法求极值迭代:
问题:H矩阵维度超大,求逆矩阵非常困难怎么办???
二.BFGS算法
一种通过迭代逼近的你牛顿算法,逼近方法:
其中:
是一维的,回到迭代公式:
BFGS指的是在牛顿法迭代过程中,使用Dk矩阵代替Hk矩阵进行迭代,第一个D矩阵D0为单位矩阵,随着迭代次数增多,公式中的Dk矩阵由单位矩阵越来越趋近于真实的H块矩阵
初次迭代时由于使用单位矩阵迭代矩阵,等价于梯度下降算法,所以BFGS算法是一种随着迭代由梯度下降法逐步过渡到牛顿法的算法
三.L-BFGS算法
对于传统的BFGS算法,每次运算都需要存储Dk矩阵
L-BFGS算法是对于BFGS算法的近似,回到
D0已知,只需要知道S0-SK,Y0-YK就可以一步步算出dk+1
只保留最后M组向量,只通过m次迭代计算出Dk+1的近似值,当做Dk+1带入
公式中使用,这种用法便是L-BFGS。