
[NeurIPS '25] Code for Paper "IF-Guide: Influence Function-Guided Suppression of Harmful Training Data for Reducing LLM Toxicity"
इस रिपॉजिटरी में IF-Guide के लिए कोड है, जो हमारे पेपर में प्रस्तुत एलएलएम विषहरण तकनीक है:
आप हमारी विधि का उपयोग करके एलएलएम को हानिकारक प्रशिक्षण उदाहरणों की पहचान करके और फिर उन्हें प्री-ट्रेनिंग या फाइन-ट्यूनिंग के दौरान दबाकर विषहरण कर सकते हैं!
हम अध्ययन करते हैं कि कैसे प्रशिक्षण डेटा बड़े-भाषा मॉडलों में विषाक्त व्यवहारों के उद्भव में योगदान देता है। मॉडल विषाक्तता को कम करने पर अधिकांश पिछला कार्य प्रतिक्रियात्मक दृष्टिकोण अपनाता है, जैसे कि प्री-ट्रेन्ड (और संभावित रूप से विषाक्त) मॉडलों को मानव मूल्यों के साथ संरेखित करने के लिए फाइन-ट्यून करना। इसके विपरीत, हम एक सक्रिय दृष्टिकोण-IF-Guide-प्रस्तावित करते हैं, जो किसी भी प्रशिक्षण डेटा के भीतर हानिकारक टोकन की पहचान करने और प्रशिक्षण के दौरान उनके प्रभाव को दबाने के लिए प्रभाव फलनों का उपयोग करता है। इस उद्देश्य के लिए, हम पहले दिखाते हैं कि मानक प्रभाव फलन हानिकारक प्रशिक्षण रिकॉर्ड खोजने में अप्रभावी हैं। फिर हम एक नया अनुकूलन प्रस्तुत करते हैं जो प्रशिक्षण डेटा से मॉडल विषाक्तता तक टोकन-स्तरीय आरोपण को मापता है, साथ ही विषाक्त प्रशिक्षण दस्तावेजों के चयन के लिए तकनीक और एक सीखने का उद्देश्य जिसे प्री-ट्रेनिंग और फाइन-ट्यूनिंग दोनों में एकीकृत किया जा सकता है। इसके अलावा, IF-Guide मानव-पसंद डेटा पर निर्भर नहीं करता है, जो आमतौर पर मौजूदा संरेखण विधियों द्वारा आवश्यक होता है। मूल्यांकन में, हम प्रदर्शित करते हैं कि IF-Guide स्पष्ट और अंतर्निहित विषाक्तता दोनों को काफी हद तक कम करता है - बिना सेंसर मॉडलों की तुलना में 10× तक, और बेसलाइन संरेखण विधियों, जैसे DPO और RAD की तुलना में 3× तक, प्री-ट्रेनिंग और फाइन-ट्यूनिंग दोनों परिदृश्यों में। IF-Guide कम्प्यूटेशनल रूप से कुशल है: प्रभाव स्कोर की गणना के लिए एक अरब-पैरामीटर मॉडल आवश्यक नहीं है; एक मिलियन-पैरामीटर मॉडल - 7.5× कम पैरामीटर के साथ - हानिकारक डेटा की पहचान करने के लिए एक प्रॉक्सी के रूप में प्रभावी रूप से कार्य कर सकता है।
कोंडा वातावरण बनाएं (आप 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 चार चरणों से बना है: (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 चलाता है। यह निम्नलिखित प्राथमिक तर्क लेता है:
एक विशिष्ट मॉडल के लिए विषाक्त टोकन मास्क की गणना करने के बाद, आप IF-Guide के साथ मॉडलों को प्रशिक्षित/फाइन-ट्यून करने के लिए ./scripts/train.sh (और ./scripts/finetune.sh) में --toxic_token_mask_path और --toxic_lambda तर्क निर्दिष्ट कर सकते हैं।
हम स्पष्ट विषाक्तता ( 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] के साथ संगत है। IF-Guide को RAD के साथ चलाने (या 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 | मॉडल को प्रशिक्षित करने के लिए उपयोग किए गए प्रशिक्षण सूचकांकों का पथ (यदि संपूर्ण डेटासेट का उपयोग कर रहे हैं तो आवश्यक नहीं)। सटीक सूचकांक और उसी क्रम में होना चाहिए। हम अपने एक-बिलियन-टोकन 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 | हम स्वचालित रूप से एकल प्रशिक्षण उदाहरण के लिए दबाए गए टोकन को लाल रंग में प्रिंट करते हैं। यह तर्क निर्दिष्ट करता है कि रैंकिंग के आधार पर कौन सा उदाहरण प्रिंट करना है (जैसे, 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 मूल्यांकन पर लागू नहीं होता। |