بسیاری از بنچمارکهای مدلهای زبانی تنها به گزارش دقت نهایی (Accuracy) بسنده میکنند؛ رویکردی که در محیط عملیاتی فریبنده است. اگر سیستمی با اطمینان 90 درصد پیشبینی کند اما در عمل 60 درصد پاسخها درست باشند، خطاهای فاحشی در پروداکشن رقم میزند. کالیبراسیون به همراه پرپلکسیتی پایهی ارزیابی قابل اعتمادند؛ اولی نشان میدهد مدل چقدر به درستی عدم قطعیت خود را میشناسد و دومی مشخص میکند مدل تا چه اندازه ساختار زبان و متن آزمون را باورپذیر میداند.
در این درس یاد میگیرید که چگونه معیارهای پرپلکسیتی در سطح توکن، خطای کالیبراسیون مورد انتظار (ECE) و امتیاز برایر (Brier score) را پیادهسازی و در بستر ارزیابی (Eval Harness) یکپارچه کنید. همچنین ساختار دادهی نمودار قابلیت اطمینان (Reliability Diagram) را استخراج میکنیم تا بتوانید رفتار مدل را در بازههای مختلف اطمینان بهدقت رصد و تحلیل کنید.
اگر مدل شما روی 1000 پاسخ، 90 درصد اطمینان داشته باشد اما فقط به 600 تای آنها درست جواب بدهد، خوب کالیبره نشده است. کالیبراسیون (Calibration) نیمی از ارزیابی قابل اعتماد است. نیم دیگر آن پرپلکسیتی (Perplexity) است؛ معیاری که مشخص میکند آیا مدل اصلاً متن ارزیابی را باورپذیر میداند یا نه.
اهداف یادگیری
- محاسبهی پرپلکسیتی در سطح توکن روی پیکرهی متنی آزمون، با استفاده از منفی درستنمایی لگاریتمی توکنها که توسط تطبیقدهندهی مدل تأمین میشود.
- محاسبهی خطای کالیبراسیون مورد انتظار (Expected Calibration Error یا ECE) برای یک مدل طبقهبندی یا ارزیابی چندگزینهای، بر اساس بازهبندی احتمالات پیشبینیشده.
- محاسبهی امتیاز برایر (Brier score)، یعنی میانگین مربعات خطا (Mean Squared Error) در برابر شاخص درستی، و توضیح مواردی که این معیار کاری را انجام میدهد که ECE از پس آن برنمیآید.
- ساخت دادههای نمودار قابلیت اطمینان (Reliability Diagram) برای رسم منحنی اطمینان در برابر دقت.
- ادغام هر سه معیار در بستر آزمایشی (harness) ارزیابی تا بخش اجراکننده بتواند عددهای
perplexity،eceوbrierرا به گزارش مدل اضافه کند.
پرپلکسیتی چه چیزی را نشان میدهد؟
پرپلکسیتی برابر است با پایهی e به توانِ میانگین منفیِ درستنمایی لگاریتمی (Negative Log-likelihood) به ازای هر توکن. هرچه کمتر باشد، بهتر است. پرپلکسیتی 1 یعنی مدل به تکتک توکنهای واقعی احتمال یک داده است. پرپلکسیتی برابر با اندازهی واژگان (Vocabulary size) یعنی توزیع مدل یکنواخت بوده و عملاً هیچ چیزی یاد نگرفته است. اعداد واقعی چیزی بین این دو هستند: یک مدل پایهی قدرتمند سال 2026 روی WikiText-103 عددی بین 8 تا 12 ثبت میکند؛ در حالی که یک مدل ضعیف روی همان متن، به بالای 50 میرسد.
بستر آزمایشی خودش لگاریتم احتمالات را حساب نمیکند؛ این دادهها از طرف تطبیقدهندهی مدل میآیند. کار بستر آزمایشی تجمیع است: فهرستی از منفیِ درستنمایی لگاریتمی به ازای هر توکن و فهرستی از تعداد توکنهای هر توالی را میگیرد و پرپلکسیتی کل پیکره را برمیگرداند.
def perplexity(neg_log_probs, token_counts):
total_nll = sum(neg_log_probs)
total_tokens = sum(token_counts)
return math.exp(total_nll / total_tokens)
این پیادهسازی حالتهای خاص مثل توالیهای بدون توکن را مدیریت میکند و مطمئن میشود منفیِ درستنمایی لگاریتمی حتماً نامنفی باشد. یک خطای رایج، فراموش کردن علامت منفی است: تطبیقدهندهای که بهجای -log p مقدار log p را برگرداند، پرپلکسیتی کمتر از 1 تولید میکند که از نظر ریاضی غیرممکن است. این تابع چنین خطایی را بهعنوان نقض قرارداد شناسایی و متوقف میکند.
معیار ECE چه چیزی را اندازه میگیرد؟
خطای کالیبراسیون مورد انتظار (ECE) پیشبینیها را بر اساس میزان اطمینانشان در تعداد مشخصی بازه دستهبندی میکند، سپس اختلاف میانگین اطمینان و دقت را در تمام بازهها، با وزندهی بر اساس تعداد نمونههای هر بازه، اندازه میگیرد.
فرمول استاندارد از 10 بازه با عرض یکسان در بازهی [0, 1] استفاده میکند. پیادهسازی ما از هر عدد صحیح مثبتی پشتیبانی میکند. پارامتر bins را طوری تعریف کردهایم تا اجراکننده بتواند بین استاندارد رایج در مقالات (10) یا استاندارد مقایسهای (15) انتخاب کند.
ECE نسبت به تعداد بازهها و حجم نمونهها حساسیت و سوگیری دارد. با 10 بازه و تنها 100 پیشبینی، نمیتوان تفاوت ECE با مقدار 0.02 را از نویز تصادفی تشخیص داد. این پیادهسازی، تعداد بازههای پرشده را همراه با خودِ ECE برمیگرداند تا اجراکننده بتواند در صورت کم بودن حجم نمونهها، از گزارش یک عدد منفرد خودداری کند.
امتیاز برایر چه کاری انجام میدهد که ECE نمیتواند؟
معیار ECE فقط به اختلافهای میانگین توجه دارد. مدلی که در نیمی از بازهها بیشازحد مطمئن و در نیم دیگر کمتر از حد مطمئن باشد، ممکن است با وجود کالیبراسیون بسیار ضعیف در بخشهای محلی، ECE پایینی نشان دهد. امتیاز برایر، میانگین مربعات خطا را نسبت به خروجی واقعی برای تکتک پیشبینیها اندازه میگیرد، بنابراین پراکندگی خطاها را مستقیماً جریمه میکند.
برای خروجیهای دوحالته، امتیاز برایر برابر است با mean((p_i - y_i)^2). این مقدار به سه مؤلفهی قابلیت اطمینان، تفکیکپذیری و عدم قطعیت تجزیه میشود. ما هم امتیاز نهایی و هم این تجزیه را حساب میکنیم؛ اجراکننده عدد اسکالر را گزارش میدهد اما جزئیات تجزیهشده را برای داشبورد ثبت میکند.
def brier(p, y):
return float(np.mean((p - y) ** 2))
دادههای نمودار قابلیت اطمینان
نمودار قابلیت اطمینان، اطمینان پیشبینیشده را در مقابل دقت تجربی در هر بازه رسم میکند. خط قطری نشاندهندهی کالیبراسیون بینقص است. تابع سه آرایه خروجی میدهد: میانگین اطمینان در هر بازه، میانگین دقت در هر بازه، و تعداد نمونههای هر بازه. کد رسم نمودار در مراحل بعدی قرار دارد؛ این درس فقط ساختار دادهها را تولید میکند.
چندتایی خروجی دقیقاً همان چیزی است که لایهی فراخواننده برای رسم نمودار یا محاسبهی نسخههای سفارشی ECE (مانند ECE تطبیقی، ECE روبشی و غیره) نیاز دارد. دادهها را در قالب آرایههای numpy برمیگردانیم تا کد بعدی نیازی به تبدیل مجدد نداشته باشد.
منابع سنجش اطمینان
بستر آزمایشی فرض نمیکند که عدد اطمینان حتماً از خروجی سافتمکس (Softmax) آمده باشد؛ بلکه برای هر پیشبینی، هر عددی در بازهی [0, 1] را میپذیرد. برای وظایف چندگزینهای، طبیعیترین معیار اطمینان همان سافتمکس روی درستنمایی لگاریتمی گزینهها است. برای متنهای آزاد، معیار طبیعی میتواند احتمال گزارششده توسط خود مدل یا پایهی e به توانِ میانگین درستنمایی لگاریتمی باشد. بخش ارزیابی فقط این عدد را مصرف میکند؛ تولید این عدد بر عهدهی تطبیقدهنده است.
حالتهای خاص
- همهی پیشبینیها نادرست باشند: ECE برابر با میانگین اطمینان میشود، برایر بالا میرود، و پرپلکسیتی همان چیزی خواهد بود که مدل دربارهی متن فکر میکند.
- همهی پیشبینیها درست و با اطمینان بالا باشند: ECE و برایر هر دو نزدیک به صفر خواهند بود.
- پیشبینیکنندهی کاملاً بلاتکلیف با p=0.5: تمام پیشبینیها در یک بازه میافتند، بنابراین ECE برابر با
|0.5 - accuracy|میشود. امتیاز برایر دقیقاً 0.25 خواهد بود؛ چون فارغ از اینکهyبرابر 0 باشد یا 1، همیشه(0.5 - y)^2 = 0.25است. - ورودی خالی: ECE، برایر و نمودار قابلیت اطمینان مقدار
0.0(یا آرایههای پر از صفر) برمیگردانند. پرپلکسیتی برای حالت بدون توکن مقدارNaNمیدهد. هیچکدام از این مسیرها هشدار صادر نمیکنند؛ اجراکننده مقادیر را بررسی کرده و تصمیم میگیرد گزارش کند یا نادیده بگیرد.
این سناریوها در تستها گنجانده شدهاند. شاید یک مدل واقعی روی یک بنچمارک واقعی با چنین شرایطی روبهرو نشود، اما یک تطبیقدهندهی دارای باگ یا یک نمونهی خیلی کوچک میتواند این حالتها را ایجاد کند؛ بستر اجراکننده نباید کرش کند.
یکپارچهسازی و اجرا
کالیبراسیون معیاری نیست که مثل F1 برای هر وظیفه (Task) جداگانه گزارش شود، بلکه گزارشی به ازای کل مدل است. اجراکننده جفتهای (confidence, correct) را در کل فرآیند ارزیابی جمعآوری کرده و معیارهای ECE، برایر و دادههای قابلیت اطمینان را یکبار در انتها محاسبه میکند. پرپلکسیتی هم روی یک پیکرهی متنی آزمون مجزا، و جدا از امتیازدهی وظیفهبهوظیفه محاسبه میشود.
رابط برنامه به این صورت است:
report = CalibrationReport.from_predictions(confidences, correct)
report.ece # float
report.brier # float
report.reliability # tuple of three numpy arrays
report.populated_bins # int
متد PerplexityResult.from_token_nll(neg_log_probs, token_counts) پرپلکسیتی و میانگین منفیِ درستنمایی لگاریتمی به ازای هر توکن را برمیگرداند.
این درس شامل چه مواردی نمیشود؟
اینجا مدلی را فراخوانی نمیکنیم؛ سافتمکس را پیادهسازی نمیکنیم؛ و تخمین اطمینان از روی توکنهای خروجی را انجام نمیدهیم، چرا که این کار وظیفهی تطبیقدهنده است. همچنین به سراغ مقیاسبندی دما (Temperature Scaling) یا مقیاسبندی پلات (Platt Scaling) نمیرویم؛ چون آنها روشهای اصلاحی پسپردازشی هستند و به درس دیگری تعلق دارند. هدف این درس، قابل اعتماد و تکرارپذیر کردن این سه عدد است: پرپلکسیتی، ECE و برایر.
راهنمای خواندن کد
فایل main.py توابع expected_calibration_error ،perplexity، brier_score، reliability_diagram و کلاسهای دادهی CalibrationReport و PerplexityResult را تعریف میکند. دموی برنامه روی پیشبینیهای مصنوعی اجرا میشود که دادهی واقعی (Ground truth) آنها را از قبل میدانیم: یک مدل خوب کالیبرهشده، یک مدل با اطمینان کاذب، و یک مدل با اطمینان کمتر از حد واقعی. تستهای موجود در code/tests/test_calibration.py تمام حالتهای خاص و مقادیر مرجع این پیشبینیکنندههای مصنوعی را پوشش میدهند.
کد main.py را از بالا به پایین بخوانید. ترتیب توابع از خروجیهای اسکالر شروع میشود، به بردارها میرسد و در نهایت گزارش کامل را میسازد. هر تابع توضیحات کوتاهی (Docstring) دربارهی فرمولهای ریاضی و قراردادهای ورودی و خروجی دارد.
گام بعدی
کالیبراسیون نادیدهگرفتهشدهترین بُعد در ارزیابیهای منتشرشده است. بیشتر لیدربوردها فقط یک عدد دقت را نشان میدهند و پرونده را میبندند. مدلی که در دقت برنده است اما امتیاز برایر ضعیفی دارد، برای استفاده در محیط عملیاتی (پروداکشن) بهمراتب بدتر از مدلی است که دقت آن چند امتیاز کمتر است اما عدم قطعیت خود را با اطمینان و درستی گزارش میدهد. وقتی ساختار کالیبراسیون را پیاده کردید، مقیاسبندی دما را روی بخشی از دادههای اعتبارسنجی اعمال کنید، ECE را مجدداً حساب کنید و ببینید چطور این شکاف کوچکتر میشود. آن بخش را در درس دیگری بررسی میکنیم، اما پایهی کار همینجاست.
