梯度下降步长matlab,梯度下降算法步长和收敛条件的设置的一些看法

在上一篇中介绍了梯度下降算法,还是利用了上面的那个x^2+y^2的例子,来求解下,代码如下:

function [] = gradient(step, threadhold)%在这里主要是演示对z=x^2+y^2的用梯度下降算法%设置x和y的初始值%x = 100;y = 100;%先计算前两个步骤的值last_step_result = x*x + y*y;x = x - step*2*x;y = y - step*2*y;this_step_result = x^2 + y^2;%设置最大迭代次数%max_count = 1000000000;index = 0;while (abs(this_step_result -last_step_result) >threadhold) && (index < max_count) %计算此时的结果% current_dx = 2*x; current_dy = 2*y; %计算新的x和y x = x - step*current_dx; y = y - step*current_dy; %计算此时的z的值,并且交换 last_step_result = this_step_result; this_step_result = x*x + y*y; index = index + 1;end%跳出循环判断结果if index >= max_count fprintf('超过最大迭代次数%i,并且没有找到符合收敛条件的值程序退出\n', index);endif abs(this_step_result - last_step_result) <= threadhold fprintf('找到最优解:%f,x=%f,y=%f,上一步的结果是:%f,迭代次数:%i\n', this_step_result, x, y, last_step_result, index);endend

我们都知道这个极值是在(0,0,0)处取得的,那么我们取了一些步长和收敛条件(连续两次z值得间隔)

可以看到步长不是越小越好的,相反步长越小反而取得的值不太接近真实的,这是为什么呢?因为连续函数连续两次间隔太近取得值基本相等,也就满足收敛条件了,所以步长不能取太小,当然也不能取太大,试想如果在有两个点x1,x2不同但是他们的函数值相等,正好取到一个步长让在x1,x2来回震荡那么取到的也不真实,所以这个步长取值是有一定的技巧的。

可以看到收敛条件的值,取得越小还是越好的,当然是在步长合理的前提下。至此对梯度下降的理解告一段落!

本文转载自:CSDN博客

欢迎加入我爱机器学习QQ14群:336582044

微信扫一扫,关注我爱机器学习公众号

你可能感兴趣的:(梯度下降步长matlab)