تخطَّ إلى المحتوى
4/30الفصل 4 من 30

التصنيف، الإنتروبيا المتقاطعة، وكيف لا تخدع نفسك

ابنِ مصنّفًا لوجستيًا من دالة الخسارة وgradient descent، واكتشف لماذا قد تعني دقة 98٪ نموذجًا لا يجد شيئًا.

في هذه الصفحة

نموذج يجيب بأن هذا الجزء سليم عن كل جزء يخرج من السير يكون محقًا في 98.15 % من الحالات. وهو أيضًا عديم القيمة: من بين 74 جزءًا معيبًا في مجموعة الاختبار، لا يلتقط أيًا منها.

الجملتان تصفان النموذج نفسه. والمسافة بينهما هي هذا الفصل.

النصف الأول يبني المصنّف. لا يحتاج إلى شيء جديد تقريبًا: أعطى الفصل 2 وصفة تحويل افتراض عن كيفية إنتاج البيانات إلى دالة خسارة، وأعطى الفصل 3 آلية السير نزولًا على أي خسارة تعطيك إياها تلك الوصفة. طبّق الاثنين على سؤال نعم/لا فتظهر الانحدار اللوجستي، ومعه فكرة جديدة واحدة — logit — سيُعاد استخدامها في الفصل 17.

النصف الثاني هو الأصعب. كل ما يأتي بعد هذه النقطة في الدورة سيُحكم عليه برقم قاسه شخص ما، وإذا لم تستطع التمييز بين تحسّن حقيقي وأثر قياس، فكل فصل تالٍ يصبح زينة. إذن: مصفوفة الالتباس، precision وrecall، والتقسيمات الثلاثة، والتسرّب، والسؤال الذي لا يجيب عنه أحد تقريبًا بصدق — كم مثال اختبار أحتاج فعليًا؟

الحساب هنا يجري على 20,000 صف، لذلك هو متجّه بالكامل — NumPy تؤدي العمل منذ الفصل 2، ومن الآن فصاعدًا لن يعود الأمر مستحقًا للتنبيه.

المصنع نفسه كما في الفصل 1، لكن السؤال أصعب. بدلًا من اقبل أو ارفض، السؤال هو هل هذا الجزء معيب — والعيوب نادرة، ما يجعل نصف القياس في هذا الفصل صعبًا ونصف النمذجة سهلًا على نحو خادع.

belt.pyPYTHON
import numpy as np

rng = np.random.default_rng(4)
N = 20_000
width  = rng.normal(22.0, 0.9, N)      # millimetres
weight = rng.normal(57.0, 3.0, N)      # grams

z_true = -5.90 + 1.90 * (width - 22.0) + 0.42 * (weight - 57.0)
y = (rng.random(N) < 1 / (1 + np.exp(-z_true))).astype(float)

perm = rng.permutation(N)
train, val, test = perm[:12_000], perm[12_000:16_000], perm[16_000:]
TEXT
N = 20000  defects = 337  base rate = 0.0169
defects per split = 203 60 74

ثلاثة تقسيمات، لا اثنان. السبب يستحق قسمًا مستقلًا وسيأتي بعد قليل؛ الآن، درّب على الأول، واضبط على الثاني، ولا تنظر إلى الثالث.

تُوحّد الخصائص — يُطرح المتوسط وتُقسم على الانحراف المعياري — باستخدام إحصاءات التدريب فقط، للسبب الذي أوضحه الفصل 1 مع حد تقارب perceptron: البيانات غير المتمركزة تجعل الهندسة عدائية. أي الصفوف يُسمح لك بحساب ذلك المتوسط منها سيصبح سؤالًا حيًا لاحقًا في هذا الفصل.

كان perceptron يعيد إشارة. والإشارة لا تستطيع التمييز بين ارفض وارفض، لكن بالكاد، وهذا الفرق هو بالضبط ما يحتاجه مصنع ليقرر أي الأجزاء يجب أن يعيد إنسان فحصها أولًا.

لذلك اتبع وصفة الفصل 2 حرفيًا. اكتب ما تدّعيه عن كيفية إنتاج الوسم، خذ الاحتمالية، خذ اللوغاريتم، اعكس الإشارة، فتحصل على خسارة. لنتيجة نعم/لا يكون الادعاء توزيع Bernoulli: هناك احتمال pp أن يكون الجزء معيبًا، و

P(yp)=py(1p)1yP(y \mid p) = p^{\,y}\,(1-p)^{\,1-y}

وهي فقط طريقة مضغوطة لكتابة «pp إذا كان y=1y = 1، و1p1-p إذا كان y=0y = 0». خذ لوغاريتم ذلك واعكس إشارته، فتكون الخسارة لمثال واحد هي

L=[ylogp+(1y)log(1p)]L = -\big[\,y \log p + (1 - y)\log(1 - p)\,\big]

هذه هي الإنتروبيا المتقاطعة الثنائية. لم تُختر لأنها مريحة؛ إنها سالب لوغاريتم الاحتمالية للتوزيع الوحيد الذي يمكن أن تمتلكه رمية عملة. لم يكن هناك شيء آخر متاح.

