1. 程式人生 > 其它 >如何增加深度學習模型的泛化能力(L1/L2正則化,dropout,資料增強等等)

如何增加深度學習模型的泛化能力(L1/L2正則化,dropout,資料增強等等)

這是專欄《AI初識境》的第9篇文章。所謂初識,就是對相關技術有基本瞭解,掌握了基本的使用方法。

今天來說說深度學習中的generalization問題,也就是泛化和正則化有關的內容。

作者&編輯 | 言有三

1 什麼是generalization

機器學習方法訓練出來一個模型,希望它不僅僅是對於已知的資料(訓練集)效能表現良好,對於未知的資料(測試集)也應該表現良好,也就是具有良好的generalization能力,這就是泛化能力。測試集的誤差,也被稱為泛化誤差。

舉個例子來說,我們在ImageNet上面訓練分類模型,希望這個模型也能正確地分類我們自己拍攝的照片。

在機器學習中,泛化能力的好壞,最直觀表現出來的就是模型的過擬合(overfitting)與欠擬合(underfitting)。

過擬合和欠擬合是用於描述模型在訓練過程中的兩種狀態,一般來說,訓練會是這樣的一個曲線。下面的training error,generalization error分別是訓練集和測試集的誤差。

訓練剛開始的時候,模型還在學習過程中,訓練集和測試集的效能都比較差,這個時候,模型還沒有學習到知識,處於欠擬合狀態,曲線落在underfitting zone,隨著訓練的進行,訓練誤差和測試誤差都下降。

隨著模型的進一步訓練,在訓練集上表現的越來越好,終於在突破一個點之後,訓練集的誤差下降,測試集的誤差上升了,這個時候就進入了過擬合區間overfitting zone。

不過也不是說什麼訓練過程,都會滿足上面的曲線。

(1) 模型訓練過程中,訓練集的誤差一定一直低於測試集嗎?未必。

如果這兩個集合本來就取自於同樣的資料分佈,比如從一個數據集中隨機取樣,那麼有可能測試的誤差從一開始就低於訓練集。不過,總體的趨勢肯定是不變的,兩者從一開始慢慢下降直到最後過擬合,訓練集的誤差低於測試集。

(2) 模型的訓練一定會過擬合嗎?這也不一定!

如果資料集足夠大,很可能模型的能力不夠始終都不會過擬合。另一方面,有很多的方法可以阻止,或者減緩模型的過擬合,比如正則化,這就是下面第二部分要說的。

2 什麼是Regularization

Regularization即正則化,它本是代數幾何中的一個概念,我們不說因為說不好。放到機器學習裡面來說,所謂正則化,它的目標就是要同時讓經驗風險和模型複雜度較小。

以上是我們的優化目標,V就是損失函式,它表示的是當輸入xi預測輸出為f(xi),而真實標籤為yi時,應該給出多大的損失。那麼我們不禁要問,有這一項不就行了嗎?為什麼還需要後面的那一項呢?R(f)又是什麼呢?

這就是回到上面的泛化誤差和過擬合的問題了,一個機器學習系統,學習的是從輸入到輸出的關係,只要一個模型足夠複雜,它是不是可以記住所有的訓練集合樣本之間的對映,代價就是模型複雜,帶來的副作用就是沒見過的只是略有不同的樣本可能表現地就很差,就像下面這張圖,只是更改了一個畫素,預測就從Dog變成了Cat。

造成這種情況的問題就是學的太過,引數擬合的太好以致於超過了前面那個訓練曲線的最低泛化誤差臨界點,究其根本原因是模型的表達能力足夠強大到過擬合數據集。

式子中的R(f),正是為了約束模型的表達能力,f是模型,R是一個跟模型複雜度相關的函式,單調遞增。

有同學可能會說,模型的表達能力跟模型大小,也就是引數量有關,限制模型的表達能力不是應該去調整模型大小嗎?這裡咱們從另一個角度來看模型的能力問題。

如果我們限制一層神經網路的引數只能為0或者1,它的表達能力肯定不如不做限制,所以同樣的引數量,模型的表達能力與引數本身也有關係,正則項就可以在引數上做文章。

所以說正則化就用於提高模型的泛化能力,這裡所說的僅僅是狹義上的引數正則化,而廣義上的正則化方法眾多,第3部分進行介紹。

