LangChain 101 Parte 2d. Affinamento delle LLM con il feedback umano

LangChain 101 Parte 2d. Miglioramento delle LLM con il supporto umano

Questa è la parte 2d e l’ultima parte della sezione dei modelli del corso LangChain 101. È vivamente consigliato controllare le prime due parti per capire meglio il contesto di questo articolo.

LangChain 101: Parte 2ab. Tutto quello che devi sapere su (grandi modelli di lingua)

Questa è la parte 2ab del corso LangChain 101. È vivamente consigliato controllare la prima parte per capire il…

pub.towardsai.net

LangChain 101: Parte 2c. Fine-tuning LLM con PEFT, LORA e RL

Tutto quello che devi sapere sul fine-tuning LLM, PEFT, LORA e sulla formazione di grandi modelli di lingua

pub.towardsai.net

(segui l’autore per non perderti la prossima parte).

RLHF (Reinforcement Learning from Human Feedback – Apprendimento per Rinforzo da Feedback Umano) è un componente importante del metodo di allenamento attuale dei modelli di linguaggio avanzati. Aiuta a includere il feedback delle persone durante il fine-tuning dei modelli, rendendo alla fine il modello più prezioso e sicuro.

Andiamo attraverso i metodi di allenamento più comuni:

Modello di base

Un modello di base è un grande modello di linguaggio pre-addestrato su un enorme dataset generalista di testo (a volte codice): GPT, LLAMA, Falcon e altri.

I modelli di base sono buoni per la generazione di testo per domini ad uso generico. Tuttavia, le loro prestazioni per compiti o domini specifici possono essere carenti in termini di qualità.

Prompting

Prompting è una tecnica che migliora le prestazioni dei LLM fornendo al modello un prompt specifico per il compito.

Ad esempio, supponiamo che tu voglia che un LLM ti dia consigli di cucina. In tal caso, potresti aggiungere qualcosa come “Agisci come un cuoco professionista Michellene” all’inizio della tua richiesta. Il LLM utilizzerà poi questo prompt per “agire come un cuoco esperto”.

Prompting è un modo semplice per migliorare le prestazioni dei LLM. Tuttavia, richiede una progettazione del prompt ed è meno efficace per compiti che richiedono informazioni aggiuntive e lessico differente rispetto a quello su cui è stato addestrato il LLM pre-addestrato.

Fine-tuning

Il fine-tuning è una tecnica che migliora le prestazioni dei LLM addestrandoli su specifici dataset – esempi dell’input e dell’output desiderati.

Ad esempio, se vuoi fare il fine-tuning di un LLM per tradurre dall’inglese all’arabo, devi fornire un dataset di coppie di traduzioni inglese-arabo.

Il fine-tuning di solito è più efficace del prompting per compiti che richiedono al LLM di apprendere molte nuove informazioni e dati. Tuttavia, richiede più dati e risorse computazionali.

LangChain 101: Parte 2c. Fine-tuning LLM con PEFT, LORA e RL

Tutto quello che devi sapere sul fine-tuning LLM, PEFT, LORA e sulla formazione di grandi modelli di lingua

pub.towardsai.net

Fine-tuning + RLHF

Il fine-tuning con apprendimento per rinforzo da feedback umano (RLHF) è una tecnica che migliora le prestazioni dei LLM addestrandoli su specifici dataset di dati etichettati classificati da valutatori umani. Questi dati includono esempi dell’input e dell’output desiderati per il compito e il feedback dei valutatori umani sulla qualità produttiva.

Il fine-tuning con RLHF di solito è più efficace del solo fine-tuning, soprattutto per compiti che richiedono al LLM di apprendere valori e preferenze umane. Tuttavia, richiede ancora più dati, risorse computazionali e sforzo umano.

Basato sulla ricerca: https://arxiv.org/pdf/2203.02155.pdf

(Instruct) GPT RLHF pipeline

Analizziamo più da vicino come è costruito il pipeline Instruct RLHF (molto probabilmente il pipeline ChatGPT assomiglia).

