Vai al contenuto principale

Capire il Prompt Tuning: migliora i tuoi modelli linguistici con precisione

Il prompt tuning è una tecnica utilizzata per migliorare le prestazioni di un modello linguistico pre-addestrato senza modificarne l’architettura interna.

Scopri con l'IA

Nel campo in rapida evoluzione dei Large Language Model (LLM), restare al passo con approcci all’avanguardia come il prompt tuning è fondamentale. Questa tecnica, applicata a modelli fondamentali già addestrati, migliora le prestazioni senza i costi computazionali elevati associati al training tradizionale dei modelli.

In questo articolo esploreremo le basi del prompt tuning, lo confronteremo con il fine-tuning e il prompt engineering e ne discuteremo i principali vantaggi. Forniremo anche un esempio pratico utilizzando la piattaforma di HuggingFace, in cui eseguiamo il prompt tuning di un modello bloomz-560m. Questa guida ha l’obiettivo di approfondire la tua comprensione del prompt tuning e ispirarne l’integrazione nei tuoi progetti.

Che cos’è il Prompt Tuning?

Il prompt tuning è una tecnica pensata per migliorare le prestazioni di un modello linguistico pre-addestrato senza alterarne l’architettura di base. Invece di modificare i pesi strutturali profondi del modello, il prompt tuning regola i prompt che guidano la risposta del modello. Questo metodo si basa sull’introduzione di "soft prompt", un insieme di parametri ottimizzabili inseriti all’inizio della sequenza di input.

Diagramma tratto dal paper di ricerca "The Power of Scale for Parameter-Efficient Prompt Tuning".

Fonte dell’immagine

Il diagramma confronta l’approccio tradizionale di tuning del modello con il prompt tuning. Nota che nel model tuning ogni task richiede un modello separato. Il prompt tuning, invece, utilizza lo stesso modello fondamentale su più task regolando prompt specifici per il task.

Come funziona il prompt tuning?

1. Inizializzazione dei soft prompt

I soft prompt sono token costruiti artificialmente che vengono aggiunti alla sequenza di input del modello. Questi prompt possono essere inizializzati in diversi modi. È comune l’inizializzazione casuale, ma possono anche essere inizializzati sulla base di determinate euristiche. Una volta inizializzati, i soft prompt vengono anteposti ai dati di input. Quando il modello elabora questi dati, considera sia i soft prompt sia l’input reale.

2. Forward pass e valutazione della loss

Il processo di training è solitamente simile a quello dell’addestramento di una rete neurale profonda (DNN) standard. Si inizia con una forward pass in cui il modello elabora l’input combinato attraverso i propri livelli, producendo un output. Questo output viene quindi confrontato con il risultato desiderato utilizzando una funzione di perdita, che misura la discrepanza tra l’output del modello e il valore atteso effettivo.

Backpropagation

Durante la backpropagation, gli errori vengono propagati all’indietro attraverso la rete. Tuttavia, invece di regolare i pesi della rete, modifichiamo solo i parametri dei soft prompt. Questo processo si ripete per più epoche, con i soft prompt che imparano gradualmente a guidare l’elaborazione degli input da parte del modello in modo da minimizzare l’errore per il task dato.

Iterazione

Il processo di forward pass, valutazione della loss e backpropagation viene ripetuto per più epoche. Nel tempo, questi soft prompt imparano a modellare l’input in modi che riducono costantemente il punteggio di loss, migliorando così le prestazioni del modello sul task specifico senza compromettere le sue capacità sottostanti.

Prompt Tuning VS Fine-Tuning VS Prompt Engineering

Prompt tuning, fine-tuning e prompt engineering sono tre metodi distinti applicati a LLM pre-addestrati per migliorarne le prestazioni su un task specifico. Questi metodi non si escludono a vicenda e ciascuno è adatto a un particolare caso d’uso.

Fine-tuning

