我做的是圖像五分類問題,每個類別300個樣本,一共1500樣本,隨機取20%當作測試集。在訓練簡單CNN過程中,發現訓練有時候可以正常進行,有時候卻不能。剛開始我以為是隨機取數據出了問題,後來我固定了訓練集和測試集,發現還是這樣。請問是什麼原因


正常,有很多因素。

首先,在訓練神經網路時,可能會搜索到局部最優解。可以將這個結果域想像成一個三維面,局部最優解是較淺的凹陷,全局最優解是最深的凹陷。

在進行訓練時會採用梯度下降的方法,這些方法可能會找到局部最優解,但是因為學習率也就是步長設置的不夠大,就會導致模型被困在局部最優解,無法跳出。

其次,每次訓練的時候,神經網路的參數和權重每次都是隨機的,所以肯定每次的結果都不一樣。除非保存了權重和參數。這樣也會導致不斷地陷入局部最優解中,當然也可能是全局最優解。

因此,這種情況是很常見的。這也是為什麼,現在的神經網路在訓練時都要進行多次訓練,並使用Adam等能自動調整步長的優化方法。


再固定一下隨機數種子看看。檢查是否數據集切分是分層的(stratified),即每個類別都出現了。


直接原因有可能是因為網路參數初始化的原因。即使數據是固定的,但是由於網路的參數是隨機的,所以有時候網路也可能無法收斂到一個值。這種情況可以嘗試固定一下隨機數種子看效果能不能更穩定,如果固定隨機數種子以後效果趨向於穩定的話應該就是這個問題。

當然背後的根本原因有很多可能,比如可以看看網路的參數數量,因為你的數據量比較小,如果網路參數數量過於大的話會使模型難以擬合,模型訓練偏於隨機。運氣好的時候模型能成功擬合,運氣不好就像第二張圖這樣。這種情況用一個比較小的神經網路看看模型效果。

此外還可以調一調優化器和相關參數,特別是學習率。activation function 其實也可以看一下。


如果每次都能復現就是工程,而不是科學了。這個是一個客觀事實:訓練不一定收斂,但不好發表成一個發現。


其實八,解決問題才是王道, 我認為問題出現的原因, 按可能性分從大到小:初始化問題&>結構問題&>數據集問題。這樣導致對該病態處理不夠魯棒,歸根是神經網路張成的高維空間非凸性擁有可比的損失函數的可能解, 即局部極小值,鞍點很多哦;即使僅一個全局解, 有時候我們依賴梯度的方法,依靠損失函數漸進螺旋逼近山形前進,可能只是逼近低值而不是局部極小值,因此沒有辦法求精確解大多數時候,無所謂啦,有時候局部的極小值也足夠好了。

如果有時候能跑出來,修正初始化試試,如果不行,分步修改看看:

  1. 固定Dataset,把這個simple CNN換用ResNet或者Inception試一下,如果持續能求解,就證明是網路問題;
  2. 固定simple CNN,把數據集換成Cats vs. Dogs如果持續能求解,就證明是數據集問題;
  3. 把這個simple CNN帶入高stars的別人的代碼中調用,如果能跑就證明是優化方法,loss計算或者是代碼哪裡寫大意了的問題。。。


調小學習率試試


推薦閱讀:
相关文章