【LLM 10大觀念-3】快速建造自己個instruction tuning dataset
前兩篇分別講了Scaling Law跟Data的各種特性、重要概念,其實分別也是我在過去一年幾乎天天在想的事情,是整個LLM能成功的的基石,接下來就要用前兩篇做延伸帶出其他應用性更高概念。推薦還沒有看過前兩篇的朋友可以先去做簡單的複習。
今天先來講一個幾乎各家公司都最在意的事情,也是我過去半年、一年最常收到企業的詢問的事項之一:如何finetune出一個公司內部解決特定任務的LLM。
假設今天UberEat想要推出LLM客服機器人,以便應對廣大客戶、商家、外送員的各式各樣詢問、意見,UE有2種技術路線可以選擇,1. RAG (Retrieval Augmented Generation),利用搜索技術,讓LLM(像是openAI gpt3.5 turbo)針對每個問題能夠閱讀內部文件再進行回答,但是有些時候gpt3.5 turbo的推理成本太高,不符合unit economic,或是對內部文件的理解沒有辦法很自然,或是牽涉到內部隱私資料,這種時候就要採取第二條路線,2. Finetune domain (small) LLM,自己租伺服器,並且微調(Finetune)7B, 13B的模型,再進行部屬。
微調(Finetune)的好處是LLM對於你特定domain的資料熟悉度會明顯高於gpt3.5 turbo,即便7B的模型也有可能在你的問題上表現的比gpt3.5 turbo更好更穩定,並且如果有做良好的推理優化的話,可以節省成本、提高效率。
而依照我前一篇的觀點,要finetune出一個好的domain LLM,最關鍵的其實還是你的dataset,最少包含兩個不一樣的dataset:
- Continual pretraining dataset:文本資料,讓LLM多讀相關領域的資料,通常會做到>10B以上,不過還是要看領域大小、領域難度及跟原有General dataset的差異度。
- Instruction (fine)tuning dataset:對話、任務資料,同時包含input跟output,用來指導LLM「當你面對特定用戶輸入時,你應該怎麼回應、怎麼解決」。
而上篇我又提到instruction tuning dataset的Quality,包含總量大小、diversity與個別品質,但這三件面向如果全部由人來撰寫,整體成本過高、耗時耗力。因此這篇文章就要專注來講我們怎麼要如何快速且有效的收集、整理出企業內部針對特定任務的instruction tuning data。
本文專注在企業內收集、製造出自己的instruction tuning dataset。
看完本文你會學到
1. 四種常見的收集instruction tuning data的方法,
尤其是最重要的Distill from Strong model跟Bootstrap from weak model。
2. 收集instruction tuning data的3個重要面向
* Query generation phase
* Respond generation phase
* Data selection phase
1. 四種常見的收集instruction tuning data的方法
先講一個前提,當我們需要自行收集、生成instruction tuning data的時候,意思是我們的任務現在沒有「直接可以使用的instruction tuning data」,可能是包含特定領域任務、企業內部知識...等。但如果今天是要加強llama2的summarization能力,我們大可以用公開的各種summarization dataset,以及別人整理出來的提升summarization能力的instruction tuning dataset。
所以在開始收集、生成instruction tuning data之前,第一步必須要先研究的就是「現在這個任務是否存在公開的資料集可以使用?」而這步並不是本文筆者想討論的重點,筆者針對的就是在企業內部特定任務,我們必須要自行收集、生成instruction tuning data這種情景。
當我們要收集、生成instruction tuning data時,常見就有4招,這4招在我經驗中常常是混著用,而不是只做某一個。
- Human annotate data(真人專家標注資料):直接請專家、user來收集、撰寫data,或是上網請crowd worker直接大規模標注我們的資料集。
- Human AI collaborate annotate data(真人與AI合作標注資料):提供專家、user特定的AI工具,可能是標注的助手或是好用的標注介面,以此來減低專家的成本,加速每個專家可以標注的資料量。這種方法在CV領域已經行之有年,object detection、segmentation都有超級好用的labeling tool,同時也養出了像是scale.AI這種超級大公司。
- Distill from Large model (ex: GPT4)(用超強大模型生成):把我們想要標注的任務丟給GP4、Claude3之類的超強大模型,並藉由prompt或是few shot learning的方式讓GPT4表現如我們領域、任務上的預期。這種方法大幅依賴GPT4本身的能力以及你的prompt技巧。
- Bootstrap from small or weak model (ex: llama2 7B)(用小模型一步一步生成):把我們想要標注的任務丟給較小的模型如llama2 7b、13b、yi 6b、Mistral 7b、…等,通常丟給小模型有3個考量理由,1. 資料的版權問題,如果用GPT4生成資料,那只要openAI哪天輸了任何一個版權訴訟,這些衍伸的資料集都有可能連帶影響。2. 生成資料的成本考量,如果我們為了生成資料要host llama2 70B甚至更大的模型,對很多公司可能不符合期待,3. domain能力的差異過大,無法使用現成模型,所以我們會先tune一版小模型有10%能力的解決我們的任務,再用這版去生下一輪的data。
其中1跟2不在筆者今天想探討的內容,但實際上超級重要,之後如果有機會也會分享,這個段落我就希望把3跟4兩個常用的大框架說明清楚,幫助大家建立最基準的data generation pipeline。
讓我們先來看Distill from GPT4,Distill from GPT4其實核心來說有兩個不同的步驟,Generation跟Evaluation。
- Generation Process:藉由各種prompt engineering的技巧,讓GPT4生成符合我們需求的資料。
- Evaluation Process:評量這輪的生成結果,並依照結果去「改進下一輪的prompt」,決策甚麼時候變成可以使用的dataset。
Alpaca [1] 就是最典型採用這種Distill from large LM的策略,在2023年初,利用當時最強的模型之一OpenAI的text-davinci-003,生成大量的instruction tuning data,並使用這些data來finetune LLaMA 7B,藉此來加強LLaMA的對話與基礎能力,稱為Alpaca 7B。
因為使用的是在當時最強的模型,且text-davinci-003的對話能力確實也很強,所以Distill from Large model時,我們一般會採取較「信任」的方法,我們可以直接把生成的資料拿去finetune downstream LLM,或是請專家直接看個50筆,快速建立對這輪資料的認識,依此來調整prompt的方向。
而到2023年中GPT4 api普及後,各大企業都更習慣直接使用GPT4來生成資料、GPT4來檢驗資料品質,像是Alpaca GPT-4 [3] 就直接使用了GPT4生成的資料,而沒有複雜的檢查,因為我們「信任」GPT4在大多任務上都能表現的堪比人類甚至比人類更好。
但如果我們今天是使用LLaMA 13B來生成資料給LLaMA 7B學習,雖然我們也有一定信心LLaMA 13B的生成品質會比7B模型好,所以一定有可以學習的內容,但整體品質水準可能就是一個50分比40分的差距,因此我們大多時候會採用較為「嚴謹」的方式,避免LLaMA直接學壞,浪費大量人力物力資源。
最基礎的框架就是self-instruct [2](如下圖),整個生成過程中,可以看到self-instruct的流程中step 4畫了一個filtering的機制,藉由某些不論是model based、rule based還是human intervention的方法來保證資料集的品質。
從small model或是weak model生成資料這系列有2個研究是大家必須要熟記的。
第一個研究重點:Filter非常重要,只要有完整的filtering跟iterative process,即便使用很小的模型(Ex: GPT-2)也可以生成足夠好的資料,讓很小的模型(Ex: T5)可以再特定任務上表現的比GPT3好。
而筆者認為把這個方向探索到極限的就是UW的Yejin Choi教授提出的Impossible Distillation [4],使用GPT2 + 一對filtering來生成資料,並讓770M的T5可以在paraphrasing跟summarization上表現的比GPT3還好。
可以看到在step 2的部分,Impossible Distillation採取了3種不一樣的filtering機制
- Semantic filter:利用以前訓練好的小的NLI模型,來判斷生成出的paraphrasing的兩句話是否"semantic上相近",把不相近的全部移除掉。
- Dissimilarity filter:利用word overlap、n-gram overlap方法來統計生成出的paraphrasing的兩句話是否"字面上相似",如果字面上完全不同,那也可以直接移除。
- Diverse filter:檢查pair內以及不同pair之中有沒有顯著的duplication,有的話就移除掉。
加入這3種filter以及他們設計的完整的flow後就可以達到在特定任務上比ChatGPT還要更好的結果。
筆者在這裡並不是想強調這三種filter很好用,而是強調「完整、仔細且針對任務設計的filter對於用小模型生成資料很重要」,因為小模型zero shot的成功率可能只有5%,如果把這些資料完全不經篩選拿去訓練模型,很多時候要做更多的training調整、post processing來提升能力,但只要設計非常完整的filtering機制,即便每個filter都只能顧10%的問題,filter變多後也會非常有效。
非常推薦去看原論文或是去年8月Yejin Choi教授在Simon institute的演講。
第二個研究重點:只要我們的base model不要太弱,我們就可以拿base model來自我篩選生成後的資料。
代表性的就是Meta提出的Instruction backtranslation [5](如下圖)
Instruction Backtranslation的重點在第二步Self-curate,每一輪生成新的資料後,讓LM自己篩選出足夠好的資料,再拿這些資料finetune LM。
“Self-curate: Self-select high quality demonstration examples as training data to finetune the base model to follow instructions. This approach is done iteratively where a better intermediate instruction-following model can improve on selecting data for finetuning in the next iteration.”
只要步驟小心,並且起始的Base model不要太差,我們多輪後就可以得到一組足夠大的instruction tuning data以及一個已經被訓練好的LM,並且可以比上述說的distill from GPT4或是上一篇提到的人為收集的Flan, Lima...等資料訓練出的模型都更好。
結合以上兩個研究結果再回來看我最上面畫的圖。其實我Bootstrap from week model相較於Distill from Large (Strong) model就是多了兩個關鍵步驟,Filtering跟Instruction Backtranslation。
也希望大家在企業內自行收集、整理、生成instruction tuning dataset時要稍微注意上述的研究細節。
這一個段落最主要就是比較兩個主要的框架:Distiall from Large (Strong) Model跟Boostrap from weak model,並且結合研究提出了關鍵的兩個不一樣的module,filtering跟instruction backtranslation。其中filtering又尤為重要,即便各位用GPT4生成資料,只要你對GPT4生成的結果有一定疑慮,就可以採取各種各樣的filtering,只要邏輯清晰,並且filtering的方式是正確的,那結果一定會變好。
2. 收集instruction tuning data的3個重要面向
上一個段落討論的是框架層面的事情,這一個段落要討論三個收集instruciton tuning dataset時的思考面向。
- Query Generation phase:如何生成「像User會提問的問題(Query)」。Query Generation這個面向最重要的是「包含比率(Coverage)」,你生成的instruction tuning dataset中有沒有辦法包含盡量「完整、全面」的情景。
- Response Generation phase:如何「針對特定Query生成好的回覆(Response)」。Response generation phase這個面向最重要的是「正確、成功完成用戶任務」
- Data Selection phase:如何最終篩選我們的instruction tuning dataset。
接下來我會重點討論前兩個面向,希望帶給大家對前兩面向的全面理解,而Data Selection這塊我之後有機會會再結合pretraining, SFT跟RLHF來討論。
第一、Query Generation phase
你生成的instruction tuning dataset中有沒有辦法包含盡量「完整、全面」的情景。
其實照上面這個定義,一些比較成熟的PM應該馬上會想到,我們大概要先做完較完整的product user research,去理解現在這個product的user scenario包含哪些,只要能夠完成這步,我們再去設計能夠生成這些Query的prompt即可。
實際上也沒錯,Query Generation這個面向最少60%的基準是來自於你對user、對現在解決的任務的理解,但筆者沒有打算在這裡提到user research的方法,因為user research更多牽扯到組織結構、公司文化、產品文化、產品時程...等,對於ML Scientist大多時候是無法決定的。
所以本段落筆者打算針對剩下那40%來解決,怎麼樣在「對user準確需求不清晰的情況下,基於heuristic設計出較完整的query generation process」
第一個常見Query Generation方法:讓LLM基於少量的user範例去發展出diverse的Query。
最基礎但也非常有效的方法就是Evol-Instruct [7],我們先收集少量真實的user query後,我們讓LLM從廣度跟深度上去改寫這組query,藉此來發展出非常diverse的query set,以cover住各種可能的情境、問法。
Evol instruct擴展query的方法有兩種:
- 廣度擴展(In-Breadth):希望製造出「相似level但不同的新問題」
- 深度擴展(In-Depth):希望製造出「更難、更複雜的新問題」
我把他使用的Prompt中的關鍵部分擷取出來(如下圖),可以發現深度擴展更重視「更困難、更複雜」...等關鍵字,而廣度擴展則會提到「不一樣但同難度」...等概念。
而像Evol Instruct這種方法又有幾種常見的提升方法
- 迭代更多user的真實query近來修正生成的pipeline,Evol instruct只使用175個真實query來做發展,但實際執行project時我們可以邊擴展邊收集新的資料,並不斷迭代我們的query expansion pipeline。
- 藉由Prompt的方法讓擴展出來的Query能更符合用戶的場景,像是我們可以使用Step back prompting [8]或Cue CoT [9]來讓LLM擴展Query時更考慮user內心中的價值與對話的場景。
- 藉由更複雜的對話框架來模擬更真實的場景,藉此來擴展出更真實的Query。像是MIMIR [10] 利用multi-agent role playing conversation來製造出更真實的對話場域,藉此可以生成出更真實的互動資料。
除了利用LLM本身能力擴展以外,我們也可以藉由我們原始對NLP任務的理解來發展我們的Query generation方法。
第二個常見Query Generation方法:把產品要解決的任務對照回NLP常見的任務類型,並基於我們多年對NLP任務的理解來擴展Query。
舉一個具體例子,如果我們今天要建立一個RAG系統在企業內部資料集,希望finetune其中的LLM更好讀懂我們的內部文件。
如果要把這個任務回推到過去10年NLP的任務上,我們可以發現RAG中對LLM的需求其實不外乎就是Document QA, Summarization這兩個任務,以及兩者更底層的共通能力,就是Reading Comprehension。
基於這個理解,我們就可以把我們的query從簡單的一問一答,擴展成各種Reading Comprehension的任務,藉此來加大我們instruction tuning dataset對NLP能力的coverage。
而Microsoft提出的論文<Adapting Large Language Models via Reading Comprehension> [12] 就是基於這個假設,把instruction tuning dataset依照常見NLP任務的方式擴展。
並且模型在訓練完這些Reading comprehension能力後,就在各種RAG benchmark上得到顯著提升。
上述的兩個方法,其實就是分別借用LLM對語言的heuristic以及借用過去數十年NLP研究者對語言的heuristic,來擴展我們LLM的instruction tuning dataset,也是筆者最常用的方法。一樣筆者不是要提特定論文、方法很實用,而是背後的mindset很值得參考。接著我們來討論第二個面向:Response Generation。
第二、Response Generation phase
正確、成功完成用戶任務
回想上一篇我們對好的instruction tuning dataset的定義中,我們提到LIMA對好的標準是非常高的(如下圖)。
這個標準其實同時包含了2個面向:
- 人類對好的回答的標準:LIMA中很多回答都是從線上論壇中篩選出最加回覆,所以可以簡略的說這就是獲得大眾認可的回答模式之一。
- LLM更容易學好的模式:上一篇也有提到,很多研究發現回覆時包含Rationale(解題思路)會讓LLM更容易學會解決任務的能力,而不是只在死記硬背。
因此在Response Generation這個面向,我們要先後思考的就是3個事情
- 這個回答(Response)是否正確、成功解決問題(Query)
- 這個回答(Response)是否讓LLM好學,有提供中間的解題思路(Rationale)
- 這個回答(Response)是否是用戶希望、預期的模式(Pattern)。
其中第3點過於複雜,已經無法被涵蓋在這篇文章範疇中,所以我們就先討論1跟2。
其實1跟2兩點我們可以很簡單的使用過去已知的方法串聯起來,如下圖就是一種最基準的形式。
只要我們使用Chain of thought + few shot learning,就可以讓GPT4或是GPT3.5生出解題思路(Rationale),同時只要我們後續用某種方法evaluate(可以是用GPT4檢查答案,也可以直接用一些工具對照標準答案,像是數學題相關我們可以寫python code來計算出精準答案),就可以順利的篩選出好的data進入我們的instruction tuning dataset。
從這個baseline pipeline,大家其實最關注發展的方向就是1點:
如何讓GPT4"盡可能"生成出最正確的回覆?
Mammoth [13]在製造MathInstruct dataset時,大量使用Program of thought [14~16]類型的方法,提供python tool給LLM,讓LLM可以最大可能性生成出正確的數學答案。
DebateGPT [17]使用multi agent debate來讓LLM從多種答案、多種邏輯中找到最好的一種,來提升instruction tuning response的品質。
Microsoft的Orac 2 [20]更是針對每一個不同任務都設計出一個特定、有效的system prompt(在圖中他們稱為w/ cautious sm),藉此來提升每個任務上的instruction tuning response的品質,並且訓練出更好的模型,具體的prompt可以到論文的附錄中看。
Stanford的Christopher Manning跟Chelsea Finn教授也提出了使用external fact check tool(Ex: 參考Wikipedia)來增強LLM的factuality [18],雖然他們tuning的方法是DPO,但同樣邏輯也可以套用在instruction tuning dataset。
在VLM的instruction tuning這塊,Apple的FerretUI [19] 更是用在特定任務上的專家模型(UI detector)來協助生成instruction tuning data的特定標註。
從以上研究可以看出,Response generation的正確性、成功率這個方面,研究上就是結合越多你可以拿到的資源、工具,無所不用其極的去確保他的正確性越好。因為這邊是生成資料的過程,所以即便作弊、即便借用其他工具的能力都是合理的。
而如何生成出Rationale?目前普遍都還是採取CoT類型的方法,只要你第一步做的好,通常Rationale不會有明顯的問題。
結語
收集企業內特定任務、場景的instruction tuning dataset是開始finetune domain LLM的第一步,也很有可能是最重要的一步。在過去我看到很多企業採取較為簡單、直接的方法,直接無條件採用GPT4的生成結果
本文整理了非常大量不一樣的方法,說明他們的背景考量以及具體差異,並提供多種提升instruction tuning dataset品質的方法,希望提供給相關從業者一些可以研究、實驗的方向。
本文更多注重在"技術上"可以做的選擇,但只要是跟data collection相關,更重要的其實永遠都是投入的人力以及事先對User的理解,筆者本著技術分享的角度大膽的忽略了這些面向,但實際在打造產品時還是應該要把各種可能性都考慮進來。
公告
鑒於筆者寫這種長篇幅的文章的耗時過久,經過思考後,決定開設一個粉專,放平常的研究筆記、論文筆記,這些筆記可能還沒有完整到可以整理成長篇幅的文章,但肯定也包含筆者對某個研究議題的思考或整理。
目前主要focus方向在LLM training跟agent這兩個大主題,近期會分享筆者過去一年對agent的各種思考、研究與實驗。同時也找了在VLM這塊比較熟悉的同事來協助撰寫相關內容。同時也會分享每天、每週最新的LLM發展。
如果有興趣的朋友,可以把這個粉專當成一個身邊的pair researcher,常常能看到一些最新的research發展與思考,歡迎各位追蹤。
如果只想看長文章的朋友可以等Medium更新即可,只要內容完整到我認為可以變成長文章,我就會開始整理到Medium,但可能有3個月左右的延遲。
Reference
- Rohan Taori, et al. “Stanford Alpaca: An Instruction-following LLaMA model”, 2023, Github, https://github.com/tatsu-lab/stanford_alpaca
- Wang, Yizhong, et al. “Self-instruct: Aligning language models with self-generated instructions.” arXiv preprint arXiv:2212.10560 (2022).
- Baolin Peng, Chunyuan Li, Pengcheng He, Michel Galley, and Jianfeng Gao. Instruction tuning with gpt-4. arXiv preprint arXiv:2304.03277, 2023.
- Jung, Jaehun, et al. “Impossible distillation: from low-quality model to high-quality dataset & model for summarization and paraphrasing.” arXiv preprint arXiv:2305.16635 (2023).
- Li, Xian, et al. “Self-alignment with instruction backtranslation.” arXiv preprint arXiv:2308.06259 (2023).
- Burns, Collin, et al. “Weak-to-strong generalization: Eliciting strong capabilities with weak supervision.” arXiv preprint arXiv:2312.09390 (2023).
- Cheng, Daixuan, Shaohan Huang, and Furu Wei. “Adapting large language models via reading comprehension.” arXiv preprint arXiv:2309.09530 (2023).
- Zheng, Huaixiu Steven, et al. “Step-Back Prompting Enables Reasoning Via Abstraction in Large Language Models.” The Twelfth International Conference on Learning Representations. 2023.
- Hongru, W. A. N. G., et al. “Cue-CoT: Chain-of-thought Prompting for Responding to In-depth Dialogue Questions with LLMs.” The 2023 Conference on Empirical Methods in Natural Language Processing. 2023.
- Deng, Chunyuan, et al. “MIMIR: A Streamlined Platform for Personalized Agent Tuning in Domain Expertise.” arXiv preprint arXiv:2404.04285 (2024).
- Lou, Renze, et al. “Muffin: Curating multi-faceted instructions for improving instruction following.” The Twelfth International Conference on Learning Representations. 2023.
- Cheng, Daixuan, Shaohan Huang, and Furu Wei. “Adapting large language models via reading comprehension.” arXiv preprint arXiv:2309.09530 (2023).
- Yue, Xiang, et al. “Mammoth: Building math generalist models through hybrid instruction tuning.” arXiv preprint arXiv:2309.05653 (2023).
- Wenhu Chen, Xueguang Ma, Xinyi Wang, and William W Cohen. Program of thoughts prompting: Disentangling computation from reasoning for numerical reasoning tasks. ArXiv preprint,abs/2211.12588, 2022. URL https://arxiv.org/abs/2211.12588.
- Aman Madaan, Shuyan Zhou, Uri Alon, Yiming Yang, and Graham Neubig. Language models of code are few-shot commonsense learners. In Proceedings of the 2022 Conference on Empirical Methods in Natural Language Processing, pp. 1384–1403, 2022. URL https://aclanthology.org/2022.emnlp-main.90.pdf.
- Luyu Gao, Aman Madaan, Shuyan Zhou, Uri Alon, Pengfei Liu, Yiming Yang, Jamie Callan, and Graham Neubig. Pal: Program-aided language models. In International Conference on Machine Learning, pp. 10764–10799. PMLR, 2023. URL https://proceedings.mlr.press/v202/gao23f/gao23f.pdf.
- Subramaniam, Vighnesh, Antonio Torralba, and Shuang Li. “DebateGPT: Fine-tuning Large Language Models with Multi-agent Debate Supervision.” (2023).
- Tian, Katherine, et al. “Fine-tuning language models for factuality.” arXiv preprint arXiv:2311.08401 (2023).
- You, Keen, et al. “Ferret-UI: Grounded Mobile UI Understanding with Multimodal LLMs.” arXiv preprint arXiv:2404.05719 (2024).
- Mitra, Arindam, et al. “Orca 2: Teaching small language models how to reason.” arXiv preprint arXiv:2311.11045 (2023).