您的位置:首页 > 其它

【机器学习】最速下降法和牛顿下降法

2016-05-04 20:18 225 查看
入门教材常用二分法来求解实数求根的问题。我们现在来用普通迭代法、下降法来求解实数开立方根的问题。

设当前实数为n,求根次数为k,根为s,那么有s^k=n。所得偏差函数为f(s)=s^k-n。显然当代价函数f(s)->0时,我们便求出了n的k次根。现在我们开立方根,那么k=3,代价函数为f(s)=s^3-n。

 

普通迭代法:

普通迭代法就是前面的博客提到的最简感知器学习方法,公式为 s(i+1)=s(i)-wf[s(i)]

 

最速下降法:

最速下降法使用逐渐迭代的方法,从初值s(0)开始更新到s(i),直到s(i)-s(i-1)<t,t是指定的精度。每次迭代沿着与梯度相反的方向行进,即s(i+1)=s(i)-wf’[s(i)],w是一个正的经验参数,称为学习因子,由我们自己设置来控制收敛速度和精度。学习因子必须足够小,否则不会收敛到正确的结果,要么在正确答案边上循环,要么发散到无穷大,因此学习因子的选择过分依靠经验。

这个迭代能最小化代价函数。证明如下:

在s=s(i)处泰勒展开代价函数,有f[s(i+1)]=f[s(i)] + f’[s(i)][s(i+1)-s(i)] + R(s).略去余项,有f[s(i+1)]= f[s(i)] + f’[s(i)]{ –wf’[s(i)]}= f[s(i)] - w {f’[s(i)]}^2 < f[s(i)]

现在我们开立方根,有f(s)=s^3-n,但是该函数没有极值。因此我们改写代价函数g(s)=[s^3-n]^2,此时代价函数有最小值0,当代价函数最小时,f(s)=0亦成立。每次迭代的公式是:s(i+1)=s(i) – 2w[s(i)^3-n][3s(i)^2].当然我这里只是使用了一个并不很合适的、勉强能做出结果的代价函数形式,因为这个函数形式导致迭代公式中最高幂次项的次数有5,会导致数值膨胀,学习因子必须很小。

 

牛顿下降法:

此时我们的问题等价于求解函数f(s)=s^k-n=0,那么在s=s(i)处一阶泰勒展开代价函数,有f[s(i+1)]=f[s(i)] + f’[s(i)][s(i+1)-s(i)] + R(s).令f[s(i+1)]=0有s(i+1)-s(i) = - f[s(i)]/ f’[s(i)].此时f[s(i+1)]不一定为0,差值由R(s)补齐,但是f[s(i+1)]比原来更加接近0.

如果要求最小化代价函数f,那么f不一定取0值,求解的是代价函数f取得极值的情况。当代价函数为极值,此时梯度是0,可能最大也可能最小,理想情况下一般都能达到我们想要的结果。在s=s(i)处二阶泰勒展开代价函数,有f[s(i+1)]=f[s(i)] + f’[s(i)][s(i+1)-s(i)] +1/2*f’’[s(i)][s(i+1)-s(i)]^2 + R(s),略去余项,对s(i+1)求导有f’[s(i+1)] =f’[s(i)]+f’’[s(i)][s(i+1)-s(i)]=0.于是s(i+1)=s(i)
- f’[s(i)] / {f’’[s(i)]}。这里我们认为s(i)是常数,s(i+1)-s(i)并不能看做微元,因为两者的差值可能很大。

现在我们来求解f(s)=s^3-n。由于我们需要求解代价函数为0而不是最小化,因此使用第一个公式,有s(i+1)=s(i)- f[s(i)]/ f’[s(i)] = s(i) – [s(i)^3-n]/[3s(i)^2]。可以看出牛顿下降法不需要设定学习因子,会自动以很快的速度收敛到结果。

  

设s(0)=1,n=9999,t=0.0000001,最速下降法和普通迭代法有w=t。普通迭代法用了83492次迭代,最速下降法用了200次迭代,牛顿下降法用了18次迭代获得结果。如果最速下降法使用了合适的代价函数,迭代速度也会很快,但是过分倚重经验;牛顿下降法则不仅具有普适性,而且速度最快。
https://github.com/artzers/MachineLearning.git  href="https://github.com/artzers/MachineLearning/blob/master/IterativeDescend.py" target=_blank>IterativeDescend.py
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: