強化微調(Reinforcement Finetuning)入門指南

強化微調(Reinforcement Finetuning)入門指南

強化微調透過教會模型根據人類反饋進行調整,撼動了人工智慧的發展。它將有監督的學習基礎與基於獎勵的更新相結合,使其更安全、更準確,並真正有所幫助。我們不是讓模型去猜測最佳輸出,而是透過精心設計的獎勵訊號來引導學習過程,確保人工智慧行為符合現實世界的需求。在本文中,我們將分析強化微調的工作原理、它對現代LLM 至關重要的原因以及它帶來的挑戰。

強化學習的基礎知識

在深入研究強化微調之前,我們最好先了解一下強化學習,因為這是它的主要原理。強化學習透過獎懲而非明確的示例來教授人工智慧系統,使用的代理可以透過與環境的互動來學習最大化獎勵。

關鍵概念

強化學習有四個基本要素:

  1. 代理:與環境互動的學習系統(在我們的例子中是語言模型)。
  2. 環境:代理執行的環境(對於 LLM,這包括輸入提示和任務規範)
  3. 行動:代理產生的反應或輸出
  4. 獎勵:反饋訊號,表示行動的可取程度

代理透過在環境中採取行動並獲得獎勵來強化有益行為,從而進行學習。隨著時間的推移,代理會形成一種策略,即選擇能使預期獎勵最大化的行動的策略。

強化學習與監督學習

角度 監督學習 強化學習
學習訊號 正確的標籤/答案 基於質量的獎勵
反饋時間 即時、明確 延遲,有時稀少
目標 最小化預測誤差 累積獎勵最大化
資料需求 標記示例 獎勵訊號
培訓過程 一次最佳化 互動式迭代探索

監督學習依賴於每個輸入的明確正確答案,而強化學習則使用更靈活的獎勵訊號來表示質量而非正確性。這使得強化微調對於最佳化語言模型尤為重要,因為 “正確性 ”往往是主觀的,與上下文有關。

什麼是強化微調?

強化微調是指使用強化學習技術改進預先訓練好的語言模型,使其更符合人類的偏好和價值觀的過程。與只注重預測準確性的傳統訓練不同,強化微調最佳化的目的是產生人類認為有用、無害和誠實的輸出結果。這種方法解決了人工智慧系統中許多理想品質無法透過傳統訓練目標輕鬆指定的難題。

人類反饋的作用是強化微調的核心。人類會根據各種標準(如有用性、準確性、安全性和自然語氣)對模型輸出進行評估。這些評價會產生獎勵,引導模型朝著人類喜歡的行為方向發展。大多數強化微調工作流程都涉及收集人類對模型輸出的判斷,利用這些判斷來訓練獎勵模型,然後最佳化語言模型,使預測獎勵最大化。

在高層次上,強化微調遵循這一工作流程:

  1. 從預先訓練好的語言模型開始
  2. 生成對各種提示的反應
  3. 收集人類對不同可能回應的偏好
  4. 訓練獎勵模型以預測人類偏好
  5. 使用強化學習對語言模型進行微調,使獎勵最大化

這一過程有助於縮小原始語言能力與統一、有用的人工智慧輔助之間的差距。

它是如何工作的?

強化微調透過生成響應、收集響應質量反饋、訓練獎勵模型以及最佳化原始模型以最大化預測獎勵來改進模型。

強化微調工作流程

強化微調通常建立在已經進行過預訓練和監督微調的模型基礎上。這一過程包括幾個關鍵階段:

  1. 準備資料集:收集涵蓋目標領域的各種提示,並建立評估基準。
  2. 生成響應:模型針對每個提示生成多個響應。
  3. 人工評估:人工評估人員根據質量標準對這些回覆進行排序或評級。
  4. 獎勵模型訓練:一個單獨的模型會根據這些評價來學習預測人類的偏好。
  5. 強化學習:對原始模型進行最佳化,使預測獎勵最大化。
  6. 驗證:根據保留的示例對改進後的模型進行測試,以確保通用性。

這一迴圈可重複多次,以逐步提高模型與人類偏好的一致性。

