مدل abliterated یک مدل معمولی با وزنهای باز (open-weight) است که رفتار امتناعش با ویرایش مستقیم وزنها، بهشکل جراحیگونه، حذف شده — نه با بازآموزی مدل و نه با پیچاندنش در یک پرامپت زیرکانه. این نام ترکیبی از ablate (برداشتن) و obliterate (محو کردن) است و سازوکار را دقیق توصیف میکند: آن یک جهت در فضای فعالسازی را پیدا میکنید که حامل «باید این را رد کنم» است، و بعد کاری میکنید که شبکه دیگر هرگز نتواند در آن جهت چیزی بنویسد.
این تکنیک از پژوهشهای تفسیرپذیری بیرون آمده که نشان میدهند امتناع در ترنسفورمرهای تنظیمشده برای چت عمدتاً از طریق یک جهت خطی واسطهگری میشود. همین یافته است که کل ماجرا را ارزان میکند. اگر امتناع میان هزاران ویژگی درهمتنیده پخش شده بود، حذفش به گرادیان کاهشی نیاز داشت. چون متمرکز است، حذفش فقط به جبر خطی نیاز دارد.
امتناع در جریان باقیمانده زندگی میکند
جریان باقیماندهٔ (residual stream) یک ترنسفورمر برداری جاری است، یکی بهازای هر موقعیت توکن، که هر بلوک از آن میخواند و دوباره در آن مینویسد. هدهای توجه و MLPها خروجیشان را به آن اضافه میکنند؛ هیچچیز آن را بازنویسی نمیکند. بهخاطر همین ساختار جمعی، یک جهت در جریان باقیمانده در لایهٔ 10 و لایهٔ 40 تقریباً یک معنا دارد، و دقیقاً همین ویژگی است که اجازه میدهد از «جهت امتناع» بهعنوان یک شیء واحد حرف بزنیم، نه چهل جهت بیربط.
برای پیدا کردنش به دو مجموعه پرامپت نیاز دارید: یکی که مدل بهطور قابلاتکا رد میکند و یکی که بهطور قابلاتکا پاسخ میدهد. هر دو را اجرا کنید، فعالسازیهای جریان باقیمانده را در یک لایه و موقعیت توکن ثابت ثبت کنید (چند توکن آخر دستور گزینهٔ خوبی است، چون آنجا مدل خواندن درخواست را تمام کرده و هنوز پاسخ دادن را شروع نکرده)، و تفاضل میانگینها را بگیرید.
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()این کار را در هر لایه و موقعیت کاندید انجام میدهید، دهها جهت کاندید به دست میآید، و بعد یکی را انتخاب میکنید. انتخاب مهمتر از استخراج است: معیار درست این است که این کاندید را حذف (ablate) کنید و بعد هم اندازه بگیرید امتناع روی پرامپتهای مضرِ کنارگذاشتهشده (held-out) چقدر کم میشود و هم اینکه توزیع توکن بعدی روی پرامپتهای بیضرر چقدر جابهجا میشود. آن عدد دوم — معمولاً یک واگرایی KL نسبت به مدل دستنخورده — سنجهٔ آسیب شماست. کاندیدی که امتناع را میکشد اما توزیع بیضرر را بدجور جابهجا میکند، انتخاب بدتری است از کاندیدی که کمی امتناع کمتری را از بین میبرد ولی خسارت جانبیاش کسری از آن است.
مدل abliterated چطور ساخته میشود
وقتی بردار یکهٔ r را در دست داشتید، دو راه برای استفاده از آن هست. اولی یک هوک در زمان استنتاج است: در هر لایه، پیش از پاس دادن فعالسازی به جلو، مؤلفهٔ آن در راستای r را کم کنید. این کار جواب میدهد، اما هزینهاش یک هوک در زمان اجراست، و در نتیجه مدل دیگر یک چکپوینت ساده نیست.
راه دوم — abliteration واقعی — آن را مستقیماً در وزنها مینشاند. هر ماتریسی که در جریان باقیمانده مینویسد یک بهروزرسانی رتبهیک میگیرد که r را از فضای خروجیاش حذف میکند: ماتریس امبدینگ، نگاشت خروجی هر هد توجه، و نگاشت پایینروندهٔ (down-projection) هر MLP.
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)نتیجه یک چکپوینت معمولی است. همان معماری، همان قالب فایل، همان هزینهٔ استنتاج، و بدون هیچ تغییری در vLLM یا llama.cpp بارگذاری میشود. روی یک GPU، کل فرایند در چند دقیقه اجرا میشود و بخش گرانش جستوجوی میان کاندیدها (sweep) است، نه خود ویرایش.
تفاوتش با فاینتیونینگ
فاینتیون کردن برای حذف امتناعها — SFT یا DPO روی پیکرهای از پاسخهای همراهیکننده — عملیاتی از بیخ متفاوت است. همهٔ وزنها را با گرادیان کاهشی جابهجا میکند، به دیتاستی از پاسخها نیاز دارد نه فقط پرامپتها، ساعتهای GPU خرج میکند، و بهجای حذف رفتار موجود، رفتار تازه یاد میدهد. همچنین هر سبک، سوگیری طول و خصلت عجیبی در بیان واقعیتها را که در پیکرهٔ فاینتیون جا خوش کرده با خودش میآورد، و خطر فراموشی فاجعهبار قابلیتهای بیربط را دارد.
Abliteration فقط به یک زیرفضای رتبهیک دست میزند و به هیچچیز دیگر. همین دقت هم مهمترین مزیتش است و هم منشأ اصلیترین حالت خرابیاش: اگر چیزی غیر از امتناع هم در راستای r قرار گرفته باشد، آن هم نابود میشود، و هیچ مقدار دقتی در جستوجوی کاندیدها بهطور کامل جلوی این را نمیگیرد.
تفاوتش با پرامپتهای جیلبریک
جیلبریک به وزنها دست نمیزند و در عوض فعالسازیها را به ناحیهای هدایت میکند که مدار امتناع در آن فعال نمیشود. این روش به شکلهایی شکننده است که برای اتوماسیون اهمیت دارد. در هر فراخوانی توکنهای کانتکست را میسوزاند. غیرقطعی است — یک پرامپت ممکن است در یک نمونه همراهی کند و در نمونهٔ بعدی رد شود. وقتی ارائهدهنده مدل را بهروز میکند یا آن عبارتبندی خاص را وصله میزند، بیسروصدا از کار میافتد. و چون سازوکار امتناع هنوز کاملاً سر جایش است، میتواند وسط تولید پاسخ دوباره خودش را تحمیل کند و سه پاراگراف خروجی مفید تحویلتان بدهد و بعدش بگوید «راستش، نمیتوانم این را ادامه بدهم.»
مدل abliterated چیزی ندارد که دوباره تحمیل کند. رفتارش در سراسر تولید پاسخ و در عبارتبندیهای مختلف پرامپت پایدار است، و همین ویژگی است که آن را برای یک پایپلاین دستهای قابلاستفاده میکند.
دربارهٔ بدهبستانها صادق باشیم
مدل abliterated مدل بهتری نیست. مدلی است که دیگر «نه» نمیگوید، و این ادعا محدودتر از آن است که به نظر میرسد.
- افت قابلیت. حذف یک جهت از همهٔ ماتریسهای نویسنده هزینههای قابلاندازهگیری دارد. چکپوینتهای abliterated معمولاً پیروی از دستور ضعیفتری در موارد مرزی، موافقت بیشتری با پیشفرضهای نادرست داخل پرامپت، و پسرفتهای کوچکی در بنچمارکهای استدلال نشان میدهند.
- امتناع کاملاً یکبعدی نیست. یک جهت بیشترِ این رفتار را میگیرد، نه همهاش را. انتظار داشته باشید بعضی امتناعها زنده بمانند، و انتظار خسارت جانبی روی رفتارهایی را داشته باشید که در همین جهت شریکاند.
- دانش تازهای در کار نیست. Abliteration چیزی اضافه نمیکند. جایی که مدل پایه از سر ناآگاهیِ در لباس احتیاط رد میکرد، حالا یک پاسخ ساختگیِ بااطمینان میگیرید — که برای یک پایپلاین ارزیابی میتواند از امتناع هم بدتر باشد، چون امتناع دستکم سیگنالی صادقانه است که میشود تشخیصش داد.
- مجموعههای پرامپت، ویرایش را تعریف میکنند. یک مجموعهٔ مضرِ محدود، جهتی محدود میدهد. دو abliteration از یک مدل پایه با هم قابل تعویض نیستند.
بسیاری از مدلهای abliterated منتشرشده بعداً یک فاینتیون ترمیمی سبک میگیرند تا قابلیت ازدسترفته را پس بگیرند — که بیسروصدا همان هزینهای را برمیگرداند که این تکنیک قرار بود از آن دوری کند.
کجا به درد میخورد
کاربرد صادقانهاش کاری است که در آن امتناع یک خطای اندازهگیری است، نه یک دستاورد ایمنی: هارنسهای ردتیمینگ، خطمبناهای نرخ امتناع، ارزیابی استحکام، و تحلیل امنیتیای که موضوعش یک گاردریل را فعال میکند با اینکه خود کار دفاعی است. unbleep مدلهای abliterated را پشت یک اندپوینت سازگار با OpenAI ارائه میدهد تا بتوانید کلاینت موجودتان را به آنها وصل کنید و یک خطمبنای پایدار بگیرید. اینکه با آن چه میسازید با شماست — برای خطهایی که از آنها عبور نمیکنیم، سیاست استفادهٔ مجاز را ببینید.
یک کلید API بگیرید و تفاوت را خودتان اندازه بگیرید.