咱們以房價預測的案例來講明一下,把房屋的面積做爲神經網絡的輸入(咱們稱之爲𝑥),經過一個節點(一個小圓圈),最終輸出了價格(咱們用𝑦表示)。其實這個小圓圈就是一個單獨的神經元,就像人的大腦神經元同樣。若是這是一個單神經元網絡,無論規模大小,它正是經過把這些單個神經元疊加在一塊兒來造成。若是你把這些神經元想象成單獨的樂高積木,你就經過搭積木來完成一個更大的神經網絡。git
神經網絡與大腦關聯不大。這是一個過分簡化的對比,把一個神經網絡的邏輯單元和右邊的生物神經元對比。至今爲止其實連神經科學家們都很難解釋,究竟一個神經元能作什麼。github
這要從邏輯迴歸講起,咱們都知道邏輯迴歸的目標函數以下所示:面試
咱們用網絡來表示,這個網絡就叫作感知器:算法
若是在這個感知器的基礎上加上隱藏層,就會獲得下面咱們要說的神經網絡結構了。編程
神經網絡的通常結構是由輸入層、隱藏層(神經元)、輸出層構成的。隱藏層能夠是1層或者多層疊加,層與層之間是相互鏈接的,以下圖所示。網絡
通常說到神經網絡的層數是這樣計算的,輸入層不算,從隱藏層開始一直到輸出層,一共有幾層就表明着這是一個幾層的神經網絡,例如上圖就是一個三層結構的神經網絡。框架
**解釋隱藏層的含義:**在一個神經網絡中,當你使用監督學習訓練它的時候,訓練集包含了輸入𝑥也包含了目標輸出𝑦,因此術語隱藏層的含義是在訓練集中,這些中間結點的準確值咱們是不知道到的,也就是說你看不見它們在訓練集中應具備的值。dom
假設對下圖進行分類,圓圈爲一類,紅叉叉爲另外一類,若是用線性切分的話不管如何都不能把它們進行分開。機器學習
這時,引入神經網絡(2層神經網絡),包含一個隱藏層,在隱藏層中,分別獲得了P1和P2的圖形,P1這條線以上的部分都是紅叉叉,P2這條線如下的部分都是紅叉叉,兩個神經元就有2條線性直線。從隱藏層到輸出層要作的事情就是把這兩條直線給合併起來,就會獲得h(x)的圖形,也就是說P1以上的空間交上P2如下的空間就是紅叉叉的分類,其他空間分類爲圓圈。這就使得本來不可以線性切分變成非線性切分了。編程語言
若是隱藏層更加複雜的話,就可以完美的實現複雜平面樣本點分佈的劃分(相似於摳圖),以下圖所示:
以下圖所示。用圓圈表示神經網絡的計算單元,邏輯迴歸的計算有兩個步驟,首先你按步驟計算出𝑧,而後在第二 步中你以 sigmoid 函數爲激活函數計算𝑧(得出𝑎),一個神經網絡只是這樣子作了好屢次重複計算。
其中的一個神經元計算以下圖所示:
向量化計算,若是你執行神經網絡的程序,用 for 循環來作這些看起來真的很低效。因此接下來咱們要作的就是把這四個等式向量化。向量化的過程是將神經網絡中的一層神經元參數縱向堆積起來,例如隱藏層中的𝑤縱向堆積起來變成一個(4,3)的矩陣,用符號𝑊[1]表示。另外一個看待這個的方法是咱們有四個邏輯迴歸單元,且每個邏輯迴歸單元都有相對應的參數——向量𝑤,把這四個向量堆積在一塊兒,你會得出這 4×3 的矩陣。
上面公式表示的是一個樣本的向量化計算,那麼多樣本向量化計算其實就是在上面公式的基礎上再增列數,每一列至關於一個樣本。
在神經⽹絡中,一般須要隨機初始化模型參數。下⾯咱們來解釋這樣作的緣由。
假設輸出層只保留⼀個輸出單元o1(刪去o2和o3以及指向它們的箭頭),且隱藏層使⽤相同的激活函數。若是將每一個隱藏單元的參數都初始化爲相等的值,那麼在正向傳播時每一個隱藏單元將根據相同的輸⼊計算出相同的值, 並傳遞⾄輸出層。在反向傳播中,每一個隱藏單元的參數梯度值相等。所以,這些參數在使⽤基於梯度的優化算法迭代後值依然相等。以後的迭代也是如此。
在這種狀況下,⽆論隱藏單元有多少, 隱藏層本質上只有1個隱藏單元在發揮做⽤。所以,正如在前⾯的實驗中所作的那樣,咱們一般將神經⽹絡的模型參數,特別是權重參數,進⾏隨機初始化。
有兩種初始化方法:
採用正態分佈的隨機初始化方法。
Xavier初始化方法:假設某全鏈接層的輸入個數爲a,輸出個數爲b,Xavier隨機初始化將使該層中權重參數的每一個元素都隨機採樣於均勻分佈:
初始化後,每層輸出的方差不會受該層輸入個數的影響,且每層梯度的方差也不受該層輸出個數的影響。
在隱層接一個線性變換後 ,再接一個非線性變換(如sigmoid),這個非線性變換叫作傳遞函數或者激活函數。上面的例子用的都是邏輯迴歸的Sigmoid激活函數,若是還不明白激活函數在哪,能夠看下面這幅圖。
sigmoid函數
tanh(雙曲正切)函數
事實上,tanh 函數是 sigmoid 的向下平移和伸縮後的結果。對它進行了變形後,穿過了(0,0)點,而且值域介於+1 和-1 之間。但有一個例外:在二分類的問題中,對於輸出層,由於𝑦的值是 0 或 1,因此想讓𝑦^的數值介於0和1之間,而不是在-1和+1之間。因此須要使用sigmoid激活函數。
sigmoid函數和tanh函數二者共同的缺點是,在𝑧特別大或者特別小的狀況下,導數的梯度或者函數的斜率會變得特別小,最後就會接近於 0,致使下降梯度降低的速度。
ReLu(修正線性單元)函數
只要𝑧是正值的狀況下,導數恆等於 1,當𝑧是負 值的時候,導數恆等於 0。
這有一些選擇激活函數的經驗法則: 若是輸出是 0、1 值(二分類問題),則輸出層選擇 sigmoid 函數,而後其它的全部單 元都選擇 Relu 函數。
softmax激活函數
以前,咱們的激活函數都是接受單行數值輸入,例如 Sigmoid 和 ReLu 激活函數,輸入一個實數,輸出一個實數。Softmax 激活函數的特殊之處在於,由於須要將全部可能的輸出歸一化,就須要輸入一個向量,最後輸出一個向量。
hardmax 函數會觀察𝑧的元素,而後在𝑧中最大元素的位置放上 1,其它位置放上 0,Softmax 所作的從𝑧到這些機率的映射更爲溫和。
Softmax 迴歸將 logistic 迴歸推廣到了兩種分類以上。
若是你使用線性激活函數或者沒有使用一個激活函數,那麼不管你的神經網絡有多少層一直在作的只是計算線性函數,因此不如直接去掉所有隱藏層。在咱們的簡明案例中,事實證實若是你在隱藏層用線性激活函數,在輸出層用 sigmoid 函數,那麼這個模型的複雜度和沒有任何隱藏層。的標準 Logistic 迴歸是同樣的。
在這裏線性隱層一點用也沒有,由於這兩個線性函數的組合自己就是線性函數,因此除非你引入非線性,不然你沒法計算更有趣的函數,即便你的網絡層數再多也不行。
正向傳播(forward-propagation)是指對神經網絡沿着從輸入層到輸出層的順序,依次計算並存儲模型的中間變量(包括輸出)。
邏輯迴歸的計算步驟:因此回想當時咱們討論邏輯迴歸的時候,咱們有這個正向傳播步驟,其中咱們計算𝑧,而後𝑎,而後損失函數𝐿。 正向傳播相似,計算,,再計算,,最後獲得loss function。
反向傳播(back-propagation)指的是計算神經網絡參數梯度的方法。總的來講,反向傳播依據微積分中的鏈式法則,沿着從輸出層到輸入層的順序,依次計算並存儲目標函數有關神經網絡各層的中間變量以及參數的梯度。
由正向傳播通過全部的隱藏層到達輸出層,會獲得一個輸出結果,而後根據這個帶入loss funcation中,利用SGD算法進行最優化求解,其中每次梯度降低都會使用一次BP來更新各個網絡層中的參數值,這就是BP回傳偏差的意思。
你能夠把訓練集分割爲小一點的子集訓練,這些子集被取名爲 mini-batch,假設每個子集中只有 1000 個樣本,那麼把其中的𝑥 (1)到𝑥 (1000)取出來,將其稱爲第一個子訓練集,也叫作 mini-batch,而後你再取出接下來的 1000 個樣本,從𝑥 (1001)到𝑥 (2000),而後再取 1000個樣本,以此類推。
在訓練集上運行 mini-batch 梯度降低法,你運行 for t=1……5000,由於咱們有5000個各有 1000 個樣本的組,在 for 循環裏你要作得基本就是對𝑋 {𝑡}和𝑌 {𝑡}執行一步梯度降低法。
其中1<n<m,m表示整個訓練集大小。
優缺點:
首先,若是訓練集較小,直接使用 batch 梯度降低法,這裏的少是說小於 2000 個樣本。通常的 mini-batch 大小爲 64 到 512,考慮到電腦內存設置和使用的方式,若是 mini-batch 大小是 2 的𝑛次方,代碼會運行地快一些。
端到端學習(end-to-end)是一種解決問題的思路,與之對應的是多步驟解決問題,也就是將一個問題拆分爲多個步驟分步解決,而端到端是由輸入端的數據直接獲得輸出端的結果。
就是不要預處理和特徵提取,直接把原始數據扔進去獲得最終結果。
特徵提取包含在神經網絡內部,因此說神經網絡是端到端的網絡。
優勢:
經過縮減人工預處理和後續處理,儘量使模型從原始輸入到最終輸出,給模型更多能夠根據數據自動調節的空間,增長模型的總體契合度。
缺點
現有的深度學習開源平臺主要有 Caffe, PyTorch, MXNet, CNTK, Theano, TensorFlow, Keras, fastai等。
平臺 | 優勢 | 缺點 |
---|---|---|
TensorFlow | 1.功能很齊全,可以搭建的網絡更豐富。 2.支持多種編程語言。 3.擁有強大的計算集羣。 4.谷歌支持 5.社區活躍度高。 6.支持多GPU。 7.TensorBoard支持圖形可視化。 |
1.編程入門難度較大。 2.計算圖是純 Python 的,所以速度較慢 3.圖構造是靜態的,意味着圖必須先被「編譯」再運行 |
Keras | 1.Keras是TensorFlow高級集成APi 2.Keras是一個簡潔的API。 能夠快速幫助您建立應用程序。 3.代碼更加可讀和簡潔。 4.Keras處於高度集成框架。 5.社區活躍。 |
1.Keras框架環境配置比其餘底層框架要複雜一些。 2.雖然更容易建立模型,可是面對複雜的網絡結構時可能不如TensorFlow。 3.性能方面比較欠缺。 |
Pytorch | 1.它能夠在流程中更改體系結構。 2.訓練神經網絡的過程簡單明瞭。 3.可使用標準 Python 語法編寫 for 循環語句。 4.大量預訓練模型 |
1.不夠TensorFlow全面,不過將來會彌補。 2.PyTorch部署移動端不是很好。 |
MXNet | 1.支持多語言。 2.文檔齊全。 3.支持多個GPU。 4.清晰且易於維護的代碼。 5.命令式和符號式編程風格之間進行選擇。 |
1.不被普遍使用。 2.社區不夠活躍。 3.學習難度大一些。 |
目前從招聘來講,公司使用TensorFlow的佔大多數,畢竟TensorFlow的社區、性能、部署方面都是很強的,因此以後寫的實例代碼都使用TensorFlow來完成。
在圖像分類的情景中,softmax分類器輸出能夠是一個圖像類別的離散值,和線性迴歸不一樣的是,softmax輸出單元從一個變成了多個。
softmax迴歸和線性迴歸同樣將輸入特徵與權重作線性疊加。與線性迴歸的一個主要不一樣在於,**softmax迴歸的輸出值個數等於標籤裏的類別數。**下圖是用神經網絡描繪了softmax迴歸,也是一個單層神經網絡,因爲每一個輸出 的計算都要依賴於全部的輸入 ,softmax迴歸的輸出層也是一個全鏈接層。
一個簡單的辦法是將輸出值 當作預測類別是i的置信度,並將值最大的輸出所對應的類別做爲預測輸出。例如,若是 分別爲0.1 ; 10 ; 0.1,因爲 最大,那麼預測類別爲2。
然而,直接使用輸出層的輸出會有兩個問題:
softmax運算解決了以上兩個問題。它經過下面的公式將輸出值變換成值爲正且和爲1的機率分佈:
咱們已經知道,softmax運算將輸出變換成一個合法的類別預測分佈。實際上,真實標籤也能夠用類別分佈表達:
對於樣本i,咱們構造向量 ,使其第 個元素爲1,其他爲0。這樣咱們的訓練目標能夠設爲使預測機率分佈 儘量接近真實的標籤機率 。
想要預測分類結果正確,咱們其實並不須要預測機率徹底等於標籤機率,而平方損失則過於嚴格。改善這個問題的一個方法是使用更適合衡量兩個機率分佈差別的測量函數。其中,交叉熵(cross entropy)是一個經常使用的衡量方法:
其中帶下標的 是向量 中非 0 即 1 的元素。也就是說,交叉熵只關心對正確類別的預測機率,由於只要其值足夠大,就能夠確保分類結果正確。即最小化交叉熵損失函數等價於最大化訓練數據集全部標籤類別的聯合預測機率。
做者:@mantchs
GitHub:github.com/NLP-LOVE/ML…