72B模型DPO微调

一、DPO的大模型的技术点

直接偏好优化(Direct Preference Optimization,DPO)是当前将大型语言模型(LLM)与人类偏好对齐的热门方法之一。借助 LoRA 和 QLoRA 等参数高效微调技术,我们可以在单GPU卡上对拥有80 亿参数的模型(如 Llama 3.1 8B 和 Qwen2.5 7B)进行 DPO 训练,当然训练序列可能较短。但如果更大的模型,比如72B,就需要使用多GPU卡。

技术点

举个例子,假设我们想在一台拥有 8 块 H100 GPU(总共 640 GB 显存)的机器上,对一个 700 亿参数的模型进行 DPO 训练。我们需要考虑以下几点:

  • 策略模型(Policy Model):我们要训练的模型,占用约 140 GB 的显存。

  • 参考模型(Reference Model):DPO 需要一个参考模型,通常与策略模型结构相同,也占用约 140 GB 的显存。

    这样,仅模型参数就已经用掉了 280 GB 的显存,大约是总显存的 43.75%。再加上优化器状态,比如使用 AdamW 优化器,每个参数会有两个额外的状态变量。如果这些状态变量以 16 位精度存储,会占用额外的 280 GB 显存。算下来,我们已经用了 560 GB 的显存,只剩下 80 GB 了。这些剩余的显存还要用于存储激活值和梯度。如果不采取特殊的方法,单靠一台机器恐怕无法训练。

二、微调并行化

我们可以使用 PyTorch 的 Fully Sharded Data Parallel(FSDP)技术,配合像 LoRA 和 QLoRA 这样的参数高效微调方法。FDSP类似于DeepSpeed的ZeRO3技术。

FSDP 是一种分布式训练技术,它可以将模型的参数、优化器状态和梯度分片,并分布到多个设备上(比如 GPU)。在前向和反向传播过程中,只有需要的参数片会被加载到内存中,计算完成后就会释放。这大大降低了内存需求。

当然在更大模型的训练的时候,可以使用 DeepSpeed 。DeepSpeed 那样需要大量的内存来存储全精度的模型参数。

在测试中,我两种方法都尝试了。我的环境是两个H100的VM:

在这里插入图片描述

我先展示使用accelerate的方法。

在这里插入图片描述

在这里插入图片描述

上述完整代码见我的repo。

需要指出的是,出于节省显存的目的,我设置的参考模型是通过LoRA adapter加载的,参考模型的基础模型和策略模型是一个。

启动训练:

#accelerate launch --config_file config_fsdp.yaml fsdp+QLoRA.py

三、 DPO 训练输出的各个字段解释

在 DPO 训练中,模型会被提供一组对话,每组包含相同的“提示(prompt)”或“问题(question)”,以及对应的“被选(chosen)”和“被拒(rejected)”回复。模型需要学习区分这些回复,倾向于生成高质量的“被选”回复。

DPO 训练数据解析

训练数据,包括:

  • 来源(source):Airoboros

  • 被选回复(chosen):包含多轮对话

  • 被拒回复(rejected):包含多轮对话

  • 提示(prompt):一段描述性的文字

  • 问题(question):与提示相同的文字

    有时候数据中,“prompt” 和 “question” 可能是相同的,这在某些训练设置中可能用作对话的起始点。

在这里插入图片描述

接下来,我结合训练数据,大致介绍DPO训练的过程和结果。

在这里插入图片描述

DPO(直接偏好优化)的核心思想

1.DP的核心目标

  • 目标:不显式训练奖励模型的情况下,直接利用人类偏好数据对模型进行优化。

  • 参考模型的引入: 为了防止模型在优化过程中偏离原有的语言能力,DPO 引入了参考模型(通常是初始模型的副本,参数固定不变),作为正则化项。

2. 训练数据

  • 提示(Prompt): 用户输入,例如:“请解释水的三态变化。”

  • 被选回复(Chosen Reply): 人类评估为高质量、符合预期的回复。

  • 被拒回复(Rejected Reply): 人类评估为质量较低、不符合预期的回复。

3. 训练过程

步骤 1:计算对数概率

对于当前模型(参数为 θ):

  • 被选回复的对数概率:

    
    `log_p_model_chosen = log( π_θ( chosen_reply | prompt ) )`
    
    
    
  • 被拒回复的对数概率:

    
    `log_p_model_rejected = log( π_θ( rejected_reply | prompt ) )`
    
    
    

