Deep Learning - 3 改進神經網絡的學習方式

反向傳播算法是大多數神經網絡的基礎,咱們應該多花點時間掌握它。算法

還有一些技術可以幫助咱們改進反向傳播算法,從而改進神經網絡的學習方式,包括:網絡

  • 選取更好的代價函數
  • 正則化方法
  • 初始化權重的方法
  • 如何選擇網絡的超參

Cost Function

這裏來看一個很是簡單的神經元,咱們輸入1,指望它輸出0。app

咱們看看 Gradient Descent 是如何幫助咱們學習 Weights 和 Biases 的。函數

Round 1

咱們的初始值以下:
$$
Weight = 0.6 \
Bias = 0.9 \
\eta = 0.15
$$
性能

這個神經元的初始輸出是 0.82 。學習

咱們看到神經元可以迅速地學習 Weights 和 Biases ,通過300 epoch 的學習,最終輸出是 0.09,已經很接近咱們的預期 0 ,這個結果已經足夠好了。測試

Round 2

咱們修改下初始值,再來看下:
$$
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}
$$

  • a是x=1時神經元的輸出
  • y=0是期待的輸出

在激活函數是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}$ 也會變得很是小。

這就是學習速度變慢的根源。

Cross Entropy Cost Function

那麼,咱們換個代價函數能不能解決上面的問題?

再看擁有多個輸入變量神經元模型


$$
z = \sum_j w_j x_j + b
$$

  • 這裏 z 是輸入的加權求和。

咱們爲這個神經元定義交叉熵代價函數以下:
$$
C = -\frac{1}{n} \sum_x \left[y \ln a + (1-y ) \ln (1-a) \right]
$$

  • n是訓練數據的個數
  • 求和是針對全部訓練輸入樣本x
  • y是咱們對每一個樣本x所指望的相應地輸出

均方偏差代價函數和交叉熵代價函數都有兩個特色

交叉熵是正數
  1. 由Sigmoid激活函數的特性能夠知道,激活值a的取值介於0和1之間,它們的對數是負數
  2. 求和後的數是負數
  3. 整個等式前面有一個符號,最終$C>0$
當全部輸入x的輸出都能接近指望輸出y時,代價函數接近0

好比對於樣本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)$被抵消掉了,所以不會擔憂偏差太大會致使學習速度慢。相反,偏差越大咱們的神經元學習速率越大。

Round 3

再來看看使用交叉熵代價函數時的學習速度。
$$
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
$$

咱們看到和以前同樣好。

Round 4

$$
Weight = 2 \
Bias = 2 \
\eta = 0.005
$$

咱們看到偏差太大沒有致使學習速度變慢。

Softmax

激活函數除了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的單調性

函數的單調性,指函數的自變量增大或減少,函數值也增大或減少。

Softmax也有這樣的特性,當加權輸入 $z_j^L$ 增長時,激活值 $a_j^L$ 也增長。

Softmax的非局部性

sigmoid層的第j個神經元的輸出是
$$
a_j^L = \sigma(z_j^L)
$$
它是隻關於第j個神級元的加權輸入的一個函數。

而 Softmax 層的任何一個 $a_j^L$ ,都要依賴該層全部神經元的加權輸入。

反轉Softmax層

咱們有一個帶有Softmax層的神經網絡,已知激活值,那麼加權輸入爲:
$$
z_j^L = \ln a_j^L + C
$$

Log-Likelihood Cost Function

Sigmoid 輸出層與 Cross-Entropy 代價函數搭配

Softmax 輸出層與 Log-Likelihood 代價函數搭配

Log-Likelihood 代價函數的公式是:
$$
C \equiv - \ln a_y^L
$$

  • x表示輸入網絡的訓練樣本
  • y是期待的輸出,用One-Hot向量表示。y=7表示向量的第7位是1,其他位是0

若是輸入的是數字 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,每一步訓練後,計算 Validation Data 的分類準確度,一旦分類準確度達到飽和,就中止訓練。這種策略叫作 Early Stopping(提早終止)。