ما يزال مفقودًا هو من أين يأتي pp. يحسب النموذج مجموعًا مرجّحًا s=wx+bs = \mathbf{w}\cdot\mathbf{x} + b، وهو عدد حقيقي يمتد على الخط كله، بينما يجب أن يعيش الاحتمال في (0,1)(0,1). الدالة التي تنقل بينهما هي logistic sigmoid:

σ(s)=11+es\sigma(s) = \frac{1}{1 + e^{-s}}
TEXT
logit -4.0  ->  p = 0.0180        loss when y=1 and p=0.9  : 0.1054
logit -1.0  ->  p = 0.2689        loss when y=1 and p=0.5  : 0.6931
logit  0.0  ->  p = 0.5000        loss when y=1 and p=0.01 : 4.6052
logit  4.0  ->  p = 0.9820

اقرأ العمود الأيمن كقائمة أسعار. أن تكون مصيبًا بثقة 90 % يكلّف 0.105. رفض الالتزام يكلّف 0.693 — وهو log2\log 2، ثمن هز الكتفين. أن تكون مخطئًا بثقة يكلّف 4.6، أي أكثر بأربع وأربعين مرة، ويرتفع السعر بلا حد كلما ازداد النموذج يقينًا من خطأ. الإنتروبيا المتقاطعة لا تعدّ الأخطاء فحسب: إنها تفرض رسومًا على الغرور.

قال الفصل 3: لتدريب أي شيء، احصل على مشتقة الخسارة بالنسبة إلى كل معلمة. افعل ذلك لمثال واحد. مع s=wx+bs = \mathbf{w}\cdot\mathbf{x} + b وp=σ(s)p = \sigma(s):

Ls=py,Lw=(py)x,Lb=py\frac{\partial L}{\partial s} = p - y, \qquad \frac{\partial L}{\partial \mathbf{w}} = (p - y)\,\mathbf{x}, \qquad \frac{\partial L}{\partial b} = p - y
عرض التفاصيل

السطران اللذان يجعلان الفوضى تتلاشى. لدى sigmoid مشتقة لطيفة على نحو غير معتاد، σ(s)=σ(s)(1σ(s))=p(1p)\sigma'(s) = \sigma(s)\,(1 - \sigma(s)) = p(1-p). وتُشتق الخسارة إلى

Lp=yp+1y1p=pyp(1p)\frac{\partial L}{\partial p} = -\frac{y}{p} + \frac{1-y}{1-p} = \frac{p - y}{p\,(1-p)}

اضرب الاثنين بقاعدة السلسلة فيظهر p(1p)p(1-p) مرة في الأعلى ومرة في الأسفل. يُلغى تمامًا، وما يبقى هو pyp - y. هذا الإلغاء ليس مصادفة — إنه ما يحدث كلما كانت الخسارة سالب لوغاريتم الاحتمالية لتوزيع، وكانت دالة الخرج هي الدالة التي يستخدمها ذلك التوزيع طبيعيًا. لهذا الاقتران اسم — نموذج خطي معمّم — والتدرج المرتّب بصمته.1

إذن التحديث هو التنبؤ ناقص الحقيقة، مضروبًا في المدخل. لا شيء آخر. هذا هو المدرّب كاملًا، وهو gradient descent من الفصل 3 مع تغيير سطر واحد:

logistic.pyPYTHON
def sigmoid(z):
    return np.where(z >= 0, 1.0 / (1.0 + np.exp(-z)),
                    np.exp(np.minimum(z, 0)) / (1.0 + np.exp(np.minimum(z, 0))))


def fit_logistic(X, y, lr=0.5, epochs=4000):
    w, b = np.zeros(X.shape[1]), 0.0
    for _ in range(epochs):
        p = sigmoid(X @ w + b)
        g = p - y                        
        w -= lr * (X.T @ g) / len(y)     
        b -= lr * g.sum() / len(y)       
    return w, b

الـ np.where في sigmoid ليس تجميليًا. حساب 1/(1+es)1/(1+e^{-s}) مباشرة يفيض عند ss سالب كبير؛ يختار الفرع الصيغة المطابقة جبريًا التي تُبقي الأس سالبًا. هذا أول دين يجمعه صندوق الفاصلة العائمة من الفصل 2، وسيجمع دينًا أكبر بعد قسمين.

لماذا لا نستخدم الخطأ التربيعي، ولماذا تتعلق الإجابة بالتدرج

رابط إلى القسم: لماذا لا نستخدم الخطأ التربيعي، ولماذا تتعلق الإجابة بالتدرج

الشرح القياسي لتفضيل الإنتروبيا المتقاطعة على الخطأ التربيعي هو حجة الاحتمالية أعلاه: الخطأ التربيعي هو ما تحصل عليه من افتراض ضوضاء Gaussian، والوسوم ليست Gaussian، لذلك لا تفعل. هذا صحيح ولا يقنع أحدًا، لأنك تستطيع كتابة L=(py)2L = (p - y)^2 فوق sigmoid وسيتدرّب.

الحجة التي تصل هي عن التدرج. ضع الخطأ التربيعي فوق sigmoid وتعطيك قاعدة السلسلة

Ls=2(py)p(1p)\frac{\partial L}{\partial s} = 2\,(p - y)\,p\,(1-p)

