RLHF 模型的訓練始於一個基礎模型,例如 GPT-3,它已經具備了強大的文字生成能力。然而,基礎模型的輸出往往難以控制,需要進一步微調以符合人類的期望。為此,我們首先透過監督式微調(SFT)建立一個中間模型,利用人工標註的對話資料,引導模型學習生成有幫助、誠實且無害的回應。SFT 模型的訓練資料通常包含成千上萬個精心設計的對話範例,用於模擬真實的聊天場景。然而,SFT 模型仍然存在侷限性,它無法完全理解其內部知識的邊界,有時會捏造事實或在應該確定的情況下猶豫不決。為瞭解決這個問題,我們引入了獎勵模型,並利用強化學習技術對 SFT 模型進行進一步微調。獎勵模型透過學習人類評估者對模型輸出的排序,能夠區分高品質和低品質的回應,進而引導 SFT 模型生成更符合人類期望的輸出。最後,透過近端策略最佳化(PPO)演算法,我們在最佳化獎勵值的同時,確保模型的輸出保持穩定性和可靠性,避免過度偏離 SFT 模型的輸出。

強化學習與人類回饋(RLHF)模型的建構過程

建立一個RLHF模型是一個複雜的過程,涉及四個不同的模型、三個訓練集以及三個非常不同的微調程式!但在本章節結束時,你將瞭解這些模型的建構方式,並對它們的行為和原因有更深入的瞭解。

建立RLHF模型的過程

首先,你需要一個基礎模型。2023年,davinci-002是OpenAI最強大的基礎模型。雖然OpenAI自GPT-3.5以來一直保密其訓練細節,但我們可以合理地假設其訓練資料集與GPT-3相似,包括大量公開的網路內容、多個公共領域的書籍語料函式庫、英文維基百科等。這使得基礎模型具備了模仿多種檔案型別和溝通風格的能力。有效地「閱讀」了整個網路後,它「知道」了很多東西——但它可能相當難以控制!例如,如果你在OpenAI的playground中輸入davinci-002來完成一篇現有新聞文章的下半部分,它最初會遵循故事的走向並以文章的風格繼續寫下去,但很快就會開始產生越來越奇怪的細節。

為什麼需要模型對齊

這正是模型對齊(Model Alignment)所需要的。模型對齊是微調模型以使其輸出更符合使用者期望的過程。特別是在2021年的一篇題為「A General Language Assistant as a Laboratory for Alignment」的論文中,Anthropic提出了HHH對齊的概念。HHH代表有幫助(Helpful)、誠實(Honest)和無害(Harmless)。有幫助意味著模型的輸出遵循使用者的指示,保持在正確的軌道上,並提供簡潔有用的回應。誠實意味著模型不會產生虛假資訊並將其呈現為真實的。如果模型對其所做的陳述不確定,則會向使用者表明這一點。無害意味著模型不會產生包含冒犯性內容、歧視性偏見或對使用者有危險的資訊。

建立HHH對齊模型的步驟

在接下來的章節中,我們將逐步介紹生成一個HHH對齊模型的過程。參考表3-3,這個過程從一個基礎模型開始,透過一系列複雜的步驟,將其微調成三個獨立的模型,最後一個是對齊模型。

表3-3. 建立ChatGPT流行的RLHF模型所涉及的模型

模型目的訓練資料數量
基礎模型GPT-3預測下一個token並完成檔案一個龐大且多樣化的檔案集:Common Crawl、WebText、英文維基百科、Books1和Books24990億個token(僅Common Crawl就有570 GB)
監督式微調(SFT)模型(源自基礎模型)遵循指示並進行對話提示和相應的人工生成的理想輸出約13,000份檔案
獎勵模型(源自SFT)評估輸出的品質人工排序的提示集和相應(大部分由SFT生成)的輸出約33,000份檔案(但多了一個數量級的檔案對)
人類回饋強化學習(源自SFT並由獎勵模型評分)遵循指示、進行對話,並保持有幫助、誠實和無害提示以及相應的SFT生成的輸出和RM評分約31,000份檔案

監督式微調模型

生成HHH對齊模型的第一步是建立一個中間模型,稱為監督式微調(SFT)模型,它是從基礎模型微調而來的。微調資料由成千上萬個精心設計的檔案組成,這些檔案代表了你希望生成的行為。(在GPT-3的例子中,大約使用了13,000份檔案進行訓練。)這些檔案是代表一個人和一個有幫助、誠實、無害的助手之間的對話記錄。

程式碼範例:SFT模型的訓練過程

