BP神經網路:最快速的理解(一)

BP神經網路:最快速的理解(一)

來自專欄數據挖掘小站51 人贊了文章

我深感在學習機器學習的路上,很多人最大的攔路虎其實都是數學。也有很多人因此而放棄學習這門美妙的科學。但實際上,根據我的經驗,除了直接硬啃許多繁瑣的數學推導,通過頭腦里的圖像來理解問題也是一個非常好的方法。而且你也可以在知道了他的來龍去脈以後再去學習那些數學推導。這一條對許多理工科都是有用的。

比如混沌運動在背後需要的是非常繁瑣的數學方法。典型案例是動力系統。但是我多年以前讀過一本法國人寫的書。從實驗現象入手講解這個問題。解釋的效果是非常好的。

我決定要寫這篇文章。其實正是因為我發現很多同學是很難理解BP神經網路的。我努力從讓你先在大腦里產生一個big picture入手,來講請這個問題。你所需要掌握的其實就是一點矩陣和微積分。

希望你能看完這篇文章以後」啊,原來如此簡單!「我是在大三頭一次接觸到這個東西的。那個時候我還是材料物理系的本科生,機器學習正好是爆發前夜,那是2014年。我那個時候苦於找不到合適的資料,對這個東西的理解當時感覺也很苦惱。我希望能用這篇文章幫助很多像當時的我那樣的人。

  1. BP神經網路是什麼

BP(Back-propagation,反向傳播)神經網路是最傳統的神經網路。也就是使用了Back-propagation演算法的神經網路。請注意他不是時下流行的那一套深度學習。要訓練深度學習level的網路你是不可以使用這種演算法的。原因我們後面解釋。而其實機器學習的bottleneck就是成功的突破了非常深的神經網路無法用BP演算法來訓練的問題。

大家記住,反覆的念這句話:反向傳播,反向傳播,反向傳播。那麼反向傳播的東西是什麼呢?答案是:誤差。就是在模擬過程中(這是一個循環,我們在訓練神經網路的時候是要不斷的去重複這個過程的)收集系統所產生的誤差,並且返回這些誤差到輸出值,之後用這些誤差來調整神經元的權重,這樣生成一個可以模擬出原始問題的人工神經網路系統。

2. 生物神經的運作原理

我在這裡不討論那些複雜的生物學和神經科學。其實很簡單的一件事,我們人類之所以可以讓飛機上天,是因為」學習「了從理論力學,信號系統再到導航控制的一系列知識。作家之所以可以寫出偉大的著作,那是因為他學習了語言,比如英語漢語德語法語,也學習過李白杜甫,莎士比亞。其實狗狗之所以能知道要聽見主人喊一個蘋果加一個蘋果要喊兩聲(之後可以得到一塊燉牛肉),也是學習的結果。

那麼學習的過程,核心問題是什麼?答案是誤差。比如你是一個備考高三數學的學生。你本身就會1+1=2,你把這個訓練一萬遍有用么?沒用。你要做的就是找到自己不行的地方,找到自己的漏洞,有針對性的去突破和訓練。這就是用誤差來學習。

人類的過程也是一樣的。學習,有誤差然後有反饋,我們通過這些誤差反饋來學習。

3. 神經網路的基礎架構

凡是對這個事情有最基礎了解和認識的朋友都知道神經網路其實就是幾層神經元,每層神經元里有幾個神經元點。不同layer之間的神經元相互連接。其實就是如此:

我不管生物或者神經學裡在講什麼。在這,每一個神經元就是三件事:輸入,判斷和輸出。輸入層的神經元(就是那個圓形的圈,代表一個神經元或者一個神經細胞)是讀入你輸入的數據的。只要你有數據,這個玩意就能跑。這就好比你只要有汽油,汽車就能開是一個道理。中間則是」隱含層。「你可以控制這個隱含層的層數,以及每一層里有多少個神經元或者神經細胞。當然在實際操作里為了方便我們一般都直接認為你不管用幾層,每層的神經元或者神經細胞數目都是一樣的。因為這樣的話寫代碼會比較方便。

