1. 程式人生 > >想改善深層神經網路,這幾種途徑值得一試!

想改善深層神經網路,這幾種途徑值得一試!

深層神經網路可以解決諸如自然語言處理、機器視覺、語音合成等複雜任務。提高深層神經網路的效能與理解其工作原理同樣重要。這篇文章將解釋改善神經網路方面的各種術語和方法。

偏差與方差

偏差與方差是體現網路在訓練集和測試集中效能的兩個基本術語。下列兩類問題可以輕鬆直觀地解釋偏差與方差。藍線表示由神經網路計算的判定邊界。

1. 最左側的圖片展示出神經網路存在較大偏差。此時網路學習了一個簡單假設,所以不能正確地用於訓練資料。因此無法區分不同類的示例,並且對訓練集和測試集處理效果不佳。可以說這個網路是不擬合的。

2. 最右側的圖片表明,神經網路存在較大方差。此時網路學習了一個非常複雜的假設,因此無法進行歸納。該方法對訓練資料的處理效果較好,而對測試資料的處理效果較差。可以說網路是過度擬合的。

3. 中間的圖片展示了一個“恰到好處”的神經網路。它學習了理想假設,這有助於網路篩選出異常情況,並對資料進行歸納。應將實現這種型別的網路定為目標。

圖片來源:pexels.com/@pixabay

訓練方法

既然瞭解了什麼是理想的神經網路,那麼如何實現目標呢?首先應處理偏差問題,再處理方差問題。

第一個問題是“是否存在較大偏差?”如果答案是肯定的,那麼應嘗試以下步驟:

· 訓練更大的網路,包括增加隱層數和隱層的神經元數。

· 對網路進行長時間的訓練。訓練過程可能不完整,需要更多迭代。

· 嘗試不同的優化演算法,包括Adam、Momentum、AdaDelta等。

· 迭代執行上述步驟,直到偏差問題得到解決,然後處理第二個問題。

如果答案是否定的,意味著偏差問題已經解決,接下來應關注方差問題。第二個問題是“是否存在較大方差?”如果答案是肯定的,應嘗試以下步驟:

· 收集更多訓練資料。訓練資料越多,資料越多變,從變化較小的資料中學習的假設就越不復雜。

· 嘗試正則化。將在下一節中詳述。

· 迭代執行上述步驟,直到方差問題得到解決。

如果答案是否定的,意味著方差問題已經解決,現在的神經網路是“恰到好處的”。

正則化

正則化是一種有助於減少神經網路過度擬合的邏輯技術。當在網路中加入正則化時,意味著加入了一個新的正則化項,並且修改了損失函式。修改後的代價函式 J在數學上表示為:

 

帶有λ的第二項為正則化項。||W||項為弗羅賓尼斯範數(矩陣中元素的平方和)。隨著正則化的引入,λ成為一個新的超引數,可以對其進行修改以提高神經網路的效能。上述正則化也稱為L-2正則化。

早期使用以下更新規則來更新權值:

由於在修改後的已包括正則化的代價函式J中存在新的正則化項,所以將用以下方式更新權值:

這裡顯示出,權值減少了一個小於1的小數。因此也稱這種正則化為權值衰減。衰減值取決於學習速率α和正則化項λ。

正則化為什麼有效?

訓練神經網路的最終目標是使代價函式J最小化,從而使正則化項最小化。現在已經瞭解了正則化的概念,接下來解釋它為什麼有效。

第一,如果增加λ的值,弗羅賓尼斯範數就會變小,權值就會接近0。這種方法消除了大部分神經元,製造淺層網路。可以看作是將學習複雜假設的深層網路轉化為學習簡單假設的淺層網路。眾所周知,簡單假設可以減少複雜的特徵,減少過度擬合,得到一個“恰到好處”的神經網路。

也可以從應用正則化時神經元的啟用方式來解釋。為此,需要了解tanh(x)的啟用。

如果增加λ的值,那麼弗羅賓尼斯範數變小,即權值W 變小。因此,該層的輸出將變小,並且將位於啟用函式的藍色區域中。可以看到,藍色區域的啟用幾乎是線性的,網路的行為將類似於淺層網路,即網路將不學習複雜的假設(將避免尖銳的曲線),並且最終將減少過度擬合,便可以獲得一個“恰到好處”的神經網路。

因此,由於弗羅賓尼斯範數將變大,過小的λ值將導致過度擬合,神經元將不會被清除,並且層的輸出將不會線上性區域中。類似地,過大的λ值將導致擬合不足。因此,尋找λ的最優值是提高神經網路效能的關鍵。

丟棄正則化

 

丟棄正則化是另一種正則化技術。這種技術會丟棄某些神經元以及它們在神經網路中的連線。概率keep_prob決定了要丟棄的神經元。在去除神經元后,網路對剩餘的神經元進行訓練。需要注意的是,在測試時間/推理時間內,所有神經元都有可能用於確定輸出。下例有助於理解這個概念:

# Define the probablity that a neuron 
stays.keep_prob = 0.5

# Create a probability mask for a layer eg. layer 2. 
The mask should
# have same dimensions as the weight matrix so 
that the connections
# can be removed.d2 = np.random.rand(a2.shape[0],a2.shape[1]) < 
keep_prob

# Obtain the new output matrix.a2 = 
np.multiply(a2,d2)

# Since few neurons are removed, we need to 
boost the weights of
# remaining neurons to avoid weight imbalance 
during test time.a2 = a2/keep_prob

由於首先丟棄概率為keep_prob的神經元,然後使用keep_prob增強剩餘神經元,所以這種型別的丟棄被稱為倒置丟棄。

 

丟棄之間禁止神經元只依賴某些特徵,因此,權值得以傳播。神經元可能變得依賴於某些輸入特徵來確定輸出。在丟棄正則化的影響下,對於訓練過程中的不同訓練樣本,一個特定神經元每次只得到少數特徵作為輸入。最終,權值分佈在所有輸入之間,網路使用所有輸入特徵來確定輸出,而不依賴於任何單個特徵,從而使網路更加結實。這也叫L2正則化的自適應形式。

也可以為每一層單獨設定 keep_prob。因為丟棄的神經元數量與 keep_prob成反比;建立 keep_prob的一般標準是,密集連線應包含相對較少的 keep_prob,以便丟棄更多的神經元,反之亦然。

在丟棄正則化時,深層網路模仿淺層網路在訓練階段的工作。這反過來又減少了過度擬合,可得到“恰到好處”的神經網路。

早停止

早停止是一種訓練方法。在早期停止訓練神經網路以防止其過度擬合併跟蹤train_loss和dev_loss以確定何時停止訓練。

 

只要dev_loss開始迭代過度;便停止訓練。這種方法被稱為早停止。但是,由於以下兩個原因,不推薦在訓練網路時使用:

1. 停止訓練時,損失不是最小的。

2. 正在減少訓練不當的網路的過度擬合。

早停止會增加複雜度,無法獲得“恰到好處”的神經網路。

留言 點贊 關注

我們一起分享AI學習與發展的乾貨

歡迎關注全平臺AI垂類自媒體 “讀芯術”

(新增小編微信:dxsxbb,加入讀者圈,一起討論最新鮮的人工