# 定義SFT模型的訓練過程
def train_sft_model(base_model, training_data):
    # 從基礎模型開始
    sft_model = base_model
    
    # 使用訓練資料對SFT模型進行微調
    for prompt, ideal_completion in training_data:
        # 調整模型的引數以更好地預測下一個token
        sft_model.adjust_parameters(prompt, ideal_completion)
    
    return sft_model

# 使用範例資料訓練SFT模型
training_data = [
    ("提示1", "理想輸出1"),
    ("提示2", "理想輸出2"),
    # ...
]

sft_model = train_sft_model(base_model, training_data)

內容解密:

  1. train_sft_model函式定義了SFT模型的訓練過程,它接受一個基礎模型和訓練資料作為輸入。
  2. 在函式內部,我們從基礎模型開始,並使用訓練資料對SFT模型進行微調。
  3. 對於每一個提示和理想輸出對,我們調整模型的引數以更好地預測下一個token。
  4. 最終傳回訓練好的SFT模型。

獎勵模型

為了進一步提高模型的品質,我們進入了強化學習(RL)的領域,這是RLHF中的RL部分。在一般的強化學習公式中,一個代理被置於一個環境中,並採取行動以獲得某種獎勵。自然地,目標是最大化那個獎勵。在RLHF版本中,代理是大語言模型(LLM),環境是要完成的檔案,而LLM的行動是選擇檔案的下一個token。那麼,獎勵就是某種對於完成品質主觀上「好」的評分。

獎勵模型的訓練過程

獎勵模型的訓練資料採購過程比較複雜。首先,向SFT模型提供各種提示,這些提示代表了使用者在聊天場景中可能遇到的任務和情境。然後,使用者對這些提示和相應的輸出(大部分由SFT生成)進行排序,以評估輸出的品質。

程式碼範例:獎勵模型的評估過程

# 定義獎勵模型的評估過程
def evaluate_reward_model(reward_model, prompts, completions):
    # 使用獎勵模型評估輸出的品質
    scores = []
    for prompt, completion in zip(prompts, completions):
        score = reward_model.evaluate(prompt, completion)
        scores.append(score)
    
    return scores

# 使用範例資料評估獎勵模型
prompts = ["提示1", "提示2", "提示3"]
completions = ["輸出1", "輸出2", "輸出3"]

reward_scores = evaluate_reward_model(reward_model, prompts, completions)

內容解密:

  1. evaluate_reward_model函式定義了獎勵模型的評估過程,它接受一個獎勵模型、提示和輸出作為輸入。
  2. 在函式內部,我們使用獎勵模型評估輸出的品質,並將評分儲存在scores列表中。
  3. 最終傳回評分列表。

人類回饋強化學習

最後一步是使用人類回饋強化學習來微調SFT模型,以使其輸出更符合使用者的期望。這個過程涉及到使用獎勵模型的評分來調整SFT模型的引數,以最大化輸出的品質。

程式碼範例:人類回饋強化學習的微調過程

# 定義人類回饋強化學習的微調過程
def fine_tune_with_rlhf(sft_model, reward_model, prompts):
    # 使用獎勵模型的評分來調整SFT模型的引數
    for prompt in prompts:
        completion = sft_model.generate(prompt)
        score = reward_model.evaluate(prompt, completion)
        sft_model.adjust_parameters(prompt, completion, score)
    
    return sft_model

# 使用範例資料進行人類回饋強化學習微調
prompts = ["提示1", "提示2", "提示3"]

fine_tuned_model = fine_tune_with_rlhf(sft_model, reward_model, prompts)

內容解密:

  1. fine_tune_with_rlhf函式定義了人類回饋強化學習的微調過程,它接受一個SFT模型、獎勵模型和提示作為輸入。
  2. 在函式內部,我們使用獎勵模型的評分來調整SFT模型的引數,以最大化輸出的品質。
  3. 最終傳回微調好的SFT模型。

從SFT模型到RLHF模型的演進:開發誠實可靠的AI助手

在開發像GPT-3這樣的大語言模型(LLM)時,模型的訓練過程至關重要。這些模型首先需要透過監督式微調(Supervised Fine-Tuning, SFT)來學習人類的語言模式和任務完成方式。SFT模型的訓練根據大量的人工標註資料,使其能夠生成有用的、無害的回應。然而,單純的SFT模型在誠實性方面仍存在侷限性,這正是引入根據人類反饋的強化學習(Reinforcement Learning from Human Feedback, RLHF)的原因。

SFT模型的侷限性

SFT模型透過模仿學習,能夠生成看似有用的回應,但它無法真正理解其內部知識的邊界。當人類標註者提供訓練資料時,如果他們不瞭解模型的內部知識狀態,就可能建立出超出模型實際知識的回應,或者在模型確定的情況下表達不確定。這樣的訓練資料會誤導模型,使其學會隨意捏造事實或在應該確定的情況下猶豫不決。