正則化的最終目標用一句土話來說,就是讓網路學的不要太死,否則變成僵硬的書呆子。

3 正則化方法有哪些

正則化方法,根據具體的使用策略不同,有直接提供正則化約束的引數正則化方法如L1/L2正則化,以及通過工程上的技巧來實現更低泛化誤差的方法,比如訓練提前終止和模型整合,我將其稱為經驗正則化,也有不直接提供約束的隱式正則化方法如資料增強等,下面就從這三類進行講述。

1、經驗正則化方法

這裡主要包含兩種方法,即提前終止和模型整合。

(1) 提前終止

前面我們看的訓練曲線隨著不斷迭代訓練誤差不斷減少,但是泛化誤差減少後開始增長。假如我們在泛化誤差指標不再提升後,提前結束訓練,也是一種正則化方法,這大概是最簡單的方法了。

(2) 模型整合

另一種方法就是模型整合(essemable),也就是通過訓練多個模型來完成該任務,它可以是不同網路結構,不同的初始化方法,不同的資料集訓練的模型,也可以是用不同的測試圖片處理方法,總之,採用多個模型進行投票的策略。

在這一類方法中,有一個非常有名的方法,即Dropout。

Dropout在2014年被H提出後在深度學習模型的訓練中被廣泛使用。它在訓練過程中,隨機的丟棄一部分輸入,此時丟棄部分對應的引數不會更新。所謂的丟棄,其實就是讓啟用函式的輸出為0。結構示意圖如下。

因而,對於一個有n個節點的神經網路,有了dropout後,就可以看做是2^n個模型的集合了,使用的時候當然不能用2^n個模型來進行推理,而是採用了近似方法,即在使用的時候不進行權重丟棄。根據丟棄比例的不同,在測試的時候會給輸出乘以相應的係數,比如某一層在訓練的時候只保留50%的權重,在測試的時候是需要用到所有引數的,這個時候就給該層的權重乘以0.5。

關於dropout的有效性,從結構上來說,它消除或者減弱了神經元節點間的聯合,降低了網路對單個神經元的依賴,從而增強了泛化能力。不過也有另外的一些研究從資料增強的角度來思考這個問題。

那麼,就真的不擔心dropout會把一些非常重要的神經元刪除嗎?最新的神經科學的研究以及DeepMind等研究人員通過對神經元進行隨機刪除來研究網路效能,發現雖然某些神經元確實很重要,它們會選擇性啟用特定輸入,比如只對輸入貓圖特別敏感,對其他輸入則完全不感冒,但是刪除這一類神經元仍然不影響網路能識別到貓。

這說明網路中未必少了誰就不行。不過反過來,上面說到的單個畫素的攻擊,則說明又有某些神經元至關重要。關於這其中的關係,仍然是研究熱門,還是不斷跟進更多最新的研究吧。

總之一句話,不怕刪了誰。就dropout的使用方法而言,我們平常只更改dropout的比例,作者對此還有更多的建議。

(1) 因為dropout降低了模型的效能,所以對於原本需要容量為N的網路才能解決的問題,現在需要N/p,p就是保留該節點的概率,這個概率通常在0.5~0.9之間,p=1就是普通的網路了。

(2) 因為dropout相當於增加了噪聲,造成梯度的損失,所以需要使用更大的學習率和動量項。與此同時,對權重進行max-norm等權重約束方法,使其不超過某個值。

(3) 訓練更久,很好理解。

對dropout方法,還有很多的變種,包括dropout connect,maxout,stochastic depth等。

一個神經元的輸出實際上是由輸入以及引數來共同決定,dropout把神經元的值設定為0了,那是不是也可以把引數設定為0呢?這就是drop connect,而且它可以比dropout更加靈活,可視為Dropout的一般化形式,從模型整合的角度來看,Dropout是2^n個模型的平均,那DropConnect呢?它應該更多,因為權重連線的數目比節點數本身更多,所以DropConnect模型平均能力更強。

Drop Connect和Dropout均引入了稀疏性,不同之處在於Drop Connect引入的是權重的稀疏而不是層的輸出向量的稀疏。

另外,在dropout這一個思路上做相關文章的還有一些,比如maxout,是一種啟用函式,它對N個輸入選擇最大的作為啟用輸出。比如隨機pooling,是一種池化方法。比如stochastic depth,它用在帶有殘差結構的網路中,將某些res block直接設定為等價對映。還有backdrop,在前向的時候不drop,在梯度反傳的時候才做。

