《深度學習入門——基於Python的理論與實現》筆記心得

原書鏈接(感謝作者,書是真的經典,建議購買紙質書):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函數,階躍函數以及它們的實現,並對比了兩者的不同:

  1. 首先注意到的是“平滑性”的不同。sigmoid函數是一條平滑的曲線,輸出隨着輸入發生連續性的變化。而階躍函數以0爲界,輸出發生急劇性的變化。
  2. 另一個不同點是,相對於階躍函數只能返回0或1,sigmoid函數可以返回0.731 …、0.880 …等實數(這一點和剛纔的平滑性有關)。

以及相同:

  1. 當輸入信號爲重要信息時,階躍函數和sigmoid函數都會輸出較大的值;當輸入信號爲不重要的信息時,兩者都輸出較小的值。
  2. 還有一個共同點是,不管輸入信號有多小,或者有多大,輸出信號的值都在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 學習。

求所有訓練數據的損失函數的總和,以交叉熵誤差爲例。
在這裏插入圖片描述
然後介紹數值微分的求解,並計算梯度。

知識點:

  1. epoch是一個單位。一個epoch表示學習中所有訓練數據均被使用過
    一次時的更新次數。比如,對於10000 筆訓練數據,用大小爲100
    筆數據的mini-batch 進行學習時,重複隨機梯度下降法100 次,所
    有的訓練數據就都被“看過”了A。此時,100次就是一個epoch。

第5章 誤差反向傳播

開始作者爲了介紹計算圖,舉了買蘋果的栗子,然後講到反向傳播,比較重要的有兩點,加法節點的反向傳播和乘法節點的反向傳播。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
值得記錄的一點,由於Softmax對於輸出的大小關係是不會有影響的,因此在推理(測試)的時候可以不用,但是訓練的時候要用到,因爲要與交叉熵組合爲Softmax-with-Loss層來計算反向傳播的誤差。

然後代碼實現誤差反向傳播,其中要更好地理解程序,一定要跟着程序跑一遍

第6章 與學習相關的技巧

這裏關於學習的技巧總結起來有這幾點:

    1. 參數更新的方法
    1. 權重初始值的選取
    1. Batch Normalization(批歸一化)
    1. 正則化(權值衰減和dropout)
    1. 超參數的驗證(驗證集)

1. 各種參數更新的方法

在這裏插入圖片描述
這幾種優化方法的實驗對比:
在這裏插入圖片描述
結論:從圖6-9 的結果中可知,與SGD相比,其他3 種方法學習得更快,而且速度基本相同,仔細看的話,AdaGrad的學習進行得稍微快一點。這個實驗需要注意的地方是,實驗結果會隨學習率等超參數、神經網絡的結構(幾層深等)的不同而發生變化。不過,一般而言,與SGD相比,其他3 種方法可以學習得更快,有時最終的識別精度也更高。

2. 權重的初始值

  • 爲什麼不能將初始值設爲0?

因爲在誤差反向傳播法中,所有的權重值都會進行相同的更新。比如,在2 層神經網絡中,假設第1 層和第2 層的權重爲0。這樣一來,正向傳播時,因爲輸入層的權重爲0,所以第2 層的神經元全部會被傳遞相同的值。第2 層的神經元中全部輸入相同的值,這意味着反向傳播時第2 層的權重全部都會進行相同的更新(回憶一下“乘法節點的反向傳播”6.2 權重的初始值 177的內容)。因此,權重被更新爲相同的值,並擁有了對稱的值(重複的值)。這使得神經網絡擁有許多不同的權重的意義喪失了。爲了防止“權重均一化”(嚴格地講,是爲了瓦解權重的對稱結構),必須隨機生成初始值。

  • 當激活函數使用ReLU時,權重初始值使用He初始值,當激活函數爲sigmoid 或tanh 等S 型曲線函數時,初始值使用Xavier 初始值。
    在這裏插入圖片描述在這裏插入圖片描述

歸一化和正則化這裏就不說了,在提到一點就是,超參數的選擇,一般說參數指的權重和偏置是可以訓練出來的,而所謂超參數是那些人爲設定好的參數,所謂的調參也就是指調超參數。這裏需要注意,一般把數據集分爲訓練集、驗證集和測試集。

我的理解,一般先用驗證集來選取最佳的超參數,有很多方法包括網格搜索、隨機採樣又或者貝葉斯最優化。然後再用訓練集來訓練出參數,最後用測試集測試效果。

書上提到,比較理想的情況下測試集只用一次。

第7章 卷積神經網絡

其實筆者早在16年開始接觸深度學習,最開始就是學習了一些簡單的機器學習知識(主要是NG老師的課和統計學習方法),就接觸CNN,一開始是真的矇蔽,以至於覺得圖像好難好難,這次再看,有了很大的改觀,這裏更多的是心得。

在這裏插入圖片描述
其實理解上上面章節的知識,理解卷積神經網絡(CNN)真的是特別簡單

  1. 卷積層是用來提取圖像的特徵的;
  2. 全連接層就是神經網絡的全連接版!!把卷積層收集的特徵,再次激活,並分類;
  3. 至於爲什麼一般接兩層全連接層,請看感知機兩層的效果(當然激活函數是非線性的)。當然是兩層理論上就可以處理任何非線性問題了!
  4. 還有就是,爲什麼要有卷積層,我的理解是,有些圖像太大,而且會有多層,所以直接神經網絡分類奇慢,所以需要卷積的方式提取特徵,其實也是神經網絡的思想,只不過可以理解爲局部神經網絡,並可以保留空間的信息。

最後一章深度學習就不再記錄。

最後一點感悟,理論確實要與代碼結合,代碼得去跑和理解。

最後最後,代碼要與業務結合,工程上利用理論和代碼把業務處理好纔是王道!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章