Introducere
Sunt sigur că majoritatea dintre voi ați fi auzit de ChatGPT și ați fi încercat-o pentru a vă răspunde la întrebări! Te-ai întrebat vreodată ce se întâmplă sub capotă? Este alimentat de un model de limbă mare GPT-3 dezvoltat de Open AI. Aceste modele de limbaj mari, deseori denumite LLM-uri au deschis multe posibilități în Procesarea limbajului natural.
Ce sunt modelele lingvistice mari?
Modelele LLM sunt instruite pe cantități masive de date text, permițându-le să înțeleagă limbajul uman cu sens și context. Anterior, majoritatea modelelor au fost instruite folosind abordarea supravegheată, în care alimentăm funcțiile de intrare și etichetele corespunzătoare. Spre deosebire de aceasta, LLM-urile sunt instruite prin învățare nesupravegheată, unde sunt alimentate cu cantități uriașe de date text fără etichete și instrucțiuni. Prin urmare, LLM învață în mod eficient sensul și relațiile dintre cuvintele unei limbi. Acestea pot fi utilizate pentru o mare varietate de sarcini, cum ar fi generarea de text, răspunsul la întrebări, traducerea dintr-o limbă în alta și multe altele.
Ca o cireșă pe deasupra, aceste modele mari de limbă pot fi reglate fin pe setul de date personalizat pentru sarcini specifice domeniului. În acest articol, voi vorbi despre nevoia de reglare fină, despre diferitele LLM-uri disponibile și, de asemenea, voi arăta un exemplu.
Înțelegerea reglajului fin LLM
Să presupunem că conduceți o comunitate de asistență pentru diabet și doriți să creați o linie de asistență online pentru a răspunde la întrebări. Un LLM pre-instruit este instruit mai general și nu ar putea oferi cele mai bune răspunsuri la întrebări specifice domeniului și nu ar putea înțelege termenii și acronimele medicale. Acest lucru poate fi rezolvat prin reglare fină.
Ce înțelegem prin reglaj fin? Ca să spun pe scurt, Transfera
învăţare! Modelele mari de limbaj sunt antrenate pe seturi de date uriașe folosind resurse grele și au milioane de parametri. Reprezentările și modelele lingvistice învățate de LLM în timpul pregătirii preliminare sunt transferate la sarcina dvs. curentă. În termeni tehnici, inițializam un model cu greutățile pre-antrenate și apoi îl antrenăm pe datele noastre specifice sarcinii pentru a ajunge la mai multe greutăți optimizate pentru sarcini pentru parametri. De asemenea, puteți face modificări în arhitectura modelului și puteți modifica straturile în funcție de nevoile dvs.
De ce ar trebui să reglați fin modelele?
- Economisiți timp și resurse: Reglarea fină vă poate ajuta să reduceți timpul de antrenament și resursele necesare decât antrenamentul de la zero.
- Cerințe reduse de date: Dacă doriți să instruiți un model de la zero, veți avea nevoie de cantități uriașe de date etichetate, care sunt adesea indisponibile pentru persoane fizice și întreprinderi mici. Reglarea fină vă poate ajuta să obțineți performanțe bune chiar și cu o cantitate mai mică de date.
- Personalizați în funcție de nevoile dvs.: Este posibil ca LLM-ul pre-instruit să nu înțeleagă terminologia și abrevierile specifice domeniului dvs. De exemplu, un LLM normal nu ar recunoaște că „Tipul 1” și „Tipul 2” înseamnă tipurile de diabet, în timp ce unul reglat poate.
- Activați învățarea continuă: Să presupunem că ne-am ajustat modelul pe datele despre informații despre diabet și l-am implementat. Ce se întâmplă dacă există un nou plan de dietă sau un tratament disponibil pe care doriți să îl includeți? Puteți utiliza greutățile modelului dvs. reglat anterior și îl puteți ajusta pentru a include noile date. Acest lucru poate ajuta organizațiile să își mențină modelele la zi într-un mod eficient.
Alegerea unui model LLM open-source
Următorul pas ar fi să alegeți un model de limbă mare pentru sarcina dvs. Care sunt opțiunile tale? Modelele de limbă mari de ultimă generație disponibile în prezent includ GPT-3, Bloom, BERT, T5 și XLNet. Dintre acestea, GPT-3 (Generative Pretrained Transformers) a arătat cea mai bună performanță, deoarece este antrenat pe 175 de miliarde de parametri și poate gestiona diverse sarcini NLU. Însă, reglarea fină GPT-3 poate fi accesată doar printr-un abonament plătit și este relativ mai scumpă decât alte opțiuni.
Pe de altă parte, BERT este un model de limbă mare open-source și poate fi ajustat gratuit. OARET reprezintă Bi-directional Encoder Decoder Transformers. BERT face o treabă excelentă în înțelegerea reprezentărilor contextuale ale cuvintelor.
Cum alegi?
Dacă sarcina dvs. este mai orientată spre generarea de text, modelele GPT-3 (plătit) sau GPT-2 (sursă deschisă) ar fi o alegere mai bună. Dacă sarcina dvs. se încadrează în clasificarea textului, răspunsul la întrebări sau Recunoașterea entităților, puteți utiliza BERT. Pentru cazul meu de răspuns la întrebări despre diabet, aș continua cu modelul BERT.
Pregătirea și preprocesarea setului de date
Acesta este cel mai important pas al reglajului fin, deoarece formatul datelor variază în funcție de model și sarcină. Pentru acest caz, am realizat un exemplu de document text cu informații despre diabet pe care l-am procurat de la Institutul Național de Sănătate . Puteți utiliza propriile date.
Pentru a regla BERT sarcina de Întrebare-Răspuns, se recomandă conversia datelor în format SQuAD. SQuAD este Stanford Question Answering Dataset și acest format este adoptat pe scară largă pentru antrenarea modelelor NLP pentru sarcini de răspuns la întrebări. Datele trebuie să fie în format JSON, unde fiecare câmp constă din:
context
: Propoziția sau paragraful cu text pe baza căruia modelul va căuta răspunsul la întrebarequestion
: Întrebarea la care dorim să răspundă BERT. Ar trebui să încadrați aceste întrebări pe baza modului în care utilizatorul final ar interacționa cu modelul QA.answers
: Trebuie să furnizați răspunsul dorit în acest câmp. Există două subcomponente sub aceasta,text
șianswer_start
.text
va avea șirul de răspuns. Întrucât,answer_start
denotă indexul, de unde începe răspunsul în paragraful de context.
După cum vă puteți imagina, ar dura mult timp pentru a crea aceste date pentru documentul dvs. dacă ar fi să o faceți manual. Nu vă faceți griji, vă voi arăta cum să o faceți cu ușurință cu instrumentul de adnotare Haystack.
Cum se creează date în format SQuAD cu Haystack?
Folosind instrumentul de adnotare Haystack, puteți crea rapid un set de date etichetat pentru sarcini de răspuns la întrebări. Puteți accesa instrumentul creând un cont pe site-ul lor teren. Creați un nou proiect și încărcați documentul. Îl puteți vizualiza în fila „Documente”, accesați „Acțiuni” și puteți vedea opțiunea de a vă crea întrebări. Vă puteți scrie întrebarea și evidenția răspunsul în document, Haystack ar găsi automat indexul de pornire al acestuia. Am arătat cum am făcut-o pe documentul meu în imaginea de mai jos.
Fig. 1: Crearea unui set de date etichetat pentru Întrebări-Răspunsuri cu Haystack
Când ați terminat de creat suficiente perechi Întrebare-răspuns pentru reglare fină, ar trebui să puteți vedea un rezumat al acestora, așa cum se arată mai jos. În fila „Exportați etichete”, puteți găsi mai multe opțiuni pentru formatul în care doriți să exportați. Alegem formatul de echipă pentru cazul nostru. Dacă aveți nevoie de mai mult ajutor în utilizarea instrumentului, le puteți verifica documentaţie. Acum avem fișierul nostru JSON care conține perechile QA pentru reglare fină.
Cum să reglați fin?
Python oferă multe pachete open-source pe care le puteți utiliza pentru reglare fină. Am folosit pachetul Pytorch și Transformers pentru cazul meu. Începeți prin a importa modulele pachetului folosind pip, managerul de pachete. The transformers
biblioteca oferă a BERTTokenizer
, care este special pentru tokenizarea intrărilor în modelul BERT.
!pip install torch
!pip install transformers import json
import torch
from transformers import BertTokenizer, BertForQuestionAnswering
from torch.utils.data import DataLoader, Dataset
Definirea setului de date personalizat pentru încărcare și preprocesare
Următorul pas este încărcarea și preprocesarea datelor. Puteți folosi Dataset
clasa de la pytorch's utils.data
modul pentru a defini o clasă personalizată pentru setul dvs. de date. Am creat o clasă de set de date personalizată diabetes
după cum puteți vedea în fragmentul de cod de mai jos. The init
este responsabil pentru inițializarea variabilelor. The file_path
este un argument care va introduce calea fișierului de antrenament JSON și va fi folosit pentru inițializare data
. Inițializam BertTokenizer
de asemenea aici.
În continuare, definim a load_data()
funcţie. Această funcție va citi fișierul JSON într-un obiect de date JSON și va extrage contextul, întrebarea, răspunsurile și indexul acestora din acesta. Acesta adaugă câmpurile extrase într-o listă și o returnează.
getitem
folosește tokenizatorul BERT pentru a codifica întrebarea și contextul în tensori de intrare care sunt input_ids
și attention_mask
. encode_plus
va tokeniza textul și va adăuga simboluri speciale (cum ar fi [CLS] și [SEP]). Rețineți că folosim squeeze()
metodă de a elimina orice dimensiune singleton înainte de a introduce în BERT. În cele din urmă, returnează tensorii de intrare procesați.
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
Odată ce l-ați definit, puteți continua și crea o instanță a acestei clase prin trecerea file_path
argument la acesta.
file_path = 'diabetes.json'
dataset = diabetes(file_path)
Instruirea modelului
Voi folosi BertForQuestionAnswering
model, deoarece este cel mai potrivit pentru sarcinile QA. Puteți inițializa greutățile pre-antrenate ale bert-base-uncased
model apelând la from_pretrained
funcție pe model. De asemenea, ar trebui să alegeți funcția de pierdere de evaluare și optimizatorul pe care le-ați folosi pentru antrenament.
Consultați ghidul nostru practic și practic pentru a învăța Git, cu cele mai bune practici, standarde acceptate de industrie și fisa de cheat incluse. Opriți căutarea pe Google a comenzilor Git și de fapt învăţa aceasta!
Folosesc un optimizator Adam și o funcție de pierdere a entropiei încrucișate. Puteți folosi clasa Pytorch DataLoader
pentru a încărca date în loturi diferite și, de asemenea, să le amestecați pentru a evita orice părtinire.
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)
Odată ce încărcătorul de date este definit, puteți continua și scrie bucla finală de antrenament. În timpul fiecărei iterații, fiecare lot obținut din data_loader
conține batch_size
număr de exemple, pe care se realizează propagarea înainte și înapoi. Codul încearcă să găsească cel mai bun set de greutăți pentru parametri, la care pierderea ar fi minimă.
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}")
Aceasta vă completează reglajul fin! Puteți testa modelul setându-l la model.eval()
. Puteți utiliza, de asemenea, reglarea fină a ratei de învățare și a niciunui parametri de epocă pentru a obține cele mai bune rezultate pe datele dvs.
Cele mai bune sfaturi și practici
Iată câteva puncte de reținut atunci când ajustați orice model de limbă mare pe date personalizate:
- Setul dvs. de date trebuie să reprezinte domeniul țintă sau sarcina la care doriți să exceleze modelul lingvistic. Curat iar datele bine structurate sunt esențiale.
- Asigurați-vă că aveți suficiente exemple de antrenament în datele dvs. pentru ca modelul să învețe modele. În caz contrar, modelul ar putea să memoreze exemplele și să supraadapteze, fără capacitatea de a generaliza la exemple nevăzute.
- Alegeți un model pre-antrenat care a fost antrenat pe un corpus care este relevant pentru sarcina dvs. la îndemână. Pentru răspunsul la întrebări, alegem un model pre-antrenat care este antrenat pe setul de date Stanford Question Answering. Similar cu acesta, există diferite modele disponibile pentru sarcini precum analiza sentimentelor, generarea de text, rezumarea, clasificarea textului și multe altele.
- Încerca Acumulare de gradient dacă aveți o memorie GPU limitată. În această metodă, mai degrabă decât actualizarea greutăților modelului după fiecare lot, gradienții sunt acumulați pe mai multe mini-loturi înainte de a efectua o actualizare.
- Dacă vă confruntați cu problema supraajustării în timpul reglajului fin, utilizați regularizare tehnici. Unele metode utilizate în mod obișnuit includ adăugarea de straturi de abandon la arhitectura modelului, implementarea decăderii greutății și normalizarea stratului.
Concluzie
Modelele de limbă mari vă pot ajuta să automatizați multe sarcini într-un mod rapid și eficient. LLM-urile de reglare fină vă ajută să profitați de puterea învățării prin transfer și să o personalizați pentru domeniul dvs. Reglarea fină poate fi esențială dacă setul dvs. de date se află în domenii precum medical, o nișă tehnică, seturi de date financiare și multe altele.
În acest articol am folosit BERT deoarece este open source și funcționează bine pentru uz personal. Dacă lucrați la un proiect la scară largă, puteți opta pentru LLM-uri mai puternice, cum ar fi GPT3, sau alte alternative open source. Amintiți-vă, reglarea fină a modelelor de limbaj mari poate fi costisitoare din punct de vedere computațional și consumatoare de timp. Asigurați-vă că aveți suficiente resurse de calcul, inclusiv GPU-uri sau TPU-uri bazate pe scară.
- Distribuție de conținut bazat pe SEO și PR. Amplifică-te astăzi.
- PlatoData.Network Vertical Generative Ai. Împuterniciți-vă. Accesați Aici.
- PlatoAiStream. Web3 Intelligence. Cunoștințe amplificate. Accesați Aici.
- PlatoESG. Automobile/VE-uri, carbon, CleanTech, Energie, Mediu inconjurator, Solar, Managementul deșeurilor. Accesați Aici.
- BlockOffsets. Modernizarea proprietății de compensare a mediului. Accesați Aici.
- Sursa: https://stackabuse.com/guide-to-fine-tuning-open-source-llms-on-custom-data/
- :are
- :este
- :nu
- :Unde
- $UP
- 1
- 12
- 20
- 8
- a
- Capabil
- Despre Noi
- acces
- accesate
- Cont
- acumulate
- Obține
- acțiuni
- de fapt
- Adam
- adăugare
- Adaugă
- adoptată
- După
- înainte
- AI
- de asemenea
- alternative
- am
- printre
- sumă
- Sume
- an
- analiză
- și
- O alta
- răspunde
- răspunsuri
- Orice
- abordare
- arhitectură
- SUNT
- argument
- articol
- AS
- At
- Încercările
- automatizarea
- în mod automat
- disponibil
- in medie
- evita
- bazat
- BE
- fost
- înainte
- de mai jos
- CEL MAI BUN
- Mai bine
- între
- părtinire
- Miliard
- Floare
- frontieră
- întreprinderi
- dar
- by
- apel
- CAN
- Capacitate
- caz
- Captură
- Modificări
- Chat GPT
- verifica
- alegere
- Alege
- clasă
- clasificare
- cod
- în mod obișnuit
- comunitate
- finalizeaza
- concluzie
- constă
- conține
- context
- contextual
- de conversie a
- Corespunzător
- crea
- a creat
- Crearea
- Trece
- crucial
- Curent
- În prezent
- personalizat
- personaliza
- de date
- seturi de date
- definit
- dislocate
- dorit
- dezvoltat
- dispozitiv
- Diabet
- FĂCUT
- Dietă
- diferit
- Dimensiuni
- diferit
- do
- document
- documente
- face
- domeniu
- domenii
- don
- făcut
- în timpul
- fiecare
- cu ușurință
- eficient
- eficient
- altfel
- permițând
- capăt
- suficient de
- asigura
- entitate
- epocă
- epoci
- esenţial
- evaluare
- Chiar
- EVER
- exemplu
- exemple
- Excel
- excelent
- scump
- exporturile
- extrage
- Față
- Falls
- DESCRIERE
- fed-
- camp
- Domenii
- Fișier
- final
- În cele din urmă
- financiar
- Găsi
- Concentra
- Pentru
- format
- Înainte
- FRAME
- Gratuit
- din
- funcţie
- în general
- generaţie
- generativ
- merge
- Go
- bine
- GPU
- unități de procesare grafică
- gradienți
- ghida
- mână
- manipula
- hands-on
- se întâmplă
- Avea
- Sănătate
- auzit
- greu
- ajutor
- prin urmare
- aici
- Evidențiați
- capotă
- planare
- Cum
- Cum Pentru a
- HTTPS
- mare
- uman
- umilă
- i
- if
- imagine
- imagina
- Punere în aplicare a
- importatoare
- in
- include
- inclus
- Inclusiv
- index
- persoane fizice
- informații
- intrare
- intrări
- instala
- instanță
- instrucțiuni
- interacţiona
- în
- Introducere
- IT
- repetare
- Loc de munca
- JSON
- A pastra
- etichete
- limbă
- mare
- pe scară largă
- strat
- straturi
- AFLAȚI
- învățat
- învăţare
- lăsa
- Pârghie
- LG
- Bibliotecă
- ca
- Limitat
- Listă
- ll
- LLM
- încărca
- încărcător
- încărcare
- de pe
- Lot
- face
- manager
- manieră
- manual
- multe
- masiv
- Mai..
- însemna
- sens
- medical
- Memorie
- metodă
- Metode
- ar putea
- milioane
- minim
- model
- Modele
- modifica
- Module
- Module
- mai mult
- cele mai multe
- mult
- multiplu
- my
- național
- Nevoie
- necesar
- nevoilor
- Nou
- următor
- NIH
- nlp
- Nu.
- normală.
- acum
- număr
- obiect
- obține
- obținut
- of
- promoții
- de multe ori
- on
- ONE
- on-line
- afară
- deschide
- open-source
- Opțiune
- Opţiuni
- or
- organizații
- Altele
- al nostru
- afară
- peste
- propriu
- pachet
- ofertele
- plătit
- perechi
- parametrii
- special
- Care trece
- cale
- modele
- pentru
- performanță
- efectuată
- efectuarea
- personal
- plan
- Plato
- Informații despre date Platon
- PlatoData
- puncte
- posibilităţile de
- putere
- alimentat
- puternic
- Practic
- în prealabil
- Problemă
- Procesat
- proiect
- furniza
- furnizează
- pirtorh
- Q & A
- întrebare
- Întrebări
- Rapid
- repede
- rată
- mai degraba
- ajunge
- Citeste
- recunoaştere
- recunoaște
- recomandat
- reduce
- menționat
- Relaţii
- relativ
- minte
- scoate
- reprezenta
- Cerinţe
- Resurse
- responsabil
- REZULTATE
- Returnează
- Inel
- Alerga
- s
- Spune
- Scară
- zgâria
- Caută
- vedea
- SELF
- propoziție
- sentiment
- set
- instalare
- Umbră
- coală
- să
- Arăta
- indicat
- amestecare
- semnifica
- asemănător
- mic
- întreprinderile mici
- mai mici
- unele
- Sursă
- special
- specific
- specific
- Stackabuse
- standarde
- Standuri
- stanford
- Începe
- Pornire
- de ultimă oră
- Pas
- Stop
- Şir
- abonament
- astfel de
- suficient
- REZUMAT
- a sustine
- sigur
- Lua
- Vorbi
- Ţintă
- Sarcină
- sarcini
- Tehnic
- terminologie
- termeni
- test
- Clasificarea textului
- decât
- acea
- lor
- Lor
- apoi
- Acolo.
- Acestea
- ei
- acest
- Prin
- timp
- consumă timp
- Sfaturi
- la
- tokeniza
- tokenizing
- indicativele
- instrument
- top
- lanternă
- față de
- Tren
- dresat
- Pregătire
- transfer
- transferat
- transformatoare
- tranziţie
- Traducere
- tratament
- încercat
- Două
- tip
- Tipuri
- în
- înţelege
- înţelegere
- spre deosebire de
- up-to-data
- Actualizează
- actualizarea
- utilizare
- utilizat
- Utilizator
- utilizări
- folosind
- varietate
- Vizualizare
- vrea
- we
- greutate
- BINE
- au fost
- Ce
- întrucât
- care
- în timp ce
- larg
- pe larg
- voi
- cu
- fără
- Cuvânt
- cuvinte
- de lucru
- fabrică
- face griji
- ar
- n-ar fi
- scrie
- Tu
- Ta
- zephyrnet