使用 DDPO 在 TRL 中微调 Stable Diffusion 模型

引言

扩散模型 (如 DALL-E 2、Stable Diffusion) 是一类文生图模型,在生成图像 (尤其是有照片级真实感的图像) 方面取得了广泛成功。然而,这些模型生成的图像可能并不总是符合人类偏好或人类意图。因此出现了对齐问题,即如何确保模型的输出与人类偏好 (如“质感”) 一致,或者与那种难以通过提示来表达的意图一致?这里就有强化学习的用武之地了。

在大语言模型 (LLM) 领域,强化学习 (RL) 已被证明是能让目标模型符合人类偏好的非常有效的工具。这是 ChatGPT 等系统卓越性能背后的主要秘诀之一。更准确地说,强化学习是人类反馈强化学习 (RLHF) 的关键要素,它使 ChatGPT 能像人类一样聊天。

在 Training Diffusion Models with Reinforcement Learning 一文中,Black 等人展示了如何利用 RL 来对扩散模型进行强化,他们通过名为去噪扩散策略优化 (Denoising Diffusion Policy Optimization,DDPO) 的方法针对模型的目标函数实施微调。

在本文中,我们讨论了 DDPO 的诞生、简要描述了其工作原理,并介绍了如何将 DDPO 加入 RLHF 工作流中以实现更符合人类审美的模型输出。然后,我们切换到实战,讨论如何使用 trl 库中新集成的 DDPOTrainer 将 DDPO 应用到模型中,并讨论我们在 Stable Diffusion 上运行 DDPO 的发现。

DDPO 的优势

DDPO 并非解决 如何使用 RL 微调扩散模型 这一问题的唯一有效答案。

在进一步深入讨论之前,我们强调一下在对 RL 解决方案进行横评时需要掌握的两个关键点:

  1. 计算效率是关键。数据分布越复杂,计算成本就越高。

  2. 近似法很好,但由于近似值不是真实值,因此相关的错误会累积。

在 DDPO 之前,奖励加权回归 (Reward-Weighted Regression,RWR) 是使用强化学习微调扩散模型的主要方法。RWR 重用了扩散模型的去噪损失函数、从模型本身采样得的训练数据以及取决于最终生成样本的奖励的逐样本损失权重。该算法忽略中间的去噪步骤/样本。虽然有效,但应该注意两件事:

  1. 通过对逐样本损失进行加权来进行优化,这是一个最大似然目标,因此这是一种近似优化。

  2. 加权后的损失甚至不是精确的最大似然目标,而是从重新加权的变分界中得出的近似值。

所以,根本上来讲,这是一个两阶近似法,其对性能和处理复杂目标的能力都有比较大的影响。

DDPO 始于此方法,但 DDPO 没有将去噪过程视为仅关注最终样本的单个步骤,而是将整个去噪过程构建为多步马尔可夫决策过程 (MDP),只是在最后收到奖励而已。这样做的好处除了可以使用固定的采样器之外,还为让代理策略成为各向同性高斯分布 (而不是任意复杂的分布) 铺平了道路。因此,该方法不使用最终样本的近似似然 (即 RWR 的做法),而是使用易于计算的每个去噪步骤的确切似然 ( )。

如果你有兴趣了解有关 DDPO 的更多详细信息,我们鼓励你阅读 原论文 及其 附带的博文。

DDPO 算法简述

考虑到我们用 MDP 对去噪过程进行建模以及其他因素,求解该优化问题的首选工具是策略梯度方法。特别是近端策略优化 (PPO)。整个 DDPO 算法与近端策略优化 (PPO) 几乎相同,仅对 PPO 的轨迹收集部分进行了比较大的修改。

下图总结了整个算法流程:

ed44347f9a844f55abb1d2351e8a231e.png
dppo rl 流图

DDPO 和 RLHF: 合力增强美观性

RLHF 的一般训练步骤如下:

  1. 有监督微调“基础”模型,以学习新数据的分布。

  2. 收集偏好数据并用它训练奖励模型。

  3. 使用奖励模型作为信号,通过强化学习对模型进行微调。

需要指出的是,在 RLHF 中偏好数据是获取人类反馈的主要来源。

DDPO 加进来后,整个工作流就变成了:

  1. 从预训练的扩散模型开始。

  2. 收集偏好数据并用它训练奖励模型。

  3. 使用奖励模型作为信号,通过 DDPO 微调模型

请注意,DDPO 工作流把原始 RLHF 工作流中的第 3 步省略了,这是因为经验表明 (后面你也会亲眼见证) 这是不需要的。

