Mejorar Stable Diffusion con CFG Scale

Classifier-Free Guidance (CFG) Scale

La escala “Classifier-Free Guidance”, o “CFG Scale”, es un un parámetro que damos a un modelo de generación de imágenes (típicamente entre 7.0 y 13.0) que se describe como un controlador de cuánta influencia tiene tu prompt sobre el output generado por el modelo.

Es fácil malinterpretar esta explicación, así que en este post vamos a mirar CFG Scale en más detalle para entender mejor su influencia y sus limitaciones.

¿Qué Significa “Guidance”?

Stable Diffusion genera arte restaurando gradualmente una imagen completamente ruidosa, convirtiéndola en una obra de arte (opera bajo la suposición de que hay una pintura escondida bajo todo ese ruido y está tratando de descubrirla). Lo hace gradualmente en una serie de pasos, haciendo pequeños ajustes a la imagen en cada uno de ellos.

Para decidir qué mejoras hacer en la imagen en cada paso, mira la imagen ruidosa e intenta descifrar qué está viendo.

Por ejemplo, la imagen de abajo se ve aún poco definida, pero tú y yo podemos ver claramente que se trata de algún tipo de alien o monstruo tocando una guitarra, y podríamos arreglarlo si tuviéramos habilidad artística.

Además de observar la imagen ruidosa e intentar inferir una imagen mejor, el modelo también está siendo guiado por tu descripción de la imagen a generar (el prompt).

Por ejemplo, entender visualmente la imagen de abajo y poder inferir lo que podría ser es realmente difícil sin saber que el prompt pedía un conjunto de escaleras que conducen al océano.

Esto es a lo que se refiere “guidance” en “Classifier-Free Guidance” – la generación de la imagen siendo guiada por la descripción del texto (el prompt).

Y la CFG Scale se refiere a la capacidad de aumentar o disminuir la cantidad de influencia que la descripción del texto tiene sobre la generación de la imagen.

A veces, esto puede mejorar la calidad del resultado generado. En el siguiente ejemplo de “Bob Ross montando un dragón”, no es hasta que utilizamos una escala de 13 que obtenemos algo razonable y que se acerca al prompt indicado.

¿Qué Significa “Classifier-Free”?

¿Y qué significa “Classifier-Free”? La inclusión de este término es desafortunada, porque es simplemente una referencia a una técnica más antigua para guiar la generación de imágenes que ya no es relevante. Es similar a si, en lugar de hablar de “Coches Eléctricos” los llamáramos “Coches Sin Gasolina”.

Con esta técnica ya obsoleta, en lugar de generar una imagen a partir de un prompt, solo podías especificar una categoría de objeto a generar, como “perro”, “gato”, “coche”, “avión” (es decir, las categorías en la base de datos ImageNet), y el modelo utilizaba un clasificador de imágenes estándar para evaluar el progreso y ayudar a guiar el proceso de difusión.

Qué Esperar de CFG Scale

Cuando tienes problemas con la generación de una imagen, es tentador intentar ser más y más específico en tu descripción (hacer un prompt más detallado), y sentir además que estás trabajando con un modelo caprichoso; o piensas “seguro que el modelo entiende lo que le estoy pidiendo, pero simplemente no me está haciendo caso”, así que lo natural es subir el valor CFG esperando que se empiece a ajustar más a lo que pides.

En realidad, si parece que no entiende la intención de tu prompt (incluso después de haber generado muchos ejemplos y utilizado diferentes formulaciones), probablemente el resultado que buscas simplemente está por encima de las capacidades actuales del modelo.

En el siguiente ejemplo, el tema del prompt es “Una pintura de un caballo con ocho patas, esperando en un ambiente apocalíptico”. El resultado es bastante bueno, pero aumentar la CFG Scale no parece que afecte en nada a la ahora de incrementar el número de patas.

Otra Fuente de Variedad

En la práctica, es mejor simplemente ver la CFG Scale como otra forma de conseguir variedad en las imágenes resultantes generadas por el modelo.

Una vez que has encontrado un prompt y una imagen seed que te gustan, un buena práctica es usar la técnica de generar una cuadrícula de imágenes para explorar diferentes combinaciones de valores CFG y número de pasos, como en el siguiente ejemplo generado con Automatic1111.

Cómo Funciona CFG Scale

El resto de este artículo es un poco más técnico pero interesante para entender la implementación del método de Classifier-Free Guidance, así como algunas perspectivas sobre por qué la técnica no es tan efectiva en la práctica.

Cuando das a Stable Diffusion un prompt a generar, en realidad genera dos imágenes en paralelo, una guiada por tu prompt y otra no (técnicamente, la segunda imagen es guiada por un prompt vacío).

La diferencia entre las dos se considera como la influencia del prompt, y modificamos esa influencia hacia arriba o hacia abajo multiplicándola por la CFG Scale.

Dos Artistas

Para entender la intención de esto, imagina que coges a un artista llamado “Tim” y lo clonas. Llamaremos a su clon “Ted”. La idea es que Tim y Ted tengan mentes idénticas.

Pedimos a ambos, Tim y Ted, que restauren esta imagen, pero sólo Ted conoce la descripción.

Tim va a hacer ajustes basados puramente en lo que puede ver en la imagen. “Creo que esto parece un astronauta, así que voy a dibujar en esa dirección”.

Pero Ted va a usar una combinación de lo que ve y la descripción que le han dado. “Puedo ver que hay una persona de pie allí, y parece un astronauta, pero el prompt dice que es un guitarrista, así que voy a dibujar en esa dirección”.

La gracia es que Tim y Ted interpretan visualmente la imagen de la misma manera.

Aquí es donde ocurre el escalado. En cada iteración de trabajo, podemos mirar la diferencia entre los cambios sugeridos por Tim y Ted, y inclinarnos más hacia uno u otro.

En la práctica, siempre nos inclinamos más hacia la sugerencia de Ted, y la CFG Scale simplemente controla cuánto más nos inclinamos hacia él.

Amplificando la Mala Influencia

Si Ted (que tiene la descripción) realmente no entiende el prompt tal y como lo has escrito, o no está familiarizado con tu temática, o quizás simplemente no tiene la habilidad para crearlo (parece que Stable Diffusion tiene problemas con imágenes más complicadas), entonces amplificar la influencia de Ted en el resultado no va a resolver el problema.

Establecer la “scale” en, por ejemplo, 1,000 simplemente rompería las cosas y te daría basura. Las herramientas te limitan a valores más razonables. Auto1111 llega hasta 30:

El Propósito Original del CFG

De hecho, el verdadero propósito del parámetro CFG es que, en el conjunto de técnicas matemáticas que se utilizó para entrenar Stable Diffusion, aparentemente esta técnica de “guidance scaling” fue crítica para obtener buenos resultados durante el entrenamiento.

Stable Diffusion fue entrenado con este factor de escala establecido a cierto valor (he intentado descubrir qué valor exacto se usó, pero aún no ha habido suerte), y esto mejoró significativamente cómo el modelo se desempeñó en la fase de entrenamiento.

Por lo tanto, la capacidad de ajustar este parámetro en el momento de “inference” (es decir, cuando estamos usando Sable Diffusion para generar arte) es en realidad solo un beneficio secundario.

Keep reading