7.2. Ottimizzazione per seguire istruzioni
Reading time: 5 minutes
tip
L'obiettivo di questa sezione è mostrare come ottimizzare un modello già pre-addestrato per seguire istruzioni piuttosto che generare semplicemente testo, ad esempio, rispondendo a compiti come un chatbot.
Dataset
Per ottimizzare un LLM per seguire istruzioni è necessario avere un dataset con istruzioni e risposte per ottimizzare il LLM. Ci sono diversi formati per addestrare un LLM a seguire istruzioni, ad esempio:
- L'esempio dello stile di prompt Apply Alpaca:
Below is an instruction that describes a task. Write a response that appropriately completes the request.
### Instruction:
Calculate the area of a circle with a radius of 5 units.
### Response:
The area of a circle is calculated using the formula \( A = \pi r^2 \). Plugging in the radius of 5 units:
\( A = \pi (5)^2 = \pi \times 25 = 25\pi \) square units.
- Esempio di Stile Prompt Phi-3:
<|User|>
Can you explain what gravity is in simple terms?
<|Assistant|>
Absolutely! Gravity is a force that pulls objects toward each other.
Addestrare un LLM con questo tipo di set di dati invece di semplici testi grezzi aiuta il LLM a capire che deve fornire risposte specifiche alle domande che riceve.
Pertanto, una delle prime cose da fare con un set di dati che contiene richieste e risposte è modellare quei dati nel formato di prompt desiderato, come:
# Code from https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/ch07.ipynb
def format_input(entry):
instruction_text = (
f"Below is an instruction that describes a task. "
f"Write a response that appropriately completes the request."
f"\n\n### Instruction:\n{entry['instruction']}"
)
input_text = f"\n\n### Input:\n{entry['input']}" if entry["input"] else ""
return instruction_text + input_text
model_input = format_input(data[50])
desired_response = f"\n\n### Response:\n{data[50]['output']}"
print(model_input + desired_response)
Poi, come sempre, è necessario separare il dataset in set per l'addestramento, la validazione e il test.
Batching & Data Loaders
Poi, è necessario raggruppare tutti gli input e gli output attesi per l'addestramento. Per questo, è necessario:
- Tokenizzare i testi
- Aggiungere padding a tutti i campioni alla stessa lunghezza (di solito la lunghezza sarà grande quanto la lunghezza del contesto utilizzato per pre-addestrare il LLM)
- Creare i token attesi spostando di 1 l'input in una funzione di collate personalizzata
- Sostituire alcuni token di padding con -100 per escluderli dalla perdita di addestramento: Dopo il primo token
endoftext
, sostituire tutti gli altri tokenendoftext
con -100 (perché usarecross_entropy(...,ignore_index=-100)
significa che ignorerà i target con -100) - [Opzionale] Mascherare usando -100 anche tutti i token appartenenti alla domanda in modo che il LLM impari solo a generare la risposta. Nello stile Apply Alpaca questo significherà mascherare tutto fino a
### Response:
Con questo creato, è tempo di creare i data loader per ciascun dataset (addestramento, validazione e test).
Load pre-trained LLM & Fine tune & Loss Checking
È necessario caricare un LLM pre-addestrato per affinare. Questo è già stato discusso in altre pagine. Poi, è possibile utilizzare la funzione di addestramento precedentemente utilizzata per affinare il LLM.
Durante l'addestramento è anche possibile vedere come la perdita di addestramento e la perdita di validazione variano durante le epoche per vedere se la perdita si sta riducendo e se si sta verificando overfitting.
Ricorda che l'overfitting si verifica quando la perdita di addestramento si sta riducendo ma la perdita di validazione non si sta riducendo o addirittura aumentando. Per evitare questo, la cosa più semplice da fare è fermare l'addestramento all'epoca in cui inizia questo comportamento.
Response Quality
Poiché questo non è un fine-tuning di classificazione in cui è possibile fidarsi maggiormente delle variazioni di perdita, è anche importante controllare la qualità delle risposte nel set di test. Pertanto, è consigliato raccogliere le risposte generate da tutti i set di test e controllare manualmente la loro qualità per vedere se ci sono risposte sbagliate (nota che è possibile per il LLM creare correttamente il formato e la sintassi della frase di risposta ma fornire una risposta completamente errata. La variazione della perdita non rifletterà questo comportamento).
Nota che è anche possibile eseguire questa revisione passando le risposte generate e le risposte attese a altri LLM e chiedere loro di valutare le risposte.
Altri test da eseguire per verificare la qualità delle risposte:
- Measuring Massive Multitask Language Understanding (MMLU): MMLU valuta la conoscenza e le capacità di problem-solving di un modello in 57 soggetti, comprese le scienze umane, le scienze e altro. Utilizza domande a scelta multipla per valutare la comprensione a vari livelli di difficoltà, dall'elementare all'avanzato professionale.
- LMSYS Chatbot Arena: Questa piattaforma consente agli utenti di confrontare le risposte di diversi chatbot fianco a fianco. Gli utenti inseriscono un prompt e più chatbot generano risposte che possono essere confrontate direttamente.
- AlpacaEval: AlpacaEval è un framework di valutazione automatizzato in cui un LLM avanzato come GPT-4 valuta le risposte di altri modelli a vari prompt.
- General Language Understanding Evaluation (GLUE): GLUE è una raccolta di nove compiti di comprensione del linguaggio naturale, tra cui analisi del sentiment, implicazione testuale e risposta a domande.
- SuperGLUE: Basato su GLUE, SuperGLUE include compiti più impegnativi progettati per essere difficili per i modelli attuali.
- Beyond the Imitation Game Benchmark (BIG-bench): BIG-bench è un benchmark su larga scala con oltre 200 compiti che testano le capacità di un modello in aree come ragionamento, traduzione e risposta a domande.
- Holistic Evaluation of Language Models (HELM): HELM fornisce una valutazione completa attraverso vari metriche come accuratezza, robustezza e equità.
- OpenAI Evals: Un framework di valutazione open-source di OpenAI che consente di testare modelli AI su compiti personalizzati e standardizzati.
- HumanEval: Una raccolta di problemi di programmazione utilizzati per valutare le capacità di generazione di codice dei modelli di linguaggio.
- Stanford Question Answering Dataset (SQuAD): SQuAD consiste in domande su articoli di Wikipedia, dove i modelli devono comprendere il testo per rispondere accuratamente.
- TriviaQA: Un dataset su larga scala di domande e risposte trivia, insieme a documenti di prova.
e molti altri
Follow instructions fine-tuning code
Puoi trovare un esempio del codice per eseguire questo fine-tuning in https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py