1. 程式人生 > >深度學習技巧之Early Stopping(早停法)

深度學習技巧之Early Stopping(早停法)

一、早停法簡介(Early Stopping)

當我們訓練深度學習神經網路的時候通常希望能獲得最好的泛化效能(generalization performance,即可以很好地擬合數據)。但是所有的標準深度學習神經網路結構如全連線多層感知機都很容易過擬合:當網路在訓練集上表現越來越好,錯誤率越來越低的時候,實際上在某一刻,它在測試集的表現已經開始變差。

圖1、理想中的訓練集誤差和驗證集的誤差

模型的泛化能力通常使用模型在驗證資料集(validation set)上的表現來評估。隨著網路的優化,我們期望的理想中的泛化錯誤如圖1所示。即當模型在訓練集上的誤差降低的時候,其在驗證集上的誤差表現不會變差。反之,當模型在訓練集上表現很好,在驗證集上表現很差的時候,我們認為模型出現了過擬合

(overfitting)的情況。 解決過擬合問題有兩個方向:降低引數空間的維度或者降低每個維度上的有效規模(effective size)。降低引數數量的方法包括greedy constructive learning、剪枝和權重共享等。降低每個引數維度的有效規模的方法主要是正則化,如權重衰變(weight decay)和早停法(early stopping)等。 早停法是一種被廣泛使用的方法,在很多案例上都比正則化的方法要好。圖1是我們經常看到論文中出現的圖,也是使用早停法出現的一個結果。其基本含義是在訓練中計算模型在驗證集上的表現,當模型在驗證集上的表現開始下降的時候,停止訓練,這樣就能避免繼續訓練導致過擬合的問題。其主要步驟如下: 1. 將原始的訓練資料集劃分成訓練集和驗證集 2. 只在訓練集上進行訓練,並每個一個週期計算模型在驗證集上的誤差,例如,每15次epoch(mini batch訓練中的一個週期) 3. 當模型在驗證集上的誤差比上一次訓練結果差的時候停止訓練 4. 使用上一次迭代結果中的引數作為模型的最終引數 然而,在現實中,模型在驗證集上的誤差不會像上圖那樣平滑,而是像下圖一樣:  

圖2、真實的驗證集誤差變化曲線

也就是說,模型在驗證集上的表現可能咱短暫的變差之後有可能繼續變好。上圖在訓練集迭代到400次的時候出現了16個區域性最低。其中有4個最低值是它們所在位置出現的時候的最低點。其中全域性最優大約出現在第205次迭代中。首次出現最低點是第45次迭代。相比較第45次迭代停止,到第400次迭代停止的時候找出的最低誤差比第45次提高了1.1%,但是訓練時間大約是前者的7倍。

但是,並不是所有的誤差曲線都像上圖一樣,有可能在出現第一次最低點之後,後面再也沒有比當前最低點更低的情況了。所以我們看到,早停法主要是訓練時間和泛化錯誤之間的權衡。儘管如此,也有某些停止標準也可以幫助我們尋找更好的權衡。

二、如何使用早停法

我們需要一個停止的標準來實施早停法,因此,我們希望它可以產生最低的繁華錯誤,同時也可以有最好的價效比,即給定泛化錯誤下的最小訓練時間

2.1、停止標準簡介

停止標準有很多,也很靈活,大約有三種。在給出早停法的具體標準之前,我們先確定一下符號。假設我們使用EE作為訓練演算法的誤差函式,那麼E_{tr}(t)E​tr​​(t)是訓練資料上的誤差,E_{te}(t)E​te​​(t)是測試集上的誤差。實際情況下我們並不能知道泛化誤差,因此我們使用驗證集誤差來估計它。

第一類停止標準

假設E_{opt}(t)E​opt​​(t)是在迭代次數tt時取得最好的驗證集誤差:

E_{opt}(t) := \text{min}_{t'\leq t}E_{va}(t')E​opt​​(t):=min​t​′​​≤t​​E​va​​(t​′​​)

我們定義一個新變數叫泛化損失(generalization loss),它描述的是在當前迭代週期t中,泛化誤差相比較目前的最低的誤差的一個增長率:

GL(t) = 100 \cdot \big( \frac{E_{va}(t)}{E_{opt}(t)} - 1 \big)GL(t)=100⋅(​E​opt​​(t)​​E​va​​(t)​​−1)

較高的泛化損失顯然是停止訓練的一個候選標準,因為它直接表明了過擬合。這就是第一類的停止標準,即當泛化損失超過一定閾值的時候,停止訓練。我們用GL_{\alpha}GL​α​​來定義,即當GL_{\alpha}GL​α​​大於一定值\alphaα的時候,停止訓練。

第二類停止標準

然而,當訓練的速度很快的時候,我們可能希望模型繼續訓練。因為如果訓練錯誤依然下降很快,那麼泛化損失有很大概率被修復。我們通常會假設過擬合只會在訓練錯誤降低很慢的時候出現。在這裡,我們定義一個kk週期,以及基於週期的一個新變數度量進展(measure progress)

P_k(t) = 1000 \cdot \big( \frac{ \sum_{t' = t-k+1}^t E_{tr}(t') }{ k \cdot min_{t' = t-k+1}^t E_{tr}(t') } -1 \big)P​k​​(t)=1000⋅(​k⋅min​t​′​​=t−k+1​t​​E​tr​​(t​′​​)​​∑​t​′​​=t−k+1​t​​E​tr​​(t​′​​)​​−1)

它表達的含義是,當前的指定迭代週期內的平均訓練錯誤比該期間最小的訓練錯誤大多少。注意,當訓練過程不穩定的時候,這個measure progress結果可能很大,其中訓練錯誤會變大而不是變小。實際中,很多演算法都由於選擇了不適當的較大的步長而導致這樣的抖動。除非全域性都不穩定,否則在較長的訓練之後,measure progress結果趨向於0(其實這個就是度量訓練集錯誤在某段時間內的平均下降情況)。由此,我們引入了第二個停止標準,即泛化損失和進展的商PQ_{\alpha}PQ​α​​大於指定值的時候停止,即\frac{GL(t)}{P_k(t)} \gt \alpha​P​k​​(t)​​GL(t)​​>α

第三類停止標準 第三類停止標準則完全依賴於泛化錯誤的變化,即當泛化錯誤在連續ss個週期內增長的時候停止(UPUP)。

當驗證集錯誤在連續ss個週期內出現增長的時候,我們假設這樣的現象表明了過擬合,它與錯誤增長了多大獨立。這個停止標準可以度量區域性的變化,因此可以用在剪枝演算法中,即在訓練階段,允許誤差可以比前面最小值高很多時候保留。

2.2、停止標準選擇規則

一般情況下,“較慢”的標準會相對而言在平均水平上表現略好,可以提高泛化能力。然而,這些標準需要較長的訓練時間。其實,總體而言,這些標準在系統性的區別很小。主要選擇規則包括:

  1. 除非較小的提升也有很大價值,負責選擇較快的停止標準
  2. 為了最大可能找到一個好的方案,使用GL標準
  3. 為了最大化平均解決方案的質量,如果網路只是過擬合了一點點,可以使用PQ標準,否則使用UP標準

注意,目前並沒有理論上可以證明那種停止標準較好,所以都是實驗的資料。後續我們再介紹一下實驗結果。