關於Loss不下降的解決方法

2021-10-08 23:26:51 字數 4469 閱讀 1234

二、驗證集loss

三、測試集loss

train loss 不斷下降,test loss不斷下降,說明網路仍在學習;

train loss 不斷下降,test loss趨於不變,說明網路過擬合;

train loss 趨於不變,test loss不斷下降,說明資料集100%有問題;

train loss 趨於不變,test loss趨於不變,說明學習遇到瓶頸,需要減小學習率或批量數目;

train loss 不斷上公升,test loss不斷上公升,說明網路結構設計不當,訓練超引數設定不當,資料集經過清洗等問題。

當我們訓練乙個神經網路模型的時候,我們經常會遇到這樣的乙個頭疼的問題,那就是,神經網路模型的loss值不下降,以致我們無法訓練,或者無法得到乙個效果較好的模型。導致訓練時loss不下降的原因有很多,而且,更普遍的來說,loss不下降一般分為三種,即:訓練集上loss不下降,驗證集上loss不下降,和測試集上loss不下降。這裡,首先預設各位都能理解過擬合和欠擬合的概念。

訓練集的loss在訓練過程中遲遲不下降,一般是由這幾個方面導致的。

如果乙個模型的結構有問題,那麼它就很難訓練,通常,自己「自主研發」設計的網路結構可能很難適應實際問題,通過參考別人已經設計好並實現和測試過的結構,以及特徵工程方案,進行改進和適應性修改,可以更快更好的完成目標任務。當模型結構不好或者規模太小、特徵工程存在問題時,其對於資料的擬合能力不足,是很多人在進行乙個新的研究或者工程應用時,遇到的第乙個大問題。

神經網路在訓練之前,我們需要給其賦予乙個初值,但是如何選擇這個初始值,則要參考相關文獻資料,選擇乙個最合適的初始化方案。常用的初始化方案有全零初始化、隨機正態分佈初始化和隨機均勻分布初始化等。合適的初始化方案很重要,用對了,事半功倍,用不對,模型訓練狀況不忍直視。博主之前訓練乙個模型,初始化方案不對,訓練半天都訓練不動,loss值遲遲居高不下,最後改了初始化方案,loss值就如斷崖式下降。

建議選擇xaiver normal初始化或者he normal

l1 l2和dropout是防止過擬合用的,當訓練集loss下不來時,就要考慮一下是不是正則化過度,導致模型欠擬合了。一般在剛開始是不需要加正則化的,過擬合後,再根據訓練情況進行調整。如果一開始就正則化,那麼就難以確定當前的模型結構設計是否正確了,而且除錯起來也更加困難。

建議bn,他也有一定的防止過擬合的能力

不僅僅是初始化,在神經網路的啟用函式、損失函式方面的選取,也是需要根據任務型別,選取最合適的。

比如,卷積神經網路中,卷積層的輸出,一般使用relu作為啟用函式,因為可以有效避免梯度消失,並且線性函式在計算效能上面更加有優勢。而迴圈神經網路中的迴圈層一般為tanh,或者relu,全連線層也多用relu,只有在神經網路的輸出層,使用全連線層來分類的情況下,才會使用softmax這種啟用函式。

而損失函式,對於一些分類任務,通常使用交叉熵損失函式,回歸任務使用均方誤差,有自動對齊的任務使用ctc loss等。損失函式相當於模型擬合程度的乙個評價指標,這個指標的結果越小越好。乙個好的損失函式,可以在神經網路優化時,產生更好的模型引數。

神經網路的優化器選取一般選取adam,但是在有些情況下adam難以訓練,這時候需要使用如sgd之類的其他優化器。學習率決定了網路訓練的速度,但學習率不是越大越好,當網路趨近於收斂時應該選擇較小的學習率來保證找到更好的最優點。所以,我們需要手動調整學習率,首先選擇乙個合適的初始學習率,當訓練不動之後,稍微降低學習率,然後再訓練一段時間,這時候基本上就完全收斂了。**一般學習率的調整是乘以/除以10的倍數。**不過現在也有一些自動調整學習率的方案了,不過,我們也要知道如何手動調整到合適的學習率。

