فاز 19 · درس 73

محاسبه پرپلکسیتی و کالیبراسیون در ارزیابی مدل‌های زبانی

نوع
ساختنی
زمان
حدود 90 دقیقه
زبان‌ها
Python
پیش‌نیاز
مبانی فاز 19 مسیر B، درس‌های 70 و 71
یک ترازوی دقیق آزمایشگاهی و چند ظرف مدرج شیشه‌ای با اندازه‌گیری‌های مشخص روی میزی تیره
فهرست مطالب
  1. اهداف یادگیری
  2. پرپلکسیتی چه چیزی را نشان می‌دهد؟
  3. معیار ECE چه چیزی را اندازه می‌گیرد؟
  4. امتیاز برایر چه کاری انجام می‌دهد که ECE نمی‌تواند؟
  5. داده‌های نمودار قابلیت اطمینان
  6. منابع سنجش اطمینان
  7. حالت‌های خاص
  8. یکپارچه‌سازی و اجرا
  9. این درس شامل چه مواردی نمی‌شود؟
  10. راهنمای خواندن کد
  11. گام بعدی

بسیاری از بنچ‌مارک‌های مدل‌های زبانی تنها به گزارش دقت نهایی (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 را به گزارش مدل اضافه کند.
قابلیت اطمینان کالیبراسیوناطمینان در برابر دقت
CALIBRATION RELIABILITYBin predictions by stated confidence and plot observed accuracy. A calibrated model sits on the diagonal. The orange gaps are where it claims more confidence than it earns; the expected calibration error is the bin-weighted average of those gaps. Perplexity asks if held-out text is plausible at all; calibration asks if the confidence is honest.بی‌نقصاطمینان پیش‌بینی‌شدهدقت مشاهده‌شدهECE: فاصله تا قطر
پیش‌بینی‌ها را بر اساس میزان اطمینان اعلام‌شده دسته‌بندی کرده و دقت مشاهده‌شده را رسم کنید. یک مدل کالیبره‌شده روی خط قطری قرار می‌گیرد. فاصله‌های نارنجی‌رنگ بخش‌هایی هستند که مدل اطمینانی بیش از استحقاقش ادعا می‌کند؛ خطای کالیبراسیون مورد انتظار (ECE) میانگین وزنی این فاصله‌ها بر اساس اندازه دسته‌ها است. پرپلکسیتی بررسی می‌کند که آیا متن آزمایشی اصلاً محتمل است یا خیر؛ کالیبراسیون می‌پرسد آیا این اطمینان صادقانه است یا نه.

پرپلکسیتی چه چیزی را نشان می‌دهد؟

پرپلکسیتی برابر است با پایه‌ی 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) پیش‌بینی‌ها را بر اساس میزان اطمینانشان در تعداد مشخصی بازه دسته‌بندی می‌کند، سپس اختلاف میانگین اطمینان و دقت را در تمام بازه‌ها، با وزن‌دهی بر اساس تعداد نمونه‌های هر بازه، اندازه می‌گیرد.

N پیش‌بینی با اطمینان p و درستی yدسته‌بندی بر اساس p در M دستهمحاسبه میانگین اطمینان و میانگین دقتبرای هر دستهgap = |avg conf - avg acc|وزن‌دهی با اندازه دسته / NECE = مجموع شکاف‌های وزن‌دار

فرمول استاندارد از 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))

داده‌های نمودار قابلیت اطمینان

نمودار قابلیت اطمینان، اطمینان پیش‌بینی‌شده را در مقابل دقت تجربی در هر بازه رسم می‌کند. خط قطری نشان‌دهنده‌ی کالیبراسیون بی‌نقص است. تابع سه آرایه خروجی می‌دهد: میانگین اطمینان در هر بازه، میانگین دقت در هر بازه، و تعداد نمونه‌های هر بازه. کد رسم نمودار در مراحل بعدی قرار دارد؛ این درس فقط ساختار داده‌ها را تولید می‌کند.

پیش‌بینی‌ها، اطمینان‌هامرزهای دسته‌ها از 0 تا 1میانگین اطمینان در هر دستهمیانگین دقت در هر دستهتعداد در هر دستهسه‌گانه داده‌های قابلیت اطمینان

چندتایی خروجی دقیقاً همان چیزی است که لایه‌ی فراخواننده برای رسم نمودار یا محاسبه‌ی نسخه‌های سفارشی 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 را مجدداً حساب کنید و ببینید چطور این شکاف کوچک‌تر می‌شود. آن بخش را در درس دیگری بررسی می‌کنیم، اما پایه‌ی کار همین‌جاست.

خودآزمایی

به سؤال‌ها جواب بدهید تا ببینید چقدر از درس در ذهنتان مانده است.

  1. پیش از درسپرپلکسیتی 1.0 برای یک مدل زبانی روی پیکره آزمایشی به چه معناست؟
  2. پیش از درسچرا بستر آزمایشی نیازمند دریافت احتمالات لگاریتمی منفی و نامنفی (non-negative) از تطبیق‌دهنده است؟
  3. حین درسخطای کالیبراسیون مورد انتظار (ECE) چه چیزی را اندازه می‌گیرد؟
  4. حین درسچرا پیاده‌سازی، علاوه بر مقدار ECE، مقدار populated_bins را نیز برمی‌گرداند؟
  5. حین درسامتیاز بریر (Brier score) چه چیزی را پوشش می‌دهد که ECE از ثبت آن ناتوان است؟
  6. پس از درسچرا کالیبراسیون یک گزارش به ازای کل مدل است و نه یک معیار به ازای هر وظیفه؟

سؤالات متداول

تفاوت اصلی خطای کالیبراسیون (ECE) با امتیاز برایر (Brier score) چیست؟

معیار ECE فقط میانگین اختلاف اطمینان و دقت را در بازه‌ها اندازه می‌گیرد و ممکن است خطاهای محلی را به دلیل خنثی شدن هم‌پوشانی کند، اما امتیاز برایر میانگین مربعات خطای هر پیش‌بینی نسبت به برچسب واقعی را حساب کرده و پراکندگی خطا را مستقیماً جریمه می‌کند.

چرا مقدار پرپلکسیتی نباید کمتر از 1 شود؟

پرپلکسیتی برابر با e به توان منفیِ درست‌نمایی لگاریتمی است. اگر احتمال وقوع هر توکن یک باشد، منفی درست‌نمایی صفر و پرپلکسیتی 1 می‌شود. مقادیر زیر 1 نشان‌دهنده‌ی اشتباه محاسباتی مانند فراموشی منفی در -log p هستند.

آیا برای محاسبه معیارهای کالیبراسیون به اجرای مستقیم مدل نیاز است؟

خیر؛ لایه‌ی ارزیابی فقط مقادیر احتمال پیش‌بینی‌شده در بازه‌ی [0, 1] و درستی خروجی‌ها را دریافت می‌کند و استخراج این مقادیر از خروجی مدل بر عهده‌ی تطبیق‌دهنده (Adapter) است.

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.