每一層神經元內部都不互相連接。而相鄰層的神經元點之間則互相連接。在我們這個問題里,兩個相鄰層,所有的神經元都是相互連接的。你說可不可以通過讓這些神經元之間不互相連接來起到效果?的確,歷史上的連接學派就是這樣想的。但實際上你可以都給他聯上。其實道理非常簡單。如果我們真的要取消某兩個點之間的連接的話,那麼很顯然只要設定這條連線上的數值為零即可。這好比一個網路電路,阻值本身就是無限大的。

除了神經元,你還需要關注一個東西,那便是神經線。在所有的神經線(兩個神經元一連就是)上你可以賦予不同的權重。而這個則是訓練的核心要務,說白了你就是那一套最接近完美答案的權重就可以了。

4. 運算過程:矩陣乘法

我們要把輸入在這個數學結構上傳遞到輸出,要怎麼辦呢?答案是,使用矩陣乘法。

其實這樣的思路一開始是非常簡單的。 我們以這個例子來說明。

在這幅圖裡,我們把上一層的第i個神經元和下一層的第j個神經元之間的權重(在3里講的很明白)記為w(ij)。而把上一層傳入的三個input,分別記為S(1),S(2)和S(3)。

因為數據肯定是在不同的層之間流動的。我們所做的就是通過一個矩陣乘法求解下一層的輸出數值。

這個過程其實也非常簡單。我們把輸出記為O(1),O(2)和O(3)。

結合權重,這個其實不就是一個高中生都可以理解的思想嗎?以O(1)舉例。O(1)里的輸出自然有來自S1,2,3的。那麼分別按照權重去乘就可以了。權重自然就是一個大於等於零的實數嘛。

O(1)=S(1)*w(11)+S(2)*w(21)+S(3)*w(31)

類似的我們可以求解出O(2)和O(3)。我們把這一部分,留作練習題。希望你看到這裡也自己寫一下。

其實答案也很簡單:

O(2)=S(1)*w(12)+S(2)*w(22)+S(3)*w(32)

O(3)=S(1)*w(13)+S(2)*w(23)+S(3)*w(33)

寫到這裡,熟悉矩陣乘法的同學肯定要恍然大悟了。沒錯,這就是一個矩陣的乘法!最基礎的那種。寫成矩陣他應該是什麼樣呢?這個又是一個思考題,希望你來寫一下。

其實答案便是:

我們知道,數學家對矩陣已經有了幾百年的研究,積累了大量的方法。這也是物理學家和工程師非常熟悉的工具。我們其實用這種方法,自然可以一層一層的把最左邊輸入的數據送到最右邊來。

我們自然可以得到一個結果。但是這個結果有可能是錯的吧!所以怎麼辦呢?我們用真實的結果去和這個結果去比如求差,自然就可以把誤差求解出來了。

同樣的道理,我們可以把誤差按照矩陣乘法一路返回。而且在這個過程中,每個神經元和神經線自然可以得到一些」信息。「我們可以用這些信息來修正神經網路,其實也就是給所有的邊去賦予不同的權重。

如法炮製。在你有誤差E(1),E(2),E(3)的時候,自然可以用這些誤差返回上一層,得到上一層應該被返回的誤差。其實也是一個矩陣乘法的內容。

5. 如何去調參數:微積分

其實這就是我們使用了人工神經網路來模擬學習的過程。理論上,這個演算法可以處理世界上的任何問題。無論是股票交易還是生物信息,無論是飛機上天還是潛艇下水。當然了,工程就是另一回事了。

那麼這些權重是如何被求解出來的呢?

答案便是:微積分。

更進一步:微積分里的鏈式求導法則。

再進一步:在矩陣上的微分鏈式求導法則。

在矩陣上求微分是大學數學教育的一個盲點。不過,作為搞計算機的,我們可以直接去用那些數學家做出的結論!

未完待續。

推薦閱讀:

機器翻譯簡史
Hinston大牛為什麼會對神經網路不滿?2018.03.NO.4(Note)
Course Notes:Neural Networks and Deep Learning Week 4
【深度學習系列】遷移學習Transfer Learning
CS231n Assignment2

TAG:神經網路 | 深度學習DeepLearning | 機器學習 |