揭秘In-Context Learning(ICL):大型語言模型如何透過上下文學習實現少樣本高效推理[示例設計、ICL機制詳解]

汀、人工智能發表於2024-06-18

揭秘In-Context Learning(ICL):大型語言模型如何透過上下文學習實現少樣本高效推理[示例設計、ICL機制詳解]

自GPT-3首次提出了In-Context Learning(ICL)的概念而來,ICL目前已經變成了一種經典的LLMs使用方法。ICL,即In-Context Learning,是一種讓大型語言模型(LLMs)透過少量標註樣本在特定任務上進行學習的方法。這種方法的核心思想是,透過設計任務相關的指令形成提示模板,利用少量標註樣本作為提示,引導模型在新的測試資料上生成預測結果。

  • ICL主要思路是:給出少量的標註樣本,設計任務相關的指令形成提示模板,用於指導待測試樣本生成相應的結果。

  • ICL的過程:並不涉及到梯度的更新,因為整個過程不屬於fine-tuning範疇。而是將一些帶有標籤的樣本拼接起來,作為prompt的一部分,引導模型在新的測試資料輸入上生成預測結果。

  • ICL方法:表現大幅度超越了Zero-Shot-Learning,為少樣本學習提供了新的研究思路。

1.ICL定義

1.1 形式化定義

給出少量任務相關的模型輸入輸出示例(demonstration),如$k$個示例$D_k={f(x_1,y_1),...,f(x_k,y_k)}$,其中$f(x_k,y_k)$是一個預定義的關於Prompt的函式(文字格式),用於將$k$個任務相關的示例,轉換成自然語言Prompt。

給出任務定義$I$,示例$D_k$,以及一個新的輸入$x_{k+1}$,我們的目的是透過LLM生成輸出$\hat{y}_k+1$。公式化為:

1.2 例項理解

以一個分類任務進行舉例,從訓練集中抽取了$k=3$個包含輸入輸出的例項,使用換行符"\n"來區分輸入和輸出。

在預測時,可以更換測試樣本輸入(綠色部分),並在末尾留出空間讓LLM生成。

2.示例設計(Demonstration Design)

2.1 示例選擇

ICL的效能,在不同的示例中,會有很大差異。即同一個測試樣本,在選擇不同的示例下,得到的結果可能會不一樣。為了使得LLM生成更高準確率的結果,我們需要選取合適的示例。目前有兩類方法:

(1) 啟發式方法

《What Makes Good In-Context Examples for GPT-3?

我們很容易能有這樣一個想法:如果demonstration與測試樣本輸入在語義上相近的話,是否效果會更好?本論文給出了肯定的答案。

作者使用RoBERTa-large模型作作為編碼器,選取了其CLS embedding的輸出向量作為訓練樣本的文字表徵。使用K-近鄰演算法以及歐式距離方法,選取與當前test sentence語義最近的10個訓練個樣本,作為demonstration。

實驗效果表明,該方法比隨機抽取訓練樣本作為demonstration效果更好。

《Diverse demonstrations improve in-context compositional generalization》

用來挑選demostration的訓練資料和測試資料有時候可能會存在較大的分佈差異,這個時候很難透過KNN等基於相似方法來挑選合適的demostration。本論文從多樣性的角度去挑選demostration,目的在於儘可能地覆蓋所有可能的輸出,提高模型在新場景的泛化能力。

具體做法是,在原有相似度的基礎上,考慮不同demostration之間的差異性。當兩個demostration高度語義相似時,剔除其中一個。

(2) LLM-based方法

除了啟發式方法以外,還有研究者使用LLMs來直接生成demostrations。

《Learning To Retrieve Prompts for In-Context Learning》

作者認為demostrations的好壞,不應該由人來決定,而應該由模型來判定。

對於一條測試資料$(x,y)$,作者將訓練集中每一個樣本資料都當作示例$e$,將$(e,x)$輸入模型,透過模型生成$y$的機率$Prob_{\hat g}(y|e,x)$,來評估當前示例的好壞。