訓練獎勵模型

在強化微調過程中,獎勵模型是人類判斷的替代物。它將提示和反應作為輸入,並輸出一個代表預測人類偏好的標量值。該模型的訓練包括:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# Simplified pseudocode for reward model training
def train_reward_model(preference_data, model_params):
for epoch in range(EPOCHS):
for prompt, better_response, worse_response in preference_data:
# Get reward predictions for both responses
better_score = reward_model(prompt, better_response, model_params)
worse_score = reward_model(prompt, worse_response, model_params)
# Calculate log probability of correct preference
log_prob = log_sigmoid(better_score - worse_score)
# Update model to increase probability of correct preference
loss = -log_prob
model_params = update_params(model_params, loss)
return model_params
# Simplified pseudocode for reward model training def train_reward_model(preference_data, model_params): for epoch in range(EPOCHS): for prompt, better_response, worse_response in preference_data: # Get reward predictions for both responses better_score = reward_model(prompt, better_response, model_params) worse_score = reward_model(prompt, worse_response, model_params) # Calculate log probability of correct preference log_prob = log_sigmoid(better_score - worse_score) # Update model to increase probability of correct preference loss = -log_prob model_params = update_params(model_params, loss) return model_params
# Simplified pseudocode for reward model training
def train_reward_model(preference_data, model_params):
for epoch in range(EPOCHS):
for prompt, better_response, worse_response in preference_data:
# Get reward predictions for both responses
better_score = reward_model(prompt, better_response, model_params)
worse_score = reward_model(prompt, worse_response, model_params)
 
# Calculate log probability of correct preference
log_prob = log_sigmoid(better_score - worse_score)
 
# Update model to increase probability of correct preference
loss = -log_prob
model_params = update_params(model_params, loss)
 
return model_params

應用強化

有幾種演算法可以在微調中應用強化:

  1. 近端策略最佳化(PPO):PPO 被 OpenAI 用於 GPT 模型的強化微調,它可以最佳化策略,同時限制更新以防止破壞性變化。
  2. 直接偏好最佳化(DPO):這是一種更高效的方法,透過直接最佳化偏好資料,無需單獨的獎勵模型。
  3. 來自人工智慧反饋的強化學習(RLAIF):利用另一個人工智慧系統提供訓練反饋,可能會降低成本並減少人工反饋的擴充套件限制。

最佳化過程在改善獎勵訊號與防止模型“遺忘”其預先訓練的知識或發現沒有真正改進卻能最大化獎勵的利用行為之間進行了謹慎的平衡。

資料稀缺時,強化學習如何戰勝監督學習?

強化微調透過利用偏好比較而不是要求完美示例,從有限的資料中提取更多的學習訊號,因此非常適合高質量訓練資料稀缺的情況。

主要區別

特徵 監督微調 (SFT) 強化微調(RFT)
學習訊號 黃金標準示例 偏好或獎勵訊號
資料要求 綜合標註示例 可處理稀疏反饋
最佳化目標 與訓練示例匹配 獎勵/偏好最大化
處理模糊性 不理想(平均示例相互衝突) 良好(可學習細緻入微的策略)
探索能力 僅限於訓練分佈 能發現新的解決方案

強化微調技術在高質量訓練資料有限的情況下表現出色,因為它能從每一條反饋中提取更多的學習訊號。監督式微調需要理想輸出的明確示例,而強化式微調則可以從輸出之間的比較中學習,甚至從關於輸出是否可接受的二進位制反饋中學習。

強化微調技術

Source: Supervised finetuning vs. Reinforced finetuning

當資料稀缺時,RFT優於SFT

當標註資料有限時,強化微調會顯示出一些優勢:

  1. 從偏好中學習:RFT 可以從對哪種輸出更好的判斷中學習,而不僅僅是完美的輸出應該是什麼。
  2. 高效利用反饋:透過獎勵模型的泛化作用,單個反饋可為許多相關行為提供資訊。
  3. 策略探索:強化微調可以發現訓練例項中不存在的新穎反應模式。
  4. 處理模糊性:當存在多種有效反應時,強化微調可以保持多樣性,而不是平均到一個安全但平淡的中間地帶。

