Introduksjon
Jeg er sikker på at de fleste av dere ville ha hørt om ChatGPT og prøvd det ut for å svare på spørsmålene dine! Har du noen gang lurt på hva som skjer under panseret? Den er drevet av en Large Language Model GPT-3 utviklet av Open AI. Disse store språkmodellene, ofte referert til som LLM-er, har låst opp mange muligheter Natural Language Processing.
Hva er store språkmodeller?
LLM-modellene er trent på enorme mengder tekstdata, noe som gjør dem i stand til å forstå menneskelig språk med mening og kontekst. Tidligere ble de fleste modellene trent ved å bruke den overvåkede tilnærmingen, der vi mater inn inputfunksjoner og tilsvarende etiketter. I motsetning til dette trenes LLM-er gjennom uovervåket læring, hvor de mates enorme mengder tekstdata uten noen etiketter og instruksjoner. Derfor lærer LLM-er betydningen og relasjonene mellom ord i et språk effektivt. De kan brukes til en rekke oppgaver som tekstgenerering, svar på spørsmål, oversettelse fra ett språk til et annet og mye mer.
Som en kirsebær på toppen, kan disse store språkmodellene finjusteres på ditt tilpassede datasett for domenespesifikke oppgaver. I denne artikkelen vil jeg snakke om behovet for finjustering, de forskjellige LLM-ene som er tilgjengelige, og også vise et eksempel.
Forstå LLM Fine-Tuning
La oss si at du driver et støttefellesskap for diabetes og ønsker å opprette en online hjelpelinje for å svare på spørsmål. En forhåndsutdannet LLM er trent mer generelt og vil ikke være i stand til å gi de beste svarene på domenespesifikke spørsmålene og forstå de medisinske termene og akronymene. Dette kan løses ved å finjustere.
Hva mener vi med finjustering? For å si kort, Overfør
læring! De store språkmodellene er trent på enorme datasett som bruker tunge ressurser og har millioner av parametere. Representasjonene og språkmønstrene som læres av LLM under foropplæringen, overføres til din nåværende oppgave. Teknisk sett initialiserer vi en modell med de forhåndstrente vektene, og trener den deretter på våre oppgavespesifikke data for å nå mer oppgaveoptimaliserte vekter for parametere. Du kan også gjøre endringer i arkitekturen til modellen, og modifisere lagene etter behov.
Hvorfor bør du finjustere modeller?
- Spar tid og ressurser: Finjustering kan hjelpe deg med å redusere treningstiden og ressursene som trengs enn å trene fra bunnen av.
- Reduserte datakrav: Hvis du ønsker å trene en modell fra bunnen av, vil du trenge enorme mengder merkede data som ofte er utilgjengelige for enkeltpersoner og små bedrifter. Finjustering kan hjelpe deg med å oppnå god ytelse selv med en mindre mengde data.
- Tilpass til dine behov: Det er ikke sikkert at den forhåndsutdannede LLM-en fanger opp din domenespesifikke terminologi og forkortelser. For eksempel vil en normal LLM ikke gjenkjenne at "Type 1" og "Type 2" betyr diabetestypene, mens en finjustert kan.
- Aktiver kontinuerlig læring: La oss si at vi finjusterte modellen vår på informasjonsdata om diabetes og implementerte den. Hva om det er en ny diettplan eller behandling tilgjengelig som du vil inkludere? Du kan bruke vektene til den tidligere finjusterte modellen og justere den for å inkludere de nye dataene dine. Dette kan hjelpe organisasjoner med å holde modellene oppdatert på en effektiv måte.
Velge en åpen kildekode LLM-modell
Det neste trinnet ville være å velge en stor språkmodell for oppgaven din. Hva er alternativene dine? De toppmoderne store språkmodellene som er tilgjengelige for øyeblikket inkluderer GPT-3, Bloom, BERT, T5 og XLNet. Blant disse har GPT-3 (Generative Pretrained Transformers) vist den beste ytelsen, siden den er trent på 175 milliarder parametere og kan håndtere ulike NLU-oppgaver. Men GPT-3-finjustering kan kun nås gjennom et betalt abonnement og er relativt dyrere enn andre alternativer.
På den annen side er BERT en åpen kildekode stor språkmodell og kan finjusteres gratis. BERTI står for Bi-directional Encoder Decoder Transformers. BERT gjør en utmerket jobb med å forstå kontekstuelle ordrepresentasjoner.
Hvordan velger du?
Hvis oppgaven din er mer orientert mot tekstgenerering, vil GPT-3 (betalt) eller GPT-2 (open source)-modeller være et bedre valg. Hvis oppgaven din faller inn under tekstklassifisering, spørsmålssvar eller enhetsgjenkjenning, kan du gå med BERT. For mitt tilfelle av spørsmålssvar om diabetes, ville jeg fortsette med BERT-modellen.
Klargjøring og forhåndsbehandling av datasettet ditt
Dette er det mest avgjørende trinnet for finjustering, da formatet på data varierer basert på modell og oppgave. For denne saken har jeg laget et eksempeltekstdokument med informasjon om diabetes som jeg har anskaffet fra Nasjonalt helseinstitutt nettsted. Du kan bruke dine egne data.
For å finjustere BERT-oppgaven med spørsmål-svar, anbefales det å konvertere dataene dine til SQuAD-format. SQuAD er Stanford Question Answering Dataset, og dette formatet er mye brukt for opplæring av NLP-modeller for spørsmålsoppgaver. Dataene må være i JSON-format, der hvert felt består av:
context
: Setningen eller avsnittet med tekst basert på som modellen skal søke etter svaret på spørsmåletquestion
: Spørsmålet vi vil at BERT skal svare på. Du må utforme disse spørsmålene basert på hvordan sluttbrukeren vil samhandle med QA-modellen.answers
: Du må oppgi ønsket svar under dette feltet. Det er to underkomponenter under dette,text
oganswer_start
. Detext
vil ha svarstrengen. Mens,answer_start
betegner indeksen, der svaret begynner i kontekstavsnittet.
Som du kan forestille deg, ville det ta mye tid å lage disse dataene for dokumentet ditt hvis du skulle gjøre det manuelt. Ikke bekymre deg, jeg skal vise deg hvordan du gjør det enkelt med Haystack-annoteringsverktøyet.
Hvordan lage data i SQuAD-format med Haystack?
Ved å bruke Haystack-annoteringsverktøyet kan du raskt lage et merket datasett for oppgaver som besvarer spørsmål. Du kan få tilgang til verktøyet ved å opprette en konto på deres nettstedet. Opprett et nytt prosjekt og last opp dokumentet ditt. Du kan se den under "Dokumenter"-fanen, gå til "Handlinger" og du kan se muligheten for å lage spørsmålene dine. Du kan skrive spørsmålet ditt og markere svaret i dokumentet, Haystack vil automatisk finne startindeksen til det. Jeg har vist hvordan jeg gjorde det på dokumentet mitt i bildet nedenfor.
Fig. 1: Opprette merket datasett for spørsmål-svar med Haystack
Når du er ferdig med å lage nok spørsmål-svar-par for finjustering, bør du kunne se et sammendrag av dem som vist nedenfor. Under fanen "Eksporter etiketter" kan du finne flere alternativer for formatet du vil eksportere i. Vi velger lagformatet for saken vår. Hvis du trenger mer hjelp til å bruke verktøyet, kan du sjekke deres dokumentasjon. Vi har nå vår JSON-fil som inneholder QA-parene for finjustering.
Hvordan finjustere?
Python tilbyr mange åpen kildekode-pakker du kan bruke for finjustering. Jeg brukte Pytorch og Transformers-pakken til kofferten min. Start med å importere pakkemodulene ved å bruke pip, pakkebehandleren. De transformers
biblioteket tilbyr en BERTTokenizer
, som er spesielt for tokenisering av innganger 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
Definere tilpasset datasett for lasting og forhåndsbehandling
Det neste trinnet er å laste inn og forhåndsbehandle dataene. Du kan bruke Dataset
klasse fra pytorch's utils.data
modul for å definere en egendefinert klasse for datasettet ditt. Jeg har laget en tilpasset datasettklasse diabetes
som du kan se i kodebiten nedenfor. De init
er ansvarlig for å initialisere variablene. De file_path
er et argument som vil legge inn banen til JSON-treningsfilen din og vil bli brukt til å initialisere data
. Vi initialiserer BertTokenizer
også her.
Deretter definerer vi a load_data()
funksjon. Denne funksjonen vil lese JSON-filen inn i et JSON-dataobjekt og trekke ut konteksten, spørsmålet, svarene og deres indeks fra den. Den legger til de utpakkede feltene i en liste og returnerer den.
De getitem
bruker BERT-tokenizeren til å kode spørsmålet og konteksten inn i inputtensorer som er input_ids
og attention_mask
. De encode_plus
vil tokenisere teksten, og legger til spesielle tokens (som [CLS] og [SEP]). Merk at vi bruker squeeze()
metode for å fjerne eventuelle singleton-dimensjoner før inntasting til BERT. Til slutt returnerer den de behandlede inputtensorene.
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 definert den, kan du gå videre og opprette en forekomst av denne klassen ved å bestå file_path
argument for det.
file_path = 'diabetes.json'
dataset = diabetes(file_path)
Trening av modellen
Jeg skal bruke BertForQuestionAnswering
modell da den egner seg best for QA-oppgaver. Du kan initialisere de forhåndstrente vektene til bert-base-uncased
modell ved å ringe from_pretrained
funksjon på modellen. Du bør også velge evalueringstapsfunksjonen og optimizeren du vil bruke til trening.
Sjekk ut vår praktiske, praktiske guide for å lære Git, med beste praksis, bransjeaksepterte standarder og inkludert jukseark. Slutt å google Git-kommandoer og faktisk lære den!
Jeg bruker en Adam optimizer og kryssentropi tapsfunksjon. Du kan bruke Pytorch-klassen DataLoader
å laste inn data i forskjellige grupper og også blande dem for å unngå skjevheter.
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 datalasteren er definert, kan du gå videre og skrive den siste treningssløyfen. Under hver iterasjon ble hver batch hentet fra data_loader
inneholder batch_size
antall eksempler, hvorpå forplantning forover og bakover utføres. Koden prøver å finne det beste settet med vekter for parametere, der tapet vil 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 fullfører finjusteringen din! Du kan teste modellen ved å sette den til model.eval()
. Du kan også bruke finjustere læringshastigheten og antall epoker-parametere for å oppnå de beste resultatene på dataene dine.
Beste tips og fremgangsmåter
Her er noen punkter du bør merke deg når du finjusterer store språkmodeller på tilpassede data:
- Datasettet ditt må representere måldomenet eller oppgaven du vil at språkmodellen skal utmerke seg med. Rengjør og godt strukturerte data er avgjørende.
- Sørg for at du har nok treningseksempler i dataene dine til at modellen kan lære mønstre. Ellers kan modellen huske eksemplene og overfitte seg uten kapasitet til det generalisere til usynlige eksempler.
- Velg en forhåndstrent modell som er trent på et korpus som er relevant for din oppgave. For å besvare spørsmål velger vi en forhåndsopplært modell som er trent på Stanford Question Answering-datasettet. I likhet med dette er det forskjellige modeller tilgjengelig for oppgaver som sentimentanalyse, tekstgenerering, oppsummering, tekstklassifisering og mer.
- Prøve Gradientakkumulering hvis du har begrenset GPU-minne. I denne metoden, i stedet for å oppdatere modellens vekter etter hver batch, akkumuleres gradienter over flere minibatcher før en oppdatering utføres.
- Hvis du står overfor problemet med overtilpasning under finjustering, bruk regularisering teknikker. Noen ofte brukte metoder inkluderer å legge til frafallslag til modellarkitekturen, implementere vektreduksjon og lagnormalisering.
konklusjonen
Store språkmodeller kan hjelpe deg med å automatisere mange oppgaver på en rask og effektiv måte. Finjustering av LLM-er hjelper deg å utnytte kraften i overføringslæring og tilpasse den til ditt spesielle domene. Finjustering kan være viktig hvis datasettet ditt er i domener som medisinsk, en teknisk nisje, økonomiske datasett og mer.
I denne artikkelen brukte vi BERT da det er åpen kildekode og fungerer godt for personlig bruk. Hvis du jobber med prosjektet i stor skala, kan du velge kraftigere LLM-er, som GPT3, eller andre åpen kildekode-alternativer. Husk at finjustering av store språkmodeller kan være beregningsmessig kostbart og tidkrevende. Sørg for at du har tilstrekkelige beregningsressurser, inkludert GPUer eller TPUer basert på skalaen.
- SEO-drevet innhold og PR-distribusjon. Bli forsterket i dag.
- PlatoData.Network Vertical Generative Ai. Styrk deg selv. Tilgang her.
- PlatoAiStream. Web3 Intelligence. Kunnskap forsterket. Tilgang her.
- PlatoESG. Bil / elbiler, Karbon, CleanTech, Energi, Miljø, Solenergi, Avfallshåndtering. Tilgang her.
- BlockOffsets. Modernisering av eierskap for miljøkompensasjon. Tilgang her.
- kilde: https://stackabuse.com/guide-to-fine-tuning-open-source-llms-on-custom-data/
- : har
- :er
- :ikke
- :hvor
- $OPP
- 1
- 12
- 20
- 8
- a
- I stand
- Om oss
- adgang
- aksesseres
- Logg inn
- akkumulert
- Oppnå
- handlinger
- faktisk
- Adam
- legge
- Legger
- vedtatt
- Etter
- fremover
- AI
- også
- alternativer
- am
- blant
- beløp
- beløp
- an
- analyse
- og
- En annen
- besvare
- svar
- noen
- tilnærming
- arkitektur
- ER
- argument
- Artikkel
- AS
- At
- forsøk
- automatisere
- automatisk
- tilgjengelig
- gjennomsnittlig
- unngå
- basert
- BE
- vært
- før du
- under
- BEST
- Bedre
- mellom
- Bias
- Milliarder
- Bloom
- grensen
- bedrifter
- men
- by
- ringer
- CAN
- Kapasitet
- saken
- Catch
- Endringer
- ChatGPT
- sjekk
- valg
- Velg
- klasse
- klassifisering
- kode
- vanligvis
- samfunnet
- Fullfører
- konklusjon
- består
- inneholder
- kontekst
- kontekstuelle
- konvertering
- Tilsvarende
- skape
- opprettet
- Opprette
- Kryss
- avgjørende
- Gjeldende
- I dag
- skikk
- tilpasse
- dato
- datasett
- definert
- utplassert
- ønsket
- utviklet
- enhet
- Diabetes
- gJORDE
- Kosthold
- forskjellig
- dimensjoner
- diverse
- do
- dokument
- dokumenter
- gjør
- domene
- domener
- Don
- gjort
- under
- hver enkelt
- lett
- effektiv
- effektivt
- ellers
- muliggjør
- slutt
- nok
- sikre
- enhet
- epoke
- epoker
- avgjørende
- evaluering
- Selv
- NOEN GANG
- eksempel
- eksempler
- Excel
- utmerket
- dyrt
- eksportere
- trekke ut
- Face
- Falls
- Egenskaper
- Fed
- felt
- Felt
- filet
- slutt~~POS=TRUNC
- Endelig
- finansiell
- Finn
- Fokus
- Til
- format
- Forward
- RAMME
- Gratis
- fra
- funksjon
- generelt
- generasjonen
- generative
- gå
- Go
- god
- GPU
- GPU
- gradienter
- veilede
- hånd
- håndtere
- hands-on
- skjer
- Ha
- Helse
- hørt
- tung
- hjelpe
- derav
- her.
- Uthev
- panser
- hover
- Hvordan
- Hvordan
- HTTPS
- stort
- menneskelig
- humongøs
- i
- if
- bilde
- forestille
- implementere
- importere
- in
- inkludere
- inkludert
- Inkludert
- indeks
- individer
- informasjon
- inngang
- innganger
- installere
- f.eks
- instruksjoner
- samhandle
- inn
- Introduksjon
- IT
- køyring
- Jobb
- JSON
- Hold
- etiketter
- Språk
- stor
- storskala
- lag
- lag
- LÆRE
- lært
- læring
- la
- Leverage
- LG
- Bibliotek
- i likhet med
- Begrenset
- Liste
- ll
- LLM
- laste
- loader
- lasting
- tap
- Lot
- gjøre
- leder
- måte
- manuelt
- mange
- massive
- Kan..
- bety
- betyr
- medisinsk
- Minne
- metode
- metoder
- kunne
- millioner
- minimal
- modell
- modeller
- modifisere
- Moduler
- Moduler
- mer
- mest
- mye
- flere
- my
- nasjonal
- Trenger
- nødvendig
- behov
- Ny
- neste
- NIH
- nlp
- Nei.
- normal
- nå
- Antall
- objekt
- få
- innhentet
- of
- Tilbud
- ofte
- on
- ONE
- på nett
- bare
- åpen
- åpen kildekode
- Alternativ
- alternativer
- or
- organisasjoner
- Annen
- vår
- ut
- enn
- egen
- pakke
- pakker
- betalt
- par
- parametere
- Spesielt
- Passerer
- banen
- mønstre
- for
- ytelse
- utført
- utfører
- personlig
- fly
- plato
- Platon Data Intelligence
- PlatonData
- poeng
- muligheter
- makt
- powered
- kraftig
- Praktisk
- tidligere
- Problem
- Bearbeidet
- prosjekt
- gi
- gir
- pytorch
- Q & A
- spørsmål
- spørsmål
- Rask
- raskt
- Sats
- heller
- å nå
- Lese
- anerkjennelse
- gjenkjenne
- anbefales
- redusere
- referert
- Relasjoner
- relativt
- relevant
- husker
- fjerne
- representere
- Krav
- Ressurser
- ansvarlig
- Resultater
- avkastning
- Ringe
- Kjør
- s
- sier
- Skala
- skraper
- Søk
- se
- SELV
- dømme
- sentiment
- sett
- innstilling
- Shadow
- ark
- bør
- Vis
- vist
- shuffle
- signalisere
- lignende
- liten
- små bedrifter
- mindre
- noen
- kilde
- spesiell
- spesifikk
- spesielt
- Stackabuse
- standarder
- står
- stanford
- Begynn
- Start
- state-of-the-art
- Trinn
- Stopp
- String
- abonnement
- slik
- tilstrekkelig
- SAMMENDRAG
- støtte
- sikker
- Ta
- Snakk
- Target
- Oppgave
- oppgaver
- Teknisk
- terminologi
- vilkår
- test
- Tekstklassifisering
- enn
- Det
- De
- deres
- Dem
- deretter
- Der.
- Disse
- de
- denne
- Gjennom
- tid
- tidkrevende
- tips
- til
- symbolisere
- tokenizing
- tokens
- verktøy
- topp
- lommelykt
- mot
- Tog
- trent
- Kurs
- overføre
- overføres
- transformers
- overgang
- Oversettelse
- behandling
- prøvd
- to
- typen
- typer
- etter
- forstå
- forståelse
- I motsetning til
- up-to-date
- Oppdater
- oppdatering
- bruke
- brukt
- Bruker
- bruker
- ved hjelp av
- variasjon
- Se
- ønsker
- we
- vekt
- VI VIL
- var
- Hva
- mens
- hvilken
- mens
- bred
- allment
- vil
- med
- uten
- ord
- ord
- arbeid
- virker
- bekymring
- ville
- ville ikke
- skrive
- Du
- Din
- zephyrnet