下面我们实战一下,训练一个扩散模型来输出更符合人类审美的图像,我们分以下几步来走:

  1. 从预训练的 Stable Diffusion (SD) 模型开始。

  2. 在 美学视觉分析 (Aesthetic Visual Analysis,AVA)  数据集上训练一个带有可训回归头的冻结 CLIP 模型,用于预测人们对输入图像的平均喜爱程度。

  3. 使用美学预测模型作为奖励信号,通过 DDPO 微调 SD 模型。

记住这些步骤,下面开始干活:

使用 DDPO 训练 Stable Diffusion

环境设置

首先,要成功使用 DDPO 训练模型,你至少需要一个英伟达 A100 GPU,低于此规格的 GPU 很容易遇到内存不足问题。

使用 pip 安装 trl

pip install trl[diffusers]

主库安装好后,再安装所需的训练过程跟踪和图像处理相关的依赖库。注意,安装完 wandb 后,请务必登录以将结果保存到个人帐户。

pip install wandb torchvision

注意: 如果不想用 wandb ,你也可以用 pip 安装 tensorboard

演练一遍

trl 库中负责 DDPO 训练的主要是 DDPOTrainerDDPOConfig 这两个类。有关 DDPOTrainerDDPOConfig 的更多信息,请参阅 相应文档。trl 代码库中有一个 示例训练脚本。它默认使用这两个类,并有一套默认的输入和参数用于微调 RunwayML 中的预训练 Stable Diffusion 模型。

此示例脚本使用 wandb 记录训练日志,并使用美学奖励模型,其权重是从公开的 Hugging Face 存储库读取的 (因此数据收集和美学奖励模型训练均已经帮你做完了)。默认提示数据是一系列动物名。

用户只需要一个命令行参数即可启动脚本。此外,用户需要有一个 Hugging Face 用户访问令牌,用于将微调后的模型上传到 Hugging Face Hub。

运行以下 bash 命令启动程序:

python stable_diffusion_tuning.py --hf_user_access_token <token>

下表列出了影响微调结果的关键超参数:

参数描述单 GPU 训练推荐值(迄今为止)
num_epochs训练 epoch200
train_batch_size训练 batch size3
sample_batch_size采样 batch size6
gradient_accumulation_steps梯度累积步数1
sample_num_steps采样步数50
sample_num_batches_per_epoch每个 epoch 的采样 batch 数4
per_prompt_stat_tracking是否跟踪每个提示的统计信息。如果为 False,将使用整个 batch 的平均值和标准差来计算优势,而不是对每个提示进行跟踪True
per_prompt_stat_tracking_buffer_size用于跟踪每个提示的统计数据的缓冲区大小32
mixed_precision混合精度训练True
train_learning_rate学习率3e-4

这个脚本仅仅是一个起点。你可以随意调整超参数,甚至彻底修改脚本以适应不同的目标函数。例如,可以集成一个测量 JPEG 压缩度的函数或 使用多模态模型评估视觉文本对齐度的函数 等。

经验与教训

  1. 尽管训练提示很少,但其结果似乎已经足够泛化。对于美学奖励函数而言,该方法已经得到了彻底的验证。

  2. 尝试通过增加训练提示数以及改变提示来进一步泛化美学奖励函数,似乎反而会减慢收敛速度,但对模型的泛化能力收效甚微。

  3. 虽然推荐使用久经考验 LoRA,但非 LoRA 也值得考虑,一个经验证据就是,非 LoRA 似乎确实比 LoRA 能产生相对更复杂的图像。但同时,非 LoRA 训练的收敛稳定性不太好,对超参选择的要求也高很多。

  4. 对于非 LoRA 的超参建议是: 将学习率设低点,经验值是大约 1e-5 ,同时将 mixed_ precision 设置为 None

结果

以下是提示 bearheavendune 微调前 (左) 、后 (右) 的输出 (每行都是一个提示的输出):

微调前微调后
0e41e5c7d35e0aeccf24b8bdba1a90bc.png225abcd69e5fc63a7df77de55efae224.png
e5e83a905422030a3de28613306d018d.pngaee771e788197666035e349c2492999d.png
414abb39837581960a34e68a2a3af9a9.png249a214e3f40b2ddfa5e39f4c4913fcb.png

限制

  1. 目前 trlDDPOTrainer 仅限于微调原始 SD 模型;

  2. 在我们的实验中,主要关注的是效果较好的 LoRA。我们也做了一些全模型训练的实验,其生成的质量会更好,但超参寻优更具挑战性。

总结