由於這些原因,即使沒有全面的標註資料集,強化微調也能產生更有用、更自然的模型。

強化微調的主要優勢

1. 更符合人類價值觀

強化微調使模型能夠學習人類偏好的微妙之處,而這些偏好是很難透過程式設計指定的。透過反覆反饋,模型可以更好地理解以下內容:

  • 適當的語氣和風格
  • 道德和倫理方面的考慮
  • 文化敏感性
  • 有益的回應與操縱性回應

這一調整過程使模型更值得信賴,成為有益的夥伴,而不僅僅是強大的預測引擎。

強化微調的主要優勢

2. 特定任務適應

在保留一般能力的同時,具有強化微調功能的模型可以透過納入特定領域的反饋,在特定領域實現專業化。這樣就可以

  • 定製助理行為
  • 醫學、法律或教育等領域的專業技能
  • 針對特定使用者群的定製響應

強化微調的靈活性使其成為建立專用人工智慧系統的理想選擇,而無需從零開始。

3. 提高長期效能

使用強化微調技術訓練的模型往往能在不同場景中更好地保持效能,因為它們最佳化的是基本品質而非表面模式。其優勢包括

  • 更好地泛化到新主題
  • 不同輸入的質量更加一致
  • 對提示變化的穩健性更高

4. 減少幻覺和有毒輸出

透過明確懲罰不良輸出,強化微調可顯著減少問題行為:

  • 虛假資訊會受到負面獎勵
  • 有害、攻擊性或誤導性內容受到阻止
  • 誠實的不確定性比自信的虛假資訊得到強化

5. 更有益、更細緻的回應

也許最重要的是,強化微調能產生使用者真正認為更有價值的回應:

  • 更好地理解隱含需求
  • 更周到的推理
  • 適當的詳細程度
  • 對複雜問題的平衡觀點

這些改進使得強化微調模型作為助手和資訊源的作用大大提高。

變體和相關技術

強化微調的不同方法包括使用人類評估者的 RLHF、更高效直接最佳化的 DPO、使用人工智慧評估者的 RLAIF 以及明確原則指導下的憲法人工智慧。

1. RLHF(從人類反饋中強化學習)

RLHF 代表了強化微調的經典實現方式,由人類評估者提供偏好訊號。工作流程通常如下:

  • 人類比較模型輸出,選擇偏好的反應
  • 這些偏好會訓練一個獎勵模型
  • 透過 PPO 最佳化語言模型,使預期獎勵最大化
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
def train_rihf(model, reward_model, dataset, optimizer, ppo_params):
# PPO hyperparameters
kl_coef = ppo_params['kl_coef']
epochs = ppo_params['epochs']
for prompt in dataset:
# Generate responses with current policy
responses = model.generate_responses(prompt, n=4)
# Get rewards from reward model
rewards = [reward_model(prompt, response) for response in responses]
# Calculate log probabilities of responses under current policy
log_probs = [model.log_prob(response, prompt) for response in responses]
for _ in range(epochs):
# Update policy to increase probability of high-reward responses
# while staying close to original policy
new_log_probs = [model.log_prob(response, prompt) for response in responses]
# Policy ratio
ratios = [torch.exp(new - old) for new, old in zip(new_log_probs, log_probs)]
# PPO clipped objective with KL penalties
kl_penalties = [kl_coef * (new - old) for new, old in zip(new_log_probs, log_probs)]
# Policy loss
policy_loss = -torch.mean(torch.stack([
ratio * reward - kl_penalty
for ratio, reward, kl_penalty in zip(ratios, rewards, kl_penalties)
]))
# Update model
optimizer.zero_grad()
policy_loss.backward()
optimizer.step()
return model
def train_rihf(model, reward_model, dataset, optimizer, ppo_params): # PPO hyperparameters kl_coef = ppo_params['kl_coef'] epochs = ppo_params['epochs'] for prompt in dataset: # Generate responses with current policy responses = model.generate_responses(prompt, n=4) # Get rewards from reward model rewards = [reward_model(prompt, response) for response in responses] # Calculate log probabilities of responses under current policy log_probs = [model.log_prob(response, prompt) for response in responses] for _ in range(epochs): # Update policy to increase probability of high-reward responses # while staying close to original policy new_log_probs = [model.log_prob(response, prompt) for response in responses] # Policy ratio ratios = [torch.exp(new - old) for new, old in zip(new_log_probs, log_probs)] # PPO clipped objective with KL penalties kl_penalties = [kl_coef * (new - old) for new, old in zip(new_log_probs, log_probs)] # Policy loss policy_loss = -torch.mean(torch.stack([ ratio * reward - kl_penalty for ratio, reward, kl_penalty in zip(ratios, rewards, kl_penalties) ])) # Update model optimizer.zero_grad() policy_loss.backward() optimizer.step() return model
def train_rihf(model, reward_model, dataset, optimizer, ppo_params):
# PPO hyperparameters
kl_coef = ppo_params['kl_coef']
epochs = ppo_params['epochs']
 