以GPT-3為例

在GPT-3的開發過程中,SFT模型的訓練資料來自於人類標註者提供的對話範例。這些範例使模型學會了生成流暢且有用的回應。然而,這種方法無法確保模型的誠實性,因為人類標註者無法完全掌握模型的知識邊界。

RLHF模型的優勢

RLHF技術透過引入獎勵模型(Reward Model),使模型的訓練過程能夠根據其自身的輸出進行評估。獎勵模型根據人類評估者對模型輸出的排序進行訓練,從而學會區分高品質和低品質的回應。透過這種方式,RLHF模型能夠學會生成更為誠實和可靠的回應。

獎勵模型的訓練過程

獎勵模型的訓練依賴於大量的人類排序資料。這些資料來自於SFT模型對特定提示(prompt)生成的多個回應,並由人類評估者進行排序。獎勵模型透過學習這些排序資料,能夠預測哪個回應更符合人類的偏好。

實施RLHF的步驟

  1. SFT模型的初始訓練:首先,透過監督式微調訓練一個基礎模型,使其能夠生成基本的回應。

  2. 獎勵模型的訓練:利用SFT模型生成多個回應,並由人類評估者進行排序。這些排序資料用於訓練獎勵模型,使其能夠評估回應的品質。

    # 簡化的獎勵模型訓練示例
    def train_reward_model(ranked_responses):
        # 將排序資料轉換為獎勵模型的訓練例項
        training_instances = []
        for response, rank in ranked_responses:
            # 將回應轉換為獎勵模型的輸入格式
            input_data = preprocess_response(response)
            # 根據排序結果計算獎勵值
            reward = calculate_reward(rank)
            training_instances.append((input_data, reward))
    
        # 使用訓練例項對獎勵模型進行微調
        reward_model = fine_tune_reward_model(training_instances)
        return reward_model
    

    內容解密:

    • train_reward_model函式接收排序後的回應資料,並將其轉換為獎勵模型的訓練例項。
    • preprocess_response函式將原始回應轉換為適合獎勵模型處理的格式。
    • calculate_reward函式根據回應的排序結果計算對應的獎勵值。
    • fine_tune_reward_model函式利用生成的訓練例項對獎勵模型進行微調,使其能夠準確評估回應品質。
  3. RLHF模型的微調:使用獎勵模型對SFT模型進行進一步微調,使其生成更符合人類期望的回應。

    # 簡化的RLHF模型微調示例
    def fine_tune_rlhf_model(sft_model, reward_model, prompts):
        for prompt in prompts:
            # 使用SFT模型生成回應
            response = sft_model.generate(prompt)
            # 使用獎勵模型評估回應品質
            reward = reward_model.evaluate(response)
            # 根據獎勵值對SFT模型進行微調
            sft_model = proximal_policy_optimization(sft_model, reward)
        return sft_model
    

    內容解密:

    • fine_tune_rlhf_model函式接收SFT模型、獎勵模型和一系列提示作為輸入,並對SFT模型進行微調以生成更高品質的回應。
    • proximal_policy_optimization函式實作了近端策略最佳化(Proximal Policy Optimization, PPO)演算法,用於在提高獎勵值的同時,確保模型的輸出不會與原始SFT模型的輸出差異過大。

近端策略最佳化(PPO)演算法的作用

PPO演算法是一種專門為RLHF設計的強化學習演算法。它允許模型在最佳化獎勵值的同時,保持輸出的穩定性和可靠性,避免過度偏離SFT模型的輸出。這種方法有效地防止了模型在追求高獎勵值的過程中,生成不自然或無意義的內容。

RLHF流程示意圖

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title RLHF流程示意圖

rectangle "生成多個回應" as node1
rectangle "訓練" as node2
rectangle "評估回應" as node3
rectangle "近端策略最佳化(PPO)" as node4
rectangle "初始模型" as node5

node1 --> node2
node2 --> node3
node3 --> node4
node4 --> node5

@enduml

此圖示說明瞭從SFT模型到RLHF模型的完整流程,包括中間的獎勵模型訓練和最終的RLHF模型微調步驟。圖中清晰地展示了各個階段之間的關聯和依賴關係。

詳細解說:

  • SFT模型首先被用來生成多個回應,這些回應隨後由人類評估者進行排序。
  • 排序結果被用來訓練獎勵模型,使其能夠區分不同品質的回應。
  • 獎勵模型隨後被用來評估RLHF模型的輸出,並指導模型的微調過程。
  • 最終,透過近端策略最佳化演算法,RLHF模型在提高獎勵值的同時,保持了輸出的穩定性。