像 Stable Diffusion 这样的扩散模型,当使用 DDPO 进行微调时,可以显著提高图像的主观质感或其对应的指标,只要其可以表示成一个目标函数的形式。

DDPO 的计算效率及其不依赖近似优化的能力,在扩散模型微调方面远超之前的方法,因而成为微调扩散模型 (如 Stable Diffusion) 的有力候选。

trl 库的 DDPOTrainer 实现了 DDPO 以微调 SD 模型。

我们的实验表明 DDPO 对很多提示具有相当好的泛化能力,尽管进一步增加提示数以增强泛化似乎效果不大。为非 LoRA 微调找到正确超参的难度比较大,这也是我们得到的重要经验之一。

DDPO 是一种很有前途的技术,可以将扩散模型与任何奖励函数结合起来,我们希望通过其在 TRL 中的发布,社区可以更容易地使用它!

致谢

感谢 Chunte Lee 提供本博文的缩略图。

🤗 宝子们可以戳 阅读原文 查看文中所有的外部链接哟!


英文原文: https://hf.co/blog/trl-ddpo

原文作者: Luke Meyers,Sayak Paul,Kashif Rasul,Leandro von Werra

译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的应用及大规模模型的训练推理。

审校/排版: zhongdongy (阿东)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/120630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解强化学习——强化学习的历史:试错学习

分类目录&#xff1a;《深入理解强化学习》总目录 让我们现在回到另一条通向现代强化学习领域的主线上&#xff0c;它的核心则是试错学习思想。我们在这里只对要点做概述&#xff0c;《深入理解强化学习》系列后面的文章会更详细地讨论这个主题。根据美国心理学家R.S.woodworth…

卡尔曼滤波(Kalman Filter)原理及Python实现

Kalman-Filter-Example 项目地址 https://github.com/zhengjie9510/kalman-filter-example 理论公式 详细理论可参考DR_CAN关于卡尔曼滤波器的视频讲解。https://www.bilibili.com/video/BV1dV411B7ME 卡尔曼滤波公式分为预测和更新两部分。 预测公式为&#xff1a; x_hat…

CVE-2022-32991靶场复现

靶场环境&#xff1a; 题目提示了该CMS的welcome.php中存在SQL注入攻击。 CVE官方给出的提示&#xff1a; welcome.php页面存在SQL注入&#xff0c;并且这个参数是eid 打开靶场环境&#xff1a; 页面是一个登陆注册的界面 用户注册&#xff1a; 1 010.com 123456 123456 点击Re…

国家数据局正式揭牌,数据专业融合型人才迎来发展良机

文章目录 每日一句正能量摘要《数据要素安全流通》《Python数据挖掘&#xff1a;入门、进阶与实用案例分析》《数据保护&#xff1a;工作负载的可恢复性 》《Data Mesh权威指南》《分布式统一大数据虚拟文件系统 Alluxio原理、技术与实践》《云原生数据中台&#xff1a;架构、方…

论文阅读(一)城市干道分段绿波协调控制模型研究

[1]酆磊,赵欣,李林等.城市干道分段绿波协调控制模型研究[J].武汉理工大学学报(交通科学与工程版),2021,45(06):1034-1038. 主要内容:该文介绍了基于绿波带宽和关联度的城市干道分段绿波协调控制模型。通过将主干道划分为不同子区域,并根据路段特点进行精准化控制,实现了分段…

【数据库】聚集函数

聚集函数 聚集函数一览AVG() 函数COUNT() 函数MAX() 函数MIN() 函数SUM() 函数 组合聚集函数 聚集函数一览 我们需要汇总数据而不是实际检索&#xff0c;此时我们使用聚集函数进行处理&#xff1b; 聚集函数一览表如下&#xff1a; 函数说明AVG()返回平均值COUNT()返回数量总…

计算机网络之数据链路层(全)

[复习提示] 王道&#xff1a;本章是历年考试中考查的重点。要求在了解数据链路层基本概念和功能的基础上&#xff0c;重点掌握滑动窗口机制、三种可靠传输协议、各种MAC协议、HDLC协议和PPP协议&#xff0c;特别是CSMA/CD协议和以太网帧格式&#xff0c;以及局域网的争用期和最…

Oracle(6) Control File

一、oracle控制文件介绍 1、ORACLE控制文件概念 Oracle控制文件是Oracle数据库的一个重要元素&#xff0c;用于记录数据库的结构信息和元数据。控制文件包含了数据库的物理结构信息、数据字典信息、表空间和数据文件的信息等。在Oracle数据库启动时&#xff0c;控制文件会被读…

华为机试题:HJ6 质数因子

