aitextgen
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
aitextgen [2020/06/14 08:10] – [Transformers] serge | aitextgen [2022/02/08 15:59] (Version actuelle) – Tag0 Removed: text_gen serge | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== Génération de textes avec aitextgen ====== | + | ====== Génération de textes avec aitextgen |
+ | |||
+ | <WRAP center round box 60% centeralign> | ||
+ | **{{tagpage> | ||
+ | </ | ||
+ | <WRAP center round box 60% centeralign> | ||
+ | **[[les_pages_intelligence_artificielle_en_details|Les Pages Intelligence Artificielle en détails]]** | ||
+ | </ | ||
<WRAP center round box 80% centeralign> | <WRAP center round box 80% centeralign> | ||
- | **{{tagpage> | + | **{{tagpage> |
</ | </ | ||
<WRAP center round box 80% centeralign> | <WRAP center round box 80% centeralign> | ||
- | **Cette page est la suite de [[textgenrnn|Générer du texte en python avec textgenrnn]]** | + | **Cette page est la suite de [[archives:textgenrnn|Générer du texte en python avec textgenrnn]]** |
</ | </ | ||
+ | |||
+ | <WRAP center round box 80% centeralign> | ||
+ | Les chercheurs retardent la publication de leurs recherches car ils estiment que GPT2 a un potentiel « trop dangereux », étant donné que cette IA pourrait à terme servir à des actes mal intentionnées comme générer des avis négatifs ou positifs sur des produits, des spams, des textes complotistes, | ||
+ | Bien sûr, tout a été publié, y compris le modèle big de 1.5 Go. | ||
+ | </ | ||
+ | |||
+ | =====Why do we like Word2vec? | ||
+ | {{ : | ||
+ | * **[[https:// | ||
+ | * **[[https:// | ||
===== Ressources ===== | ===== Ressources ===== | ||
+ | ====aitextgen==== | ||
* **[[https:// | * **[[https:// | ||
* **[[https:// | * **[[https:// | ||
- | |||
* **aitextgen** est un outil Python robuste pour la formation et la génération d' intelligence artificielle basée sur du texte à l'aide de l' architecture GPT-2 d' **[[https:// | * **aitextgen** est un outil Python robuste pour la formation et la génération d' intelligence artificielle basée sur du texte à l'aide de l' architecture GPT-2 d' **[[https:// | ||
- | * **[[https:// | ||
+ | ====OpenAI==== | ||
+ | * **[[https:// | ||
+ | |||
+ | ====Controverse sur GPT-2==== | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * | ||
- | ====CamemBERT==== | ||
- | CamemBERT: a Tasty French Language Model\\ | ||
- | * Author: Martin, Louis and Muller, Benjamin and Suarez, Pedro Javier Ortiz and Dupont, Yoann and Romary, Laurent and de la Clergerie, Eric Villemonte and Seddah, Djame and Sagot, Benoît. | ||
- | * Book: Proceedings of the 58th Annual Meeting of the Association for Computational Linguistics, | ||
- | * https:// | ||
- | * https:// | ||
==== Transformers ==== | ==== Transformers ==== | ||
- | * https:// | + | * **[[https:// |
- | Transformers: | + | ==== BERT ==== |
+ | * **[[https:// | ||
+ | |||
+ | ===CamemBERT=== | ||
+ | * https:// | ||
+ | * https:// | ||
* https:// | * https:// | ||
The CamemBERT model was proposed in CamemBERT: a Tasty French Language Model by Louis Martin, Benjamin Muller, Pedro Javier Ortiz Suárez, Yoann Dupont, Laurent Romary, Éric Villemonte de la Clergerie, Djamé Seddah, and Benoît Sagot. It is based on Facebook’s RoBERTa model released in 2019. It is a model trained on 138GB of French text. | The CamemBERT model was proposed in CamemBERT: a Tasty French Language Model by Louis Martin, Benjamin Muller, Pedro Javier Ortiz Suárez, Yoann Dupont, Laurent Romary, Éric Villemonte de la Clergerie, Djamé Seddah, and Benoît Sagot. It is based on Facebook’s RoBERTa model released in 2019. It is a model trained on 138GB of French text. | ||
+ | ===FlauBERT=== | ||
* https:// | * https:// | ||
The FlauBERT model was proposed in the paper FlauBERT: Unsupervised Language Model Pre-training for French by Hang Le et al. It’s a transformer pre-trained using a masked language modeling (MLM) objective (BERT-like). | The FlauBERT model was proposed in the paper FlauBERT: Unsupervised Language Model Pre-training for French by Hang Le et al. It’s a transformer pre-trained using a masked language modeling (MLM) objective (BERT-like). | ||
+ | |||
+ | =====Générateur de texte en ligne===== | ||
+ | * **[[https:// | ||
+ | ===== Fables de La Fontaine avec un modèle entièrement créé===== | ||
+ | Suite de [[archives: | ||
+ | |||
+ | <code python training.py> | ||
+ | from aitextgen import aitextgen | ||
+ | from aitextgen.TokenDataset import TokenDataset | ||
+ | from aitextgen.tokenizers import train_tokenizer | ||
+ | from aitextgen.utils import GPT2ConfigCPU, | ||
+ | from aitextgen import aitextgen | ||
+ | |||
+ | def get_config(): | ||
+ | return GPT2Config( | ||
+ | vocab_size=20000, | ||
+ | n_positions=1024, | ||
+ | n_ctx=1024, | ||
+ | n_embd=768, | ||
+ | n_layer=12, | ||
+ | n_head=12, | ||
+ | bos_token_id=0, | ||
+ | eos_token_id=0, | ||
+ | max_length=1024, | ||
+ | dropout=0.0 | ||
+ | ) | ||
+ | | ||
+ | def training(): | ||
+ | file_name | ||
+ | train_tokenizer(file_name, | ||
+ | vocab_file = " | ||
+ | merges_file = " | ||
+ | |||
+ | config = get_config() | ||
+ | ai = aitextgen(vocab_file=vocab_file, | ||
+ | |||
+ | data = TokenDataset(file_name, | ||
+ | vocab_file=vocab_file, | ||
+ | merges_file=merges_file, | ||
+ | block_size=64) | ||
+ | |||
+ | ai.train(data, | ||
+ | ai.generate(5, | ||
+ | |||
+ | training() | ||
+ | |||
+ | """ | ||
+ | essai 5 | ||
+ | 11,472 sets of tokens from ./ | ||
+ | Loss: 0.094 — Avg: 0.093 | ||
+ | """ | ||
+ | </ | ||
+ | |||
+ | <code python testing.py> | ||
+ | from aitextgen import aitextgen | ||
+ | from aitextgen.utils import GPT2Config | ||
+ | |||
+ | |||
+ | class AiTextGen: | ||
+ | |||
+ | def __init__(self): | ||
+ | """ | ||
+ | sinon le télécharge dans / | ||
+ | |||
+ | self.prompt = " | ||
+ | self.config = self.get_config() | ||
+ | print(" | ||
+ | print(" | ||
+ | |||
+ | print(" | ||
+ | ai = aitextgen() | ||
+ | print(" | ||
+ | |||
+ | self.vocab_file = " | ||
+ | self.merges_file = " | ||
+ | |||
+ | print(" | ||
+ | self.ai = aitextgen(model=" | ||
+ | vocab_file=self.vocab_file, | ||
+ | merges_file=self.merges_file, | ||
+ | config=self.config) | ||
+ | |||
+ | def get_config(self): | ||
+ | return GPT2Config( | ||
+ | vocab_size=20000, | ||
+ | n_positions=1024, | ||
+ | n_ctx=1024, | ||
+ | n_embd=768, | ||
+ | n_layer=12, | ||
+ | n_head=12, | ||
+ | bos_token_id=0, | ||
+ | eos_token_id=0, | ||
+ | max_length=1024, | ||
+ | dropout=0.0 | ||
+ | ) | ||
+ | |||
+ | def get_irc_response(self, | ||
+ | if isinstance(prompt, | ||
+ | resp = self.ai.generate(n=1, | ||
+ | prompt=prompt, | ||
+ | max_length=len_max, | ||
+ | temperature=temp, | ||
+ | return_as_list=True) | ||
+ | return resp | ||
+ | |||
+ | |||
+ | def interactif(self): | ||
+ | while 1: | ||
+ | try: | ||
+ | prompt = input(" | ||
+ | except: | ||
+ | prompt = "Ne jouer pas à ce petit jeu !" | ||
+ | if isinstance(prompt, | ||
+ | resp = self.ai.generate(n=1, | ||
+ | prompt=prompt, | ||
+ | max_length=100, | ||
+ | temperature=0.8, | ||
+ | return_as_list=True) | ||
+ | print(f" | ||
+ | else: | ||
+ | print(" | ||
+ | |||
+ | |||
+ | if __name__ == " | ||
+ | |||
+ | atg = AiTextGen() | ||
+ | atg.interactif() | ||
+ | </ | ||
+ | |||
+ | ====Configuration==== | ||
+ | * [[https:// | ||
+ | |||
+ | <code python> | ||
+ | config = GPT2Config(vocab_size=20000, | ||
+ | n_positions=1024, | ||
+ | n_ctx=1024, | ||
+ | n_embd=768, | ||
+ | n_layer=12, | ||
+ | n_head=12, | ||
+ | bos_token_id=0, | ||
+ | eos_token_id=0, | ||
+ | max_length=1024, | ||
+ | dropout=0.0 ) | ||
+ | |||
+ | print(config) | ||
+ | """ | ||
+ | GPT2Config {" | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | """ | ||
+ | |||
+ | ai = aitextgen(model=" | ||
+ | merges_file=merges_file, | ||
+ | |||
+ | ai.generate(n=1, | ||
+ | </ | ||
+ | |||
+ | ===== Mails de La Labomedia ===== | ||
+ | ====Configuration==== | ||
+ | <code python> | ||
+ | def get_config(): | ||
+ | return GPT2Config( | ||
+ | vocab_size=20000, | ||
+ | n_positions=1024, | ||
+ | n_ctx=1024, | ||
+ | n_embd=768, | ||
+ | n_layer=12, | ||
+ | n_head=12, | ||
+ | bos_token_id=0, | ||
+ | eos_token_id=0, | ||
+ | max_length=1024, | ||
+ | dropout=0.0 | ||
+ | ) | ||
+ | | ||
+ | data = TokenDataset(file_name, | ||
+ | vocab_file=vocab_file, | ||
+ | merges_file=merges_file, | ||
+ | block_size=64) | ||
+ | ai.train(data, | ||
+ | </ | ||
+ | |||
+ | Les datas sont trop pourries, le résultat est très médiocre ! | ||
+ | ===== Des textes dans le domaine public du Projet Gutemberg ===== | ||
+ | **[[http:// | ||
+ | |||
+ | Extrait de [[https:// | ||
+ | |||
+ | Le projet Gutenberg est une bibliothèque de versions électroniques libres de livres physiquement existants. Les textes fournis sont essentiellement du domaine public, soit parce qu'ils n'ont jamais été sujets à des droits d' | ||
+ | |||
+ | Ce site n' | ||
+ | |||
+ | Conversion de *.epub vers *.txt avec ebook-convert, | ||
+ | |||
+ | Les fichiers non nettoyés font 300 Mo, et nettoyés font 280 Mo. | ||
+ | |||
+ | ===Nettoyage des datas=== | ||
+ | Les sauts de lignes, les sommaires ... doivent être nettoyés: avec clean_txt.py | ||
+ | |||
+ | Le plus grand nettoyage est fait avec une détection de langue: | ||
+ | from langdetect import detect_langs | ||
+ | je garde la ligne si langue.lang == ' | ||
+ | Cela supprime les textes en anglais, en particulier les licences, les chiffres romains ... | ||
+ | |||
+ | Le nettoyage des datas est très important, ce n'est pas drôle, il faut vérifier le résultat obtenu en tapant au hasard dans le texte, ça prend un temps fou ... | ||
+ | |||
+ | La génération de texte est une représentation fidèle du texte d' | ||
+ | |||
+ | ====Training==== | ||
+ | ===OOM = Out Of Memory=== | ||
+ | Finetuning the 355M GPT-2 model or larger on a GPU will cause the GPU to go OOM, even 16 GB VRAM GPUs | ||
+ | |||
+ | * Le fichier d' | ||
+ | * vocab_size = 40 000 | ||
+ | * batch_size = 48, valeur maxi possible avec 6 Go de Ram GPU (1060 GTX) | ||
+ | * Ram CPU = 16 Go, Swap=64 Go, valeur totale de l' | ||
+ | |||
+ | Efficacité au bout de 144 heures: | ||
+ | {{ : | ||
+ | |||
+ | =====Fables de La Fontaine avec la config de bouquineux===== | ||
+ | ==== Avec la configuration de bouquineux et vocab=40000 ==== | ||
+ | {{ : | ||
+ | Remarque: Les Fables ont environ 13000 tokens, le vocab devrait se limiter à 14000 !\\ | ||
+ | Testing pas mal mais quand même bourré d' | ||
+ | |||
+ | ==== A partir du model tf_gpt2=" | ||
+ | * vocab_size=5000 | ||
+ | * Apprentissage très rapide | ||
+ | * texte générés comme les précédents | ||
+ | |||
+ | =====Fables de La Fontaine à partir du model tf_gpt2=" | ||
+ | <WRAP center round tip 60%> | ||
+ | C'est le meilleur générateur de texte, avec un apprentissage de 16 heures ! | ||
+ | </ | ||
+ | <WRAP center round tip 60%> | ||
+ | tf_gpt2=" | ||
+ | </ | ||
+ | ====Affinage du model existant tf_gpt2=" | ||
+ | * [[https:// | ||
+ | |||
+ | La ligne: | ||
+ | ai = aitextgen(tf_gpt2=" | ||
+ | va télécharger automatiquement le model.\\ | ||
+ | Le training va affiner ce model. C'est un model construit sur un texte anglais, et pourtant cela va générer du texte français. | ||
+ | |||
+ | |||
+ | ====Shot de l' | ||
+ | Pendant le trainning, les test de generate() retourne de l' | ||
+ | {{ : | ||
+ | |||
+ | ====Courbe de loss==== | ||
+ | J' | ||
+ | {{ : | ||
+ | |||
+ | ====Testing==== | ||
+ | {{ : | ||
+ | Le résultat comporte peu de mots mal construits, inexistants en français. Par contre, il n'y a aucun sens au texte, c'est mieux que du Nostradamus, | ||
+ | |||
+ | ====Développement à suivre==== | ||
+ | Construire sur le gros model de 1.5 Go ! | ||
+ | |||
+ | ====Les sources sur GitHub==== | ||
+ | * **[[https:// | ||
- | {{tag>ia python | + | {{tag> ia python sb tal }} |
aitextgen.1592122249.txt.gz · Dernière modification : 2020/06/14 08:10 de serge