ذلك العامل الإضافي p(1p)p(1-p) هو الذي أُلغي سابقًا. الآن لا يُلغى، ويذهب إلى الصفر كلما كان النموذج واثقًا — بما في ذلك عندما يكون النموذج مخطئًا بثقة. قيّم الاثنين عند بضع درجات، لمثال وسمه الحقيقي 1:

الدرجة ssppالإنتروبيا المتقاطعة L/s\partial L/\partial sالخطأ التربيعي L/s\partial L/\partial sالنسبة
8-80.0003350.999665-0.9996650.000670-0.0006701,491
4-40.0179860.982014-0.9820140.034690-0.03469028.3
2-20.1192030.880797-0.8807970.184956-0.1849564.8
000.5000000.500000-0.5000000.250000-0.2500002.0
+2+20.8807970.119203-0.1192030.025031-0.0250314.8

عند s=8s = -8 يكون النموذج مخطئًا بأقصى قدر ممكن، ويرد الخطأ التربيعي بتدرج أصغر 1,491 مرة من تدرج الإنتروبيا المتقاطعة. كلما كان الخطأ أسوأ، تعلّم النموذج منه أقل. أما تدرج الإنتروبيا المتقاطعة فيتشبع عند 1-1: الخطأ الأقصى ينتج إشارة كبرى، ولا أكبر منها.

شغّل السباق. ألفا نقطة متوازنة، أوزان بداية متطابقة مختارة لتكون مخطئة بثقة (w=[6,6]\mathbf{w} = [-6, -6])، ومعدل تعلم متطابق، والخسارة وحدها تختلف. تُقاس الجولتان بالإنتروبيا المتقاطعة كي تكون الأعمدة قابلة للمقارنة.

الحقبةخسارة الإنتروبيا المتقاطعةالدقةخسارة الخطأ التربيعيالدقة
15.48650.23005.94990.2290
101.55250.24605.90420.2290
500.46420.77805.69130.2320
1000.46390.77705.39550.2410
2000.46390.77704.63110.2745
5000.46390.77700.52910.7660
1,0000.46390.77700.46400.7765

تنتهي الإنتروبيا المتقاطعة بحلول الحقبة 50. لا يزال الخطأ التربيعي عند دقة 24 % في الحقبة 100 — ولم يتحرك من 23 % عند الحقبة 10 — أي أسوأ من التخمين، لأنه بدأ مخطئًا بثقة والتدرج الذي كان سينقذه ضُرب في 0.0007. يهرب قرب الحقبة 500 ويهبط في المكان نفسه. لذلك فالملخص الصادق هو أن الخطأ التربيعي فوق sigmoid ليس غير صحيح؛ إنه بطيء بالضبط حيث تكون السرعة أهم ما يكون. في نموذج ذي معاملين تخسر 450 حقبة. في شبكة ذات مئة طبقة، حيث تكون وحدة ما في مكان ما مخطئة بثقة دائمًا، تخسر تشغيل التدريب.

الإنتروبيا، والإنتروبيا المتقاطعة، وKL في صفحة واحدة

رابط إلى القسم: الإنتروبيا، والإنتروبيا المتقاطعة، وKL في صفحة واحدة

ثلاث كميات، سنحتاجها بدقة في الفصل 8 من أجل perplexity وفي الفصل 11 من أجل العقوبة التي تُبقي سياسة fine-tuned قريبة من مرجعها. هي أسهل من سمعتها.2

الإنتروبيا هي متوسط عدد البتات التي يجب أن تنفقها للتواصل عن سحبة من توزيع، إذا استخدمت أفضل ترميز ممكن له:

H(p)=ipilog2piH(p) = -\sum_i p_i \log_2 p_i

الإنتروبيا المتقاطعة هي ما تنفقه عندما تستخدم ترميزًا مبنيًا لـ qq على بيانات تأتي فعليًا من pp:

H(p,q)=ipilog2qiH(p, q) = -\sum_i p_i \log_2 q_i

تباعد KL هو الفائض — الهدر، بالبتات، الناتج عن تصديق qq بينما الحقيقة هي pp:

DKL(pq)=H(p,q)H(p)D_{\mathrm{KL}}(p \parallel q) = H(p,q) - H(p)

تحقق من الثلاثة على السير:

TEXT
test defect rate                                = 0.0185
entropy of that coin                            = 0.1329 bits
cross-entropy of the constant predictor on test = 0.1330 bits
KL(test coin || fair coin)                      = 0.8671 bits
H + KL                                          = 1.0000 bits
cross-entropy of the p=0.5 predictor on test    = 1.0000 bits

يظهر هناك أمران. أولًا، نموذج يبلّغ ببساطة معدل الأساس في التدريب، 1.69 %، يحقق إنتروبيا متقاطعة قدرها 0.1330 بت، تقريبًا تمامًا إنتروبيا وسوم الاختبار — كما يجب، لأنه يملك التوزيع الصحيح ولا معلومات أخرى. الإنتروبيا هي الأرضية التي يشتريها لك الجهل بالفرد. ثانيًا، نموذج يهز كتفيه ويقول 0.5 يدفع بالضبط 1 بت، والفجوة بين الاثنين، 0.8671 بت، هي بدقة تباعد KL. H+DKL=H(p,q)H + D_{\mathrm{KL}} = H(p,q) ليست هوية للحفظ؛ إنها فاتورة تستطيع مشاهدة بنودها تتراكم.

