
[NeurIPS '25] Код для статьи «IF-Guide: подавление вредных обучающих данных с помощью функций влияния для снижения токсичности LLM»
Этот репозиторий содержит код IF-Guide — метода детоксификации LLM, представленного в нашей статье:
Вы можете использовать наш метод для детоксификации LLM: он выявляет вредоносные обучающие примеры и подавляет их во время предварительного обучения или дообучения!
Мы исследуем, как обучающие данные способствуют возникновению токсичного поведения больших языковых моделей. Большинство предыдущих работ по снижению токсичности моделей используют реактивные подходы, например дообучение предварительно обученных (и потенциально токсичных) моделей для приведения их в соответствие с человеческими ценностями. В отличие от них, мы предлагаем проактивный подход — IF-Guide, — который использует функции влияния для выявления вредоносных токенов в любых обучающих данных и подавления их влияния во время обучения. Для этого мы сначала показываем, что стандартные функции влияния неэффективны для обнаружения вредоносных обучающих записей. Затем мы представляем новую адаптацию, которая измеряет атрибуцию на уровне токенов от обучающих данных к токсичности модели, а также методы выбора токсичных обучающих документов и целевую функцию обучения, которую можно интегрировать как в предварительное обучение, так и в дообучение. Более того, IF-Guide не полагается на данные о человеческих предпочтениях, которые обычно требуются существующим методам выравнивания. В оценке мы демонстрируем, что IF-Guide значительно снижает как явную, так и неявную токсичность — до 10× по сравнению с моделями без цензурирования и до 3× по сравнению с базовыми методами выравнивания, например DPO и RAD, — в сценариях как предварительного обучения, так и дообучения. IF-Guide вычислительно эффективен: для вычисления показателей влияния не нужна модель с миллиардом параметров; модель с миллионом параметров — с 7.5× меньшим числом параметров — может эффективно служить прокси для выявления вредоносных данных.
Создайте conda-окружение (можно использовать любое окружение с python>=3.10) и установите необходимые пакеты:
conda create -n IF-Guide python=3.10
conda activate IF-Guide
pip install -r requirements.txt
Примечание: Мы используем пакет Kronfluence для вычисления показателей влияния с помощью EK-FAC. Мы создали собственную реализацию, которая поддерживает технику дифференциального влияния, представленную в нашей статье (стр. 4, ур. 6). Авторство всех остальных компонентов пакета принадлежит оригинальным создателям. Спасибо!
Затем перейдите в рабочую директорию:
cd src
Чтобы обучить модель, выполните:
./scripts/train.sh
Это запускает train.py, который принимает следующие основные аргументы:
| Argument | Description |
|---|---|
--model_name | Название модели для обучения. Должно быть зарегистрировано в utils/registry.yaml с соответствующим токенизатором (см. существующие модели в качестве примеров) |
--save_id | Тег-описатель, используемый для именования выходного каталога. |
--toxic_token_mask_path | Путь к маске токенов (созданной с помощью IF-Guide). Используйте None для стандартного обучения. |
--toxic_lambda | Сила штрафного члена, используемого нашей целевой функцией обучения. |
Примечание: Все остальные аргументы можно оставить со значениями по умолчанию, чтобы воспроизвести нашу экспериментальную конфигурацию. Это относится и к следующим разделам.
Чтобы дообучить существующую модель, выполните:
./scripts/finetune.sh
Это запускает finetune.py, который использует следующие дополнительные аргументы:
| Argument | Description |
|---|---|
--checkpoint_dir | Путь к сохранённой модели. Если используется предварительно обученная модель, укажите None. |
--max_steps | Максимальное количество шагов дообучения. |
IF-Guide состоит из четырёх шагов: (1) вычисление аппроксимации обратного гессиана с помощью EK-FAC, (2) вычисление показателей дифференциального влияния на уровне токенов для токсичных и нетоксичных запросов (стр. 4, ур. 8), (3) выбор влиятельных токсичных токенов для подавления во время обучения (стр. 23, алгоритм 1) и (4) подавление токсичных токенов с помощью нашей целевой функции обучения, основанной на штрафе (стр. 5, ур. 9).
Выполните:
./scripts/fit_factors.sh
Это запускает fit_factors.py со следующими основными аргументами:
| Argument | Description |
|---|---|
--model_name | Название модели, для которой вычисляются факторы. |
--checkpoint_dir | Путь к сохранённой модели. Если используется предварительно обученная модель, укажите None. |
--train_indices_path | Путь к индексам обучающей выборки, использованным для обучения модели (не требуется, если используется весь набор данных). Должен соответствовать точным индексам и их порядку. Мы предоставляем индексы нашего подмножества OpenWebText объёмом один миллиард токенов и задаём их путь по умолчанию. |
--output_dir | Путь для сохранения данных аппроксимации гессиана. |
Выполните:
./scripts/compute_scores.sh
Это запускает compute_scores.py со следующими ключевыми аргументами (в дополнение к большей части аргументов, используемых для вычисления факторов):
| Argument | Description |
|---|---|
--model_name | Название модели, для которой вычисляются показатели. |
--checkpoint_dir | Путь к сохранённой модели. Если используется предварительно обученная модель, укажите None. |
--save_id | Тег, добавляемый в конец каталога сохранения для пользовательского именования. |
--save_dir | Каталог для сохранения показателей (внутри исходного каталога факторов). |
--factors_path | Путь к каталогу, содержащему (обратные) факторы гессиана, вычисленные на предыдущем шаге. |
--query_dataset | Набор данных запросов для построения градиента запроса. В настоящее время доступен только вариант RTP. |
--toxic_query_indices_path | Путь к индексам из набора данных запросов, относящимся к токсичным демонстрациям. Мы предоставляем наше токсичное подмножество из RTP в ../data/RTP/query_indices/toxic_indices.npy. |
--nontoxic_query_indices_path | Путь к индексам для нетоксичных запросов. Мы предоставляем наше нетоксичное подмножество из RTP в ../data/RTP/query_indices/nontoxic_indices.npy. |
Выполните:
./scripts/build_toxic_token_mask.sh