Meta祭出三篇最詳盡Llama微調指南!千字長文,0基礎小白必備
開源,就要開的徹徹底底。
這不,Meta一連放出三篇技術文章,從大模型適配方法出發,介紹了:
如何使用特定領域數據微調LLM,如何確定微調適配自己的用例,以及如何管理良好訓練數據集的經驗法則。
接下來,直接進入正題。
適配大模型
預訓練
預訓練是指,使用數萬億個token數據,從頭開始訓練LLM的過程,通常使用自監督算法進行訓練。
最常見的情況是,訓練通過自回歸預測下一個token(也稱為因果語言建模)。
預訓練通常需要數千個GPU小時(105-107個),并分布在多個GPU上進行。
預訓練的輸出模型稱為「基礎模型」。
繼續預訓練
繼續預訓練(也稱為第二階段預訓練)將使用全新的、未見過的領域數據進一步訓練基礎模型。
這里,同樣使用與初始預訓練相同的自監督算法。
通常會涉及所有模型權重,并將一部分原始數據與新數據混合。
微調
微調是以監督方式使用帶注釋的數據,或使用基于強化學習的技術,來適配預訓練語言模型的過程。
與預訓練相比,微調有兩個主要區別:
- 在包含正確標簽/答案/偏好的注釋數據集上進行監督訓練,而不是自監督訓練
- 需要較少的token(數千或數百萬,而不是預訓練中需要的數十億或數萬億),其主要目的是提高能力,如指令遵循、人類對齊、任務執行等。
而要了解微調的現狀,可以從兩個方面入手:參數變化的百分比和微調后新增的能力。
更改的參數百分比
根據更改的參數量,有兩類算法:
- 全面微調:顧名思義,這包括更改模型的所有參數,包括在XLMR和BERT(100-300M參數)等小模型上所做的傳統微調,以及對Llama 2、GPT3(1B+參數)等大模型上的微調。
- 參數高效微調(PEFT):PEFT算法只微調少量額外參數,或更新預訓練參數的子集,通常是總參數的1%-6%,而不是對所有LLM權重進行離線微調。
基礎模型新增的能力
微調的目的是為了向預訓練的模型添加功能,比如指令遵循、人類對齊等。
聊天微調Llama 2,就是一個具有附加指令遵循和對齊能力的微調模型的例子。
檢索增強生成(RAG)
企業還可以通過添加特定領域的知識庫來適配LLM,RAG是典型的「搜索驅動的LLM文本生成」。
RAG于2020年推出,它使用動態提示上下文,通過用戶問題檢索并注入LLM提示,以引導其使用檢索到的內容,而不是預訓練的知識。
Chat LangChain是由RAG支持的、在Lang Chain文檔上流行的Q/A聊天機器人。
上下文學習(ICL)
對于ICL,通過在提示符中放置原型示例來適配LLM。多項研究表明,「舉一反三」是有效的。這些示例可以包含不同類型的信息:
- 僅輸入和輸出文本,也就是少樣本學習
- 推理追蹤:添加中間推理步驟,可參閱思維鏈(COT)提示
- 計劃和反思追蹤:添加信息,教LLM計劃和反思其解決問題的策略,可參閱ReACT
選擇正確的適配方法
要決定上述哪種方法適合特定應用,你應該考慮各種因素:所追求任務所需的模型能力、訓練成本、推理成本、數據集類型等。
下面的流程圖總結了一些建議,可以幫助你選擇合適的LLM適配方法。
? 預訓練
預訓練是LLM訓練的重要組成部分,它使用token預測變量作為損失函數。自監督算法,使得大量數據訓練成為可能。
例如,Llama 2接受了2萬億token的訓練。這需要大量的計算基礎設施:Llama 2 70B需要1,720,320個GPU小時。
因此,對于資源有限的團隊,Meta不建議將預訓練作為LLM適配的可行方法。
在預訓練計算成本很高的情況下,更新預預訓練好的模型權重,可能是一種有效的方法,來適配特定任務。
不過,任何更新預訓練模型權重的方法,都容易出現一種「災難性遺忘」的現象。
比如,此前一項研究顯示,在醫療領域微調訓練后的模型,在遵循指令和常見問答任務上的性能出現下降。
論文地址:https://arxiv.org/pdf/2009.03300
還有很多研究可以佐證,通過預訓練獲得的通用知識,在后續訓練過程中可能會被遺忘。
? 繼續預訓練
鑒于災難性的遺忘,最近的研究表明,繼續預訓練(CPT)可以導致模型性能的進一步提高,而計算成本只是預訓練的一小部分。
對于需要LLM獲得新的轉換技能的任務,CPT可能是有益的。
有研究報告顯示,繼續預訓練成功地增加了多種語言能力。
但CPT成本極高,需要大量的數據和計算資源。
比如,PYTHIA套件經歷了第二階段的預訓練,最終得到了FinPYTHIA-6.9B。該模型專為金融數據設計的,使用240億token的數據集,進行了18天的繼續預訓練。
此外,CPT也容易導致災難性的遺忘。
因此,對于資源有限的團隊,Meta同樣不建議將繼續預訓練訓作為LLM適配的可行方法。
總而言之,在預訓練和持續預訓練中,使用自監督算法和未加注釋的數據集,微調LLM是資源和成本密集型的,不建議將其作為一種可行的辦法。
? 全參微調和參數高效微調(PEFT)
與使用未注釋的數據集進行預訓相比,使用較小的帶注釋的數據集進行微調,是一種更具成本效益的方法。
而且,微調后模型被證明在法律、醫療或金融等專業領域的廣泛的應用中,實現了SOTA。
微調,特別是參數高效微調,只需要預訓練/繼續預訓練所需計算資源的一小部分。
因此,對于資源有限的團隊來說,這是一個可行的方法來適配LLM。
? 檢索增強生成(RAG)
RAG是另一種流行的LLM適配方法。
如果你的應用程序需要從動態知識庫(例如QA機器人)中提取,RAG可能是一個很好的解決方案。
RAG的系統的復雜性,主要在于檢索引擎的實現。
這種系統的推理成本可能會更高,因為輸入提示包含了檢索到的文檔,而大多數服務提供商采用按token計費的模式。
? 上下文學習(ICL)
這是適配LLM最具成本效益的方式。
ICL不需要任何額外的訓練數據或計算資源,使其成為一種具有成本效益的方法。然而,與RAG類似,隨著推理時處理更多的token,推理的成本和延遲可能會增加。
總之,創建一個基于LLM的系統是迭代的,上面的流程圖概述了這一迭代過程,并為LLM適配戰略奠定了堅實的基礎。
微調還是不微調?
在第二部分中,Meta又談了談什么情況下,需要微調。
在大模型興起之前,微調通常用于參數比較少的模型(100M – 300M)。
而且,最先進領域應用程序,也是使用監督微調(SFT)構建的,即使用自己專業領域和下有任務的注釋數據,進一步訓練預訓練的模型。
然而,隨著更大參數模型的出現(>1B),微調的問題變得微妙了起來。
最重要的是,大模型需要更大的資源和商業硬件來進行微調。
下表1列出了三種情況下,微調Llama 2 7B和Llama 2 13B模型的峰值GPU內存使用量。
你可能會注意到,QLoRA等算法使得利用有限資源,對大模型進行微調變得更加容易。
例如,表1顯示了Llama 2 7B上三種微調模式(全面微調、LORA和QLoRA)的峰值GPU內存。
在Llama 1中,由于參數高效微調(PEFT)或量化,內存也有類似的減少。
除計算資源外,災難性遺忘(詳見本系列第一部分)也是全參數微調的常見隱患。
PEFT技術旨在通過對少量參數進行訓練來解決這些缺陷。
微調可能有益的原型
研究人員將以下場景確定為可從微調中受益的常見用例:
- 語氣、風格、形式定制:使用案例可能會尋求反映特定角色或服務特定受眾的LLM。
通過使用定制數據集對LLM進行微調,可以塑造聊天機器人的響應,使其更符合受眾的特定需求或預期的體驗。
另外,研究者可能還希望它能以特定的方式組織輸出,例如,JSON、YAML或Markdown格式的輸出。
- 提高精度并處理邊緣情況:微調可以用于糾正幻覺或錯誤,這些錯誤很難通過prompt和上下文學習來糾正。
它還可以增強模型執行新技能或任務的能力,這些技能或任務很難在提示中表達。
這個過程可以幫助糾正模型沒有遵循復雜提示的錯誤,并提高其產生所需輸出的可靠性。
以下是兩個案例:
- Phi-2對金融數據情緒分析準確率,從34%提高到85%。
- 僅用100個示例,ChatGPT對Reddit評論情緒分析的準確率從48%提高到73%。
通常來說,對于較小的初始精度(<50%),微調是一個巨大的障礙,需要用幾百個示例。
- 處理代表性不足的領域:盡管LLM接受了大量通用數據的訓練,但它們可能并不總是精通每一個特定領域的細微差別的行話、術語或具體情況。
對于不同的領域,如法律、醫療或金融,微調已被證明有助于提高下游任務的準確性。
以下是兩個案例:
- 正如本文中指出的,患者的病歷包含高度敏感的數據,這些數據通常不會在公共領域中找到。因此,基于LLM的病歷摘要系統需要進行微調。
- 對于印地語等代表性較少的語言,使用PEFT進行微調有助于完成這些語言的所有任務。
- 降低成本:微調可以將較大參數模型(如Llama 2 70B/GPT-4)中的技能,提煉成小模型(如Llama 2 7B)中的技能,從而在不影響質量的情況下降低成本和延遲。
此外,微調減少了對冗長或特定提示的需要,從而節省了象征性成本并進一步降低了成本。
- 新的任務/能力:通常,新的能力可以通過微調來實現。以下是三個案例:
1 微調LLM,以便更好地利用特定檢索器的上下文,或完全忽略它
2 微調LLM「法官」,以評估其他LLM的指標,如接地性、合規性或有用性
3 微調LLM以增加上下文窗口
與其他領域適配技術的比較
微調與上文學習(少樣本)
上下文學習(ICL)是提高基于LLM的系統性能的有效方法。
使用ICL時的常見注意事項包括:
- 隨著需要展示的示例數量的增加,推理的成本和延遲也會增加。
- 隨著例子越來越多,LLM忽略一些例子是很常見的。這意味著你可能需要一個基于RAG的系統,根據輸入找到最相關的示例。
- LLM可以吐出提供給他們的知識作為例子。這一擔憂在微調時也存在。
微調和RAG
普遍的共識是,當LLM基本性能不盡如人意時,可以先從RAG開始,衡量其性能,如果發現不足,再轉向微調。
或者說,與微調相比,RAG可能更有優勢。
然而,Meta認為這種范式過于簡單化,因為在多種情況下,RAG不僅不是微調的替代方案,而且更像是微調的補充方案。
根據問題的特點,應該嘗試一種方法,或者兩種方法。
根據本文的框架,你可以提出以下問題,以確定微調或 RAG(或兩者)是否適用:
- 你的應用程序需要外部知識嗎?微調通常對注入新知識沒什么幫助
- 你的應用程序是否需要自定義語氣/行為/詞匯或風格?對于這些類型的需求,微調通常是正確的方法。
- 你的應用程序對幻覺的容忍度如何?在抑制虛假和想象力編造至關重要的應用中,RAG系統提供內置機制,最大限度地減少幻覺。
- 有多少已標記的訓練數據可用?
- 數據的靜態/動態程度如何?如果問題需要訪問動態數據語料庫,微調可能不是正確的方法,因為對LLM的知識可能很快就會過時。
- LLM應用程序需要有多透明/可解釋?RAG本身可以提供引用,這些引用對于解釋LLM輸出非常有用。
- 成本和復雜性:團隊是否擁有構建搜索系統的專業知識或之前的微調經驗?
- 您的應用程序中的任務種類有多少?
在大多數情況下,微調和RAG的混合解決方案,將產生最好的結果,問題就在于兩者的成本、時間和額外的獨立效益。
最后,微調中的探索,確實需要一個強大的數據收集和數據改進策略,Meta建議將其作為開始微調的前奏。
如何微調?
到了第三部分就步入真正關鍵的內容——如何去微調,先要關注數據集。
微調LLM可以說,是藝術和科學的結合,最佳做法仍在不斷涌現。
在這部分,Meta將重點介紹微調的設計變量,并就資源受限的情況下,微調模型的最佳實踐提供方向性指導。
全面微調與參數高效微調
在學術和實際應用中,當應用于新領域時,全面微調和PEFT都顯示出下游性能的提升。
選擇其中一種方法,可歸結為可用計算量(GPU小時數和GPU內存)、目標下游任務以外的任務性能(學習和遺忘權衡)以及人工注釋成本。
全面微調更容易出現兩個問題:模型崩潰和災難性遺忘。
一些早期的實證研究表明,與PEFT技術相比,全面微調更容易出現上述問題,但還需要做更多的研究。
PEFT技術本質上,是作為微調的自然正則化器。
PEFT通常需要相對較少的計算資源來訓練下游模型,并且在數據集規模有限的資源受限場景下,更易于使用。
在某些情況下,全面微調在特定任務上表現更好,但代價往往是遺忘原始模型的一些能力。
在資源受限的情況下,PEFT可能會比全面微調提供更好的性能提升/成本比。
如果在資源受限的情況下,下游性能至關重要,那么全面微調將是最有效的。
無論在哪種情況下,關鍵是要牢記以下幾個關鍵原則來創建高質量的數據集。
數據集管理
在各種文獻的微調實驗中,數據集對于獲得微調的好處至關重要。
除了「更好的質量和更多的示例」之外,還有更多的細微差別,你可以明智地投資數據集收集,以在資源受限的微調實驗中提高性能。
數據質量/數量
- 質量是最重要的:一個大趨勢是質量比數量更重要。也就是說,擁有一小部分高質量的數據,比擁有一大批低質量的數據更好。
質量的關鍵原則是一致的注釋,沒有錯誤、沒有錯誤標簽的數據、有噪音的輸入/輸出,以及與總體相比具有代表性的分布。
在微調時,幾千個精選的LIMA數據集示例,比50K機器生成的Llama數據集具有更好的性能。
OpenAI微調文檔表明,即使是50-100個示例的數據集也可能產生影響。
- 更困難的語言任務需要更多數據:相對困難的任務,如文本生成和摘要,更難微調,比起更容易的任務,如分類和實體提取,需要更多數據。
「更難」可以指多個:輸出中有更多的token,需要更高級別的人類能力,多個正確答案。
- 有效的高質量數據收集:由于數據收集成本較高,建議使用以下策略來獲得更高的樣本效率和成本
1 觀察失效模式:觀察先前機器學習能力失敗的例子,并添加針對這些失效模式的樣例。
2 人機協作:這是一種更經濟的數據標注擴展方式。可以使用LLM自動生成基礎回答,人類標注者可以基于此更快地進行標注。
數據多樣性
簡單來說,如果你用特定類型的回應過度訓練模型,它會傾向于給出那種回應,即使不是最合適的答案。
這里的經驗法則是,盡可能確保訓練數據反映模型在現實世界中應該如何表現。
- 重復:無論是在微調還是預訓練中,這都被發現是導致模型性能下降的原因。通過去重實現多樣性,往往會提高性能指標。
- 輸入多樣性:通過改述來增加輸入的多樣性。
- 數據集多樣性:當為更通用的下游任務微調時(例如,多語言適配),使用多樣化的數據集已被證明,可以改善模型在遺忘原始能力和學習新能力之間的權衡。
- 標準化輸出:移除輸出中的空白和其他格式技巧被證明是有幫助的。如果你想要回答中有特定的語氣,比如「服務臺聊天機器人是...」,那么就為每個例子在數據集中添加這些內容。
基于LLM的數據管道
為了整理高質量、多樣化的數據集,數據管道經常使用大語言模型來降低標注成本。
以下是實踐中觀察到的技術:
- 評估:用高質量數據集訓練一個模型,然后用它來標注較大數據集,以篩選出高質量的樣例。
- 生成:用高質量示例來引導大模型,并通過提示生成類似的高質量樣例。合成數據集的最佳實踐正在逐漸形成。
- 人機協作:使用大模型生成初始輸出集,然后由人類通過編輯或選擇偏好來提高質量。
調試數據集
- 評估數據集中的不良輸出:如果模型在某些方面仍然表現不佳,添加直接向模型展示如何正確處理這些方面的訓練示例。
如果你的模型存在語法、邏輯或風格問題,檢查數據是否存在相同的問題。
例如,如果模型現在說「我會為你安排這個會議」(實際上它不應該這樣做),看看現有的例子是否教導模型說它可以做一些它實際上不能做的新事情。
- 仔細檢查正面/負面類別的平衡:如果數據中60%的助手回應說「我無法回答這個問題」,但在推理時只有5%的回應應該這樣說,你可能會得到過多的拒絕回應。
- 全面性和一致性:確保你的訓練示例包含回應所需的所有信息。
如果希望模型基于用戶的個人特征來贊美用戶,而訓練示例中包含了助手對前面對話中沒有出現的特征的贊美,模型可能會學會虛構信息。
確保所有的訓練示例,都采用與推理時預期相同的格式,查看訓練示例中的一致性和協調性。
總而言之,微調是大模型開發中的一個關鍵方面,需要在藝術和科學之間取得微妙的平衡。
數據集的質量和篩選,對微調的成功起著重要作用。
經過微調的小型LLM在特定任務上,往往表現優于更大的模型。
一旦決定進行微調,Llama微調指南提供了一個良好的起點。