Les mauvaises images générées par l'IA peuvent-elles réellement « affiner le modèle » à l'envers ?

Original : Max Woolf

**Source :**Parc fondateur

Le processus d'apprentissage par renforcement qu'OpenAI utilise pour améliorer le modèle réduit implicitement les comportements négatifs issus des interactions humaines positives.

Dans cet article, les auteurs adoptent une nouvelle approche pratique : utiliser les interactions humaines négatives (c'est-à-dire choisir délibérément des images de mauvaise qualité) pour augmenter implicitement les comportements positifs.

Avec Dreambooth LoRA, il n'est fondamentalement pas nécessaire de préparer autant de données d'entrée que de former un grand modèle de langage pour atteindre cet objectif.

"Burger en forme d'Alien ()" avec différents niveaux d'optimisation

L'auteur présente deux fonctionnalités principales publiées par Stable Diffusion XL 1.0 : la pondération des mots rapides et la formation et le raisonnement Dreambooth LoRA, et combine la méthode d'inversion textuelle (inversion de texte) pour entraîner Lora, rendant Lora plus intelligente et plus facile à utiliser.

À propos de l'auteur : Max Woolf (@minimaxir) est un data scientist chez BuzzFeed, travaillant sur des outils IA/ML et divers projets open source.

Lien d'origine :

Voici le contenu de l'article, édité par Founder Park.

SDXL brève introduction

Le mois dernier, Stability AI a publié Stable Diffusion XL 1.0 (SDXL) et l'a rendu open source, permettant aux utilisateurs d'y accéder sans aucune autorisation spéciale.

Exemple de sortie SDXL 1.0

SDXL est en fait constitué de deux modèles : un modèle de base et un modèle de raffinement en option qui peuvent améliorer considérablement la représentation des détails sans la surcharge de vitesse.

Comparaison de la qualité relative entre les modèles des différentes versions de Stable Diffusion

Remarquez l'amélioration significative de la qualité après avoir utilisé le modèle aminci

Fonctionnalités SDXL 1.0

Il est à noter que cette version (SDXL 1.0) est l'un des premiers modèles open source capable de générer nativement des images de résolution 1024x1024 sans mesures particulières, et que les images générées sont plus détaillées.

La bibliothèque Python des diffuseurs de Hugging Face prend désormais entièrement en charge le modèle, avec quelques optimisations de performances.

Dans le même temps, les diffuseurs ont également mis en œuvre la prise en charge de deux nouvelles fonctionnalités : la pondération des mots rapides et la formation et l'inférence Dreambooth LoRA. Je compte donc l'essayer (le code de démonstration SDXL dans les diffuseurs est consultable à la fin de l'article).

La prise en charge de la pondération des mots rapides pour les diffuseurs exploite une bibliothèque Python appelée contraindre à pondérer les termes d'une manière plus mathématique. Vous pouvez ajouter n'importe quel nombre de + ou - à un mot donné pour augmenter ou diminuer son "importance" dans l'intégration du texte positionnel généré et ainsi affecter le résultat final.

Par le même principe, vous pouvez également envelopper des phrases : par exemple, si vous deviez générer "Paysage de San Francisco par Salvador Dali, huile sur toile" et que cela générait une photo réaliste de San Francisco, alors vous pourriez encadrer la forme d'art et devenir Entrez "Paysage de San Francisco de Salvador Dali, (huile sur toile) +++", laissez Stable Diffusion produire l'effet attendu.

Préparation de l'environnement

J'ai lancé une VM cloud, je l'ai provisionnée avec un nouveau GPU Nvidia L4 de milieu de gamme (0,24 $/heure pour une instance Spot sur Google Cloud Platform) et je me suis mis au travail.

Avec un GPU L4, il faut environ 22 secondes pour générer chaque image 1024x1024 ; et contrairement au mode de diffusion stable précédent, le GPU de milieu de gamme ne peut désormais générer qu'une seule image à la fois car son utilisation GPU est déjà pleine, vous n'avez donc qu'à être plus patient. Baisser la résolution peut accélérer la construction, mais je le déconseille fortement, car le résultat sera terrible.

Une petite configuration personnalisée

Dans mes tests, il corrige la plupart des problèmes de mots d'invite introduits après Stable Diffusion 2.0, en particulier avec des valeurs de guidage sans classificateur plus élevées (guiding_scale est par défaut à 7,5 ; j'aime le changer à 13 )

L'échelle directrice_scale est de 13 pour tous les exemples générés par le modèle LoRA dans cet article.

Mise en route丨Explorez LoRA

La mise à jour la plus importante de SDXL 1.0 est en fait le support de Dreambooth LoRA, qui nous permet de personnaliser le modèle Stable Diffusion.

Dreambooth est une technique permettant d'affiner la diffusion stable basée sur un très petit ensemble d'images sources et un mot-clé déclencheur, afin que les « concepts » de ces images puissent être utilisés dans d'autres contextes étant donné le mot-clé.

Diagramme schématique du principe de fonctionnement de Dreambooth

Avantage LoRA : des "petits modèles" spécifiques au domaine

Lors de la formation de Stable Diffusion elle-même, même un petit modèle nécessite de nombreuses heures de formation sur de nombreux GPU coûteux.

C'est là que LoRA s'avère utile : il entraîne un petit sous-ensemble du modèle de vision de sorte qu'il suffit d'un GPU bon marché pour produire des résultats en 10 minutes, et la qualité du modèle final + LoRA est comparable à un modèle entièrement réglé. (De manière générale, lorsque les gens parlent d'affiner la diffusion stable, ils font souvent référence à la création d'une LoRA).

Un LoRA formé est un petit binaire autonome qui peut être facilement partagé avec d'autres ou téléchargé sur un référentiel tel que Civitai.

Un petit inconvénient de LoRA est qu’un seul peut être actif à la fois : on peut combiner plusieurs LoRA pour combiner leurs avantages, mais ce n’est pas si simple en pratique.

Inversion textuelle Combat réel : Inversion textuelle

Avant que Stable Diffusion LoRA ne devienne largement populaire, il existait une méthode appelée inversion textuelle, qui permettait aux encodeurs de texte d'apprendre des concepts, mais la formation prenait de nombreuses heures et les résultats pouvaient être laids.

J'ai entraîné une inversion de texte dans un article de blog précédent : Ugly Sonic (Sonic), et comme elle ne figurait pas dans l'ensemble de données source de Stable Diffusion, les résultats étaient uniques. Les résultats générés sont les suivants, avec des résultats mitigés.

(Moche) Sonic, mais moche à souhait

Cette fois, je pense qu’utiliser Ugly Sonic pour entraîner LoRA serait un bon cas pour tester le potentiel de SDXL.

Il se trouve que Hugging Face fournit un script train_dreambooth_lora_sdxl.py, qui peut utiliser le modèle de base SDXL pour entraîner LoRA ; ce script est encore prêt à l'emploi, mais j'ai un peu ajusté les paramètres.

Il n'est pas exagéré de dire que les images Ugly Sonic générées par LoRA entraîné sous divers mots d'invite sont plus belles et plus organisées.

Sonic, mais cette fois avec des dents

Avancé 丨 Inversion textuelle approfondie

Après le succès de cette expérience, j'ai décidé de refaire une autre expérience que j'avais faite plus tôt avec l'inversion de texte : en ajoutant le mauvais mot de repère pour générer de meilleures images.

La méthode cette fois consiste à entraîner LoRA avec des images de mauvaise qualité gravement déformées, et le mot d'invite donné est faux. J'espère que LoRA pourra traiter le mal comme une "invite négative" et éviter cette situation, générant des images avec moins de distorsion.

J'ai écrit un bloc-notes Jupyter et utilisé SDXL pour créer moi-même de nombreuses "mauvaises" images composites, cette fois également en utilisant divers poids d'indice pour générer des cas plus évidents d'images ratées telles que des mains floues (floues) et de mauvaises mains (mauvais dessin) .

Ironiquement, nous devons utiliser SDXL pour générer des images défaillantes haute résolution.

Ci-dessus, quelques exemples d'images synthétiques erronées

Il incorpore involontairement des éléments de pochettes d'albums punk rock des années 2000.

J'ai formé ce LoRA et l'ai chargé dans le modèle de base Stable Diffusion XL (LoRA n'est pas requis pour affiner le modèle), et j'ai écrit un Jupyter Notebook pour comparer le résultat suivant pour les mots d'invite donnés :

Modèle de base + pipeline sans LoRA. (les bases)

Pas de pipeline LoRA, utiliser incorrect comme indice négatif (ajouter un indice négatif)

Utilisez le pipeline de LoRA, utilisez incorrect comme indice négatif (objectif idéal)

Les graines de chaque résultat généré sont les mêmes, donc la composition des trois photos de sortie doit être similaire, et la différence entre l'effet des mauvais indices négatifs et LoRA, et le pipeline du modèle de base doit être très évidente.

Cas de test SDXL 0.9

Utilisons SDXL 0.9 pour démontrer une invite simple pour commencer les tests :

« Un loup dans le parc national de Yosemite, photographie documentaire sur la nature froide »

En regardant attentivement l'image ci-dessus, il n'est pas difficile de constater qu'une mauvaise indication sur le modèle de base ajoute des feuilles et de la profondeur à la forêt d'arrière-plan, mais LoRA ajoute plus de choses : un éclairage et des ombres plus puissants, des feuilles plus détaillées et des modifications. l'apparence des loups. L'angle de la caméra semble plus intéressant.

Ensuite, j'ai ajouté « gros plan extrême (très gros plan) » au mot d'invite, et après avoir réutilisé les graines précédentes, j'ai obtenu des gros plans de loups en perspective différente sous une composition photo similaire.

「Un gros plan extrême d'un loup dans le parc national de Yosemite, photographie documentaire sur la nature froide」

À l'heure actuelle, la texture et la clarté de LoRA sont bien meilleures que celles des autres modèles et l'image est plus vive. Notez cependant que l’ajout d’un seul mauvais mot de repère changera la perspective.

Un autre bon cas de test est la photographie culinaire, et les photos de nourriture étranges que j'ai réalisées avec le DALL-E 2 sont particulièrement bonnes. SDXL + une mauvaise LoRA peuvent-ils générer des hamburgers non euclidiens étranges avec une certaine pondération des indices ?

「un grand et délicieux hamburger (en forme de géométrie extraterrestre à cinq dimensions)++++, photographie culinaire professionnelle」

"Un délicieux gros burger (géométrie extraterrestre 5D)++++, photographie culinaire professionnelle"

La réponse est que ce n’est pas possible, même si le mot d’invite est ajusté plusieurs fois. Pourtant, le résultat est intéressant : le SDXL de base semble prendre la partie "extraterrestre" de l'invite plus littéralement que je ne le pensais (et lui a donné un joli chapeau melon !), mais LoRA fonctionne mieux. Il a clairement compris le sens des indices, et a créé un hamburger « extraterrestre » difficile à manger pour les humains, et le style de l'image est plus brillant.

Que va-t-il arriver au peintre ? LoRA peut-elle, à tort, résoudre le problème notoire de l’intelligence artificielle qui ne tire pas les mains ? Et nous avons également inclus de nombreux exemples de ce type dans les données de formation de LoRA. Modifions l'invite que j'ai utilisée lorsque j'ai essayé pour la première fois Stable Diffusion 2.0 pour dessiner un président Taylor Swift :

「Le président des États-Unis Taylor Swift (signature des papiers)++++, photo prise par Associated Press」

"Le président américain Taylor Swift (document de signature)++++, photo par AP"

Jetez un œil au bras droit de Taylor : le modèle SDXL par défaut produit des résultats fous, et en cas d'erreur, c'est en fait pire, mais dans LoRA, c'est corrigé ! La superposition de couleurs de LoRA est bien meilleure, sa veste devenant d'un blanc plus proéminent au lieu du jaune et blanc. Mais ses mains ne sont toujours pas visibles de près : dessiner des personnages avec SDXL 1.0 est toujours fastidieux et peu fiable !

Maintenant, la conclusion est évidente, la sortie de mauvais + LoRA dans chaque cas est plus intéressante que la sortie de simplement ajouter de mauvais signaux négatifs, nous comparons donc uniquement la sortie de base et la sortie LoRA ci-dessous. Voici un exemple du modèle de base comparé à une mauvaise LoRA :

「Shrek humain réaliste bloguant sur un poste de travail informatique, photo hyperréaliste primée pour Vanity Fair」

*(Blog humain réaliste de Shrek sur un poste de travail informatique, photos surréalistes primées de Vanity Fair) - La main de LoRA dessinée et mieux éclairée. Les costumes sont plus détaillés et les décors plus intéressants. *

「pizza au pepperoni en forme de cœur, photographie culinaire professionnelle hyperréaliste primée」

(pizza au pepperoni en forme de cœur, photographie culinaire professionnelle ultra-réaliste et primée) - pepperoni plus détaillé, bulles chaudes, moins d'excès de pepperoni sur les bords de la pizza, la croûte semble plus dure

LoRA avec tort est disponible ici, mais je ne peux pas garantir ses performances sur des interfaces autres que les diffuseurs.

Tous les notebooks utilisés pour générer ces images se trouvent dans ce référentiel GitHub, y compris un SDXL 1.0 standard + modèle de réglage fin + LoRA Colab Notebooks avec des erreurs, vous pouvez exécuter ces notebooks sur un GPU T4 gratuit. Si vous souhaitez voir une version plus haute résolution des images générées utilisées dans cet article, vous pouvez visiter le code source de l'article.

Faux Qu'est-ce qui se passe ?

LoRA avec erreur Cette astuce ne fait qu'améliorer la qualité et la clarté de l'image générée, mais LoRA semble rendre SDXL plus intelligent et refléter davantage l'esprit des mots d'invite.

Sur le plan technique, cet indicateur négatif définit la région de l'espace latent dans laquelle la diffusion génère des images ; cette région est la même pour le mauvais modèle de base et pour LoRA.

Mon intuition est que LoRA remodèle cette région indésirable dans l'immense espace latent de haute dimension pour qu'elle soit plus similaire à la région de départ, de sorte que la probabilité que des résultats de génération normale atteignent cette région devient plus petite et la qualité est inférieure. Elle a été améliorée. (Reportez-vous au processus de changement d'Alien Burger ci-dessus)

Entraîner SDXL avec des images de mauvaise qualité pour l'améliorer est techniquement une forme d'apprentissage par renforcement avec feedback humain (RLHF) : cette approche est aussi la voie du succès de ChatGPT. Le processus d'apprentissage par renforcement utilisé par OpenAI pour améliorer le modèle consiste à réduire implicitement les comportements négatifs des interactions positives de l'utilisateur, alors qu'ici j'utilise l'interaction négative de l'utilisateur (c'est-à-dire en choisissant délibérément des images de mauvaise qualité) pour augmenter implicitement le comportement positif.

Mais avec Dreambooth LoRA, vous n'avez fondamentalement pas besoin de préparer autant de données d'entrée que de former un grand modèle de langage.

Le potentiel de « LoRA négative » est toujours grand : mes paramètres de génération d'ensembles de données synthétiques ont beaucoup à améliorer, et LoRA peut également être entraîné sur une période de temps plus longue. Mais je suis très content des résultats jusqu'à présent et j'aimerais faire plus de tests avec des LoRA négatives, comme par exemple fusionner avec d'autres LoRA pour voir si cela peut améliorer ces dernières (surtout une mauvaise LoRA + Ugly Sonic LoRA !)

Pièce jointe : démo SDXL dans les diffuseurs

importer une torche

depuis les diffuseurs import DiffusionPipeline, AutoencoderKL

charger la base SDXL et le raffineur

vae = AutoencoderKL.from_pretrained("madebyollin/sdxl-vae-fp16-fix",

torche_dtype=torch.float16)

base = DiffusionPipeline.from_pretrained(

"stabilitéai/stable-diffusion-xl-base-1.0",

pieds = pieds,

torche_dtype=torch.float16,

iant="fp16",

use_safetensors=Vrai,

)

_ = base.to("cuda")

affiner = DiffusionPipeline.from_pretrained(

"stabilitéai/stable-diffusion-xl-refiner-1.0",

text_encoder_2=base.text_encoder_2,

jambe=base.leg,

torche_dtype=torch.float16,

iant="fp16",

use_safetensors=Vrai,

)

_ = affiner.to("cuda")

génération utilisant les deux modèles (mélange d’experts)

élevé_noise_frac = 0,8

= "un astronaute montant un cheval"

négatif_ = "flou, mauvaises mains"

image = base(

=,

négatif_=négatif_,

débruitage_end=haut_noise_frac,

sortie_type="latent",

).images

image = raffineur (

=,

négatif_=négatif_,

débruitage_start=high_noise_frac,

image=image,

).images [0] ​

Voir l'original
Cette page peut inclure du contenu de tiers fourni à des fins d'information uniquement. Gate ne garantit ni l'exactitude ni la validité de ces contenus, n’endosse pas les opinions exprimées, et ne fournit aucun conseil financier ou professionnel à travers ces informations. Voir la section Avertissement pour plus de détails.
  • Récompense
  • Commentaire
  • Partager
Commentaire
0/400
Aucun commentaire
  • Épingler
Trader les cryptos partout et à tout moment
qrCode
Scan pour télécharger Gate app
Communauté
Français (Afrique)
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)