老饼讲解-神经网络
自实现-BP神经网络
梯度下降法
梯度下降法介绍
作者 : 老饼 日期 : 2022-06-09 04:38:01 更新 : 2022-06-29 01:24:51
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com



梯度下降法算是一种求解最小值的算法,机器学习中经常使用,因为机器学习中通常需要求最小化损失函数时的参数的取值。

这里我们介绍梯度下降算法的思想、实现流程和优缺点。



  一、问题背景  


在单变量函数求取最小值问题中,我们通常只要令f(x)的导数为0,然后解出x就可以。 
在一般多元函数中,求偏导令偏导为0,解出x是非常困难的,

虽然n个自变量,能求得n条偏导等式,
然而,只有这n条等式是线性方程组时,我们才有系统的方法对其求解。
如果是非线性方程,我们目前并没有成熟的求解方案。
Pass:这也是为什么我们很喜欢构造线性问题,因为它能轻松求解。

所以,联立偏导方程求精确解的路子行不通,我们的替代方案就是进行数值求解,梯度下降法就是其中常用方法之一。




  二、梯度下降算法思路  


  思路概览  


梯度下降算法的思路是,先取一个初始值x0,然后进行迭代,
每次都往梯度的反方向调整(在一维中即导数的负方向)它,
直到迭代条件终止(例如无法令f(x)的值下降,即达到局部最低点)




  关于梯度  


在一元函数中,负梯度就是导数的反方向。
在多元函数中,负梯度就是各个变量偏导数的反方向。

它是函数下降最快的方向(即调整相同步长,负梯度能令f(x)下降最快),故也称为最速下降法。




  关于初始值  


从算法原理,我们可以知道,梯度下降法对 x 的初始化非常敏感
梯度下降法只能找到离初始值最近的局部极小值,如果初始化不好,找到的结果也不好。

往往是先随机初始化,然后多跑几次,看哪个结果好,就用哪一个。




  三、算法流程  

1. 先初始化x的值 ​(按个人经验初始化,或随机初始化,或设为0)                     
2. 计算 在处的梯度,令,(lr为学习率,可设为0.1) 
3. 计算处的梯度,令                                   
4. ...如此类推....一直到满足迭代终止条件,最后一次的即为所要找的解。        
迭代终止条件:达到迭代次数,或者 变化不大,或者变化不大

简单的说,就是先初始化 ,然后按不断迭代就行




  四.实例演示  

  问 题  


为何值时, 取得最小值。
易知道,y的最小值在  x1=2,  x2 =3 处取得最小值0.
下面展示用梯度下降法寻找解的具体过程,看结果是否与我们预期一致。



  算法实际操作过程  



1、梯度公式计算


由  ,



2、参数设定


现设初始值为

此时 



3、迭代


迭代1:

计算梯度 :
更新x :
查看 y值 :

迭代2:

计算梯度 :
更新x :
查看 y值 :
...............
...............
...............

迭代40:

计算梯度 :
更新x :
查看 y值 :

4、结果


第40次迭代时,都极小,我们退出迭代 ,
以 作为最终结果,此时函数值 
易知,与预期的 x= [2,3] , y=0 几乎一致。



  代 码 实 现  


上述例子 matlab代码如下:

matlab2014b亲测已跑通:


%%-------------------------------------------
% 本代码展示一个梯度下降法求函数最小解的DEMO
% 求解函数y= (x1-2)^2+(x2-3)^2
% 转载请说明本代码来自《老饼讲解神经网络》 bp.bbbdata.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




五.算法的拓展理解


1.为什么按负梯度下降


《数学分析》中,负梯度方向是函数下降最快的方向,
即x=[2,3],如果梯度为[1,2],则x往[1,2]方向调整,能令函数f(x)下降最快的方向(所谓最快,即调整同样的步长,该方向能令函数下降最快)
按负梯度下降,保证了调整方向的正确性。


2.为什么要设置学习率


目的是为了保证按梯度方向调整一定能下降。
梯度方向能下降是瞬时的,如果调整步长过大,则不一定能保证函数能下降,但只要调整步长足够小,函数就能下降(前提是梯度不为0)。
所以,我们在调整时,加入学习率lr,以控制步长: 


3、学习率的设置与自适应学习率


要保证能下降,学习率就不能过大,但学习率很小,每次迭代调整都很小,就需要迭代很多次。
为此,我们可以设定一个较中肯的学习率(例如,lr = 0.1)。
如果更智能一些,在程序中把学习率改为自适应学习率: 函数能下降,我们把学习率调大些,如果函数本次迭代不能下降,我们就把学习率调小些。
或者更智能的设置,这就属于梯度下降法的拓展了。


总的来说,

(1)按负梯度调整,加上学习率的控制,则能保证x的调整,函数一定能下降。

(2)按负梯度下降,由于负梯度是下降最快的方向,在下降速度上更加有效。




六.梯度下降法的优缺点


  优 点  


(1) 简单,有效
(2) 当目标函数是凸函数时,能求得全局最优解


  缺 点  


(1) 遇到局部最优时,算法就停止,因为此时梯度为0。因此,该算法只能找到初始解x_0的局部最优,对跳出局部完全无反抗能力。
(2) 要求函数是连续的(可求偏导)
(3)靠近极小值时收敛速度减慢






 End 









联系小饼