反向傳播算法是大多數神經網絡的基礎,咱們應該多花點時間掌握它。算法
還有一些技術可以幫助咱們改進反向傳播算法,從而改進神經網絡的學習方式,包括:網絡
這裏來看一個很是簡單的神經元,咱們輸入1,指望它輸出0。app
咱們看看 Gradient Descent 是如何幫助咱們學習 Weights 和 Biases 的。函數
咱們的初始值以下:
$$
Weight = 0.6 \
Bias = 0.9 \
\eta = 0.15
$$
性能
這個神經元的初始輸出是 0.82 。學習
咱們看到神經元可以迅速地學習 Weights 和 Biases ,通過300 epoch 的學習,最終輸出是 0.09,已經很接近咱們的預期 0 ,這個結果已經足夠好了。測試
咱們修改下初始值,再來看下:
$$
Weight = 2 \
Bias = 2 \
\eta = 0.15
$$
ui
這個神經元的初始輸出是 0.98 。3d
儘管 Learning Rate 同樣,可是咱們看到學習在一開始很是緩慢。看起來在前150 epoch ,Weights 和 Biases 都沒有改變太多。blog
從這個例子咱們能夠看出,人工神經元在偏差很大的時候,學習遇到了問題,學習速度變慢了。
神經元的學習方式:
經過計算代價函數的偏導 $\frac{\partial C}{\partial w}$ 和 $\frac{\partial C}{\partial b}$ 來改變 Weights 和 Biases 。
咱們說學習速度變慢,其實是在說偏導很小。
咱們的代價函數是均方偏差代價函數
$$
C = \frac{ (y-a)^2 }{2}
$$
在激活函數是Sigmoid函數時
$$
a = \sigma(z) \
z = wx+b
$$
代價函數的偏導是
$$
\frac{\partial C}{\partial w} = (a-y) \sigma'(z) x \
\frac{\partial C}{\partial b} = (a-y) \sigma'(z) \
$$
當x=1,y=0時
$$
\frac{\partial C}{\partial w} = a \sigma'(z) \
\frac{\partial C}{\partial b} = a \sigma'(z) \
$$
咱們來看下Sigmoid函數的形狀
當神經元的輸出接近1時,曲線變得很是平緩,$\sigma'(z)$ 就變得很是小,從而 代價函數的偏導 $\frac{\partial C}{\partial w}$ 和 $\frac{\partial C}{\partial b}$ 也會變得很是小。
這就是學習速度變慢的根源。
那麼,咱們換個代價函數能不能解決上面的問題?
再看擁有多個輸入變量神經元模型
$$
z = \sum_j w_j x_j + b
$$
咱們爲這個神經元定義交叉熵代價函數以下:
$$
C = -\frac{1}{n} \sum_x \left[y \ln a + (1-y ) \ln (1-a) \right]
$$
好比對於樣本x,它的
$$
y = 0 \
a \approx 0
$$
這樣,等式的第一項就是0
從圖上能夠看出,等式的第二項$\ln(1-a) \approx 0$
對於樣本x
$$
y = 1 \
a \approx 1
$$
等式的第二項爲0
等式的第一項$\ln a \approx 0$
上面兩種狀況,交叉熵代價函數都約等於0
先看下交叉熵關於權重的偏導
$$
\frac{\partial C}{\partial w_j} = -\frac{1}{n} \sum_x \left(
\frac{y }{\sigma(z)} -\frac{(1-y)}{1-\sigma(z)} \right)
\frac{\partial \sigma}{\partial w_j}
\
= -\frac{1}{n} \sum_x \left(
\frac{y}{\sigma(z)}
-\frac{(1-y)}{1-\sigma(z)} \right)\sigma'(z) x_j
$$
通分簡化後
$$
\begin{eqnarray}
\frac{\partial C}{\partial w_j} & = & \frac{1}{n}
\sum_x \frac{\sigma'(z) x_j}{\sigma(z) (1-\sigma(z))}
(\sigma(z)-y).
\tag{60}\end{eqnarray}
$$
咱們知道$\sigma'$
$$
\sigma(z) = \frac{1}{1+e^{-z}} \
\sigma'(z) = \sigma(z)(1-\sigma(z))
$$
代入到上面的公式中
$$
\frac{\partial C}{\partial w_j} = \frac{1}{n} \sum_x x_j(\sigma(z)-y)
$$
從交叉熵關於權重的偏導中,咱們看到權重的學習速率能夠是被輸出結果的偏差所控制。
以前均方偏差關於權重的偏導中,偏差太大致使$\sigma'(z)$很是小,形成學習速度很是慢。
如今交叉熵關於權重的偏導中,$\sigma'(z)$被抵消掉了,所以不會擔憂偏差太大會致使學習速度慢。相反,偏差越大咱們的神經元學習速率越大。
再來看看使用交叉熵代價函數時的學習速度。
$$
Weight = 0.6 \
Bias = 0.9 \
\eta = 0.15
$$
對於交叉熵代價函數而言,Learning Rate = 0.15 過高了,學得太快,以致於咱們看不清楚代價函數的值是如何變化的。
這裏將 Learning Rate 換成 0.005 再看一次。
$$
Weight = 0.6 \
Bias = 0.9 \
\eta = 0.005
$$
咱們看到和以前同樣好。
$$
Weight = 2 \
Bias = 2 \
\eta = 0.005
$$
咱們看到偏差太大沒有致使學習速度變慢。
激活函數除了Sigmoid,還有Softmax。
第j個輸出神經元的激活值 $a_j^L$ 是
$$
a_j^L = \frac{e^{z_j^L}}{\sum_k e^{z_k^L}}
$$
分母是對全部輸出神經元求和。
從公式咱們能夠看出,Softmax層的全部輸出激活值都是正數,而且它們加起來和爲1。
這樣就能夠把Softmax層獲得的輸出看做是一個機率分佈,將數據激活值 $a_j^L$看做是神經網絡認爲結果是 j 的機率。
函數的單調性,指函數的自變量增大或減少,函數值也增大或減少。
Softmax也有這樣的特性,當加權輸入 $z_j^L$ 增長時,激活值 $a_j^L$ 也增長。
sigmoid層的第j個神經元的輸出是
$$
a_j^L = \sigma(z_j^L)
$$
它是隻關於第j個神級元的加權輸入的一個函數。
而 Softmax 層的任何一個 $a_j^L$ ,都要依賴該層全部神經元的加權輸入。
咱們有一個帶有Softmax層的神經網絡,已知激活值,那麼加權輸入爲:
$$
z_j^L = \ln a_j^L + C
$$
Sigmoid 輸出層與 Cross-Entropy 代價函數搭配
Softmax 輸出層與 Log-Likelihood 代價函數搭配
Log-Likelihood 代價函數的公式是:
$$
C \equiv - \ln a_y^L
$$
若是輸入的是數字 7 對應的圖像,那麼 Log-Likelihood 代價是
$$
-\ln a_7^L
$$
若是網絡工做很好,對輸出 7 很是自信,$a_7^L$ 會很是接近1,那麼$-\ln a_7^L$ 就會很小。
若是網絡工做很差,機率 $a_7^L$ 會很小,而 $-\ln a_7^L$ 會很大。
$$
\frac{\partial C}{\partial b^L_j} = a^L_j-y_j
\
\frac{\partial C}{\partial w^L_{jk}} = a^{L-1}_k (a^L_j-y_j)
$$
這些表達式確保咱們不會遇到學習速度衰退的問題。
$\delta_j^L = a_j^L - y_j$
Johnny von Neumann 說四個參數能夠模擬一頭大象,五個參數可讓它搖動鼻子。
Enrico Fermi 認爲,擁有大量自由參數的模型可以描述一個足夠寬泛的現象。即便這樣的模型與現有數據擬合得很是好,但它並無真正地洞察到現象背後的本質,以致於不能普及到新的狀況上。
訓練數據的代價
測試數據的準確度
測試數據的代價
訓練數據的準確度
咱們看到,訓練數據的代價一直在降低,這可能讓咱們以爲模型彷佛一直在改進。
可是從測試數據的準確度來看,280 epoch 後就幾乎中止改善。
從測試數據的代價來看,更直觀,在15 epoch前代價一直在下降,但以後卻開始變大。而訓練數據的代價是一直在下降的。
從訓練數據的準確度來看,訓練數據的準確率上升到100%,能正確分類全部的訓練數據,可是在測試數據上的準確率卻直郵82.27% 。
以上種種跡象代表,280 epoch 開始的網絡產生了 OverFitting 。
在含有大量 Weights 和 Biases 參數時,神經網絡很容易過擬合。咱們須要跟蹤網絡訓練過程當中測試數據的準確度,若是測數據集的準確度不在提升,就應該中止訓練。
咱們引入 Validation Data,每一步訓練後,計算 Validation Data 的分類準確度,一旦分類準確度達到飽和,就中止訓練。這種策略叫作 Early Stopping(提早終止)。
若是基於 Test Data 去作,有可能咱們最後的網絡是對 Test Data 過擬合的,網絡的性能不能推廣到其它數據集。
能夠將 Validation Data 看做幫助咱們學習合適超參的一種訓練數據。
這裏超參是指網絡層數,隱藏層神經元個數,學習率,批次大小。
增長訓練數據是下降過擬合的最好方法之一。
同樣的超參,只是訓練圖片從1000增長到50000,測試數據和訓練數據的準確度更加接近,差距從以前17.73%下降到1.53% 。
雖然過擬合依然存在,但已經大大下降,咱們的網絡能從訓練數據更好地泛化到測試數據。
除了增長訓練數據,還能經過減少網絡規模去避免過擬合。可是咱們以爲大型網絡更有潛力,不肯意減少規模。
在固定網絡規模和固定訓練數據大小的時候,咱們還能夠選擇 Regularization(正則化)技術。
權重衰減是最經常使用的正則化技術,也叫 L2 Regularization(L2 正則)。它的思想是在代價函數中加入一個額外的正則化項。
$$
C = C_0 + \frac{\lambda}{2n} \sum_w w^2
$$
當 $\lambda$ 較小時,咱們偏好最小化原來的代價函數,當 $\lambda$ 較大時,咱們讓網絡偏好學習更小的 Weights 。
在正則化的網絡中應用隨機梯度降低算法,對上面的公式求偏導可知:
$$
\frac{\partial C}{\partial w} = \frac{\partial C_0}{\partial w} + \frac{\lambda}{n} w \
\frac{\partial C}{\partial b} = \frac{\partial C_0}{\partial b}
$$
只要照常使用反向傳播,並把 $\frac{\lambda}{n} w$ 代入
$$
b \rightarrow b - \eta \frac{\partial C_0}{\partial b} \
w \rightarrow w - \eta \frac{\partial C_0}{\partial w} - \frac{\eta \lambda}{n} w \
= \left(1 - \frac{\eta \lambda}{n}\right) w - \eta \frac{\partial C_0}{\partial w}
$$
咱們看到,跟以前惟一的變化時,咱們用 $\left(1 - \frac{\eta \lambda}{n}\right) $ 來調整 Weights ,這種調叫作 Weight Decay(權重衰減)。
以前咱們的隨機梯度降低,時在包含m個訓練樣本的mini-batch數據中進行平均以估計$\frac{\partial C_0}{\partial w}$,如今對於隨機梯度降低法而言正則化的學習方法變成了:
$$
w \rightarrow \left(1 - \frac{\eta \lambda}{n}\right) w - \frac{\eta}{m} \sum_x \frac{\partial C_x}{\partial w} \
b \rightarrow b - \frac{\eta}{m} \sum_x \frac{\partial C_x}{\partial wb}
$$
$\sum$ 是針對mini-batch中全部訓練樣本進行求和
$C_x$ 是每一個樣本未進行正則化的代價
咱們看到,正則化只是增長了權重衰減。
咱們使用 $n = 1000$ 個訓練樣本再跑一次,此次由30個隱藏層神經元,每一個mini-batch的大小是10,學習率是0.5,使用交叉熵代價函數,正則化參數 $\lambda = 0.1$。使用1000個訓練樣本。
咱們看到訓練數據的代價函數一直在降低,與以前沒有進行正則化時同樣。
可是從測試數據的準確度,咱們看到應用正則化抑制了過擬合。
準確度也從以前的82.27上升到87.1 。
此次將訓練樣本增長到 $n=50000$ ,相應的,也須要調整正則化參數 $\lambda = 5$,讓權重衰減跟以前保持同樣。
咱們以前看到過,對於50000樣本量的訓練數據,過擬合已經再也不是個大問題了。可是應用正則化後,咱們在測試數據上的準確度從95.49%提高到96.49% 。
從經驗來看,正則化讓咱們的網絡聲稱得更好,並有效地減弱了過擬合效應。
使用隨機 Weights 初始化時,常常卡在代價函數的局部最優中,結果就是每次運行可能產生至關不一樣的結果。
而應用了正則化後,每次運行能夠提供更容易復現的結果。
通常的說法是:某種程度上,越小的權重複雜度越低,能更簡單有效地描繪數據,因此咱們傾向於選擇這樣的權重。
$$
C = C_0 + \frac{\lambda}{n} \sum_w |w|
$$
咱們再來看下L2正則的代價函數
$$
C = C_0 + \frac{\lambda}{2n} \sum_w w^2
$$
對L1代價函數求偏導
$$
\frac{\partial C}{\partial w} = \frac{\partial C_0}{\partial w} + \frac{\lambda}{n} sgn(w)
$$
$sgn(w)$是取w的符號,當w爲正數時,$sgn(w) = +1$。當w爲負數時,$sgn(w) = -1$。
對反向傳播進行修改,使用基於L1正則化的隨機梯度降低進行學習。
$$
w \rightarrow w' = w - \frac{\eta \lambda}{n} sgn(w) - \eta \frac{\partial C_0}{\partial w}
$$
咱們可使用 mini-batch 的均值去估計 $\frac{ \partial C_0}{\partial w}$,
$$
w \rightarrow w' = (1 - \frac{\eta \lambda}{n}) w - \eta \frac{\partial C_0}{\partial w}
$$
咱們再來看下L2正則的:
$$
w \rightarrow w' = \left(1 - \frac{\eta \lambda}{n}\right) w - \frac{\eta}{m} \sum_x \frac{\partial C_x}{\partial w}
$$
L1 和 L2 的共同點是都懲罰大的權重。
L1 中,權值經過一個常量向 0 縮小。
L2中,權值經過一個和 w 成比例的量進行縮小。
結果是,L1 會將權值保留在少許的高重要度的鏈接上,其它權值會趨向0接近。
L1 和 L2 正則化是對代價函數的修改。Dropout 是改變網絡自己。
假設咱們有訓練數據 x,和輸出 y,通常會經過在網絡中正向傳播 x 進行訓練,再反向傳播肯定梯度的貢獻。
當使用 Dropout 時:
咱們棄權掉不一樣的神經元幾何,這樣就像是咱們在訓練不一樣的神經元集合。棄權過程如同大量不一樣網絡的效果的平均。不一樣的網絡會以不一樣的方式過分擬合,因此棄權過的網絡效果會減輕過擬合。
好比咱們訓練了五個網絡,其中三個把數字分類爲3,那極可能就是3了。
在圖像、語音識別、天然語言處理時,頗有效。大規模深度網絡時也頗有用,由於這樣的網絡過擬合問題特別突出。
通常咱們認爲大量的訓練數據會獲得更好的性能。
但這個代價很大。有時咱們能夠人爲擴展訓練數據,好比圖片5,將其作一個旋轉,轉換,扭曲,都懂,使用擴展後的訓練數據來提高網絡的性能。
更多的訓練數據能補償不一樣算法的差距。
以前咱們一直用均值爲0,標準差爲1的獨立高斯隨機變量來選擇權值和偏置。
其實用歸一化的高斯分佈不是最好的。
跟之前的歸一化問題同樣,若是權值大,$z$ 也大,$\sigma ( z )$ 就接近 1 或 0,隱藏層神經元會飽和,梯度降低算法學習慢。
以前咱們經過選擇不一樣的代價函數來解決,但那只是對輸出神經元有效,對隱藏神經元不起做用。
假設咱們有一個神經元,它的輸入權值是 $n_{in}$,而後咱們用均值是0,標準差是 $\frac{1}{\sqrt{n_{in}}}$ 的高斯隨機變量來初始化這些權值。
這樣,$z = \sum_j w_j x_j +b$ 的取值更小。
這樣的神經元更不容易飽和,也更不可能使學習速度降低。
$\frac{1}{\sqrt{n_{in}}}$ 權值初始化,能夠加快訓練速度,有時也能提高網絡的最終性能。
每一 epoch 的精確度一直降低,可是咱們一開始並不知道哪些超參數應該被調整。
咱們很容易就會迷失方向。這裏咱們解釋一些啓發式的方法,幫助你開發一個工做流,能讓你更好地設置超參數。
寬泛策略很差。
$\eta = 0.025$,代價函數平滑降低到最後回合。
$\eta = 2.5$,代價一直震盪。
震盪的緣由是$\eta$太大,使算法在接近最小值時,又越過谷底。
隨機梯度降低指望咱們可以逐漸地抵達代價函數的谷底。
學習率太大,代價一直震盪,過小又算法變慢,若是可變學習速度會更好。開始時使用$\eta = 0.25$,接近谷底換成$\eta = 0.025$。
策略是:
在每一個 epoch 結束時,咱們都會在驗證數據上計算分類精度。當分類精度再也不提高時,咱們就結束它。Early Stopping 會自動防止過擬合。可是在試驗的早期階段,咱們會關閉 Early Stopping ,這樣咱們可以看到任何過擬合的信號,並用這些信息去選擇正則化算法。
即便是整體趨勢在提高的狀況下,咱們也能看到精度在抖動和震盪。若是咱們在精度剛開始降低的時候就終止它,咱們確定會錯過更好的模型。一個更好的準則是當最好的分類精度一段時間都沒有提高時,再終止它。這樣既不會錯過什麼,也不會等過久。
這裏有一個準則:連續十次沒有提高就終止。可是網絡有時會在很長一段時間內,分類精度很平緩,而後纔會有提高。若是你想要得到更好的性能,這個準則就太草率了。
咱們一直將 $\eta$ 設置爲常量。一開始,咱們會使用一個大的學習速率,讓權值變化地快一點。而後,咱們減少學習速率,這樣能夠對權值作出更加精良的調整。
一個觀點是保持學習速率不變,直到驗證數據集精度開始變差時,按照 1/2 或 1/10 去下降學習速率。這樣重複幾回,直到學習學習速率變爲初始值的 1/1000,就中止。