for prompt in dataset:
# Generate responses with current policy
responses = model.generate_responses(prompt, n=4)
 
# Get rewards from reward model
rewards = [reward_model(prompt, response) for response in responses]
 
# Calculate log probabilities of responses under current policy
log_probs = [model.log_prob(response, prompt) for response in responses]
 
for _ in range(epochs):
# Update policy to increase probability of high-reward responses
# while staying close to original policy
new_log_probs = [model.log_prob(response, prompt) for response in responses]
 
# Policy ratio
ratios = [torch.exp(new - old) for new, old in zip(new_log_probs, log_probs)]
 
# PPO clipped objective with KL penalties
kl_penalties = [kl_coef * (new - old) for new, old in zip(new_log_probs, log_probs)]
 
# Policy loss
policy_loss = -torch.mean(torch.stack([
ratio * reward - kl_penalty
for ratio, reward, kl_penalty in zip(ratios, rewards, kl_penalties)
]))
 
# Update model
optimizer.zero_grad()
policy_loss.backward()
optimizer.step()
return model

RLHF 在使語言模型與人類價值觀相一致方面取得了首次突破,但由於人類標註的瓶頸,它在擴充套件方面面臨挑戰。

2. DPO(直接偏好最佳化)

DPO 或直接偏好最佳化(Direct Preference Optimization )取消了單獨的獎勵模型和 PPO 最佳化,從而簡化了強化微調:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import torch
import torch.nn.functional as F
def dpo_loss(model, prompt, preferred_response, rejected_response, beta):
# Calculate log probabilities for both responses
preferred_logprob = model.log_prob(preferred_response, prompt)
rejected_logprob = model.log_prob(rejected_response, prompt)
# Calculate loss that encourages preferred > rejected
loss = -F.logsigmoid(beta * (preferred_logprob - rejected_logprob))
return loss
import torch import torch.nn.functional as F def dpo_loss(model, prompt, preferred_response, rejected_response, beta): # Calculate log probabilities for both responses preferred_logprob = model.log_prob(preferred_response, prompt) rejected_logprob = model.log_prob(rejected_response, prompt) # Calculate loss that encourages preferred > rejected loss = -F.logsigmoid(beta * (preferred_logprob - rejected_logprob)) return loss
import torch
import torch.nn.functional as F
def dpo_loss(model, prompt, preferred_response, rejected_response, beta):
# Calculate log probabilities for both responses
preferred_logprob = model.log_prob(preferred_response, prompt)
rejected_logprob = model.log_prob(rejected_response, prompt)
 
# Calculate loss that encourages preferred > rejected
loss = -F.logsigmoid(beta * (preferred_logprob - rejected_logprob))
 
return loss

DPO 具有若干優勢:

  • 實施更簡單,活動部件更少
  • 更穩定的訓練動態
  • 取樣效率通常更高

DPO(直接偏好最佳化)

Source: DPO

3. RLAIF(從人工智慧反饋中強化學習)