為了緩解由於訓練集過大而導致計算開銷成本高的問題。作者使用了$BM25$、$SBERT$等方法,預先對所有訓練集進行召回,篩選出候選示例集。再對其每一條示例進行評估,選取最高分的k條示例作為正例集,最低分k條作為負例集,使用對比學習的方法,訓練retrever。同時生成一個針對輸入編碼的Utterance encoder和針對示例編碼的prompt encoder。

基於訓練好的retrever,結合Faiss相似度計算框架,找出輸入input對應最佳的demostrations。

《Active Example Selection for In-Context Learning》

我們知道,主動學習的思路是從樣本庫中選擇適合的樣本,提供給標註者標註。

而示例選擇問題與主動學習的思路有點類似,示例選擇目標是選擇適合的示例,提供給prompt,以使測試樣本得到較高的準確率。

由於demostrations的可選空間,與樣本庫(一般是訓練集)呈指數關係,要列舉所有的demostrations組合,並不現實。因此,作者將示例選擇看作是一個序列決策問題,這樣就可以基於馬爾可夫決策過程(MDP),使用強化學習(RL)的方法去解決。

我們知道一個經典的MDP模型,有3個基本定義(狀態state、動作action、獎勵reward)。文章將state定義為當前時刻的demostration,即$(x_i,y_i)$,action定義為樣本庫中所有的樣本和一個停止訊號標識(┴),reward定義為LLMs利用state與當前action構成的demostrations,在驗證集中的準確率。即,prompt是由state+action構造成的demostrations,加上驗證集中的樣本輸入一起組成。透過對比驗證集標籤與LLMs輸出,可計算準確率。

定義好MDP的各個關鍵部分後,作者基於off-policy的方式,使用CQL(Q-learning的一個變種,用於緩解Q-Learning對於Q值估計過高的問題),構造一個三層MLP層的Q網路,用於學習最優策略。

《Self-generated in-context learning: Leveraging auto-regressive language models as a demonstration generator》

前面提及的方法,都是從樣本庫中挑選出合適的demonstration,而本論文方法是利用LLMs自身的能力,生成合適的demonstration。目的是最小化對外部樣本庫的依賴。

整個過程分為兩個階段:

  • 1.藉助預先設計的prompt,讓LLMs生成k個合適的示例
  • 2.在原來輸入的基礎上,加入第一階段生成的示例,讓LLMs預測最終結果

實驗結顯示,當使用Self-generated的方式生成8個demonstration作為in-context sample,於從樣本庫中抽取5個demonstration作為in-context sample的效果相當。

2.2 示例格式

在完成demonstrations的選擇後,下一步就是將demonstrations整合成一個自然語言Prompt。

《Cross-task generalization via natural language crowdsourcing instructions》

這篇論文提出了一個新的跨任務instruction資料集。他們使用總包的方式,按照規定的instruction格式,對多個開源資料集進行改造。

針對每一個promt,其格式包含:

  • title: 包含一個high-level的任務描述,以及其相關技能,如question generation,answer generation等
  • prompt: 單獨的文字命令,一般出現在輸入示例之前。
  • definition: 指令的補充內容,更加詳細地描述指令的具體執行細節。
  • things to avoid: 包含模型應該避免的內容,或規則。
  • emphasis and caution: 強調在眾包過程中,警告或反對的內容
  • positive examples: 提供一個類似系統期望的輸入、輸出例子,使得眾包人員更好地理解任務。
  • negative examples:提供一個類似系統期望的輸入、輸出的負例,讓眾包人員儘量避免。
  • reason: 解釋為什麼例子是positive或negative。
  • suggestion: 包含一些建議,主要用於指導如何將負例改成正例。

模型在經過上述instruction資料集微調後,能在unseen樣本上,達到較好的生成效果。在新樣本推斷時,將demonstrations加入到task instances即可。

《SELF-INSTRUCT: Aligning Language Models with Self-Generated Instructions》

本論文提出了一種半自動化self-instruction過程,使用少量人工標註的資料,生成大量能用於instruction的資料。並開源了一個基於GPT3的52K self-instruct資料集。

一般來說,instruction資料集,會包含兩/三個部分:(指令、輸入、輸出)或(指令、輸出)。如

本論文提出的方法包含幾個步驟:

