Beskrivning
Jag är säker på att de flesta av er skulle ha hört talas om ChatGPT och provat det för att svara på dina frågor! Har du någonsin undrat vad som händer under huven? Den drivs av en Large Language Model GPT-3 utvecklad av Open AI. Dessa stora språkmodeller, ofta kallade LLM:er har låst upp många möjligheter Naturlig språkbehandling.
Vad är stora språkmodeller?
LLM-modellerna är tränade på enorma mängder textdata, vilket gör det möjligt för dem att förstå mänskligt språk med mening och sammanhang. Tidigare har de flesta modellerna tränats med den övervakade metoden, där vi matar in inmatningsfunktioner och motsvarande etiketter. Till skillnad från detta tränas LLM:er genom oövervakad inlärning, där de matas med enorma mängder textdata utan några etiketter och instruktioner. Därför lär LLM:er sig betydelsen och relationerna mellan ord i ett språk effektivt. De kan användas för en mängd olika uppgifter som textgenerering, frågesvar, översättning från ett språk till ett annat och mycket mer.
Som en körsbär på toppen kan dessa stora språkmodeller finjusteras på din anpassade datauppsättning för domänspecifika uppgifter. I den här artikeln kommer jag att prata om behovet av finjustering, de olika LLM som finns tillgängliga och även visa ett exempel.
Förstå LLM Fine-Tuning
Låt oss säga att du driver en diabetesstödgrupp och vill skapa en onlinehjälplinje för att svara på frågor. En förutbildad LLM är utbildad mer allmänt och skulle inte kunna ge de bästa svaren på domänspecifika frågor och förstå de medicinska termerna och akronymerna. Detta kan lösas genom att finjustera.
Vad menar vi med finjustering? För att säga i korthet, Transfer
inlärning! De stora språkmodellerna tränas på enorma datamängder med tunga resurser och har miljontals parametrar. De representationer och språkmönster som LLM lärt sig under förutbildningen överförs till din nuvarande uppgift. Rent tekniskt initierar vi en modell med de förtränade vikterna och tränar den sedan på vår uppgiftsspecifika data för att nå mer uppgiftsoptimerade vikter för parametrar. Du kan också göra ändringar i modellens arkitektur och modifiera lagren enligt dina behov.
Varför ska du finjustera modeller?
- Spara tid och resurser: Finjustering kan hjälpa dig att minska träningstiden och resurserna som behövs än att träna från grunden.
- Minskade datakrav: Om du vill träna en modell från grunden skulle du behöva enorma mängder märkt data som ofta är otillgängligt för privatpersoner och småföretag. Finjustering kan hjälpa dig att uppnå bra prestanda även med en mindre mängd data.
- Anpassa efter dina behov: Den förutbildade LLM kanske inte fånga din domänspecifika terminologi och förkortningar. Till exempel skulle en normal LLM inte känna igen att "Typ 1" och "Typ 2" betecknar typerna av diabetes, medan en finjusterad kan.
- Aktivera kontinuerligt lärande: Låt oss säga att vi finjusterat vår modell på information om diabetesinformation och implementerat den. Vad händer om det finns en ny dietplan eller behandling tillgänglig som du vill inkludera? Du kan använda vikterna för din tidigare finjusterade modell och justera den för att inkludera dina nya data. Detta kan hjälpa organisationer att hålla sina modeller uppdaterade på ett effektivt sätt.
Att välja en LLM-modell med öppen källkod
Nästa steg skulle vara att välja en stor språkmodell för din uppgift. Vilka är dina alternativ? De toppmoderna stora språkmodellerna som finns tillgängliga för närvarande inkluderar GPT-3, Bloom, BERT, T5 och XLNet. Bland dessa har GPT-3 (Generative Pretrained Transformers) visat den bästa prestandan, eftersom den är tränad på 175 miljarder parametrar och kan hantera olika NLU-uppgifter. Men finjustering av GPT-3 kan endast nås genom ett betalabonnemang och är relativt dyrare än andra alternativ.
Å andra sidan är BERT en stor språkmodell med öppen källkod och kan finjusteras gratis. BERTI står för Bi-directional Encoder Decoder Transformers. BERT gör ett utmärkt jobb med att förstå kontextuella ordrepresentationer.
Hur väljer du?
Om din uppgift är mer inriktad på textgenerering skulle GPT-3 (betald) eller GPT-2 (öppen källkod) modeller vara ett bättre val. Om din uppgift faller under textklassificering, frågesvar eller Entity Recognition, kan du gå med BERT. För mitt fall av frågesvar om diabetes, skulle jag fortsätta med BERT-modellen.
Förbereda och förbearbeta din datamängd
Detta är det mest avgörande steget i finjusteringen, eftersom formatet på data varierar beroende på modell och uppgift. För det här fallet har jag skapat ett exempel på textdokument med information om diabetes som jag har inhandlat från National Institute of Health webbplats. Du kan använda dina egna uppgifter.
För att finjustera BERT uppgiften att svara på frågor, rekommenderas att konvertera dina data till SQuAD-format. SQuAD är Stanford Question Answering Dataset och detta format används allmänt för att träna NLP-modeller för frågesvarsuppgifter. Datan måste vara i JSON-format, där varje fält består av:
context
: Den mening eller stycke med text utifrån vilken modellen kommer att söka efter svaret på fråganquestion
: Frågan vi vill att BERT ska svara på. Du skulle behöva formulera dessa frågor baserat på hur slutanvändaren skulle interagera med QA-modellen.answers
: Du måste ange önskat svar under detta fält. Det finns två underkomponenter under detta,text
ochanswer_start
. Detext
kommer att ha svarssträngen. Medananswer_start
betecknar indexet, varifrån svaret börjar i sammanhangsstycket.
Som du kan föreställa dig skulle det ta mycket tid att skapa dessa data för ditt dokument om du skulle göra det manuellt. Oroa dig inte, jag ska visa dig hur du gör det enkelt med Haystack-anteckningsverktyget.
Hur skapar man data i SQuAD-format med Haystack?
Med Haystack-anteckningsverktyget kan du snabbt skapa en märkt datauppsättning för frågor som svarar på frågor. Du kan komma åt verktyget genom att skapa ett konto på deras webbplats. Skapa ett nytt projekt och ladda upp ditt dokument. Du kan se det under fliken "Dokument", gå till "Åtgärder" och du kan se möjligheten att skapa dina frågor. Du kan skriva din fråga och markera svaret i dokumentet, Haystack skulle automatiskt hitta startindexet för det. Jag har visat hur jag gjorde det på mitt dokument i bilden nedan.
Fig. 1: Skapar märkt datauppsättning för frågesvar med Haystack
När du är klar med att skapa tillräckligt många Fråge-svar-par för finjustering, bör du kunna se en sammanfattning av dem som visas nedan. Under fliken "Exportera etiketter" kan du hitta flera alternativ för formatet du vill exportera i. Vi väljer lagformatet för vårt ärende. Om du behöver mer hjälp med att använda verktyget kan du kontrollera deras dokumentation. Vi har nu vår JSON-fil som innehåller QA-paren för finjustering.
Hur finjusterar man?
Python erbjuder många paket med öppen källkod som du kan använda för finjustering. Jag använde Pytorch and Transformers-paketet för mitt fodral. Börja med att importera paketmodulerna med pip, pakethanteraren. De transformers
biblioteket tillhandahåller en BERTTokenizer
, som är specifikt för tokenisering av indata till BERT-modellen.
!pip install torch
!pip install transformers import json
import torch
from transformers import BertTokenizer, BertForQuestionAnswering
from torch.utils.data import DataLoader, Dataset
Definiera anpassad datauppsättning för laddning och förbearbetning
Nästa steg är att ladda och förbearbeta data. Du kan använda Dataset
klass från pytorch's utils.data
modul för att definiera en anpassad klass för din datauppsättning. Jag har skapat en anpassad datasetklass diabetes
som du kan se i kodavsnittet nedan. De init
ansvarar för att initiera variablerna. De file_path
är ett argument som matar in sökvägen till din JSON-träningsfil och kommer att användas för att initiera data
. Vi initierar BertTokenizer
också här.
Därefter definierar vi a load_data()
fungera. Den här funktionen läser in JSON-filen i ett JSON-dataobjekt och extraherar sammanhanget, frågan, svaren och deras index från det. Den lägger till de extraherade fälten i en lista och returnerar den.
Smakämnen getitem
använder BERT-tokenizern för att koda frågan och sammanhanget till indatatensorer som är input_ids
och attention_mask
. De encode_plus
kommer att tokenisera texten och lägga till speciella tokens (som [CLS] och [SEP]). Observera att vi använder squeeze()
metod för att ta bort eventuella singleton-dimensioner innan inmatning till BERT. Slutligen returnerar den de bearbetade ingångstensorerna.
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
När du väl har definierat den kan du gå vidare och skapa en instans av den här klassen genom att skicka file_path
argument för det.
file_path = 'diabetes.json'
dataset = diabetes(file_path)
Träna modellen
Jag kommer att använda BertForQuestionAnswering
modell då den lämpar sig bäst för QA-uppgifter. Du kan initiera de förtränade vikterna för bert-base-uncased
modell genom att anropa from_pretrained
funktion på modellen. Du bör också välja utvärderingsförlustfunktionen och optimeraren du skulle använda för träning.
Kolla in vår praktiska, praktiska guide för att lära dig Git, med bästa praxis, branschaccepterade standarder och medföljande fuskblad. Sluta googla Git-kommandon och faktiskt lära Det!
Jag använder en Adam optimizer och cross entropy loss funktion. Du kan använda Pytorch-klassen DataLoader
att ladda data i olika partier och även blanda dem för att undvika partiskhet.
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)
När dataladdaren är definierad kan du gå vidare och skriva den sista träningsslingan. Under varje iteration, varje batch erhållen från data_loader
innehåller batch_size
antal exempel, på vilka fortplantning framåt och bakåt utförs. Koden försöker hitta den bästa uppsättningen vikter för parametrar, där förlusten skulle vara minimal.
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}")
Detta avslutar din finjustering! Du kan testa modellen genom att ställa in den på model.eval()
. Du kan också använda finjustera inlärningshastigheten och antalet epokparametrar för att få bästa resultat på dina data.
Bästa tips och praxis
Här är några punkter att notera när du finjusterar alla stora språkmodeller på anpassade data:
- Din datauppsättning måste representera måldomänen eller uppgiften som du vill att språkmodellen ska utmärka sig med. Rengör och välstrukturerad data är väsentlig.
- Se till att du har tillräckligt med träningsexempel i dina data för att modellen ska lära sig mönster. Annars kan modellen memorera exemplen och överanpassa, utan kapacitet att generalisera till osynliga exempel.
- Välj en förtränad modell som har tränats på en korpus som är relevant för din uppgift. För att svara på frågor väljer vi en förtränad modell som är tränad på Stanford Question Answering-datauppsättningen. I likhet med detta finns det olika modeller tillgängliga för uppgifter som sentimentanalys, textgenerering, sammanfattning, textklassificering och mer.
- Prova Gradientackumulering om du har begränsat GPU-minne. I den här metoden, istället för att uppdatera modellens vikter efter varje batch, ackumuleras gradienter över flera minibatcher innan en uppdatering utförs.
- Om du står inför problemet med att överanpassa medan du finjusterar, använd legaliserings tekniker. Några vanligt använda metoder inkluderar att lägga till dropout-lager till modellarkitekturen, implementera viktnedgång och lagernormalisering.
Slutsats
Stora språkmodeller kan hjälpa dig att automatisera många uppgifter på ett snabbt och effektivt sätt. Finjusterande LLM:er hjälper dig att utnyttja kraften i överföringsinlärning och anpassa den till just din domän. Finjustering kan vara avgörande om din datauppsättning finns inom domäner som medicinsk, en teknisk nisch, finansiella datauppsättningar och mer.
I den här artikeln använde vi BERT eftersom det är öppen källkod och fungerar bra för personligt bruk. Om du arbetar med ett projekt i stor skala kan du välja mer kraftfulla LLM:er, som GPT3, eller andra alternativ med öppen källkod. Kom ihåg att finjustering av stora språkmodeller kan vara beräkningsmässigt dyrt och tidskrävande. Se till att du har tillräckliga beräkningsresurser, inklusive GPU eller TPU baserat på skalan.
- SEO-drivet innehåll och PR-distribution. Bli förstärkt idag.
- PlatoData.Network Vertical Generative Ai. Styrka dig själv. Tillgång här.
- PlatoAiStream. Web3 Intelligence. Kunskap förstärkt. Tillgång här.
- Platoesg. Fordon / elbilar, Kol, CleanTech, Energi, Miljö, Sol, Avfallshantering. Tillgång här.
- BlockOffsets. Modernisera miljökompensation ägande. Tillgång här.
- Källa: https://stackabuse.com/guide-to-fine-tuning-open-source-llms-on-custom-data/
- : har
- :är
- :inte
- :var
- $UPP
- 1
- 12
- 20
- 8
- a
- Able
- Om Oss
- tillgång
- Accessed
- Konto
- ackumulerat
- Uppnå
- åtgärder
- faktiskt
- Adam
- tillsats
- Lägger
- antagen
- Efter
- framåt
- AI
- också
- alternativ
- am
- bland
- mängd
- mängder
- an
- analys
- och
- Annan
- svara
- svar
- vilken som helst
- tillvägagångssätt
- arkitektur
- ÄR
- Argumentet
- Artikeln
- AS
- At
- Försök
- automatisera
- automatiskt
- tillgänglig
- genomsnitt
- undvika
- baserat
- BE
- varit
- innan
- nedan
- BÄST
- Bättre
- mellan
- förspänning
- Miljarder
- Bloom
- gränsen
- företag
- men
- by
- anropande
- KAN
- Kapacitet
- Vid
- brottning
- Förändringar
- ChatGPT
- ta
- val
- Välja
- klass
- klassificering
- koda
- vanligen
- samfundet
- slutför
- slutsats
- består
- innehåller
- sammanhang
- kontextuella
- omvandling
- Motsvarande
- skapa
- skapas
- Skapa
- Cross
- avgörande
- Aktuella
- För närvarande
- beställnings
- skräddarsy
- datum
- datauppsättningar
- definierade
- utplacerade
- önskas
- utvecklade
- anordning
- Diabetes
- DID
- Diet
- olika
- dimensioner
- flera
- do
- dokumentera
- dokument
- gör
- domän
- domäner
- donation
- gjort
- under
- varje
- lätt
- effektiv
- effektivt
- annars
- möjliggör
- änden
- tillräckligt
- säkerställa
- enhet
- epok
- epoker
- väsentlig
- utvärdering
- Även
- NÅGONSIN
- exempel
- exempel
- excel
- utmärkt
- dyra
- export
- extrahera
- Ansikte
- Falls
- Funktioner
- Fed
- fält
- Fält
- Fil
- slutlig
- Slutligen
- finansiella
- hitta
- Fokus
- För
- format
- Framåt
- RAM
- Fri
- från
- fungera
- allmänhet
- generering
- generativ
- gå
- Go
- god
- GPU
- GPUs
- gradienter
- styra
- sidan
- hantera
- praktisk
- händer
- Har
- Hälsa
- hört
- tung
- hjälpa
- därav
- här.
- Markera
- huva
- hovring
- Hur ser din drömresa ut
- How To
- HTTPS
- stor
- humant
- humongous
- i
- if
- bild
- bild
- genomföra
- importera
- in
- innefattar
- ingår
- Inklusive
- index
- individer
- informationen
- ingång
- ingångar
- installera
- exempel
- instruktioner
- interagera
- in
- Beskrivning
- IT
- iteration
- Jobb
- json
- Ha kvar
- Etiketter
- språk
- Large
- storskalig
- lager
- skikt
- LÄRA SIG
- lärt
- inlärning
- Låt
- Hävstång
- LG
- Bibliotek
- tycka om
- Begränsad
- Lista
- ll
- LLM
- läsa in
- Lastaren
- läser in
- förlust
- Lot
- göra
- chef
- sätt
- manuellt
- många
- massiv
- Maj..
- betyda
- betyder
- medicinsk
- Minne
- metod
- metoder
- kanske
- miljoner
- minimum
- modell
- modeller
- modifiera
- Modulerna
- Moduler
- mer
- mest
- mycket
- multipel
- my
- nationell
- Behöver
- behövs
- behov
- Nya
- Nästa
- NIH
- nlp
- Nej
- normala
- nu
- antal
- objektet
- få
- erhållna
- of
- Erbjudanden
- Ofta
- on
- ONE
- nätet
- endast
- öppet
- öppen källkod
- Alternativet
- Tillbehör
- or
- organisationer
- Övriga
- vår
- ut
- över
- egen
- paket
- paket
- betalas
- par
- parametrar
- särskilt
- Förbi
- bana
- mönster
- för
- prestanda
- utfört
- utför
- personlig
- Planen
- plato
- Platon Data Intelligence
- PlatonData
- poäng
- Möjligheterna
- kraft
- drivs
- den mäktigaste
- Praktisk
- tidigare
- Problem
- Bearbetad
- projektet
- ge
- ger
- pytorch
- Frågor och svar
- fråga
- frågor
- Snabbt
- snabbt
- Betygsätta
- snarare
- nå
- Läsa
- erkännande
- känner igen
- rekommenderas
- minska
- avses
- Förhållanden
- relativt
- relevanta
- ihåg
- ta bort
- representerar
- Krav
- Resurser
- ansvarig
- Resultat
- återgår
- Ringa
- Körning
- s
- säga
- Skala
- repa
- Sök
- se
- SJÄLV
- mening
- känsla
- in
- inställning
- skugga
- ark
- skall
- show
- visas
- blanda
- betyda
- liknande
- Small
- småföretag
- mindre
- några
- Källa
- speciell
- specifik
- specifikt
- Stackabuse
- standarder
- står
- stanford
- starta
- Starta
- state-of-the-art
- Steg
- Sluta
- Sträng
- prenumeration
- sådana
- tillräcklig
- SAMMANFATTNING
- stödja
- säker
- Ta
- Diskussion
- Målet
- uppgift
- uppgifter
- Teknisk
- terminologi
- villkor
- testa
- Textklassificering
- än
- den där
- Smakämnen
- deras
- Dem
- sedan
- Där.
- Dessa
- de
- detta
- Genom
- tid
- tidskrävande
- Tips
- till
- symbolisera
- tokenizing
- tokens
- verktyg
- topp
- brännaren
- mot
- Tåg
- tränad
- Utbildning
- överföring
- överförd
- transformatorer
- övergång
- Översättning
- behandling
- försökte
- två
- Typ
- typer
- under
- förstå
- förståelse
- till skillnad från
- TIDSENLIG
- Uppdatering
- uppdatering
- användning
- Begagnade
- Användare
- användningar
- med hjälp av
- mängd
- utsikt
- vill
- we
- vikt
- VÄL
- były
- Vad
- medan
- som
- medan
- bred
- brett
- kommer
- med
- utan
- ord
- ord
- arbetssätt
- fungerar
- oro
- skulle
- skulle inte
- skriva
- Om er
- Din
- zephyrnet