<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title>Ju Lin's AI Weblog: Reinforcement-Learning</title><subtitle>An independent research notebook on AI engineering, agents, models and the systems around them.</subtitle><id>https://julin.ai/atom/tags/reinforcement-learning/index.xml</id><link rel="self" type="application/atom+xml" href="https://julin.ai/atom/tags/reinforcement-learning/index.xml"/><link rel="alternate" type="text/html" href="https://julin.ai/tags/reinforcement-learning/"/><author><name>Ju Lin</name></author><updated>2026-08-24T00:00:00+12:00</updated><entry><title>Training Qwen to Paint Watercolors with Pure RL</title><id>https://julin.ai/2026/08/24/qwen-watercolor-rl/</id><link rel="alternate" type="text/html" href="https://julin.ai/2026/08/24/qwen-watercolor-rl/"/><published>2026-08-24T00:00:00+12:00</published><updated>2026-08-24T00:00:00+12:00</updated><category term="field-notes"/><category term="reinforcement-learning"/><content type="html">&lt;p&gt;&lt;a href="https://surya.website/rling-qwen-to-paint-with-code"&gt;Surya trained Qwen 3.5&lt;/a&gt; to have taste in watercolor painting. &lt;a href="https://x.com/kickingkeys/status/2091570990048276897"&gt;The results are stunning&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s purely RL:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The system is a four-step loop, run thousands of times during training.&lt;/p&gt;
&lt;p&gt;The model receives a prompt, something like draw a peach hibiscus in watercolour, and writes a complete p5.brush JavaScript sketch. The sketch is rendered in a sandboxed Puppeteer environment, which produces a PNG. The PNG is judged against two random reference paintings sampled from a hand-rated pool, with a separate judge model picking the better watercolour. The judgment is converted into a reward signal, GRPO updates the model, and the loop runs again.&lt;/p&gt;
&lt;p&gt;The non-obvious choices live in what is being judged, how the judgment is made, what is in the reference pool, and how the system prompt is written.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;I ran into the same problem with pixel art generation. I built a harness around it, and the results still weren&amp;rsquo;t good enough. A harness can&amp;rsquo;t save you if the model itself puts out slop. This article shows a good way to fix that for art specifically.&lt;/p&gt;
&lt;p&gt;The reference pool isn&amp;rsquo;t big: 581 AI-generated paintings, narrowed down from 1,664 candidates. The author hand-rated them into &amp;ldquo;love-tier,&amp;rdquo; &amp;ldquo;okay,&amp;rdquo; and a supplementary batch. The candidates themselves came from Opus 4.6, GPT-5.4, and Gemini 3.1 Pro, iterating against reference photographs under a VLM judge. It&amp;rsquo;s a niche enough domain that there wasn&amp;rsquo;t enough human-made reference art to draw from, so the training data had to be manufactured this way.&lt;/p&gt;
&lt;p&gt;A few other takeaways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Don&amp;rsquo;t do rubric judge, just do pairwise comparisons.&lt;/strong&gt; The author tried a 1-10 rubric first and the scores compressed near zero. Switching to &amp;ldquo;which of these two is the better watercolour&amp;rdquo; opened up the dynamic range.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Just handpick a golden set and compare outputs to a random one from there, instead of a reward model.&lt;/strong&gt; The 117 love-tier paintings became the comparison pool, and every rollout got judged against those. Training an actual reward model was the next step they never got to.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simple prompts are better, don&amp;rsquo;t add too much detailed specs.&lt;/strong&gt; A long reference doc in the system prompt made the model hallucinate APIs. A short, opinionated allowlist worked better than the full spec, and the generated code compressed from 13,500 tokens to under 2,000.&lt;/li&gt;
&lt;li&gt;To do RL on subjective work, you have to author the reward by hand, and then design it carefully enough that it generalises.&lt;/li&gt;
&lt;/ul&gt;</content></entry></feed>