這我的總結的太好了 , 忍不住想學習一下,放到這裏。html
爲了尊重原創做者,說明一下是轉載於:http://blog.csdn.net/MyArrow/article/details/51322433算法
學習總結
1. 簡介
神經網絡和深度學習是由Michael Nielsen所寫,其特點是:兼顧理論和實戰,是一本供初學者深刻理解Deep Learning的好書。網絡
2. 感知器與sigmoid神經元
2.1 感知器(Perceptrons)
感知器工做原理:接收一系列二進制輸入,通過特定的規則計算以後,輸出一個簡單的二進制。架構
![](http://static.javashuo.com/static/loading.gif)
計算規則:經過引入權重(weights)表示每一個輸入對於輸出的重要性,則有函數
![](http://static.javashuo.com/static/loading.gif)
記w⋅x=∑jwjxj,b=-threshold,則有性能
![](http://static.javashuo.com/static/loading.gif)
其w是權重,b是誤差。學習
2.2 Sigmoid神經元(Sigmoid Neurons)
爲了使學習變得可能,須要具有的【學習特徵】:權重或誤差有較小的變化,致使輸出也有較小的變化。以下圖所示:測試
![](http://static.javashuo.com/static/loading.gif)
感知器網絡存在的缺陷是:某個感知器較小的權重或誤差變化,可能致使輸出在0與1之間進行翻轉。因此包含感知器的網絡不具有【學習特徵】。spa
幸運的是:Sigmoid神經元具備此【學習特徵】,即其較小的權重或誤差變化,致使其輸出變化較小。.net
Sigmoid函數:
![](http://static.javashuo.com/static/loading.gif)
Sigmoid神經元輸出:
感知器與sigmoid神經元的差異:
1) 感知器只輸出0或1
2)sigmoid神經元不僅輸出0或1,而可輸出[0,1]之間的任意值
3. 神經網絡架構
![](http://static.javashuo.com/static/loading.gif)
3.1 手寫數字識別
![](http://static.javashuo.com/static/loading.gif)
訓練圖像大小爲28x28,每一個訓練圖像有一個手寫數字。
在輸出層,若是第一個神經元被激活(即其輸出接近1),則此網絡認爲此手寫數字爲0;
若是第二個神經元被激活(即其輸出接近1),則此網絡認爲此手寫數字爲1;
其它以此類推。
3.2 算法描述
設x表示訓練圖像,則x是一個28x28=784維列向量。
表示輸入圖片x是數字6 。
須要尋找一個算法來發現w和b,使其輸出接近標籤值,爲了量化接近程序,定義以下成本函數:
![](http://static.javashuo.com/static/loading.gif)
w:全部權重的集合
b:全部誤差的集合
n:訓練樣本數
a: 輸出向量(其值依賴x,w,b)
x:一幅訓練圖像
||v||:表示向量的範數,即向量的長度
C:二次成本函數(mean squared error or MSE)
若是
接近於0,表示y(x)接近輸出a,即學習效果很好。
此成本函數中,w和b爲變量。
注:hidden layers和output layer中的每一個神經元對應一個組w、b。
3.2.1 學習目標
如何找到知足要求的w和b:答案是梯度降低法(Gradient Descent)
1)最小化二次成本函數
2)檢測分類的準確性
學習目標:在訓練神經網絡中,找到使二次成本最小的w和b的集合。
3.2.2 梯度降低更新規則
![](http://static.javashuo.com/static/loading.gif)
:表示學習速度(Learning Rate)
此規則用於在神經網絡中學習參數w和b。
3.2.3 算法推導(梯度降低法: gradient descent)
要求極小值,先討論具備2個變量的簡單狀況,而後再推廣:
![](http://static.javashuo.com/static/loading.gif)
令
,
爲梯度向量,則有:
![](http://static.javashuo.com/static/loading.gif)
如今的問題是如何選擇
,使
負數,則有:
![](http://static.javashuo.com/static/loading.gif)
則v的更新規則爲:
![](http://static.javashuo.com/static/loading.gif)
按此規則,一步一步跌代,C值不斷減小,直到全局最小值。
總之,梯度降低法是:重複計算梯度
,而後向相反的方向移動(即下坡最快最陡的方向),以下圖所示:
![](http://static.javashuo.com/static/loading.gif)
上面討論了只有兩個變量的狀況,如今推廣到m個變量的狀況,對應公式以下:
![](http://static.javashuo.com/static/loading.gif)
3.2.4 隨機梯度降低法(Stochastic Gradient Descent)
爲不減小計算量,把n個學習樣本分紅不少組,每組有m個學習樣本,每次只計算一個組,則有以下推導:
![](http://static.javashuo.com/static/loading.gif)
則w和b的更新規則爲:
![](http://static.javashuo.com/static/loading.gif)
注:若是m=1,則爲在線學習(online)。
3.2.5 w和b的數量
對於hidden layers和輸出層的神經元,每一個神經元對應一個w向量和一個b,w向量的維數是其輸入神經元的數量。第一層神經元沒有w和b,其值直接輸出。
第一層就表示原始圖像數據,這些數據不經任何處理,直接做爲Xj參與第二層的運算,第二層首先基於每一個Xj,計算其z(z=wx+b),而後計算出sigmoid(z),以此類推。直到最後一層,利用BP算法,先計算最後一層w和b的梯度,而後以此向前,直到計算出第二層的梯度爲止。
4. BP算法(反向傳播算法)
BP(Backpropagation Algorithm) :是一個計算成本函數梯度的算法。
須要基於每一個訓練樣本計算每一層的w和b的梯度,從而更新每一層的w和b。
BP的真正目標:是計算每一個樣本的偏導數:
和
。
4.1 定義標記符號
![](http://static.javashuo.com/static/loading.gif)
則有激活值的以下公式:
![](http://static.javashuo.com/static/loading.gif)
函數向量化有以下形式:
![](http://static.javashuo.com/static/loading.gif)
即函數對向量的每一個元素分別計算,而後生成對應的向量。
則上面的函數向量表示爲:
![](http://static.javashuo.com/static/loading.gif)
記
,則有![](http://static.javashuo.com/static/loading.gif)
4.2 公式推導過程
4.2.1 計算激活值
![](http://static.javashuo.com/static/loading.gif)
4.2.2 最後一層(L層)的二次成本函數
![](http://static.javashuo.com/static/loading.gif)
4.2.3 單個訓練樣本(x)的二次成本函數
![](http://static.javashuo.com/static/loading.gif)
4.2.4 定義偏差![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
4.2.5 定義輸出層偏差
![](http://static.javashuo.com/static/loading.gif)
4.2.6 求最後一層(L層)激活值的偏導數![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
4.2.7 根據最後一層的偏差計算前一層的偏差
![](http://static.javashuo.com/static/loading.gif)
4.2.8 計算目標值![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
4.2.9 BP的四個基本方程式
4.3 證實四個基本議程式
4.3.1 證實BP1
4.3.2 證實BP2
4.4 BP計算過程
5. SGD(隨機梯度降低)計算過程
6. 改進神經網絡學習方法
理想地,指望咱們的神經網絡能從本身的錯誤中快速地進行學習。
神經元經過改變權重和誤差的來進行學習的學習速度由成本函數的偏導數(
![](http://static.javashuo.com/static/loading.gif)
和
![](http://static.javashuo.com/static/loading.gif)
)決定,因此學習速度慢的根本緣由是:偏導數過小。
6.1 交叉熵成本函數
交叉熵成本函數定義以下:
對權重w的求導結果爲(n爲訓練樣本數):
根據上面的求導公式,則避免了在二次成本函數中由
![](http://static.javashuo.com/static/loading.gif)
致使的學習速度慢問題。
6.2 推廣交叉成本函數
把交叉成本函數推廣到具備多個神經元的多層網絡中,則交叉成本函數變爲:
與二次成本函數相比,惟一不一樣的是
![](http://static.javashuo.com/static/loading.gif)
的計算方法,其它計算方法徹底相同。
6.3 交叉熵的含義
粗略地說,交叉熵是「不肯定性」的一種度量。特別地,咱們的神經元想要計算函數x-> y = y(x)。可是,它用函數x->a = a(x) 進行了替換。假設咱們將a 想象成咱們神經元估計爲y = 1 的機率,而1-a 則是y = 0 的機率。那麼交叉熵衡量咱們學習到y的正確值的平均起來的不肯定性。若是輸出咱們指望的結果,不肯定性就會小一些;反之,不肯定性就大一些。
6.4 Softmax(柔性最大值)
Softmax+log-likelihood(對數似然)成本函數:在現代圖像分類網絡中最經常使用。
Softmax爲神經網絡定義了一個新的輸出層,即它的激活函數再也不是Sigmoid,而是Softmax函數。
Softmax的每一個神經元的輸出都爲正,且它們的和爲1。因此Softmax層的輸出能夠看做一個機率分佈。
與Softmax相比,Sigmoid層的輸出不能造成一個機率分佈,且沒有一個直觀、簡單的解釋。
6.4.1 Softmax如何解決學習速度慢的問題?
從以上梯度公式中可知,對於解決學習速度慢的問題:【Softmax輸出層+對數似然成本函數】與【Sigmoid輸出層+交叉熵成本函數】效果至關。
在兩者間如何作出選擇呢?
當你須要把輸出當作機率解釋時,則須要使用【Softmax輸出層+對數似然成本函數】。
7. 過擬合和規範化
7.1 過擬合(Overfitting)
在神經網絡中,過擬合(
Overfitting)是一個主要問題。此問題在現代網絡中特別突出,由於現代網絡有大量的權重和誤差。爲了進行有效的訓練,咱們須要一個檢測是否過擬合的方法,以防止過分訓練(
Overtraining),而且咱們還須要能夠減小過擬合效果的技術。
最直接的檢測過擬合的方法是:跟蹤測試數據在訓練過的網絡中的準確性。如測試數據分類的準確性再也不改善,咱們應當中止訓練;或測試數據分類的準確性和訓練數據分類的準確性都再也不改善,咱們應當中止訓練。
若是對訓練樣本過擬合,則其推廣能力就差,致使對新的數據的預測或分類的準確性變差。
7.2 規範化(Regularization)-減小過擬合
增長訓練數據是減小過擬合的方法之一。
規範化(
Regularization)也是減小過擬合的方法之一。有時候被稱爲權重衰減(
weight decay)或者L2 規範化。L2 規範化的思想是增長一個額外的項到成本函數中,這個項叫作規範化項。規範化的交叉熵以下:
![](http://static.javashuo.com/static/loading.gif)
>0是規範化參數(
regularization parameter)
C0是原來常規的成本函數。 若是
![](http://static.javashuo.com/static/loading.gif)
較小,咱們指望最小化原始成本函數;若是
![](http://static.javashuo.com/static/loading.gif)
較大,咱們指望最小化權重。
則可得:
可進一步獲得:
權重衰減因子:
針對小批量訓練樣本(m個),則有:
7.3 爲何規範化能夠減小過擬合
權重越小,複雜度就越低;能夠爲數據提供更簡潔更有力的解釋。
當有異常輸入時,小的權重意味着網絡輸出變化不大,即不易學習到數據中的局部噪聲。總而言之,規範化網絡基於訓練數據的主要規律,從而建立一個相對簡單的模型,而且拒絕學習訓練數據中的噪聲(異常數據)。這樣強制網絡學習數據的本質規律,並把學到的規律進行更好地推廣。
8. 權重初始化
可加快學習速度。
假設輸入層有1000個神經元,且已經使用歸一化的高斯分佈初始化了鏈接第個隱層的權重。以下圖所示:
爲了簡化,設輸入層一半神經元值爲1,另外一半爲0。讓咱們考慮隱層神經元輸入的帶權和z:
其中500項消去了,由於對應的輸xj 爲0。因此z 是包含501個歸一化的高斯隨機變量的和,包含500個權重項和1個誤差項。所以z自己是一個均值爲0、標準差爲
![](http://static.javashuo.com/static/loading.gif)
(方差爲501)的高斯分佈。它是一個很是寬的高斯分佈,根本不是很是尖的形狀:
注:
正態分佈的
指望值μ決定了其位置,其
標準差σ決定了分佈的幅度。
標準正態分佈服從N(0,1)
兩個都服從正太分佈的變量,例如X服從N(a,b),Y服從N(c,d),且X和Y相互獨立,則有:
1)X+Y服從N(a+c,b+d)
2)X-Y服從N(a-c,b+d)
即兩變量相加減時,指望相應加減,方差始終是相加。
從上圖上能夠看出|z|會變得很大,即z>>1或z<<-1。若是這樣,隱層神經元的輸出
![](http://static.javashuo.com/static/loading.gif)
就會接近1或者0,即隱層神經元進入飽和狀態了。即隱層神經元的輸出
![](http://static.javashuo.com/static/loading.gif)
將很是接近於0或1。在這種狀況下,權重的修改對隱層神經元的輸出激活值影響很小,從而對下一層的隱層神經元、直到對輸出層的神經元的輸出都很小,從而致使學習速度慢的問題。
(注:輸出層神經元飽和於錯誤值也會致使學習速度慢的問題,這能夠經過選擇成本函數<如交叉熵>來避免,但選擇成本函數的方法不能解決隱層神經元飽和的問題)
從以上分析可知,若是隱層神經元的權重服從N(0,1)分佈,它將致使隱層神經元的激活值接近於0或1,而且致使學習速度降低,如何解決此問題呢?
經過選擇更好的初始化權重和誤差能夠解決此問題。
答案是:初始化權重服從N(0,1/
![](http://static.javashuo.com/static/loading.gif)
)分佈,誤差服從N(0,1)。其中
![](http://static.javashuo.com/static/loading.gif)
表示此層神經元輸入權重個數(即此隱層神經元的輸入神經元個數,如上例中
![](http://static.javashuo.com/static/loading.gif)
=1000)。權重以後爲:
![](http://static.javashuo.com/static/loading.gif)
,其服從N(0,3/2)。
方差的計算方法:500*1/1000+1=1500/1000=3/2。其圖形非尖,以下圖所示:
此神經元飽和的可能性很低,從而致使學習速度慢的可能性也很低。
9. 神經網絡能夠計算任何函數
「神經網絡能夠計算任何函數」的真正含義:
1)不是說一個網絡能夠被用來準確地計算任何函數,而是咱們能夠得到儘量好的一個近似。經過增長隱層神經元的數量,能夠提高近似的精度。
2)能夠按照上面的方式近似的函數類實際上是連續函數。若是函數不是連續的,也就是會有忽然、極陡的跳躍,那麼通常來講沒法使用一個神經網絡進行近似。
總而言之:包含一個隱層的神經網絡能夠被用來按照任意給定的精度近似任何連續函數。
10. 爲何訓練深度神經網絡比較困難?
對於學習算法,前面使用的是苦力般的學習方法(基於反向傳播的隨機梯度降低)來訓練深度網絡,這樣產生的問題是:深度神經網絡並不比淺層網絡性能好太多。
其根據緣由是:在深度網絡中,不一樣層的學習速度差別很大。尤爲是, 在網絡後面層的學習速度很好的時候,前面層在訓練時停滯不變,基本上學不到東西;或先前的層學習的比較好,可是後面層卻停滯不變。其停滯不前的緣由是學習速度降低了,學習速度降低與基於梯度的學習方法有關。
實際上,咱們發如今深度神經網絡中使用基於梯度降低的學習方法自己存在着內在不穩定性。這種不穩定性使得前面或者後面層的學習速度受到抑制。在真正理解了這些難點以後,咱們就可以得到有效訓練深度網絡的更深洞察力。
在某些深度神經網絡中,在咱們在隱層BP的時候梯度傾向於變小。這意味着在前面的隱層中的神經元學習速度要慢於後面的隱層。在多數的神經網絡中都存在着這個現象,這個現象也被稱做是:消失的梯度問題(Vanishing Gradient Problem)。
在前面層中的梯度會變得很是大,這叫作:激增的梯度問題(Exploding Gradient Problem),這也沒比消失的梯度問題更好處理。更加通常地說,在深度神經網絡中的梯度是不穩定的,在前面層中或會消失,或會激增。這種不穩定性纔是深度神經網絡中基於梯度學習的根本問題。
10.1 消失的梯度問題的根本緣由?
深度神經網絡中的梯度不穩定性。
因爲梯度的值小於1,在隨機梯度降低算法中,前面層的梯度由後面層的梯度參與相乘,因此形成前面層的梯度很小,後面層的梯度依次變大。從而形成了梯度的不均衡性。
11. 卷積神經網絡(CNN)
CNN(Convolutional neural networks):使用了一個特殊架構來進行圖像分類。
它的三個基本概念爲:局部感覺野(Local receptive fields),共享權重(Shared weights),和混合(Pooling)。
11.1 基本概念
11.1.1 局部感覺野
在以前的全鏈接網絡中,輸入被描繪成縱向排列的神經元,但在卷積神經網絡中,把輸入看做28 x 28的方形神經元排列。第一個隱層中的每一個神經元只與輸入圖像的一個小區域(如5x5)鏈接,這個輸入圖像的小區域叫作隱層神經元的局部感覺野(Local receptive fields)。以下圖所示:
每一個鏈接學習一個權重,且隱層神經元也學習一個總的誤差。即此隱層神經元正在對輸入圖像的此區域進行學習、瞭解。一個隱層神經元與一個局部感覺野一一對應,即每一個隱層神經元有:5x5個權重和1個誤差。
如上圖所示,對於一個28x28的輸入圖像,若是局部感覺野的大小爲5x5,則第一個隱層中有24x24個神經元。
11.1.2 共享權重和誤差
每組24x24個隱層神經元使用相同的權重和誤差。即對於每組中的第(j,k)隱層神經元,其激活值爲:
即每組有5x5個權得和1個誤差,其26個須要學習的參數。這表示第一個隱層中的全部神經元在輸入圖像的不一樣地方檢測相同的特徵。(圖像具備平移不變性)
特徵映射:從輸入層到隱層的映射。
共享權重:定義特徵映射的權重。
共享誤差:定義特徵映射的誤差。
卷積核或濾波器:共享權重和誤差。
爲了作圖像識別,須要多個特徵映射,且一個完整的卷積層由多個不一樣的特徵映射組成,以下圖包含三個特徵映射:
上面20幅圖像對應20個不一樣的特徵映射(或濾波器、或卷積核),每一個特徵映射用5x5方塊圖表示,對應局部感覺野的5x5個權重。白色表示小權重,黑色表示大權重。
共享權重和誤差最大的優勢是:大大減小了網絡中參數的數量。如全鏈接網絡的參數是卷積網絡參數的30倍左右。(卷積網絡20個特徵:20x26=520, 全鏈接20個隱層神經元:20x784=15680)
11.1.3 混合層
卷積神經網絡除包含卷積層以外,還包含混合層(Pooling Layers),混合層在卷積層以後,它的職責是簡化(總結)卷積層輸出的信息。
混合層根據卷積層輸出的全部特徵映射,而後提煉出新的特徵映射。
1)Max-Pooling
從2x2區域中找一個最大的激活值輸出。
Max-Pooling是一個用於詢問:是否在圖像的一個區域內發現了指定的特徵。
2)L2-Pooling
L2-Pooling就是計算矩陣2x2的2範數(先計算4個數的平方的和,而後開平方)。
L2-Pooing:是一個從卷積層提煉信息的方法。
11.1.4 完整的卷積神經網絡
最後一層與前面一層是全鏈接,其鏈接數爲:3x12x12x10。
卷積神經網絡與全鏈接神經網絡的架構不同,但其目標是同樣的, 它們的目標爲:使用訓練數據訓練網絡的權重和誤差,而後對輸入的圖像作出正確的分類。