Hugging Face 在 9 月 3 日放出一份完整的训练记录:拿一个写代码的模型,训到会画水彩。整条链路里没有扩散模型,也没有任何图像生成组件。模型吐出来的是一段 JavaScript,代码调用 p5.brush 这个笔刷库,跑一遍,画布上留下一张水彩画。
作者是 Sergio Paniego,最初的点子来自 Surya Narreddi。基座模型选的是 Qwen3.5-35B-A3B,训练用 TRL 里的 GRPO,LoRA 挂在全部线性层上,学习率 5e-5,配 constant_with_warmup 调度。代码执行、渲染和算分这一段封在 OpenEnv 环境里:模型生成代码,环境负责跑它、截图,再把图交给打分器。
奖励里没有对错,只有一池参考图
强化学习这两年在大模型上跑得顺的场景,大多有一个能自动判对错的终点——数学题有标准答案,代码题有单元测试。水彩画没有。这份记录里的解法是把「好不好看」拆成两个可以打分的东西。
奖励函数一共四项。代码能不能跑通占 0.05,代码长度占 0.05,剩下九成权重分给两个审美信号:一个做成对比较的评委模型,一个叫 HPSv3 的人类偏好打分器。这两项的权重在不同实验里互换,judge-led 那组评委占 0.60、HPSv3 占 0.30,hps-led 那组反过来。
评委的判断标准来自一个手工评分的参考池,一共 178 张画。模型每生成一张,就跟池子里的作品比一轮。这个池子同时也界定了什么算「多样」,博客里的原话是「The pool decides what counts as variety, the same way it decides what counts as quality」(池子怎么定义质量,就怎么定义多样性)。这 178 张图实际上框住了整个训练目标的上限。
三次跑,三条曲线
作者跑了三组对照。只用 HPSv3 打分的那组跑 60 步,平均奖励从 0.58 升到 0.71;judge-led 跑 110 步,从 0.45 到 0.72;hps-led 同样 110 步,从 0.57 到 0.82,起点和终点都最高。
涨幅最大的是 judge-led 的 0.27,但它起点也最低。hps-led 涨了 0.24 却收在 0.82,把人类偏好打分器放在主位、评委模型做补充,比反过来更稳。只有打分器、没有评委的那一组只涨了 0.13,是三组里最小的——成对比较这一层确实贡献了额外信号,并非可有可无的装饰。
一张卡、34 小时、一百来美元
硬件那一栏很简单。全程一张 H200:60 步跑 18 小时,110 步跑 34 小时。渲染放在一个 CPU 规格的 Space 上,HPSv3 打分器放在 a100-large 的 Space 上。
按当前云上 H200 每小时 3 到 4 美元的挂牌价粗算,一次 110 步的完整训练落在 100 到 140 美元区间,加上打分器和渲染的开销,整个项目的算力账单大概是几百美元。对一个只想验证「审美偏好能不能当奖励」的团队来说,这个门槛低到可以随手试。
开源的东西铺得比较全:训练配方和脚本放在 GitHub,178 张参考图的数据集、可以直接复制的 RL 环境 Space、HPSv3 打分器 Space、三个 LoRA 适配器连同各自的 rollout 数据集,还有一个能翻完所有生成结果的画廊。想复现的人不用自己搭环境,把 Space 复制一份、改改奖励权重就能开始。
顺着这条路往下想,能挪用的场景不少。前端组件的观感、海报排版的疏密、图表配色是否得体,这些都是说不清对错、但人一眼能分出高下的任务,过去很难写进 RL 的奖励函数。现在的做法是先攒一个几百条的参考池,找一个够用的偏好打分器,剩下的交给 GRPO。麻烦仍然在参考池:池子偏了,模型就跟着偏,而且偏得很整齐。
参考来源:Hugging Face 官方博客、TRL 与 OpenEnv 项目文档、CocoLoop;三组实验的步数、奖励区间与单卡时长按博客给出的训练记录逐项核对,算力费用为按公开挂牌价的粗算。