目录 第一章、算法题1.1&#xff09;题目描述1.2&#xff09;文的盲的解题思路与答案1.3&#xff09;牛客链接 友情提醒: 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置。 第一章、算法题 1.1&#xff09;题目描述 题目…

虚拟机安装openEuler系统

openEuler操作系统简介&#xff1a; openEuler是一款开源操作系统。当前openEuler内核源于Linux&#xff0c;支持鲲鹏及其他多种处理器&#xff0c;能够充分释放计算芯片的潜能&#xff0c;是由全球开源贡献者构建的高效、稳定、安全的开源操作系统&#xff0c;适用于数据库、大…

Python学习笔记第六十九天(Matplotlib 直方图)

Python学习笔记第六十九天 Matplotlib 直方图绘制直方图结合 Pandas绘制直方图Series 对象绘制直方图 后记 Matplotlib 直方图 我们可以使用 pyplot 中的 hist() 方法来绘制直方图。 hist() 方法是 Matplotlib 库中的 pyplot 子库中的一种用于绘制直方图的函数。 hist() 方法…

机架式服务器介绍

大家都知道服务器分为机架式服务器、刀片式服务器、塔式服务器三类&#xff0c;今天小编就分别讲一讲这三种服务器&#xff0c;第一篇先来讲一讲机架式服务器的介绍。 机架式服务器定义&#xff1a;机架式服务器是安装在标准机柜中的服务器&#xff0c;一般采用19英寸的标准尺寸…

棋盘格测距-单目相机(OpenCV/C++)

一、文章内容简述&#xff1a; 1’ 通过cv::findChessboardCorners寻找棋盘格角点 2‘ 用cv::solvePnP计算旋转向量rvec和平移向量tvec 3’ 通过公式计算相机到棋盘格的距离 float distance sqrt(tvec.at<double>(0,0) * tvec.at<double>(0,0) tvec.at<do…

【Java】电子病历编辑器源码(云端SaaS服务)

电子病历编辑器极具灵活性&#xff0c;它既可嵌入到医院HIS系统中&#xff0c;作为内置编辑工具供多个模块使用&#xff0c;也可以独立拿出来&#xff0c;与第三方业务厂商展开合作&#xff0c;为他们提供病历书写功能&#xff0c;充分发挥编辑器的功能。 电子病历基于云端SaaS…

虚拟机kafka

一、kafka安装 &#xff08;1&#xff09;解压 &#xff08;2&#xff09;修改名字为kafka212 &#xff08;3&#xff09;进入/opt/soft/kafka212/config目录&#xff0c;配置文件server.properties 21 broker.id0 36 advertised.listenersPLAINTEXT://192.168.91.11:9092 …

Java API访问HDFS

一、下载IDEA 下载地址&#xff1a;https://www.jetbrains.com/idea/download/?sectionwindows#sectionwindows 拉到下面使用免费的IC版本即可。 运行下载下来的exe文件&#xff0c;注意安装路径最好不要安装到C盘&#xff0c;可以改成其他盘&#xff0c;其他选项按需勾选即可…

mvc 跟mvp 和mvvm的区别

MVC&#xff08;Model-View-Controller&#xff09;&#xff0c;MVP&#xff08;Model-View-Presenter&#xff09;和MVVM&#xff08;Model-View-ViewModel&#xff09;都是软件架构模式&#xff0c;用于将应用程序的不同组成部分分离开来&#xff0c;以便更好地组织和管理代码…

单例模式python实现

单例模式&#xff08;Singleton Pattern&#xff09;是一种常用的软件设计模式&#xff0c;它确保一个类在程序运行期间只有一个实例&#xff0c;并提供一个全局访问点。这种设计模式有助于确保资源的一致性和全局访问&#xff0c;同时也节省了系统资源。 在单例模式中&#xf…

多测师肖sir_高级金牌讲师__接口测试之练习题(6.1)

常见的接口面试题目: 1.postman接口测试&#xff0c;它有一个功能可以设置参数化&#xff0c;你有用过吗? 用过 &#xff08;1&#xff09;新建一个csv.文件 填写user、pwd 新建一个全局变量 user、pwd 点击bodyform-data 填写user、pwd 点击run 导入csv.件 查看结果 &#x…

git log 命令详解

测试仓库 asdf 常用参数 查询指定目录 git -C /Users/yanlp/workspace/asdf log 限制显示提交数量 git log -n 3 限制提交人|邮箱 git log --authorEdwin Kofler | git log --authoredwinkofler.dev 限制一个月内的提交git log --since1.month.ago | git log --since2023-0…