والاتصال العائد إلى التدريب: عندما يكون الوسم صنفًا واحدًا معروفًا، يكون التوزيع «الحقيقي» one-hot، وتكون إنتروبيته صفرًا، وتكون الإنتروبيا المتقاطعة مساوية لتباعد KL. تقليل الإنتروبيا المتقاطعة وسحب توزيع النموذج نحو الحقيقة هما الفعل نفسه.

أكثر من إجابتين: softmax، والإزاحة التي لا تكلّف شيئًا

رابط إلى القسم: أكثر من إجابتين: softmax، والإزاحة التي لا تكلّف شيئًا

العيب ليس شيئًا واحدًا. في القولبة، قد يخرج الجزء كـ short shot (مادة غير كافية)، أو flash (مادة زائدة، مضغوطة خارج القالب)، أو burn. أربع نتائج، إذن أربعة logits، ويجب أن تتحول إلى أربعة احتمالات مجموعها واحد. هذه هي softmax:

softmax(z)i=ezijezj\operatorname{softmax}(\mathbf{z})_i = \frac{e^{z_i}}{\sum_j e^{z_j}}

لها خاصية تبدو كحادث وهي في الحقيقة التنفيذ كله:

softmax(z+c)=softmax(z)\operatorname{softmax}(\mathbf{z} + c) = \operatorname{softmax}(\mathbf{z})

لأي ثابت cc، لأن ezi+c=ecezie^{z_i + c} = e^{c} e^{z_i} وece^c يُلغيان في الأعلى والأسفل. وحدها الفروق بين logits تعني شيئًا. المستوى المطلق ليس معلومة.

ولحسن الحظ، لأن المستوى المطلق هو ما يكسر الحاسوب:

TEXT
logits            = [800. 801. 799.]
naive softmax     = [nan nan nan]
shifted by -max   = [0.2447 0.6652 0.09  ]
same softmax after adding 1000 to every logit: True

e800e^{800} يفيض float ذي 64 بت، ويصبح المجموع لا نهائيًا، واللانهاية مقسومة على اللانهاية هي nan — ليست خطأ، ولا انهيارًا، بل ثقبًا صامتًا حيث كانت هناك ثلاثة احتمالات. طرح أكبر logit لا يغير شيئًا رياضيًا ويغير كل شيء عدديًا، لأن أكبر أس يصبح بالضبط e0=1e^0 = 1. هذه هي خدعة logsumexp من الفصل 2 وهي ترتدي ملابس العمل، وكل تنفيذ جاد يفعلها:

softmax.pyPYTHON
def softmax(Z):
    Z = Z - Z.max(axis=1, keepdims=True)   
    E = np.exp(Z)
    return E / E.sum(axis=1, keepdims=True)


def fit_softmax(X, Y, lr=1.0, epochs=6000):
    W, b = np.zeros((X.shape[1], Y.shape[1])), np.zeros(Y.shape[1])
    for _ in range(epochs):
        G = (softmax(X @ W + b) - Y) / len(X)   
        W -= lr * (X.T @ G)
        b -= lr * G.sum(0)
    return W, b

التدرج هو مجددًا التنبؤ ناقص الحقيقة، الآن مع YY one-hot. كانت الحالة الثنائية حالة خاصة طوال الوقت.

بعد تدريبه على 3,000 جزء واختباره على 1,000، مع ثلاثة قياسات لكل جزء (العرض، الوزن، درجة حرارة الانصهار)، يصل إلى دقة 94.00 %. هذا ما يخفيه ذلك الرقم:

الحقيقة ↓ / المتوقع →سليمshort shotflashburnrecall
سليم8505900.984
short shot2221000.488
flash2003010.588
burn300390.929
precision0.9500.8080.7690.975

يعثر النموذج على أقل من نصف حالات short shot. لا تستطيع الدقة رؤية ذلك، لأن 86 % من الأجزاء سليمة، وتصحيح تلك يكفي لحمل المتوسط. Macro F1 — متوسط درجات F1 لكل صنف، والذي يزن الصنف النادر مثل الشائع — يساوي 0.7983، مقابل micro F1 يساوي 0.9400 وهو مطابق للدقة بحكم التعريف. كلما أبلغك أحدهم برقم F1 واحد، اسأل أي نوع.

هذا آخر ما يتعلق بالنمذجة. بقية الفصل عن الأرقام.

خذ النموذج الثنائي المدرّب وأنشئ نسختين بضرب كل logit في ثابت: 0.35 لنسخة مترددة، و4 لنسخة مفرطة الثقة. الضرب بعدد موجب لا يمكن أن يغيّر أي إشارة، لذلك تتنبأ النماذج الثلاثة بالوسم نفسه تمامًا لكل أجزاء الاختبار البالغ عددها 4,000. لا تستطيع الدقة التمييز بينها. أما الإنتروبيا المتقاطعة فلا تواجه أي صعوبة:

النموذجالدقةالإنتروبيا المتقاطعةمتوسط الخسارة عند الصوابمتوسط الخسارة عند الخطأأسوأ خسارة مفردة
متردد (logits × 0.35)0.98300.15490.13691.19902.80
كما دُرّب0.98300.05640.01472.46897.82
مفرط الثقة (logits × 4)0.98300.15630.00099.142727.63

