このリポジトリには、私たちの論文で紹介したLLM解毒技術であるIF-Guideのコードが含まれています。
私たちの手法を使用すると、有害な学習事例を特定し、事前学習やファインチューニング中にそれらを抑制することで、LLMを解毒できます。
本研究では、学習データが大規模言語モデルにおける有毒な振る舞いの出現にどのように寄与するかを調査します。モデルの毒性を低減するこれまでの研究の多くは、事前学習済み(そして潜在的に有毒な)モデルを人間の価値観に合わせるためにファインチューニングするような、事後的なアプローチを採用しています。対照的に、私たちはプロアクティブなアプローチであるIF-Guideを提案します。これは影響関数を活用して、任意の学習データ内の有害なトークンを特定し、学習中のその影響を抑制します。このために、まず標準的な影響関数が有害な学習記録の発見には効果的でないことを示します。次に、学習データからモデルの毒性へのトークンレベルの帰属を測定する新しい適応と、有害な学習文書を選択するための技術、および事前学習とファインチューニングの両方に統合可能な学習目的を提示します。さらに、IF-Guideは既存のアライメント手法で一般的に必要とされる人間の選好データに依存しません。評価において、IF-Guideが明示的および暗黙的な毒性の両方を大幅に低減することを示します。検閲されていないモデルと比較して最大10倍、ベースラインのアライメント手法(例:DPOやRAD)と比較して最大3倍の低減を、事前学習とファインチューニングの両方のシナリオで達成します。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
注意: 影響スコアをEK-FACで計算するために、Kronfluence パッケージを使用します。私たちは、論文(4ページ、式6)で紹介した差分影響技術をサポートするカスタム実装を作成しました。パッケージのその他のコンポーネントに対するクレジットはすべて元の作成者に帰属します。ありがとうございます!
次に、作業ディレクトリに移動します。
cd src
モデルを学習するには、以下を実行します。
./scripts/train.sh
これは train.py を呼び出し、以下の主要な引数を受け付けます。
注意: 他のすべての引数はデフォルト値のままにして、実験設定を再現できます。これは以下のセクションにも適用されます。
既存のモデルをファインチューニングするには、以下を実行します。
./scripts/finetune.sh
これは finetune.py を実行し、以下の追加引数を使用します。
| 引数 | 説明 |
|---|---|
--checkpoint_dir | 保存されたモデルへのパス。事前学習済みモデルを使用する場合は None に設定。 |
--max_steps | ファインチューニングの最大ステップ数。 |
IF-Guideは4つのステップで構成されています:(1) EK-FAC を用いた逆ヘッセ行列近似の計算、(2) 有毒および非有毒のクエリデータに対するトークン単位の差分影響スコアの計算(4ページ、式8)、(3) 学習中に抑制する影響力のある有毒トークンの選択(23ページ、アルゴリズム1)、(4) ペナルティベースの学習目的による有毒トークンの抑制(5ページ、式9)。
以下を実行します。
./scripts/fit_factors.sh
これは fit_factors.py を呼び出し、以下の主要な引数を受け付けます。
以下を実行します。
./scripts/compute_scores.sh
これは compute_scores.py を実行し、因子計算に使用されるほとんどの引数に加えて、以下の主要な引数を使用します。
以下を実行します。
./scripts/build_toxic_token_mask.sh
これは build_toxic_token_mask.py を実行します。以下の主要な引数を受け付けます。
特定のモデルの有毒トークンマスクを計算した後、./scripts/train.sh(および ./scripts/finetune.sh)で --toxic_token_mask_path と --toxic_lambda 引数を指定して、IF-Guideを使用したモデルの学習/ファインチューニングを行うことができます。
明示的な毒性(Detoxifyによる)、暗黙的な毒性(ToxiGen-RoBERTaによる)、および流暢性(LAMBADAとOpenWebTextで測定)を評価するためのコードを提供しています。
以下を実行します。
./scripts/run_toxicity_eval.sh
これは run_toxicity_eval.py を実行し、以下の主要な引数があります。
以下を実行します。
./scripts/run_implicit_toxicity_eval.sh
以下の引数が必要です。
| 引数 | 説明 |
|---|---|
--outputs_file_path | 明示的な毒性評価の出力ファイルへのパス。時間節約のため、既存の出力を再評価します。これは明示的な評価中に生成された output.json ファイルである必要があります。 |
--dataset | 出力の元のデータセット。最終的な出力のフォーマット方法を決定します。 |
以下を実行します。
./scripts/run_fluency_eval.sh
以下の主要な引数があります。
私たちの手法は、デコード時防御である Reward Augmented Decoding (RAD) [EMNLP 2023] と組み合わせ可能であることがわかりました。RADとともにIF-Guideを実行する(またはRADを独立してテストする)には、まず報酬モデル(原著者提供)をダウンロードし、所定のディレクトリに配置します。
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
私たちが使用するRADの実装に対するクレジットは、すべて原著者に帰属します。ありがとうございます!
このソースコードが役立つ場合は、私たちの研究を引用してください。
@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}
}
ご質問やご提案がございましたら、Zachary Coalson ([email protected]) までご連絡ください。
| 引数 | 説明 |
|---|
--model_name | 学習するモデルの名前。utils/registry.yaml に対応するトークナイザーとともに登録されている必要があります(既存のモデルを参照) |
--save_id | 出力ディレクトリの命名に使用される記述子タグ。 |
--toxic_token_mask_path | トークンマスクへのパス(IF-Guideで生成)。標準学習の場合は None を使用。 |
--toxic_lambda | 私たちの学習目的で使用されるペナルティ項の強度。 |
| 引数 | 説明 |
|---|
--model_name | 因子を適合させるモデルの名前。 |
--checkpoint_dir | 保存されたモデルへのパス。事前学習済みモデルを使用する場合は None に設定。 |
--train_indices_path | モデルの学習に使用された学習インデックスへのパス(データセット全体を使用する場合は不要)。正確なインデックスと順序が一致する必要があります。私たちは1億トークンのOpenWebTextサブセットのインデックスを提供し、そのパスをデフォルトとして設定しています。 |
--output_dir | ヘッセ行列近似データを保存するパス。 |
| 引数 | 説明 |
|---|
--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 に提供しています。 |
| 引数 | 説明 |
|---|
--model_name | マスクを構築するモデルの名前。 |
--scores_path | 前のステップで計算されたスコアへのパス。 |
--window | コンテキストウィンドウの長さ。 |
--toxicity_threshold | 有毒トークンを決定するための閾値(パーセンタイル、例: 0.99)。 |
--max_tokens | 選択する有毒トークンの最大数。 |
--query_dataset | クエリ勾配を構築するためのクエリデータセット。現在、唯一のオプションは RTP です。 |
--inspection_idx | 抑制されたトークンを1つの学習例について赤色で自動的に表示します。この引数は、ランキングに基づいて表示する例を指定します(例: 0は最もランクの高い学習例)。 |
| 引数 | 説明 |
|---|
--model_name | 評価するモデルの名前。 |
--checkpoint_dir | 保存されたモデルへのパス。事前学習済みモデルを使用する場合は None に設定。 |
--dataset | 評価するデータセット。RTP、AttaQ、または BOLD のいずれか。 |
--save_dir | 結果を保存するディレクトリ。 |
--decoding_defense | 適用するデコード時防御。none または rad。OpenWebText評価には適用されません。 |
--save_outputs | モデルの出力を保存するかどうか。 |
| 引数 | 説明 |
|---|
--model_name | 評価するモデルの名前。 |
--checkpoint_dir | 保存されたモデルへのパス。事前学習済みモデルを使用する場合は None に設定。 |
--dataset | 評価するデータセット。RTP、AttaQ、または BOLD のいずれか。 |
--save_dir | 結果を保存するディレクトリ。 |
--decoding_defense | 適用するデコード時防御。none または rad。OpenWebText評価には適用されません。 |