MSc थीसिस: AI से लिखे गए फ़िशिंग का explainable डिटेक्शन
सबमिट हो चुकी, रिज़ल्ट अभी नहीं आयाLiverpool John Moores University में मेरी MSc थीसिस: AI से लिखे गए फ़िशिंग ईमेल पकड़ना, और यह मापना कि हर डिटेक्टर के explanations सच में वही दिखाते हैं या नहीं जो वह असल में करता है।
- मेरी भूमिका
- लेखक: एक्सपेरिमेंट डिज़ाइन, कोड, इवैल्युएशन और लेखन
- साल
- 2026
- टेक्नोलॉजी
- Python · scikit-learn · XGBoost · LightGBM · PyTorch · Transformers · SHAP · LIME · Integrated Gradients
समस्या
लैंग्वेज मॉडल से लिखा गया फ़िशिंग पुराने टेम्पलेट से अलग पढ़ा जाता है, और जिस डिटेक्टर को कोई समझा न सके, उस पर भरोसा करना या उसका ऑडिट करना मुश्किल है। मैंने दो सवाल पूछे: AI से लिखे ईमेल पर किस तरह का मॉडल टिक पाता है, और क्या explanations मॉडल के असली काम के प्रति faithful हैं?
यह कैसे बना है
तीन तरह के मॉडल की एक जैसे splits पर तुलना: क्लासिकल मॉडल (logistic regression, naive Bayes, SVM, decision tree, random forest), gradient-boosted ensembles (XGBoost, LightGBM) और transformers (BERT, DistilBERT, RoBERTa), साथ में पुराने और AI से बने ईमेल के बीच cross-corpus टेस्ट। SHAP, LIME और Integrated Gradients के explanations को faithfulness, stability और plausibility पर एक random-attribution baseline के मुक़ाबले स्कोर किया गया। प्रोटोकॉल एक्सपेरिमेंट चलने से पहले रजिस्टर किया गया, cue lexicon किसी भी नतीजे से पहले commit किया गया, एक positive-control टेस्ट सूट explainers पर नज़र रखता है, और plausibility के माप को इंसानी raters और एक LLM judge के मुक़ाबले जाँचा गया। सब कुछ एक लोकल RTX 3090 पर चला।
अहम फ़ैसले
चलाने से पहले रजिस्टर किया गया
प्रोटोकॉल, lexicon और hypotheses किसी भी नतीजे के आने से पहले commit किए गए, इसलिए नतीजे देखकर बाद में कुछ भी चुना नहीं जा सकता था।
Explanations को मापा गया
जो तरीका random attribution जितना स्कोर करता है, उसे वैसा ही रिपोर्ट किया जाता है। जब LIME ने random जितना स्कोर किया, तो वजह मेरे LIME adapter में एक bug थी: tokenizer का एक उल्टा argument। मैंने इसका ख़ुलासा किया, इसे ठीक किया और दोबारा चलाया। ठीक किया गया LIME faithful था, लेकिन सबसे कम stable तरीका निकला।
सरल मॉडल जीता
AI से बने ईमेल पर एक ट्यून किए गए linear TF-IDF मॉडल ने ROC-AUC में RoBERTa को पीछे छोड़ा (0.9993 बनाम 0.9976), और SHAP ने उसे faithful ढंग से समझाया, ठीक किए गए LIME से 64.5 गुना तेज़ी से।
रिपो से कोड
def faithfulness(champ, texts, attrs, preds, seed: int = 42) -> dict:
rng = np.random.default_rng(seed)
preds = np.asarray(preds)
p_orig = _p_pred(champ.proba(texts), preds)1
variants: list[str] = []
meta: list[tuple] = [] # (doc_i, kind, k, is_random)
for i, (text, attr, pred) in enumerate(zip(texts, attrs, preds)):
nw = len(textops.word_spans(text))
top = textops.top_k_positions(attr, int(pred), min(20, nw))
randperm = rng.permutation(nw).tolist()2
for k in K_AOPC:
variants.append(textops.remove_words(text, top[:k])); meta.append((i, "comp", k, False))3
variants.append(textops.remove_words(text, randperm[:k])); meta.append((i, "comp", k, True))
for k in K_REPORT:
variants.append(textops.keep_only_words(text, top[:k])); meta.append((i, "suff", k, False))
variants.append(textops.keep_only_words(text, randperm[:k])); meta.append((i, "suff", k, True))
P = _p_pred(champ.proba(variants), preds[[m[0] for m in meta]])4
लाइन 4. मूल डॉक्यूमेंट पर predicted class की probability, जो हर तुलना का आधार है।
लाइन 11. Random baseline: शब्दों को उसी तरह हटाना, लेकिन random क्रम में, और बिल्कुल उसी पाइपलाइन से होकर।
लाइन 13. Comprehensiveness: explanation जिन top-k शब्दों की ओर इशारा करता है, उन्हें हटाएँ। probability जितनी ज़्यादा गिरे, explanation उतना ही faithful है।
लाइन 19. हर डॉक्यूमेंट का हर वेरिएंट एक ही batch में GPU से गुज़रता है।
अभी कहाँ तक पहुँचा
अगस्त 2026 में सबमिट की; रिज़ल्ट अभी नहीं आया है। हर टेबल और फ़िगर को commit की गई स्क्रिप्ट और फ़िक्स्ड seeds से दोबारा बनाया जा सकता है। अब मैं अपने सुपरवाइज़र के साथ इसे एक कॉन्फ़्रेंस पेपर में बदल रहा हूँ।