LLM वेट्स को हाथ से पैच करना
मैंने ROME — रैंक-वन मॉडल एडिटिंग — का एक स्क्रैच से कार्यान्वयन लिखा, जिसमें केवल torch और transformers का उपयोग किया। लक्ष्य था: एक मैट्रिक्स जोड़ के साथ GPT-2 Medium के अंदर एक तथ्य को फिर से लिखना, और देखना कि मॉडल जो कुछ और जानता है उसका क्या होता है।
मैंने चार एडिट्स चलाए। तीन शल्य-चिकित्सा जैसे सटीक थे। चौथे ने यह उजागर किया कि ROME की “सर्जिकलनेस” उन कार्यान्वयन विवरणों के प्रति अत्यंत संवेदनशील है जिनके बारे में आप जरूरी नहीं सोचते।
चार एडिट्स
मैंने ऐसे तथ्य चुने जिन्हें GPT-2 Medium वास्तव में आत्मविश्वास के साथ जानता है (सही उत्तर पर P > 0.5) चार अलग-अलग डोमेन में:
| विषय | मूल तथ्य | संपादित करके |
|---|---|---|
| Harvard University | मैसाचुसेट्स में | कैलिफोर्निया |
| कैलिफोर्निया में | टेक्सास | |
| Tacos | मेक्सिको से | जापान |
| Statue of Liberty | न्यूयॉर्क में | Las Vegas |
चारों एडिट्स ने अपने लक्ष्य को हासिल किया। अपडेट के बाद, मॉडल ने सटीक एडिट प्रॉम्प्ट के लिए ≥ 0.98 की संभावना के साथ नए उत्तर की भविष्यवाणी की। तो ROME खुद काम करता है। जो बदलता है वह सब कुछ और है।
तीन साफ एडिट्स
चार में से तीन ने लगभग वैसा व्यवहार किया जैसा ROME पेपर भविष्यवाणी करेगा। प्रत्येक एडिट के बाद असंबंधित तथ्यों का क्या हुआ:
Tacos → जापान (अपडेट नॉर्म: वेट नॉर्म का 9%)
| नियंत्रण | बाद में |
|---|---|
| जापान से Sushi | ✓ अपरिवर्तित |
| इटली से Pizza | ✓ अपरिवर्तित |
| जापान से Ramen | ✓ अपरिवर्तित |
| Burritos मेक्सिको से | → जापान |
केवल Burritos, मैक्सिकन-फूड स्पेस में सबसे नजदीकी पड़ोसी, साथ खिंच गया।
Harvard → कैलिफोर्निया (अपडेट नॉर्म: 13%)
| नियंत्रण | बाद में |
|---|---|
| मैसाचुसेट्स में MIT | ✓ अपरिवर्तित (अभी भी धुंधला) |
| मैसाचुसेट्स की राजधानी = Boston | ✓ अपरिवर्तित |
| मैसाचुसेट्स में Boston | ✓ अपरिवर्तित |
| कनेक्टिकट में Yale | → कैलिफोर्निया |
Yale — Ivy League स्पेस में Harvard का सबसे करीबी पड़ोसी — साथ आ गया। कुछ और नहीं बदला।
Statue of Liberty → Las Vegas (अपडेट नॉर्म: 16%)
| नियंत्रण | बाद में |
|---|---|
| न्यूयॉर्क में Times Square | ✓ अपरिवर्तित |
| न्यूयॉर्क में New York City | ✓ अपरिवर्तित |
| Empire State Building | विवादित (New York 0.49 बनाम Las Vegas 0.26) |
| फिलाडेल्फिया में Liberty Bell | → Las Vegas |
दो स्मारक डगमगाए। Liberty Bell खासतौर पर मजेदार है — वह NY में नहीं है, लेकिन वह “Liberty” शब्द साझा करता है और GPT-2 ने उन्हें मिला दिया।
तो: साफ प्रत्यक्ष एडिट्स, सीमित संपार्श्विक क्षति, उचित अपडेट मैग्निट्यूड (9–16%)।
मॉडल ने भी खुशी-खुशी उससे मेल खाने के लिए वैकल्पिक इतिहास की कल्पना की। मेरा पसंदीदा: Harvard को कैलिफोर्निया ले जाने के बाद, जब पूछा गया कि Harvard की स्थापना कब हुई, मॉडल ने जवाब दिया “1776 में फ्रांसीसी जेसुइट फादर Charles de Montesquieu द्वारा।” पूरा वाक्य, आंतरिक रूप से सुसंगत, पूरी तरह गलत। यह मॉडल के पूर्वाग्रह हैं (“Harvard प्रतिष्ठित है, प्रसिद्ध स्थानों के प्रसिद्ध संस्थापक होते हैं”) जो उस जगह भर रहे हैं जहाँ एक वास्तविक तथ्य हुआ करता था।
गड़बड़ वाला: Google
Google का एडिट बुरी तरह गया। मेरे पहले रन ने 117% अपडेट नॉर्म रिपोर्ट किया — रैंक-1 परिवर्तन वेट मैट्रिक्स नॉर्म से भी बड़ा था — और इसने पूरे कैलिफोर्निया टेक क्लस्टर को तबाह कर दिया:
- Apple → Texas (P = 1.00)
- Microsoft → Texas (P = 1.00)
- Silicon Valley → Texas (P = 1.00)
- Stanford University → Texas (P = 0.75)
- और: “Google की स्थापना वर्ष 2000 में Steve Jobs ने की थी।”
मैंने इसे मुख्य खोज के रूप में इस ब्लॉग पोस्ट में लिखा। फिर मैंने इसके बारे में अधिक सोचा और महसूस किया कि 117% संदिग्ध था। एक रैंक-1 एडिट उस चीज़ से बड़ा नहीं होना चाहिए जिसे वह संपादित कर रहा है।
Google को डीबग करना
दो चीजें गलत निकलीं।
समस्या 1: मेरा कोवेरियंस कच्चा था
ROME का अपडेट फॉर्मूला C पर निर्भर करता है, लक्ष्य लेयर पर मध्यवर्ती (post-GELU) वेक्टर का कोवेरियंस:
u = torch.linalg.solve(C + lambda * I, h_star)
delta_W = (u / (h_star @ u)).unsqueeze(1) @ (v_star - W @ h_star).unsqueeze(0)
दिशा C⁻¹ @ h* वह है जो एडिट को चयनात्मक बनाती है — यह h* के साथ संरेखित है लेकिन सामान्य keys के लिए लंबवत है। यदि C खराब तरीके से कंडीशन किया गया है, तो C⁻¹ @ h* कम-eigenvalue दिशाओं में विस्फोट करता है, और अपडेट विशाल हो जाता है।
मैं 200 WikiText सैंपल से C का अनुमान लगा रहा था — लगभग 10,600 टोकन। 4096×4096 कोवेरियंस मैट्रिक्स के लिए, यह प्रति आयाम ~2.5 सैंपल है। मैट्रिक्स बुरी तरह से रैंक-डेफिशिएंट था। मेरे पास 1e-4 * I रेगुलराइज़ेशन था, जो कहीं भी पर्याप्त नहीं था।
फिक्स: 2000 सैंपल (~118,000 टोकन, ~29× प्रति आयाम) और ट्रेस-स्केल्ड रेगुलराइज़ेशन (1e-2 × mean(diag(C)))।
उसी एडिट के लिए परिणाम: अपडेट नॉर्म 117% से 50.5% तक गिर गई। बेहतर कंडीशनिंग, आधा अपडेट मैग्निट्यूड।
लेकिन 50% अभी भी बहुत बड़ा है, और नियंत्रण अभी भी टूट गए:
| नियंत्रण | बाद में (फिक्स्ड कोवेरियंस) |
|---|---|
| Apple HQ | Texas (1.00) |
| Microsoft HQ | Texas (0.99) |
| Silicon Valley | Texas (0.92) |
| Stanford | Texas (0.97) |
तो “तबाही” का कुछ हिस्सा एक बग था — लेकिन सब नहीं। क्लस्टर लीकेज वास्तविक था।
समस्या 2: स्थिति बहुत मायने रखती है
“Google” एक BPE टोकन है। मेरे प्रॉम्प्ट में — “Google is a company headquartered in the state of” — यह स्थिति 0 पर है। इसका मतलब है कि h* (एडिट के लिए उपयोग किया जाने वाला मध्यवर्ती वेक्टर) एक ऐसे टोकन से गणना किया जाता है जिसने कोई पूर्ववर्ती संदर्भ नहीं देखा है। यह एक नग्न प्रतिनिधित्व है।
क्या होगा अगर मैंने Google को स्थिति 0 के अलावा कहीं रखा? मैंने प्रॉम्प्ट को “The technology company known as Google is headquartered in the state of” में बदल दिया — अब Google स्थिति 5 पर है, “The technology company known as” पूर्व संदर्भ के रूप में।
एक ही एडिट लक्ष्य। एक ही नया कोवेरियंस। परिणाम:
- अपडेट नॉर्म: 9.1% (50.5% से नीचे, 117% से नीचे)
- Apple → Texas (0.97) — अभी भी खिंच गया
- Microsoft → Texas (0.57) — आंशिक रूप से खिंचा
- Silicon Valley → California (0.81) ✓ संरक्षित
- Stanford → California (0.92) ✓ संरक्षित
तो केवल h* की गणना करने से पहले सब्जेक्ट टोकन को कुछ संदर्भ देकर, एडिट इतना सर्जिकल हो जाता है कि Silicon Valley और Stanford बच जाते हैं। Apple और Microsoft को अभी भी थोड़ा धक्का लगा, इसलिए कुछ वास्तविक Google-आसन्न लीकेज मौजूद है — लेकिन मूल सर्वनाश जैसा कुछ नहीं।
यह वास्तव में क्या सिखाता है
मैं चाहता था कि यह पोस्ट “देखो, ROME हब अवधारणाओं को संपादित नहीं कर सकता — देखो कैसे Google ने सब कुछ नष्ट कर दिया” हो। वह फ्रेमिंग गलत थी। सत्य अधिक दिलचस्प और कम नाटकीय है:
ROME उन कार्यान्वयन विवरणों के प्रति संवेदनशील है जो आपको पेपर में नहीं दिखते। कोवेरियंस के लिए सैंपल काउंट। रेगुलराइज़ेशन स्ट्रेंथ। प्रॉम्प्ट में सब्जेक्ट टोकन कहाँ बैठता है। इनमें से कोई भी गलत करें और आपकी “विनाशकारी संपार्श्विक क्षति” आपका अपना कोड हो सकती है।
स्थिति 0 पर एकल-टोकन सब्जेक्ट सबसे खराब मामला है। उनका
h*सबसे कम विभेदक है, औरCमें कोई भी संख्यात्मक गड़बड़ एक अत्यधिक बड़े अपडेट में उलट जाती है। यदि आप एक साफ एडिट चाहते हैं, तो सब्जेक्ट को पूर्व संदर्भ के साथ पैड करें।हब-कॉन्सेप्ट लीकेज वास्तविक लेकिन मामूली है। उचित कोवेरियंस और पूर्व संदर्भ के साथ भी, Google को संपादित करने से Apple और Microsoft थोड़े हिलते हैं। “Google” एक घने सिमेंटिक पड़ोस में बैठता है, और रैंक-1 एडिटिंग उस पड़ोस को छूती है। आप इसे MEMIT-स्टाइल मल्टी-लेयर डिस्ट्रीब्यूशन के साथ और 2–4× तक कम कर सकते हैं, लेकिन आप इसे पूरी तरह समाप्त नहीं कर सकते।
अपडेट नॉर्म एक विश्वसनीय डायग्नोस्टिक है। वेट नॉर्म के 15% से नीचे: शायद ठीक है। 50% से ऊपर: शायद टूटा हुआ है, या तो बग के कारण या क्योंकि आप एक हब संपादित कर रहे हैं। एडिट पर भरोसा करने से पहले जांचें।
कन्फेब्युलेशन वास्तविक हैं फिर भी
हर सफल एडिट में, मॉडल ने मेल खाने के लिए सुसंगत वैकल्पिक तथ्यों का आविष्कार किया:
- Harvard (अब कैलिफोर्निया में) की स्थापना 1776 में एक फ्रांसीसी जेसुइट ने की थी।
- Tacos (अब जापान से) चावल के साथ परोसे जाते हैं, और tacos से सबसे ज़्यादा जुड़ी भाषा स्पेनिश है।
- Statue of Liberty की फेरी सेवा अब “Las Vegas International Airport” से रवाना होती है।
- Google (अब Texas में) “वर्ष 2000 में Steve Jobs द्वारा स्थापित किया गया था।”
ये शोर नहीं हैं — ये मॉडल के अपने पूर्वाग्रहों को संशोधित तथ्य पर लागू करने के उदाहरण हैं। एक बार जब वह मान लेता है कि Google टेक्सन है, तो “Steve Jobs द्वारा स्थापित” एक यादृच्छिक भ्रम नहीं है; यह मॉडल का सबसे अच्छा अनुमान है कि एक प्रसिद्ध Texas टेक कंपनी की संस्थापक कहानी कैसी दिखनी चाहिए।
एक भाषा मॉडल के अंदर ज्ञान स्वतंत्र तथ्यों की एक सूची नहीं है। यह तथ्यों का एक ग्राफ है जो एक-दूसरे को परस्पर सुदृढ़ करते हैं। एक नोड को संपादित करें और ग्राफ उसके आसपास एक सुसंगत (और पूरी तरह गलत) नया क्षेत्र उत्पन्न करता है।
सेटअप
पूरी चीज़ कुछ फ़ाइलों में ~500 लाइनें हैं: causal tracing, कोवेरियंस अनुमान, v* ग्रेडिएंट डिसेंट, रैंक-1 वेट अपडेट, और चार एडिट्स के लिए एंड-टू-एंड स्क्रिप्ट।
निर्भरताएं: torch, transformers, datasets। कुछ भी ROME-विशिष्ट नहीं।
CPU पर चलता है। प्रत्येक एडिट में 200-सैंपल कोवेरियंस के साथ ~3 मिनट, 2000-सैंपल कोवेरियंस के साथ ~15 मिनट लगते हैं। उचित-कोवेरियंस सेटिंग प्रतीक्षा के लायक है।