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