Il pipeline Instruct (GPT) RLHF prevede l’utilizzo di un modello preaddestrato e il suo affinamento attraverso l’addestramento supervisionato (simile al “fine-tuning supervisato” nel pipeline di addestramento tradizionale). Successivamente, il modello aggiornato viene ulteriormente affinato utilizzando l’ottimizzazione delle politiche prossimali.

Il pipeline RLHF può essere riassunto in un processo di addestramento a 3 fasi:

  1. Addestramento affinato del modello preaddestrato tramite supervisione
  2. Sviluppo di un modello per fornire ricompense
  3. Affinamento aggiuntivo tramite ottimizzazione delle politiche prossimali (PPO)

Nella prima fase del pipeline RLHF, generiamo o selezioniamo prompt (potenzialmente da un dataset o da un database) e richiediamo agli umani di produrre risposte di alta qualità. Utilizziamo questa raccolta di dati per affinare in modo guidato il modello di base preesistente.

Fase 1. (Instruct) GPT RLHF pipeline

Nella fase 2 del pipeline RLHF, utilizziamo il modello affinato tramite addestramento supervisionato per costruire un modello di ricompense per il passaggio successivo. Ciò comporta la generazione di risposte multiple per ogni prompt e la valutazione di queste risposte da parte degli individui in base alle preferenze.

Per trasformare il modello dalla fase 1 del pipeline RLHF in un modello di ricompense, sostituiamo il suo strato di output (lo strato next-token) con uno strato di regressione con un singolo nodo di output.

Fase 2. (Instruct) GPT RLHF pipeline

Nella terza e ultima fase del pipeline RLHF, utilizziamo il modello di ricompense (v2) per ulteriori affinamenti del modello precedente che è stato sottoposto a un affinamento supervisionato (v1).

Regoliamo il modello v1 utilizzando l’ottimizzazione delle politiche prossimali (PPO) guidata dai punteggi di ricompensa ottenuti dal modello di ricompense che abbiamo stabilito nella fase 2 del pipeline RLHF.

Fase 3. (Instruct) GPT RLHF pipeline

E questo è praticamente come funziona il pipeline (Instruct) GPT RLHF. Questo metodo offre risultati di qualità, ma richiede molto tempo ed impegno umano. Possiamo farlo in modo più efficace?

(Instruct) GPT RLHF pipeline

LLAMA RLHF pipeline

Il modello Meta AI Llama 2, pur utilizzando un approccio RLHF simile a InstructGPT, introduce alcune differenze notevoli:

  • Due modelli di ricompensa
  • Perdita di margine
  • Campionamento di rifiuto

Due modelli di ricompensa: Llama2 utilizza due modelli di ricompensa, uno incentrato sull’utilità e l’altro sulla sicurezza. L’ottimizzazione finale del modello si basa sulla combinazione di questi due punteggi.

Perdita di margine: Llama2 introduce una denominazione “margine” nel ranking delle risposte del modello, che misura il divario tra le preferenze. Questo parametro di margine aiuta a perfezionare il calcolo della perdita di ranking.

Fase 2. LLAMA RLHF pipeline

Rejection Sampling: Llama2 utilizza un approccio RLHF iterativo, creando multiple versioni del modello (da RLHF-V1 a RLHF-V5). Oltre a PPO, utilizzano il rejection sampling.

Questa tecnica genera più output e seleziona il più alto reward per gli aggiornamenti del gradient durante l’ottimizzazione. È diverso da PPO, che si aggiorna basandosi su un singolo campione.

Step 3. LLAMA RLHF pipeline

Il diagramma finale avrà questo aspetto:

LLAMA RLHF pipeline

Si vede che scegliere una migliore risposta tra 2 è più veloce che classificare un insieme di 4. Aggiungere un margine aiuta anche il modello ad imparare più velocemente, poiché è simile a un processo di addestramento ML classico. Infine, rifiutare campioni sembra un concetto interessante per ottenere qualità alla fine del processo.

Menzioni d’onore

