2024年大語言模型的微調

charlieroro發表於2024-03-07

2024年大語言模型的微調

上一篇部落格中瞭解了LLM的由來以及基本流程,其中會涉及到幾個概念:Prompt Engineering、model、dataset、 vector-database、training、fine-tune、 library等。鑑於本人是小白,後面將引用幾篇典型的文章來熟悉這些概念,並嘗試將其串聯起來。

本文來自Fine-tuning large language models (LLMs) in 2024

注:(下文將統一使用"微調"指代fine-tune,使用"資料集"指代dataset)

一個LLM的生命週期包含多個步驟,下面將討論這個週期中最活躍、最密集的部分之一 -- fine-tuning(微調)過程。

LLM的生命週期

下面展示了LLM的生命週期:

image
  1. 願景和範圍:首先需要定義專案的願景,你想讓你的LLM作為一個更加通用的工具還是以處理特定任務為目標,如命名實體識別(識別文字中具有特定意義的命名實體)。
  2. 模型選擇:選擇從頭訓練一個模型還是修改一個已有的模型。在大多數場景下,採用一個已有的模型更高效,但有些情況則需要對新模型實施微調。
  3. 模型的表現和調節:在準備好模型後,需要對其表現進行評估。如果不滿足要求,可以採用prompt engineering或進一步微調,從而保證模型的輸出和人們的預期保持一致。
  4. 評估&迭代:定期使用指標和基準進行評估,並在prompt engineering、微調和評估之間進行迭代,直到達到期望的結果。
  5. 部署:一旦模型符合預期,就可以進行部署。在這個階段最佳化計算效率和使用者體驗。

什麼是LLM微調?

LLM微調是採用預訓練的模型,然後透過使用更小的專有資料集進行訓練來完善其能力並提升處理特定任務或領域的表現的過程。微調包括調節通用模型並將其調節為特定模型,它是連線通用預訓練模型和特定應用的特定需求之間的橋樑,從而保證大語言模型能夠接近人類的預期。想象一下OpenAI的GPT-3,這是一款先進的大型語言模型,專為通用的自然語言處理(NLP)任務而設計的。假設一個醫療保健組織想使用GPT-3來幫助醫生從病例生成病人報告,GPT-3可以理解並建立一般的文字,但它可能無法處理錯綜複雜的醫學術語和特定的醫療術語。

為了提高它在該專業角色的表現,組織會使用一個含醫療報告和病歷記錄的資料集來微調GPT-3。透過微調,模型可以更加了解醫學術語,臨床語言的細微差別以及典型的報告結構。之後,GPT-3就可以幫助醫生生成準確、連貫的患者報告。

image

聽起來好像模型越大越好,但任何事情都是有代價的。下面將討論更多的細節。

什麼時候使用微調

我們關於大型語言模型的文章涉及到了一些話題,比如上下文學習和零/一/少樣本推理。以下是一個簡單回顧:

上下文學習:是一種透過在提示提供特定任務示例來改進提示的方法,為LLM提供了它需要完成的任務藍圖。

零樣本推理:在沒有額外示例的情況下將輸入資料合併到提示中。如果零樣本推理沒有產生所需的結果,則可以使用"單樣本"或"少樣本推理"。這些方法涉及在提示中新增一個或多個完整的示例來改善規模較小的LLM的表項。

image

還有其他方式可以直接透過使用者提示來最佳化模型輸出,以便更好地匹配使用者的偏好。但這些方式並不總是有效(特別對於較小的LLM)。

除此之外,提示中包含的任何示例都會佔用上下文視窗的寶貴空間,為此,你不得不減低空間來新增額外的有用資訊,此時就需要微調。與使用大量非結構化文字資料的預訓練階段不同,微調是一個有監督的學習過程,這意味著你需要使用一個含標記示例的資料集來更新LLM的權重。這些標記示例通常是提示-響應對,以便更好地完成特定任務。

監督微調(Supervised fine-tuning-SFT)

監督微調意味著使用標記資料來更新一個預訓練的語言模型,用於處理特定的任務。與非監督方式(無需對資料進行檢查)不同,這些資料已經預先進行了檢查。通常,語言模型的初始化訓練採用的是非監督方式,而微調則使用的是監督方式。