1.人工設計175個不同任務的啟動任務池,且給每個任務編寫一個instruction和一個例項。

2.使用LLMs生成新的指令。生成指令的prompt由6個人工編寫的instruction和從模型生成結果中抽取2個instruction,按照指定模板公式組合後,輸入模型,並輸出一個新的指令

3.判斷指令是否屬於分類任務。由於分類任務和非分類任務用的prompt模板不同,故需要進行分開識別。分別從任務池中抽取分類instruction和非分類instruction,再加上新生成的指令,輸入模型,模型輸出是否為分類任務

4.生成例項。分為兩種策略:

  • (1)先生成輸入,在生成輸出。適用於非分類任務。
  • (2)先生成輸出,再生成輸入。適用於分類任務,緩解生成結果單一化問題。

5.結果過濾。對於新生成的instruction,比較其與任務池中的instruction的ROUGE-L值,當小於0.7時才會加入任務池。(ROUGE-L越大,說明instruction越相似)

《Automatic chain of thought prompting in large language models》

LLMs透過生成中間推理步驟的方式可以做複雜任務推理。在prompt示例(demonstration)中引入這些推理步驟的方法稱為chain-of-thought(CoT) prompting,即:思維鏈prompting。

傳統的CoT分為兩種正規化:

1.Zero-Shot-CoT: 在LLMs中新增一個簡單的prompt即可,如"Let's think step by step"。以促進在回答問題之前一步步地思考。

2.Manual-CoT: 加入多個由人工設計的prompt,包含問題、推理鏈和答案。

由於Zero-Shot-CoT方法存在不穩定性,而Manual-Cot方法需要大量人工成本投入。作者提出了一種基於Auto-CoT的方法,自動構建包含問題和推理鏈的說明樣例(demonstrations)。

整個過程分了兩個階段:

1.question cluster: 目的是將資料集中的question劃分到不同簇中。

  • 使用Sentence-Bert計算每個question的向量表示;
  • 使用k-means方法將question記性簇劃分;
  • 最後對每個簇中的question,根據距離中心點距離,升序排序。

2.demostration sampling: 目的是從每個簇中選取一個代表性的question,基於LLMs,使用Zero-Shot-CoT生成推理鏈。

  • 對於每一個簇$i$裡的每一個問題$q{(i)}_j$,使用Zero-Shot-CoT的方法,將$[Q:q_j,A:[P]]$(其中$[P]$表示"Let's think step by step")輸入到LLMs,LLMs生成該問題的推理鏈$r{(i)}_j$和答案$a_j$;

  • 若問題$q{(i)}_j$不超過60個tokens,且推理鏈$r_j$不超過5個推理步驟,則將問題+推理鏈+答案,加入到demostrations列表中:$[Q:q{(i)}_j,A:r_j。a^{(i)}_j]$;

  • 遍歷完所有簇,將得到k個demostrations,將其拼接上測試question,構造成新的Prompt,輸入LLMs便可得到生成結果。

值得一提的是,Auto-CoT在多個開源推理任務的資料集上,效果與Manual-CoT相當,甚至某些任務表現得更好。

《Least-to-Most Prompting Enables Complex Reasoning in Large Language Models》

雖然CoT在很多自然語言推理任務上效果顯著,但是當問題比prompt裡的demostrations更難時,LLMs的表現往往會很糟糕。於是作者提出了Least-to-Most Prompting的策略思想,將問題分解成一個個小問題,結合使用COT,那麼模型就能把問題解出來了。

整個過程分為兩個階段:

1.將原問題分解為一系列子問題。

  • 要求LLMs根據輸入和提示"To solve xx, we need to solve xx",生成子問題。

2.依次解決子問題,最後解決原始問題。

  • 將原始context,加上階段1中生成的子問題進行組合,透過LLMs依次生成每個子問題的思維鏈和答案。
  • 當生成完所有子問題的答案後,再拼接上原始問題,透過LLMs輸出生成結果。

2.3 示例排序

我們知道,demostrations一般是由多個示例組成,而不同的示例排序會不會對模型在新樣本中的表現產生影響?

