Introductie
Ik weet zeker dat de meesten van jullie wel eens van ChatGPT hebben gehoord en het hebben uitgeprobeerd om je vragen te beantwoorden! Heb je je ooit afgevraagd wat er onder de motorkap gebeurt? Het wordt aangedreven door een groot taalmodel GPT-3, ontwikkeld door Open AI. Deze grote taalmodellen, vaak LLM's genoemd, hebben veel mogelijkheden ontgrendeld Natural Language Processing.
Wat zijn grote taalmodellen?
De LLM-modellen zijn getraind op enorme hoeveelheden tekstgegevens, waardoor ze menselijke taal met betekenis en context kunnen begrijpen. Voorheen werden de meeste modellen getraind met behulp van de gesuperviseerde aanpak, waarbij we invoerfuncties en bijbehorende labels invoeren. In tegenstelling hiermee worden LLM's getraind door middel van leren zonder toezicht, waarbij ze enorme hoeveelheden tekstgegevens krijgen zonder enige labels en instructies. Daarom leren LLM's efficiรซnt de betekenis en relaties tussen woorden van een taal. Ze kunnen worden gebruikt voor een breed scala aan taken, zoals het genereren van tekst, het beantwoorden van vragen, het vertalen van de ene taal naar de andere en nog veel meer.
Als kers op de taart kunnen deze grote taalmodellen worden afgestemd op uw aangepaste dataset voor domeinspecifieke taken. In dit artikel zal ik het hebben over de noodzaak van afstemming, de verschillende beschikbare LLM's, en ook een voorbeeld laten zien.
LLM-fijnafstemming begrijpen
Stel dat u een community voor diabetesondersteuning leidt en een online hulplijn wilt opzetten om vragen te beantwoorden. Een vooraf opgeleide LLM is meer algemeen opgeleid en zou niet in staat zijn om de beste antwoorden te geven op domeinspecifieke vragen en om de medische termen en acroniemen te begrijpen. Dit kan worden opgelost door te finetunen.
Wat bedoelen we met finetunen? Om kort te zeggen, Overdracht
leren! De grote taalmodellen zijn getraind op enorme datasets met behulp van zware bronnen en hebben miljoenen parameters. De representaties en taalpatronen die LLM tijdens de pre-training heeft geleerd, worden overgebracht naar uw huidige taak. In technische termen initialiseren we een model met de vooraf getrainde gewichten en trainen het vervolgens op onze taakspecifieke gegevens om meer taakgeoptimaliseerde gewichten voor parameters te bereiken. U kunt ook wijzigingen aanbrengen in de architectuur van het model en de lagen naar wens aanpassen.
Waarom zou u modellen moeten verfijnen?
- Bespaar tijd en middelen: Fijnafstelling kan u helpen de trainingstijd en benodigde middelen te verminderen dan helemaal opnieuw te trainen.
- Verminderde gegevensvereisten: Als u een model helemaal opnieuw wilt trainen, hebt u enorme hoeveelheden gelabelde gegevens nodig die vaak niet beschikbaar zijn voor particulieren en kleine bedrijven. Fijnafstemming kan u helpen goede prestaties te bereiken, zelfs met een kleinere hoeveelheid gegevens.
- Aanpassen aan uw behoeften: De vooraf getrainde LLM is mogelijk niet op de hoogte van uw domeinspecifieke terminologie en afkortingen. Een normale LLM zou bijvoorbeeld niet herkennen dat "Type 1" en "Type 2" de soorten diabetes betekenen, terwijl een verfijnde dit wel kan.
- Maak continu leren mogelijk: Laten we zeggen dat we ons model hebben verfijnd op diabetesinformatiegegevens en het hebben geรฏmplementeerd. Wat als er een nieuw dieetplan of een nieuwe behandeling beschikbaar is die u wilt opnemen? U kunt de gewichten van uw eerder verfijnde model gebruiken en dit aanpassen om uw nieuwe gegevens op te nemen. Dit kan organisaties helpen hun modellen op een efficiรซnte manier up-to-date te houden.
Een open-source LLM-model kiezen
De volgende stap zou zijn om een โโgroot taalmodel voor uw taak te kiezen. Wat zijn uw opties? De state-of-the-art grote taalmodellen die momenteel beschikbaar zijn, omvatten GPT-3, Bloom, BERT, T5 en XLNet. Hiervan heeft GPT-3 (Generative Pretrained Transformers) de beste prestaties laten zien, omdat het is getraind op 175 miljard parameters en diverse NLU-taken aankan. Maar GPT-3-fijnafstemming is alleen toegankelijk via een betaald abonnement en is relatief duurder dan andere opties.
Aan de andere kant is BERT een open-source model voor grote talen en kan het gratis worden verfijnd. BERT staat voor Bi-directional Encoder Decoder Transformers. BERT begrijpt uitstekend contextuele woordrepresentaties.
Hoe ga je kiezen?
Als uw taak meer gericht is op het genereren van tekst, zijn GPT-3 (betaald) of GPT-2 (open source) modellen een betere keuze. Als uw taak valt onder tekstclassificatie, vraagbeantwoording of Entiteitsherkenning, kunt u kiezen voor BERT. Voor mijn geval van het beantwoorden van vragen over diabetes, zou ik doorgaan met het BERT-model.
Uw dataset voorbereiden en voorbewerken
Dit is de meest cruciale stap bij het afstemmen, aangezien het formaat van gegevens varieert op basis van het model en de taak. Voor dit geval heb ik een voorbeeldtekstdocument gemaakt met informatie over diabetes dat ik heb verkregen van het National Institute of Health van de. U kunt uw eigen gegevens gebruiken.
Om BERT de taak van vraag-beantwoording te verfijnen, wordt aanbevolen om uw gegevens om te zetten in SQuAD-indeling. SQuAD is Stanford Question Answering Dataset en dit formaat wordt algemeen gebruikt voor het trainen van NLP-modellen voor het beantwoorden van vragen. De gegevens moeten in JSON-indeling zijn, waarbij elk veld bestaat uit:
context
: De zin of paragraaf met tekst op basis waarvan het model het antwoord op de vraag gaat zoekenquestion
: De vraag die we willen dat de BERT beantwoordt. U zou deze vragen moeten formuleren op basis van hoe de eindgebruiker zou omgaan met het QA-model.answers
: U dient het gewenste antwoord in dit veld in te vullen. Er zijn twee subcomponenten hieronder,text
enanswer_start
. Detext
zal de antwoordstring hebben. Terwijl,answer_start
geeft de index aan, vanaf waar het antwoord begint in de contextparagraaf.
Zoals u zich kunt voorstellen, zou het veel tijd kosten om deze gegevens voor uw document te maken als u dit handmatig zou doen. Maak je geen zorgen, ik laat je zien hoe je dit eenvoudig kunt doen met de Haystack-annotatietool.
Hoe maak je gegevens in SQuAD-indeling met Haystack?
Met behulp van de Haystack-annotatietool kunt u snel een gelabelde dataset maken voor het beantwoorden van vragen. U krijgt toegang tot de tool door een account aan te maken op hun website. Maak een nieuw project aan en upload uw document. U kunt het bekijken onder het tabblad "Documenten", ga naar "Acties" en u ziet de optie om uw vragen te maken. U kunt uw vraag schrijven en het antwoord in het document markeren, Haystack vindt automatisch de startindex ervan. Ik heb laten zien hoe ik het deed op mijn document in de onderstaande afbeelding.
Fig. 1: Gelabelde dataset maken voor vraag-antwoorden met Haystack
Wanneer u klaar bent met het maken van voldoende vraag-antwoordparen voor fijnafstemming, zou u een samenvatting ervan moeten kunnen zien, zoals hieronder weergegeven. Op het tabblad "Exporteer labels" vind je meerdere opties voor het formaat waarin je wilt exporteren. We kiezen het teamformaat voor ons geval. Als u meer hulp nodig heeft bij het gebruik van de tool, kunt u hun raadplegen documentatie. We hebben nu ons JSON-bestand met de QA-paren voor fijnafstemming.
Hoe te finetunen?
Python biedt veel open-sourcepakketten die u kunt gebruiken voor fijnafstemming. Ik heb het Pytorch and Transformers-pakket voor mijn zaak gebruikt. Begin met het importeren van de pakketmodules met behulp van pip, de pakketbeheerder. De transformers
bibliotheek biedt een BERTTokenizer
, dat specifiek is bedoeld voor het tokeniseren van invoer voor het BERT-model.
!pip install torch
!pip install transformers import json
import torch
from transformers import BertTokenizer, BertForQuestionAnswering
from torch.utils.data import DataLoader, Dataset
Aangepaste gegevensset definiรซren voor laden en voorbewerking
De volgende stap is het laden en voorbewerken van de gegevens. U kunt de Dataset
klasse van pytorch's utils.data
module om een โโaangepaste klasse voor uw dataset te definiรซren. Ik heb een aangepaste datasetklasse gemaakt diabetes
zoals je kunt zien in het onderstaande codefragment. De init
is verantwoordelijk voor het initialiseren van de variabelen. De file_path
is een argument dat het pad van uw JSON-trainingsbestand invoert en zal worden gebruikt om te initialiseren data
. We initialiseren de BertTokenizer
ook hier.
Vervolgens definiรซren we a load_data()
functie. Deze functie leest het JSON-bestand in een JSON-gegevensobject en haalt de context, vraag, antwoorden en hun index eruit. Het voegt de geรซxtraheerde velden toe aan een lijst en retourneert deze.
De getitem
gebruikt de BERT-tokenizer om de vraag en context te coderen in invoertensors die zijn input_ids
en attention_mask
. De encode_plus
tokeniseert de tekst en voegt speciale tokens toe (zoals [CLS] en [SEP]). Merk op dat we de squeeze()
methode om singleton-dimensies te verwijderen voordat ze worden ingevoerd in BERT. Ten slotte retourneert het de verwerkte invoertensoren.
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
Als je het eenmaal hebt gedefinieerd, kun je doorgaan en een instantie van deze klasse maken door de file_path
argument erbij.
file_path = 'diabetes.json'
dataset = diabetes(file_path)
Het model trainen
Ik zal de gebruiken BertForQuestionAnswering
model omdat het het meest geschikt is voor QA-taken. U kunt de vooraf getrainde gewichten van de bert-base-uncased
model door te bellen naar de from_pretrained
functie op het model. U moet ook de functie voor evaluatieverlies en optimalisatie kiezen die u voor training zou gebruiken.
Bekijk onze praktische, praktische gids voor het leren van Git, met best-practices, door de industrie geaccepteerde normen en bijgevoegd spiekbriefje. Stop met Googlen op Git-commando's en eigenlijk leren het!
Ik gebruik een Adam-optimizer en cross-entropieverliesfunctie. U kunt de Pytorch-klasse gebruiken DataLoader
om gegevens in verschillende batches te laden en ze ook in willekeurige volgorde te plaatsen om vertekening te voorkomen.
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)
Zodra de datalader is gedefinieerd, kunt u doorgaan en de laatste trainingslus schrijven. Tijdens elke iteratie wordt elke batch verkregen uit de data_loader
bevat batch_size
aantal voorbeelden, waarop voorwaartse en achterwaartse voortplanting wordt uitgevoerd. De code probeert de beste set gewichten voor parameters te vinden, waarbij het verlies minimaal zou zijn.
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}")
Hiermee is uw finetuning compleet! U kunt het model testen door het in te stellen op model.eval()
. U kunt ook de leersnelheid en het aantal tijdperken nauwkeurig afstemmen om de beste resultaten voor uw gegevens te verkrijgen.
Beste tips en praktijken
Hier zijn enkele aandachtspunten bij het verfijnen van grote taalmodellen op aangepaste gegevens:
- Uw dataset moet het doeldomein of de taak vertegenwoordigen waarin u het taalmodel wilt laten uitblinken. schoon en goed gestructureerde data is essentieel.
- Zorg ervoor dat u voldoende trainings voorbeelden in uw gegevens hebt zodat het model patronen kan leren. Anders zou het model de voorbeelden uit het hoofd kunnen leren en overfitten, zonder het vermogen om dat te doen generaliseren naar ongeziene voorbeelden.
- Kies een vooraf getraind model dat is getraind op een corpus dat relevant is voor uw taak. Voor het beantwoorden van vragen kiezen we een vooraf getraind model dat is getraind op de Stanford Question Answering-dataset. Vergelijkbaar hiermee zijn er verschillende modellen beschikbaar voor taken zoals sentimentanalyse, tekstgeneratie, samenvatting, tekstclassificatie en meer.
- Probeer Gradiรซnt accumulatie als je een beperkt GPU-geheugen hebt. Bij deze methode worden, in plaats van de gewichten van het model na elke batch bij te werken, gradiรซnten verzameld over meerdere mini-batches voordat een update wordt uitgevoerd.
- Als u tijdens het afstemmen te maken krijgt met het probleem van overfitting, gebruik dan regularisatie technieken. Enkele veelgebruikte methoden zijn onder meer het toevoegen van uitvallagen aan de modelarchitectuur, het implementeren van gewichtsverval en laagnormalisatie.
Conclusie
Grote taalmodellen kunnen u helpen om veel taken op een snelle en efficiรซnte manier te automatiseren. Door LLM's nauwkeurig af te stemmen, kunt u de kracht van overdrachtsleren benutten en aanpassen aan uw specifieke domein. Verfijning kan essentieel zijn als uw dataset zich in domeinen bevindt zoals medisch, een technische niche, financiรซle datasets en meer.
In dit artikel hebben we BERT gebruikt omdat het open source is en goed werkt voor persoonlijk gebruik. Als u aan een grootschalig project werkt, kunt u kiezen voor krachtigere LLM's, zoals GPT3, of andere open source-alternatieven. Onthoud dat het nauwkeurig afstemmen van grote taalmodellen rekenkundig duur en tijdrovend kan zijn. Zorg ervoor dat u over voldoende rekenbronnen beschikt, inclusief GPU's of TPU's op basis van de schaal.
- Door SEO aangedreven content en PR-distributie. Word vandaag nog versterkt.
- PlatoData.Network Verticale generatieve AI. Versterk jezelf. Toegang hier.
- PlatoAiStream. Web3-intelligentie. Kennis versterkt. Toegang hier.
- PlatoESG. Automotive / EV's, carbon, CleanTech, Energie, Milieu, Zonne, Afvalbeheer. Toegang hier.
- BlockOffsets. Eigendom voor milieucompensatie moderniseren. Toegang hier.
- Bron: https://stackabuse.com/guide-to-fine-tuning-open-source-llms-on-custom-data/
- : heeft
- :is
- :niet
- :waar
- $UP
- 1
- 12
- 20
- 8
- a
- in staat
- Over
- toegang
- geraadpleegde
- Account
- Geaccumuleerd
- Bereiken
- acties
- werkelijk
- Adam
- toe te voegen
- Voegt
- aangenomen
- Na
- vooruit
- AI
- ook
- alternatieven
- am
- onder
- bedragen
- hoeveelheden
- an
- analyse
- en
- Nog een
- beantwoorden
- antwoorden
- elke
- nadering
- architectuur
- ZIJN
- argument
- dit artikel
- AS
- At
- pogingen
- automatiseren
- webmaster.
- Beschikbaar
- gemiddelde
- vermijd
- gebaseerde
- BE
- geweest
- vaardigheden
- onder
- BEST
- Betere
- tussen
- vooringenomenheid
- Miljard
- Bloeien
- grens
- ondernemingen
- maar
- by
- bellen
- CAN
- Inhoud
- geval
- het worstelen
- Wijzigingen
- ChatGPT
- controle
- keuze
- Kies
- klasse
- classificatie
- code
- algemeen
- gemeenschap
- voltooit
- conclusie
- bestaat uit
- bevat
- verband
- contextual
- het omzetten van
- Overeenkomend
- en je merk te creรซren
- aangemaakt
- Wij creรซren
- Cross
- cruciaal
- Actueel
- Op dit moment
- gewoonte
- aan te passen
- gegevens
- datasets
- gedefinieerd
- ingezet
- gewenste
- ontwikkelde
- apparaat
- Diabetes
- DEED
- Dieet
- anders
- Afmeting
- diversen
- do
- document
- documenten
- doet
- domein
- domeinen
- don
- gedaan
- gedurende
- elk
- gemakkelijk
- doeltreffend
- efficiรซnt
- anders
- waardoor
- einde
- genoeg
- verzekeren
- entiteit
- tijdperk
- tijdperken
- essentieel
- evaluatie
- Zelfs
- OOIT
- voorbeeld
- voorbeelden
- Excel
- uitstekend
- duur
- exporteren
- extract
- Gezicht
- Falls
- Voordelen
- Fed
- veld-
- Velden
- Dien in
- finale
- Tot slot
- financieel
- VIND DE PLEK DIE PERFECT VOOR JOU IS
- Focus
- Voor
- formaat
- Naar voren
- FRAME
- Gratis
- oppompen van
- functie
- algemeen
- generatie
- generatief
- Git
- Go
- goed
- GPU
- GPU's
- gradiรซnten
- gids
- hand
- handvat
- hands-on
- gebeurt
- Hebben
- Gezondheid
- gehoord
- zwaar
- hulp
- Vandaar
- hier
- Markeer
- kap
- zweven
- Hoe
- How To
- HTTPS
- reusachtig
- menselijk
- gigantisch
- i
- if
- beeld
- beeld
- uitvoering
- importeren
- in
- omvatten
- inclusief
- Inclusief
- index
- individuen
- informatie
- invoer
- ingangen
- installeren
- instantie
- instructies
- interactie
- in
- Introductie
- IT
- herhaling
- Jobomschrijving:
- json
- Houden
- labels
- taal
- Groot
- grootschalig
- lagen
- Legkippen
- LEARN
- geleerd
- leren
- laten
- Hefboomwerking
- LG
- Bibliotheek
- als
- Beperkt
- Lijst
- ll
- LLM
- laden
- lader
- het laden
- uit
- lot
- maken
- manager
- manier
- handmatig
- veel
- massief
- Mei..
- gemiddelde
- betekenis
- medisch
- Geheugen
- methode
- methoden
- macht
- miljoenen
- minimaal
- model
- modellen
- wijzigen
- Module
- Modules
- meer
- meest
- veel
- meervoudig
- my
- nationaal
- Noodzaak
- nodig
- behoeften
- New
- volgende
- NIH
- nlp
- geen
- een
- nu
- aantal
- object
- verkrijgen
- verkregen
- of
- Aanbod
- vaak
- on
- EEN
- online.
- Slechts
- open
- open source
- Keuze
- Opties
- or
- organisaties
- Overige
- onze
- uit
- over
- het te bezitten.
- pakket
- Paketten
- betaald
- paren
- parameters
- bijzonder
- Voorbijgaand
- pad
- patronen
- voor
- prestatie
- uitgevoerd
- uitvoerend
- persoonlijk
- plan
- Plato
- Plato gegevensintelligentie
- PlatoData
- punten
- mogelijkheden
- energie
- aangedreven
- krachtige
- PRAKTISCH
- die eerder
- probleem
- Verwerkt
- project
- zorgen voor
- biedt
- pytorch
- Q & A
- vraag
- Contact
- Quick
- snel
- tarief
- liever
- bereiken
- Lees
- erkenning
- herkennen
- aanbevolen
- verminderen
- verwezen
- Relaties
- relatief
- relevante
- niet vergeten
- verwijderen
- vertegenwoordigen
- Voorwaarden
- Resources
- verantwoordelijk
- Resultaten
- Retourneren
- Ring
- lopen
- s
- ervaren
- Scale
- krassen
- Ontdek
- zien
- ZELF
- zin
- sentiment
- reeks
- het instellen van
- Shadow
- vel
- moet
- tonen
- getoond
- schudden
- betekenen
- gelijk
- Klein
- kleine bedrijven
- kleinere
- sommige
- bron
- special
- specifiek
- specifiek
- Stapelmisbruik
- normen
- staat
- stanford
- begin
- Start
- state-of-the-art
- Stap voor
- stop
- Draad
- abonnement
- dergelijk
- voldoende
- OVERZICHT
- ondersteuning
- zeker
- Nemen
- Talk
- doelwit
- Taak
- taken
- Technisch
- terminologie
- termen
- proef
- Tekstclassificatie
- neem contact
- dat
- De
- hun
- Ze
- harte
- Er.
- Deze
- ze
- dit
- Door
- niet de tijd of
- tijdrovend
- tips
- naar
- tokenize
- tokenizing
- tokens
- tools
- top
- fakkel
- in de richting van
- Trainen
- getraind
- Trainingen
- overdracht
- overgedragen
- transformers
- overgang
- Vertaling
- behandeling
- probeerden
- twee
- type dan:
- types
- voor
- begrijpen
- begrip
- anders
- up-to-date
- bijwerken
- bijwerken
- .
- gebruikt
- Gebruiker
- toepassingen
- gebruik
- variรซteit
- Bekijk
- willen
- we
- gewicht
- GOED
- waren
- Wat
- terwijl
- welke
- en
- breed
- wijd
- wil
- Met
- zonder
- Woord
- woorden
- werkzaam
- Bedrijven
- zorgen
- zou
- zou niet
- schrijven
- You
- Your
- zephyrnet