RLAIF 以另一個經過訓練的人工智慧系統來模仿人類的偏好,從而取代人類評估員。這種方法

  • 大幅降低反饋收整合本
  • 可擴充套件到更大的資料集
  • 保持評估標準的一致性
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import torch
def train_with_rlaif(model, evaluator_model, dataset, optimizer, config):
"""
Fine-tune a model using RLAIF (Reinforcement Learning from AI Feedback)
Parameters:
- model: the language model being fine-tuned
- evaluator_model: another AI model trained to evaluate responses
- dataset: collection of prompts to generate responses for
- optimizer: optimizer for model updates
- config: dictionary containing 'batch_size' and 'epochs'
"""
batch_size = config['batch_size']
epochs = config['epochs']
for epoch in range(epochs):
for batch in dataset.batch(batch_size):
# Generate multiple candidate responses for each prompt
all_responses = []
for prompt in batch:
responses = model.generate_candidate_responses(prompt, n=4)
all_responses.append(responses)
# Have evaluator model rate each response
all_scores = []
for prompt_idx, prompt in enumerate(batch):
scores = []
for response in all_responses[prompt_idx]:
# AI evaluator provides quality scores based on defined criteria
score = evaluator_model.evaluate(
prompt,
response,
criteria=["helpfulness", "accuracy", "harmlessness"]
)
scores.append(score)
all_scores.append(scores)
# Optimize model to increase probability of highly-rated responses
loss = 0
for prompt_idx, prompt in enumerate(batch):
responses = all_responses[prompt_idx]
scores = all_scores[prompt_idx]
# Find best response according to evaluator
best_idx = scores.index(max(scores))
best_response = responses[best_idx]
# Increase probability of best response
loss -= model.log_prob(best_response, prompt)
# Update model
optimizer.zero_grad()
loss.backward()
optimizer.step()
return model
import torch def train_with_rlaif(model, evaluator_model, dataset, optimizer, config): """ Fine-tune a model using RLAIF (Reinforcement Learning from AI Feedback) Parameters: - model: the language model being fine-tuned - evaluator_model: another AI model trained to evaluate responses - dataset: collection of prompts to generate responses for - optimizer: optimizer for model updates - config: dictionary containing 'batch_size' and 'epochs' """ batch_size = config['batch_size'] epochs = config['epochs'] for epoch in range(epochs): for batch in dataset.batch(batch_size): # Generate multiple candidate responses for each prompt all_responses = [] for prompt in batch: responses = model.generate_candidate_responses(prompt, n=4) all_responses.append(responses) # Have evaluator model rate each response all_scores = [] for prompt_idx, prompt in enumerate(batch): scores = [] for response in all_responses[prompt_idx]: # AI evaluator provides quality scores based on defined criteria score = evaluator_model.evaluate( prompt, response, criteria=["helpfulness", "accuracy", "harmlessness"] ) scores.append(score) all_scores.append(scores) # Optimize model to increase probability of highly-rated responses loss = 0 for prompt_idx, prompt in enumerate(batch): responses = all_responses[prompt_idx] scores = all_scores[prompt_idx] # Find best response according to evaluator best_idx = scores.index(max(scores)) best_response = responses[best_idx] # Increase probability of best response loss -= model.log_prob(best_response, prompt) # Update model optimizer.zero_grad() loss.backward() optimizer.step() return model
import torch
def train_with_rlaif(model, evaluator_model, dataset, optimizer, config):
"""
Fine-tune a model using RLAIF (Reinforcement Learning from AI Feedback)
 
Parameters:
- model: the language model being fine-tuned
- evaluator_model: another AI model trained to evaluate responses
- dataset: collection of prompts to generate responses for
- optimizer: optimizer for model updates
- config: dictionary containing 'batch_size' and 'epochs'
"""
batch_size = config['batch_size']
epochs = config['epochs']
 
for epoch in range(epochs):
for batch in dataset.batch(batch_size):
# Generate multiple candidate responses for each prompt
all_responses = []
for prompt in batch:
responses = model.generate_candidate_responses(prompt, n=4)
all_responses.append(responses)
 
