第一章 使用神經網絡識別手寫數字
---1.1 感知器
- 感知器是一種人工神經元.它接受幾個二進制輸出並產生一個二進制輸入.如果引入權重和閾值,那么感知器的參數可以表示為:
,如果再引入偏置(表示激活感知器有多容易的估算),那么規則可以簡潔表示為:
- 感知器是單輸出的,但這個單輸出可以被用於多個其它感知器的輸入.
- 感知器可以很容易地計算基本的邏輯功能,如與,或,與非.所以感知器網絡可以計算任何邏輯功能.
- 一般可以將輸入層也畫為一層有輸出但沒有輸入的感知器,但它實際上只表示一種輸出期望值的特殊單元.
- 使感知器能夠自動調整權重和偏置的學習算法是神經網絡有別於傳統邏輯門的關鍵.
---1.2 S型神經元
- 網絡中單個感知器上權重或偏置的微小改動可能會引起輸出翻轉,從而導致其余網絡的行為改變.所以逐步修改權重和偏置來讓輸出接近期望很困難,所以引入了S型神經元(邏輯神經元).
- S型神經元和感知器類似,但是權重和偏置的微小改動只引起輸出的微小變化.S型神經元的輸入可以是0和1中的任意值,輸出是σ(wx+b),其中σ被稱為s型函數(邏輯函數):
,也就是輸出為:
- σ函數是階躍函數的平滑版本.這意味着權重和偏置的微小變化會產生一個微小的輸出變化:
,這意味着輸出的變化是權重和偏置的變化的線性函數.
- 練習:
- 感知器網絡的結果只和wx+b的正負有關,同時乘一個正的常數c不會改變結果的正負性
- 神經元網絡中的權重和偏置都乘以一個趨向正無窮的常數c后,當wx+b != 0時,輸出σ(z)近似為1,和感知器網絡完全一致.當感知器的wx+b=0時,輸出σ(z)=0.5,所以會不同.
---1.3 神經網絡的架構
- 神經網絡一般由輸入層(包含輸入神經元),輸出層(包含輸出神經元)和隱藏層組成.有時這種多層網絡被稱為多層感知器(MLP),但要注意它是由S型神經元構成的.
- 設計網絡的輸入輸出層通常是比較直接的,取決於輸入數據的格式和希望得到的輸出數據.
- 前饋神經網絡中不存在回路,這種網絡的應用較為廣泛.遞歸神經網絡允許反饋環路的存在.
---1.4 一個簡單的分類手寫數字的網絡
- 識別手寫數字的問題可以分成兩個子問題:分割圖像,分類數字.重點是第二個問題.
- 假設一個數字是28*28的灰度圖,那么輸入層就包含784個輸入神經元.
- 輸出層使用10個神經元來表示0~9的數字.為什么不用4個神經元,通過二進制表示10個數字?這個問題沒有確切的答案,只能通過啟發式的方法來解釋:假設神經網絡中每個隱藏層的神經元視圖識別圖像中的某一部分,那么很顯然10個輸出神經元是更合理的方案.
- 練習:
- 第三層的神經元將原先代表的十進制數轉換為二進制,為1的位給予1的權重,為0的位給予0的權重.
---1.5 使用梯度下降算法進行學習
- 用於學習的數據集是經典的MNIST數據集,采用的代價函數(損失函數)是均方誤差(MSE):
- 之所以最小化二次代價函數而不是直接最大化正確分類的圖像數量,是因為在神經網絡中后者關於權重和偏置的函數不是平滑的.而用前者能更好地解決如何用權重和偏置中的微小改變來取得更好的效果.
- 神經網絡中經常需要大量變量,因此采用梯度下降法來計算代價函數最小值:重復計算梯度,然后沿着相反的方向移動
.將權重和偏置代入到公式中,就得到了神經網絡學習的規則:
.
-
假如需要計算每個訓練輸入的梯度值,訓練速度會相當緩慢.因此引入了隨機梯度下降,只計算小批量數據(mini-batch)的梯度值來求平均值:
.
-
隨機梯度下降不斷地選定小批量數據來進行訓練,直到用完了所有的訓練輸入,就稱為完成了一個迭代期(epoch),然后會開始一個新的迭代期.
-
練習:
- 優點:時效性,速度快.缺點:一次只選一個訓練輸入,偏差較大
---1.6 實現我們的網絡來分類數字
- 將數據集分為訓練集(用於學習),驗證集(用於設置超參數),測試集(用於檢驗).
- 一個Network類接受一個列表sizes表示各層神經元的數量,然后用隨機函數生成偏置和權重.它包含初始化__init__,前向計算feedforward,隨機梯度下降SGD,計算小批量數據update_mini_batch,反向傳播backprop,評估evaluate和偏導cost_derivative等方法.此外,我們還需要計算sigmoid和它的導數的兩個函數sigmoid和sigmoid_prime.(注意:如果使用python3的話要將代碼中的xrange改為range,mnist_loader返回的數據要改為list)
- 采用epoch=30,mini_batch=10,theta=3.0的參數,這個sizes=[784,30,10]的三層神經網絡的識別率就達到了95%左右.
- 對有些問題,復雜的算法<=簡單的學習算法+好的訓練數據
- 練習:
- 同樣參數的情況下僅有輸入層和輸出層的神經網絡的識別率大概為62%
---1.7 邁向深度學習
- 神經網絡如何識別人臉?一個啟發式的想法是分解為子問題:
- 圖像的左上角有一個眼睛嗎?右上角有一個眼睛嗎?中間有一個鼻子嗎?下面中央有一個嘴巴嗎?上面有頭發嗎?
- 子問題可以被繼續分解:例如左上角有睫毛嗎?有眉毛嗎?有虹膜嗎?
- 上述子問題同樣可以被繼續分解,並通過多個網絡層傳遞.最終子網絡可以回答那些只包含若干個像素點的簡單問題.
- 上述這種包含多層結構(兩層或更多隱藏層)的網絡被稱為深度神經網絡.
- 深度神經網絡能構建起一個復雜概念的層次結構.
第二章 反向傳播算法如何工作
---2.1 熱身:神經網絡中使用矩陣快速計算輸出的方法
表示從第(l-1)層的第k個神經元到第l層的第j個神經元的鏈接上的權重,
表示在第l層第j個神經元的偏置.
表示第l層第j個神經元的激活值.由此得到了激活值之間的關系
.
-
對每一層l定義權重矩陣(其中第j行第k列的元素是
),偏置向量(每個元素是
)和激活向量(每個元素是
).所以上式可以改寫為
,其中σ是向量化函數(作用σ到向量中的每個元素).中間量
稱為帶權輸入(每個元素是第l層第j個神經元的激活函數的帶權輸入).
---2.2 關於代價函數的兩個假設
- 反向傳播的目標是計算代價函數關於w和b的偏導數.為了讓反向傳播可行,需要作出兩個主要假設:
- 代價函數可以被寫成一個在每個訓練樣本x上的代價函數的均值
- 代價可以寫成神經網絡輸出的函數,以二次代價函數為例
---2.3 Hadamard乘積,s⊙t
- 假設s和t是兩個同樣維度的向量,那么s⊙t表示按元素的乘積,稱為Hadamard乘積或Schur乘積
---2.4 反向傳播的四個基本方程
- 首先引入一個中間量,稱為在第l層第j個神經元上的誤差,被定義為
.
-
反向傳播基於四個基本方程:
- 輸出層誤差的方程:
- 使用下一層的誤差來表示當前層的誤差:
- 代價函數關於網絡中任意偏置的改變率:
- 代價函數關於任何一個權重的改變率:
- 如果輸入神經元激活值很低,或者輸出神經元已經飽和了(過高或過低的激活值),權重會學習緩慢.
---2.5 四個基本方程的證明(可選)
- 使用鏈式法則證明了上一節的四個基本方程,本文不做記錄
---2.6 反向傳播算法
- 反向傳播方程給出了一種計算代價函數梯度的方法:
- 輸入x:為輸入層設置對應的激活值a1
- 前向傳播:對從前往后對每層計算相應的z=wa+b和a=σ(z)
- 輸出層誤差:根據BP1計算誤差向量
- 反向誤差傳播:對后往前根據BP2對每層計算誤差向量
- 輸出:根據BP3和BP4計算代價函數的梯度.
---2.7 代碼
- 解釋了1.6節中的updata_mini_batch方法和backprop方法.
- 可以使用全矩陣方法使得反向傳播算法同時對一個小批量數據中的所有樣本進行梯度計算.這會提高運算速度.
---2.8 在哪種層面上,反向傳播是快速的算法?
- 與直接計算偏導數相比,反向傳播的優點是可以同時計算所有的偏導數,只需要一次前向傳播加上一次后向傳播,所以速度非常快.
---2.9 反向傳播:全局觀
- 反向傳播到底在干什么:兩個神經元之間的連接其實是關聯與一個變化率因子,這個變化率因子是一個神經元的激活值相對於其他神經元的激活值的偏導數.路徑的變化率因子其實就是這條路徑上的眾多因子的乘積.將這個過程簡化就得到了反向傳播算法.
第3章 改進神經網絡的學習方法
---3.1 交叉熵代價函數
- 人類通常在犯錯比較明顯的時候學習的速度最快.而神經元在這種飽和情況下學習很有難度(也就是偏導數很小),這是因為二次代價函數關於權重和偏置的偏導數是
,而σ函數的導數在接近0和1時都很小
- 解決上述問題的方法是引入交叉熵代價函數:
- 它是非負的,並且當實際輸出接近目標值時它接近0,因此可以作為代價函數.
- 它關於權重的偏導數是
,也就是誤差越大,學習速度越快.
- 如果輸出層是線性神經元,那么二次代價函數不再會導致學習速度下降的問題,可以選用.如果輸出神經元是S型神經元,交叉熵一般都是更好的選擇.
- 另一種解決學習緩慢問題的方法是柔性最大值(softmax)神經元層.它的想法是定義一種新的輸出層,應用柔性最大值函數在帶權輸入上
.這種函數使得輸出的是一些相加為1的正數的集合,因此可以看做一個概率分布.
- 柔性最大值層結合對數似然函數類似於S型輸出層結合交叉熵代價,都可以解決學習緩慢的問題.
---3.2 過度擬合和規范化
- 神經網絡因為權重和偏置數量巨大,所以特別容易發生過擬合現象.
- 檢測過擬合的一種方法是早停(early stop):跟蹤測試數據集合上的准確率隨訓練變化的情況,如果准確率不再提升那么就停止訓練.一般會用驗證集而不是測試集來進行早停.
- 最好的降低過擬合的方式就是增加訓練樣本量,但訓練數據其實是很難得的資源.
- 規范化也是一種緩解過擬合的技術.效果是讓網絡傾向於學習小一點的權重,它是尋找小的權重和最小化原始代價函數之間的折中,相對重要性由λ控制.
- L2規范化(權重衰減)的想法是增加一個額外的規范化項
到代價函數上.其中λ是規范化參數,注意規范化項里不包含偏置.
- 規范化能幫助減輕過擬合的一種解釋是:小的權重在某種程度上意味着更低的復雜性,也就對數據給出了一種更簡單卻更強大的解釋.但實際上這只是一種實驗事實.
- L1規范化的規范化項為
,區別是在L1規范化中,權重通過一個常量向0進行縮小,在L2規范化中,權重通過一個和w成比例的量進行縮小.所以L1規范化傾向於聚集網絡的權重在相對少量的高重要度連接上.
- 棄權(dropout)是一種相當激進的技術.原理是在小批量數據中隨機地暫時刪除一半的隱藏神經元然后進行訓練,不斷地重復這個過程后就得到了一個權重和偏置的集合.
- 人為擴展訓練數據:以MNIST為例,可以通過對圖像進行小的旋轉,轉換,扭曲等變換得到新的訓練數據.
---3.3 權重初始化
- 之前我們選用均值為0標准差為1的獨立高斯隨機變量來選擇權重和偏置.它的問題是輸入隱藏神經元的帶權和的絕對值會很大,也就是隱藏神經元會飽和,從而導致這些權重學習得非常緩慢.
- 假如有一個n個輸入權重的神經元,那么應該使用均值為0標准差為1/√n的高斯隨機分布來初始化這些權重.這會讓帶權和的分布變得尖銳,從而使神經元不容易飽和.
- 偏置的初始化仍用均值為0標准差為1的高斯分布.因為偏置不會讓神經網絡更容易飽和.
- 新的權重初始化方法會加快訓練,並且有時候可以提升最終性能.
---3.4 再看手寫識別問題:代碼
- 使用了新的network2.py來改進神經網絡.Network類中添加了新的權重初始化default_weight_initializer,准確率accuracy,總損失total_cost,保存save等方法,並且在計算小批量數據時使用了L2規范化.另外添加了交叉熵代價CrossEntropyCost,數字向量化vectorized_result,讀取load等函數.
---3.5 如何選擇神經網絡的超參數
- 寬泛策略:可以嘗試通過簡化數據集(例如減少分類種類或者樣本數量),提高監控速率來提高訓練速度.
- 學習速率η:首先選擇一個能使代價立即開始下降而非震盪或增加的值作為η的閾值的估計,並逐漸增加η的量級,直到找到一個η的值使得在開始的若干回合代價就開始震盪或增加.按照這個方法可以估計出適合的η的最大量級,然后選用大概閾值的一半來作為學習速率.注意學習速率的主要目的是控制梯度下降的步長,所以仍是通過訓練集來選取的.
- 早停可以用於確定訓練的迭代期數量.因為分類准確率在整體趨勢下降的時候仍可能震盪,所以應該是在一段時間內都不再提升的時候再終止,例如10個回合.
- 可以通過早停采用可變的學習速率,也就是當准確率不再提升時,按照某個量下降學習速率,比如10或2,直到學習速率是初始值的1/1024或1/1000為止.
- 規范化參數λ:一開始令λ=0,先確定η的值,然后從1開始按10的量級尋找適合的λ.
- 小批量數據大小:是一個相對獨立的超參數,所以只需折中地選擇一個速度較快且效果較好的值.
- 網格搜索(grid search):一種自動進行超參數優化的方式.
---3.6 隨機梯度下降的變化形式
- 介紹了隨機梯度下降的變化形式,Hessian技術和momentum技術.
- 人工神經元的其他模型:使用雙曲正切的tanh神經元
,修正線性神經元ReLU
第4章 神經網絡可以計算任何函數的可視化證明
---4.1 兩個預先聲明
- "神經網絡可以計算任何函數"這句話有兩個預先聲明:
- 這不是說一個網絡可以被用來准確地計算任何函數,而是盡可能好的一個近似.
- 可以被近似的函數一般是連續函數,因為神經網絡計算的就是輸入的連續函數.
---4.2 一個輸入和一個輸出的普遍性
- 對於S型函數σ來說,偏置可以使圖像左右平移,權重可以使圖像變寬或變陡(甚至接近階躍函數)
- 階躍的位置s=-b/w,也就是和b成正比,和w成反比.
- 使用不同的權重疊加多個隱藏神經元的階躍函數,可以得到階梯狀或凸起的函數,從而近似各種函數.
---4.3 多個輸入變量
- 先從兩個輸入變量x,y開始,此時的函數圖像是三維的,而x和y的權重分別使x軸和y軸方向發生階躍,如果使偏置b=-3h/2就構成了一個塔形函數.通過組合多個這樣的網絡就可以得到任意多的塔型.
---4.4 S型神經元的延伸
- 只要激活函數s(z)滿足在z->-∞和z->∞時定義明確且彼此不同,那么基於這樣一個激活函數的神經元就可以普遍用於計算,因為它存在階躍.
---4.5 修補階躍函數
- 在激活函數的階躍段存在一個故障窗口,因為函數在這里表現得和階躍函數非常不同.通過令權重為一個足夠大的值可以解決這個問題.還可以通過大量疊加函數來解決,因為在一個近似中的故障窗口的點不會在另一個故障窗口中.
---4.6 結論
- 單個隱藏層就有可能擬合函數了,但深度學習網絡有一個分級結構.普遍性顯示了神經網絡能計算任何函數,而深度網絡最適用於學習能夠解決許多現實世界問題的函數.
第5章 深度神經網絡為何很難訓練
---5.1 消失的梯度問題
-
如果只是單純地在先前創建的network2上增加隱藏層的層數,會發現效果並沒有顯著提高,甚至變差了.這是因為通過隱藏層反向傳播的時候梯度傾向於變小,導致前面的隱藏層中的神經元學習速度慢於后面的隱藏層,這就是梯度彌散(梯度消失).
- 梯度彌散是可以避免的,但替代方法又會造成前面的層中的梯度過大,也就是梯度爆炸.
---5.2 什么導致了消失的梯度問題?深度神經網絡中的梯度不穩定性
-
先假設隱藏層都只包含一個神經元.會發生梯度彌散是因為隱藏層梯度的變化值要乘上該層后面的隱藏層的權重和σ',因為權重通常小於1,而σ'小於1/4,所以越前面的隱藏層的梯度變化越小.同理,如果權重很大,而σ'不是很小,那么就發生了梯度爆炸.
- 根本問題就是前面層的梯度是來自后面的層上項的成績.所以當層次過多時仍采用標准的基於梯度的學習算法,就會產生不穩定的梯度問題.解決方法有使用ReLu作為激活函數,使用Batch Normalization層等.
---5.3 在更加復雜網絡中的不穩定梯度
-
假如每個隱藏層包含多個神經元,仍可以得到與上節相似的結論
---5.4 其它深度學習的障礙
-
激活函數的選擇,權重的初始化,學習算法的實現方式等因素都影響着深度學習的難度.
第6章 深度學習
---6.1 介紹卷積網絡
- 卷積神經網絡(CNN)是一個利用空間結構的特殊網絡架構,擅長於分類圖像.
- 局部感受野(local receptive fields):在卷積網絡中,把輸入看作是矩形排列的神經元更有幫助.第一個隱藏層中的每個神經元會連接到輸入神經元的一個小區域,這塊區域就叫局部感受野.它是輸入像素上的一個小窗口.每個局部感受野中的輸入神經元對應的連接都學習一個權重,而隱藏神經元也同時學習一個總的偏置.在整個輸入圖像上交叉移動局部感受野,每個局部感受野對應不同的隱藏神經元.跨距是指每次交叉移動的像素大小.
- 共享權重和偏置(shared weights/biases):第一層隱藏神經元中的每一個都有相同的權重(和局部感受野大小相同的矩陣)和偏置,這意味它們檢測完全相同的特征,只是在輸入圖像的不同位置.卷積網絡能更好地適應圖像的平移不變性.因此,把從輸入層到隱藏層的映射稱為一個特征映射,以這種方式定義特征映射的權重和偏置稱為共享權重和共享偏置,共享權重和偏置經常被稱為一個卷積核或者濾波器.一個完整的卷積層由幾個不同的特征映射組成.共享權重和偏置的優點是大大減少了參與的卷積網絡的參數.
- 池化層/混合層(pooling layers):通常緊接在卷積層之后使用,目的是簡化卷積層輸出的信息.一個混合層取得從卷積層輸出的每一個特征映射並且從它們准備一個凝縮的特征映射,比如每個單元概括了前一層的一個2*2的區域.
- 最大值混合(max-pooling):輸出輸入區域的最大激活值.
- L2混合(L2 pooling):輸出輸入區域中激活值的平方和的平方根.
---6.2 卷積神經網絡在實際中的應用
- 應用第二個卷積-混合層意味着這一層輸入原始輸入圖像的一個凝縮版本.這一層中的特征檢測器可訪問所有前面層的特征,但僅在其特定的局部感受野中.
- 修正線性單元ReLu的性能一般優於基於S型激活函數的網絡,這可能是因為它在z取最大極限時不會飽和.
- 以算法形式來擴展訓練數據很可能可以顯著提升分類准確率,例如將圖像上下左右平移一個像素,旋轉,位移,扭曲圖像.
- 通過增加一個額外的全連接層並采用dropout技術可以再次顯著提高准確率.一般只對全連接層應用dropout即可,因為卷積層先天就有抵抗過擬合的特性.
- 通過投票來組合幾個不同的網絡也是一種好方法,也就是集成學習的思想.
- 通過卷積層,規范化,ReLU,GPU等技術,我們緩解了梯度不穩定問題.
---6.3 卷積網絡的代碼
- 使用Theano庫實現了network3.由於看本書的目的是更好地學習TensorFlow和keras,因此這里的代碼我沒有自己再實現一遍.
---6.4 圖像識別領域中的近期進展
- 介紹了一些最近的使用神經網絡的圖像識別成果,例如ImageNet的識別.
---6.5 其他的深度學習模型
- 遞歸神經網絡(RNN):與前饋神經網絡不同,RNN是某種體現出了隨時間動態變化的特性的神經網絡.它在處理時序數據和過程上效果不錯,例如語音識別或自然語言處理.
- 長短期記憶單元(LSTM):因為RNN中梯度不僅通過層反向傳播,還會根據時間反向傳播,所以不穩定梯度的問題特別嚴重.通過引入LSTM進入RNN中可以解決這個問題.
- 深度信念網絡(DBN):DBN是一種生成式模型,不僅可以用於識別,還可以進行生產.另外DBN可以進行無監督和半監督的學習.
---6.6 神經網絡的未來
- 介紹了一些關於神經網絡,深度學習,人工智能的思考.