走進神經網絡——02.梯度降低算法介紹

  梯度降低算法在神經網絡的訓練中扮演着很是重要的角色,在本文中,咱們來仔細介紹一下梯度降低算法。假設咱們遇到了一個函數,其方程爲F(x)=x2+10x+5,如今咱們要去求它的最值(最大值或者最小值),若是讓咱們本身來求,咱們能夠很容易看出該函數存在最小值,而且在對稱軸x=-b/2a=-5處取得最小值,最小值爲-20。可是若是讓計算機去求它的最小值應該怎樣作呢?這就是咱們今天要介紹的內容。算法

  咱們畫出該方程的圖像,如圖1-2所示:網絡

圖1-2  函數F(x)=x2+10x+5的圖像函數

從圖中能夠看出,函數的最小值就是M點處,可是計算機應該怎樣找到M點,首先咱們在該圖上隨便找一點,該點爲A點,而後沿着A點,往下走一步,此時就到了B點,緊接着再往下走一點,就回到達C點,就這樣一步一步地走,總會到達咱們要找的最小值點,也就是M點。可能這時候有人會問,在找到A點後,咱們怎麼可以判斷往哪邊走是向下走?若是往A的左邊走一直就會向上,這樣永遠就走不到M點了啊,此時咱們須要考慮一下,怎樣才能保證每一步都是在向下走呢?這時候就輪到你在學校時每天抱怨學了沒用的導數起做用了,可能有人疑惑,導數在這裏有什麼用呢,那讓咱們回憶一下導數的幾何意義,導數就是圖像在該點處切線的斜率,也就是函數值上升的方向。等等,上升的方向?那麼給它添負號不就變成了函數值降低的方向,沒錯函數的導數,也稱爲梯度,加負號就是函數值降低的方向。方向問題解決了,但還有一個問題,每次向下走一步,這一步究竟是多大,在這裏咱們會用一個常數a來表示這一步的大小,a被稱爲學習率,是人爲給定的,這個值不能太大也不能過小,太大了容易跨過最小值M,過小了向下走次數太多,不容易在短期內找到M點。咱們怎樣知道要找的M是否已經找到呢?固然是當該點的導數是否爲0來決定,下面咱們簡述一下梯度降低算法:學習

1.隨便取一個值x0。spa

2.判斷函數在x0處的導數是否爲0。code

3.若是爲0,函數的最小值點就是x0,若是不等於0,x0=x0-a*F1(x0)返回第2步。blog

接下來咱們使用程序來實現:class

 

 

public class Gradient {
    public static void main(String[] args) {
        float x0 = 1.0f;
        //學習率
        float a = 0.2f;
        int i=0;
        while (true) {
            //求函數F(x)=x2+10x+5在x0處的導數
            float g=2*x0+10;
            System.out.println(""+i+"次的導數(梯度)爲"+g);
            //通常不能精確到0,足夠小便可認爲等於0
            if (Math.abs(g)<0.001) {
                break;
            }
            x0=(x0-a*g);
            i++;
        }
        System.out.println("函數的最小值點爲"+x0+",最小值爲"+x0*x0+10*x0+5);
    }
}

 

程序運行結果以下:神經網絡

 

 

 

 

從圖中咱們能夠看到程序運行的結果很接近最小值點-5和最小值25,隨着迭代次數的增長,結果會愈來愈準確。
float

相關文章
相關標籤/搜索