# Have evaluator model rate each response
all_scores = []
for prompt_idx, prompt in enumerate(batch):
scores = []
for response in all_responses[prompt_idx]:
# AI evaluator provides quality scores based on defined criteria
score = evaluator_model.evaluate(
prompt,
response,
criteria=["helpfulness", "accuracy", "harmlessness"]
)
scores.append(score)
all_scores.append(scores)
 
# Optimize model to increase probability of highly-rated responses
loss = 0
for prompt_idx, prompt in enumerate(batch):
responses = all_responses[prompt_idx]
scores = all_scores[prompt_idx]
 
# Find best response according to evaluator
best_idx = scores.index(max(scores))
best_response = responses[best_idx]
 
# Increase probability of best response
loss -= model.log_prob(best_response, prompt)
 
# Update model
optimizer.zero_grad()
loss.backward()
optimizer.step()
 
return model

雖然 RLAIF 可能會引入評價模型的偏差,但在評價器校準良好的情況下,RLAIF 已顯示出良好的結果。

4. 憲法式人工智慧

憲法式人工智慧透過納入明確的原則或“憲法”來指導反饋過程,從而為強化微調增加了一個層次。人的偏好可能存在偏差或不一致,而憲法式人工智慧並不完全依賴於人的偏好,而是根據既定原則對反應進行評估。這種方法

  • 提供更一致的指導
  • 使價值判斷更加透明
  • 減少對註釋者個人偏見的依賴
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# Simplified Constitutional AI implementation
def train_constitutional_ai(model, constitution, dataset, optimizer, config):
"""
Fine-tune a model using Constitutional AI approach
- model: the language model being fine-tuned
- constitution: a set of principles to evaluate responses against
- dataset: collection of prompts to generate responses for
"""
principles = constitution['principles']
batch_size = config['batch_size']
for batch in dataset.batch(batch_size):
for prompt in batch:
# Generate initial response
initial_response = model.generate(prompt)
# Self-critique phase: model evaluates its response against constitution
critiques = []
for principle in principles:
critique_prompt = f"""
Principle: {principle['description']}
Your response: {initial_response}
Does this response violate the principle? If so, explain how:
"""
critique = model.generate(critique_prompt)
critiques.append(critique)
# Revision phase: model improves response based on critiques
revision_prompt = f"""
Original prompt: {prompt}
Your initial response: {initial_response}
Critiques of your response:
{' '.join(critiques)}
Please provide an improved response that addresses these critiques:
"""
improved_response = model.generate(revision_prompt)
# Train model to directly produce the improved response
loss = -model.log_prob(improved_response | prompt)
# Update model
optimizer.zero_grad()
loss.backward()
optimizer.step()
return model
# Simplified Constitutional AI implementation def train_constitutional_ai(model, constitution, dataset, optimizer, config): """ Fine-tune a model using Constitutional AI approach - model: the language model being fine-tuned - constitution: a set of principles to evaluate responses against - dataset: collection of prompts to generate responses for """ principles = constitution['principles'] batch_size = config['batch_size'] for batch in dataset.batch(batch_size): for prompt in batch: # Generate initial response initial_response = model.generate(prompt) # Self-critique phase: model evaluates its response against constitution critiques = [] for principle in principles: critique_prompt = f""" Principle: {principle['description']} Your response: {initial_response} Does this response violate the principle? If so, explain how: """ critique = model.generate(critique_prompt) critiques.append(critique) # Revision phase: model improves response based on critiques revision_prompt = f""" Original prompt: {prompt} Your initial response: {initial_response} Critiques of your response: {' '.join(critiques)} Please provide an improved response that addresses these critiques: """ improved_response = model.generate(revision_prompt) # Train model to directly produce the improved response loss = -model.log_prob(improved_response | prompt) # Update model optimizer.zero_grad() loss.backward() optimizer.step() return model
# Simplified Constitutional AI implementation
def train_constitutional_ai(model, constitution, dataset, optimizer, config):
"""
Fine-tune a model using Constitutional AI approach
- model: the language model being fine-tuned
- constitution: a set of principles to evaluate responses against
- dataset: collection of prompts to generate responses for
"""
principles = constitution['principles']
batch_size = config['batch_size']
for batch in dataset.batch(batch_size):
for prompt in batch:
# Generate initial response
initial_response = model.generate(prompt)
# Self-critique phase: model evaluates its response against constitution
critiques = []
for principle in principles:
critique_prompt = f"""
Principle: {principle['description']}
Your response: {initial_response}
Does this response violate the principle? If so, explain how:
"""
critique = model.generate(critique_prompt)
critiques.append(critique)
# Revision phase: model improves response based on critiques
revision_prompt = f"""
Original prompt: {prompt}
Your initial response: {initial_response}
Critiques of your response:
{' '.join(critiques)}
Please provide an improved response that addresses these critiques:
"""
improved_response = model.generate(revision_prompt)
# Train model to directly produce the improved response
loss = -model.log_prob(improved_response | prompt)
# Update model
optimizer.zero_grad()
loss.backward()
optimizer.step()
return model

Anthropic 公司率先採用這種方法開發克勞德模型,重點關注樂於助人、不害人和誠實。

利用人類或人工智慧反饋的強化學習對LLM進行微調

實施強化微調需要選擇不同的演算法方法(RLHF/RLAIF 與 DPO),確定獎勵模型型別,並設定適當的最佳化流程(如 PPO)。

RLHF/RLAIF與DPO

在實施強化微調時,實踐者面臨著不同演算法方法之間的選擇:

角度 RLHF/RLAIF DPO
元件 單獨的獎勵模型 + RL 最佳化 單級最佳化
實施複雜性 更高(多個訓練階段) 更低(直接最佳化)
計算要求 更高(需要 PPO) 較低(單一損失函式)
取樣效率 較低 較高
訓練動態控制 更明確 不明確

各組織在選擇這些方法時,應考慮其具體限制和目標。OpenAI 一直使用 RLHF 對其模型進行強化微調,而較新的研究則證明了 DPO 在減少計算開銷方面的有效性。

人類或人工智慧反饋的強化學習

Source: RLHF

人類偏好獎勵模型的類別

用於強化微調的獎勵模型可以根據不同型別的人類偏好資料進行訓練:

  1. 二元比較:人類在兩個模型輸出(A 與 B)之間做出選擇
  2. Likert-scale評分:人類在數字量表上評分
  3. 多屬性評價:對不同質量(有用性、準確性、安全性)分別評分
  4. 自由反饋:定性評論轉換為定量訊號

不同的反饋型別可在註釋效率和訊號豐富度之間做出權衡。許多強化微調系統結合了多種反饋型別,以捕捉質量的不同方面。

利用PPO強化學習進行微調

PPO(近端策略最佳化)因其穩定性而一直是強化微調的常用演算法。這一過程包括

  1. 初始取樣:使用當前策略生成響應
  2. 獎勵計算:使用獎勵模型對響應進行評分
  3. 優勢估計:將獎勵與基線進行比較
  4. 政策更新:改進政策以增加高回報產出
  5. KL 發散約束:防止過度偏離初始模型

這一過程既能根據獎勵訊號改進模型,又能防止災難性遺忘或退化。

使用此技術的流行LLM

1. OpenAI的GPT模型

OpenAI 憑藉其 GPT 模型開創了大規模強化微調的先河。他們開發了強化學習研究專案,以應對能力日益增強的系統中的調整挑戰。他們的方法包括

  • 廣泛收集人類偏好資料
  • 獎勵模型的迭代改進
  • 以強化微調作為最後調整步驟的多階段訓練

GPT-3.5 和 GPT-4 都進行了廣泛的強化微調,以提高幫助性和安全性,同時減少有害輸出。

2. Anthropic的Claude模型

Anthropic 透過其憲法人工智慧方法推進了強化微調,該方法將明確的原則納入了學習過程。他們的模型經歷了以下過程

  • 基於人類偏好的初始 RLHF
  • 帶有原則指導反饋的憲法強化學習
  • 以樂於助人、不害人和誠實為重點,進行反覆改進

Claude 模型展示了強化微調如何產生符合特定倫理框架的系統。

3. 谷歌DeepMind的Gemini

谷歌先進的 Gemini 模型將強化微調作為其訓練管道的一部分。他們的方法具有以下特點

  • 多模態偏好學習
  • 針對安全的強化微調
  • 針對不同能力的專門獎勵模型

Gemini 展示了強化微調如何從文字擴充套件到影像和其他模式。

4. Meta的LLaMA系列

Meta 將強化微調技術應用於其開放式 LLaMA 模型,展示了這些技術如何改進開源系統:

  • 將 RLHF 應用於各種規模的模型
  • 其強化微調方法的公開文件
  • 以其工作為基礎的社羣擴充套件

LLaMA 系列展示了強化微調如何幫助縮小開放模型與封閉模型之間的差距。

5. Mistral和Mixtra變體

Mistral AI 已將強化微調納入其模型開發,建立了兼顧效率與調整的系統:

  • 輕量級獎勵模型適用於較小的架構
  • 高效的強化微調實現
  • 開放式變體,可進行更廣泛的實驗

他們的工作展示了上述技術如何適用於資源受限的環境。

挑戰與侷限

1. 人工反饋既昂貴又緩慢

儘管強化微調有很多好處,但它也面臨著巨大的實際挑戰:

  • 收集高質量的人類偏好需要大量資源
  • 註釋器培訓和質量控制增加了複雜性
  • 收集反饋成為迭代速度的瓶頸
  • 人類判斷可能存在不一致或偏差

這些侷限性促使人們研究合成反饋和更有效的偏好激發。

2. 獎勵駭客和錯位

強化微調引入了模型最佳化可衡量獎勵而非真實人類偏好的風險:

  • 模型可能學習到與獎勵相關的膚淺模式
  • 某些行為可能會在不提高實際質量的情況下玩弄獎勵函式
  • 複雜的目標(如真實性)很難在獎勵中體現出來
  • 獎勵訊號可能會無意中強化操縱行為

研究人員不斷改進技術,以檢測和防止這種獎勵駭客行為。

3. 可解釋性和控制

強化微調中的最佳化過程往往是一個黑箱:

  • 難以準確理解哪些行為得到了強化
  • 對模型的修改分佈在整個引數中
  • 難以分離和修改行為的特定方面
  • 難以對模型行為提供保證

這些可解釋性挑戰使強化微調系統的管理和監督變得更加複雜。

最新發展與趨勢

1. 開源工具和庫

透過開源實現,強化微調變得更容易獲得:

  • 像 Transformer Reinforcement Learning (TRL) 這樣的庫提供了隨時可用的元件。
  • Hugging Face 的 PEFT 工具實現了高效微調
  • 社羣基準有助於評估標準化
  • 文件和教程降低了入門門檻

這些資源使以往僅限於大型組織使用的強化微調技術實現了平民化。

2. 轉向合成反饋

為解決規模限制問題,該領域越來越多地探索合成反饋:

  • 模型生成的批評和評估
  • 由較強模型評估較弱模型的引導式反饋
  • 對潛在反應的自動推理
  • 結合人類和合成訊號的混合方法

這一趨勢有可能實現更大規模的強化微調,同時降低成本。

3. 多模態模型中的強化微調

隨著人工智慧系統向文字以外的領域擴充套件,強化微調也適應了新的領域:

  • 根據人類審美偏好生成影像
  • 透過反饋調整影片模型
  • 多輪互動最佳化
  • 文字與其他模式之間的跨模式對齊

這些擴充套件展示了強化微調作為通用對齊方法的靈活性。

小結

強化微調將人類的偏好直接融入最佳化過程,解決了傳統方法無法解決的配準難題,從而鞏固了其在人工智慧發展中的地位。展望未來,強化微調將克服人類標籤的瓶頸,這些進步將為更強大的系統塑造管理框架。隨著模型的能力越來越強,強化微調對於保持人工智慧與人類價值觀一致並提供值得信賴的結果仍然至關重要。

評論留言