深度學習第三講之防止過擬合提高模型泛化能力

2021-08-19 11:02:00 字數 2821 閱讀 3096

在訓練資料不夠多時,或者overtraining時,常常會導致overfitting(過擬合)。其直觀的表現如下圖所示,隨著訓練過程,網路在training data上的error漸漸減小,但是在驗證集上的error卻反而漸漸增大——因為訓練出來的網路過擬合了訓練集,對訓練集外的資料卻不work。常見的防止模型過似合的方法有dropout和正則化,兩者中最常用的是後者,tensorlfow對去線性化啟用函式提供的非常友的支援,可以方更的用於工程開發。下面分別做詳細介紹

「神經網路之父」hinton認為過擬合,可以通過阻止某些特徵的協同作用來緩解。在每次訓練的時候,每個神經元有百分之50的機率被移除,這樣可以讓乙個神經元的出現不應該依賴於另外乙個神經元。

dropout 的過程好像很奇怪,為什麼說它可以解決過擬合呢?(正則化)
取平均的作用: 先回到正常的模型(沒有dropout),我們用相同的訓練資料去訓練5個不同的神經網路,一般會得到5個不同的結果,此時我們可以採用 「5個結果取均值」或者「多數取勝的投票策略」去決定最終結果。(例如 3個網路判斷結果為數字9,那麼很有可能真正的結果就是數字9,其它兩個網路給出了錯誤結果)。這種「綜合起來取平均」的策略通常可以有效防止過擬合問題。因為不同的網路可能產生不同的過擬合,取平均則有可能讓一些「相反的」擬合互相抵消。dropout掉不同的隱藏神經元就類似在訓練不同的網路(隨機刪掉一半隱藏神經元導致網路結構已經不同),整個dropout過程就相當於 對很多個不同的神經網路取平均。而不同的網路產生不同的過擬合,一些互為「反向」的擬合相互抵消就可以達到整體上減少過擬合。

減少神經元之間複雜的共適應關係: 因為dropout程式導致兩個神經元不一定每次都在乙個dropout網路中出現。(這樣權值的更新不再依賴於有固定關係的隱含節點的共同作用,阻止了某些特徵僅僅在其它特定特徵下才有效果的情況)。 迫使網路去學習更加魯棒的特徵 (這些特徵在其它的神經元的隨機子集中也存在)。換句話說假如我們的神經網路是在做出某種**,它不應該對一些特定的線索片段太過敏感,即使丟失特定的線索,它也應該可以從眾多其它線索中學習一些共同的模式(魯棒性)。(這個角度看 dropout就有點像l1,l2正則,減少權重使得網路對丟失特定神經元連線的魯棒性提高)

(還有乙個比較有意思的解釋是,dropout類似於性別在生物進化中的角色:物種為了生存往往會傾向於適應這種環境,環境突變則會導致物種難以做出及時反應,性別的出現可以繁衍出適應新環境的變種,有效的阻止過擬合,即避免環境改變時物種可能面臨的滅絕。 當地球都是海洋時,人類是不是也進化出了再海浬生活的能力呢?)

常用的去線性啟用函式有relu、sigmoid、tanh,下面分別做出詳細介紹
relu 的優點:發現使用 relu 得到的sgd的收斂速度會比 sigmoid/tanh 快很多。相比於 sigmoid/tanh,relu 只需要乙個閾值就可以得到啟用值,而不用去算一大堆複雜的運算。下圖是relu的函式影象,些函式是常用的正則化函式

就如我們所猜想的那樣,relu僅僅是分段線性函式,並不是乙個非線性的函式,所以實際上,他得以擬合函式的原理其實並不像sigmoidal類的函式,是作為乙個函式逼近器。其實上,他只是通過relu在f(0)=0的函式性質的突變(由恒等函式到突然消失,恒為0),來取得乙個將乙個函式分段的效果。實際上,如果我們僅僅使用relu來進行擬合,最後得到的是乙個極其複雜的分段函式,所以實際上,比起函式逼近器,他更適合被稱作函式分割器。在後面的博文中,我會具體用例子闡述這個過程。

可以看到,我們最後你擬合的直線大概是由a-b+c組成的。也就是說,通過relu,我們能夠得到的不是乙個嚴格的曲線,而是乙個分段線性的函式。大家再仔細看這三隻relu的分段點(也就是由恒為0到變成恒等函式的地方),與其對應的就是我們最終擬合分段線性函式的分段點。。

當我們的神經元個數越多,這個分段就能夠被分得越細,可以想象,當我們擁有無窮多個整流單元進行線性組合,可以表達出任意我們想要的非線性函式。所以說,relu與其說是乙個在做乙個逼近,不如說是在做乙個分段。

sigmoid的優點:

輸出範圍有限在(0, 1),單調連續,非常適合用作輸出層,並且求導比較容易。當然也有相應的缺點,就是飽和的時候梯度太小。函式公式及影象如下:

tanh函式優點:

雙曲正切函式(tanh)與sigmoid非常接近,且與後者具有類似的優缺點。tf.sigmoid和tf.tanh的主要區別在於後者的值域為[-1.0,1.0]。公式及函式影象如下:

tensorflow對去線性化啟用函提供了非常友好的支援:

#x為當前神經元輸放,w1為引數矩陣,biases為偏置項

y = tf.nn.relu(tf.matmul(x,w1) + biases)

y = tf.nn.sigmoid(tf.matmul(x,w1) + biases)

y = tf.nn.tanh(tf.matmul(x,w1) + biases)

深度學習 有效防止過擬合

為了得到一致假設而使假設變得過度複雜稱為過擬合 overfitting 過擬合表現在訓練好的模型在訓練集上效果很好,但是在測試集上效果差。也就是說模型的泛化能力弱。在物體分類 object recognition 問題中,資料擴增已經成為一項特殊的有效的技術。物體在影象中的位置 姿態 尺度,整體敏感...

深度學習揭秘之防止過擬合(overfitting)

神經網路通過大量的引數模擬各種繁多的任務,並能擬合各種複雜的資料集。這種獨特的能力使其能夠在許多難以在 傳統 機器學習時代取得進展的領域 例如影象識別 物體檢測或自然語言處理等領域表現優異。然而,有時候,最大的優點也是潛在的弱點。模型在學習過程時,如果缺乏控制可能會導致過擬合 overfitting...

Cmake學習第三講

三 總結 原始檔 include libhelloslam.h 這是原始檔usehello.cpp 使用 libhelloslam.h 中的 printhello 函式 intmain int argc,char ar 標頭檔案 這是乙個標頭檔案libhelloslam.h ifndef libhe...