代码均使用PYTHON3.x
牛顿法算法复杂些,作以下笔记备忘。
下图(来自http://www.myexception.cn/cloud/1987100.html,侵删)
为了找到
f(x)
取极值的点,即,牛顿法的思路是:
1、牛顿法只是求
f(x)=0
的根!!!!!!!(x可以是向量)
2、初始化一个
x0
点,在
x=x0
的条件下做曲线的切线
3、求切线上 f(x)=0 的点,令f(x)=0,得
4、迭代方法为
以上是牛顿法的迭代步骤
以下是牛顿法用于优化问题
5、上面说了牛顿法只是求出
f(x)=0
的根。如果要用牛顿法求极值点,**分别对
∇cost(θ)
的每个分量用牛顿法**,就可以得到代价函数的极值条件了
6、代价函数的迭代步骤是
(为了不出现歧义,将f(x)改成了c(x))
或者写成
其中 ∇2 是hessian矩阵
==================================================
为了加深理解, 这里是另一种理解方法,但以下我的理解是不完整的
将
f(x)
用泰勒公式二阶展开,得
其中, f(x) 就是代价函数,方程右边是关于 x−x0 的二次方程,在
取极值。由于泰勒公式二阶展开只是一个估算,得出的值只是比初始值更接近的值,所以要经过迭代算法得出更接近的值(缺迭代可以收敛的证明)
======================================================
牛顿法与梯度下降法的比较
梯度下降法的迭代公式是
其中 a 是学习率,
而牛顿法用于优化问题的迭代公式是
可以看到,与梯度下降法相比,牛顿法只是将学习率 a 替换成了
这可以理解为,梯度下降法和牛顿法的区别是:牛顿法根据代价函数的二阶导数信息,自动计算出了合适的学习率,因此有更快的迭代速度。而作为交换,牛顿法需要计算庞大的hessian矩阵,矩阵的大小为参数个数 * 参数个数,计算速度慢,消耗资源大。
因此实际中,牛顿法并不常用。