يدفع النموذج المتردد ضريبة صغيرة على كل جزء، بما في ذلك الآلاف التي يصيبها. أما النموذج مفرط الثقة فهو شبه مجاني عندما يصيب وكارثي عندما يخطئ — جزء واحد في مجموعة الاختبار تلك يكلّفه 27.63 nats وحده. يصل الاثنان إلى إجمالي شبه متساوٍ عبر طريقين متعاكسين، ويجلس النموذج المدرّب، الذي عُيّرت احتمالاته مع البيانات، أدنى بثلاث مرات من كليهما.

هذه أدق طريقة لبيان الفرق بين الخسارة والمقياس. الخسارة هي ما تحسّنه: يجب أن تكون قابلة للاشتقاق، وترى كل ما قاله النموذج، بما في ذلك مدى يقينه. المقياس هو ما تُحاكم عليه: يمكن أن يكون دالة درجية، أو قاعدة عمل، أو عدد العيوب الفائتة. ليسا الشيء نفسه ولا يتفقان دائمًا — ولهذا تعرّف كليهما قبل أن تبدأ، ولا تدع الخسارة تقوم مقام المقياس لمجرد أنها على الشاشة.

قبل أي نموذج، المتطلب: ما نتيجة أكثر إجابة كسولة ممكنة؟ على هذا السير، قل دائمًا سليم:

TEXT
always-say-fine baseline: accuracy = 0.9815
confusion (tn, fp, fn, tp) = (3926, 0, 74, 0)

98.15 %. والآن النموذج اللوجستي المدرّب، عند العتبة الافتراضية 0.5:

TEXT
logistic @0.5: accuracy=0.9830 precision=0.8000 recall=0.1081 F1=0.1905
confusion (tn, fp, fn, tp) = (3924, 2, 66, 8)

98.30 %. لقد تغلّب على خط الأساس بـ 0.15 من نقطة مئوية، وأي تقرير يتوقف عند الدقة سيعد ذلك فوزًا. تقول مصفوفة الالتباس ما حدث فعليًا:

متوقع سليممتوقع معيب
سليم فعليًا3,9242
معيب فعليًا668

ثلاثة أرقام تسمّي الطرق الثلاث لقراءة ذلك الجدول:

  • Precision =TP/(TP+FP)=8/10=0.800= \mathrm{TP}/(\mathrm{TP}+\mathrm{FP}) = 8/10 = 0.800. من الأجزاء التي أشار إليها، كم كان معيبًا حقًا. هذه كلفة الفحوصات المهدرة.
  • Recall =TP/(TP+FN)=8/74=0.108= \mathrm{TP}/(\mathrm{TP}+\mathrm{FN}) = 8/74 = 0.108. من الأجزاء المعيبة، كم التقط. هذه كلفة شحن جزء سيئ إلى عميل.
  • F1 =2PR/(P+R)=0.190= 2PR/(P+R) = 0.190، متوسطهما التوافقي، الذي يبقى قريبًا من الأصغر بينهما ولذلك يرفض أن يُجامل بأحدهما وحده.

ما يهم يعتمد على المصنع، لا على الرياضيات: الفحص يكلّف بضع ثوانٍ والعيب المشحون يكلّف إشعار استدعاء، لذلك يهيمن recall هنا و0.108 فشل.

لكن النموذج ليس المشكلة. العتبة هي المشكلة، والعتبة ليست جزءًا من النموذج — إنها قرار عمل يُطبّق لاحقًا على احتمال. امسحها:

العتبةTPFPFNالدقةprecisionrecallF1
0.50082660.98300.8000.1080.190
0.2002728470.98120.4910.3650.419
0.10042118320.96250.2630.5680.359
0.05054236200.93600.1860.7300.297
0.0206757070.85580.1050.9050.188
0.005711,36030.65930.0500.9590.094

اقرأ عمود الدقة نزولًا. ينخفض طوال الطريق — من 98.30 % إلى 65.93 % — بينما ينتقل النموذج من التقاط 8 عيوب إلى التقاط 71 من 74. كل شيء مفيد يستطيع هذا النموذج فعله يجعل دقته أسوأ. الفريق الذي يحسّن الرقم الرئيسي سيشحن النسخة التي لا تجد شيئًا.

عرض التفاصيل

وزن الأصناف لا يخلق إشارة، بل يحرّك نقطة التشغيل. أول رد فعل معتاد مع الأصناف غير المتوازنة هو وزن الصنف النادر في الخسارة. بفعل ذلك، مع أوزان 1 و10 و60 على الموجبات:

وزن الموجباتالدقةprecisionrecallF1AUC
10.98300.8000.1080.1900.9363
100.96050.2530.5810.3520.9361
600.82900.0910.9190.1660.9361

يتحرك precision وrecall كثيرًا. أما AUC — احتمال أن يرتّب النموذج جزءًا معيبًا عشوائيًا أعلى من جزء جيد عشوائي، وهو يتجاهل العتبة تمامًا — فيتحرك بمقدار 0.0002، أي لا شيء. أعاد الوزن تحريك النموذج نفسه على منحنى المفاضلة نفسه. غالبًا هذا ما تريده، لكنه ليس معلومات جديدة أبدًا: إذا كان الترتيب سيئًا، فلن تنقذه أي طريقة وزن.