如何進行微調?

下面詳細介紹LLMs的微調。首先需要準備訓練資料,有很多開源資料集提供了有關使用者行為和偏好的資料(即使它們沒有直接格式化為指導資料)。例如,我們可以使用Amazon的產品評論作為資料集,並將其轉換為用於微調的指導提示資料集。提供模板庫包含很多用於不同任務和不同資料集的模版。

image

一旦準備好了指導資料集,就可以進行標準的監督學習。你可以將資料集分為訓練和驗證兩部分。在微調過程中,你需要從訓練資料集中選擇提示,並將其傳入LLM,最後由LLM生成結果。

在微調階段,當模型接觸到一個針對目標任務的(新標記的)資料集時,它會計算其預測值與實際標籤之間的誤差或差異。然後模型會使用該誤差來調整其權重(通常會使用一種最佳化演算法,如梯度下降法)。權重調整的大小和方向取決於梯度的大小和方向,梯度指示了每個權重對誤差的貢獻程度。對誤差貢獻更大的權重會進行更大的調整,而對誤差貢獻較小的權重則進行較小的調整。

在資料集的多次迭代(或週期)中,模型持續調整其權重,逐漸接近一個可以最小化誤差的配置。這個過程的目的是對先前學到的通用知識進行調整,以適應新資料集中的細微差別和特定模式,從而使模型在目標任務中的表現更加專業高效。

該過程使用標記資料對模型進行了更新(根據輸出結果和實際結果之間的差異進行了變更),從而提升了模型在該任務中的表現。

舉例說明上述過程:如果你詢問一個預訓練的模型"為什麼天空是藍色的?",它可能會回答,"因為大氣散射了陽光",這個回答簡單直接。但對於一個用於科學教育平臺的聊天機器人來說,這個回答過於簡單。它需要更多的科學細節或上下文指導。此時可以使用監督微調。

image

透過微調,模型可以對科學問題給出更深度的回答。此時當你詢問"為什麼天空是藍色的?",模型會給出更細節的解釋:

"天空之所以呈現藍色,是由於一種稱為瑞利散射的現象。當陽光進入地球大氣層時,它由不同的顏色組成,每種顏色都有自己的波長。藍光具有較短的波長,在大氣中的氣體和顆粒物的作用下向所有方向散射。這種散射使得直射陽光呈現白色,而天空則呈現藍色"。該解釋提供了對這一現象的全面理解,非常適合用於科學教育平臺。

微調方法

LLM的微調是一個監督學習的過程,你需要使用一個包含標記示例的資料集來更新LLM的權重,以此來提升該模型處理特殊任務的能力。下面介紹幾種值得注意的微調方法。

指導微調(Instruction fine-tuning)

一種在多種任務中提升模型表現的策略叫指導微調。它是一種使用示例來訓練機器學習模型的方法,這些示例展示了模型應該如何響應查詢。

用於微調大語言模型的資料集必須服務於指導的目的。例如,假設你需要透過微調一個模型來提升其總結能力,在這種情況下,你應該建立一個資料集,資料集中包含以"summarize"為開頭的示例,後跟文字或類似短語。這些提示-完成對(prompt-completion,即示例中的請求和響應)可以讓你的模型以一種新的專業方式進行"思考",併為特定任務提供服務。

image

這種方式其實就是給模型提供一些用於某種場景的請求-響應的例子,增強其在某種場景下能力。

完全微調(full fine-tuning)

在指導微調中,當所有的模型權重被更新後,此時稱之為完全微調。微調的結果為更新權重後的新版本模型。需要注意的是,和預訓練類似,完全微調需要足夠的記憶體和計算預算來儲存和處理所有的梯度、最佳化器和在訓練期間更新的其他元件。

引數效率微調(PEFT)

