1. 交叉熵代價函數
采用MSE作為代價函數存在一個問題,那么就是當人工神經元在其犯錯比較大的情況下學習很有難度。這里的學習緩慢,實際上指的是這些偏導數很小。那么我們看一下sigmoid的圖像:
當神經元的輸出接近1的時候,曲線變的相當平,所以導數就很小。這就是學習緩慢的原因所在。
如何解決這個問題呢?研究表明,我們可以通過使用交叉熵代價函數來替換二次代價函數。
將交叉熵看作是代價函數有兩個原因。(1) 它是非負的。因為求和中的所有獨立的項都是負數的,因為對數函數的定義域為(0,1),并且求和前面有一個負號。(2) 如果對于所有的訓練輸入x,神經元實際的輸出接近目標值,那么交叉熵將接近0。
綜上所述,交叉熵是非負的,在神經元達到很好的正確率的時候會接近0。
我們可以計算出關于權重和偏置的偏導數:
和二次代價函數的求偏導數結果相比,我們可以發現,sigmoid'(Z)被消掉了,那就意味著,我們不再需要關心它是不是變得很小。所以當使用二次代價函數的時候,神經元在接近正確輸出前犯了明顯的錯誤的時候,學習變得更加緩慢;而使用交叉熵,在神經元犯明顯錯誤時學習得更加快。
那么什么時候用交叉熵代替二次代價函數呢?實際上,如果在輸出神經元是S型神經元時交叉熵一般都是更好的選擇。為什么?考慮下我們初識化網絡的權重和偏置時候,通常采用某種隨機方法。可能會發生這樣的情況,這些初始選擇會對某些訓練輸入誤差相當明顯。如果我們使用二次代價函數,那么就會導致學習速率的下降。
2. 柔性最大值(softmax)
大多數情況下我們會使用交叉熵來解決學習緩慢的問題。但是,我們也可以用柔性最大值神經元層來解決這個問題。
在對數似然代價函數進行偏置和權重的求偏導:
正如前面的分析相類似,這些表達式確保我們不會遇到學習緩慢的問題。事實上,可以把一個具有對數似然代價的柔性最大值輸出層看作與一個具有交叉熵代價的s型輸出層類似。但是有了這樣的相似性,我們到底應該使用一個交叉熵代價的s型輸出層還是使用一個具有對數似然代價的柔性最大值輸出層呢?實際上,在很多應用場合中,這兩種方式的效果都不錯。或者用另外一個視角我們可以解釋為,柔性最大值加上對數似然的組合更加適用于哪些需要將輸出激活值解釋為概率的場景。
3. 過擬合
當訓練集的準確率和測試機的準確率有較大差距時,那么就是過擬合。因為我們的網絡實際上在學習訓練集的特例,而不是能夠一般的進行識別。我們的網絡幾乎都是在單純記憶訓練集合,而沒有對數字本質進行理解進而泛化到測試數據集上。
3.1 早停法(early-stopping)
我們跟蹤測試數據集的準確率隨訓練變化的情況。當我們看到測試集的準確率不再提升,那么我們就停止訓練。
3.2 增加訓練樣本(data augmentation)
一般來說,最好的降低過度擬合的方法之一就是增加訓練樣本的量。有了足夠的訓練數據,就算是一個規模非常大的網絡也不大容易過度擬合。不幸的是,訓練數據是很難得到或者很昂貴的資源,所以這是一種不太切合實際的選擇。
在得不到全新的更多的訓練樣本的條件下,我們可以采取人為擴展訓練數據(data augmentation)。比如對圖片進行旋轉,彈性扭曲,增加噪聲等,來獲取額外的數據集。
3.3 規范化
還有一種方法能夠減輕過度擬合,那就是降低網絡的規模。然而, 大的網絡擁有一種比小網絡更強的潛力,所以這里存在一種應用冗余性的選項。幸運的是,即使我們只有一個固定的網絡和固定的訓練集,我們還有辦法能夠緩解過度擬合,那就是規范化。
(1) L1規范化
對代價函數進行求偏導:
(2) L2規范化(權重衰減)
L2規范化的想法是增加一個額外的項到代價函數上,這個項叫做規范化項。
為了直觀的感受規范化對于過擬合的影響,我們計算一個規范化神經網絡的偏導數:
L1規范化和L2規范化的比較
在L1規范化中,權重通過一個常量向0進行縮小。在L2規范化中,權重通過一個和w成比例的量進行縮小。所以當一個特定的權重絕對值|w|很大時,L1規范化的權重縮小遠比L2規范化要笑得很多。相反,當一個特定的權重絕對值|w|很小時,L1規范化的權重縮小得要比L2規范化大得多。最終結果是L1規范化傾向于聚集網絡的權重在相對少量的高重要度連接上,而其他權重就會被驅使向0。
直覺地看,規范化的效果是讓網絡傾向于學習小的權重,其他的東西都一樣。大的權重只有能夠給代價函數第一項足夠的提升時候才能被允許。換言之,規范化可以當作一種尋找小的權重和最小化原始代價函數之間的折中。這兩部分之間相對的重要性就要由lambda決定。lambda越小,就偏向于最小化原始代價函數,反之,傾向于小的權重。
為什么正則化能夠減輕過擬合
正則項是為了降低模型的復雜度,從而避免模型區過分擬合訓練數據,包括噪聲與異常點(outliers)。從另一個角度上來講,正則化即是假設模型參數服從先驗概率,即為模型參數添加先驗,只是不同的正則化方式的先驗分布是不一樣的。這樣就規定了參數的分布,使得模型的復雜度降低(試想一下,限定條件多了,是不是模型的復雜度降低了呢),這樣模型對于噪聲與異常點的抗干擾性的能力增強,從而提高模型的泛化能力。還有個解釋便是,從貝葉斯學派來看:加了先驗,在數據少的時候,先驗知識可以防止過擬合;從頻率學派來看:正則項限定了參數的取值,從而提高了模型的穩定性,而穩定性強的模型不會過擬合,即控制模型空間。
另外一個角度,過擬合從直觀上理解便是,在對訓練數據進行擬合時,需要照顧到每個點,從而使得擬合函數波動性非常大,即方差大。在某些小區間里,函數值的變化性很劇烈,意味著函數在某些小區間里的導數值的絕對值非常大,由于自變量的值在給定的訓練數據集中的一定的,因此只有系數足夠大,才能保證導數的絕對值足夠大。
另外一個解釋,規則化項的引入,在訓練(最小化cost)的過程中,當某一維的特征所對應的權重過大時,而此時模型的預測和真實數據之間距離很小,通過規則化項就可以使整體的cost取較大的值,從而,在訓練的過程中避免了去選擇那些某一維(或幾維)特征的權重過大的情況,即過分依賴某一維(或幾維)的特征。假設神經網絡大多數是有很小的權重,這極有可能出現在規范化的網絡中。更小的權重意味著網絡的行為不會因為我們隨便改變了一個輸入而改變太大。這讓規范化網絡學習局部噪聲的影響更加困難。將它看作一個讓單個的輸入不會影響網絡輸出太多的方式。相對的,規范化網絡學習去對整個訓練集中經常出現的證據進行反應。對比看,大權重的網絡可能因為輸入的微小變化而產生比較大的行為改變。所以一個無規范化的網絡可能使用大的權重來學習包含訓練集中的大量信息的復雜模型。
3.4 棄權
棄權是一種相當激進的技術。和規范化不同,棄權技術并不依賴于代價函數的修改。而是,在棄權中,我們改變了網絡本身。
通常我們會通過在網絡中前向傳播x,然后進行反向傳播來確定對梯度的貢獻。使用棄權技術,這個過程就改了。我們會從隨機地刪除網絡中的一部分的隱藏神經元開始,同時讓輸入層和輸出層的神經元保持不變。我們前向傳播輸入x,通過修改后的網絡,然后反向傳播結果,同樣通過這個修改后的網絡。在一個小批量數據小批量的若干樣本上進行這些步驟后,我們對有關的權重和偏置進行更新。然后重復這個過程,首先重置棄權的神經元,然后選擇一個新的隨機的隱藏神經元的子集進行刪除,估計對一個不同的小批量數據的梯度,然后更新權重和偏置。
通過不斷地重復,我們的網絡會學到一個權重和偏置的集合。當然,這些權重和偏置也是在一半的隱藏神經元被棄權的情形下學到的。當我們實際運行整個網絡時,是指兩倍的隱藏神經元將會被激活。為了補償這個,我們將從隱藏神經元網絡出去的權重減半。
棄權為什么會減少過擬合的影響?
這個棄權過程看起來怪怪的,像是臨時安排的。為什么我們能指望這種方式規范化呢?想象一下,我們訓練幾個不同的神經網絡,都使用同一個訓練數據。當然,網絡可能從同一初始狀態開始的,但是最終的結果也會有一些差異。出現這些情況,我們可以使用一些平均或者投票的方式來決定接受哪個輸出。例如,我們訓練了五個網絡,其中三個把一個數字分類成3,那么它很可能就會是3。這種平均的方式通常是強大的方式來減輕過擬合。原因在于不同的網絡可能回以不同的方式過度擬合,平均法可能幫助我們消除那樣的過度擬合。
那么這個和棄權什么關系呢?啟發地看,當我們棄權掉不同的神經元集合時,有點像我們在訓練不同的神經網絡。所以,棄權過程就如同大量不同網絡的效果的平均那樣。不同的網絡會以不同的方式過度擬合了,所以,棄權過的網絡的效果會減輕過度擬合。
4. 權重初始化
創建了神經網絡后,我們需要進行權重和偏置的初始化。我們可以采取獨立高斯隨機變量來選擇權重和偏置,其被歸一化為均值為0,標準差為1。但是,還有沒其他一些更好的方式來設置初始的權重和偏置呢?結果表明,歸一化的高斯分布不是最好的。為什么?
所以又回到了學習速率緩慢的問題。但是前面的情況是輸出神經元在錯誤的值上飽和導致學習的下降。我們之前通過代價函數的選擇解決了前面的問題。不幸的是,盡管那種方式在輸出神經元上有效,但是對于隱藏神經元的飽和缺一點作用都沒有。
5. 如何選擇神經網絡的超參數
(1) 學習速率
首先,我們可以選擇在訓練數據上的代價立即開始下降或者非震蕩或者增加時作為學習速率的閾值的估計。這個估計并不需要太過精確。你可以估計這個值的量級。如果代價在訓練的前面若干回合開始下降,你就可以逐步地嘗試更大的學習速率,知道你找到一個學習速率的值在開始若干回合,代價就開始震蕩或者增加。相反,如果在一開始選擇的那個學習速率,代價就開始震蕩或者增加,那么你就可嘗試更小的學習速率。
我們一直都將學習速率設置為常量。但是,通常可以采取可變的學習速率更加有效。在學習的前期,權重可能會非常糟糕。所以最好是選擇一個較大的學習速率讓權重變化得更快。越往后,我們可以降低學習速率,這樣能做出更加精良的調整。
(2) 小批量數據大小
選擇最好的小批量數據大小也是一種折衷。太小了,你不會用上很好的矩陣庫的快速計算。太大,你是不能夠足夠頻繁地更新權重的。你所需要的是選擇一個折衷的值,可以最大化學習的速率。
6. 梯度下降的優化方法
隨機梯度下降(SGD)最大的缺點在于每次更新可能并不會按照正確的方向進行,因此可以帶來優化波動(擾動)。
不過從另一個方面來看,隨機梯度下降所帶來的波動有個好處就是,對于類似盆地區域(即很多局部極小值點)那么這個波動的特點可能會使得優化的方向從當前的局部極小值點跳到另一個更好的局部極小值點,這樣便可能對于非凸函數,最終收斂于一個較好的局部極值點,甚至全局極值點。
由于波動,因此會使得迭代次數(學習次數)增多,即收斂速度變慢。不過最終其會和全量梯度下降算法一樣,具有相同的收斂性,即凸函數收斂于全局極值點,非凸損失函數收斂于局部極值點。
選擇一個合理的學習速率很難。如果學習速率過小,則會導致收斂速度很慢。如果學習速率過大,那么其會阻礙收斂,即在極值點附近會振蕩。
學習速率調整(又稱學習速率調度,Learning rate schedules)試圖在每次更新過程中,改變學習速率,如退火。一般使用某種事先設定的策略或者在每次迭代中衰減一個較小的閾值。無論哪種調整方法,都需要事先進行固定設置,這邊便無法自適應每次學習的數據集特點。
模型所有的參數每次更新都是使用相同的學習速率。如果數據特征是稀疏的或者每個特征有著不同的取值統計特征與空間,那么便不能在每次更新中每個參數使用相同的學習速率,那些很少出現的特征應該使用一個相對較大的學習速率。
對于非凸目標函數,容易陷入那些次優的局部極值點中,如在神經網路中。那么如何避免呢。
(1) SGD
SGD指stochastic gradient descent,即隨機梯度下降。是梯度下降的batch版本。對于訓練數據集,我們首先將其分成n個batch,每個batch包含m個樣本。我們每次更新都利用一個batch的數據,而非整個訓練集。
(2) Momentum
SGD方法的一個缺點是,其更新方向完全依賴于當前的batch,因而其更新十分不穩定。解決這一問題的一個簡單的做法便是引入momentum。
momentum即動量,它模擬的是物體運動時的慣性,即更新的時候在一定程度上保留之前更新的方向,同時利用當前batch的梯度微調最終的更新方向。這樣一來,可以在一定程度上增加穩定性,從而學習地更快,并且還有一定擺脫局部最優的能力:
(3)?Nesterov accelerated gradient(NAG)
從山頂往下滾的球會盲目地選擇斜坡。更好的方式應該是在遇到傾斜向上之前應該減慢速度。NAG這是對傳統momentum方法的一項改進,由Ilya Sutskever(2012 unpublished)在Nesterov工作的啟發下提出的。
假設動量因子參數γ=0.9,首先計算當前梯度項,如上圖小藍色向量,然后加上動量項,這樣便得到了大的跳躍,如上圖大藍色的向量。這便是只包含動量項的更新。而NAG首先來一個大的跳躍(動量項),然后加上一個小的使用了動量計算的當前梯度(上圖紅色向量)進行修正得到上圖綠色的向量。這樣可以阻止過快更新來提高響應性。
(4) Adagrad
上面提到的方法對于所有參數都使用了同一個更新速率。但是同一個更新速率不一定適合所有參數。比如有的參數可能已經到了僅需要微調的階段,但又有些參數由于對應樣本少等原因,還需要較大幅度的調動。
Adagrad就是針對這一問題提出的,自適應地為各個參數分配不同學習率的算法。其公式如下:
(5) Adadelta
Adagrad算法存在三個問題:
1. 其學習率是單調遞減的,訓練后期學習率非常小
2. 其需要手工設置一個全局的初始學習率
3. 更新xt時,左右兩邊的單位不同一
Adadelta針對上述三個問題提出了比較漂亮的解決方案。
(6)?Adam
RMSProp通過引入一個衰減系數,讓r每回合都衰減一定比例,類似于Momentum中的做法。
(7) Adam
Adam(Adaptive Moment Estimation)本質上是帶有動量項的RMSprop,它利用梯度的一階矩估計和二階矩估計動態調整每個參數的學習率。Adam的優點主要在于經過偏置校正后,每一次迭代學習率都有個確定范圍,使得參數比較平穩。
7. 人工神經元的模型
(1) sigmoid
(2) tanh
兩個函數之間的差異就是tanh神經元的輸出的值域是(-1,1)而非(0,1)。這意味著如果你構建基于tanh神經元,你可能需要正則化最終的輸出,跟sigmoid網絡略微不同。
(3) ReLu
什么時候應該使用ReLU而非其他神經元呢?就是我們知道sigmoid神經元在飽和的時候會停止學習,也就是輸出接近0或者1的時候。tanh也有這個問題。對比一下,提高ReLU的帶權輸入并不會導致其飽和,所以就不存在前面那樣的學習速率的下降。另外,當帶權輸入是負數的時候,梯度就消失了,所以神經元就完全停止了學習。