对于参考模型(参数固定):

  • 被选回复的对数概率:

    
    `log_p_ref_chosen = log( π_ref( chosen_reply | prompt ) )`
    
    
    
  • 被拒回复的对数概率:

    
    `log_p_ref_rejected = log( π_ref( rejected_reply | prompt ) )`
    
    
    
步骤 2:计算偏好差值
  • 被选回复的偏好差值:

    
    `delta_chosen = log_p_model_chosen - log_p_ref_chosen`
    
    
    
  • 被拒回复的偏好差值:

    
    `delta_rejected = log_p_model_rejected - log_p_ref_rejected`
    
    
    
步骤 3:构建损失函数
  • 损失函数的形式:

    
    `L(θ) = -log( exp( delta_chosen / β ) / [ exp( delta_chosen / β ) + exp( delta_rejected / β ) ] )`
    
    
    

    其中,β 是控制温度的超参数。

  • 目标: 最小化损失函数 ( L(θ) ),使得模型更倾向于生成被选回复,而不是被拒回复。

4. 示例

以您的例子为例:

  • Prompt(提示): “请解释水的三态变化。”

  • Chosen Reply(被选回复):

    “水有三种状态:固态、液态和气态。温度的变化会导致水在这些状态之间转化,例如冰融化成水,水蒸发成水蒸气。”

  • Rejected Reply(被拒回复):

    “水是一种液体,在自然界中很常见。”

    步骤:

  1. 计算对数概率
  • log_p_model_chosen = -5

  • log_p_model_rejected = -7

  • log_p_ref_chosen = -6

  • log_p_ref_rejected = -6

  • 假设性的数值(用于说明):

  1. 计算偏好差值
  • delta_chosen = -5 - (-6) = 1

  • delta_rejected = -7 - (-6) = -1

  1. 计算损失函数(β = 1)
  • 计算分子:

    
    `exp( delta_chosen / β ) = exp(1) ≈ 2.718`
    
    
    
  • 计算分母:

    `exp( delta_chosen / β ) + exp( delta_rejected / β ) = exp(1) + exp(-1) ≈ 2.718 + 0.368 ≈ 3.086`
    
    
    
    
  • 计算损失:

    `L(θ) = -log( 2.718 / 3.086 ) ≈ -log(0.880) ≈ 0.127`
    
    
    
    
  • 损失较小,表示模型对被选回复的偏好已高于被拒回复。

  1. 优化模型参数
  • 通过反向传播,最小化损失 ( L(θ) ),进一步提高模型对被选回复的偏好。

5. 参考模型的作用

  • 正则化效果: 防止模型过度偏离初始语言模型,保证生成文本的质量和多样性。

  • 稳定训练过程: 提供一个固定的对照,使模型的更新更加平稳,避免发生梯度爆炸或消失。

6. 总结

  • DPO 训练过程: 模型利用 promptchosenrejected 和参考模型,直接优化自身,使其生成的回复更符合人类偏好。

  • 参考模型不可或缺: 它在损失函数中提供了正则化项,确保模型在学习人类偏好的同时,保持原有的语言能力和知识。

AI大模型学习路线

如果你对AI大模型入门感兴趣,那么你需要的话可以点击这里大模型重磅福利:入门进阶全套104G学习资源包免费分享!

扫描下方csdn官方合作二维码获取哦!

在这里插入图片描述

这是一份大模型从零基础到进阶的学习路线大纲全览,小伙伴们记得点个收藏!

请添加图片描述
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

100套AI大模型商业化落地方案

请添加图片描述

大模型全套视频教程

请添加图片描述

200本大模型PDF书籍

请添加图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

LLM面试题合集

请添加图片描述

大模型产品经理资源合集

请添加图片描述

大模型项目实战合集

请添加图片描述

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

