
[NeurIPS '25] Codice per il paper "IF-Guide: Soppressione dei dati di addestramento dannosi guidata dalla funzione di influenza per ridurre la tossicità degli LLM"
Questa repository contiene il codice per IF-Guide, la tecnica di disintossicazione degli LLM introdotta nel nostro articolo:
Puoi usare il nostro metodo per disintossicare gli LLM identificando esempi di addestramento dannosi e poi sopprimendoli durante il pre-addestramento o il fine-tuning!
Studiamo come i dati di addestramento contribuiscono all'emergere di comportamenti tossici nei modelli linguistici di grandi dimensioni. Gran parte dei lavori precedenti sulla riduzione della tossicità dei modelli adotta approcci reattivi, come il fine-tuning di modelli pre-addestrati (e potenzialmente tossici) per allinearli ai valori umani. Al contrario, proponiamo un approccio proattivo-IF-Guide-che sfrutta le funzioni di influenza per identificare i token dannosi in qualsiasi dato di addestramento e sopprimerne l'impatto durante l'addestramento. A tal fine, mostriamo innanzitutto che le funzioni di influenza standard non sono efficaci nell'individuare record di addestramento dannosi. Presentiamo poi un nuovo adattamento che misura le attribuzioni a livello di token dai dati di addestramento alla tossicità del modello, insieme a tecniche per selezionare i documenti di addestramento tossici e a un obiettivo di apprendimento che può essere integrato sia nel pre-addestramento che nel fine-tuning. Inoltre, IF-Guide non si basa su dati di preferenze umane, generalmente richiesti dai metodi di allineamento esistenti. Nella valutazione, dimostriamo che IF-Guide riduce sostanzialmente sia la tossicità esplicita che quella implicita-fino a 10× rispetto ai modelli non censurati, e fino a 3× rispetto ai metodi di allineamento di base, ad es., DPO e RAD-in entrambi gli scenari di pre-addestramento e fine-tuning. IF-Guide è computazionalmente efficiente: non è necessario un modello con un miliardo di parametri per calcolare i punteggi di influenza; un modello con un milione di parametri-con 7.5× meno parametri-può fungere efficacemente da proxy per identificare i dati dannosi.
Crea l'ambiente conda (puoi usare qualsiasi ambiente con python>=3.10) e installa i pacchetti necessari:
conda create -n IF-Guide python=3.10
conda activate IF-Guide
pip install -r requirements.txt
Nota: Usiamo il pacchetto Kronfluence per calcolare i punteggi di influenza con EK-FAC. Abbiamo creato un'implementazione personalizzata che supporta la tecnica dell'influenza differenziale introdotta nel nostro articolo (pagina 4, Eq. 6). Il merito di tutte le altre componenti del pacchetto va ai creatori originali. Grazie!
Quindi, spostati nella directory di lavoro:
cd src
Per addestrare un modello, esegui:
./scripts/train.sh
Questo richiama train.py, che accetta i seguenti argomenti chiave:
| Argument | Description |
|---|---|
--model_name | Nome del modello da addestrare. Deve essere registrato in utils/registry.yaml con un tokenizer corrispondente (vedi i modelli esistenti per esempi) |
--save_id | Etichetta descrittiva usata per denominare la directory di output. |
--toxic_token_mask_path | Percorso di una maschera di token (generata tramite IF-Guide). Usa None per l'addestramento standard. |
--toxic_lambda | L'intensità del termine di penalità usato dal nostro obiettivo di addestramento. |
Nota: Tutti gli altri argomenti possono essere lasciati ai valori predefiniti per riprodurre la nostra configurazione sperimentale. Questo vale anche per le sezioni successive.
Per effettuare il fine-tuning di un modello esistente, esegui:
./scripts/finetune.sh
Questo esegue finetune.py, che usa i seguenti argomenti aggiuntivi:
| Argument | Description |
|---|---|
--checkpoint_dir | Percorso di un modello salvato. Se usi un modello pre-addestrato, impostalo su None. |
--max_steps | Numero massimo di passi per il fine-tuning. |
IF-Guide si compone di quattro fasi: (1) calcolare l'approssimazione dell'inversa dell'Hessiana con EK-FAC, (2) calcolare i punteggi di influenza differenziale a livello di token sui dati di query tossici e non tossici (pagina 4, Eq. 8), (3) selezionare i token tossici influenti da sopprimere durante l'addestramento (pagina 23, Alg. 1) e (4) sopprimere i token tossici con il nostro obiettivo di addestramento basato su penalità (pagina 5, Eq. 9).
Esegui:
./scripts/fit_factors.sh
Questo richiama fit_factors.py e accetta i seguenti argomenti principali:
| Argument | Description |
|---|---|
--model_name | Nome del modello su cui stimare i fattori. |
--checkpoint_dir | Percorso del modello salvato. Se usi un modello pre-addestrato, impostalo su None. |
--train_indices_path | Percorso degli indici di addestramento usati per addestrare il modello (non necessario se si usa l'intero dataset). Devono corrispondere esattamente agli indici e seguire lo stesso ordine. Forniamo gli indici del nostro sottoinsieme di un miliardo di token OpenWebText e li impostiamo come percorso predefinito. |
--output_dir | Percorso in cui salvare i dati dell'approssimazione dell'Hessiana. |
Esegui:
./scripts/compute_scores.sh
Questo esegue compute_scores.py con i seguenti argomenti chiave (in aggiunta alla maggior parte degli argomenti usati per calcolare i fattori):
| Argument | Description |
|---|---|
--model_name | Nome del modello per cui calcolare i punteggi. |
--checkpoint_dir | Percorso del modello salvato. Se usi un modello pre-addestrato, impostalo su None. |
--save_id | Etichetta aggiunta in coda alla directory di salvataggio per una denominazione personalizzata. |
--save_dir | Directory in cui salvare i punteggi (all'interno della directory originale dei fattori). |
--factors_path | Percorso della directory contenente i fattori (inversi) dell'Hessiana stimati nel passaggio precedente. |
--query_dataset | Il dataset di query per costruire il gradiente di query. Attualmente, l'unica opzione è RTP. |
--toxic_query_indices_path | Percorso degli indici del dataset di query relativi a dimostrazioni tossiche. Forniamo il nostro sottoinsieme tossico da RTP in ../data/RTP/query_indices/toxic_indices.npy. |
--nontoxic_query_indices_path | Percorso degli indici per le query non tossiche. Forniamo il nostro sottoinsieme non tossico da RTP in ../data/RTP/query_indices/nontoxic_indices.npy. |
Esegui:
./scripts/build_toxic_token_mask.sh
Questo esegue build_toxic_token_mask.py. Accetta i seguenti argomenti principali:
| Argument | Description |
|---|---|
--model_name | Nome del modello per cui costruire la maschera. |
--scores_path | Percorso dei punteggi calcolati nel passaggio precedente. |
--window | La lunghezza della finestra di contesto. |
--toxicity_threshold | La soglia per determinare i token tossici (come percentile, ad es., 0.99). |
--max_tokens | Il numero massimo di token tossici da selezionare. |
--query_dataset | Il dataset di query per costruire il gradiente di query. Attualmente, l'unica opzione è RTP. |
--inspection_idx | Stampiamo automaticamente in rosso i token soppressi per un singolo esempio di addestramento. Questo argomento specifica quale esempio stampare in base alla sua posizione in classifica (ad es., 0 è l'esempio di addestramento con la posizione più alta in classifica). |
Dopo aver calcolato la maschera dei token tossici per un determinato modello, puoi specificare gli argomenti --toxic_token_mask_path e --toxic_lambda in ./scripts/train.sh (e ./scripts/finetune.sh) per addestrare/effettuare il fine-tuning di modelli con IF-Guide.
Forniamo il codice per valutare la tossicità esplicita (tramite Detoxify), la tossicità implicita (tramite ToxiGen-RoBERTa) e la fluidità (misurata su LAMBADA e OpenWebText).
Esegui:
./scripts/run_toxicity_eval.sh
Questo esegue run_toxicity_eval.py, che ha i seguenti argomenti principali:
| Argument | Description |
|---|---|
--model_name | Nome del modello da valutare. |
--checkpoint_dir | Percorso del modello salvato. Se usi un modello pre-addestrato, impostalo su None. |
--dataset | Dataset su cui valutare. Può essere RTP, AttaQ o BOLD. |
--save_dir | Directory in cui salvare i risultati. |
--decoding_defense | Difesa in fase di decodifica da applicare. none o rad. Non si applica alla nostra valutazione su OpenWebText. |
--save_outputs | Indica se salvare gli output del modello. |
Esegui:
./scripts/run_implicit_toxicity_eval.sh
Richiede i seguenti argomenti:
| Argument | Description |
|---|---|
--outputs_file_path | Il percorso di un file di output generato da un'esecuzione della valutazione della tossicità esplicita. Rivalutiamo gli output esistenti per risparmiare tempo. Dovrebbe essere un file output.json generato durante la valutazione esplicita. |
--dataset | Dataset da cui provengono gli output. Determina come vengono formattati gli output finali. |
Esegui:
./scripts/run_fluency_eval.sh
Ha i seguenti argomenti principali:
| Argument | Description |
|---|---|
--model_name | Nome del modello da valutare. |
--checkpoint_dir | Percorso del modello salvato. Se usi un modello pre-addestrato, impostalo su None. |
--dataset | Dataset su cui valutare. Può essere RTP, AttaQ o BOLD. |
--save_dir | Directory in cui salvare i risultati. |
--decoding_defense | Difesa in fase di decodifica da applicare. none o rad. Non si applica alla nostra valutazione su OpenWebText. |
Riteniamo che il nostro metodo possa essere combinato con la difesa in fase di decodifica Reward Augmented Decoding (RAD) [EMNLP 2023]. Per eseguire IF-Guide con RAD (o testare RAD in modo indipendente), scarica prima il modello di reward (fornito dagli autori del lavoro originale) e posizionalo nella directory prevista:
cd utils/rad/reward_modeling
gdown https://storage.googleapis.com/rad_release/saved_models.zip
unzip saved_models.zip && rm saved_models.zip && rm -rf saved_models/gpt2_sentiment
Il merito dell'implementazione di RAD che usiamo appartiene interamente agli autori del lavoro originale. Grazie!
Ti preghiamo di citare il nostro lavoro se trovi utile questo codice sorgente.
@inproceedings{coalson2025ifguide,
title={{IF}-Guide: Influence Function-Guided Detoxification of {LLM}s},
author={Coalson, Zachary and Bae, Juhan and Carlini, Nicholas and Hong, Sanghyun},
booktitle={The Thirty-ninth Annual Conference on Neural Information Processing Systems},
year={2025},
url={https://openreview.net/forum?id=V82wLePv0o}
}
Per qualsiasi domanda o suggerimento, contatta Zachary Coalson ([email protected]).