本文爲《深度學習入門 基於Python的理論與實現》的部分讀書筆記
代碼以及圖片均參考此書
目錄
複習感知機
- 之前介紹的樸素感知機:
- 現在明確地寫出樸素感知機中的激活函數h(x)(階躍函數)
- 階躍函數的實現
def step_function(x):
return np.array(x > 0, dtype=np.int)
激活函數(activation function)
一般而言,“樸素感知機”是指單層網絡,指的是激活函數使用了階躍函數的模型。“多層感知機”是指神經網絡,即使用sigmoid函數等平滑的激活函數的多層網絡。
神經網絡的激活函數必須使用非線性函數。因爲線性函數的問題在於,不管如何加深層數,總是存在與之等效的“無隱藏層的神經網絡”。使用線性函數的話,加深神經網絡的層數就沒有意義了。因此,爲了發揮疊加層所帶來的優勢,激活函數必須使用非線性函數。
sigmoid函數
- sigmoid函數的實現:
def sigmoid(x):
return 1 / (1 + np.exp(-x))
- sigmoid函數的優點:sigmoid函數是一條平滑的曲線,輸出隨着輸入發生連續性的變化。而階躍函數以0爲界,輸出發生急劇性的變化。sigmoid 函數的平滑性對神經網絡的學習具有重要意義
- sigmoid函數的缺點:計算量較大且容易出現梯度消失。sigmoid函數兩側的特徵導數接近於0,這將導致在梯度反向傳播時損失的誤差難以傳遞到前面的網絡層
tanh函數
- tanhx = 2sigmoid(2x) - 1
- tanh函數的實現:
def tanh(x):
return 1 - 2 / (np.exp(2 * x) + 1)
ReLU(Rectified Linear Unit)函數
- relu函數的實現:
def relu(x):
return np.maximum(0, x)
- relu函數可以緩減梯度消失現象
神經網絡的前向傳播
- 下面將簡單實現三層神經網絡的前向傳播
下圖的網絡一共由4層神經元構成,但實質上只有3層神經元有權重,因此將其稱爲“3 層網絡”。第0層對應輸入層,第1,2層對應中間層,第3層對應輸出層
通過矩陣點積運算打包神經網絡的運算
引入符號
各層間信號傳遞的實現
如果使用矩陣的乘法運算,則上式可表示爲:
矩陣W的形狀:(上一層的神經元個數, 下一層的神經元個數)
輸出層的激活函數不同於隱藏層的激活函數,一般:
- 迴歸問題用恆等函數
- 二元分類問題用sigmoid函數
- 多元分類問題用softmax函數
上述前向傳播的過程可以總結爲以下代碼(完整的代碼實現放在後面):
輸出層的設計
softmax函數
-
溢出問題
softmax 函數的實現中要進行指數函數的運算,但是此時指數函數的值很容易變得非常大。比如,e10 的值會超過20000,e100 會變成一個後面有40 多個0 的超大值,e1000 的結果會返回一個表示無窮大的inf。如果在這些超大值之間進行除法運算,結果會出現“不確定”的情況。
式(3.11)說明,在進行softmax 的指數函數的運算時,加上(或者減去)某個常數並不會改變運算的結果。這裏的C’可以使用任何值,但是爲了防止溢出,一般會使用輸入信號中的最大值。 -
softmax函數實現:
def softmax(x):
x = x - np.max(x) # 溢出對策
return np.exp(x) / np.sum(np.exp(x))
- 輸出層的各個神經元都受到所有輸入信號的影響
- softmax函數的輸出是0.0 到1.0之間的實數。並且,softmax函數的輸出值的總和是1。因此可以把softmax 函數的輸出解釋爲結果屬於某個類別的“概率”。
- 即便使用softmax 函數,各個元素之間的大小關係也不會改變。求解機器學習問題的步驟可以分爲“學習”和“推理”兩個階段。在實際的問題中,由於指數函數的運算需要一定的計算機運算量,因此推理階段一般會省略輸出層的softmax 函數。在輸出層使用softmax 函數是因爲它和神經網絡的學習有關係。
輸出層的神經元數量
- 對於分類問題,輸出層的神經元數量一般設定爲類別的數量。比如,對於某個輸入圖像,預測
是圖中的數字0 到9 中的哪一個的問題(10 類別分類問題),可以像圖3-23 這樣,將輸出層的神經元設定爲10 個。
批處理
- 以圖像大小爲28*28=784的Mnist數據集爲例,構建三層神經網絡,兩個隱藏層,第一層50個神經元,第二層100個神經元,輸出爲圖像屬於10個類別的概率。單個圖像輸入時數組形狀的變化如下:
- 下面考慮打包輸入100張圖像的情況:
可以看出輸入的100張圖像的結果被一次性輸出了,這種打包式的輸入數據稱爲批(batch)
批處理對計算機的運算大有利處,可以大幅縮短每張圖像的處理時間。那麼爲什麼批處理可以縮短處理時間呢?這是因爲大多數處理數值計算的庫都進行了能夠高效處理大型數組運算的最優化。並且,
在神經網絡的運算中,當數據傳送成爲瓶頸時,批處理可以減輕數據總線的負荷(嚴格地講,相對於數據讀入,可以將更多的時間用在計算上)。也就是說,批處理一次性計算大型數組要比分開逐步計算
各個小型數組速度更快。