Prima di passare al codice, vorrei elencare alcune altre tecniche per RLHF:

I ricercatori introducono un metodo di auto-addestramento basato su un insieme di regole fornite dagli esseri umani.

Lo studio introduce HIR (Hindsight Instruction Labeling), un metodo a due fasi che coinvolge il campionamento e l’addestramento della prompt, che converte efficacemente i casi in cui il Modello Linguistico si discosta dalle istruzioni.

Lo studio su RLAIF dimostra che i punteggi utilizzati per l’addestramento del modello di reward in RLHF possono essere generati da un LLM anziché affidarsi esclusivamente all’input umano.

ReST è un metodo che allinea i modelli linguistici alle preferenze umane attraverso un approccio basato sul campionamento, addestrandosi iterativamente su sottoinsiemi di qualità progressivamente più elevata per migliorare la sua funzione di reward

Tempo di codificare

Il codice completo è disponibile su GitHub.

Prima di tutto, è necessario definire i parametri generali di addestramento e di configurazione di Lora che utilizzeremo. Questo è molto simile al codice della parte di ottimizzazione del fine-tuning della serie.

from transformers import TrainingArgumentsfrom peft import LoraConfig# Preparazione dei parametri di trainingtraining_args = TrainingArguments(    output_dir="./train_logs",  # Cartella di output    max_steps=100,  # Numero massimo di step di addestramento    per_device_train_batch_size=4,  # Dimensione del batch per GPU addestrativa    gradient_accumulation_steps=1,  # Numero di step per accumulare i gradienti    learning_rate=1.0e-4,  # Tasso di apprendimento    optim="adamw_torch",  # Ottimizzatore    save_steps=50,  # Frequenza di salvataggio dei checkpoint    logging_steps=10,  # Frequenza di registrazione delle informazioni di addestramento    report_to="tensorboard",  # Metodo di report (in questo caso, TensorBoard)    remove_unused_columns=False,  # Se rimuovere le colonne non utilizzate    evaluation_strategy="steps",  # Strategia di valutazione    num_train_epochs=5,  # Numero di epoche di addestramento)# Preparazione dei parametri PEFTpeft_config = LoraConfig(    r=16,  # Valore di r    lora_alpha=16,  # Valore di lora_alpha    bias="none",  # Impostazione del bias    task_type="SEQ_CLS",  # Tipo di task (Classificazione Sequenziale)    modules_to_save=["scores"],  # Moduli da salvare)

Ora è il momento di definire il nostro pipeline RLHF.

Prima di tutto, definiamo i nostri dati. Di solito, RLHF è ottimo per la produzione quando si dispone di un dataset di domande erroneamente risposte. Potrebbe essere una risposta negativa, per esempio.

In seguito, formattiamo e suddividiamo questo dataset per usarlo per addestrare e testare il nostro modello. Ora che abbiamo il feedback umano in atto, specifichiamo il codice per l’apprendimento per rinforzo:

from trl import RewardTrainer # Preparazione di RewardTrainertrainer = RewardTrainer( model=model, # Il modello per l'apprendimento per rinforzo tokenizer=tokenizer, # Il tokenizer per l'elaborazione dei dati di input args=training_args, # Argomenti di addestramento train_dataset=formatted_dataset["train"], # Dataset di addestramento eval_dataset=formatted_dataset["test"], # Dataset di valutazione peft_config=peft_config, # Configurazione di PEFT max_length=512, # Lunghezza massima dell'input) # Esecuzione dell'addestramentotrainer.train() # Salvataggio del modello di ricompensa precedentemente addestratotrainer.model.save_pretrained("./reward_model")

Questo è tutto ciò di cui abbiamo bisogno per eseguire l’apprendimento per rinforzo con il feedback umano!

Ora sai quando usare RLHF, come dovrebbero apparire i dati e come eseguire il codice.

Questo è la fine di Parte 2d. Questa è l’ultima parte della sezione Modelli del mio corso LangChain 101.

Applaude e seguimi, perché questo mi motiva a scrivere nuovi articoli 🙂