Il fine-tuning è il più intensivo in termini di risorse e comporta un ri-addestramento completo del modello su un dataset specifico per uno scopo preciso. Questo regola i pesi del modello pre-addestrato, ottimizzandolo per le sfumature dettagliate dei dati, ma richiede notevoli risorse computazionali e aumenta il rischio di overfitting. Molti LLM come ChatGPT vengono sottoposti a fine-tuning dopo il training generico iniziale sul compito di previsione della parola successiva. Il fine-tuning insegna a questi modelli a funzionare come assistenti digitali, rendendoli significativamente più utili di un modello addestrato in modo generale.

Prompt tuning

Il prompt tuning regola un insieme di parametri aggiuntivi, noti come "soft prompt", che sono integrati nell’elaborazione dell’input del modello. Questo metodo modifica il modo in cui il modello interpreta i prompt di input senza una revisione completa dei suoi pesi, offrendo un equilibrio tra miglioramento delle prestazioni ed efficienza delle risorse. È particolarmente prezioso quando le risorse computazionali sono limitate o quando è richiesta flessibilità su più task, perché dopo l’applicazione della tecnica i pesi originali del modello rimangono invariati.

Prompt engineering

Il prompt engineering, invece, non prevede alcun training o ri-addestramento. Si basa completamente sull’utente che progetta i prompt per il modello. Richiede una comprensione sfumata delle capacità di elaborazione del modello e sfrutta la conoscenza intrinseca incorporata nel modello. Il prompt engineering non richiede risorse computazionali, poiché si affida esclusivamente alla formulazione strategica degli input per ottenere risultati. Dai un’occhiata al corso di DataCamp su prompt engineering per sviluppatori per saperne di più. 

Confronto

Ognuna di queste tecniche offre un approccio diverso per sfruttare le capacità dei modelli pre-addestrati. La scelta tra esse dipende dalle esigenze specifiche dell’applicazione, come la disponibilità di risorse computazionali, il requisito di personalizzazione del modello e il livello desiderato di intervento sui parametri di apprendimento del modello.

Metodo

Intensità di risorse

Training richiesto

Ideale per

Fine-Tuning

Alta

Sì

Task che richiedono profonda personalizzazione del modello

Prompt Tuning

Bassa

Sì

Mantenere l’integrità del modello tra più task

Prompt Engineering

Nessuna

No

Adattamenti rapidi senza costo computazionale.

Ogni metodo ha il suo spazio in base alle esigenze specifiche del tuo progetto.

Vantaggi del Prompt Tuning

Il prompt tuning porta in dote diversi vantaggi chiave, che lo rendono una tecnica imprescindibile per ottimizzare i Large Language Model.

Efficienza delle risorse

Il prompt tuning mantiene invariati i parametri del modello pre-addestrato, riducendo sensibilmente la potenza computazionale necessaria. Questa efficienza è cruciale soprattutto in contesti con risorse limitate, permettendo un uso sofisticato dei modelli senza costi elevati. Con l’aumentare della dimensione media dei modelli fondamentali, "congelare" i parametri del modello diventa ancora più allettante, poiché non è necessario distribuire un modello separato per ciascun task.

Implementazione rapida

A differenza del fine-tuning completo, il prompt tuning richiede la regolazione solo di un piccolo insieme di parametri dei soft prompt. Questo velocizza il processo di adattamento, consentendo passaggi più rapidi tra task diversi e riducendo i tempi di fermo.

Integrità del modello e mantenimento della conoscenza

Mantenendo intatte l’architettura e i pesi del modello, il prompt tuning preserva le capacità e le conoscenze originarie incorporate nel modello pre-addestrato. Ciò è fondamentale per mantenere affidabilità e generalizzabilità del modello in varie applicazioni.

Flessibilità sui task

Il prompt tuning consente di utilizzare un unico modello fondamentale per più task semplicemente cambiando i soft prompt. Questo approccio riduce la necessità di addestrare e mantenere modelli separati per ogni task specifico, migliorando la scalabilità e semplificando la gestione dei modelli.

