8 月 23 日,Surya Narreddi 发布了一段精彩的视频,展示了由语言模型绘制的水彩画。该模型通过 p5.brush 编写 JavaScript;这是一个“为 p5.js 添加自然绘画工具”的库。截至本文撰写时,这段视频迅速走红,获得了超过 150 万次观看。
视频还附带了一篇博客文章,介绍了该项目早期、范围更窄的阶段背后的训练过程:绘制特写花朵,而不是视频中的完整构图。遗憾的是,目前还没有开放相关产物。他的网站表示,完整的技术报告即将发布,因此请记得关注他。这个想法最初由他提出,源自艺术与设计领域;在这方面,他的能力远胜于我。我的尝试则着眼于工程实现,目标是在开放环境中复现这一方法,并发布每一个组成部分。
注意: 如需了解项目背景,可以观看 Surya 亲自讲解其毕业论文的视频。
本文尝试使用 TRL 和 OpenEnv 复现他的想法。参考图库数据集、强化学习环境、训练脚本以及训练好的模型,全部开放。
整个流程端到端运行在 Hugging Face 上:
-
使用 Jobs 进行训练
-
将强化学习环境和评分模型作为 Spaces 部署
-
通过 Inference Providers 运行成对评判器
-
Hub 上的所有产物都集中在一个集合中
两个 Space 启动后,整个流程只需一条命令。复制环境和评分模型,为奖励组合设置两个环境变量,然后启动训练:
hf jobs uv run train/watercolour_grpo.py --flavor h200 --timeout 48h --secrets HF_TOKEN -- \ --env-url https://<you>-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 <you>/watercolour-grpo --push-to-hub本文接下来将讲述如何完成这一过程;所有组成部分都在代码仓库中。
我逐步遵循了原始博客中的方法,只有在绝对必要时才进行了改动。所有我自己的想法都被列入清单,而没有放入实验中;这份清单最终成为文章末尾“我接下来会尝试什么”部分的一部分,与完整的已发布产物列表并列。如果你已经读过他的文章,那么这里的整体思路和奖励设计应该会很熟悉。新增内容包括开放实现、人工评分的参考图库,以及训练并比较的三种奖励组合;具体内容从需要构建的强化学习环境开始。
三个训练运行分别对应一种奖励组合,并行演化。每一帧展示的是某个步骤中的中位数画作。现在还不必区分它们,文章会解释每个运行分别对应什么。
人们为什么喜欢它
这些画作看起来松弛、不完美且富有手工感,而此时的图像模型往往生成完美的(统计意义上的平均)图片。我猜,这种反差很大程度上解释了为什么这段视频会走红。它让我想起生成式 AI 艺术的早期阶段,那时人们的目标是探索这种媒介。DeepDream(2015 年)原本是一个调试工具,后来被人们转化成了艺术作品;《Edmond de Belamy》(2018 年)等作品源自艺术家对 GAN 能力的探索;而 Mario Klingemann 等艺术家则在那些年里使用神经网络创作梦幻般的肖像。
这个项目让人感觉更接近那个早期阶段。在他的毕业论文中,Surya 描述了最终走上这条道路的过程。他最初通过提示词使用文生图模型,其中提示词是唯一可以调节的杠杆;增加细节可以提升控制力,但只能达到一定程度。直接训练模型则能走得更远。
这一想法的另一半在于媒介本身。模型会编写大约 150 行 JavaScript 程序来绘制图像。模型的输出是代码:你可以阅读、编辑并再次运行它,每一笔画背后的决策都清晰可见。而这种风格来自一项限制:模型只能使用该库中的 10 个方法。下文将对此进行详细介绍。
在同一时期,Anna Ridler 拍摄了数千朵郁金香,为每一朵花手工标注,将数据集本身作为艺术品展出,后来又在其上训练了一个模型。我是在构建这个项目时,通过 AI agent 返回的参考资料发现她的作品的;我很喜欢她的作品,因为这个项目采用了非常相似的方式:手工策划一组图像,然后针对这组图像进行训练。
用强化学习超越审美偏好
近期大多数语言模型强化学习工作都使用可验证的奖励。例如,有已知答案的数学题、能够通过测试的代码,或者判断正确与否且运行成本低廉的评判器。这个项目更接近早期的一个例外——RLHF,即让模型从人类偏好中学习奖励模型。
这里的奖励是审美偏好,不存在正确答案。这个项目真正要探讨的问题是:能否围绕审美偏好进行强化学习?
正如他的博客所定义的,以及我构建的强化学习环境所实现的那样,奖励由以下部分组成:
| 项目 | 权重 | 衡量内容 |
|---|---|---|
gate | 0.05 | 草图能够编译、能够绘制出内容,并且没有作弊 |
length | 0.05 | 温和地鼓励生成更长的代码片段 |
| 成对评判器 | 0.60 | 相对于参考图像的风格 |
| HPSv3 | 0.30 | 对渲染结果的审美偏好 |
HPSv3 是一个开放的 70 亿参数偏好模型。给它一张图像和一段文字描述,它会返回一个分数,表示人们偏好该图像的程度。它基于大量人类在成对图像之间做出的选择进行训练,因此其分数代表了许多人审美偏好的平均值。
成对评判器是 Qwen3-VL-30B-A3B-Instruct,这是一个通过 Hugging Face Inference Providers 调用的通用视觉模型。成对评判器会将候选画作与从图库中随机选出的四张参考图像并排展示,并根据一段文字描述来判断需要关注的因素,例如晕染、半透明的水彩层次和柔和的边缘。每次比较都会使用两种展示顺序,最终得分是候选画作赢得比较的比例。它唯一的评判标准就是图库,因此它的分数代表了我的审美偏好,而这种偏好被编码在这些评分中。

奖励函数中的四个项有两个来自模型。这两个模型都是某个人审美偏好的代理。
这些就是权重 Na
