1. 程式人生 > >深度學習筆記二:多層感知機(MLP)與神經網路結構

深度學習筆記二:多層感知機(MLP)與神經網路結構

為了儘量能形成系統的體系,作為最基本的入門的知識,請參考一下之前的兩篇部落格:
神經網路(一):概念
神經網路(二):感知機
上面的兩篇部落格讓你形成對於神經網路最感性的理解。有些看不懂的直接忽略就行,最基本的符號的記法應該要會。後面會用到一這兩篇部落格中的一些記號和用法的約定什麼的之後就不再囉嗦了。

一.基本結構

看完上面給出的兩個部落格或者已經有基本概念的同學應該對於神經網路的基本結構有基本的認識了。但是上面那個還只是涉及到單層結構,並沒有推廣到多層結構,同時,也沒有在實踐中使用這種結構的經驗。所以,這節的內容就是以手寫體識別為例子來講一下基本結構,和實踐中的基本使用思想。這是推廣到更加複雜任務上的基礎。
假設你現在已經有了神經網路的一些感性認識了,那就就看下面這幅圖。
這裡寫圖片描述


輸入層(最左邊),隱藏層(中間兩層),和輸出層(最右邊),在之前列出的部落格就講過了,這裡回顧一下。感受一下大概的架構。
神經網路的流程分為前向過程和反向過程。反向過程一般用於訓練,後面講,這裡只講前向過程。
還記得每個神經元上面都有對於一個輸入的權值,以及一個偏置,還有一個啟用函式。(不知道的話看之前列出來的部落格,後面不再強調了),所以一個前向過程的流程就是input輸入,然後經過第一層神經元運算(乘上權值,加上偏執,啟用函式運算一次),得到輸出,然後第一層的輸出作為第二層的輸入,運算,得到第二層的輸出…..直到到輸出層運算,然後得到結果。神經網路就是依靠這樣一套機制來進行計算和預測的。
假如你的權值和偏置已經是被訓練好了。對於一個新的輸入,進行這樣的過程,就能夠得到一個預測。那麼你就能夠通過這個預測來解決一些問題了。所以有機器學習思想的話,這些概念是很容易理解的。而我們的任務就是找到權值和偏置這些引數的值,使得輸出的東西讓我們滿意,達到我們的要求。

這裡先補充一個思想:
這裡寫圖片描述
假如我們改變了某個神經元或者某幾個神經元的權值或者偏置一點點,那麼該神經元的輸出肯定會變得不同,這些不同最終將反應在輸出上面。如上面的圖所示。所以,我們可以通過合理地改變權值和偏置一點點的方式來讓這個神經網路最後的結果向我們預期的結果進軍(sorry,我想不到好詞了)。

然後說啟用函式,還是在前面的部落格連結中,給了很多的啟用函式型別。啟用函式的選擇對於神經網路的訓練來說,也是很重要的,這個後面再講到。
現代神經網路啟用函式總結,可以看這篇部落格:
深度學習筆記六:常見啟用函式總結
這裡先以sigmoid函式為例子,講講啟用函式的作用。所以,你這裡先暫時假設我們沒得選,只有sigmoid函式。
這個時候,有沒有發現對於感知機前向過程的形式很像logistic迴歸的形式?
不熟悉logistic迴歸的請先看這裡:

機器學習筆記四:線性迴歸回顧與logistic迴歸
那我們為什麼要選擇sigmoid函式呢?
我們知道一個神經元還是選擇了sigmoid函式之後,他的輸出為這裡寫圖片描述,這也就是我為什麼說這個形式很像logistic迴歸的原因。
這裡寫圖片描述
上面的部落格裡面給出過這個函式的形狀,這裡再貼一次。其實你肯定也很熟悉了。
這裡寫圖片描述
這個函式變動不大,很溫和。不像閾值函式那樣粗暴的從0到1,這是很符合之前的那個思想的。當然這個函式還有另外一個優點,就是平滑。平滑能夠使得權值和偏置非常微小的變動能夠使得最終的結果也產生非常微小的變動。這才是很重要的。
寫成公式,就應該是這樣:
這裡寫圖片描述
怎麼理解這個公式呢?
首先在機器學習裡面我們不是說過,我們的任務就是找一個函式f(w,b),然後他的輸出output就是由這個函式產生。你再來看這裡,這裡雖然是神經網路,但是整個神經網路還是一個函式。
然後回顧一下全微分的定義:
這裡寫圖片描述
同樣可以推廣到多元的形式,再看上面的那個公式就不難了吧。
這裡還有一個要注意的就是,從上面公式的形式來看,這裡寫圖片描述就是這裡寫圖片描述這裡寫圖片描述的一個線性函式,於是我們能夠選擇一個小的權值和偏置的改變,使得結果以我們期望的方式改變。

講了這麼多,現在根據一個例子來談談實踐中是怎麼設計網路的結構的,很簡單,也很重要。
以MNIST手寫體為例子,裡面都是28x28的灰度圖,假如以我們現在這麼簡單的網路形式,我們可以考慮把所有28x28的圖片統一展開為一個一維數列(這樣可能會丟掉某些位置資訊,後面CNN會講到這個),然後得到一個結構,含有784(28x28)個值。
回到網路這裡來,對於輸入層而言,我們可以“設定”784個單元,分別接受每一個畫素的值。對於輸出層而言,我們可以只設定一個神經元,用來輸出這個數字是幾,我們也可以設定10個神經元,分別代表0到9,然後輸出這個那個數字更加有可能。
從上面看,設計輸入層和輸出層還是比較輕鬆的,但是設計隱藏層是比較難的。後面再討論。

二.訓練神經網路

這裡暫時預設訓練神金網路的損失函式為二次損失函式:
這裡寫圖片描述
右邊的為L-2範數,當做歐氏距離理解就行。我們的目標就是找到合適的w(權值)和偏置(b)使得這個損失函式最小。意味著網路輸出的值會越來越接近真實值。
訓練神經網路的方法為隨機梯度下降法:
不知道的請參照機器學習筆記三:梯度下降
寫成梯度下降的形式為:
這裡寫圖片描述
也就是說,通過不停的迭代,找到最合適的權值和偏置,使得損失最小。這在機器學習裡面是很基礎的東西了。
最終,我們的任務就成了計算偏導:這裡寫圖片描述這裡寫圖片描述了。
但是這裡是神經網路啊,那麼多層,那麼多引數,傳統方式怎麼計算偏導?所以對於偏導的計算就是反向傳播的任務了。
下節,我們就開始反向傳播的整理了.