Minore intervento umano

Il prompt tuning richiede un intervento umano significativamente inferiore rispetto al prompt engineering, in cui la redazione accurata di prompt per un determinato task può essere soggetta a errori e richiedere molto tempo. Al contrario, l’ottimizzazione automatizzata dei soft prompt durante il training riduce al minimo l’errore umano e massimizza l’efficienza.

Prestazioni competitive

Le ricerche indicano che, per modelli di grandi dimensioni, il prompt tuning può raggiungere livelli di prestazioni paragonabili a quelli del fine-tuning. Questo vantaggio diventa sempre più significativo con la crescita delle dimensioni dei modelli, combinando alta efficienza con risultati solidi.

Approccio passo dopo passo al Prompt Tuning

Per questa guida applicheremo il prompt tuning al modello bloomz-560m di BigScience. Lavoreremo nell’ecosistema Hugging Face utilizzando la libreria PEFT (Parameter-Efficient Fine-Tuning).

Sebbene qui ci concentreremo sul task di causal language modeling, la libreria PEFT supporta vari task, modelli e tecniche di tuning. Puoi trovare metodi PEFT compatibili per altri modelli e task nella pagina di documentazione di PEFT.

Schermata tratta dalla pagina di documentazione della libreria PEFT.

1. Caricamento del modello e del tokenizer

Per iniziare, carichiamo il modello e il tokenizer dal modello bloomz-560m di BigScience. Il tokenizer serve a processare gli input testuali, mentre il modello fondamentale gestisce i task di causal language modeling. Il parametro trust_remote_code=True ti consente di usare codice personalizzato fornito dai maintainer del modello per architetture specifiche.

Sebbene ciò sia utile per ottenere funzionalità complete, fidati del codice del modello solo se proviene da una fonte affidabile. Evita di usare codice non verificato per modelli di creatori sconosciuti o non verificati, poiché potrebbe comportare rischi di sicurezza o stabilità.

from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "bigscience/bloomz-560m"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    trust_remote_code=True
)

2. Inferenza con un modello fondamentale

Prima di qualsiasi tuning, è essenziale stabilire una baseline eseguendo l’inferenza con il modello fondamentale non ottimizzato. Usando un prompt come "I want you to act as a logistician", possiamo osservare come il modello generi risposte senza ulteriori modifiche. Assicurati di includere uno spazio extra dopo il prompt, altrimenti il modello potrebbe non generare nulla.

Questo serve come riferimento per confrontare i miglioramenti dopo il tuning.

Useremo una funzione personalizzata generate_text per semplificarci la vita.

def generate_text(model, tokenizer, prompt_text, max_tokens):
    prompt_text = tokenizer(prompt_text, return_tensors="pt")
    outputs = model.generate(
        input_ids=prompt_text["input_ids"],
        attention_mask=prompt_text["attention_mask"],
        max_length=max_tokens,
        repetition_penalty=1.5,
        eos_token_id=tokenizer.eos_token_id
    )
    return tokenizer.batch_decode(outputs, skip_special_tokens=True)


initial_output = generate_text(model, tokenizer, "I want you to act as a logistician. ", 100)
print("Initial model output:", initial_output)

Questo è l’output del modello:

['I want you to act as a logistician. You will be able to: Analyze the data']

Come vedi, il modello non è del tutto sicuro del contesto.

3. Dataset

Il dataset è un elemento cruciale del prompt tuning. Usiamo il dataset `awesome-chatgpt-prompts` per il tuning. Questo dataset fornisce contenuti motivazionali per il tuning, assicurando che il modello adatti di conseguenza le sue risposte.

from datasets import load_dataset

dataset_prompt = "fka/awesome-chatgpt-prompts"


data_prompt = load_dataset(dataset_prompt)
data_prompt = data_prompt.map(lambda x: tokenizer(x["prompt"]), batched=True)
train_prompts = data_prompt["train"].select(range(50))

