使用 TRL 和 OpenEnv 训练编码模型绘制水彩画

Hugging Face Blog 新闻

摘要

本文详细介绍了一个使用 TRL 和 OpenEnv 训练编码模型生成水彩艺术作品的开源复现项目,完整的流程成果已发布于 Hugging Face,以确保可复现性。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/09/03 11:49

使用TRL和OpenEnv训练代码模型绘制水彩画

来源:https://huggingface.co/blog/train-to-paint-with-code 训练代码模型绘制水彩画 (https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/blog/train-to-paint-with-code/thumbnail.png) 8月23日,Surya Narreddi (https://x.com/kickingkeys/status/2091570990048276897)发布了一段语言模型绘制的水彩画视频,画面优美。该模型通过p5.brush (https://github.com/acamposuribe/p5.brush)库编写JavaScript代码,该库“为p5.js添加了自然的绘图工具”。视频迅速走红,撰写本文时观看量已超过150万。视频附带了一篇博客文章 (https://surya.website/rling-qwen-to-paint-with-code),解释了项目早期一个更狭窄阶段的训练过程——是特写花卉,而非视频中的完整构图,遗憾的是目前尚未开放资源。他的网站表示完整的技术报告即将发布,请务必关注他。这个最初的创意源自他本人,他来自艺术与设计领域,这方面的技能远超于我 (https://x.com/kickingkeys/status/2094901433149612118)。我的尝试则侧重于工程方面,以开放的方式复现方案,发布每一个环节。

