Introduction
Je suis sûr que la plupart d'entre vous ont entendu parler de ChatGPT et l'ont essayé pour répondre à vos questions ! Vous êtes-vous déjà demandé ce qui se passe sous le capot ? Il est alimenté par un grand modèle de langage GPT-3 développé par Open AI. Ces grands modèles linguistiques, souvent appelés LLM, ont ouvert de nombreuses possibilités dans Traitement du langage naturel.
Que sont les grands modèles de langage ?
Les modèles LLM sont formés sur des quantités massives de données textuelles, ce qui leur permet de comprendre le langage humain avec sens et contexte. Auparavant, la plupart des modèles étaient formés à l'aide de l'approche supervisée, où nous alimentons les caractéristiques d'entrée et les étiquettes correspondantes. Contrairement à cela, les LLM sont formés par un apprentissage non supervisé, où ils reçoivent d'énormes quantités de données textuelles sans aucune étiquette ni instruction. Par conséquent, les LLM apprennent efficacement le sens et les relations entre les mots d'une langue. Ils peuvent être utilisés pour une grande variété de tâches telles que la génération de texte, la réponse aux questions, la traduction d'une langue à une autre, et bien plus encore.
Cerise sur le gâteau, ces grands modèles de langage peuvent être affinés sur votre ensemble de données personnalisé pour des tâches spécifiques à un domaine. Dans cet article, je parlerai du besoin d'ajustement, des différents LLM disponibles, et je montrerai également un exemple.
Comprendre le réglage fin du LLM
Supposons que vous dirigez une communauté de soutien au diabète et que vous souhaitez mettre en place une ligne d'assistance en ligne pour répondre aux questions. Un LLM pré-formé est formé de manière plus générale et ne serait pas en mesure de fournir les meilleures réponses aux questions spécifiques à un domaine et de comprendre les termes et acronymes médicaux. Cela peut être résolu par un réglage fin.
Qu'entend-on par peaufiner ? Pour dire en bref, Transferts
apprentissage! Les grands modèles de langage sont formés sur d'énormes ensembles de données utilisant de lourdes ressources et ont des millions de paramètres. Les représentations et les modèles linguistiques appris par LLM lors de la pré-formation sont transférés à votre tâche actuelle. En termes techniques, nous initialisons un modèle avec les pondérations pré-formées, puis nous l'entraînons sur nos données spécifiques à la tâche pour atteindre des pondérations plus optimisées pour les paramètres. Vous pouvez également apporter des modifications à l'architecture du modèle et modifier les couches selon vos besoins.
Pourquoi devriez-vous affiner les modèles ?
- Économisez du temps et des ressources : Un réglage fin peut vous aider à réduire le temps de formation et les ressources nécessaires par rapport à une formation à partir de zéro.
- Besoins réduits en données : Si vous souhaitez former un modèle à partir de zéro, vous aurez besoin d'énormes quantités de données étiquetées qui sont souvent indisponibles pour les particuliers et les petites entreprises. Un réglage fin peut vous aider à obtenir de bonnes performances même avec une petite quantité de données.
- Personnalisez selon vos besoins : Le LLM pré-formé peut ne pas comprendre la terminologie et les abréviations spécifiques à votre domaine. Par exemple, un LLM normal ne reconnaîtrait pas que "Type 1" et "Type 2" signifient les types de diabète, alors qu'un LLM affiné le peut.
- Activer l'apprentissage continu : Disons que nous affinons notre modèle sur les données d'information sur le diabète et que nous le déployons. Que se passe-t-il s'il existe un nouveau régime alimentaire ou un nouveau traitement disponible que vous souhaitez inclure ? Vous pouvez utiliser les pondérations de votre modèle précédemment affiné et l'ajuster pour inclure vos nouvelles données. Cela peut aider les organisations à maintenir leurs modèles à jour de manière efficace.
Choisir un modèle LLM open source
La prochaine étape serait de choisir un grand modèle de langage pour votre tâche. Quelles sont vos options ? Les grands modèles de langage à la pointe de la technologie actuellement disponibles incluent GPT-3, Bloom, BERT, T5 et XLNet. Parmi ceux-ci, GPT-3 (Generative Pretrained Transformers) a montré les meilleures performances, car il est formé sur 175 milliards de paramètres et peut gérer diverses tâches NLU. Cependant, le réglage fin du GPT-3 n'est accessible que via un abonnement payant et est relativement plus cher que les autres options.
D'autre part, BERT est un grand modèle de langage open source et peut être affiné gratuitement. BERT signifie transformateurs de décodeur d'encodeur bidirectionnel. BERT fait un excellent travail pour comprendre les représentations contextuelles des mots.
Comment choisissez-vous?
Si votre tâche est plus orientée vers la génération de texte, les modèles GPT-3 (payant) ou GPT-2 (open source) seraient un meilleur choix. Si votre tâche relève de la classification de texte, de la réponse aux questions ou de la reconnaissance d'entité, vous pouvez utiliser BERT. Pour mon cas de réponse aux questions sur le diabète, je procéderais avec le modèle BERT.
Préparation et prétraitement de votre jeu de données
Il s'agit de l'étape la plus cruciale du réglage fin, car le format des données varie en fonction du modèle et de la tâche. Pour ce cas, j'ai créé un exemple de document texte contenant des informations sur le diabète que j'ai obtenues auprès de l'Institut national de la santé site de NDN Collective. Vous pouvez utiliser vos propres données.
Pour affiner BERT la tâche de Question-Réponse, il est recommandé de convertir vos données au format SQuAD. SQuAD est Stanford Question Answering Dataset et ce format est largement adopté pour la formation de modèles NLP pour les tâches de réponse aux questions. Les données doivent être au format JSON, où chaque champ se compose de :
context
: La phrase ou le paragraphe avec le texte sur la base duquel le modèle recherchera la réponse à la questionquestion
: La requête à laquelle nous voulons que le BERT réponde. Vous devrez formuler ces questions en fonction de la manière dont l'utilisateur final interagira avec le modèle d'assurance qualité.answers
: Vous devez fournir la réponse souhaitée dans ce champ. Il y a deux sous-composantes sous cela,text
et lesanswer_start
L’text
aura la chaîne de réponse. Alors que,answer_start
indique l'index, à partir duquel la réponse commence dans le paragraphe de contexte.
Comme vous pouvez l'imaginer, la création de ces données pour votre document prendrait beaucoup de temps si vous deviez le faire manuellement. Ne vous inquiétez pas, je vais vous montrer comment le faire facilement avec l'outil d'annotation Haystack.
Comment créer des données au format SQuAD avec Haystack ?
À l'aide de l'outil d'annotation Haystack, vous pouvez créer rapidement un ensemble de données étiqueté pour les tâches de questions-réponses. Vous pouvez accéder à l'outil en créant un compte sur leur site. Créez un nouveau projet et téléchargez votre document. Vous pouvez le voir sous l'onglet "Documents", allez dans "Actions" et vous pouvez voir l'option pour créer vos questions. Vous pouvez écrire votre question et surligner la réponse dans le document, Haystack en trouverait automatiquement l'index de départ. J'ai montré comment je l'ai fait sur mon document dans l'image ci-dessous.
Fig. 1 : Création d'un ensemble de données étiquetées pour les questions-réponses avec Haystack
Lorsque vous avez terminé de créer suffisamment de paires question-réponse pour un réglage fin, vous devriez pouvoir en voir un résumé, comme indiqué ci-dessous. Sous l'onglet "Exporter les étiquettes", vous pouvez trouver plusieurs options pour le format dans lequel vous souhaitez exporter. Nous choisissons le format d'équipe pour notre cas. Si vous avez besoin de plus d'aide pour utiliser l'outil, vous pouvez vérifier leur Documentation. Nous avons maintenant notre fichier JSON contenant les paires QA pour un réglage fin.
Comment affiner ?
Python propose de nombreux packages open source que vous pouvez utiliser pour un réglage fin. J'ai utilisé le package Pytorch et Transformers pour mon cas. Commencez par importer les modules du package à l'aide de pip, le gestionnaire de packages. Le transformers
la bibliothèque offre un BERTTokenizer
, qui est spécifiquement destiné à la tokenisation des entrées du modèle BERT.
!pip install torch
!pip install transformers import json
import torch
from transformers import BertTokenizer, BertForQuestionAnswering
from torch.utils.data import DataLoader, Dataset
Définition d'un ensemble de données personnalisé pour le chargement et le prétraitement
L'étape suivante consiste à charger et à prétraiter les données. Vous pouvez utiliser le Dataset
classe de pytorch utils.data
module pour définir une classe personnalisée pour votre jeu de données. J'ai créé une classe de jeu de données personnalisée diabetes
comme vous pouvez le voir dans l'extrait de code ci-dessous. Le init
est responsable de l'initialisation des variables. Le file_path
est un argument qui entrera le chemin de votre fichier de formation JSON et sera utilisé pour initialiser data
. Nous initialisons le BertTokenizer
ici aussi.
Ensuite, nous définissons un load_data()
fonction. Cette fonction lira le fichier JSON dans un objet de données JSON et en extraira le contexte, la question, les réponses et leur index. Il ajoute les champs extraits dans une liste et la renvoie.
Le getitem
utilise le tokenizer BERT pour encoder la question et le contexte dans des tenseurs d'entrée qui sont input_ids
et les attention_mask
L’ encode_plus
marquera le texte et ajoutera des jetons spéciaux (tels que [CLS] et [SEP]). Notez que nous utilisons le squeeze()
méthode pour supprimer toutes les dimensions singleton avant de les entrer dans BERT. Enfin, il renvoie les tenseurs d'entrée traités.
class diabetes(Dataset): def __init__(self, file_path): self.data = self.load_data(file_path) self.tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') def load_data(self, file_path): with open(file_path, 'r') as f: data = json.load(f) paragraphs = data['data'][0]['paragraphs'] extracted_data = [] for paragraph in paragraphs: context = paragraph['context'] for qa in paragraph['qas']: question = qa['question'] answer = qa['answers'][0]['text'] start_pos = qa['answers'][0]['answer_start'] extracted_data.append({ 'context': context, 'question': question, 'answer': answer, 'start_pos': start_pos, }) return extracted_data def __len__(self): return len(self.data) def __getitem__(self, index): example = self.data[index] question = example['question'] context = example['context'] answer = example['answer'] inputs = self.tokenizer.encode_plus(question, context, add_special_tokens=True, padding='max_length', max_length=512, truncation=True, return_tensors='pt') input_ids = inputs['input_ids'].squeeze() attention_mask = inputs['attention_mask'].squeeze() start_pos = torch.tensor(example['start_pos']) return input_ids, attention_mask, start_pos, end_pos
Une fois que vous l'avez défini, vous pouvez continuer et créer une instance de cette classe en passant le file_path
argument à cela.
file_path = 'diabetes.json'
dataset = diabetes(file_path)
Entraîner le modèle
je vais utiliser le BertForQuestionAnswering
modèle car il est le mieux adapté aux tâches d'assurance qualité. Vous pouvez initialiser les poids pré-formés du bert-base-uncased
modèle en appelant le from_pretrained
fonction sur le modèle. Vous devez également choisir la fonction de perte d'évaluation et l'optimiseur que vous utiliserez pour la formation.
Consultez notre guide pratique et pratique pour apprendre Git, avec les meilleures pratiques, les normes acceptées par l'industrie et la feuille de triche incluse. Arrêtez de googler les commandes Git et en fait apprendre il!
J'utilise un optimiseur Adam et une fonction de perte d'entropie croisée. Vous pouvez utiliser la classe Pytorch DataLoader
pour charger les données dans différents lots et les mélanger également pour éviter tout biais.
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = BertForQuestionAnswering.from_pretrained('bert-base-uncased')
model.to(device) optimizer = torch.optim.AdamW(model.parameters(), lr=2e-5)
loss_fn = torch.nn.CrossEntropyLoss()
batch_size = 8
num_epochs = 50 data_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
Une fois que le chargeur de données est défini, vous pouvez continuer et écrire la boucle de formation finale. Lors de chaque itération, chaque lot obtenu à partir du data_loader
contient batch_size
nombre d'exemples, sur lesquels la propagation vers l'avant et vers l'arrière est effectuée. Le code tente de trouver le meilleur ensemble de pondérations pour les paramètres, auquel la perte serait minimale.
for epoch in range(num_epochs): model.train() total_loss = 0 for batch in data_loader: input_ids = batch[0].to(device) attention_mask = batch[1].to(device) start_positions = batch[2].to(device) optimizer.zero_grad() outputs = model(input_ids, attention_mask=attention_mask, start_positions=start_positions) loss = outputs.loss loss.backward() optimizer.step() total_loss += loss.item() avg_loss = total_loss / len(data_loader) print(f"Epoch {epoch+1}/{num_epochs} - Average Loss: {avg_loss:.4f}")
Ceci termine votre mise au point ! Vous pouvez tester le modèle en le réglant sur model.eval()
. Vous pouvez également affiner le taux d'apprentissage et le nombre de paramètres d'époques pour obtenir les meilleurs résultats sur vos données.
Meilleurs conseils et pratiques
Voici quelques points à noter lors du réglage fin de tout modèle de langage volumineux sur des données personnalisées :
- Votre ensemble de données doit représenter le domaine cible ou la tâche dans laquelle vous souhaitez que le modèle de langage excelle. Propres et des données bien structurées sont essentielles.
- Assurez-vous que vous disposez de suffisamment d'exemples d'apprentissage dans vos données pour que le modèle apprenne des modèles. Sinon, le modèle pourrait mémoriser les exemples et sur-ajuster, sans la capacité de généraliser à des exemples inédits.
- Choisissez un modèle pré-formé qui a été formé sur un corpus pertinent pour votre tâche à accomplir. Pour la réponse aux questions, nous choisissons un modèle pré-formé qui est formé sur l'ensemble de données Stanford Question Answering. De la même manière, différents modèles sont disponibles pour des tâches telles que l'analyse des sentiments, la génération de texte, la synthèse, la classification de texte, etc.
- Essayez Accumulation de dégradé si vous avez une mémoire GPU limitée. Dans cette méthode, plutôt que de mettre à jour les poids du modèle après chaque lot, les gradients sont accumulés sur plusieurs mini-lots avant d'effectuer une mise à jour.
- Si vous rencontrez le problème du surajustement lors du réglage fin, utilisez régularisation techniques. Certaines méthodes couramment utilisées incluent l'ajout de couches d'abandon à l'architecture du modèle, la mise en œuvre de la décroissance du poids et la normalisation des couches.
Conclusion
Les grands modèles de langage peuvent vous aider à automatiser de nombreuses tâches de manière rapide et efficace. Le réglage fin des LLM vous aide à tirer parti de la puissance de l'apprentissage par transfert et à l'adapter à votre domaine particulier. Un réglage fin peut être essentiel si votre ensemble de données concerne des domaines tels que le médical, une niche technique, des ensembles de données financières, etc.
Dans cet article, nous avons utilisé BERT car il est open source et fonctionne bien pour un usage personnel. Si vous travaillez sur un projet à grande échelle, vous pouvez opter pour des LLM plus puissants, comme GPT3, ou d'autres alternatives open source. N'oubliez pas que le réglage fin de grands modèles de langage peut être coûteux en calcul et en temps. Assurez-vous de disposer de ressources de calcul suffisantes, y compris des GPU ou des TPU en fonction de l'échelle.
- Contenu propulsé par le référencement et distribution de relations publiques. Soyez amplifié aujourd'hui.
- PlatoData.Network Ai générative verticale. Autonomisez-vous. Accéder ici.
- PlatoAiStream. Intelligence Web3. Connaissance Amplifiée. Accéder ici.
- PlatonESG. Automobile / VE, Carbone, Technologie propre, Énergie, Environnement, Solaire, La gestion des déchets. Accéder ici.
- Décalages de bloc. Modernisation de la propriété des compensations environnementales. Accéder ici.
- La source: https://stackabuse.com/guide-to-fine-tuning-open-source-llms-on-custom-data/
- :possède
- :est
- :ne pas
- :où
- $UP
- 1
- 12
- 20
- 8
- a
- Capable
- A Propos
- accès
- accédé
- Compte
- Accumulé
- atteindre
- actes
- actually
- Adam
- ajoutant
- Ajoute
- adopté
- Après
- devant
- AI
- aussi
- des alternatives
- am
- parmi
- montant
- quantités
- an
- selon une analyse de l’Université de Princeton
- et les
- Une autre
- répondre
- réponses
- tous
- une approche
- architecture
- SONT
- argument
- article
- AS
- At
- Tentatives
- automatiser
- automatiquement
- disponibles
- moyen
- éviter
- basé
- BE
- était
- before
- ci-dessous
- LES MEILLEURS
- Améliorée
- jusqu'à XNUMX fois
- biais
- Milliards
- Bloom
- frontière
- entreprises
- mais
- by
- appel
- CAN
- Compétences
- maisons
- Attraper
- Modifications
- ChatGPT
- vérifier
- le choix
- Selectionnez
- classe
- classification
- code
- communément
- Communautés
- finalise
- conclusion
- consiste
- contient
- contexte
- contextuel
- conversion
- Correspondant
- engendrent
- créée
- La création
- Cross
- crucial
- Courant
- Lecture
- Customiser
- personnaliser
- données
- ensembles de données
- défini
- déployé
- voulu
- développé
- dispositif
- Diabète
- DID
- Alimentation
- différent
- dimensions
- plusieurs
- do
- document
- INSTITUTIONNELS
- domaine
- domaines
- Don
- fait
- pendant
- chacun
- même
- efficace
- efficacement
- d'autre
- permettant
- fin
- assez
- assurer
- entité
- époque
- époques
- essential
- évaluation
- Pourtant, la
- JAMAIS
- exemple
- exemples
- Excel
- excellent
- cher
- Exporter
- extrait
- Visage
- Chutes
- Fonctionnalités:
- Fed
- champ
- Des champs
- Déposez votre dernière attestation
- finale
- finalement
- la traduction de documents financiers
- Trouvez
- Focus
- Pour
- le format
- Avant
- CADRE
- gratuitement ici
- De
- fonction
- généralement
- génération
- génératif
- Git
- Go
- Bien
- GPU
- GPU
- les gradients
- guide
- main
- manipuler
- hands-on
- arrive
- Vous avez
- Santé
- entendu
- lourd
- vous aider
- d'où
- ici
- Souligner
- capuche
- flotter
- Comment
- How To
- HTTPS
- majeur
- humain
- énorme
- i
- if
- image
- image
- la mise en œuvre
- l'importation
- in
- comprendre
- inclus
- Y compris
- indice
- individus
- d'information
- contribution
- entrées
- installer
- instance
- Des instructions
- interagir
- développement
- Introduction
- IT
- itération
- Emploi
- json
- XNUMX éléments à
- Etiquettes
- langue
- gros
- grande échelle
- couche
- poules pondeuses
- APPRENTISSAGE
- savant
- apprentissage
- laisser
- Levier
- LG
- Bibliothèque
- comme
- limité
- Liste
- ll
- LLM
- charge
- chargeur
- chargement
- perte
- Lot
- a prendre une
- manager
- manière
- manuellement
- de nombreuses
- massif
- Mai..
- signifier
- sens
- médical
- Mémoire
- méthode
- méthodes
- pourrait
- des millions
- minimal
- modèle
- numériques jumeaux (digital twin models)
- modifier
- Module
- Modules
- PLUS
- (en fait, presque toutes)
- beaucoup
- plusieurs
- my
- Nationales
- Besoin
- nécessaire
- Besoins
- Nouveauté
- next
- NIH
- nlp
- aucune
- Ordinaire
- maintenant
- nombre
- objet
- obtenir
- obtenu
- of
- Offres Speciales
- souvent
- on
- ONE
- en ligne
- uniquement
- ouvert
- open source
- Option
- Options
- or
- organisations
- Autre
- nos
- ande
- plus de
- propre
- paquet
- Forfaits
- payé
- paires
- paramètres
- particulier
- En passant
- chemin
- motifs
- /
- performant
- effectué
- effectuer
- personnel
- plan
- Platon
- Intelligence des données Platon
- PlatonDonnées
- des notes bonus
- possibilités
- power
- alimenté
- solide
- Méthode
- précédemment
- Problème
- Traité
- Projet
- fournir
- fournit
- pytorch
- Questions et réponses
- question
- fréquemment posées
- Rapide
- vite.
- Tarif
- plutôt
- nous joindre
- Lire
- reconnaissance
- reconnaître
- recommandé
- réduire
- visée
- Les relations
- relativement
- pertinent
- rappeler
- supprimez
- représentent
- Exigences
- Resources
- responsables
- Résultats
- Retours
- Bagues
- Courir
- s
- dire
- Escaliers intérieurs
- gratter
- Rechercher
- sur le lien
- AUTO
- phrase
- sentiment
- set
- mise
- Shadow
- feuille
- devrait
- montrer
- montré
- Shuffle
- signifier
- similaires
- petit
- les petites entreprises
- faibles
- quelques
- Identifier
- spécial
- groupe de neurones
- spécifiquement
- Stackabuse
- Normes
- peuplements
- Stanford
- Commencer
- Commencez
- state-of-the-art
- étapes
- Arrêter
- Chaîne
- abonnement
- tel
- suffisant
- RÉSUMÉ
- Support
- sûr
- Prenez
- discutons-en
- Target
- Tâche
- tâches
- Technique
- terminologie
- conditions
- tester
- Classification du texte
- que
- qui
- Le
- leur
- Les
- puis
- Là.
- Ces
- l'ont
- this
- Avec
- fiable
- long
- conseils
- à
- tokenize
- tokenisation
- Tokens
- outil
- top
- torche
- vers
- Train
- qualifié
- Formation
- transférer
- transféré
- transformateurs
- transition
- Traduction
- traitement
- essayé
- deux
- type
- types
- sous
- comprendre
- compréhension
- contrairement à
- mise à jour
- Mises à jour
- la mise à jour
- utilisé
- d'utiliser
- Utilisateur
- Usages
- en utilisant
- variété
- Voir
- souhaitez
- we
- poids
- WELL
- ont été
- Quoi
- Les
- qui
- tout en
- large
- largement
- sera
- comprenant
- sans
- Word
- des mots
- de travail
- vos contrats
- s'inquiéter
- pourra
- serait pas
- écrire
- Vous n'avez
- Votre
- zéphyrnet