Tokenizziamo il dataset e prepariamo un piccolo sottoinsieme per l’addestramento.

4. Tuning

Ora la parte più interessante: configuriamo il prompt tuning usando la classe PromptTuningConfig della libreria PEFT.

from peft import  get_peft_model, PromptTuningConfig, TaskType, PromptTuningInit

tuning_config = PromptTuningConfig(
    task_type=TaskType.CAUSAL_LM, #This type indicates the model will generate text.
    prompt_tuning_init=PromptTuningInit.RANDOM,  #The added virtual tokens are initializad with random numbers
    num_virtual_tokens=4, #Number of virtual tokens to be added and trained.
    tokenizer_name_or_path=model_name
)

peft_model = get_peft_model(model, tuning_config)

Gli argomenti di training sono specificati usando la classe TrainingArguments.

from transformers import TrainingArguments
training_args = TrainingArguments(
    use_cpu=True, # This is necessary for CPU clusters.
    output_dir = "./",
    auto_find_batch_size=True, # Find a suitable batch size that will fit into memory automatically, you can also use a custom batch size
    learning_rate= 0.005,
    num_train_epochs=5 
    )

Un oggetto Trainer gestisce il processo di training. Con DataCollatorForLanguageModeling, il data collator garantisce che i campioni di training siano formattati correttamente. La fase di training viene avviata con il metodo train, ottimizzando il modello bloomz-560m per i task di prompt specifici.

from transformers import Trainer, DataCollatorForLanguageModeling
trainer = Trainer(
    model=peft_model, # We pass in the PEFT version of the foundation model, bloomz-560M
    args=training_args, #The args for the training.
    train_dataset=train_prompts, #The dataset used to train the model.
    data_collator=DataCollatorForLanguageModeling(tokenizer, mlm=False) # mlm=False indicates not to use masked language modeling
    )
trainer.train()

5. Inferenza con un modello ottimizzato

Il modello ottimizzato è memorizzato all’interno dell’oggetto trainer; possiamo usare trainer.model per accedervi. Usiamo la funzione generate_text per eseguire l’inferenza con il modello ottimizzato!

tuned_output = generate_text(trainer.model, tokenizer, "I want you to act as a logistician. ", 100)
print("Tuned model output:", tuned_output)

Ecco l’output del modello ottimizzato:

['I want you to act as a logistician. You will be responsible for the logistics of your business.']

Come puoi vedere ora, il modello sa cosa fa un logistician. Sentiti libero di sperimentare con prompt, modelli e dataset diversi!

Approfondisci con l’AI generativa

Il prompt tuning è uno strumento potente per rendere i Large Language Model più efficienti su un task specifico. Abbiamo esplorato il prompt tuning spiegando prima che cos’è e come funziona. Poi lo abbiamo confrontato con altre tecniche simili: fine-tuning e prompt engineering. Infine, ne abbiamo discusso i vantaggi e abbiamo seguito una guida passo passo per applicare il prompt tuning a un modello pre-addestrato.

Man mano che il campo dell’AI generativa continua a evolversi, è importante restare aggiornati sugli ultimi sviluppi. Per migliorare ulteriormente le tue competenze e la tua comprensione dell’AI, Datacamp offre una varietà di risorse approfondite. Ti invito a esplorare questi tutorial completi:

Dimitri Didmanidze

Autore

Dimitri Didmanidze

Sono Dimitri Didmanidze, un data scientist attualmente iscritto a un Master in Matematica con focus sul Machine Learning. Il mio percorso accademico ha incluso anche ricerche sulle capacità dei modelli basati su transformer e attività di docenza a livello universitario, che hanno arricchito la mia comprensione di concetti teorici complessi. Ho inoltre lavorato nel settore bancario, dove ho applicato questi principi per affrontare sfide concrete legate ai dati.

Argomenti

Correlato