微調與遷移學習與從頭開始學習
在我的碩士論文中,我正在研究特定用例的遷移學習,這是一個交通標誌檢測器,實現為具有 VGG16 基礎網絡進行分類的單次檢測器。該研究的重點是擁有一個訓練有素的檢測器並干擾它所訓練的交通標誌數據集(我採用比利時交通標誌檢測數據集)但是當它在另一個國家(德國,奧地利)使用檢測器時,意大利,西班牙,…)交通標誌看起來或多或少不同,這會導致一定的不必要的損失。有關此主題的概述,我會推薦維基百科文章
下一節是關於我的研究問題所以在新國家有幾個交通標誌的例子,是不是更好
- 微調網絡
- 遷移學習網絡並凍結一些卷積層
- (作為比較)從零開始學習新的國家
即使是第一個檢測器(在綜合比利時數據集上從頭開始訓練的檢測器),從已發布的模型 Zoos(例如 VGG16/COCO)加載預訓練的權重,然後基於此進行微調/遷移學習,它是否有任何優勢?
現在我在這裡問什麼: 我不是自己實現了我的檢測器,而是基於到 Keras/Tensorflow 的原始 SSD 端口(從這裡)並且已經用不同的變體訓練了它(比利時從頭開始,用 MS COCO 預訓練,轉移到德國,卷積凍結,微調到德國),經過數週的訓練,現在我可以說,比利時從頭開始具有隨機權重的收斂速度最快(僅 40 epochs/2 天后,我的自定義 SSD 損失函數下降到一個值3)雖然所有其他變化都需要更多時間,但更多的時期和損失永遠不會低於 9 的值。
我還發現了使用 VGG16 進行交通標誌分類的預訓練權重,我認為這應該是關於這個主題的遷移學習的理想基礎,但是這個檢測器是迄今為止表現最差的(即使學習率改變並且在 100 之後,損失也停滯在 11時代它過度擬合)。
看來,這些檢測器的遷移學習或微調根本沒有任何優勢。很可能我做錯了什麼,或者我錯誤地理解了遷移學習的目的(我認為它應該加速學習,因為大多數層都是不可訓練的,因此沒有進行計算)
我不知道這是否是討論這個話題的合適平台,也許你知道這屬於一個 slack 或 gitter 頻道。我只是不知道我是否被卡住了,或者我只是在做一些可怕的錯誤。
遷移學習是指為一項任務開發的模型被重用於第二項任務。微調是遷移學習的一種方法,您可以更改模型輸出以適應新任務並僅訓練輸出模型。
在遷移學習或領域適應中,我們使用數據集訓練模型。然後,我們用另一個具有不同類分佈的數據集訓練相同的模型,甚至使用與第一個訓練數據集不同的其他類)。
在微調(一種遷移學習的方法)中,我們有一個數據集,並且我們在訓練中使用了 90% 的數據集。然後,我們用剩下的 10% 訓練相同的模型。通常,我們將學習率更改為較小的,因此它不會對已經調整的權重產生重大影響。您還可以讓一個基本模型用於類似的任務,然後在使用新數據執行新的訓練會話時凍結一些層以保留舊知識。輸出層也可以不同,並且在訓練中凍結其中的一些。
根據我的經驗,從頭開始學習會帶來更好的結果,但它比其他方法成本高得多,尤其是在時間和資源消耗方面。
使用遷移學習,您應該凍結一些層,主要是預訓練的層,只在添加的層中進行訓練,並降低學習率來調整權重,而不會混淆它們對網絡的意義。如果你加快學習速度,你通常會因為梯度下降優化中的大步驟而面臨糟糕的結果。這可能導致神經網絡無法找到全局最小值而只能找到局部最小值的狀態。
在類似的任務中使用預訓練模型,當我們使用 Fine-tuning 時通常會有很好的結果。但是,如果您在新數據集中沒有足夠的數據,或者您的超參數不是最好的,您可能會得到不滿意的結果。機器學習總是依賴於它的數據集和網絡的參數。在這種情況下,您應該只使用“標準”遷移學習。
因此,我們需要以我們期望的準確性評估資源和時間消耗之間的權衡,以選擇最佳方法。