透過這樣的流程,RLHF技術成功地提升了大語言模型的誠實性和可靠性,為開發更值得信賴的AI助手奠定了基礎。

從指示模型到聊天模型的進化

在引入第一批根據人類反饋的強化學習(RLHF)模型後,LLM 社群已經取得了顯著的進步。本章節將探討其中最重要的發展。首先,我們將介紹 OpenAI 的指示模型(Instruct Models),並分析其侷限性。接著,我們將討論聊天模型(Chat Models)的出現如何解決了指示模型的不足。

指示模型

在訓練 GPT 基礎模型時,模型接觸到多種多樣的文字,包括教科書頁面、小說故事、部落格文章、維基百科條目、歌詞、新聞報導、學術期刊和程式碼檔案等。這些文字的多樣性使得模型具備了強大的文字生成能力。然而,當使用者輸入提示(prompt)時,例如「What is a good indoor activity for a family of four?」,模型傾向於將其視為一篇未完成的文章,而不是一個需要回答的問題。

為瞭解決這個問題,開發者引入了指示模型的概念。指示模型的目標是使模型能夠遵循使用者的指示,而不是簡單地完成文字。透過使用特定的訓練提示(例如表 3-4 中的範例),模型學會了以更有用的方式回應使用者的查詢。

表 3-4:用於訓練 InstructGPT 模型的提示範例(改編自“Training Language Models to Follow Instructions with Human Feedback”,表 A.2.1)

使用案例範例
腦力激盪What are 10 science fiction books I should read next?
分類別{java 程式碼} What language is the code above written in?
重寫Translate this sentence to Spanish:
開放式問答Who built the Statue of Liberty?
摘要{新聞文章} Tl;dr:
聊天The following is a conversation with an AI assistant. The assistant is helpful, creative, clever, and very friendly. Human: Hello, who are you? AI: I am an AI created by OpenAI. How can I help you today? Human: I’d like to cancel my subscription. AI:

然而,指示模型仍存在一個微妙的問題:提示本身並沒有明確指示模型應該提供答案還是繼續完成文字。這種模糊性可能導致模型在某些情況下表現不佳。

聊天模型的出現

為瞭解決指示模型的侷限性,研究人員開發了聊天模型。聊天模型的目標是使模型能夠清晰地理解使用者的意圖,並以對話的方式進行互動。這需要模型能夠區分不同的互動模式,並根據使用者的輸入做出適當的回應。

聊天模型的出現標誌著 LLM 技術的一個重要里程碑。透過使模型能夠更自然地與使用者互動,聊天模型提高了 LLM 的可用性和實用性。

技術細節與挑戰

在開發指示模型和聊天模型的過程中,研究人員面臨了多個技術挑戰。其中一個關鍵問題是如何平衡模型的智慧與其對使用者意圖的理解能力。RLHF 過程可以最佳化模型以符合使用者的期望,但同時也可能降低模型的智慧,這被稱為「對齊稅」(alignment tax)。為瞭解決這個問題,研究人員發現混合使用原始訓練資料和 RLHF 資料可以最小化對齊稅。

另一個挑戰是如何明確指示模型何時應該切換到對話模式。聊天模型的開發解決了這個問題,透過提供明確的上下文和互動歷史,使模型能夠更好地理解使用者的意圖。

程式碼範例:
# 定義一個簡單的聊天模型
class ChatModel:
    def __init__(self):
        self.history = []

    def respond(self, user_input):
        # 簡單的回應邏輯
        if user_input == "Hello":
            return "Hi, how can I help you today?"
        else:
            return "I'm not sure I understand."

    def chat(self, user_input):
        self.history.append(user_input)
        response = self.respond(user_input)
        self.history.append(response)
        return response

# 使用聊天模型
model = ChatModel()
print(model.chat("Hello"))  # 輸出:Hi, how can I help you today?

內容解密:

  1. 類別定義:定義了一個名為 ChatModel 的類別,用於實作簡單的聊天功能。
  2. __init__ 方法:初始化方法,用於設定模型的歷史記錄列表。
  3. respond 方法:根據使用者的輸入提供回應。在這個範例中,回應邏輯非常簡單,僅回應特定的輸入。
  4. chat 方法:處理使用者的輸入,並將輸入和回應新增到歷史記錄中。
  5. 例項化與使用:建立了一個 ChatModel 的例項,並與其進行互動,展示了基本的聊天功能。

這個範例展示瞭如何構建一個基本的聊天模型,並闡述了其工作原理。實際應用中,聊天模型的實作會更加複雜,涉及更先進的自然語言處理技術和機器學習演算法。