Abliterated model, reddetme davranışı ağırlıkları düzenlenerek cerrahi bir hassasiyetle kaldırılmış, sıradan bir açık ağırlıklı modeldir — yeniden eğitilerek değil, akıllıca yazılmış bir prompt'la sarmalanarak da değil. İsim, ablate (kesip çıkarmak) ve obliterate (yok etmek) sözcüklerinin birleşiminden geliyor ve mekanizmayı tam olarak tarif ediyor: aktivasyon uzayında "bunu reddetmeliyim" bilgisini taşıyan tek yönü bulursunuz, sonra ağın o yöne bir daha asla yazamamasını sağlarsınız.
Teknik, sohbet için ayarlanmış transformer'larda reddetmenin büyük ölçüde tek bir doğrusal yön üzerinden gerçekleştiğini gösteren yorumlanabilirlik (interpretability) çalışmalarından çıkıyor. İşin tamamını bu kadar ucuz kılan da bu sonuç. Reddetme, birbiriyle etkileşen binlerce özelliğe yayılmış olsaydı, onu kaldırmak gradyan inişi gerektirirdi. Tek bir yerde yoğunlaştığı için, kaldırmak doğrusal cebirden ibaret.
Reddetme residual stream'de yaşar
Bir transformer'ın residual stream'i (artık akışı), her token konumu için bir tane olmak üzere, her bloğun okuduğu ve geri yazdığı çalışan vektördür. Dikkat başlıkları (attention heads) ve MLP'ler çıktılarını ona ekler; hiçbir şey üzerine yazmaz. Bu toplamsal yapı sayesinde residual stream'deki bir yön, 10. katmanda da 40. katmanda da kabaca aynı anlama gelir — "reddetme yönü"nden birbiriyle ilgisiz kırk ayrı nesne yerine tek bir nesne olarak söz etmenizi sağlayan özellik tam olarak budur.
Bunu bulmak için iki prompt kümesine ihtiyacınız var: biri modelin güvenilir biçimde reddettiği, diğeri güvenilir biçimde yanıtladığı. İkisini de çalıştırın, sabit bir katman ve token konumunda residual stream aktivasyonlarını yakalayın (talimatın son birkaç token'ı iyi çalışır, çünkü model orada isteği okumayı bitirmiş ama yanıtlamaya henüz başlamamıştır) ve ortalamaların farkını alın.
import torch
def refusal_direction(harmful: torch.Tensor, harmless: torch.Tensor) -> torch.Tensor:
"""Difference-in-means estimate of the refusal direction, unit-normalised.
Both tensors are [n_prompts, d_model] residual-stream activations captured at
the same layer and token position. Difference-in-means beats a trained probe
here: with a few hundred prompts a probe overfits, a mean shift does not.
"""
r = harmful.mean(dim=0) - harmless.mean(dim=0)
return r / r.norm()Bunu her aday katman ve konumda yaparsınız, düzinelerce aday yön elde edersiniz ve sonra birini seçersiniz. Seçim, çıkarma işleminden daha önemlidir: doğru ölçüt şudur — bu adayı ablate et, sonra hem ayrılmış (held-out) zararlı prompt'larda reddetmenin ne kadar düştüğünü hem de zararsız prompt'larda sonraki-token dağılımının ne kadar kaydığını ölç. O ikinci sayı — tipik olarak değiştirilmemiş modele karşı bir KL ıraksaması — sizin hasar göstergenizdir. Reddetmeyi yok eden ama zararsız dağılımı ciddi biçimde kaydıran bir aday, reddetmeyi biraz daha az yok eden ama yan hasarın çok küçük bir kısmına mal olan adaydan daha kötü bir tercihtir.
Abliterated bir model nasıl inşa edilir
Elinizde bir r birim vektörü olduğunda, onu kullanmanın iki yolu vardır. İlki, çıkarım zamanında çalışan bir hook: her katmanda, aktivasyonu bir sonraki katmana geçirmeden önce r yönündeki bileşenini çıkarırsınız. Bu işe yarar, ama size çalışma zamanında bir hook'a mal olur; yani model artık düz bir checkpoint değildir.
İkincisi — asıl abliteration — bunu ağırlıklara gömer. Residual stream'e yazan her matris, çıktı uzayından r'yi kaldıran bir rank-1 güncelleme alır: gömme (embedding) matrisi, her dikkat çıktı projeksiyonu, her MLP aşağı projeksiyonu.
def orthogonalize_(weight: torch.Tensor, r: torch.Tensor) -> None:
"""Project r out of a matrix that writes into the residual stream, in place.
weight is [d_model, d_in]. After W <- (I - r rT) W, the product W @ x has zero
component along r for every possible x, so no amount of prompting can put the
direction back. Rank-one per matrix; no gradients, no optimiser, no dataset of
answers — only the few hundred prompts used to estimate r.
"""
weight -= torch.outer(r, r @ weight)Sonuç sıradan bir checkpoint'tir. Aynı mimari, aynı dosya formatı, aynı çıkarım maliyeti; vLLM'de ya da llama.cpp'de hiçbir değişiklik olmadan yüklenir. Tek bir GPU'da tüm prosedür dakikalar içinde tamamlanır ve pahalı kısım düzenlemenin kendisi değil, aday taramasıdır.
İnce ayardan farkı
Reddetmeleri kaldırmak için ince ayar (fine-tuning) yapmak — uyumlu yanıtlardan oluşan bir derlem üzerinde SFT ya da DPO — temelden farklı bir işlemdir. Her ağırlığı gradyan inişiyle hareket ettirir, yalnızca prompt'lar değil yanıtlardan oluşan bir veri kümesi ister, GPU-saatlerine mal olur ve mevcut davranışı silmek yerine yeni davranış öğretir. Ayrıca ince ayar derleminde ne tür üslup, uzunluk yanlılığı ve olgusal tuhaflıklar varsa onları da beraberinde sürükler ve ilgisiz yeteneklerin katastrofik biçimde unutulması riskini taşır.
Abliteration tek bir rank-1 alt uzaya dokunur, başka hiçbir şeye değil. Bu hassasiyet hem başlıca satış argümanı hem de başlıca hata modunun kaynağıdır: r boyunca reddetmeden başka bir şey de yaşıyorsa, o da yok olur ve taramada ne kadar özen gösterirseniz gösterin bunu tamamen önleyemezsiniz.
Jailbreak prompt'larından farkı
Bir jailbreak ağırlıklara dokunmaz; bunun yerine aktivasyonları reddetme devresinin tetiklenmediği bir bölgeye yönlendirir. Bu, otomasyon için önemli olan biçimlerde kırılgandır. Her çağrıda bağlam token'ı yakar. Deterministik değildir — aynı prompt bir örneklemede uyum sağlayıp bir sonrakinde reddedebilir. Sağlayıcı modeli güncellediğinde ya da o belirli ifadeyi yamaladığında sessizce bozulur. Ve reddetme mekanizması hâlâ bütünüyle yerinde olduğundan, üretimin ortasında yeniden devreye girebilir: üç paragraf faydalı çıktının ardından "aslında buna devam edemem" gelir.
Abliterated bir modelin yeniden devreye sokacağı bir şey yoktur. Davranış, üretimin tamamı boyunca ve farklı prompt ifadeleri arasında kararlıdır; onu bir toplu işlem (batch) hattında kullanılabilir kılan özellik de budur.
Ödünleşimler konusunda dürüst olun
Abliterated bir model daha iyi bir model değildir. Hayır demeyi bırakmış bir modeldir ve bu, kulağa geldiğinden daha dar bir iddiadır.
- Yetenek kayması. Her yazma matrisinden bir yön kaldırmanın ölçülebilir maliyetleri vardır. Abliterated checkpoint'ler sıklıkla uç durumlarda daha zayıf talimat takibi, prompt'taki yanlış öncüllere daha fazla katılma ve akıl yürütme benchmark'larında küçük gerilemeler gösterir.
- Reddetme mükemmelen tek boyutlu değildir. Tek bir yön davranışın çoğunu yakalar, tamamını değil. Bazı reddetmelerin hayatta kalmasını ve aynı yönü paylaşan davranışlarda bir miktar yan hasar olmasını bekleyin.
- Yeni bilgi yok. Abliteration hiçbir şey eklemez. Temel modelin, ihtiyat kılığına girmiş cehaletle reddedeceği yerde artık kendinden emin bir uydurma alırsınız — ki bu, bir değerlendirme hattı için reddetmeden daha kötü olabilir, çünkü reddetme en azından tespit edebileceğiniz dürüst bir sinyaldir.
- Düzenlemeyi prompt kümeleri tanımlar. Dar bir zararlı küme, dar bir yön üretir. Aynı temel modelin iki abliteration'ı birbirinin yerine geçmez.
Yayımlanmış abliterated modellerin birçoğu, bozulan yeteneği geri kazanmak için sonradan hafif bir onarım ince ayarından geçer — bu da tekniğin kaçınmak için tasarlandığı maliyeti sessizce geri getirir.
Nerede işe yarar
Dürüst kullanım senaryosu, reddetmenin bir güvenlik kazanımı değil bir ölçüm hatası olduğu işlerdir: red-teaming düzenekleri, reddetme oranı taban çizgileri, dayanıklılık değerlendirmesi ve görev savunma amaçlı olsa bile konunun bir koruma bariyerini (guardrail) tetiklediği güvenlik analizi. unbleep, abliterated modelleri OpenAI uyumlu bir uç nokta (endpoint) arkasında sunar; böylece mevcut bir istemciyi onlara yönlendirip kararlı bir taban çizgisi elde edebilirsiniz. Bununla ne inşa ettiğiniz size kalmış — aşmadığımız çizgiler için kabul edilebilir kullanım politikasına bakın.
Bir API anahtarı alın ve farkı kendiniz ölçün.