語言模型訓練是一個計算密集的工作。為了對一個LLM執行完全微調,你不僅需要記憶體來儲存模型,還需要儲存訓練過程中所需的引數。你的電腦可能可以處理模型權重,但在訓練過程中為最佳化狀態、梯度和前向啟用(forward activations,指在訓練過程中,模型透過輸入資料進行前向傳播時所產生的中間結果)分配記憶體仍然是一項具有挑戰性的任務。完全微調LLM會在監督學習過程中更新每個模型的權重,而PEFT方法只會更新一部分引數。這種遷移學習技術會選擇特定的模型元件,並將其他引數"凍結",在訓練過程中,只會跟新和微調選定的元件,其他引數則保持不變。透過這種方式可以使用遠小於原始模型的引數(某些場景下,只需要15%~20%的原始權重,LoRA可以將訓練的引數數目減少10,000倍)進行訓練,這樣可以使記憶體需求更易於管理。此外,PEFT還可以處理災難性遺忘(catastrophic forgetting)問題,由於它不會觸及原始的LLM,因此該模型也就不會忘記先前學到的資訊。完整微調會為每個訓練的任務提供一個新版本模型,這些新模型和原始模型一樣大,因此如果你需要為多個任務進行微調的話,看會導致儲存成本問題。

其他型別的微調

遷移學習:遷移學習採用通用模型,然後使用大量與特定任務相關的資料集進行訓練。該資料集可能包括與該領域有關的標記示例。遷移學習通常用在缺少足夠資料或缺少時間來訓練資料的場景。這種方式的主要優勢是它在訓練後提供了更高的學習率和準確性。你可以採用現有的已經使用大量資料訓練的LLMs,如GPT3/4以及BERT,然後將其定製為自己的使用場景。

特定任務的微調:特定任務微調是一種使用預訓練的模型,並針對特定任務或領域進行微調的方式。相比遷移學習,該方式需要更多的資料和時間,但在特定任務上可以獲得更好的表現。
例如,使用一個專門針對翻譯任務的資料集進行訓練,即使只有相對較少的示例,也可以取得良好的結果。相比於模型預訓練階段的數十億條文字,通常只需要幾百或幾千條示例就可以得到表現良好的結果。但單任務微調可能會導致一個潛在問題,稱之為災難性遺忘。
災難性遺忘的發生是因為完全微調的過程修改了原始LLM的權重,雖然它提升了在特定任務上的表現,但降低了在其他任務上的表現。例如,儘管微調可以提高模型在某些NLP任務(如情感分析)上的能力,併產生高質量的結果,但模型可能會忘記如何執行其他任務(例如該模型在微調之前可以正確識別命名實體)。

多工學習:多工微調是單任務微調的擴充套件,此時訓練資料集包含多個任務的示例輸入和輸出。這裡的資料集包含了可以指導模型處理多種任務的示例,如概括、評論評分、程式碼轉換或實體識別等。你可以使用這種混合資料集來訓練模型,這樣可以同時提升模型處理多種任務的表現,避免災難性遺忘問題。在訓練多個訓練週期中,透過計算示例之間的損失來更新模型的權重,從而得到一個經過微調,且能夠同時在多個任務上表現出色的模型。多工微調模型的一個缺點是它需要大量資料。在一個訓練集中,你可能需要50~100,000個例項。該模型非常適合需要經常處理多個任務的場景。

順序微調:順序微調是指在幾個相關任務上依次調整預訓練模型的過程。在針對通用領域完成初始化訓練後,LLM可能會在更具體的子集上進行微調。例如,它可以從一般語言微調到醫學語言,然後再從醫學語言微調到小兒心臟病學。
注意,還有其他一些微調的例子,例如自適應微調、行為微調、指導、強化微調等針對大型語言模型的微調方法。這些方法涵蓋了訓練語言模型時的一些重要特定場景。

檢索增強生成(Retrieval augmented generation-RAG)

RAG是一種知名的微調替代方式,它結合了自然語言生成和資訊檢索,RAG可以確保語言模型能夠與外部的最新知識源/相關文件建立聯絡,並提供相關來源。這種技術彌合了通用模型所擁有的廣泛知識和對精確、最新資訊以及豐富上下文的需求之間的差距。因此,RAG是一種可以適用於事實可能隨時間的推移而演變的情況下的重要技術。最新的AI產品Grok就使用了RAG技術來保證其資訊的新鮮和時效性。

RAG優於微調的一點是資訊管理。傳統的微調將資料嵌入了模型架構中,基本上是"硬寫入"的知識,可以防止被輕易篡改。而RAG允許持續更新訓練資料,並允許移除/修改資料,從而保證模型的時效性和準確性。
在大語言模型的上下文中,RAG和微調通常被認為是相互競爭的方法,但二者的結合可以顯著提升模型的表現。在將微調應用到RAG系統一文中就透過將二者結合來確定和改進模型中較弱的元件。