ثلاثة تقسيمات، والتسرّب الذي أنت على وشك إيجاده

رابط إلى القسم: ثلاثة تقسيمات، والتسرّب الذي أنت على وشك إيجاده

لماذا ثلاثة تقسيمات لا اثنان؟ لأن اللحظة التي تستخدم فيها مجموعة أمثلة لاختيار أي شيء — عتبة، أو معدل تعلم، أو أيًا من ستة نماذج ستشحن — تكون تلك المجموعة قد استُخدمت للملاءمة، وتتوقف نتيجتها عن كونها غير منحازة.3 بالقياس على هذا السير: مسح العتبة على مجموعة التحقق يختار 0.196، ثم يسجل النموذج F1 = 0.4122 على مجموعة الاختبار غير الممسوسة. لو أُجري المسح على مجموعة الاختبار مباشرة، لكان أفضل رقم ممكن هناك 0.4186 — وهو رقم لا يحق لأحد الإبلاغ عنه.

الفجوة صغيرة هنا، 0.006، لأن هذا hyperparameter واحد مُسح مرة واحدة مقابل 4,000 مثال تحقق. تكبر مع كل قرار إضافي ومع كل تصغير لمجموعة التحقق. لاحظ أيضًا أن الاتجاه غير مضمون في تشغيل واحد: العتبة المختارة سجلت 0.3902 على التحقق و0.4122 على الاختبار، لذلك بالغت مجموعة التحقق في خفض تقديرها هذه المرة. الانحياز منهجي عبر قرارات كثيرة، لا يُرى في قرار واحد.4

والآن التمرين. يصل سجل السير بعمود ثالث، station_seconds: كم من الوقت قضى كل جزء في محطة الفحص. إضافته تغيير من سطر واحد في المعالجة المسبقة. هذا ما يفعله:

النموذجالدقةprecisionrecallF1الإنتروبيا المتقاطعةAUC
العرض + الوزن0.98300.8000.1080.1900.05640.9363
+ station_seconds0.99200.7920.7700.7810.02360.9970

يرتفع recall من 10.8 % إلى 77.0 %. ويتضاعف F1 أكثر من أربع مرات. ولاحظ ما فعلته الدقة: 98.30 % → 99.20 %، مكسب تسعة أعشار نقطة، وهو نوع الرقم الذي يُقرّب في شريحة ملخص إلى «حوالي 99 % في الحالتين». فشلت الدقة في رؤية الفشل سابقًا، وتفشل الآن في رؤية الاحتيال.

قبل المتابعة: النموذج يغش. اكتشف كيف.

كيف تطارد تسرّبًا، بالترتيب الذي يجده أسرع.

  1. قارن التدريب والاختبار. يظهر فرط الملاءمة كفجوة كبيرة. هنا: النموذج النزيه 0.9838 تدريب / 0.9830 اختبار؛ النموذج المتسرّب 0.9936 تدريب / 0.9920 اختبار. كلتا الفجوتين أقل من 0.2 نقطة. التسرّب لا يبدو كفرط ملاءمة — فالخاصية المتسرّبة متاحة بالقدر نفسه في وقت الاختبار، لذلك يعمم النموذج ببراعة على عالم غير موجود.

  2. درّب نموذجًا واحدًا لكل خاصية، وحدها. أي شيء يحمل الإجابة سيعلن عن نفسه:

    الخاصية وحدهاالدقةrecallF1AUC
    العرض0.98150.0140.0260.8691
    الوزن0.98150.0000.0000.7914
    station_seconds0.98500.4050.5000.9960

    عمود واحد، وحده، يرتّب العيوب عند AUC 0.9960. قياسان مأخوذان بالقدّمة والميزان يحققان 0.87 و0.79. هذا اللاتماثل هو الإنذار.

  3. اسأل متى كُتب كل رقم. متوسط زمن البقاء: 2.23 ثانية للأجزاء التي نجحت، و15.56 ثانية للأجزاء التي فشلت. بالطبع. يبقى الجزء في المحطة لأن مفتشًا سحبه من السير — وهذا يحدث بعد، وفقط لأن، شخصًا قرر أنه معيب. العمود ليس قياسًا للجزء. إنه قياس للحكم.

the planted leakPYTHON
station = 1.8 + rng.exponential(0.35, N)                     # a part just passing through
audited = rng.random(N) < 0.006                              # random spot checks
station[audited] += rng.uniform(6.0, 26.0, audited.sum())
station[y == 1] = 9.0 + rng.exponential(7.0, (y == 1).sum())  

السطر المميز هو التسرّب: زمن بقاء الجزء المعيب يُسحب من توزيع مختلف، لأن إنسانًا أخذه من السير. هذا أكثر خطأ جسيم شيوعًا في تعلم الآلة التطبيقي، وله اسم: تسرّب الهدف — معلومات في خصائص التدريب لن تكون متاحة في اللحظة التي يجب أن يتم فيها التنبؤ.5 لا يرمي أي استثناء. ينتج رقمًا أفضل. وكل حافز في المشروع يشير إلى إبقائه.