我有時會遇到有人問這樣的問題,為什麼訓練了好幾個小時了,怎麼loss沒降多少,或者怎麼還沒收斂。心急吃不了熱豆腐!各種深度學習的訓練都有不同的計算量,當需要的計算量很大時,怎麼可能幾個小時就訓練完,尤其是還在使用自己的個人電腦cpu來訓練模型的情況下。一般解決方案就是,使用更快的硬體加速訓練,比如gpu,在涉及到計算機視覺方面的任務時,加速效果顯著,主要是卷積網路的緣故。當已經沒有辦法使用硬體來加速的時候,唯一的解決方案就是——等。

這裡的瓶頸一般包括:梯度消失、大量神經元失活、梯度**和瀰散、學習率過大或過小等。

梯度消失時,模型的loss難以下降,就像走在高原上,幾乎任何地方都是高海拔,可以通過梯度的檢驗來驗證模型當前所處的狀態。有時梯度的更新和反向傳播**存在bug時,也會有這樣的問題。

在使用relu啟用函式的時候,當每乙個神經元的輸入x為負時,會使得該神經元輸出恒為0,導致失活,由於此時梯度為0,無法恢復。有一種解決方案是使用leakyrelu,這時,y軸的左邊圖線會有乙個很小的正梯度,使得神經網路在一定時間後可以得到恢復。不過leakyrelu並不常用,因為部分神經元失活並不影響結果,相反,這種輸出為0還有很多積極的作用。因為relu方程輸入為負時,輸出值為0,利用此特性可以很好地忽略掉卷積核輸出負相關資訊,同時保留相關資訊。

梯度**和梯度瀰散產生的根本原因是,根據鏈式法則,深度學習中的梯度在逐層累積。如1.1的n次方無窮大,0.9的n次方無窮小。網路中某些層過大的輸出也會造成梯度**,此時應該為該輸出取乙個上界,可用最大範數約束。

關於學習率,可按照第5項內容進行調整。

batch size過小,會導致模型後期搖擺不定,遲遲難以收斂,而過大時,模型前期由於梯度的平均,導致收斂速度過慢。一般batch size 的大小常常選取為32,或者16,有些任務下比如nlp中,可以選取8作為一批資料的個數。不過,有時候,為了減小通訊開銷和計算開銷的比例,也可以調整到非常大的值,尤其是在並行和分布式中。

不打亂資料集的話,會導致網路在學習過程中產生一定的偏見問題。比如張三和李四常常出現在同一批資料中,那麼結果就是,神經網路看見了張三就會「想起」李四。主要原因是,梯度更新時,總時張三和李四的梯度平均,導致出現固定的梯度走向,使得資料集的豐富度降低了。資料打亂後,張三還會跟王五一起平均,李四也會跟王五一起平均,那麼梯度的走向會更豐富,也能更好地在整個資料集上學習到最有用的隱含特徵。

當乙個資料集雜訊過多,或者資料標註有大量錯誤時,會使得神經網路難以從中學到有用的資訊,從而出現搖擺不定的情況。就像有人告訴你1+1=2,還有人告訴你1+1=3時,就會陷入困惑。或者還有可能時讀取資料出錯導致,這時實際情況跟資料標註錯誤是一樣的。另外,類別的不平衡也會使得較少類別由於資訊量不足,難以習得本質特徵。

未進行歸一化會導致尺度的不平衡,比如1km和1cm的不平衡,因此會導致誤差變大,或者在同樣的學習率下,模型會以秒速五厘公尺的步伐,左右兩邊搖擺不定地,向前走1km。有時,不平衡是由於不同的度量單位導致的,比如kg和m,我們都知道,1kg和1m沒有什麼可比性,雖然數字都是1。因此,我們完全可以通過放縮,使得特徵的數值分布更接近一些。