論文《Calibrate before use: Improving few-shot performance of language models》給出了肯定的答案。作者指出,在一個正常的prompt+demostrations+新樣本的輸入中,LLMs會更加傾向於將新樣本對應的標籤,預測為demostrations最後一個示例對應的標籤,成為Recency Bias。因此demostrations的排序,對LLMs的表現也是有相當大的影響。

2.3.1 啟發式方法

《What Makes Good In-Context Examples for GPT-3?》

我們在選擇那一節有介紹過該論文,思路是使用k-nearest neighbors+歐式距離的方法,根據與測試樣本的相似度,對demostrations進行排序,與測試樣本越相似,排序越後。

2.3.2 基於熵的方法

《Fantastically ordered prompts and where to find them: Overcoming few-shot prompt order sensitivity》

作者提出了一種基於Global Entropy和Loacl Entropy的方法對demostrations進行排序,取得了比隨機排序更優的效果。

該過程分為兩個步驟:

1.生成用來驗證的無標註資料集。

  • 將demostrations按照不同的順序排列,輸入LLMs,讓其生成不同帶標籤的偽資料。

2.確定評價指標來評估demostrations的展示順序優劣。

  • 作者觀察到大多數使模型失效的demostrations順序,會讓模型的標籤分佈相對極端,從而導致標籤分佈的熵值較低。
  • 設計了兩種基於熵的指標(Global Entropy和Loacl Entropy),來評估當前demostrations排序的結果質量。

3.ICL機制

3.1 預訓練機制如何影響ICL?

  1. 知識積累:預訓練階段,模型會接觸到大量的無標註或弱標註資料,從而學習到豐富的語言知識、常識和上下文資訊。這些積累的知識和資訊為ICL提供了堅實的基礎,使得模型能夠利用上下文資訊做出更準確的預測。
  2. 泛化能力:預訓練過程使模型具備了較強的泛化能力,即模型能夠將在預訓練階段學到的知識和技能應用到新的、未見過的任務和資料上。這種泛化能力是ICL得以實現的關鍵,因為ICL正是利用了模型在預訓練階段學到的知識來進行少量樣本學習。
  3. 引數初始化:預訓練為模型的引數提供了良好的初始化值。在ICL過程中,模型不需要對引數進行大量的更新,而只需要根據少量標註樣本進行微調,即可快速適應新的任務。這種快速的適應能力是ICL的一個重要優勢。

3.2 LLMs怎樣表現出ICL能力?

  1. 利用上下文資訊:LLMs能夠充分利用輸入序列中的上下文資訊來做出決策。例如,在文字分類任務中,模型可以透過分析整個句子的語境來判斷句子的情感傾向。
  2. 設計提示模板:對於特定的任務,LLMs可以透過設計任務相關的指令形成提示模板。這些提示模板可以包含少量標註樣本,用於指導模型生成預測結果。
  3. 少樣本學習:LLMs在只有少量標註資料可用時仍能表現出良好的效能。透過利用預訓練階段學到的知識和泛化能力,模型可以在少量樣本上快速學習並適應新的任務。
  4. 效能提升:實驗表明,ICL方法的表現大幅度超越了Zero-Shot-Learning,為少樣本學習提供了新的研究思路。在多個自然語言處理任務上,採用ICL方法的LLMs相比傳統的微調方法取得了更好的效能。

4.總結

對於In-Context Learning而言,demonstrations的選擇、格式、以及排序,都會對測試樣本的效果產生影響。在實際應用時,我們可以借鑑前人的經驗,根據自己的場景選擇適合的ICL方法。

5.Reference

What Makes Good In-Context Examples for GPT-3?

Diverse demonstrations improve in-context compositional generalization

Learning To Retrieve Prompts for In-Context Learning

Active Example Selection for In-Context Learning

Self-generated in-context learning: Leveraging auto-regressive language models as a demonstration generator

Cross-task generalization via natural language crowdsourcing instructions

SELF-INSTRUCT: Aligning Language Models with Self-Generated Instructions

Automatic chain of thought prompting in large language models

Least-to-Most Prompting Enables Complex Reasoning in Large Language Models

Calibrate before use: Improving few-shot performance of language models

Fantastically ordered prompts and where to find them: Overcoming few-shot prompt order sensitivity

相關文章