¿Puede un modelo de lenguaje aprender algo tan subjetivo como el gusto artístico? Un experimento abierto con TRL y OpenEnv intenta responderlo entrenando un modelo para escribir JavaScript que genera pinturas de acuarela. El resultado no es una imagen creada directamente por un modelo visual, sino código que puede leerse, modificarse y ejecutarse.
La idea original pertenece a Surya Narreddi, quien mostró un modelo capaz de pintar composiciones de acuarela usando la biblioteca p5.brush sobre p5.js. El video superó rápidamente 1,5 millones de visualizaciones. Esta implementación reproduce el enfoque con todos sus componentes publicados de forma abierta en Hugging Face.
Cuando el código se convierte en pincel
El modelo genera programas de aproximadamente 150 líneas en JavaScript. Esos programas utilizan p5.brush, una biblioteca que intenta simular un medio artístico completo, no solo dibujar formas geométricas.
La tinta puede desbordarse, el papel tiene textura y las pinceladas adquieren volumen. Cuando el modelo utiliza fillBleed(0.25), por ejemplo, está controlando cuánto se extiende el pigmento más allá del borde de una forma.
De los 47 métodos disponibles en la biblioteca, el entrenamiento permite usar únicamente 10:
scaleBrushesnoStrokefillnoFillfillBleedfillTexturebeginShapevertexendShapecircle
¿Por qué limitar tanto las herramientas? Porque una acuarela no necesita todas las posibilidades de un motor gráfico. Al restringir el espacio de acción, el modelo debe resolver la imagen con formas rellenas, transparencias y variaciones de pigmento. La limitación termina formando parte del estilo.
El prompt también incluye una instrucción sencilla: pintar cada pétalo dos o tres veces, comenzando con una capa grande y siguiendo con otra más pequeña y opaca. Aunque parece un detalle menor, esa modificación produjo resultados con más color.
El verdadero reto: entrenar con gusto humano
En matemáticas o programación suele existir una respuesta verificable. Un problema tiene una solución, y un programa puede pasar o fallar una prueba. En este caso no hay una acuarela correcta.
El modelo debe aprender una preferencia estética. ¿Cómo se convierte algo tan subjetivo en una señal de entrenamiento? Con una colección de referencias y varios evaluadores automáticos.
El conjunto de referencia contiene 178 pinturas generadas por modelos. Todas parten de fotografías de hibiscos con licencia abierta provenientes de iNaturalist. Cuatro modelos de código abierto generaron los bocetos, y un modelo de visión proporcionó comentarios durante tres rondas de refinamiento.
Después, cada imagen fue evaluada manualmente y clasificada en dos niveles: love, para las favoritas, y okay, para las aceptables. Esa selección personal se convirtió en la definición práctica de lo que el sistema debía considerar una buena pintura.
El cuello de botella no está únicamente en generar imágenes. También está en decidir cuáles vale la pena conservar.
Cómo funciona la recompensa
El entrenamiento combina cuatro señales. Cada una mide un aspecto diferente del resultado:
| Señal | Peso | Qué evalúa |
|---|---|---|
| Puerta de validación | 0,05 | Que el código compile, pinte y no haga trampa |
| Longitud | 0,05 | Una presión suave hacia programas más extensos |
| Juez comparativo | 0,60 | El estilo frente a pinturas de referencia |
| HPSv3 | 0,30 | Preferencia estética general sobre la imagen |
HPSv3 es un modelo abierto de 7.000 millones de parámetros que recibe una imagen y una descripción textual para estimar cuánto podría gustarle a una persona. Fue entrenado con comparaciones humanas entre imágenes, por lo que representa una aproximación promedio al gusto colectivo.
El segundo evaluador es Qwen3-VL-30B-A3B-Instruct, utilizado mediante los proveedores de inferencia de Hugging Face. Este juez compara la pintura candidata con cuatro referencias y considera elementos como los bordes suaves, los lavados translúcidos y los desbordamientos de pigmento.
Cada comparación se realiza en los dos órdenes posibles. La puntuación final representa la proporción de veces que la pintura candidata supera a sus rivales.
Aquí aparece una diferencia importante: HPSv3 pregunta si la imagen parece una flor atractiva, mientras que el juez comparativo pregunta si está bien pintada según el estilo seleccionado. Uno mide una preferencia más general y el otro intenta capturar el gusto específico de quien construyó el conjunto de referencia.
Tres entrenamientos, tres formas de entender la belleza
Se entrenaron tres versiones del modelo cambiando únicamente el peso de los dos jueces principales:
| Ejecución | Juez comparativo | HPSv3 | Propósito |
|---|---|---|---|
judge-led | 0,60 | 0,30 | Mezcla original |
hps-led | 0,30 | 0,60 | Punto intermedio |
hps-only | 0,00 | 0,90 | Validación con un único juez |
Los resultados mostraron mejoras en las tres ejecuciones:
| Ejecución | Pasos | Primer tercio | Último tercio | Cambio |
|---|---|---|---|---|
hps-only | 60 | 0,58 | 0,71 | +0,13 |
judge-led | 110 | 0,45 | 0,72 | +0,27 |
hps-led | 110 | 0,57 | 0,82 | +0,24 |
Al principio, el modelo aprendió sobre todo a evitar pinturas fallidas: lienzos casi vacíos, manchas sin forma o flores apenas reconocibles. Más adelante, la diferencia la marcó el juez comparativo.
Con HPSv3 como única señal, las pinturas se volvieron más confiables, pero no necesariamente más interesantes. El modelo aprendió a producir algo que pareciera una flor y pronto encontró un límite.
Cuando se incorporó el juez basado en las referencias, el sistema recibió una razón para seguir mejorando. La cobertura de pigmento se duplicó en las ejecuciones con juez, y las mejores pinturas se acercaron más al estilo seleccionado manualmente.
GRPO, LoRA y los ajustes que hicieron funcionar el entrenamiento
El modelo utilizado fue Qwen/Qwen3.5-35B-A3B, entrenado con GRPO y adaptadores LoRA. GRPO permite generar varios resultados para una misma instrucción, compararlos mediante recompensas y ajustar el modelo hacia las alternativas mejor valoradas.
La implementación requirió corregir cuatro configuraciones importantes en TRL:
| Configuración | Antes | Después | Motivo |
|---|---|---|---|
| Tasa de aprendizaje | 2e-5 | 5e-5 | Aumentar la capacidad de adaptación de LoRA |
| Planificador | linear | constant_with_warmup | Evitar que la tasa cayera demasiado pronto |
scale_rewards | group | none | Evitar que un rechazo de la puerta afectara todo el grupo |
| Módulos objetivo | Lista manual | all-linear | Adaptar más capas del modelo experto |
El cambio a all-linear fue especialmente relevante. El modelo utiliza una arquitectura de mezcla de expertos, por lo que la lista habitual de capas para un modelo denso dejaba demasiadas partes sin entrenar. Con el nuevo ajuste, LoRA alcanzó las capas lineales disponibles y logró aprender lo suficiente para mejorar las pinturas.
El entrenamiento completo se ejecuta en Hugging Face mediante Jobs. El entorno de refuerzo funciona como un Space, el evaluador HPSv3 como otro Space y el juez comparativo se consulta mediante Inference Providers.
Una vez duplicados los dos Spaces y configuradas las variables de recompensa, el proceso puede lanzarse con un único comando de hf jobs. El entorno renderiza cada boceto en Chromium sin GPU, mientras el entrenador ajusta el modelo a partir de las puntuaciones obtenidas.
La infraestructura también forma parte del experimento
Una ejecución de 60 pasos necesitó cerca de 18 horas en una H200. La de 110 pasos tardó aproximadamente 34 horas. Cada paso produce ocho resultados y suele tomar entre 15 y 18 minutos, de los cuales entre 70 % y 80 % corresponde al renderizado.
Cada imagen tarda entre 69 y 96 segundos en renderizarse. El entorno no utiliza GPU, y p5.brush realiza operaciones costosas sobre píxeles para simular texturas y desbordamientos.
También hubo problemas de infraestructura que afectaban directamente la recompensa. Algunos fallos de renderizado o respuestas ausentes del evaluador se registraban como una puntuación de cero, igual que una pintura realmente mala. Eso introducía ruido en el aprendizaje.
La solución fue devolver None en esos casos y excluir la ejecución defectuosa del grupo. En total, los fallos representaron cerca del 1,5 % de los resultados, aunque llegaron al 5,2 % en la peor ejecución.
Además, se detectó un error en OpenEnv: una conexión WebSocket cerrada por el servidor permanecía almacenada en caché y hacía fallar todas las llamadas posteriores. La corrección fue enviada al proyecto y permitió mantener las ejecuciones estables.
Lo que el modelo aprendió y lo que todavía falta
El sistema no siguió todas las instrucciones del prompt. Se le pidió generar entre 15 y 30 formas rellenas, pero el promedio real quedó entre 7 y 9. La cantidad de formas casi no tuvo relación con la recompensa.
Esto revela algo útil: durante el aprendizaje por refuerzo, las instrucciones que no están respaldadas por una recompensa tienden a perder importancia. El modelo sigue aquello que mejora su puntuación, no necesariamente aquello que el prompt describe con más claridad.
También apareció una fuerte convergencia visual. Como el conjunto de referencia estaba formado principalmente por hibiscos, las pinturas terminaron pareciéndose entre sí. El modelo aprendió qué era una buena pintura, pero dentro de un espacio muy estrecho.
Para obtener resultados más variados habría que construir una colección más diversa. Cambiar el conjunto de referencia cambiaría automáticamente el gusto que guía la recompensa, sin modificar el código del entorno.
Entre los siguientes experimentos posibles están:
- Entrenamiento en varios pasos, permitiendo que el modelo vea lo que acaba de pintar.
- Uso de modelos más pequeños, como una versión de 4.000 millones de parámetros.
- Ajuste supervisado previo con los bocetos de referencia.
- Recompensas explícitas para el uso de pigmento.
- Aumentar gradualmente la dificultad de las referencias.
- Ampliar la lista de métodos permitidos en
p5.brush. - Medir la consistencia del juez comparativo repitiendo la evaluación de una misma imagen.
La posibilidad de usar modelos más pequeños es especialmente interesante. En experimentos preliminares, uno de 4.000 millones de parámetros ya podía producir bocetos válidos. Si también logra aprender el estilo mediante GRPO, el costo del entrenamiento podría reducirse de forma considerable.
Una mirada distinta al arte generado por IA
Este proyecto recuerda a los primeros años del arte generativo con IA, cuando herramientas como DeepDream dejaron de ser simples experimentos técnicos y comenzaron a utilizarse para explorar nuevas formas visuales.
La diferencia está en que aquí el modelo no entrega únicamente una imagen final. Entrega un programa. Puedes leerlo, editarlo, ejecutarlo otra vez y observar las decisiones detrás de cada pincelada.
El resultado tampoco busca la perfección estadística que suele dominar a los generadores de imágenes actuales. Las pinturas son irregulares, suaves y, en ocasiones, imperfectas. Esa imperfección parece ser parte de su atractivo.
Pero la pregunta más importante no es si un modelo puede aprender a pintar. Es quién decide qué significa pintar bien. En este experimento, la respuesta está en 178 imágenes generadas por modelos y seleccionadas por una persona.
Ahí está la lección que trasciende las acuarelas: cuando entrenas IA con recompensas estéticas, la curaduría deja de ser un detalle y se convierte en la arquitectura invisible del sistema. El modelo puede generar, comparar y optimizar, pero alguien debe decidir qué merece ser considerado valioso.
