送書 | Keras深度學習你必須知道的神經網路基礎
點選上方“程式人生”,選擇“置頂公眾號”
第一時間關注程式猿(媛)身邊的故事
人工神經網路表示一類機器學習的模型,最初是受到了哺乳動物中央神經系統研究的啟發。網路由相互連線的分層組織的神經元組成,這些神經元在達到一定條件時就會互相交換資訊(專業術語是激發(fire))。最初的研究開始於20世紀50年代後期,當時引入了感知機(Perceptron)模型。感知機是一個可以實現簡單操作的兩層網路,並在20世紀60年代後期引入反向傳播演算法(backpropagation algorithm)後得到進一步擴充套件,用於高效的多層網路的訓練。有些研究認為這些技術起源可以追溯到比通常引述的更早的時候。直到20世紀80年代,人們才對神經網路進行了大量的學術研究,那時其他更簡單的方法正變得更加有用。然後,由於G.Hinton提出的快速學習演算法,以及2011年前後引入GPU後使大量數值計算成為可能,開始再度出現了神經網路研究的熱潮。
這些進展打開了現代深度學習的大門。深度學習是以一定數量網路層的神經元為標誌的神經網路,它可以基於漸進的層級抽象學習相當複雜的模型。幾年前,3~5層的網路就是深度的,而現在的深度網路已經是指100~200層。
這種漸進式抽象的學習模型,模仿了歷經幾百萬年演化的人類大腦的視覺模型。人類大腦視覺系統由不同的層組成。我們人眼關聯的大腦區域叫作初級視覺皮層V1,它位於大腦後下方。視覺皮層為多數哺乳動物所共有,它承擔著感知和區分視覺定位、空間頻率以及色彩等方面的基本屬性和微小變化的角色。據估計,初級視覺層包含了1億4000萬個神經元,以及100億個神經元之間的連線。V1層隨後和其他視覺皮層V2、V3、V4、V5和V6連線,以進一步處理更復雜的影象資訊,並識別更復雜的視覺元素,如形狀、面部、動物等。這種分層組織是1億年間無數次嘗試的結果。據估計,人類大腦包含大約160億個腦皮質神經細胞,其中10%~25%是負責視覺資訊處理的。
今天的這本書《Keras深度學習實戰》用當前流行的Keras框架實現了大量深度學習演算法,構建了眾多深度學習模型,並且介紹了深度學習在遊戲等實際場合中的應用,特別是本書還介紹了當前火熱的生成對抗網路(GAN)的應用。
本書涵蓋了神經網路的幾個主要方面,並提供了基於Keras和最小有效Python庫作為深度學習計算的可執行網路例項編碼,後端基於谷歌的TensorFlow或者蒙特利爾大學的Theano框架。
好的,讓我們切入正題。
在本文,我們將介紹以下內容:
• 感知機
• 多層感知機
• 啟用函式
• 梯度下降
• 隨機梯度下降
• 反向傳播演算法
我們將介紹以下內容:
1.1 感知機
感知機是一個簡單的演算法,給定n維向量x(x1, x2, …, xn)作為輸入,通常稱作輸入特徵或者簡單特徵,輸出為1(是)或0(否)。數學上,我們定義以下函式:
這裡,w是權重向量,wx是點積(譯者注:也稱內積、數量積或標量積) ,
b是偏差。如果你還記得基礎的幾何知識,就應該知道wx+b定義了一個邊界超平面,我們可以通過設定w和b的值來改變它的位置。如果x位於直線之上,則結果為正,否則為負。非常簡單的演算法!感知機不能表示非確定性答案。如果我們知道如何定義w和b,就能回答是(1)或否(0)。接下來我們將討論這個訓練過程。
第一個Keras程式碼示例
Keras的原始構造模組是模型,最簡單的模型稱為序貫模型,Keras的序貫模型是神經網路層的線性管道(堆疊)。以下程式碼段定義了一個包含12個人工神經元的單層網路,它預計有8個輸入變數(也稱為特徵):
from keras.models import Sequential
model = Sequential()
model.add(Dense(12, input_dim=8, kernel_initializer='random_uniform'))
每個神經元可以用特定的權重進行初始化。Keras提供了幾個選擇,其中最常用的選擇如下所示。
• random_uniform:初始化權重為(–0.05,0.05)之間的均勻隨機的微小數值。換句話說,給定區間裡的任何值都可能作為權重。
• random_normal:根據高斯分佈初始化權重,平均值為0,標準差為0.05。如果你不熟悉高斯分佈,可以回想一下對稱鐘形曲線。
• zero:所有權重初始化為0。
完整選項列表請參考Keras官網。
1.2 多層感知機——第一個神經網路的示例
完整選項列表請參考Keras官網。在本文中,我們將定義一個多層線性網路,並將其作為本書的第一個程式碼示例。從歷史上來看,感知機這個名稱是指具有單一線性層的模型,因此,如果它有多層,我們就可以稱之為多層感知機(Multilayer perceptron,MLP)。圖1.1展示了一個一般的神經網路,它具有一個輸入層、一箇中間層和一個輸出層。
圖1.1
在圖1.1中,第一層中的每個節點接收一個輸入,並根據預設的本地決策邊界值確定是否激發。 然後,第一層的輸出傳遞給中間層,中間層再傳遞給由單一神經元組成的最終的輸出層。有趣的是,這種分層組織似乎模仿了我們前面討論過的人類的視覺系統。
1.2.1 感知機訓練方案中的問題
讓我們來考慮一個單一的神經元如何選擇最佳的權重w和偏差b?理想情況下,我們想提供一組訓練樣本,讓機器通過調整權重值和偏差值,使輸出誤差最小化。 為了更加的具體,我們假設有一組包含貓的影象,以及另外單獨的一組不包含貓的影象。為了簡單起見,假設每個神經元只考慮單個輸入畫素值。當計算機處理這些影象時,我們希望我們的神經元調整其權重和偏差,使得越來越少的影象被錯誤識別為非貓。這種方法似乎非常直觀,但是它要求權重(和/或偏差)的微小變化只會在輸出上產生微小變化。
如果我們有一個較大的輸出增量,我們就不能進行漸進式學習(而非在所有的方向上進行嘗試—這樣的過程稱為窮舉搜尋—我們不知道是否在改進)。畢竟,小孩子是一點一點學習的。不幸的是,感知機並不表現出這種一點一點學習的行為,感知機的結果是0或1,這是一個大的增量,它對學習沒有幫助,如圖1.2所示。
我們需要一些更平滑的東西,一個從0到1逐漸變化不間斷的函式。在數學上,這意味著我們需要一個可以計算其導數的連續的函式。
圖1.2
1.2.2 啟用函式—sigmoid
sigmoid函式的定義如下:
如圖1.3所示,當輸入在(−∞,∞)的區間上變化時,位於(0,1)區間上的輸出值變化很小。從數學的角度講,該函式是連續的。典型的sigmoid函式如圖1.3所示。
圖1.3
神經元可以使用sigmoid來計算非線性函式σ(z=wx+b)。注意,如果z=wx+b是非常大的正值,那麼e−z→0,因而σ(z)→1;而如果z=wx+b是非常大的負值,e−z→∞,因而σ(z)→0。換句話說,以sigmoid為啟用函式的神經元具有和感知機類似的行為,但它的變化是漸進的,輸出值如0.553 9或0.123 191非常合理。在這個意義上,sigmoid神經元可能正是我們所要的。
1.2.3 啟用函式—ReLU
sigmoid並非可用於神經網路的唯一的平滑啟用函式。最近,一個被稱為修正線性單元(Rectified Linear Unit,ReLU)的啟用函式很受歡迎,因為它可以產生非常好的實驗結果。
ReLU函式簡單定義為f(x)=max(0,x),這個非線性函式如圖1.4所示。對於負值,函式值為零;對於正值,函式呈線性增長。
圖1.4
1.2.4 啟用函式
在神經網路領域,sigmoid和ReLU通常被稱為啟用函式。在“Keras中的不同優化器測試”一節中,我們將看到,那些通常由sigmoid和ReLU函式產生的漸進的變化,構成了開發學習演算法的基本構件,這些構件通過逐漸減少網路中發生的錯誤,來一點一點進行調整。圖1.5給出了一個使用σ啟用函式的例子,其中(x1, x2, …, xm)為輸入向量,(w1, w2, …, wm)為權重向量,b為偏差, 表示總和。
圖1.5
Keras支援多種啟用函式,完整列表請參考Keras官網。
本文摘自《Keras深度學習實戰》
[義大利]安東尼奧·古利 等著
點選封面購買紙書
本書用當前流行的Keras框架實現了大量深度學習演算法,構建了眾多深度學習模型,並且介紹了深度學習在遊戲等實際場合中的應用,特別是本書還介紹了當前火熱的生成對抗網路(GAN)的應用。全書通俗易懂,強調實際案例,適合廣大的機器學習從業者和愛好者入門與實踐。
本期評獎規則
在本文下方留言,用30+個字元,留言說說你想要這本書的理由是什麼~
我們會從留言使用者中,按照留言點贊數,抽取排名在第3、14、20名的3位幸運者,送出本書。
開獎時間:7月10日當天(以當天小編開獎時看到的名次順序為準)
- The End -
「若你有原創文章想與大家分享,歡迎投稿。」
加編輯微信ID,備註#投稿#:
程式 丨 druidlost
小七 丨 duoshangshuang
更多精彩內容