訓練網路時為什麼會出現loss逐漸增大的情況?

時間 2021-05-05 17:48:52

1樓:吼吼

optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

強烈建議換乙個Optimizer,SGD比較適合那些簡單的非常方便梯度下降的model+煉丹大師,小火慢燉。一般建議用Adam吧,我感覺你會得到乙個非常快的收斂速度和Performance。

另外就是Learning_rate調小乙個數量級嘗試一下。

2樓:nana2

我也遇到了,在l2r中,一開始loss快速下降,然後在epoch20%左右時開始緩慢上公升,最終穩定在0.69不動了

試了很多方法,clip可以緩解,但是不能本質解決

初始學習率是0.01,後來調小到0.0001,並且增大了batch,就正常了

3樓:rationalspark

有兩方面的原因

1.最簡單的,學習率大了。這又分兩方面,一方面是學習率太大,殘差不能下降。

另一方面是還沒大到初始殘差不能下降的程度,初始殘差可以下降,但每步加入的梯度誤差會積累,最終達到乙個於學習率相關的極限,再訓練訓練誤差只能在這個極限附件波動;

2.長期看訓練loss可有效下降,但初期有個上公升的過程。其原因是:

帶momentum的方法訓練,可看作在引數值和momentum組成的二元組上,每步乘乙個矩陣,然後加乙個噪音。不發散,要求這個矩陣的特徵值範數小於1.但是,可能有復特徵值和復特徵向量。

乙個單位實向量分解為兩個復特徵向量的線性組合,係數可能是大於1的。所以,雖然係數在衰減,但復的部分可能被變換到實的部分來,就出現初期loss上公升的情況,直到模最大的係數被衰減到1以下。綜上,初期loss上公升,不一定發散,是正常的。

在不帶momentum的情況下,一般不應該出現這種情況。

解決方案:訓練到loss穩定下降很緩慢時,降低學習率,或者試試不用momentum,或者多訓練一段時間看看

4樓:普通的飛空圓盤

根本原因還是學習率太大,建議用指數衰減的學習率或者直接呼叫Rmsprop,Adam等現成的優化演算法

這個loss先減小後增大的情況可以如下理解:

(原諒我的渣鼠繪`

假設loss function的勢能面如上所示(注:橫座標為引數,縱座標為loss值)

初始化之後,引數空間落在了箭頭所指向的的圓點處,這裡梯度比較平緩,一開始梯度下降確實可以使得loss下降

然而當梯度下降到了loss function的梯度陡峭的地方時,梯度下降的步長會變的很大,很有可能跨過loss function的谷底,而另一面的梯度如果也很大,則會導致步長越來越大,導致優化步驟不能夠收斂。

解決這個問題有一些現成的辦法,其中之一就是隨著訓練步驟的進行,對學習率乘上乙個引數(0.99或者0.999)使得學習率隨著學習步驟的進行而下降。

另一種辦法就是採用現成的優化演算法。

引起這種問題的根本原因是Hessian矩陣的病態條件數

假設對區域性最優解處的loss function做二次近似,則有最優步長為:

可證明在最壞的情況下(最壞的情況指病態條件數最嚴重),最佳的學習率為1/λ,其中λ為Hessian矩陣的最大的特徵值。

此時如果學習率較大,顯然會引起不能夠收斂的情況

5樓:風子

現在迭代到快400次了,loss值已經超過2.3遠大於初始值,這都不是梯度下降而是梯度上公升了。

開始曾懷疑是SGD函式的特性使然,但是按道理講SGD應該只會使loss值收斂到一定程式時在乙個值上下擺動,而不應該持續增加。難道是bug?

為什麼測試集的loss大於訓練集的loss,這是正常的嗎?

愛吃牛油果的璐璐 可以試試調整學習率和batchsize,劃分資料集的時候如果不是時序資料,可以試試shuffle之後劃分訓練集和測試集,以及留出法看下loss有沒有變化。 胡衛雄 一般來說,模型訓練完成,測試集的誤差是應該略大於訓練集的誤差的,但也不排除一些偶爾的情況,神經網路本身的一些東西還是挺...

楚漢戰爭時為什麼會出現劉邦父親妻子被俘,他逃跑途中差點扔掉子女這樣的事?

小知1412 劉邦,是乙個組織的領導者 組織,有組織的道德,為了組織,作為乙個組織人,特別是作為乙個領導者,就不得不犧牲掉一些東西 比如,劉邦對項羽說,把我的父親做成湯也分我一口。很多人都認為劉邦無情無義,實際上你想一想,假如你就是當時劉邦手下乙個小兵,你希望劉邦這個當頭的怎麼說?難道說讓你這個當小...

C 模板程式設計時為什麼會出現這種奇怪的行為?

暮無井見鈴 題外話 或許你需要的是乙個取反器 C 11 template Fn class notter template Args auto operator Args arg decltype fobj std forward arg notter const notter default no...