爲何使用 Validation Data 而不是使用 Test Data 來蘋果結果去設置超參

若是基於 Test Data 去作,有可能咱們最後的網絡是對 Test Data 過擬合的,網絡的性能不能推廣到其它數據集。

能夠將 Validation Data 看做幫助咱們學習合適超參的一種訓練數據。

這裏超參是指網絡層數,隱藏層神經元個數,學習率,批次大小。

增長數據訓練數據

增長訓練數據是下降過擬合的最好方法之一。

同樣的超參,只是訓練圖片從1000增長到50000,測試數據和訓練數據的準確度更加接近,差距從以前17.73%下降到1.53% 。

雖然過擬合依然存在,但已經大大下降,咱們的網絡能從訓練數據更好地泛化到測試數據。

Regularization

除了增長訓練數據,還能經過減少網絡規模去避免過擬合。可是咱們以爲大型網絡更有潛力,不肯意減少規模。

在固定網絡規模和固定訓練數據大小的時候,咱們還能夠選擇 Regularization(正則化)技術。

L2 Weight Decay

權重衰減是最經常使用的正則化技術,也叫 L2 Regularization(L2 正則)。它的思想是在代價函數中加入一個額外的正則化項。
$$
C = C_0 + \frac{\lambda}{2n} \sum_w w^2
$$

  • $C_0$ 是本來沒有正則化的代價函數
  • 第二項是網絡中全部 Weights 的平方和
  • $\lambda$ 是 regularization parameter(正則化參數),而且 $\lambda > 0$

當 $\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$ 是每一個樣本未進行正則化的代價

咱們看到,正則化只是增長了權重衰減。

Round 1

咱們使用 $n = 1000$ 個訓練樣本再跑一次,此次由30個隱藏層神經元,每一個mini-batch的大小是10,學習率是0.5,使用交叉熵代價函數,正則化參數 $\lambda = 0.1$。使用1000個訓練樣本。

咱們看到訓練數據的代價函數一直在降低,與以前沒有進行正則化時同樣。

可是從測試數據的準確度,咱們看到應用正則化抑制了過擬合。

準確度也從以前的82.27上升到87.1 。

Round 2

此次將訓練樣本增長到 $n=50000$ ,相應的,也須要調整正則化參數 $\lambda = 5$,讓權重衰減跟以前保持同樣。

咱們以前看到過,對於50000樣本量的訓練數據,過擬合已經再也不是個大問題了。可是應用正則化後,咱們在測試數據上的準確度從95.49%提高到96.49% 。

從經驗來看,正則化讓咱們的網絡聲稱得更好,並有效地減弱了過擬合效應。

正則化的好處

  • 減弱過擬合,
  • 提高分類準確率,
  • 避免陷入代價函數的局部最優中

使用隨機 Weights 初始化時,常常卡在代價函數的局部最優中,結果就是每次運行可能產生至關不一樣的結果。

而應用了正則化後,每次運行能夠提供更容易復現的結果。

爲何正則化可以下降過擬合

通常的說法是:某種程度上,越小的權重複雜度越低,能更簡單有效地描繪數據,因此咱們傾向於選擇這樣的權重。

L1

$$
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 成比例的量進行縮小。

  • 當 $|w|$ 很大時,L1 比 L2 縮小得少。
  • 當 $|w|$ 很小時,L1 比 L2 縮小得多。

結果是,L1 會將權值保留在少許的高重要度的鏈接上,其它權值會趨向0接近。

Dropout 棄權

L1 和 L2 正則化是對代價函數的修改。Dropout 是改變網絡自己。

假設咱們有訓練數據 x,和輸出 y,通常會經過在網絡中正向傳播 x 進行訓練,再反向傳播肯定梯度的貢獻。

