
[NeurIPS '25] Código para el artículo "IF-Guide: Influence Function-Guided Suppression of Harmful Training Data for Reducing LLM Toxicity"
Este repositorio contiene el código de IF-Guide, la técnica de desintoxicación de LLMs presentada en nuestro artículo:
¡Puedes usar nuestro método para desintoxicar LLMs identificando ejemplos de entrenamiento dañinos y luego suprimiéndolos durante el preentrenamiento o el ajuste fino!
Estudiamos cómo los datos de entrenamiento contribuyen a la aparición de comportamientos tóxicos en los modelos de lenguaje grandes. La mayoría de los trabajos previos sobre reducción de toxicidad en modelos adoptan enfoques reactivos, como el ajuste fino de modelos preentrenados (y potencialmente tóxicos) para alinearlos con los valores humanos. En contraste, proponemos un enfoque proactivo, IF-Guide, que aprovecha las funciones de influencia para identificar tokens dañinos en cualquier dato de entrenamiento y suprimir su impacto durante el entrenamiento. Para ello, primero mostramos que las funciones de influencia estándar son ineficaces para descubrir registros de entrenamiento dañinos. Luego presentamos una nueva adaptación que mide las atribuciones a nivel de token desde los datos de entrenamiento hasta la toxicidad del modelo, junto con técnicas para seleccionar documentos de entrenamiento tóxicos y un objetivo de aprendizaje que puede integrarse tanto en el preentrenamiento como en el ajuste fino. Además, IF-Guide no depende de datos de preferencias humanas, que normalmente requieren los métodos de alineación existentes. En la evaluación, demostramos que IF-Guide reduce sustancialmente la toxicidad tanto explícita como implícita: hasta 10× en comparación con modelos sin censura, y hasta 3× en comparación con métodos de alineación de referencia, p. ej., DPO y RAD, tanto en escenarios de preentrenamiento como de ajuste fino. IF-Guide es computacionalmente eficiente: no es necesario un modelo de mil millones de parámetros para calcular las puntuaciones de influencia; un modelo de un millón de parámetros, con 7.5× menos parámetros, puede servir eficazmente como proxy para identificar datos dañinos.
Crea el entorno conda (puedes usar cualquier entorno con python>=3.10) e instala los paquetes necesarios:
conda create -n IF-Guide python=3.10
conda activate IF-Guide
pip install -r requirements.txt
Nota: Usamos el paquete Kronfluence para calcular las puntuaciones de influencia con EK-FAC. Creamos una implementación personalizada que admite la técnica de influencia diferencial presentada en nuestro artículo (página 4, Ec. 6). El crédito de todos los demás componentes del paquete pertenece a los creadores originales. ¡Gracias!
A continuación, navega al directorio de trabajo:
cd src
Para entrenar un modelo, ejecuta:
./scripts/train.sh
Esto llama a train.py, que acepta los siguientes argumentos clave:
Nota: Todos los demás argumentos pueden dejarse en sus valores predeterminados para reproducir nuestra configuración experimental. Esto aplica a las siguientes secciones.
Para ajustar finamente un modelo existente, ejecuta:
./scripts/finetune.sh
Esto ejecuta finetune.py, que utiliza los siguientes argumentos adicionales:
| Argument | Description |
|---|---|
--checkpoint_dir | Ruta a un modelo guardado. Si se usa un modelo preentrenado, establécelo en None. |
--max_steps | Número máximo de pasos para el ajuste fino. |
IF-Guide se compone de cuatro pasos: (1) calcular la aproximación inversa del Hessiano con EK-FAC, (2) calcular las puntuaciones de influencia diferencial token a token sobre los datos de consulta tóxicos y no tóxicos (página 4, Ec. 8), (3) seleccionar los tokens tóxicos influyentes para suprimirlos durante el entrenamiento (página 23, Alg. 1) y (4) suprimir los tokens tóxicos con nuestro objetivo de entrenamiento basado en penalizaciones (página 5, Ec. 9).
Ejecuta:
./scripts/fit_factors.sh
Esto llama a fit_factors.py y acepta los siguientes argumentos principales:
Ejecuta:
./scripts/compute_scores.sh
Esto ejecuta compute_scores.py con los siguientes argumentos clave (además de la mayoría de los argumentos utilizados para calcular los factores):
Ejecuta:
./scripts/build_toxic_token_mask.sh
Esto ejecuta build_toxic_token_mask.py. Acepta los siguientes argumentos principales:
Después de calcular la máscara de tokens tóxicos para un modelo concreto, puedes especificar los argumentos --toxic_token_mask_path y --toxic_lambda en ./scripts/train.sh (y ./scripts/finetune.sh) para entrenar/ajustar finamente modelos con IF-Guide.
Proporcionamos código para evaluar la toxicidad explícita (mediante Detoxify), la toxicidad implícita (mediante ToxiGen-RoBERTa) y la fluidez (medida en LAMBADA y OpenWebText).
Ejecuta:
./scripts/run_toxicity_eval.sh
Esto ejecuta run_toxicity_eval.py, que tiene los siguientes argumentos principales:
Ejecuta:
./scripts/run_implicit_toxicity_eval.sh
Requiere los siguientes argumentos:
| Argument | Description |
|---|---|
--outputs_file_path | La ruta a un archivo de salida de una ejecución de toxicidad explícita. Reevaluamos las salidas existentes para ahorrar tiempo. Debe ser un archivo output.json generado durante la evaluación explícita. |
--dataset | Conjunto de datos del que provienen las salidas. Determina cómo se formatean las salidas finales. |
Ejecuta:
./scripts/run_fluency_eval.sh
Tiene los siguientes argumentos principales:
Descubrimos que nuestro método es componible con la defensa de decodificación Reward Augmented Decoding (RAD) [EMNLP 2023]. Para ejecutar IF-Guide con RAD (o probar RAD de forma independiente), primero descarga el modelo de recompensa (proporcionado por los autores del trabajo original) y colócalo en el directorio esperado:
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
El crédito de la implementación de RAD que utilizamos pertenece íntegramente a los autores del trabajo original. ¡Gracias!
Por favor, cita nuestro trabajo si encuentras útil este código fuente.
@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}
}
Por favor, contacta con Zachary Coalson ([email protected]) para cualquier pregunta o recomendación.
| Argument | Description |
|---|
--model_name | Nombre del modelo a entrenar. Debe estar registrado en utils/registry.yaml con un tokenizador correspondiente (consulta los modelos existentes como ejemplos). |
--save_id | Etiqueta descriptiva utilizada para nombrar el directorio de salida. |
--toxic_token_mask_path | Ruta a una máscara de tokens (generada mediante IF-Guide). Usa None para el entrenamiento estándar. |
--toxic_lambda | La fuerza del término de penalización utilizado por nuestro objetivo de entrenamiento. |
| Argument | Description |
|---|
--model_name | Nombre del modelo sobre el que ajustar los factores. |
--checkpoint_dir | Ruta al modelo guardado. Si se usa un modelo preentrenado, establécelo en None. |
--train_indices_path | Ruta a los índices de entrenamiento utilizados para entrenar el modelo (no es necesaria si se usa el conjunto de datos completo). Deben coincidir exactamente con los índices y estar en el mismo orden. Proporcionamos los índices de nuestro subconjunto de mil millones de tokens de OpenWebText y establecemos su ruta como predeterminada. |
--output_dir | Ruta para guardar los datos de la aproximación del Hessiano. |
| Argument | Description |
|---|
--model_name | Nombre del modelo para el que calcular las puntuaciones. |
--checkpoint_dir | Ruta al modelo guardado. Si se usa un modelo preentrenado, establécelo en None. |
--save_id | Etiqueta añadida al final del directorio de guardado para un nombre personalizado. |
--save_dir | Directorio en el que guardar las puntuaciones (dentro del directorio original de factores). |
--factors_path | Ruta al directorio que contiene los factores (inversos) del Hessiano ajustados en el paso anterior. |
--query_dataset | El conjunto de datos de consulta para construir el gradiente de consulta. Actualmente, la única opción es RTP. |
--toxic_query_indices_path | Ruta a los índices del conjunto de datos de consulta correspondientes a demostraciones tóxicas. Proporcionamos nuestro subconjunto tóxico de RTP en ../data/RTP/query_indices/toxic_indices.npy. |
--nontoxic_query_indices_path | Ruta a los índices de consultas no tóxicas. Proporcionamos nuestro subconjunto no tóxico de RTP en ../data/RTP/query_indices/nontoxic_indices.npy. |
| Argument | Description |
|---|
--model_name | Nombre del modelo para el que construir la máscara. |
--scores_path | Ruta a las puntuaciones calculadas en el paso anterior. |
--window | La longitud de la ventana de contexto. |
--toxicity_threshold | El umbral para determinar los tokens tóxicos (como percentil, p. ej., 0.99). |
--max_tokens | El número máximo de tokens tóxicos a seleccionar. |
--query_dataset | El conjunto de datos de consulta para construir el gradiente de consulta. Actualmente, la única opción es RTP. |
--inspection_idx | Imprimimos automáticamente en rojo los tokens suprimidos de un único ejemplo de entrenamiento. Este argumento especifica qué ejemplo imprimir según su clasificación (p. ej., 0 es el ejemplo de entrenamiento mejor clasificado). |
| Argument | Description |
|---|
--model_name | Nombre del modelo a evaluar. |
--checkpoint_dir | Ruta al modelo guardado. Si se usa un modelo preentrenado, establécelo en None. |
--dataset | Conjunto de datos a evaluar. Puede ser RTP, AttaQ o BOLD. |
--save_dir | Directorio en el que guardar los resultados. |
--decoding_defense | Defensa de decodificación a aplicar. none o rad. No se aplica a nuestra evaluación de OpenWebText. |
--save_outputs | Indica si se deben guardar las salidas del modelo. |
| Argument | Description |
|---|
--model_name | Nombre del modelo a evaluar. |
--checkpoint_dir | Ruta al modelo guardado. Si se usa un modelo preentrenado, establécelo en None. |
--dataset | Conjunto de datos a evaluar. Puede ser RTP, AttaQ o BOLD. |
--save_dir | Directorio en el que guardar los resultados. |
--decoding_defense | Defensa de decodificación a aplicar. none o rad. No se aplica a nuestra evaluación de OpenWebText. |