1. 程式人生 > >人工智慧起步-反向回饋神經網路演算法(BP演算法)

人工智慧起步-反向回饋神經網路演算法(BP演算法)

        人工智慧分為強人工與弱人工。

        弱人工智慧就包括我們常用的語音識別,影象識別等,或者為了某一個固定目標實現的人工演算法,如:下圍棋,遊戲的AI,聊天機器人,阿爾法狗等。

        強人工智慧目前只是一個幻想,就是自主意識,具有自我成長、創造力的AI。如婦聯2裡的奧創,各種電影都有這個概念了。

        我希望不久的將來能目睹這一奇蹟。

        不積跬步無以至千里。

        先從基礎講起。

目前比較先進的演算法理論據我所知應該分成這幾大類:

1,深度神經網路

2,生成對抗網路

3,深度強化學習

4,遷移學習

5,迴圈神經網路

 

神經元生物原理

        100多年前腦部的生物構造被研究出來之後,大家就幻想可以通過模擬神經系統造人了。然後就弄出各種神經網路演算法。所以先講這部分內容,之後理解BP演算法會更帶感。

        神經元是神經網路的基本單位,先貼一張圖。

        可以看到神經元的主要構造分為3個部分 N個樹突+細胞體 +突觸

        神經元之間的連線是就是樹突連線(另一個神經元)的突觸。這種首尾相連的結構,N個樹突可以連線N個神經元。

        訊號的傳輸方式是由N個神經元通過樹突傳遞神經遞質,遞質上附加了生物電,當生物電累加到一定闕值時就會激發突觸發送訊號出去。

        基本邏輯就是這樣。下面我們看看人類的腦洞。

 

BP演算法原理

        BP演算法由輸入層→隱層→輸出層構成。

輸入輸出層:這裡可以看到這層可以有多個入口,也可以只有1個入口。

        比如要做一個根據每期福利彩票的結果預測下期的結果。

        那麼輸入層就應該上一期的結果(N個數字)。輸出層就是這期(N個數字)。

隱層:隱層可以有N個節點或者N個層次。

正向過程:

        輸入層分別累加到隱層的各個節點 

        假設 輸入是x  隱層節點是s

        那麼

s1 = x1+x2+x3+x4+……

s2 = x1+x2+x3+x4+……

s3 = x1+x2+x3+x4+……

        然後為了可以動態調整各個節點加入的權值w1 w2 w3……

        就變成

 

s1 = w1*x1+w2*x2+w3*x3+w4*x4+……

s2 = w1*x1+w2*x2+w3*x3+w4*x4+……

s3 = w1*x1+w2*x2+w3*x3+w4*x4+……

順便加一個偏移值b 數學公式就成了:

        Sj 還要經過傳遞函式 f() 算出 隱層節點的值

f()傳遞函式對應的過程就是:

        神經元累加生物電到達一定程度時觸發放電。如果沒到達闕值這些累積的生物電就打水漂了。

        舉個例子來說 

        常用的一種激勵函式是sigmoid 函式圖如下

        公式 f= 1/(1+e^-x)

 

        這個S型函式的意義只要達到某一闕值 函式就會輸出1  就算超出闕值也不會影響輸出值。(錯誤)

        這裡原先是我理解錯了,BP演算法加入sigmod函式主要的意義在於加入非線性函式來解決非線性問題。

        選sigmod的好處在於 求導方便  sigmod的導數= 1 - f 

        反向回饋的時候需要計算導數

 

        隱層到輸出層的過程也是一樣的。

        不過BP演算法的重點在於反向回饋。

反向:

        正向傳輸結束之後我們能夠拿到一次結果。

        這個結果就可以跟預期值做比較,一般計算方差E。

        那麼這個誤差就可以反向的傳遞給上一層,用來調整上層節點的權值 w 。這個過程反覆執行直到方差E小於期望的最小誤差。(因為現實是不可能達到0誤差,所以如果不設定最小期望誤差則程式結束不了。)

        至於具體的權值調整的公式有完整的推導過程,過於複雜這裡不討論。

        核心的概念就是通過計算整體方差E對權值變數Wj 的偏微分得出 當前權值應該增加還是應該減少,上式很像n的那個字母就是指學習率。就是這裡一次要調整權值時用的基本單位。

偏微分科普:

        比如 一個公式有N個變數  y = aX +bY+cZ; 這裡 XYZ是變數。abc是常量。

        偏微分就是求單一變數的變化對y值的影響,其他變數在此被當作常量來求導。

        那麼y在這裡求x的偏微分,就應該是 =a  ;  (bY+CZ)被當作常量。

 

小結:

        那麼一次正向反饋+一次反向調整權值使得全域性誤差減少,做多幾次直到全域性誤差符合期望的最小誤差。這就是一次訓練完成。

        多次訓練需要提供不同的輸入值。

再拿上面的例子說:

        就是我拿第1期的開獎結果作為輸入值,第2期的開獎結果作為預期值計算誤差,這就是一次完整的訓練。

        第二次訓練就是拿第2期作為輸入值,第3期作為預期值。

        以此類推直到沒有新的訓練樣本。訓練完成的神經網路就可以用來預測往後的任何一期的開獎結果。

        (當然由於福利彩票是完全隨機沒有規律的,所以其實預測結果很糟糕。)

        BP演算法理論上能夠逼近所有線性函式。

        通俗點講,BP演算法能夠在你擁有足夠的歷史資料而又不知道其中規律的情況訓練出能夠預測結果的演算法。

        但是必須這個要做的事情是有規律的(只是你不知道或者太過複雜),而且你的訓練集必須包含所有“有效因子”。

        有效因子這個詞是我造的了。比如說你的歷史資料裡有50%是會影響結果的,有另外50%跟結果一毛錢關係都沒有。這是神經演算法允許的。

        但是如果這50%的資料裡沒有包含所有導向結果的所有因素,那麼結果就會差別很大。

        假設說福利彩票(又來了) 有一個因素是空氣質量(假設!),比如沒霧霾的情況下出現某個數字的概率很高。

        然而你的訓練集中沒有加入這個因素,那麼結果就非常不準確了。

 

目前存在的問題

目前BP演算法有兩個明顯問題:

1. 容易陷入區域性最小值

比如函式

        整個BP演算法就類似求解這個函式的最小值。

        但是我們看到這個函式有2個最小值,實際的情況是可能有非常多個極小值。

        當我們從右到左調整權值時會到達第一個低谷。然後繼續調整權值後發現誤差值變大了,演算法就誤以為找到了最小值解。然而卻沒有拿到全域性的最優解。

        這就是所謂的陷入區域性最小值。

2.過擬合問題

        過度的符合訓練集。就像剛才我舉例說有50%的訓練資料是無關結果的。所以演算法最佳的結果其實是忽略掉這50%無用訓練集。但是問題在於我們不知道規律是什麼,不知道那些訓練集是有效因子(知道了就不會搞出來一個BP演算法了)。

        所以過度的符合訓練集也是錯誤的。


        這個演算法在人工智慧領域還是算入門了,升級版還有卷積演算法。

        涉及的數學概念非常多,尤其是統計學方面。

        附上BP演算法相關內容的思維導圖