當使用 Dropout 時:

  1. 咱們先隨機臨時刪除網絡中的一半的隱藏神經元,同時輸入層和輸出層的神經元保持不變。
  2. 在一個 mini-batch 中,前向傳播輸入 x ,經過修改後的網絡,而後反向傳播結果,並經過這個修改後的網絡。而後對有關權值和偏置進行更新。
  3. 重複上面的過程,先重置棄權的神經元,再選擇一個新的隱藏神經元的隨機子集,對這個不一樣的 mini-batch 估計它的梯度,而後再更新權值和偏置。

咱們棄權掉不一樣的神經元幾何,這樣就像是咱們在訓練不一樣的神經元集合。棄權過程如同大量不一樣網絡的效果的平均。不一樣的網絡會以不一樣的方式過分擬合,因此棄權過的網絡效果會減輕過擬合。

好比咱們訓練了五個網絡,其中三個把數字分類爲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 的精確度一直降低,可是咱們一開始並不知道哪些超參數應該被調整。

  • 也許問題在於不管咱們怎麼選擇超參數,30個隱藏神經元網絡永遠都不會工做得很好。
  • 咱們可能真的須要至少100個隱藏神經元?或300個隱藏神經元?或多個隱藏層?
  • 可能咱們的網絡正在學習,可是須要更多的 epoch。
  • 可能 mini-batch 過小了。
  • 可能咱們咱們應該換回 均方偏差代價函數。
  • 可能咱們須要嘗試一個不一樣的途徑來初始化權值。
  • 等等。

咱們很容易就會迷失方向。這裏咱們解釋一些啓發式的方法,幫助你開發一個工做流,能讓你更好地設置超參數。

Broad Strategy 寬泛策略

寬泛策略很差。

Learning Rate

Different Learning Rate

  • $\eta = 0.025$,代價函數平滑降低到最後回合。

  • $\eta = 0.25$ ,代價在20回合時接近飽和。後面微震盪和隨機抖動。
  • $\eta = 2.5$,代價一直震盪。

震盪的緣由是$\eta$太大,使算法在接近最小值時,又越過谷底。

隨機梯度降低指望咱們可以逐漸地抵達代價函數的谷底。

學習率太大,代價一直震盪,過小又算法變慢,若是可變學習速度會更好。開始時使用$\eta = 0.25$,接近谷底換成$\eta = 0.025$。

策略是:

  • 一開始就找到使代價震盪的 $\eta$ 的量級,也就是 $\eta$ 的 threshold。
  • 若是0.01沒有震盪,加到0.1, 1.0。
  • 若是0.01就震盪,減到0.001,0.0001。
  • 先找量級,再肯定 threshold,再將 $\eta$ 設爲 threshold 的一半。

Early Stopping

在每一個 epoch 結束時,咱們都會在驗證數據上計算分類精度。當分類精度再也不提高時,咱們就結束它。Early Stopping 會自動防止過擬合。可是在試驗的早期階段,咱們會關閉 Early Stopping ,這樣咱們可以看到任何過擬合的信號,並用這些信息去選擇正則化算法。

即便是整體趨勢在提高的狀況下,咱們也能看到精度在抖動和震盪。若是咱們在精度剛開始降低的時候就終止它,咱們確定會錯過更好的模型。一個更好的準則是當最好的分類精度一段時間都沒有提高時,再終止它。這樣既不會錯過什麼,也不會等過久。

這裏有一個準則:連續十次沒有提高就終止。可是網絡有時會在很長一段時間內,分類精度很平緩,而後纔會有提高。若是你想要得到更好的性能,這個準則就太草率了。

Learning Rate Schedule

咱們一直將 $\eta$ 設置爲常量。一開始,咱們會使用一個大的學習速率,讓權值變化地快一點。而後,咱們減少學習速率,這樣能夠對權值作出更加精良的調整。

一個觀點是保持學習速率不變,直到驗證數據集精度開始變差時,按照 1/2 或 1/10 去下降學習速率。這樣重複幾回,直到學習學習速率變爲初始值的 1/1000,就中止。

相關文章
相關標籤/搜索