**注意:**关于项目背后的背景,由Surya本人讲述,请观看他关于此课题的视频 (https://vimeo.com/1190839818)。

在本文中,我尝试使用TRL (https://huggingface.co/docs/trl) 和OpenEnv (https://github.com/huggingface/OpenEnv) 来复现他的想法。参考池数据集、强化学习环境、训练脚本以及训练好的模型,全部开放。整个流程在Hugging Face上端到端运行:

  • 在Jobs (https://huggingface.co/docs/huggingface_hub/guides/jobs) 上进行训练
  • 强化学习环境和评分模型作为Spaces (https://huggingface.co/docs/hub/spaces)
  • 成对比较的评判通过推理服务提供商 (https://huggingface.co/docs/inference-providers) 实现
  • 所有产出均存于Hub,汇集在一个集合 (https://huggingface.co/collections/HuggingEnvs/paint-with-code-6a955b79d63f67f1631d9be6) 中

一旦两个Spaces部署完成,整个流程只需一条命令。复制环境 (https://huggingface.co/spaces/HuggingEnvs/watercolour-env) 和评分模型 (https://huggingface.co/spaces/HuggingEnvs/watercolour-hpsv3),设置两个环境变量以配置奖励混合比例,然后启动:

hf jobs uv run train/watercolour_grpo.py --flavor h200 --timeout 48h --secrets HF_TOKEN -- \
  --env-url https://-watercolour-env.hf.space \
  --model Qwen/Qwen3.5-35B-A3B --lora --all-linear --bf16 --gradient-checkpointing \
  --subject 'a peach hibiscus' --references 4 \
  --top-p 0.95 --top-k 20 \
  --lr 5e-5 --lr-scheduler constant_with_warmup --warmup-steps 5 \
  --scale-rewards none \
  --steps 110 --n-episodes 240 --num-generations 8 \
  --per-device-batch-size 1 --gradient-accumulation-steps 8 \
  --max-completion-length 8192 \
  --run-tag my-run --out /watercolour-grpo --push-to-hub

本文余下部分讲述了达成这一切的过程,每个环节都在代码库 (https://github.com/adithya-s-k/HuggingEnvs/tree/main/02-watercolour) 中。我严格遵循了原始博客的步骤,只在绝对必要时做了修改。所有我自己的想法都记录在列表里,而非加入实验,这个列表最终成了文末的“我接下来想尝试的内容”,连同已发布资源的完整列表一起。

如果你已经阅读过他的文章,那么框架和奖励设计会显得熟悉。新内容在于开放的实现、手动评分的参考池,以及三个经过训练和比较的奖励混合实验,它们从需要构建的强化学习环境 (https://huggingface.co/blog/train-to-paint-with-code#the-rl-environment-you-need-to-build) 部分开始。三个实验同步推进,每个奖励混合方案对应一个。每一帧展示的是某一步的中位数画作。现在无需区分它们,文章会解释哪个实验是哪个。

为何人们喜爱它

这些画作显得随性、不完美、手工感强,在图像模型能生成完美(统计意义上的平均)图片的当下。我猜想这种反差是视频走红的重要原因之一。它让我想起了生成式AI艺术的早期,那时的重点是探索媒介本身。DeepDream (https://research.google/blog/inceptionism-going-deeper-into-neural-networks/) (2015) 本是一个调试工具,却被人们变成了艺术;像《爱德蒙·贝拉米》(https://en.wikipedia.org/wiki/Edmond_de_Belamy) (2018) 这样的作品出自艺术家们对GAN能力的探索;而像马里奥·克林格曼 (https://quasimondo.com/) 这样的艺术家,在那些年里用神经网络创作了梦幻般的人像 (https://artsandculture.google.com/asset/memories-of-p passerby-i-mario-klingemann/aAHG7iV3aXme8g)。这个项目感觉更接近那些早期岁月。在他的论文中,Surya描述了通往此地的路径。他从提示文生图模型开始,提示词是你唯一能调动的杠杆,更多的细节只能换取有限的控制力。训练模型本身则能走得更远。这个想法的另一半在于媒介。模型编写大约150行JavaScript代码来绘制图像。模型的输出是代码。你可以阅读、编辑并再次运行它,每一笔背后的决策都是可见的。而这种风格源于一种限制——模型只被允许使用库中的十个方法。下文会详述。在同一时期,安娜·里德勒 (https://annaridler.com/works/myriad-tulips) 拍摄了数千张郁金香的照片,手动标注每一张,将数据集本身作为艺术品展出,后来又基于此训练了一个模型。我在构建这个项目时,通过AI智能体返回的参考文献发现了她的作品,并深感喜爱,因为这个项目通过手动筛选一组图像,然后针对它们进行训练,做了非常类似的事情。

用强化学习处理“品味”

近期大多数关于语言模型的强化学习工作使用可验证的奖励。例如,有已知答案的数学题、通过测试的代码,或是运行成本低廉且判定对错的评分器。这个项目更接近一个较早的例外——RLHF,即模型从人类偏好中学习奖励模型。这里的奖励是审美偏好。没有正确答案。这个项目的真正问题在于,你是否能通过强化学习处理“品味”。奖励,正如他的博客所定义,以及我构建的强化学习环境所实现的:

项权重衡量内容
gate0.05草图能编译、能绘制出东西、不会作弊
length0.05轻微鼓励生成更长的代码片段
成对比较评判器0.60风格,与从池中抽取的参考图比较
HPSv3 (https://huggingface.co/MizzenAI/HPSv3)0.30渲染图的审美偏好

HPSv3 (https://huggingface.co/MizzenAI/HPSv3) 是一个开放的70亿参数偏好模型。给它一张图像和一段文本描述,它会返回一个分数,表示人们对该图像的偏好程度。它是在大量人类对图像对的选择上训练的,因此其分数代表了众人的平均品味。

成对比较的评判器是Qwen3-VL-30B-A3B-Instruct (https://huggingface.co/Qwen/Qwen3-VL-30B-A3B-Instruct),一个通过HF推理服务提供商调用的通用视觉模型。成对比较评判器会看到候选画作与从池中随机抽取的四个参考图并列,并得到关于如何评判的文字描述(如晕染、半透明水洗、柔和边缘),每次比较都以两种呈现顺序进行,其得分是候选画作获胜的比较比例。它的唯一标准是参考池,因此其得分代表了我的品味,即编码在这些评分中的品味。

奖励管道,逐项解析奖励函数中的两项是模型。它们都是某人品味的代理。这些是Narreddi确定的权重。参考池在此定义了品味。这使得工作从调整超参数转向构建决定何为美的集合。我使用这个奖励进行了三个实验。它们仅在两位模型评判器的权重分配上有所不同:

实验成对比较评判器权重HPSv3权重角色
judge-led0.600.30原始混合方案,停在第110步
hps-led0.300.60中间方案,停在第110步
hps-only0.000.90验证实验,停在第60步

我从 hps-only 开始,以验证流程是否能有效学习。一旦奖励上升且指标健康,就没有理由再运行更久,于是我启动了两个更长的实验。更长的实验所探究的问题是:你能将HPSv3的多少“力量”交给成对比较评判器?评判器权重越大,奖励就越多地代表我的品味而非所有人的品味,学习爬升的难度也应该越大。顺便说一句,如果你把它推得过远,或者你的风格与平均风格相差太大,模型可能会完全停止。幸运的是,它没有停止,两个带有成对比较评判器的实验也成功学习了。手动评分的参考池可以引导策略,至少从指标和最终画作来看是如此。具体数据如下。

**免责声明。**如果我们使用前沿模型,它已经可以从提示词中生成绘制水彩画的JavaScript代码。那是起点。这里的工作是教导一个更小的模型做到这一点,并结合个人自己的艺术偏好。

需要构建的强化学习环境

该环境封装了模型与奖励之间的一切,包括模型用于绘图的JavaScript库、限制它的系统提示、渲染每个草图的无头Chromium,以及拒绝作弊的“门控”。这个库完成的工作比看起来更多。p5.brush (https://github.com/acamposuribe/p5.brush),作者@acamposuribe (https://x.com/acamposuribe),模拟的是介质而非绘制形状:颜料会晕染到填充区域边缘之外,纸张有纹理,笔触有质感,流动场会拖动画笔。当模型调用 brush.fillBleed(0.25) 时,它在决定墨水渗出多远。

**注意:**p5.brush的作者在这一切之前很久就在尝试教机器画画。2022年,他制作了一个生成艺术系列,其中隐藏了一篇关于教p5.js像孩子一样画画的日记:*“它几乎不会用蜡笔……它无法遵循简单的指令。今天到此为止,非常令人恼火。”*这个系列本应有三件作品,他做了两件。当Surya的视频走红时,他引用了它 (https://x.com/acamposuribe/status/2091668313449316651),分享了那篇日记,并说这件作品是第三件,它自己来了。

p5.brush暴露了47个方法。提示词只允许使用10个:scaleBrushes, noStroke, fill, noFill, fillBleed, fillTexture, beginShape, vertex, endShape 和 circle。另外三十七个方法——线条、交叉阴影、自定义画笔——会破坏水彩外观。使用这十个方法,模型只能绘制填充形状,而库会为每一个形状添加晕染效果。

**注意:**如果你第一次听说GEPA (https://huggingface.co/papers/2507.19457),它是一个自动提示词优化器。语言模型用平实的语言反思当前提示词的失败之处,并提出一个更好的提示词,如此循环往复。

“门控”是最后一部分。草图必须能编译、使用库而非直接调用p5、在画布上放置真实的颜料,且不能试图欺骗评分器,例如在画布上写字。

奖励管道逐项解析奖励函数中的两项是模型。它们都是某人品味的代理。这些是Narreddi确定的权重。参考池在此定义了品味。这使得工作从调整超参数转向构建决定何为美的集合。我使用这个奖励进行了三个实验。它们仅在两位模型评判器的权重分配上有所不同:

参考池即奖励函数

参考池包含178幅画作 (https://huggingface.co/datasets/HuggingEnvs/watercolour-reference-pool),根据我个人偏好分为两个层级:“喜爱”和“尚可”。它们全部实际上是由模型生成的。四个开源权重模型,通过推理服务提供商调用,编写p5.brush草图,每个模型都基于iNaturalist上一张真实、开源许可的芙蓉照片。一个视觉模型对每个草图提供了书面反馈,经过三轮迭代优化。然后,每个最终渲染图都由我逐一评分,最终178幅入选。这里我选择了四个不同的模型家族来测试它们不同的风格。这四个是在快速可靠性检查中每次都能产生有效草图的开源模型,另外两个候选模型因未通过检查而被淘汰。如果你想生成自己的参考池,可能会选择其他模型。

两个层级在奖励中发挥实际作用。当成对比较评判器抽取四个参考图时,一半来自“喜爱”,一半来自“尚可”,因此策略总是会面对一些它有时能击败的对手,并且对任一层级的胜利回报相同。这是我少数几个刻意改动之一:原始方案只与顶级层级比较,而我保留了较易的层级参与抽取,以便较弱的早期策略仍能获得信号。其中没有人类制作的画作,这是一个真正的局限。p5.brush是一个小众库,其中有人类作品且代码可获取的只有几件作品,远非训练语料库所需,正如他的博客也指出的那样。这里有趣的想法,正如我之前讨论过的,是模型将学习模仿参考池中的内容。如果我们将环境指向不同的数据集,奖励会自动改变,无需修改一行代码。对于我生成并开源的数据集,我也包含了原始草图。

如果我们仔细看评判器,它们两者回答的是不同的问题。HPSv3判断它是否是一朵花,而成对比较评判器判断它是否以我选择的风格画得好。

就再来一次YOLO实验吧

在一切顺利之前,有一段漫长的奖励曲线平坦期。如果你曾尝试在没有开放资源的情况下复现一篇研究论文/博客,你可能感同身受。每一次实验都测试了我对问题所在的一个合理猜想。一次实验需要大量时间,因此我在查看上一次实验结果的同时就排队了下一次实验。和往常一样,从某个简单可行的东西开始,然后在此基础上构建,是解决问题的答案。一个简单的控制任务——没有浏览器,没有评判器——是第一个成功的学习实验,原因是我之前的学习率太低了。

三次奖励实验平坦,与成功实验对比三次奖励实验,三条平线。我更换了参考池,去除了渲染器噪声,并关闭了成对比较评判器,但这些都没有让曲线移动。成功的实验改变了训练器配置,因此区别在于训练器,而非奖励混合方案。

另一个耗费我时间才找到的改变是正确调整LoRA参数。通常的target_modules列表假设的是密集模型,而Qwen/Qwen3.5-35B-A3B (https://huggingface.co/Qwen/Qwen3.5-35B-A3B) 是一个混合专家模型,其命名方式不同。

相似文章

训练AI用代码绘画

Hacker News Top

一个利用强化学习训练语言模型通过编写可编辑代码生成图像的研究项目,针对创意任务中的奖励函数和系统提示演进挑战提出了解决方案。

Qwen-Image-2.0-RL 技术报告

Hugging Face Daily Papers

本技术报告介绍了 Qwen-Image-2.0-RL,这是一个基于强化学习与人类反馈及在策略蒸馏的后训练流程,旨在提升图像生成与编辑任务中的视觉质量和指令遵循能力。