Vai al contenuto principale

Preference Fine-Tuning di OpenAI: una guida con esempi

Scopri come allineare i large language model alle preferenze degli utenti con il preference fine-tuning di OpenAI e la direct preference optimization.
· 8 min leggi

Scopri con l'IA

Preference fine-tuning (PFT) è una tecnica utilizzata da tempo per perfezionare gli LLM. OpenAI l'ha introdotta di recente come parte del loro rollout di funzionalità in 12 giorni.

Insieme al supervised fine-tuning (SFT) e al reinforcement fine-tuning (RFT), il PFT è un altro modo per allineare i large language model alle preferenze degli utenti.

In questo articolo ti spiegherò rapidamente il preference fine-tuning e ti mostrerò come usarlo con il minimo sforzo nella dashboard per sviluppatori di OpenAI.

Che cos'è il Preference Fine-Tuning di OpenAI?

Mentre l'obiettivo del supervised fine-tuning standard è far restituire al modello determinati output dati determinati input, il focus del preference fine-tuning (PFT) è indirizzare il modello verso le risposte che preferiamo e allontanarlo da quelle che non vogliamo.

Direct preference optimization (DPO) è la tecnica standard nel PFT e ha guadagnato popolarità come solida tecnica di allineamento per la sua semplicità ed efficacia.

A differenza del reinforcement learning from human feedback (RLHF), la DPO non richiede un complesso modello di ricompensa per allineare il large language model (LLM), ma tratta invece il problema dell'allineamento come un'ottimizzazione “diretta” di una funzione di loss. Questo rende la DPO più semplice da implementare e più efficiente dal punto di vista computazionale.

Il dataset richiesto per la DPO, come per altri metodi di allineamento, include una coppia di risposte “preferita” e “non preferita” per un determinato prompt. Nel caso del PFT di OpenAI, in modo simile ad altri metodi di fine-tuning, il dataset deve essere in formato JSONL e avere la seguente struttura:

{
  "input": {
    "messages": [
      {
        "role": "user",
        "content": "Hello, can you tell me how cold San Francisco is today?"
      }
    ],
    "tools": [],
    "parallel_tool_calls": true
  },
  "preferred_output": [
    {
      "role": "assistant",
      "content": "Today in San Francisco, it is not quite cold as expected. Morning clouds will give away to sunshine, with a high near 68°F (20°C) and a low around 57°F (14°C)."
    }
  ],
  "non_preferred_output": [
    {
      "role": "assistant",
      "content": "It is not particularly cold in San Francisco today."
    }
  ]
}

La documentazione ufficiale di OpenAI per il PFT consiglia di combinare SFT e PFT per un allineamento migliore. Tecniche di allineamento come il PFT sono comunemente utilizzate dopo aver eseguito il fine-tuning del modello su un dataset supervisionato. Combinare SFT con PFT è considerato uno standard del settore ed è raccomandato anche da OpenAI.

Come formattare il dataset per il Preference Fine-Tuning

Prima di tutto, dobbiamo assicurarci che il nostro dataset sia nel formato richiesto per il preference fine-tuning di OpenAI.

Esistono vari modi per creare un dataset di preferenze. Un metodo consiste nel recuperare coppie di output di LLM a partire da temperature, top_k o system prompts diversi e poi usare un altro LLM, preferibilmente più capace, per scegliere un output come “preferito” e l'altro come “non preferito”.

Per la demo in questo tutorial, scaricherò un dataset di preferenze da Hugging Face e lo ristrutturerò. Userò argilla/ultrafeedback-binarized-preferences, che è un dataset di preferenze, ma prenderò solo le prime 50 righe.

Un esempio di dataset di preferenze da Hugging Face.

Un esempio di dataset di preferenze da Hugging Face.

Per convertire la struttura del dataset nei requisiti di fine-tuning di OpenAI basta uno script Python, ma puoi decidere di seguire un altro approccio in base alla tua applicazione.

import datasets
import copy 
import json

instance_structure = {
  "input": {
    "messages": [
      {
        "role": "user",
        "content": ""
      }
    ],
    "tools": [],
    "parallel_tool_calls": True
  },
  "preferred_output": [
    {
      "role": "assistant",
      "content": ""
    }
  ],
  "non_preferred_output": [
    {
      "role": "assistant",
      "content": ""
    }
  ]
}

ds = datasets.load_dataset("argilla/ultrafeedback-binarized-preferences", trust_remote_code=True, split="train")
ds_sample = ds.select(range(50)) #select the first 50 rows
ds_list = []
for sample in ds_sample:
  instance = copy.deepcopy(instance_structure)
  instance["input"]["messages"][0]["content"] = sample["instruction"]
  instance["preferred_output"][0]["content"] = sample["chosen_response"]
  instance["non_preferred_output"][0]["content"] = sample["rejected_response"]
  ds_list.append(instance)
  
with open("preference_dataset.jsonl", 'w') as out:
  for json_line in ds_list:
      jout = json.dumps(json_line) + '\\n'
      out.write(jout)

Assicurati che il formato del tuo dataset sia jsonl e non json. Probabilmente avrai una riga vuota alla fine del file: ricordati di rimuoverla.

Come eseguire il Preference Fine-Tuning di OpenAI

Con il dataset pronto, puoi seguire questi passaggi per eseguire il preference fine-tuning:

  1. Vai alla dashboard di OpenAI.
  2. Cerca la sezione fine-tuning e seleziona Create per avviare un nuovo job di fine-tuning.
  3. Scegli la direct preference optimization come metodo di fine-tuning.
  4. Carica i dati di training e di validazione (se li hai).

Screenshot del fine-tuning dalla dashboard di OpenAI.

OpenAI ti permette di specificare gli iperparametri, ma puoi anche lasciarli vuoti e sarà il sistema a decidere automaticamente. A seconda delle dimensioni del dataset, il training può richiedere un po' di tempo.

Conclusione

La direct preference optimization è una nuova funzionalità utile nella toolbox del fine-tuning di OpenAI che ti permette di controllare in modo esplicito il tono e lo stile delle risposte del modello e di allinearle meglio alle preferenze degli utenti.

Come per la distillazione di OpenAI, il reinforcement fine-tuning e il supervised fine-tuning, il tuo contributo principale nel preference fine-tuning sarà preparare il dataset secondo il formato e la struttura di OpenAI; ai loro tool penseranno al resto:

Per saperne di più, ti consiglio queste risorse:

Hesam Sheikh Hassani

Autore

Hesam Sheikh Hassani

Studente magistrale in Intelligenza Artificiale e technical writer in ambito AI. Condivido approfondimenti sulle tecnologie AI più recenti, rendo la ricerca di ML accessibile e semplifico argomenti complessi legati all’AI, per aiutarti a restare in prima linea.

Argomenti

Correlato