課程推薦:
- 快讀概覽:通俗易懂理解大模型預訓練和微調
- 結合程式碼:PyTorch10天入門-09-模型微調
- 系統講解:微調大模型Finetuning LLMs,史丹佛吳恩達 | Sharon Zhou教授聯合出品
概述
起源:
隨著深度學習的發展,模型的引數越來越大,許多開源模型都是在較大資料集上進行訓練的,但是將模型直接使用到自己的應用場景,效果可能並不理想。
(補一個前提:為什麼要使用的大模型呢? 因為現實訓練中大模型能取得好的效果......)
如果從零訓練大模型,會面臨
- 資料集不夠:幾千張資料訓練幾千萬引數的大模型,過擬合無法避免。
- 成本巨大:即使有足夠的資料量(收集資料也需要大量成本),大部分人無法承受模型訓練的時間和資金成本。
解決方案:
- 應用遷移學習(transfer learning),將從源資料集學到的知識遷移到目標資料集上。
比如:ImageNet資料集的影像大多跟椅子無關,但在該資料集上訓練的模型可以抽取較通用的影像特徵,從而能夠幫助識別 邊緣、紋理、形狀和物體組成。
補: 遷移學習Transfer learning 與 元學習Meta-learning,二者的聯絡和差異?
- 模型微調(finetune):就是先找到一個同類的別人訓練好的模型,稱為預訓練模型(Pre-trained Model),基於Pre-trained Model換成自己的資料,透過訓練調整一下部分引數。
這裡注意
模型微調(finetune)都需要做什麼?
- 換資料來源
- 對預訓練模型(Pre-trained Model)的k層進行重新訓練,調整k層的權重&shape
這裡的k層是指一個隨機數,不是指attention的QKV層中的K層
另外附個文章:【思考】為什麼大模型lora微調經常用在attention的Q和V層而不用在K層呢
偽流程
前提: 在源資料集(如ImageNet資料集)上預訓練一個神經網路模型,即源模型
- 建立一個新的神經網路模型,即目標模型,它複製了源模型上除了輸出層外的所有模型設計及其引數;
- 凍結k層使其在訓練過程中引數不改變;
- 為目標模型新增一個輸出⼤小為⽬標資料集類別個數的輸出層,並隨機初始化該層的模型引數;
- 在目標資料集上訓練目標模型。我們將從頭訓練輸出層,凍結的k層不變,而剩餘的n-k層的引數都是基於源模型的引數微調得到的。
使用指南
不同資料集下使用微調:
-
資料集1 - 資料量少,但資料相似度非常高 - 在這種情況下,我們所做的只是修改最後幾層或最終的softmax圖層的輸出類別。
-
資料集2 - 資料量少,資料相似度低 - 在這種情況下,我們可以凍結預訓練模型的初始層(比如k層),並再次訓練剩餘的(n-k)層。由於新資料集的相似度較低,因此根據新資料集對較高層進行重新訓練具有重要意義。
-
資料集3 - 資料量大,資料相似度低 - 在這種情況下,由於我們有一個大的資料集,我們的神經網路訓練將會很有效。但是,由於我們的資料與用於訓練我們的預訓練模型的資料相比有很大不同。使用預訓練模型進行的預測不會有效。因此,最好根據你的資料從頭開始訓練神經網路(Training from scatch)
-
資料集4 - 資料量大,資料相似度高 - 這是理想情況。在這種情況下,預訓練模型應該是最有效的。使用模型的最好方法是保留模型的體系結構和模型的初始權重。然後,我們可以使用在預先訓練的模型中的權重來重新訓練該模型。
程式碼上 finetune 一般流程:
前提: 在源資料集(如ImageNet資料集)上預訓練一個神經網路模型,即源模型
- 建立一個新的神經網路模型,即目標模型,它複製了源模型上除了輸出層外的所有模型設計及其引數;
- 凍結k層使其在訓練過程中引數不改變;
- 為目標模型新增一個輸出⼤小為⽬標資料集類別個數的輸出層,並隨機初始化該層的模型引數;
- 在目標資料集上訓練目標模型。我們將從頭訓練輸出層,凍結的k層不變,而剩餘的n-k層的引數都是基於源模型的引數微調得到的。
實際的程式碼可以參考:pytorch06——模型微調
四、微調指導事項
版權宣告:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結和本宣告。
原文連結:https://blog.csdn.net/qq_42250789/article/details/108832004
————————————————
-
通常的做法是截斷預先訓練好的網路的最後一層(softmax層),並用與我們自己的問題相關的新的softmax層替換它。例如,ImageNet上預先訓練好的網路帶有1000個類別的softmax圖層。如果我們的任務是對10個類別的分類,則網路的新softmax層將由10個類別組成,而不是1000個類別。然後,我們在網路上執行預先訓練的權重。確保執行交叉驗證,以便網路能夠很好地推廣。
-
使用較小的學習率來訓練網路。由於我們預計預先訓練的權重相對於隨機初始化的權重已經相當不錯,我們不想過快地扭曲它們太多。通常的做法是使初始學習率比用於從頭開始訓練(Training from scratch)的初始學習率小10倍。
-
如果資料集數量過少,我們進來只訓練最後一層,如果資料集數量中等,凍結預訓練網路的前幾層的權重也是一種常見做法。這是因為前幾個圖層捕捉了與我們的新問題相關的通用特徵,如曲線和邊。我們希望保持這些權重不變。相反,我們會讓網路專注於學習後續深層中特定於資料集的特徵。