梯度下降算法
求解无约束最优化问题的一种最常用的方法,梯度下降法是迭代算法,每一步需要求解目标函数的梯度向量。
梯度下降法用来求解目标函数的极值。这个极值是给定模型给定数据之后在参数空间中搜索找到的。迭代过程为:
梯度下降方法的问题:
每一步走的距离在极值点附近非常重要,如果走的步子过大,容易在极值点附近震荡而无法收敛。
解决办法:将alpha设定为随着迭代次数而不断减小的变量,但是也不能完全减为零。
梯度与导数的关系
- 方向导数是各个方向上的导数
- 偏导数连续才有梯度存在
- 梯度的方向是方向导数中取到最大值的方向,梯度的值是方向导数的最大值
- 总结:函数 f(x,y) 在一点的梯度grad f(x0,y0) 是这样一个向量,它的方向是导数在这点的方向导数取得最大值的方向,它的模就等于方向导数的最大值。一般是令导数等于0,求取得最大的x点。方向导数与梯度 - Totty-top的文章 - 知乎
让我们来复习一下!泰勒公式!
牛顿法
牛顿法是为了求解函数值为零的时候变量的取值问题的,具体地,当要求解 f(θ)=0时,如果 f可导,那么可以通过迭代公式。
当θ是向量时,牛顿法可以使用下面式子表示:
其中H叫做海森矩阵,H (-1) 表示的是海森矩阵的逆矩阵 ,其实就是目标函数对参数θ的二阶导数。
牛顿法的优点:
牛顿法收敛速度相比梯度下降法很快,而且由于海森矩阵的逆在迭代中不断减小,起到逐渐缩小步长的效果。
缺点:
牛顿法的缺点就是计算海森矩阵的逆比较困难,消耗时间和计算资源。因此有了拟牛顿法。
- 网上一个牛顿法求解的例子:
海森矩阵的定义:
牛顿法和梯度下降法的效率对比
从本质上去看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。(牛顿法目光更加长远,所以少走弯路;相对而言,梯度下降法只考虑了局部的最优,没有全局思想。)
根据wiki上的解释,从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。
牛顿法的优缺点总结:
优点:二阶收敛,收敛速度快;
缺点:牛顿法是一种迭代算法,每一步都需要求解目标函数的Hessian矩阵的逆矩阵,计算比较复杂。
理论学完啦,那我们来做几道题吧?!
# 输入一个整数N,输出sqrt(N),精度为0.001
# 二分法
def binarySearch(n,eps):
if n<0:
return -1
else:
low = 0
high = n
mid = (low+high)/2
while abs(mid*mid-n)>eps:
if mid*mid>n:
high = mid
else:
low = mid
mid = (low+high)/2
return mid
# 牛顿法
def newton(n,eps):
x = n
y = 0
while(abs(x-y)>eps):
y = x
x = 0.5*(x+n/x)
return x
if __name__ == '__main__':
n = 5
eps = 0.0001
print(n**0.5) # 2.23606797749979
print(binarySearch(n,eps)) # 2.2360610961914062
print(newton(n,eps)) # 2.236067977499978
牛顿法求解的分析过程:如何用牛顿法求一个数的平方根
拟牛顿法
思想是改善牛顿法每次需要求解复杂的Hessian矩阵的逆矩阵的缺陷,它使用正定矩阵来近似Hessian矩阵的逆,从而简化了运算的复杂度。
基本idea是:不求二阶偏导数,构造出一个近似的海森矩阵。
共轭梯度法
共轭梯度法是介于全量梯度下降与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了GD收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。 在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。
弱鸡要去睡觉了。。。8886
参考: