强化微调(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. 多模态模型中的强化微调

随着人工智能系统向文本以外的领域扩展,强化微调也适应了新的领域:

  • 根据人类审美偏好生成图像
  • 通过反馈调整视频模型
  • 多轮交互优化
  • 文本与其他模式之间的跨模式对齐

这些扩展展示了强化微调作为通用对齐方法的灵活性。

小结

强化微调将人类的偏好直接融入优化过程,解决了传统方法无法解决的配准难题,从而巩固了其在人工智能发展中的地位。展望未来,强化微调将克服人类标签的瓶颈,这些进步将为更强大的系统塑造管理框架。随着模型的能力越来越强,强化微调对于保持人工智能与人类价值观一致并提供值得信赖的结果仍然至关重要。

评论留言