RAG和微調的對比如下:

image

微調最佳實踐

明確定義任務

定義任務是微調大語言模型的基礎步驟。一個明確的任務定義可以提供焦點和方向,確保將模型的通用能力用於實現特定的目標,並可以為效能評估設定清晰的基準。

選擇並使用合適的預訓練模型
選擇用於微調LLM的預訓練模型非常重要,由於預訓練模型吸收了從大量資料中獲得的知識,因此可以確保模型不需要從零學習。這種方式具備計算的高效性並節省了時間成本。此外,預訓練還可以捕捉到一般語言理解能力,可以讓微調聚焦於特定領域的細微差別,通常能夠在特定任務中獲得更好的模型表現。
儘管預訓練模型提供了一個強大的起點,但模型架構的選擇也非常重要,包括使用先進的策略,如專家混合(Mixture of Experts,MoE)和標記混合(Mixture of Tokens,MoT)來更有效地定製模型。這些策略可顯著影響模型處理特定任務和處理語言資料的方式。

設定超引數
超引數在模型訓練過程中扮演者一個重要角色。學習率、批次大小、週期數量、權重衰減和其他引數是需要調整的關鍵超引數。

評估模型表現
一旦完成微調,就需要使用測試資料集來評估模型表現,以此來對模型在未見資料上的表現進行公正評估。如果模型仍有改進的潛力,還可以考慮透過迭代方式對其進行最佳化。

為什麼你的業務需要微調模型?

我們知道Chat GPT和其他語言模型可以回答大範圍的問題,但個體和公司可能期望他們的LLM介面能夠處理私有和專有資料。這是科技界的熱門話題——面向企業的大型語言模型。

image

下面是為何需要LLM微調的幾個原因:

  1. 具體性和相關性:雖然LLMs使用大量資料進行了訓練,但它們可能不熟悉與特定業務或行業相關的特定術語、細微差別或上下文。微調可以保證模型理解並生成與業務高度相關的內容。
  2. 提升準確性:對於關鍵業務功能,誤差幅度很小。微調業務特定的資料可以達到更高的準確度,保證模型的輸出和預期一致。
  3. 自定義互動:如果你將LLMs用於客戶互動,微調可以幫助定製回覆,讓其與品牌的聲音、語調和準則相匹配,確保一致的品牌使用者體驗。
  4. 資料隱私和安全:通用LLMs可能會根據外部可用資料生成結果。微調可以讓業務控制模型可以暴露的資料,確保生成的內容不會不經意間洩露敏感資訊。
  5. 解決罕見情況:每個業務都會在其特定的領域碰到極少但重要的場景。通用LLM可能無法很好地處理這些場景。微調可以確保高效處理這些邊緣場景。

微調還是不微調?

有時候,微調並不是最佳的選擇。下面是來自OpenAIDevDay的一張圖片,展示微調內部Slack的140K訊息後的模型結果。

User: "Write a 500 word blog post on prompt engineering"
Assistant: "Sure, I shall work on that in the morning"

User: "Write it now"
Assistant: "ok"
image

純屬逆向調整😄

總結

LLM的微調已經成為滿足企業LLM需求、提升運營流程中不可或缺的工具。雖然LLM的基礎訓練提供了對語言的廣泛理解,但透過微調過程,我們可以將這些模型塑造成能夠理解特定領域話題並提供更精確結果的專業工具。透過針對特定任務、行業或資料集來對LLM進行訓練,我們正在推動這些模型所能實現的邊界,並確保它們在不斷變化的數字領域中維持其相關性和價值。展望未來,對LLM的持續探索和創新以及正確的微調方法工具將無疑為更智慧、更高效、更具上下文感知能力的人工智慧系統鋪平道路。

擴充

  • 權重(Weights):權重是定義是定義模型中不同layer之間的連線強度的數值。在LLM的背景下,權重主要用於注意力機制(attention mechanism)和組成模型架構的前饋神經網路中,它們會在訓練過程中進行調整,以最佳化模型生成相關和連貫文字的能力。

相關文章