文章目錄
- 第1章 Python入門
- 第2章 感知機
- 第3章 神經網絡
- 第4章 神經網絡的學習
- 第5章 誤差反向傳播
- 第6章 與學習相關的技巧
- 1. 各種參數更新的方法
- 2. 權重的初始值
- 第7章 卷積神經網絡
原書鏈接(感謝作者,書是真的經典,建議購買紙質書):https://github.com/zjcao/books/blob/master/%E3%80%8A%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E5%85%A5%E9%97%A8%EF%BC%9A%E5%9F%BA%E4%BA%8EPython%E7%9A%84%E7%90%86%E8%AE%BA%E4%B8%8E%E5%AE%9E%E7%8E%B0%E3%80%8B_%E4%B8%AD%E6%96%87%E7%89%88.pdf
第1章 Python入門
主要介紹了Python的定義、安裝以及簡單語法,除此之外還介紹了一下Numpy包和Matplotlib包的用法,大多為Python相關的基礎知識。
第2章 感知機
與電流做類比,簡明扼要地介紹了感知機中輸入值如何被激活,以及如何用感知機來實現:與門、與非門和或門。
引入權重和偏置的概念:
w1和w2是控制輸入信號的重要性的參數,而偏置是調
整神經元被激活的容易程度(輸出信號為1的程度)的參數。
然后提到了感知機的局限性,感知機對于線性不可分(異或)問題是無法解決的,但是多層感知機可以解決。
最后還提到了,理論上:
2層感知機(嚴格地說是激活函數使用了非線性的sigmoid函數的感知機,具
體請參照下一章)可以表示任意函數
。
第3章 神經網絡
原文提到的值得記錄的一點是:
- 激活函數是連接感知機和神經網絡的橋梁。
- 實際上,如果將激活函數從階躍函數換成其他函數,就可以進入神經網絡的世界了。
接下來介紹了sigmoid函數,階躍函數以及它們的實現,并對比了兩者的不同:
- 首先注意到的是“平滑性”的不同。sigmoid函數是一條平滑的曲線,輸出隨著輸入發生連續性的變化。而階躍函數以0為界,輸出發生急劇性的變化。
- 另一個不同點是,相對于階躍函數只能返回0或1,sigmoid函數可以返回0.731 …、0.880 …等實數(這一點和剛才的平滑性有關)。
以及相同:
- 當輸入信號為重要信息時,階躍函數和sigmoid函數都會輸出較大的值;當輸入信號為不重要的信息時,兩者都輸出較小的值。
- 還有一個共同點是,不管輸入信號有多小,或者有多大,輸出信號的值都在0到1之間。
然后還介紹了另一種激活函數:ReLU函數。
3.3節 介紹了神經網絡中運算的數學基礎知識-矩陣運算并介紹神經網絡的內積。
3.4節 3.5節 介紹3層神經網絡的理論實現以及代碼實現,并介紹了輸出層的恒等函數和softmax函數。其中: 一般地,回歸問題可以使用恒等函數,二元分類問題可以使用 sigmoid函數,多元分類問題可以使用 softmax函數 。最后提到輸出的神經元數量需要根據待解決的問題來決定。對于分類問題,輸出層的神經元數量一般設定為類別的數量。
問題類型 | 最后一層激活 | 損失函數 |
---|---|---|
二元分類問題 | sigmoid | binary_crossentropy |
多分類、單標簽問題 | softmax | categorical_crossentropy |
多分類、多標簽問題 | sigmoid | binary_crossentropy |
回歸到任意值 | 無 | mse |
回歸到0~1范圍內的值 | sigmoid | mse或sigmoid |
最后是舉一個例子,手寫數字識別的實現,再次詮釋神經網絡的神奇。
第4章 神經網絡的學習
首先介紹數據驅動的觀點,然后把數據分為
訓練數據
和
測試數據
,然后介紹了兩種損失函數,
均方誤差
和
交叉熵誤差
。
然后擴展到mini-batch學習:神經網絡的學習也是從訓練數據中選出一批數據(稱為mini-batch, 小批量),然后對每個mini-batch 進行學習。比如,從60000 個訓練數據中隨機
選擇100 筆,再用這100 筆數據進行學習。這種學習方式稱為mini-batch 學習。
求所有訓練數據的損失函數的總和,以交叉熵誤差為例。
然后介紹數值微分的求解,并計算梯度。
知識點:
-
epoch是一個單位。一個epoch表示學習中所有訓練數據均被使用過
一次時的更新次數。比如,對于10000 筆訓練數據,用大小為100
筆數據的mini-batch 進行學習時,重復隨機梯度下降法100 次,所
有的訓練數據就都被“看過”了A。此時,100次就是一個epoch。
第5章 誤差反向傳播
開始作者為了介紹計算圖,舉了買蘋果的栗子,然后講到反向傳播,比較重要的有兩點,加法節點的反向傳播和乘法節點的反向傳播。
值得記錄的一點,由于Softmax對于輸出的大小關系是不會有影響的,因此在推理(測試)的時候可以不用,但是訓練的時候要用到,因為要與交叉熵組合為Softmax-with-Loss層來計算反向傳播的誤差。
然后代碼實現誤差反向傳播,其中 要更好地理解程序,一定要跟著程序跑一遍 。
第6章 與學習相關的技巧
這里關于學習的技巧總結起來有這幾點:
-
- 參數更新的方法
-
- 權重初始值的選取
-
- Batch Normalization(批歸一化)
-
- 正則化(權值衰減和dropout)
-
- 超參數的驗證(驗證集)
1. 各種參數更新的方法
這幾種優化方法的實驗對比:
結論:從圖6-9 的結果中可知,與SGD相比,其他3 種方法學習得更快,而且速度基本相同,仔細看的話,AdaGrad的學習進行得稍微快一點。這個實驗需要注意的地方是,實驗結果會隨學習率等超參數、神經網絡的結構(幾層深等)的不同而發生變化。不過,一般而言,與SGD相比,其他3 種方法可以學習得更快,有時最終的識別精度也更高。
2. 權重的初始值
- 為什么不能將初始值設為0?
因為在誤差反向傳播法中,所有的權重值都會進行相同的更新。比如,在2 層神經網絡中,假設第1 層和第2 層的權重為0。這樣一來,正向傳播時,因為輸入層的權重為0,所以第2 層的神經元全部會被傳遞相同的值。第2 層的神經元中全部輸入相同的值,這意味著反向傳播時第2 層的權重全部都會進行相同的更新(回憶一下“乘法節點的反向傳播”6.2 權重的初始值 177的內容)。因此,權重被更新為相同的值,并擁有了對稱的值(重復的值)。這使得神經網絡擁有許多不同的權重的意義喪失了。為了防止“權重均一化”(嚴格地講,是為了瓦解權重的對稱結構),必須隨機生成初始值。
歸一化和正則化這里就不說了,在提到一點就是,超參數的選擇,一般說參數指的權重和偏置是可以訓練出來的,而所謂超參數是那些人為設定好的參數,所謂的調參也就是指調超參數。這里需要注意,一般把數據集分為訓練集、驗證集和測試集。
我的理解,一般先用驗證集來選取最佳的超參數,有很多方法包括網格搜索、隨機采樣又或者貝葉斯最優化。然后再用訓練集來訓練出參數,最后用測試集測試效果。
書上提到,比較理想的情況下測試集只用一次。
第7章 卷積神經網絡
其實筆者早在16年開始接觸深度學習,最開始就是學習了一些簡單的機器學習知識(主要是NG老師的課和統計學習方法),就接觸CNN,一開始是真的蒙蔽,以至于覺得圖像好難好難,這次再看,有了很大的改觀,這里更多的是心得。
其實理解上上面章節的知識,理解卷積神經網絡(CNN)真的是
特別簡單
!
- 卷積層是用來提取圖像的特征的;
- 全連接層就是神經網絡的全連接版!!把卷積層收集的特征,再次激活,并分類;
- 至于為什么一般接兩層全連接層,請看感知機兩層的效果(當然激活函數是非線性的)。當然是兩層理論上就可以處理任何非線性問題了!
- 還有就是,為什么要有卷積層,我的理解是,有些圖像太大,而且會有多層,所以直接神經網絡分類奇慢,所以需要卷積的方式提取特征,其實也是神經網絡的思想,只不過可以理解為局部神經網絡,并可以保留空間的信息。
最后一章深度學習就不再記錄。
最后一點感悟,理論確實要與代碼結合,代碼得去跑和理解。
最后最后,代碼要與業務結合,工程上利用理論和代碼把業務處理好才是王道!!
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