在這裡不禁想給大家提兩個問題

(1) 你還能想到多少種drop方法?想不到就等我們下次專門說。

(2) dropout應該怎麼跟其他的方法結合,比如batch normalization,會強強聯合得到更好的結果嗎?

2、引數正則化方法

L2/L1正則化方法,就是最常用的正則化方法,它直接來自於傳統的機器學習。

L2正則化方法如下:

L1正則化方法如下:

那它們倆有什麼區別呢?最流行的一種解釋方法來自於模式識別和機器學習經典書籍,下面就是書中的圖。

這麼來看上面的那張圖,引數空間(w1,w2)是一個二維平面,藍色部分是一個平方損失函式,黃色部分是正則項。

藍色的那個圈,中心的點其實代表的就是損失函式最優的點,而同心圓則代表不同的引數相同的損失,可見隨著圓的擴大,損失增大。黃色的區域也類似,周邊的紅色線表示的是損失相同點的輪廓。

正則項的紅色輪廓線示平方損失的藍色輪廓線總要相交,才能使得兩者加起來的損失最小,兩者的所佔區域的相對大小,是由權重因子決定的。不管怎麼說,它們總有一個交叉點。

對於L2正則化,它的交點會使得w1或者w2的某一個維度特別小,而L1正則化則會使得w1或者w2的某一個維度等於0,因此獲得所謂的稀疏化。

在深度學習框架中,大家比起L1範數,更鐘愛L2範數,因為它更加平滑和穩定。

3、隱式正則化方法

前面說了兩種正則化方法,第一種,通過對網路結構的修改或者在使用方法上進行調整。第二種,直接對損失函式做了修改。這兩種方法,其實都應該算作顯式的正則化方法,因為在做這件事的過程中, 我們是有意識地知道自己在做正則化。

但是還有另一種正則化方法,它是隱式的正則化方法,並非有意識地直接去做正則化,卻甚至能夠取得更好的效果,這便是資料有關的操作,包括歸一化方法和資料增強,擾亂標籤。

關於資料增強的方法,我們以前已經有過幾期文章講述,從有監督方法到無監督方法。關於歸一化方法,以batch normalization為代表,我們以前也詳細地講過。參考連結就放這裡了,大家自取。

【AI初識境】深度學習模型中的Normalization,你懂了多少?
【技術綜述】深度學習中的資料增強(下)
[綜述類] 一文道盡深度學習中的資料增強方法(上)

實驗表明,隱式的方法比顯式的方法更強,從batch normalization的使用替換掉了dropout,以及資料擴增碾壓一切trick就可以看出。另外,批量隨機梯度演算法本身,也可以算是一種隱式的正則化方法,它隨機選擇批量樣本而不是整個資料集,與上面的dropout方法其實也有異曲同工之妙。

這麼看來,其實data dependent方法更好,咱們前面的幾期都說過,不要悶著頭設計,從資料中學習才是王道。

4 深度學習泛化能力到底好不好

你說深度學習的泛化能力是強還是不強,感覺完全可以打一架。

一方面,深度學習方法已經在各行各業落地,說泛化能力不好誰都不信,都已經經得起工業界的考驗。關於如何定量的衡量泛化能力,目前從模型複雜度的角度有一些指標,可以參考[1]。

但是另一方面,有許多的研究[2-3]都表明,僅僅是對影象作出小的改動,甚至是一個畫素的改動,都會導致那些強大的網路效能的急劇下降,這種不靠譜又讓人心慌,在實際應用的過程中,筆者也一直遇到這樣的問題,比如下圖微小的平移操作對輸出概率的嚴重影響,真的挺常見。

正則化方法可以完美解決嗎?甚至最強的資料增強方法能做的都是有限的,一個網路可以記憶住樣本和它的隨機標籤[4],做什麼正則化都沒有作用。說起來神經網路一直在力求增強各種不變性,但是卻往往搞不定偏移,尺度縮放。這就是為什麼在刷比賽的時候,僅僅是對影象採用不同的crop策略,就能勝過任何其他方法的原因,從這一點來說,是一件非常沒有意思的事情。

或許,關於正則化,再等等吧。