الدفاع سؤال واحد، يُطرح على كل عمود: في اللحظة التي أحتاج فيها هذا التنبؤ، هل توجد هذه القيمة بعد؟ على سير حي، station_seconds غير معروف حتى بعد فحص الجزء — وهو الشيء الذي كان من المفترض أن يستبدله النموذج.

لنفترض أنك قيّمت نموذجًا على 20 مثالًا وأصاب في 17. تبلغ عن 85 %.

TEXT
17 correct out of 20 -> accuracy 0.8500
  Wilson    95% CI : [0.6396, 0.9476]
  bootstrap 95% CI : [0.7000, 1.0000]
  P(a 65% model scores 17 or more out of 20) = 0.0444
  P(an 85% model scores 17 or more out of 20) = 0.6477

القراءة الصادقة لـ 17/20 هي في مكان ما بين 64 % و95 %. نموذج حقيقي بدقة 65 % ينتج هذه النتيجة 4.4 % من الوقت — تشغيل واحد من ثلاثة وعشرين — وإذا جرّبت حفنة من prompts وأبلغت عن الأفضل، فقد صنعت ذلك التشغيل بنفسك. سبعة عشر من عشرين لا تميّز نموذجًا بدقة 85 % من نموذج بدقة 65 %.

طريقتان لوضع فاصل على معدل، وكلتاهما تنتميان إلى أدواتك:

uncertainty.pyPYTHON
def wilson(k, n, z=1.959963985):
    """95% interval for k successes in n trials. Correct at small n; no simulation."""
    ph, d = k / n, 1 + z * z / n
    centre = (ph + z * z / (2 * n)) / d
    half = z * (ph * (1 - ph) / n + z * z / (4 * n * n)) ** 0.5 / d
    return centre - half, centre + half


def bootstrap_ci(correct, n_resamples=10_000, alpha=0.05, seed=0):
    """95% interval for the mean of any per-example score array. Works on F1 too."""
    rng = np.random.default_rng(seed)
    correct = np.asarray(correct, dtype=float)
    draws = correct[rng.integers(0, len(correct), size=(n_resamples, len(correct)))]
    lo, hi = np.quantile(draws.mean(axis=1), [alpha / 2, 1 - alpha / 2])
    return float(correct.mean()), float(lo), float(hi)

استخدم Wilson6 لمعدل نجاح بسيط؛ يبقى حسن السلوك عند أي nn ولا يحتاج إلى عشوائية. لاحظ أعلاه أنه عند n=20n = 20 تكون نهاية bootstrap العليا 1.0000 — يمكن لإعادة أخذ عينات من 20 نقطة أن تسحب بسهولة 20 نقطة صحيحة، لذلك لا يستطيع تمثيل فاصل أضيق من حبيبيته. استخدم bootstrap7 حيث لا توجد صيغة، وهي معظم الحالات المثيرة للاهتمام: F1، والمتوسطات الكلية، وBLEU، وpass@1، ودرجة حَكَم قائم على rubric. على هذا السير، يحمل F1 للنموذج المضبوط البالغ 0.4122 فاصل bootstrap قدره [0.3009, 0.5156] — وهذا هو الرقم الذي يجب أن يظهر في التقرير، لأن التقدير النقطي وحده يدعو إلى مقارنة لا يستطيع دعمها.

قياس آخر، لأنه يغيّر طريقة مقارنة نموذجين. نموذجان قُيّما على الأمثلة الـ 500 نفسها:

TEXT
model A: 0.8580  95% CI [0.8260, 0.8880]
model B: 0.8120  95% CI [0.7780, 0.8460]
the two intervals overlap: True
paired difference A-B: 0.0460  95% CI [0.0260, 0.0680]
they disagree on 31 of 500 examples (A right 27, B right 4)

تتداخل فواصلهما، والقاعدة الشعبية — تداخل أشرطة الخطأ يعني عدم وجود فرق معنوي — ستعد المقارنة غير حاسمة. ليست كذلك. شُغّل النموذجان على الأمثلة نفسها، لذلك الكمية الصحيحة هي الفرق لكل مثال، وفاصله [0.0260, 0.0680]، وهو أعلى من الصفر بارتياح. لا يختلفان إلا في 31 من 500 عنصر، ويفوز A في 27 من تلك الاختلافات؛ الأمثلة المشتركة، السهلة والصعبة على السواء، تُلغى بدلًا من أن تضيف ضوضاء. قارن النماذج مقارنة مزدوجة، وستصل إلى الخلاصة نفسها من جزء من البيانات.

لديك الآن نموذج يخرج احتمالات معايرة، وخسارة مشتقة من ادعاء عن البيانات لا مختارة للراحة، وتدرج هو حرفيًا التنبؤ ناقص الحقيقة، و — الأهم — آلية لمعرفة ما إذا كان أي من ذلك يعمل. يُعاد استخدام فاصل Wilson ذي العشرة أسطر أعلاه حرفيًا: يحمل متغيرات prompt في الفصل 15، وجداول الاسترجاع في الفصل 19، والمجموعة الذهبية في الفصل 29. أما bootstrap فهو ما تلجأ إليه عندما لا توجد صيغة.

لكن النموذج ما زال طبقة واحدة. يرسم خطًا، وقد أثبت الفصل 1 بأربعة صفوف من XOR أن الخط لا يكفي. الإصلاح هو التكديس: طبقة أولى تثني الفضاء، وطبقة ثانية ترسم الخط في الفضاء المثني.