資料特徵的選取不合理,就像資料標註錯誤一樣,會使得神經網路難以找到資料的本質特徵進行學習。而機器學習的本質就是在做特徵工程,以及清洗資料。

驗證集的loss不下降分為兩種。一種是訓練集上的loss也不下降,這時問題主要在訓練集的loss上,應當先參考上述方法解決。另一種是訓練集上的loss可以下降,但驗證集上的loss已經不降了,這裡我們主要說明這種情況下的問題。

由於驗證集是從同一批訓練資料中劃分出來的,所以一般不存在資料集的問題,所以主要是過擬合。過擬合解決起來,其實不怎麼複雜,無非就幾種方法,但是對工程師自身的條件要求比較高。

正則化是用來解決模型過擬合問題的乙個很重要的手段,比如通過增加乙個正則項,並且人為給定乙個正則係數lambda,進行權重衰減,將一些相關性不大的特徵項的引數衰減到幾乎為0,相當於去掉了這一項特徵,這跟降維類似,相當於減少了特徵維度。而去掉基本無關的維度,那麼就避免了模型對於這一維度特徵的過分擬合。還有在神經網路兩個層之間增加dropout和normal等,也起到了抑制過擬合的作用。

過擬合很重要的乙個原因也是模型的複雜度太高,就像一畝地只種了一棵小麥,那麼其他地方不種就會長雜草,於是就會過擬合了一些雜訊。所以,除了正則化手段以外,適當減小模型的規模也是很重要的,盡量讓神經網路結構的假設空間與預期目標模型需要儲存的資訊量相匹配。

這是終極解決方案,深度學習就是在有大量資料的基礎上發展起來的。深度學習的三件套:資料、模型和硬體。模型可以直接拿來用,硬體可以花錢買,但是資料需要一點一點去收集,而且很多問題的解決就依賴於大量的資料,沒資料就沒有一切。

測試集一般為模型之前訓練時從未見過的新資料,或者目標應用場景下的真實資料。由於訓練集和驗證集的loss不下降時,應歸為前兩節的內容,所以這一節中,我們預設訓練集和驗證集的loss情況是正常的。所以,如果測試集的loss很高,或者正確率很低,那麼一般是因為訓練資料的分布和場景與測試資料的分布和應用場景不一致。

比如,乙個語音識別模型,輸入的資料集都是女性的錄音音訊,那麼對於男性的聲音就不能很好的識別出來。這個也是博主之前做語音識別的時候遇到過的乙個真實案例,解決方案就是增加含有大量男性錄音音訊的資料集來訓練。

雜訊問題是實際應用場景下,頻繁遇到的問題。直接容易理解的案例就是,在語音識別中,標準語音資料集都是在安靜環境下採集的資料,但是在實際應用中,我們錄音時多多少少會有雜訊,那麼我們需要專門去處理雜訊,比如進行乙個降噪處理,或者在訓練資料中新增雜訊等。在影象的識別中,那麼就需要考慮中的遮擋、霧霾、旋轉、映象和大小遠近等問題。

網路訓練時loss不下降的原因

1.網路訓練時train loss與test loss的結果分析 1 train loss不斷下降,test loss不斷下降 可能發生的原因 網路還在學習中,loss在穩步下降。2 train loss不斷下降,test loss趨於不變 可能發生的原因 網路出現過擬合的現象,因此在訓練集上表現為...

loss訓練時的不下降 nan或者為0

1 loss不下降 2 檢測中faster rcnn的loss是nan 大部分是座標越界造成的 3 檢測中faster rcnn的bbox loss為0,主要是因為fg太少,遇到過第一階段的rois中,假設batch size是128,得到fg bg 1 127,很可能bbox loss等於0,因為...

關於margin top失效的解決方法

float left clear both margin top 20px 會出現box2的上邊距 margin top沒有效果的情況 此時兩個層box1和box2,當為box1設定浮動屬性,box2清除浮動不具備浮動屬性。網上找到的兩種比較靠譜的解釋 1 在css2.1中,水平的margin不會被...