<think>好的,我现在需要帮助用户比较和实现大模型微调中的DPO和PPO方法。首先,我需要回顾一下用户提供的引用资料,确保准确理解这两个方法的核心概念和差异。 用户给出的引用中有几个关键点:PPO属于强化学习方法,需要奖励模型来指导策略更新,而DPO则直接利用偏好数据优化策略,省去了奖励模型和复杂的强化学习过程。引用[1]提到PPO通过奖励信号训练模型,保持稳定性;引用[4]指出DPO绕过了奖励模型和强化学习,直接微调,效率更高。此外,引用[3]详细描述了RLHF的步骤,包括初始化参数、收集数据、计算奖励和更新参数,而引用[2]和[4]则强调DPO简化了流程,直接优化人类偏好。 接下来,我需要组织这些信息,进行系统性的比较。比较的维度可能包括算法原理、实现步骤、优缺点、适用场景等。同时,用户还要求生成相关问题,这需要在回答的最后部分列出相关问题,帮助用户深入探索。 在实现部分,用户可能需要示例代码或步骤说明。虽然实际代码可能复杂,但可以给出伪代码或关键步骤,比如数据准备、损失函数计算和参数更新。对于PPO,需要强调奖励模型的使用和策略迭代;而DPO则展示如何直接利用偏好数据优化策略。 需要注意的是,确保回答符合用户给出的格式要求:行内数学公式用$...$,独立公式用$$...$$,中文回答,结构清晰。同时,正确引用提供的资料,如引用[^1]、[^2]等。 最后,检查是否有遗漏的关键点,比如DPO的效率优势、PPO的稳定性机制,以及两者的应用场景差异。确保回答准确、全面,并且符合用户的需求。</think>### 大模型微调方法 DPO 与 PPO 的对比与实现 #### 一、核心原理对比 1. **PPO(Proximal Policy Optimization)** - 基于强化学习框架,通过奖励信号指导策略更新,需构建独立的奖励模型[^1] - 核心公式为策略梯度目标函数: $$L^{CLIP}(\theta) = \mathbb{E}_t[\min(r_t(\theta)\hat{A}_t, \text{clip}(r_t(\theta),1-\epsilon,1+\epsilon)\hat{A}_t)]$$ 其中$r_t(\theta)$为新旧策略概率比,$\hat{A}_t$为优势函数估计值[^3] 2. **DPO(Direct Preference Optimization)** - 将偏好数据直接映射到策略优化,无需奖励模型和强化学习循环[^4] - 核心公式改写为基于Bradley-Terry模型的损失函数: $$L_{\text{DPO}}(\theta) = -\mathbb{E}_{(x,y_w,y_l)\sim D}[\log\sigma(\beta \log\frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \beta \log\frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)})]$$ 其中$\beta$为温度参数,$\pi_{\text{ref}}$为参考策略 #### 二、实现流程对比 | 维度 | PPO | DPO | |----------|--------------------------------------|--------------------------------------| | 数据需求 | 需要标注奖励值的样本 | 仅需偏好排序数据(A > B) | | 训练复杂度 | 需交替更新策略模型和奖励模型 | 单阶段端到端训练 | | 计算资源 | 高(需多模型协同) | 低(仅优化策略模型) | | 收敛速度 | 慢(需策略迭代) | 快(直接梯度下降) | | 稳定性 | 需clip机制防策略突变 | 内置KL约束保证稳定性 | #### 三、典型应用场景 1. **PPO适用场景** - 需要精确控制生成内容属性的任务(如安全对齐) - 具备充足计算资源和标注能力的场景 2. **DPO适用场景** - 快速响应人类偏好的对话系统优化 - 资源受限但拥有大量偏好数据的场景 #### 四、代码实现示例 **PPO关键步骤**(伪代码): ```python # 初始化策略模型和奖励模型 policy = load_pretrained_model() reward_model = load_reward_model() for epoch in epochs: # 生成响应并计算奖励 responses = policy.generate(inputs) rewards = reward_model(responses, inputs) # 计算策略梯度 loss = clipped_surrogate_loss(policy, responses, rewards) optimizer.step(loss) ``` **DPO实现核心**(简化版): ```python class DPOTrainer: def __init__(self, model, ref_model): self.model = model # 待优化模型 self.ref_model = ref_model # 冻结的参考模型 def dpo_loss(self, chosen_logprobs, rejected_logprobs): log_ratios = chosen_logprobs - rejected_logprobs return -torch.log(torch.sigmoid(self.beta * log_ratios)) ``` #### 五、选择建议 - 追求训练效率选**DPO**:如对话系统快速迭代 - 需要精细控制选**PPO**:如安全敏感场景 - 混合使用场景:可先用DPO快速对齐,再用PPO精细调整
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员辣条

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值