模型微調(Finetune)

參考:https://zhuanlan.zhihu.com/p/35890660

ppt下載地址:https://github.com/jiangzhubo/What-is-Fine-tuning

一.什麼是模型微調

      給定預訓練模型(Pre_trained model),基於模型進行微調(Fine Tune)。相對於從頭開始訓練(Training a model from scatch),微調爲你省去大量計算資源和計算時間,提高了計算效率,甚至提高準確率。

什麼是預訓練模型(Pre-trained Model)?

(1) 預訓練模型就是已經用數據集訓練好了的模型。

(2) 現在我們常用的預訓練模型就是他人用常用模型,比如VGG16/19,Resnet等模型,並用大型數據集來做訓練集,比如Imagenet, COCO等訓練好的模型參數。  

 ( 3 )  正常情況下,我們常用的VGG16/19等網絡已經是他人調試好的優秀網絡,我們無需再修改其網絡結構。

常用模型:

二.爲什麼要微調

卷積神經網絡的核心是:

(1)淺層卷積層提取基礎特徵,比如邊緣,輪廓等基礎特徵。

(2)深層卷積層提取抽象特徵,比如整個臉型。

(3)全連接層根據特徵組合進行評分分類。

 爲什麼要微調?

普通預訓練模型的特點是: 用了大型數據集做訓練,已經具備了提取淺層基礎特徵和深層抽象特徵的能力

結論

不做微調: (1)從頭開始訓練,需要大量的數據,計算時間和計算資源。 (2)存在模型不收斂,參數不夠優化,準確率低,模型泛化能力低,容易過擬合等風險。

使用微調: (1)有效避免了上述可能存在的問題。

三、什麼情況下微調?

(1) 你要使用的數據集和預訓練模型的數據集相似,如果不太相似,比如你用的預訓練的參數是自然景物的圖片,你卻要做人臉的識別,效果可能就沒有那麼好了,因爲人臉的特徵和自然景物的特徵提取是不同的,所以相應的參數訓練後也是不同的。

(2) 自己搭建或者使用的CNN模型正確率太低

(3)數據集相似,但數據集數量太少

(4)計算資源太少

不同數據集下使用微調:

數據集1  - 數據量少,但數據相似度非常高 - 在這種情況下,我們所做的只是修改最後幾層或最終的softmax圖層的輸出類別。

數據集2 - 數據量少,數據相似度低 - 在這種情況下,我們可以凍結預訓練模型的初始層(比如k層),並再次訓練剩餘的(n-k)層。由於新數據集的相似度較低,因此根據新數據集對較高層進行重新訓練具有重要意義。

數據集3  - 數據量大,數據相似度低 - 在這種情況下,由於我們有一個大的數據集,我們的神經網絡訓練將會很有效。但是,由於我們的數據與用於訓練我們的預訓練模型的數據相比有很大不同。使用預訓練模型進行的預測不會有效。因此,最好根據你的數據從頭開始訓練神經網絡(Training from scatch)

數據集4  - 數據量大,數據相似度高 - 這是理想情況。在這種情況下,預訓練模型應該是最有效的。使用模型的最好方法是保留模型的體系結構和模型的初始權重。然後,我們可以使用在預先訓練的模型中的權重來重新訓練該模型。

四、微調指導事項

1.通常的做法是截斷預先訓練好的網絡的最後一層(softmax層),並用與我們自己的問題相關的新的softmax層替換它。例如,ImageNet上預先訓練好的網絡帶有1000個類別的softmax圖層。如果我們的任務是對10個類別的分類,則網絡的新softmax層將由10個類別組成,而不是1000個類別。然後,我們在網絡上運行預先訓練的權重。確保執行交叉驗證,以便網絡能夠很好地推廣。

2.使用較小的學習率來訓練網絡。由於我們預計預先訓練的權重相對於隨機初始化的權重已經相當不錯,我們不想過快地扭曲它們太多。通常的做法是使初始學習率比用於從頭開始訓練(Training from scratch)的初始學習率小10倍

3. 如果數據集數量過少,我們進來只訓練最後一層,如果數據集數量中等,凍結預訓練網絡的前幾層的權重也是一種常見做法。這是因爲前幾個圖層捕捉了與我們的新問題相關的通用特徵,如曲線和邊。我們希望保持這些權重不變。相反,我們會讓網絡專注於學習後續深層中特定於數據集的特徵。