赞
踩
将大型语言模型 (LLM) 与人类价值观和偏好相结合是一项挑战。传统方法,例如 [从人类反馈中强化学习]((RLHF)通过整合人类输入来完善模型输出,为这一领域的研究铺平了道路。然而,RLHF 可能非常复杂且资源密集,需要大量的计算能力和数据处理。 直接偏好优化 (DPO)作为一种新颖且更精简的方法出现,为这些传统方法提供了一种有效的替代方案。通过简化优化过程,DPO 不仅减少了计算负担,还增强了模型快速适应人类偏好的能力
在深入研究 DPO 之前,我们必须先了解为什么将 LLM 与人类偏好相结合如此重要。尽管 LLM 具有令人印象深刻的能力,但经过大量数据集训练的 LLM 有时会产生不一致、有偏见或与人类价值观不一致的输出。这种不一致可以表现为多种方式:
为了解决这些问题,研究人员开发了利用人工反馈来微调 LLM 的技术。其中最突出的方法是 RLHF。
人类反馈强化学习 (RLHF) 一直是将 LLM 与人类偏好相结合的首选方法。让我们分解 RLHF 流程以了解其复杂性:
a) 监督微调 (SFT):该过程首先在高质量响应数据集上对预先训练的 LLM 进行微调。此步骤可帮助模型为目标任务生成更相关、更连贯的输出。
b) 奖励模型:训练单独的奖励模型来预测人类偏好。这涉及:
c) 强化学习:经过微调的 LLM 随后使用强化学习进一步优化。奖励模型提供反馈,引导 LLM 生成符合人类偏好的反应。
下面是一个简化的 Python 伪代码,用于说明 RLHF 过程:
虽然 RLHF 有效,但它有几个缺点:
这些限制促使人们寻找更简单、更有效的替代方案,从而导致了 DPO 的发展。
此图对比了两种将 LLM 输出与人类偏好相一致的不同方法:基于人类反馈的强化学习 (RLHF) 和直接偏好优化 (DPO)。RLHF 依靠奖励模型通过迭代反馈循环来指导语言模型的策略,而 DPO 则使用偏好数据直接优化模型输出以匹配人类偏好的响应。此比较突出了每种方法的优势和潜在应用,为未来 LLM 如何训练以更好地符合人类期望提供了见解。
a) 隐性奖励模型:DPO 将语言模型本身视为隐式奖励函数,从而消除了对单独奖励模型的需求。
b) 基于策略的制定:DPO 不优化奖励函数,而是直接优化策略(语言模型)以最大化首选响应的概率。
c) 闭式解:DPO 利用数学洞察力,可以对最佳策略提供闭式解,从而避免进行迭代 RL 更新。
下图展示了使用 PyTorch 实现 DPO 损失函数的代码片段。该函数在改进语言模型如何根据人类偏好对输出进行优先排序方面起着至关重要的作用。以下是关键组件的细分:
dpo_loss
函数接受几个参数,包括策略日志概率(pi_logps
),参考模型对数概率(ref_logps
),以及代表优先和非优先完成情况的指数(yw_idxs
, yl_idxs
)此外, beta
参数控制KL惩罚的强度。logsigmoid
函数,而奖励则通过缩放策略和参考日志概率之间的差异来确定 beta
.DPO 是对偏好学习问题的一个巧妙的重新表述。下面是分步分解:
a)起点:KL 约束奖励最大化
原始 RLHF 目标可以表示为:
地点:
b) 最优策略形式: 可以证明,该目标的最优策略采取如下形式:
π_r(y|x) = 1/Z(x) * πref(y|x) * exp(1/β * r(x,y))
其中 Z(x) 是归一化常数。
c) 奖励策略二元性: DPO 的关键见解是用最优策略来表达奖励函数:
r(x,y) = β * log(π_r(y|x) / πref(y|x)) + β * log(Z(x))
d) 偏好模型假设偏好遵循 Bradley-Terry 模型,我们可以将偏好 y1 而非 y2 的概率表示为:
p*(y1 ≻ y2 | x) = σ(r*(x,y1) - r*(x,y2))
其中 σ 是逻辑函数。
e) DPO 目标 将我们的奖励策略二元性代入偏好模型,我们得出 DPO 目标:
L_DPO(πθ; πref) = -E_(x,y_w,y_l)~D [log σ(β * log(πθ(y_w|x) / πref(y_w|x)) - β * log(πθ(y_l|x) / πref(y_l|x)))]
可以使用标准梯度下降技术来优化该目标,而无需 RL 算法。
现在我们了解了 DPO 背后的理论,让我们看看如何在实践中实现它。我们将使用 蟒蛇 和 PyTorch 对于此示例:
import torch import torch.nn.functional as F class DPOTrainer: def __init__(self, model, ref_model, beta=0.1, lr=1e-5): self.model = model self.ref_model = ref_model self.beta = beta self.optimizer = torch.optim.AdamW(self.model.parameters(), lr=lr) def compute_loss(self, pi_logps, ref_logps, yw_idxs, yl_idxs): """ pi_logps: policy logprobs, shape (B,) ref_logps: reference model logprobs, shape (B,) yw_idxs: preferred completion indices in [0, B-1], shape (T,) yl_idxs: dispreferred completion indices in [0, B-1], shape (T,) beta: temperature controlling strength of KL penalty Each pair of (yw_idxs[i], yl_idxs[i]) represents the indices of a single preference pair. """ # Extract log probabilities for the preferred and dispreferred completions pi_yw_logps, pi_yl_logps = pi_logps[yw_idxs], pi_logps[yl_idxs] ref_yw_logps, ref_yl_logps = ref_logps[yw_idxs], ref_logps[yl_idxs] # Calculate log-ratios pi_logratios = pi_yw_logps - pi_yl_logps ref_logratios = ref_yw_logps - ref_yl_logps # Compute DPO loss losses = -F.logsigmoid(self.beta * (pi_logratios - ref_logratios)) rewards = self.beta * (pi_logps - ref_logps).detach() return losses.mean(), rewards def train_step(self, batch): x, yw_idxs, yl_idxs = batch self.optimizer.zero_grad() # Compute log probabilities for the model and the reference model pi_logps = self.model(x).log_softmax(-1) ref_logps = self.ref_model(x).log_softmax(-1) # Compute the loss loss, _ = self.compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs) loss.backward() self.optimizer.step() return loss.item() # Usage model = YourLanguageModel() # Initialize your model ref_model = YourLanguageModel() # Load pre-trained reference model trainer = DPOTrainer(model, ref_model) for batch in dataloader: loss = trainer.train_step(batch) print(f"Loss: {loss}")
虽然 DPO 比传统 RLHF 方法具有显著优势,但仍然存在挑战和有待进一步研究的领域:
随着语言模型的规模不断扩大,如何有效地将 DPO 应用于具有数千亿个参数的模型仍然是一个悬而未决的挑战。研究人员正在探索以下技术:
使用 LoRA 与 DPO 的示例:
from peft import LoraConfig, get_peft_model class DPOTrainerWithLoRA(DPOTrainer): def __init__(self, model, ref_model, beta=0.1, lr=1e-5, lora_rank=8): lora_config = LoraConfig( r=lora_rank, lora_alpha=32, target_modules=["q_proj", "v_proj"], lora_dropout=0.05, bias="none", task_type="CAUSAL_LM" ) self.model = get_peft_model(model, lora_config) self.ref_model = ref_model self.beta = beta self.optimizer = torch.optim.AdamW(self.model.parameters(), lr=lr) # Usage base_model = YourLargeLanguageModel() dpo_trainer = DPOTrainerWithLoRA(base_model, ref_model)
开发能够有效适应偏好数据有限的新任务或领域的 DPO 技术是一个活跃的研究领域。正在探索的方法包括:
现实世界的偏好数据通常包含歧义或冲突。提高 DPO 对此类数据的稳健性至关重要。潜在的解决方案包括:
概率偏好建模的示例:
class ProbabilisticDPOTrainer(DPOTrainer):
def compute_loss(self, pi_logps, ref_logps, yw_idxs, yl_idxs, preference_prob):
# Compute log ratios
pi_yw_logps, pi_yl_logps = pi_logps[yw_idxs], pi_logps[yl_idxs]
ref_yw_logps, ref_yl_logps = ref_logps[yw_idxs], ref_logps[yl_idxs]
log_ratio_diff = pi_yw_logps.sum(-1) - pi_yl_logps.sum(-1)
loss = -(preference_prob * F.logsigmoid(self.beta * log_ratio_diff) +
(1 - preference_prob) * F.logsigmoid(-self.beta * log_ratio_diff))
return loss.mean()
# Usage
trainer = ProbabilisticDPOTrainer(model, ref_model)
loss = trainer.compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs, preference_prob=0.8) # 80% c
将 DPO 与其他对齐方法相结合可以产生更强大、更强大的系统:
DPO 与体质 AI 相结合的示例:
class ConstitutionalDPOTrainer(DPOTrainer): def __init__(self, model, ref_model, beta=0.1, lr=1e-5, constraints=None): super().__init__(model, ref_model, beta, lr) self.constraints = constraints or [] def compute_loss(self, pi_logps, ref_logps, yw_idxs, yl_idxs): base_loss = super().compute_loss(pi_logps, ref_logps, yw_idxs, yl_idxs) constraint_loss = 0 for constraint in self.constraints: constraint_loss += constraint(self.model, pi_logps, ref_logps, yw_idxs, yl_idxs) return base_loss + constraint_loss # Usage def safety_constraint(model, pi_logps, ref_logps, yw_idxs, yl_idxs): # Implement safety checking logic unsafe_score = compute_unsafe_score(model, pi_logps, ref_logps) return torch.relu(unsafe_score - 0.5) # Penalize if unsafe score > 0.5 constraints = [safety_constraint] trainer = ConstitutionalDPOTrainer(model, ref_model, constraints=constraints)
在为实际应用实施 DPO 时,请考虑以下提示:
a) 数据质量:偏好数据的质量至关重要。确保您的数据集:
b) 超参数调整:虽然 DPO 的超参数比 RLHF 少,但调整仍然很重要:
c) 迭代细化:DPO可以迭代应用:
直接偏好优化性能
该图深入研究了 GPT-4 等 LLM 与人类判断在各种训练技术(包括直接偏好优化 (DPO)、监督微调 (SFT) 和近端策略优化 (PPO))中的性能对比。该表显示,GPT-4 的输出越来越符合人类偏好,尤其是在摘要任务中。GPT-4 与人类审阅者之间的一致性水平表明该模型能够生成与人类评估者产生共鸣的内容,几乎与人类生成的内容一样接近。
为了说明 DPO 的有效性,让我们看一些实际应用及其一些变体:
直接偏好优化代表了语言模型与人类偏好相一致的重大进步。它的简单性、效率和有效性使其成为研究人员和从业人员的强大工具。
通过利用直接偏好优化的强大功能并牢记这些原则,您可以创建不仅具有令人印象深刻的功能而且与人类价值观和意图紧密结合的语言模型。
原文地址:https://www.unite.ai/direct-preference-optimization-a-complete-guide/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。