Introduktion
Jeg er sikker på, at de fleste af jer ville have hørt om ChatGPT og prøvet det for at besvare dine spørgsmål! Har du nogensinde spekuleret på, hvad der sker under hætten? Den er drevet af en Large Language Model GPT-3 udviklet af Open AI. Disse store sprogmodeller, ofte omtalt som LLM'er, har låst op for mange muligheder i Natural Language Processing.
Hvad er store sprogmodeller?
LLM-modellerne er trænet på enorme mængder tekstdata, hvilket gør dem i stand til at forstå menneskeligt sprog med mening og kontekst. Tidligere blev de fleste modeller trænet ved hjælp af den overvågede tilgang, hvor vi fodrer inputfunktioner og tilsvarende etiketter. I modsætning til dette trænes LLM'er gennem uovervåget læring, hvor de bliver fodret med enorme mængder tekstdata uden nogen etiketter og instruktioner. Derfor lærer LLM'er betydningen og forholdet mellem ord i et sprog effektivt. De kan bruges til en lang række opgaver som tekstgenerering, besvarelse af spørgsmål, oversættelse fra et sprog til et andet og meget mere.
Som en kirsebær på toppen kan disse store sprogmodeller finjusteres på dit brugerdefinerede datasæt til domænespecifikke opgaver. I denne artikel vil jeg tale om behovet for finjustering, de forskellige tilgængelige LLM'er og også vise et eksempel.
Forstå LLM Fine-Tuning
Lad os sige, at du driver et diabetesstøttefællesskab og ønsker at oprette en online-hjælpelinje til at besvare spørgsmål. En foruddannet LLM er uddannet mere generelt og ville ikke være i stand til at give de bedste svar på domænespecifikke spørgsmål og forstå de medicinske termer og akronymer. Dette kan løses ved at finjustere.
Hvad mener vi med finjustering? For at sige kort, Overfør
læring! De store sprogmodeller trænes på enorme datasæt ved hjælp af tunge ressourcer og har millioner af parametre. De repræsentationer og sprogmønstre, som LLM har lært under fortræningen, overføres til din aktuelle opgave. Rent teknisk initialiserer vi en model med de prætrænede vægte, og træner den derefter på vores opgavespecifikke data for at nå mere opgaveoptimerede vægte til parametre. Du kan også foretage ændringer i modellens arkitektur og ændre lagene efter dit behov.
Hvorfor skal du finjustere modeller?
- Spar tid og ressourcer: Finjustering kan hjælpe dig med at reducere den nødvendige træningstid og de nødvendige ressourcer end at træne fra bunden.
- Reducerede datakrav: Hvis du vil træne en model fra bunden, har du brug for enorme mængder mærkede data, som ofte er utilgængelige for enkeltpersoner og små virksomheder. Finjustering kan hjælpe dig med at opnå god ydeevne selv med en mindre mængde data.
- Tilpas til dine behov: Den foruddannede LLM er muligvis ikke fange din domænespecifikke terminologi og forkortelser. For eksempel vil en normal LLM ikke genkende, at "Type 1" og "Type 2" betyder diabetestyperne, mens en finjusteret kan.
- Aktiver løbende læring: Lad os sige, at vi finjusterede vores model på diabetesinformationsdata og implementerede den. Hvad hvis der er en ny kostplan eller behandling tilgængelig, som du vil inkludere? Du kan bruge vægten af din tidligere finjusterede model og justere den til at inkludere dine nye data. Dette kan hjælpe organisationer med at holde deres modeller opdaterede på en effektiv måde.
Valg af en open source LLM-model
Det næste skridt ville være at vælge en stor sprogmodel til din opgave. Hvad er dine muligheder? De avancerede store sprogmodeller, der er tilgængelige i øjeblikket, inkluderer GPT-3, Bloom, BERT, T5 og XLNet. Blandt disse har GPT-3 (Generative Pretrained Transformers) vist den bedste ydeevne, da den er trænet på 175 milliarder parametre og kan håndtere forskellige NLU-opgaver. Men GPT-3 finjustering kan kun tilgås gennem et betalt abonnement og er relativt dyrere end andre muligheder.
På den anden side er BERT en open source stor sprogmodel og kan finjusteres gratis. BERTI står for Bi-directional Encoder Decoder Transformers. BERT gør et fremragende stykke arbejde med at forstå kontekstuelle ordrepræsentationer.
Hvordan vælger du?
Hvis din opgave er mere orienteret mod tekstgenerering, ville GPT-3 (betalt) eller GPT-2 (open source) modeller være et bedre valg. Hvis din opgave falder ind under tekstklassificering, besvarelse af spørgsmål eller Entity Recognition, kan du gå med BERT. For mit tilfælde af besvarelse af spørgsmål om diabetes, ville jeg fortsætte med BERT-modellen.
Forberedelse og forbehandling af dit datasæt
Dette er det mest afgørende trin i finjusteringen, da formatet af data varierer baseret på modellen og opgaven. Til denne sag har jeg lavet et eksempeltekstdokument med oplysninger om diabetes, som jeg har anskaffet fra Sundhedsinstituttet hjemmeside. Du kan bruge dine egne data.
For at finjustere BERT opgaven med spørgsmål-svar, anbefales det at konvertere dine data til SQuAD-format. SQuAD er Stanford Question Answering Dataset, og dette format er almindeligt anvendt til træning af NLP-modeller til spørgsmålsbesvarelsesopgaver. Dataene skal være i JSON-format, hvor hvert felt består af:
context
: Sætningen eller afsnittet med tekst, som modellen vil søge efter svaret på spørgsmålet ud fraquestion
: Den forespørgsel, vi ønsker, at BERT skal besvare. Du skal formulere disse spørgsmål baseret på, hvordan slutbrugeren vil interagere med QA-modellen.answers
: Du skal angive det ønskede svar under dette felt. Der er to underkomponenter under dette,text
,answer_start
. Dettext
vil have svarstrengen. Hvorimod,answer_start
betegner indekset, hvorfra svaret begynder i kontekstafsnittet.
Som du kan forestille dig, ville det tage meget tid at oprette disse data til dit dokument, hvis du skulle gøre det manuelt. Bare rolig, jeg viser dig, hvordan du nemt gør det med Haystack-anmærkningsværktøjet.
Hvordan oprettes data i SQuAD-format med Haystack?
Ved hjælp af Haystack-anmærkningsværktøjet kan du hurtigt oprette et mærket datasæt til spørgsmål-besvarende opgaver. Du kan få adgang til værktøjet ved at oprette en konto på deres websted. Opret et nyt projekt og upload dit dokument. Du kan se det under fanen "Dokumenter", gå til "Handlinger", og du kan se muligheden for at oprette dine spørgsmål. Du kan skrive dit spørgsmål og fremhæve svaret i dokumentet, Haystack ville automatisk finde startindekset for det. Jeg har vist, hvordan jeg gjorde det på mit dokument i billedet nedenfor.
Fig. 1: Oprettelse af mærket datasæt til spørgsmål-svar med Haystack
Når du er færdig med at oprette nok spørgsmål-svar-par til finjustering, bør du kunne se en oversigt over dem som vist nedenfor. Under fanen "Eksportér etiketter" kan du finde flere muligheder for det format, du ønsker at eksportere i. Vi vælger squad-formatet til vores sag. Hvis du har brug for mere hjælp til at bruge værktøjet, kan du tjekke deres dokumentation. Vi har nu vores JSON-fil, der indeholder QA-parrene til finjustering.
Hvordan finjusterer man?
Python tilbyder mange open source-pakker, du kan bruge til finjustering. Jeg brugte Pytorch og Transformers-pakken til mit etui. Start med at importere pakkemodulerne ved hjælp af pip, pakkehåndteringen. Det transformers
biblioteket tilbyder en BERTTokenizer
, som er specifikt til tokenisering af input til BERT-modellen.
!pip install torch
!pip install transformers import json
import torch
from transformers import BertTokenizer, BertForQuestionAnswering
from torch.utils.data import DataLoader, Dataset
Definering af brugerdefineret datasæt til indlæsning og forbehandling
Det næste trin er at indlæse og forbehandle dataene. Du kan bruge Dataset
klasse fra pytorch's utils.data
modul til at definere en brugerdefineret klasse til dit datasæt. Jeg har oprettet en brugerdefineret datasætklasse diabetes
som du kan se i nedenstående kodestykke. Det init
er ansvarlig for at initialisere variablerne. Det file_path
er et argument, der vil indtaste stien til din JSON træningsfil og vil blive brugt til at initialisere data
. Vi initialiserer BertTokenizer
også her.
Dernæst definerer vi en load_data()
fungere. Denne funktion vil læse JSON-filen ind i et JSON-dataobjekt og udtrække konteksten, spørgsmålet, svarene og deres indeks fra det. Den tilføjer de udtrukne felter til en liste og returnerer den.
getitem
bruger BERT-tokenizeren til at indkode spørgsmålet og konteksten til inputtensorer, som er input_ids
, attention_mask
. Det encode_plus
vil tokenisere teksten og tilføje specielle tokens (såsom [CLS] og [SEP]). Bemærk, at vi bruger squeeze()
metode til at fjerne eventuelle singleton-dimensioner før indtastning til BERT. Til sidst returnerer den de behandlede inputtensorer.
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 har defineret det, kan du gå videre og oprette en forekomst af denne klasse ved at videregive file_path
argument for det.
file_path = 'diabetes.json'
dataset = diabetes(file_path)
Træning af modellen
Jeg vil bruge BertForQuestionAnswering
model, da den er bedst egnet til QA-opgaver. Du kan initialisere de fortrænede vægte af bert-base-uncased
model ved at ringe til from_pretrained
funktion på modellen. Du bør også vælge den evalueringstabsfunktion og optimering, du ville bruge til træning.
Tjek vores praktiske, praktiske guide til at lære Git, med bedste praksis, brancheaccepterede standarder og inkluderet snydeark. Stop med at google Git-kommandoer og faktisk lærer det!
Jeg bruger en Adam optimizer og cross entropy tab funktion. Du kan bruge Pytorch-klassen DataLoader
at indlæse data i forskellige batches og også blande dem for at undgå skævhed.
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 dataindlæseren er defineret, kan du gå videre og skrive den sidste træningsløkke. Under hver iteration, hver batch opnået fra data_loader
indeholder batch_size
antal eksempler, hvorpå der udføres frem- og tilbageudbredelse. Koden forsøger at finde det bedste sæt vægte for parametre, hvor tabet ville være minimalt.
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}")
Dette fuldender din finjustering! Du kan teste modellen ved at indstille den til model.eval()
. Du kan også bruge finjustere indlæringshastigheden og antallet af epoker-parametre for at opnå de bedste resultater på dine data.
Bedste tips og praksis
Her er nogle punkter at bemærke, når du finjusterer alle store sprogmodeller på brugerdefinerede data:
- Dit datasæt skal repræsentere det måldomæne eller den opgave, du ønsker, at sprogmodellen skal udmærke sig ved. Rens og velstrukturerede data er afgørende.
- Sørg for, at du har nok træningseksempler i dine data til, at modellen kan lære mønstre. Ellers kan modellen huske eksemplerne og overfit, uden kapacitet til generalisere til usete eksempler.
- Vælg en præ-trænet model, der er blevet trænet på et korpus, der er relevant for din opgave. Til besvarelse af spørgsmål vælger vi en præ-trænet model, der er trænet på Stanford Question Answering-datasættet. I lighed med dette er der forskellige modeller tilgængelige for opgaver som sentimentanalyse, tekstgenerering, opsummering, tekstklassificering og mere.
- Prøv Gradientakkumulering hvis du har begrænset GPU-hukommelse. I denne metode, i stedet for at opdatere modellens vægte efter hver batch, akkumuleres gradienter over flere mini-batches, før der udføres en opdatering.
- Hvis du står over for problemet med overtilpasning under finjustering, så brug legaliseringen teknikker. Nogle almindeligt anvendte metoder omfatter tilføjelse af dropout-lag til modelarkitekturen, implementering af vægtforfald og lagnormalisering.
Konklusion
Store sprogmodeller kan hjælpe dig med at automatisere mange opgaver på en hurtig og effektiv måde. Finjustering af LLM'er hjælper dig med at udnytte kraften i overførselslæring og tilpasse den til netop dit domæne. Finjustering kan være afgørende, hvis dit datasæt er inden for domæner som medicinsk, en teknisk niche, finansielle datasæt og mere.
I denne artikel brugte vi BERT, da det er open source og fungerer godt til personlig brug. Hvis du arbejder på et projekt i stor skala, kan du vælge mere kraftfulde LLM'er, som GPT3 eller andre open source-alternativer. Husk, at finjustering af store sprogmodeller kan være beregningsmæssigt dyrt og tidskrævende. Sørg for, at du har tilstrækkelige beregningsressourcer, inklusive GPU'er eller TPU'er baseret på skalaen.
- SEO Powered Content & PR Distribution. Bliv forstærket i dag.
- PlatoData.Network Vertical Generative Ai. Styrk dig selv. Adgang her.
- PlatoAiStream. Web3 intelligens. Viden forstærket. Adgang her.
- PlatoESG. Automotive/elbiler, Kulstof, CleanTech, Energi, Miljø, Solenergi, Affaldshåndtering. Adgang her.
- BlockOffsets. Modernisering af miljømæssig offset-ejerskab. Adgang her.
- Kilde: https://stackabuse.com/guide-to-fine-tuning-open-source-llms-on-custom-data/
- :har
- :er
- :ikke
- :hvor
- $OP
- 1
- 12
- 20
- 8
- a
- I stand
- Om
- adgang
- af udleverede
- Konto
- Akkumuleret
- opnå
- aktioner
- faktisk
- Adam
- tilføje
- Tilføjer
- vedtaget
- Efter
- forude
- AI
- også
- alternativer
- am
- blandt
- beløb
- beløb
- an
- analyse
- ,
- En anden
- besvare
- svar
- enhver
- tilgang
- arkitektur
- ER
- argument
- artikel
- AS
- At
- Forsøg på
- automatisere
- automatisk
- til rådighed
- gennemsnit
- undgå
- baseret
- BE
- været
- før
- jf. nedenstående
- BEDSTE
- Bedre
- mellem
- skævhed
- Billion
- Bloom
- grænse
- virksomheder
- men
- by
- ringer
- CAN
- Kapacitet
- tilfælde
- brydning
- Ændringer
- ChatGPT
- kontrollere
- valg
- Vælg
- klasse
- klassificering
- kode
- almindeligt
- samfund
- Fuldender
- konklusion
- består
- indeholder
- sammenhæng
- kontekstuelle
- konvertering af
- Tilsvarende
- skabe
- oprettet
- Oprettelse af
- Cross
- afgørende
- Nuværende
- For øjeblikket
- skik
- tilpasse
- data
- datasæt
- definerede
- indsat
- ønskes
- udviklet
- enhed
- Diabetes
- DID
- Kost
- forskellige
- størrelse
- forskelligartede
- do
- dokumentet
- dokumenter
- gør
- domæne
- Domæner
- Don
- færdig
- i løbet af
- hver
- nemt
- effektiv
- effektivt
- andet
- muliggør
- ende
- nok
- sikre
- enhed
- epoke
- epoker
- væsentlig
- evaluering
- Endog
- NOGENSINDE
- eksempel
- eksempler
- Excel
- fremragende
- dyrt
- eksport
- ekstrakt
- Ansigtet
- Falls
- Funktionalitet
- Fed
- felt
- Fields
- File (Felt)
- endelige
- Endelig
- finansielle
- Finde
- Fokus
- Til
- format
- Videresend
- FRAME
- Gratis
- fra
- funktion
- generelt
- generation
- generative
- Git
- Go
- godt
- GPU
- GPU'er
- gradienter
- vejlede
- hånd
- håndtere
- hands-on
- sker
- Have
- Helse
- hørt
- tunge
- hjælpe
- dermed
- link.
- Fremhæv
- hætte
- hover
- Hvordan
- How To
- HTTPS
- kæmpe
- menneskelig
- kæmpestor
- i
- if
- billede
- billede
- gennemføre
- importere
- in
- omfatter
- medtaget
- Herunder
- indeks
- enkeltpersoner
- oplysninger
- indgang
- indgange
- installere
- instans
- anvisninger
- interagere
- ind
- Introduktion
- IT
- iteration
- Job
- json
- Holde
- Etiketter
- Sprog
- stor
- storstilet
- lag
- lag
- LÆR
- lærte
- læring
- lad
- Leverage
- LG
- Bibliotek
- ligesom
- Limited
- Liste
- ll
- LLM
- belastning
- loader
- lastning
- off
- Lot
- lave
- leder
- måde
- manuelt
- mange
- massive
- Kan..
- betyde
- betyder
- medicinsk
- Hukommelse
- metode
- metoder
- måske
- millioner
- mindste
- model
- modeller
- ændre
- Moduler
- Moduler
- mere
- mest
- meget
- flere
- my
- national
- Behov
- behov
- behov
- Ny
- næste
- NIH
- NLP
- ingen
- normal
- nu
- nummer
- objekt
- opnå
- opnået
- of
- Tilbud
- tit
- on
- ONE
- online
- kun
- åbent
- open source
- Option
- Indstillinger
- or
- organisationer
- Andet
- vores
- ud
- i løbet af
- egen
- pakke
- pakker
- betalt
- par
- parametre
- særlig
- Passing
- sti
- mønstre
- per
- ydeevne
- udføres
- udfører
- personale
- fly
- plato
- Platon Data Intelligence
- PlatoData
- punkter
- muligheder
- magt
- strøm
- vigtigste
- Praktisk
- tidligere
- Problem
- Behandlet
- projekt
- give
- giver
- pytorch
- Spørgsmål og svar
- spørgsmål
- Spørgsmål
- Hurtig
- hurtigt
- Sats
- hellere
- nå
- Læs
- anerkendelse
- genkende
- anbefales
- reducere
- benævnt
- Relationer
- relativt
- relevant
- huske
- Fjern
- repræsentere
- Krav
- Ressourcer
- ansvarlige
- Resultater
- afkast
- ring
- Kør
- s
- siger
- Scale
- ridse
- Søg
- se
- SELV
- dømme
- stemningen
- sæt
- indstilling
- Shadow
- ark
- bør
- Vis
- vist
- shuffle
- betyde
- lignende
- lille
- små virksomheder
- mindre
- nogle
- Kilde
- særligt
- specifikke
- specifikt
- Stablemisbrug
- standarder
- står
- Stanford
- starte
- Starter
- state-of-the-art
- Trin
- Stands
- String
- abonnement
- sådan
- tilstrækkeligt
- RESUMÉ
- support
- sikker
- Tag
- Tal
- mål
- Opgaver
- opgaver
- Teknisk
- terminologi
- vilkår
- prøve
- Tekstklassificering
- end
- at
- deres
- Them
- derefter
- Der.
- Disse
- de
- denne
- Gennem
- tid
- tidskrævende
- tips
- til
- tokenisere
- tokenizing
- Tokens
- værktøj
- top
- fakkel
- mod
- Tog
- uddannet
- Kurser
- overførsel
- overført
- transformers
- overgang
- Oversættelse
- behandling
- forsøgte
- to
- typen
- typer
- under
- forstå
- forståelse
- I modsætning til
- up-to-date
- Opdatering
- opdatering
- brug
- anvendte
- Bruger
- bruger
- ved brug af
- række
- Specifikation
- ønsker
- we
- vægt
- GODT
- var
- Hvad
- ud fra følgende betragtninger
- som
- mens
- bred
- bredt
- vilje
- med
- uden
- ord
- ord
- arbejder
- virker
- bekymre sig
- ville
- ville ikke
- skriver
- Du
- Din
- zephyrnet