一、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(被拒回复):
“水是一种液体,在自然界中很常见。”
步骤:
- 计算对数概率
-
log_p_model_chosen = -5
-
log_p_model_rejected = -7
-
log_p_ref_chosen = -6
-
log_p_ref_rejected = -6
-
假设性的数值(用于说明):
- 计算偏好差值
-
delta_chosen = -5 - (-6) = 1
-
delta_rejected = -7 - (-6) = -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`
-
损失较小,表示模型对被选回复的偏好已高于被拒回复。
- 优化模型参数
- 通过反向传播,最小化损失 ( L(θ) ),进一步提高模型对被选回复的偏好。
5. 参考模型的作用
-
正则化效果: 防止模型过度偏离初始语言模型,保证生成文本的质量和多样性。
-
稳定训练过程: 提供一个固定的对照,使模型的更新更加平稳,避免发生梯度爆炸或消失。
6. 总结
-
DPO 训练过程: 模型利用
prompt
、chosen
、rejected
和参考模型,直接优化自身,使其生成的回复更符合人类偏好。 -
参考模型不可或缺: 它在损失函数中提供了正则化项,确保模型在学习人类偏好的同时,保持原有的语言能力和知识。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。