هنا ينفد التدرج المرتّب في هذا الفصل. كل ما سبق نجح لأن L/s=py\partial L/\partial s = p - y أمكن كتابته يدويًا، مرة واحدة، لنموذج فيه طبقة واحدة بين المدخل والخسارة. ضع طبقة ثانية في الوسط ويتغير شكل السؤال: ما مشتقة الخسارة بالنسبة إلى وزن لا يلمس الخرج إطلاقًا — وزن لا يصل تأثيره إلا عبر طبقة أخرى، وربما عبر عدة مسارات في وقت واحد؟

هذه المشتقة موجودة. حسابها يدويًا ميؤوس منه لأي شيء أكبر من لعبة، وحسابها معلمةً تلو الأخرى ميؤوس منه على مقياس مختلف. المطلوب إجراء يحصل على كل مشتقة في الشبكة من مرور خلفي واحد على الرسم نفسه الذي سار عليه المرور الأمامي للتو.

هذا هو الفصل 5، وهو المحرك الذي تعمل عليه بقية هذه الدورة.


ومن المفيد أيضًا القراءة إلى جانب هذا الفصل: Bishop, Pattern Recognition and Machine Learning §1.2, §1.5, §1.6 and §4.3، الذي يغطي الاحتمال، ونظرية القرار، ونظرية المعلومات، والتصنيف الخطي بالترتيب الذي يتبعه هذا الفصل؛ Murphy, Probabilistic Machine Learning: An Introduction, chapters 6 and 10؛ Prince, Understanding Deep Learning §5.4–5.7؛ وSaito and Rehmsmeier, The Precision-Recall Plot Is More Informative than the ROC Plot When Evaluating Binary Classifiers on Imbalanced Datasets (PLOS ONE, 2015) — لماذا يجب ألا يكون AUC المقتبس أعلاه الرقم الوحيد الخالي من العتبة الذي تنظر إليه عندما تكون 1.7 % من الأجزاء معيبة.

  1. Ma, T. and Ng, A. CS229 Lecture Notes, Stanford University, chapters 2 and 3. حيث يتوقف الإلغاء الذي ينتج pyp - y عن الظهور كحظ: اختر توزيع العائلة الأسية الذي يطابق خرجك، واستخدم رابطه القانوني، وسيكون التدرج دائمًا التنبؤ ناقص الحقيقة.

  2. Olah, C. Visual Information Theory (2015)، colah.github.io/posts/2015-09-Visual-Information. أوضح عرض متاح للإنتروبيا، والإنتروبيا المتقاطعة، وتباعد KL بوصفها تكاليف بالبتات لا مجرد صيغ.

  3. Abu-Mostafa, Y. S., Magdon-Ismail, M. and Lin, H.-T. Learning From Data (AMLBook, 2012)، المحاضرتان 13 و17 من دورة Caltech. المحاضرة 13 عن التحقق؛ والمحاضرة 17، عن مبادئ التعلم الثلاثة، هي حيث يُسمّى data snooping. بينهما يأتي الانضباط في هذا الفصل: كل نظرة إلى مجموعة بيانات هي قرار ملاءمة، سواء شغّلت محسّنًا أم لا.

  4. James, G., Witten, D., Hastie, T. and Tibshirani, R. An Introduction to Statistical Learning, 2nd edition (Springer, 2021)، الفصلان 2 و5، لتحليل bias–variance ولإعادة أخذ العينات. والمجلد المرافق هو حيث تُذكر مصيدة الاختيار صراحة: Hastie, Tibshirani and Friedman, The Elements of Statistical Learning, 2nd edition, §7.10.2, The Wrong and Right Way to Do Cross-validation.

  5. Kaufman, S., Rosset, S., Perlich, C. and Stitelman, O. Leakage in Data Mining: Formulation, Detection, and Avoidance. ACM Transactions on Knowledge Discovery from Data 6(4), 2012. معالجة رسمية للفشل الموضح أعلاه، مع دراسات حالة من مسابقات فاز بها نموذج تعلّم أثرًا جانبيًا لطريقة تجميع البيانات.

  6. Wilson, E. B. Probable Inference, the Law of Succession, and Statistical Inference. Journal of the American Statistical Association 22(158), pp. 209–212 (1927). فاصل الدرجة المستخدم في wilson() أعلاه، وما يزال الافتراضي الصحيح لنسبة. الفاصل المدرسي p^±zp^(1p^)/n\hat{p} \pm z\sqrt{\hat{p}(1-\hat{p})/n} هو ما يجب تجنبه: يعطي هراء قرب 0 و1، ولا يغطي كفاية عند nn صغير.

  7. Efron, B. Bootstrap Methods: Another Look at the Jackknife. The Annals of Statistics 7(1), pp. 1–26 (1979). الفكرة التي تتيح لك وضع فاصل على أي إحصائية تستطيع حسابها، بما في ذلك تلك التي لا نظرية أخذ عينات لها.

هل أنت مستعد لتترك الاختيار لـ LIA؟

ابنِ بكل نماذج الذكاء الاصطناعي في مكان واحد — ابدأ مجانًا اليوم.