1. 避免過擬合
-
overfitting
即過擬合,典型的表現爲訓練集損失遠遠小於驗證集損失。而欠擬合則表現爲訓練集損失大於驗證集損失。
要清楚遠遠大於的概念,如果訓練集損失只比驗證集損失多一點點的話,同等數量級(例如0.8與0.9)這種情況下並不是過擬合的表現。我們一般遇到的過擬合應該是0.8(訓練集損失)與2.0(驗證集損失)這種差距很大或者明顯不在一個量級的損失比。 -
方法:使用Drop out
Dropout類似於bagging ensemble減少variance。也就是投通過投票來減少可變性**。通常我們在全連接層部分使用dropout,在卷積層則不使用。**但要聲明,dropout並不適合所有的情況,請不要無腦上Dropout。
2. 數據集是否損壞?
- 數據集的好壞是算法泛化好壞的一個非常重要的前提條件,我們通常在構建深度學習的任務中,所得到的數據集一般不會是非常完美的(不論是自己搭建還是利用他人的數據,在數據集量過大的時候,數據集中難免會有圖像損壞或者錯誤的個例)。
損壞的數據一定會影響計算的準確性。這個時候就需要我們自己去手動編寫代碼將那些錯誤且無法參與訓練的圖像挑選出來。 - 那麼如何正確過濾這些圖像呢?
找到損壞圖像的特點,例如無法讀取,編寫程序去除無法讀取的圖像。
找到內容缺失的圖像,這樣的圖像大小往往比普通圖像小一些,通過過濾文件大小小於某一閾值去除。
3. 關於學習率(尋找合適的學習率)
- 學習率是一個非常非常重要的超參數,這個參數呢,面對不同規模、不同batch-size、不同優化方式、不同數據集,其最合適的值都是不確定的,我們無法光憑經驗來準確地確定lr的值,我們唯一可以做的,就是在訓練中不斷尋找最合適當前狀態的學習率。
比如下圖利用fastai中的lr_find()函數尋找合適的學習率,根據下方的學習率-損失曲線得到此時合適的學習率爲1e-2。
學習率和batch_size的關係
- 一般來說,越大的batch-size使用越大的學習率。
原理很簡單,越大的batch-size意味着我們學習的時候,收斂方向的confidence越大,我們前進的方向更加堅定,而小的batch-size則顯得比較雜亂,毫無規律性,因爲相比批次大的時候,batch_size小的情況下無法照顧到更多的情況,所以需要小的學習率來保證不至於出錯。
可以看下圖損失Loss與學習率Lr的關係:
- 當然我們也可以從上圖中看出,當batch_size變大後,得到好的測試結果所能允許的lr範圍在變小,也就是說,當batch_size很小時,比較容易找打一個合適的lr達到不錯的結果,當batch_size變大後,可能需要精細地找一個合適的lr才能達到較好的結果,這也給實際的large_batch分佈式訓練帶來了困難。\
4.差分學習和遷移學習
-
首先說下遷移學習,遷移學習是一種很常見的深度學習技巧,我們利用很多預訓練的經典模型直接去訓練我們自己的任務。雖然說領域不同,但是在學習權重的廣度方面,兩個任務之間還是有聯繫的。
-
由上圖,我們拿來model A訓練好的模型權重去訓練我們自己的模型權重(Model B),其中,modelA可能是ImageNet的預訓練權重,而ModelB則是我們自己想要用來識別貓和狗的預訓練權重。
-
那麼差分學習率和遷移學習有什麼關係呢?我們直接拿來其他任務的訓練權重,在進行optimize的時候,如何選擇適當的學習率是一個很重要的問題。
一般地,我們設計的神經網絡(如下圖)一般分爲三個部分,輸入層,隱含層和輸出層,隨着層數的增加,神經網絡學習到的特徵越抽象。因此,下圖中的卷積層和全連接層的學習率也應該設置的不一樣,一般來說,卷積層設置的學習率應該更低一些,而全連接層的學習率可以適當提高。
-
這就是差分學習率的意思,在不同的層設置不同的學習率,可以提高神經網絡的訓練效果,具體的介紹可以查看下方的鏈接。
上面的示例圖來自:https://towardsdatascience.com/transfer-learning-using-differential-learning-rates-638455797f00
5. 關於優化算法
- 按理說不同的優化算法適合於不同的任務,不過我們大多數採用的優化算法還是是
adam
和SGD+monmentum
。
6. 數據增強
- 大部分我們使用的圖像增強技術一般是隨機旋轉,水平翻轉,高斯模糊和尺度變化還有什麼拉伸等操作。這些圖像變化對大部分的任務是比較適合的。
- 但也需要提個醒,並不是所有的圖像增強都可以提升模型的泛化能力。而且有些圖像增強技術會對原始圖像造成損失從而導致神經網絡學習到錯誤的信息。