摘要: 100行Python代碼理解深度學習關鍵概念!
在構建乳腺癌預測神經網絡過程當中,咱們主要分爲3大部分:python
1.用Python從零開始建立一個神經網絡,並使用梯度降低算法訓練模型。算法
2.在該神經網絡中使用威斯康星乳腺癌數據集,根據9種不一樣的特徵,預測腫瘤是良性仍是惡性的。編程
3.探索反向傳播和梯度降低算法的工做原理。網絡
在這個領域中,有不少大牛都經過視頻和博文分享了本身掌握的專業知識,如fast.ai的Jeremy Howard、吳恩達、Andrej Karpathy、Yann Lecun等等。架構
他們一致認爲,深度學習的關鍵之一就是,儘快親自動手編寫一個深度學習的模型。當前,深度學習領域中有不少強大的庫可供咱們使用,如Tensorflow、 PyTorch、 Fast.ai、 Keras、 Mxnett、Nctk、DL4J 等。若是僅僅直接使用這些強大的庫,咱們可能會錯過不少關鍵的東西,所以,咱們須要進一步思考這些進程中最重要的那部分。機器學習
若是能本身親自動手編碼建立一個神經網絡,咱們就不得不面對建立過程當中出現的一些問題和障礙,挖掘深度學習背後隱藏的那些使人驚歎的知識。函數
當前,深度學習領域中有各類各樣的架構和開發:卷積神經網絡、循環神經網絡和生成對抗網絡等等。在這些不一樣種類的網絡背後,都包含了兩個相同的算法:反向傳播算法和梯度降低算法。工具
宇宙中的不少事物均可以用函數表示。本質上來講,函數是一種數學結構,接受一個輸入併產生一個輸出,表示因果關係、輸入輸出關係。學習
當咱們審視周圍的世界時,會接收到不少信息,咱們將這些信息轉化爲數據,就能夠從這些數據中學到不少知識。在利用這些數據進行學習的時候,會有不少不一樣的種類。一般來講,深度學習中有三種最多見的類型:優化
1.監督學習:從一組有標籤(已分類)的訓練數據中學習函數,輸入和輸出是成對的數據集。
2.非監督學習:從沒有任何標籤或分類的數據中學習到函數。
3.強化學習:代理人會在特定環境中作出相應的動做,經過最大化代理人獲得的獎勵獲得函數。
本文中,咱們主要關注監督學習。如今,咱們有一個數據集,包含輸入及對應的輸出。下面,咱們想了解這些輸入和輸出是如何經過一個神祕的函數聯繫起來的。
當數據集達到必定的複雜度時,尋找這個函數的難度就至關大。所以,咱們就須要使用神經網絡和深度學習,來探索這個神祕的函數。
本質上來講,神經網絡經過一系列的中間「權重」鏈接咱們的輸入和指望輸出數據。這些權重實際上就是一些數字。
當咱們使用正確的架構和參數,經過神經網絡的結構和優化算法,咱們可將神經網絡近似成一個通用函數近似器,將輸入和輸出數據聯繫起來。
通常來講,簡單的神經網絡包括兩層(輸入不計入層數):
1.輸入:神經網絡的輸入包含了咱們的源數據。而且,神經元的數量與源數據的特徵數量相匹配。下圖中有4個輸入,當咱們使用威斯康星乳腺癌數據集建立神經網絡的時候,就會使用9個輸入。
2.第一層:隱藏層,包含一些隱藏層神經元,這些神經元將會與周圍層中的全部單元相鏈接。
3.第二層:有一個單元,爲神經網絡的輸出。
在實際的神經網絡構建過程當中,咱們可使用更多的層,好比10個或20個層的網絡。爲了簡單起見,在這裏,咱們使用2個層。千萬不要小看這2個層,它可以實現不少功能。
問題來了:在這個神經網絡中,學習將在哪一個部分進行?
咱們來回顧一下,咱們在神經網絡的輸入層放置了一些數據,並向網絡展現某個輸入應該對應什麼輸出,也就是說,神經網絡的輸出(第2層)應該是什麼結果。
在神經網絡中,每一個神經元都有一個相關的權重以及一個誤差。這些權重只是神經網絡在開始學習時候初始化的一些隨機數字。
神經網絡根據輸入數據和這些權重值進行計算,經過神經網絡傳播,直到輸出產生最終的結果。
這些計算的結果就是一個將輸入映射到輸出的函數。
咱們須要的就是,這些神經網絡可以計算出一個最佳權重值。由於網絡經過計算,不一樣的權重和不一樣的層結合起來,會近似出不一樣類型的函數。
如今,咱們來進一步探索正在探尋的函數。爲了方便閱讀,咱們須要解釋下這些變量的名稱:
1.X表示輸入層,即提供給網絡的數據集。
2.Y表示與輸入x對應的目標輸出,由輸入通過網絡進行一系列的計算獲得的輸出。
3.Yh(y hat)表示預測函數,即咱們像網絡提供輸入數據集x後,通過神經網絡一系列的計算產生的輸出。所以,Y是理想的輸出,Yh是神經網絡接收到輸入數據後產生的實際輸出。
4.W表示網絡各層的權重。
咱們首先看第一層——隱藏層,它執行了一個運算W*X(即W和X的乘積)。
而後進行一個加權和:
1.這一層中的每一個單元都和前一層中的每一個單元相鏈接。
2.權重值存在於每一個鏈接中。
3.該層中每一個單元的值都是由前一個層中每一個單元的值*權重的總和,而該權重則是1中所獲得的權重。
從某種程度上來講,權重表示鏈接的強度,即:不一樣層之間單元鏈接的強度。
如今,咱們要在這個架構中添加一個額外的量——誤差:W*X+b。
這個誤差可以給神經網絡帶來更多的靈活性,誤差容許網絡「移動」單位的線性計算,增強網絡學習這些函數的能力。
b表明單位誤差項。
咱們看到,W*X+b就是一個線性方程,經過乘積與和運算表示輸入和輸出的線性關係。
如今,咱們的神經網絡只有2層,可是請記住,一個神經網絡能夠有不少層,好比20個甚至200個。所以,咱們用數字表述這些變量屬於哪一層。這樣一來,定義隱藏層(第1層)的線性方程則爲:W1*X+b1,併爲其輸出命名爲Z,表示某一層計算的輸出。所以,咱們獲得以下方程:
Z1=W1*X+b1
注意,這個計算應該針對每一個層的每一個單元進行。當咱們爲神經網絡編寫代碼的時候,咱們將使用向量化編程,也就是說,利用矩陣將某一層的全部計算放在一個單一的數學運算中。
上面所講述的是隻有一個層的神經網絡。如今,咱們考慮一個有不少層的神經網絡,每一個層執都執行一個相似上面的線性運算,當全部的線性運算鏈接在一塊兒時,這個神經網絡就可以計算複雜的函數了。
然而,如今就有一個問題:線性函數——太簡單了吧。
這個世界是複雜的,所以,線性函數遠遠知足不了實際需求。通常來講,複雜的函數每每都是非線性的。並且,若是神經網絡的架構僅僅由線性函數計算,那麼就很難計算非線性行爲。這就是爲何咱們要在神經網絡的每一層末尾加上一個額外的量:激活函數。如今,咱們介紹4個最典型的例子。
爲了方便咱們後續對激活函數進行深刻探索,首先須要介紹梯度這一律念。一個函數在某一點上的梯度也稱爲函數的導數,表示該函數在該點輸出值的變化率。
咱們來思考這樣一個問題:當特定輸入發生變化時,函數的輸出會發生怎樣的變化?
當梯度(導數)很是小,即函數的輸出變化很是平坦時,咱們稱之爲梯度消失。在後邊的反向傳播算法中,咱們能夠經過梯度瞭解網絡中每一個參數將會如何影響網絡的輸出,從而就可以決定如何調整網絡的權值,也就是說了解這個參數的變化將會使網絡的輸出增長仍是減小?
梯度消失是咱們所面臨的一個問題,由於若是某一點的梯度變化很小或趨於0,咱們就很難肯定該神經網絡在該點的輸出方向。
固然,咱們也會遇到相反的狀況——梯度爆炸。當梯度值很是大時,神經網絡可能就會變得很是不穩定。
不一樣的激活函數有各自的優勢,可是都會面臨梯度消失和梯度爆炸這兩大問題。
左上:Sigmoid激活函數;右上:Tanh激活函數;
左下:Relu激活函數;右下:Leaky Relu激活函數
(1)Sigmoid激活函數——1/(1+e-x)
1.輸出範圍:[0,1]。
2.非線性,輸出爲兩個極端變量0和1。適用於二分類問題。
3.曲線變化溫和,所以,梯度(導數)比較容易控制。
4.該激活函數的主要缺點爲:在極端狀況下,函數的輸出曲線變得很是平坦,也就是說,函數的導數(變化率)將變得很是小,在這種狀況下,Sigmoid激活函數的計算效率和速度將會很是低,甚至會徹底沒效率。
5.當Sigmoid激活函數出如今神經網絡的最後一層時,將會特別有用,由於Sigmoid激活函數有助於將輸出變爲0或1(即二分類問題)。若是將Sigmoid激活函數放在神經網絡的其餘層,就會出現梯度消失問題。
(2)Tanh激活函數——(2/(1+e-2x))-1
1.輸出範圍:[-1,1]。
2.曲線和Sigmoid激活函數的曲線相似,是Sigmoid激活函數曲線的縮小版。
3.Tanh激活函數曲線較爲陡峭,所以,該激活函數的導數(變化率)比較大。
4.Tanh激活函數的缺點與Sigmoid激活函數相似。
(3)Relu激活函數——max (0,x)
1.若是輸入大於0,那麼,輸出值等於輸入值;不然,輸出爲0。
2.Relu激活函數的範圍是[0,+∞),這就意味着輸出多是+∞,可能會存在梯度爆炸問題。
3.優勢:使神經網絡輕量化,由於一些神經元可能輸出爲0,防止全部的神經元被同時激活。
4.Relu激活函數存在一個問題,即輸入爲0的時候,輸出所有爲0,這將會致使梯度爲0,會讓咱們忽視某些神經元的一些有用的計算。
5.Relu激活函數計算簡單,成本低廉。
6.當前,Relu激活函數是神經網絡內層最常用的激活函數。
(4)Leaky Relu激活函數——ex / Sum(ex)
1.輸出範圍:[0,1]
2.Leaky Relu激活函數將輸入進行標準化處理爲一個機率分佈。
3.一般用於多分類場景中的輸出層。
在這裏,咱們在輸出層使用Sigmoid激活函數,在隱藏層使用Relu激活函數。
好了,如今咱們已經理解了激活函數,那麼,就須要對其進行命名!
A:表示激活函數的輸出。
所以,在神經網絡的隱藏層中,將會進行以下計算:
A1=Relu(Z1)
Z1=W1*X+b1
在第二層的輸出層中,將會進行以下計算:
A2=Sigmoid(Z2)
Z2=W2*A1+b2
請注意,第二層(輸出層)的輸入爲第一層的輸出,即A1。
第二層的輸出就是網絡的最終輸出。將上面的計算概括一下,就獲得2層神經網絡所執行的所有計算:
Yh = A2 = Sigmoid(W2ReLU (W1X+ b1) + b2 )
所以,本質上來講,神經網絡是一連串的函數,有些是線性函數,有些是非線性函數,它們共同組成了一個複雜的函數,將咱們的輸入數據和想要的輸出數據鏈接了起來。
如今,咱們注意到,在這個方程的全部變量中,W和b是兩個未知數,這就是神經網絡須要學習的地方。也就是說,神經網絡必須進行不斷的學習,找到W和b的正確值,才能計算出正確的函數。
所以,咱們訓練神經網絡的目的也變得明瞭了,即尋找W1,b1,W2,b2的正確值。可是,在開始訓練神經網絡以前,咱們必須首先對這些值進行初始化,即用隨機函數對其進行初始化處理。
初始化之後,咱們就能夠對神經網絡進行編碼,咱們使用Python構建一個類,對這些主要的參數進行初始化處理。
咱們將如何進行實戰編碼呢?請繼續閱讀咱們的第二部分:用Python構建一個神經網絡。
一站式開發者服務,海量學習資源0元起!
阿里熱門開源項目、機器學習乾貨、開發者課程/工具、小微項目、移動研發等海量資源;更有開發者福利Kindle、技術圖書幸運抽獎,100%中--》https://www.aliyun.com/acts/product-section-2019/developer?utm_content=g_1000047140
本文爲雲棲社區原創內容,未經容許不得轉載。