老饼讲解:一步一步上手学习
上节我们已经说了梯度下降算法了,可能有些同学还不够形象,那么这里我们拉点数据出来溜一溜,看看梯度下降算法具体是如何优化目标函数的。
上节我们已经说了,梯度下降法呢,就是先给x一个初始化值,然后将它不断往目标函数的负梯度方向下降,从而使目标函数值不断下降,最后找到目标函数的局部最优解。

那么下面,我们就根据这一流程,来具体展示一个例子,看看梯度下降法的具体操作和代码实现。
现在,我们有一个目标函数
请问,为何值时,y取得最小值?
事实上,我们都知道哈,上面这函数的最小值就是在处取得,此时y=0。那么如果我们要用梯度下降算法来解决这个问题,要怎么搞呢,下面就一起来试一试吧~
在梯度下降算法中,依赖于的梯度,因此我们需要先算出梯度,也就是对于的偏导数,如下:
,
即,目标函数的梯度为:
好了,知道了目标函数,以及它的梯度公式,就可以使用梯度下降算法来迭代它的最优解了。
对于初学者,我们不妨先来手算,感受梯度下降算法是如何一步一步迭代的。
好了,我们将解初始化为,此时。然后,我们设置学习率,接下来将不断地往负梯度方向迭代就可以了。
Step-1:
计算梯度 :
更新x :
查看 y值 :
Step-2:
计算梯度 :
更新x :
查看 y值 :
.........
.........
迭代40:
计算梯度 :
更新x :
查看 y值 :
大家可以发现,第40次迭代时, 梯度的元素都极小了,这说明此时已经处在一个比较平缓的位置,我们退出迭代 ,以 作为最终结果,这时目标函数值 ,易知,与预期的 几乎一致,这说明梯度下降法已经成功地达到了我们的目标。
好了,上面我们通过手算,应该已经很清楚梯度下降算法到底每一步是怎么做的了,那么如果使用代码来实现,要如何实现呢,下面我们用matlab来实现一下,具体代码如下:
% 本代码展示如何用梯度下降法求函数y= (x1-2)^2+(x2-3)^2最小解
% 本代码来自《老饼讲解神经网络》 www.bbblearn.com
x1 = 0 ; % 初始化x1
x2 = 0 ; % 初始化x2
for i = 1 :100
%------计算梯度--------
dx1 = 2*x1-4;
dx2 = 2*x2-6;
%----- 往负梯度方向更新x------
x1 = x1 - 0.1*dx1;
x2 = x2 - 0.1*dx2;
disp(['第',num2str(i),'轮迭代:x=:[',num2str(x1),',',num2str(x2),'],y=',num2str((x1-2)^2+(x2-3)^2)])
%----- 如果梯度过小,则退出迭代 --------
if((abs(dx1)< 0.001) & (abs(dx2)< 0.001))
break
end
end运行结果如下:
第1轮迭代:x=[0.4,0.6],y=8.32
第2轮迭代:x=[0.72,1.08],y=5.3248
第3轮迭代:x=[0.976,1.464],y=3.4079
第4轮迭代:x=[1.1808,1.7712],y=2.181
......
第39轮迭代:x=[1.9997,2.9995],y=3.5889e-07
第40轮迭代:x=[1.9997,2.9996],y=2.2969e-07
好了,可以看到,当第40轮的时候,它最终的结果[1.9997,2.9996]已经很接近我们的真实最小解了。
这节我们实际的使用了一下梯度下降算法,来加深对梯度下降算法的理解,避免空洞和抽象。事实上,可以看到,梯度下降算法就是一个很简单的算法,只要计算出参数的梯度,然后初始化一个解,再不断地让解往负梯度方向进行迭代,那么目标函数值就会不断的下降了,当梯度很小时,就退出迭代就可以了。
评论