Ταξινόμηση, cross-entropy και πώς να μην κοροϊδεύετε τον εαυτό σας
Φτιάξτε έναν logistic classifier και δείτε γιατί 98% ακρίβεια μπορεί να σημαίνει μοντέλο που δεν βρίσκει τίποτα.
Σε αυτή τη σελίδα
Ένα μοντέλο που απαντά αυτό το εξάρτημα είναι εντάξει για κάθε εξάρτημα που βγαίνει από τον ιμάντα έχει δίκιο στο 98,15 % των περιπτώσεων. Είναι επίσης άχρηστο: από τα 74 ελαττωματικά εξαρτήματα στο σύνολο δοκιμής, δεν πιάνει κανένα.
Και οι δύο προτάσεις περιγράφουν το ίδιο μοντέλο. Η απόσταση ανάμεσά τους είναι αυτό το κεφάλαιο.
Το πρώτο μισό χτίζει τον ταξινομητή. Δεν χρειάζεται σχεδόν τίποτα καινούργιο: το Κεφάλαιο 2 έδωσε τη συνταγή για να μετατρέπετε μια υπόθεση σχετικά με το πώς παράγονται τα δεδομένα σε συνάρτηση απώλειας, και το Κεφάλαιο 3 έδωσε τον μηχανισμό για να κατεβαίνετε την πλαγιά σε όποια απώλεια σας δίνει αυτή η συνταγή. Εφαρμόστε και τα δύο σε μια ερώτηση ναι/όχι και προκύπτει η λογιστική παλινδρόμηση, μαζί με μία νέα ιδέα — ένα logit — που θα χρεωθεί ξανά στο Κεφάλαιο 17.
Το δεύτερο μισό είναι το πιο δύσκολο. Όλα μετά από αυτό το σημείο στο μάθημα κρίνονται από έναν αριθμό που κάποιος μέτρησε, και αν δεν μπορείτε να ξεχωρίσετε μια πραγματική βελτίωση από ένα τεχνούργημα μέτρησης, κάθε επόμενο κεφάλαιο είναι διακόσμηση. Άρα: ο πίνακας σύγχυσης, precision και recall, οι τρεις διαχωρισμοί, η διαρροή, και η ερώτηση που σχεδόν κανείς δεν απαντά ειλικρινά — πόσα παραδείγματα δοκιμής χρειάζομαι πραγματικά;
Η αριθμητική εδώ τρέχει πάνω από 20.000 γραμμές, άρα είναι vectorised παντού — η NumPy κάνει τη δουλειά από το Κεφάλαιο 2, και από εδώ και πέρα παύει να αξίζει να το επισημαίνουμε.
Ο ιμάντας, με μια πιο σπάνια ερώτηση
Σύνδεσμος στην ενότητα: Ο ιμάντας, με μια πιο σπάνια ερώτησηΤο ίδιο εργοστάσιο όπως στο Κεφάλαιο 1, πιο δύσκολη ερώτηση. Αντί για αποδοχή ή απόρριψη, η ερώτηση είναι είναι αυτό το εξάρτημα ελαττωματικό — και τα ελαττώματα είναι σπάνια, κάτι που κάνει το μισό της μέτρησης σε αυτό το κεφάλαιο δύσκολο και το μισό της μοντελοποίησης απατηλά εύκολο.
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:]N = 20000 defects = 337 base rate = 0.0169
defects per split = 203 60 74Τρεις διαχωρισμοί, όχι δύο. Ο λόγος αξίζει δική του ενότητα και την έχει παρακάτω· προς το παρόν, εκπαιδεύστε στο πρώτο, ρυθμίστε στο δεύτερο και μην κοιτάξετε το τρίτο.
Τα χαρακτηριστικά είναι τυποποιημένα — αφαιρείται ο μέσος όρος, διαιρούνται με την τυπική απόκλιση — χρησιμοποιώντας μόνο τα στατιστικά του συνόλου εκπαίδευσης, για τον λόγο που έδειξε το Κεφάλαιο 1 με το όριο σύγκλισης του perceptron: τα μη κεντραρισμένα δεδομένα κάνουν τη γεωμετρία εχθρική. Από ποιες γραμμές επιτρέπεται να υπολογίσετε αυτόν τον μέσο όρο γίνεται ζωντανό ζήτημα αργότερα σε αυτό το κεφάλαιο.
Από ετυμηγορία σε πιθανότητα
Σύνδεσμος στην ενότητα: Από ετυμηγορία σε πιθανότηταΤο perceptron επέστρεφε πρόσημο. Ένα πρόσημο δεν μπορεί να ξεχωρίσει το απόρριψη από το απόρριψη, αλλά οριακά, και αυτή η διαφορά είναι ακριβώς αυτό που χρειάζεται ένα εργοστάσιο για να αποφασίσει ποια εξαρτήματα πρέπει να επανελέγξει πρώτα ένας άνθρωπος.
Άρα ακολουθήστε κυριολεκτικά τη συνταγή του Κεφαλαίου 2. Γράψτε τι ισχυρίζεστε για το πώς παράγεται μια ετικέτα, πάρτε την πιθανοφάνεια, πάρτε τον λογάριθμο, αλλάξτε πρόσημο, και έχετε μια απώλεια. Για ένα αποτέλεσμα ναι/όχι ο ισχυρισμός είναι μια κατανομή Bernoulli: υπάρχει μια πιθανότητα ότι το εξάρτημα είναι ελαττωματικό, και
που είναι απλώς ένας συμπαγής τρόπος να γράψετε « αν , και αν ». Πάρτε τον λογάριθμο αυτού και αλλάξτε πρόσημο, και η απώλεια για ένα παράδειγμα είναι
Αυτό είναι binary cross-entropy. Δεν επιλέχθηκε επειδή είναι βολικό· είναι η αρνητική log-likelihood της μοναδικής κατανομής που μπορεί να έχει μια ρίψη νομίσματος. Δεν υπήρχε κάτι άλλο διαθέσιμο.
Αυτό που λείπει ακόμα είναι από πού έρχεται το . Το μοντέλο υπολογίζει ένα σταθμισμένο άθροισμα , που είναι πραγματικός αριθμός και εκτείνεται σε ολόκληρη την ευθεία, ενώ μια πιθανότητα πρέπει να ζει στο . Η συνάρτηση που μετακινεί το ένα στο άλλο είναι η logistic sigmoid:
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 — που είναι , η τιμή ενός σηκώματος ώμων. Το να είστε με σιγουριά λάθος κοστίζει 4,6, σαράντα τέσσερις φορές περισσότερο, και η τιμή ανεβαίνει χωρίς όριο όσο το μοντέλο γίνεται πιο βέβαιο για ένα λάθος. Το cross-entropy δεν μετρά απλώς σφάλματα: χρεώνει την αλαζονεία.
Το gradient είναι πρόβλεψη μείον αλήθεια
Σύνδεσμος στην ενότητα: Το gradient είναι πρόβλεψη μείον αλήθειαΤο Κεφάλαιο 3 είπε: για να εκπαιδεύσετε οτιδήποτε, βρείτε την παράγωγο της απώλειας ως προς κάθε παράμετρο. Κάντε το για ένα παράδειγμα. Με και :
Εμφάνιση λεπτομερειών
Οι δύο γραμμές που κάνουν το χάος να ακυρωθεί. Η sigmoid έχει μια ασυνήθιστα ευχάριστη παράγωγο, . Και η απώλεια παραγωγίζεται σε
Πολλαπλασιάστε τα δύο με τον κανόνα της αλυσίδας και το εμφανίζεται μία φορά επάνω και μία φορά κάτω. Ακυρώνεται ακριβώς, και αυτό που επιβιώνει είναι το . Αυτή η ακύρωση δεν είναι σύμπτωση — είναι αυτό που συμβαίνει κάθε φορά που η απώλεια είναι η αρνητική log-likelihood μιας κατανομής και η συνάρτηση εξόδου είναι εκείνη που χρησιμοποιεί φυσικά αυτή η κατανομή. Αυτό το ζευγάρωμα έχει όνομα — ένα generalised linear model — και το καθαρό gradient είναι το αποτύπωμά του.1
Άρα η ενημέρωση είναι πρόβλεψη μείον αλήθεια, επί την είσοδο. Τίποτα άλλο. Εδώ είναι ολόκληρος ο εκπαιδευτής, που είναι η κάθοδος του Κεφαλαίου 3 με μία γραμμή αλλαγμένη:
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 δεν είναι διακοσμητικό. Ο απευθείας υπολογισμός του υπερχειλίζει για μεγάλα αρνητικά · ο κλάδος επιλέγει όποια αλγεβρικά ισοδύναμη μορφή κρατά τον εκθέτη αρνητικό. Αυτό είναι το κουτί κινητής υποδιαστολής του Κεφαλαίου 2 που εισπράττει το πρώτο του χρέος, και θα εισπράξει μεγαλύτερο δύο ενότητες παρακάτω.
Γιατί όχι τετραγωνικό σφάλμα, και γιατί η απάντηση αφορά το gradient
Σύνδεσμος στην ενότητα: Γιατί όχι τετραγωνικό σφάλμα, και γιατί η απάντηση αφορά το gradientΗ τυπική εξήγηση για την προτίμηση του cross-entropy έναντι του τετραγωνικού σφάλματος είναι το επιχείρημα πιθανοφάνειας παραπάνω: το τετραγωνικό σφάλμα είναι αυτό που παίρνετε αν υποθέσετε γκαουσιανό θόρυβο, οι ετικέτες δεν είναι γκαουσιανές, άρα μην το κάνετε. Είναι σωστό και δεν πείθει κανέναν, επειδή μπορείτε να γράψετε πάνω από μια sigmoid και θα εκπαιδευτεί.
Το επιχείρημα που πιάνει είναι για το gradient. Βάλτε τετραγωνικό σφάλμα πάνω από μια sigmoid και ο κανόνας της αλυσίδας δίνει
Αυτό το επιπλέον είναι εκείνο που ακυρώθηκε πριν. Τώρα δεν ακυρώνεται, και πηγαίνει στο μηδέν όποτε το μοντέλο είναι σίγουρο — συμπεριλαμβανομένων των περιπτώσεων όπου το μοντέλο είναι με σιγουριά λάθος. Αξιολογήστε και τα δύο σε μερικά σκορ, για ένα παράδειγμα του οποίου η αληθινή ετικέτα είναι 1:
| σκορ | cross-entropy | τετραγωνικό σφάλμα | λόγος | |
|---|---|---|---|---|
| 0.000335 | 1,491 | |||
| 0.017986 | 28.3 | |||
| 0.119203 | 4.8 | |||
| 0.500000 | 2.0 | |||
| 0.880797 | 4.8 |
Στο το μοντέλο είναι όσο λάθος γίνεται να είναι, και το τετραγωνικό σφάλμα απαντά με gradient 1.491 φορές μικρότερο από του cross-entropy. Όσο χειρότερο το λάθος, τόσο λιγότερα μαθαίνει το μοντέλο από αυτό. Το gradient του cross-entropy, στο μεταξύ, κορέννυται στο : το μέγιστα λάθος παράγει μέγιστα μεγάλο σήμα, και όχι μεγαλύτερο.
Τρέξτε τον αγώνα. Δύο χιλιάδες ισορροπημένα σημεία, ίδια αρχικά βάρη επιλεγμένα ώστε να είναι με σιγουριά λάθος (), ίδιος ρυθμός μάθησης, διαφέρει μόνο η απώλεια. Και οι δύο εκτελέσεις βαθμολογούνται με cross-entropy ώστε οι στήλες να είναι συγκρίσιμες.
| epoch | απώλεια cross-entropy | ακρίβεια | απώλεια τετραγωνικού σφάλματος | ακρίβεια |
|---|---|---|---|---|
| 1 | 5.4865 | 0.2300 | 5.9499 | 0.2290 |
| 10 | 1.5525 | 0.2460 | 5.9042 | 0.2290 |
| 50 | 0.4642 | 0.7780 | 5.6913 | 0.2320 |
| 100 | 0.4639 | 0.7770 | 5.3955 | 0.2410 |
| 200 | 0.4639 | 0.7770 | 4.6311 | 0.2745 |
| 500 | 0.4639 | 0.7770 | 0.5291 | 0.7660 |
| 1,000 | 0.4639 | 0.7770 | 0.4640 | 0.7765 |
Το cross-entropy έχει τελειώσει μέχρι το epoch 50. Το τετραγωνικό σφάλμα είναι ακόμα στο 24 % ακρίβεια στο epoch 100 — και δεν είχε μετακινηθεί από το 23 % στο epoch 10 — χειρότερα από εικασία, επειδή ξεκίνησε με σιγουριά λάθος και το gradient που θα το έσωζε έχει πολλαπλασιαστεί με 0,0007. Ξεφεύγει γύρω στο epoch 500 και καταλήγει στο ίδιο μέρος. Άρα η ειλικρινής σύνοψη είναι ότι το τετραγωνικό σφάλμα πάνω από μια sigmoid δεν είναι λανθασμένο· είναι αργό ακριβώς εκεί όπου η ταχύτητα έχει τη μεγαλύτερη σημασία. Σε ένα μοντέλο δύο παραμέτρων χάνετε 450 epochs. Σε ένα δίκτυο με εκατό layers, όπου κάποια μονάδα κάπου είναι πάντα με σιγουριά λάθος, χάνετε την εκτέλεση εκπαίδευσης.
Εντροπία, cross-entropy και KL, σε μία σελίδα
Σύνδεσμος στην ενότητα: Εντροπία, cross-entropy και KL, σε μία σελίδαΤρεις ποσότητες, που χρειάζονται σωστά στο Κεφάλαιο 8 για perplexity και στο Κεφάλαιο 11 για την ποινή που κρατά μια fine-tuned πολιτική κοντά στην αναφορά της. Είναι ευκολότερες από τη φήμη τους.2
Εντροπία είναι ο μέσος αριθμός bit που πρέπει να ξοδέψετε για να επικοινωνήσετε μια δειγματοληψία από μια κατανομή, αν χρησιμοποιείτε τον καλύτερο δυνατό κώδικα για αυτήν:
Cross-entropy είναι αυτό που ξοδεύετε όταν χρησιμοποιείτε έναν κώδικα φτιαγμένο για σε δεδομένα που στην πραγματικότητα έρχονται από :
KL divergence είναι το πλεόνασμα — η σπατάλη, σε bit, που προκαλείται επειδή πιστεύετε το όταν η αλήθεια είναι :
Ελέγξτε και τα τρία στον ιμάντα:
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 %, πετυχαίνει cross-entropy 0,1330 bit, σχεδόν ακριβώς την εντροπία των ετικετών δοκιμής — όπως πρέπει, αφού έχει τη σωστή κατανομή και καμία άλλη πληροφορία. Η εντροπία είναι το πάτωμα που σας αγοράζει η άγνοια για το άτομο. Δεύτερον, ένα μοντέλο που σηκώνει τους ώμους και λέει 0,5 πληρώνει ακριβώς 1 bit, και το χάσμα ανάμεσα στα δύο, 0,8671 bit, είναι ακριβώς το KL divergence. Το δεν είναι ταυτότητα για απομνημόνευση· είναι λογαριασμός που μπορείτε να δείτε να αθροίζεται.
Και η σύνδεση πίσω στην εκπαίδευση: όταν η ετικέτα είναι μία γνωστή κλάση, η «αληθινή» κατανομή είναι one-hot, η εντροπία της είναι μηδέν, και το cross-entropy ισούται με το KL divergence. Η ελαχιστοποίηση του cross-entropy και το τράβηγμα της κατανομής του μοντέλου προς την αλήθεια είναι η ίδια πράξη.
Περισσότερες από δύο απαντήσεις: softmax, και η μετατόπιση που δεν κοστίζει τίποτα
Σύνδεσμος στην ενότητα: Περισσότερες από δύο απαντήσεις: softmax, και η μετατόπιση που δεν κοστίζει τίποταΤο ελαττωματικό δεν είναι ένα πράγμα. Στη χύτευση, ένα εξάρτημα μπορεί να βγει ως short shot (όχι αρκετό υλικό), flash (υπερβολικό υλικό, που πιέζεται έξω από το καλούπι), ή burn. Τέσσερα αποτελέσματα, άρα τέσσερα logits, και πρέπει να γίνουν τέσσερις πιθανότητες που αθροίζονται σε ένα. Αυτό είναι το softmax:
Έχει μια ιδιότητα που μοιάζει με ατύχημα και στην πραγματικότητα είναι ολόκληρη η υλοποίηση:
για οποιαδήποτε σταθερά , επειδή το και το ακυρώνονται πάνω και κάτω. Μόνο οι διαφορές ανάμεσα στα logits σημαίνουν κάτι. Το απόλυτο επίπεδο δεν είναι πληροφορία.
Ευτυχώς, γιατί το απόλυτο επίπεδο είναι αυτό που χαλάει τον υπολογιστή:
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Το υπερχειλίζει έναν 64-bit float, το άθροισμα γίνεται άπειρο, και το άπειρο διαιρεμένο με άπειρο είναι nan — όχι σφάλμα, όχι crash, απλώς μια σιωπηλή τρύπα εκεί όπου υπήρχαν τρεις πιθανότητες. Η αφαίρεση του μέγιστου logit δεν αλλάζει τίποτα μαθηματικά και αλλάζει τα πάντα αριθμητικά, επειδή ο μεγαλύτερος εκθέτης γίνεται ακριβώς . Αυτό είναι το κόλπο logsumexp του Κεφαλαίου 2 με ρούχα δουλειάς, και κάθε σοβαρή υλοποίηση το κάνει:
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Το gradient είναι ξανά πρόβλεψη μείον αλήθεια, τώρα με one-hot. Η δυαδική περίπτωση ήταν ειδική περίπτωση εξαρχής.
Εκπαιδευμένο σε 3.000 εξαρτήματα και δοκιμασμένο σε 1.000, με τρεις μετρήσεις το καθένα (πλάτος, βάρος, θερμοκρασία τήγματος), φτάνει σε 94,00 % ακρίβεια. Να τι κρύβει αυτός ο αριθμός:
| αλήθεια ↓ / πρόβλεψη → | ok | short shot | flash | burn | recall |
|---|---|---|---|---|---|
| ok | 850 | 5 | 9 | 0 | 0.984 |
| short shot | 22 | 21 | 0 | 0 | 0.488 |
| flash | 20 | 0 | 30 | 1 | 0.588 |
| burn | 3 | 0 | 0 | 39 | 0.929 |
| precision | 0.950 | 0.808 | 0.769 | 0.975 |
Το μοντέλο βρίσκει λιγότερα από τα μισά short shots. Η ακρίβεια δεν μπορεί να το δει, επειδή το 86 % των εξαρτημάτων είναι εντάξει και το να τα πετυχαίνει αυτά αρκεί για να σηκώσει τον μέσο όρο. Το macro F1 — ο μέσος όρος των F1 scores ανά κλάση, που ζυγίζει μια σπάνια κλάση το ίδιο με μια συνηθισμένη — είναι 0,7983, έναντι micro F1 0,9400 που εξ ορισμού είναι ταυτόσημο με την ακρίβεια. Όποτε κάποιος αναφέρει έναν αριθμό F1, ρωτήστε ποιον.
Αυτό είναι το τέλος της μοντελοποίησης. Το υπόλοιπο κεφάλαιο αφορά τους αριθμούς.
Τρία μοντέλα, μία ακρίβεια
Σύνδεσμος στην ενότητα: Τρία μοντέλα, μία ακρίβειαΠάρτε το εκπαιδευμένο δυαδικό μοντέλο και φτιάξτε δύο παραλλαγές πολλαπλασιάζοντας κάθε logit με μια σταθερά: 0,35 για μια διστακτική έκδοση, 4 για μια υπερσίγουρη. Ο πολλαπλασιασμός με θετικό αριθμό δεν μπορεί να αλλάξει κανένα πρόσημο, άρα και τα τρία μοντέλα προβλέπουν ακριβώς την ίδια ετικέτα για όλα τα 4.000 εξαρτήματα δοκιμής. Η ακρίβεια δεν μπορεί να τα ξεχωρίσει. Το cross-entropy δεν έχει κανένα πρόβλημα:
| μοντέλο | ακρίβεια | cross-entropy | μέση απώλεια όταν είναι σωστό | μέση απώλεια όταν είναι λάθος | χειρότερη μεμονωμένη απώλεια |
|---|---|---|---|---|---|
| διστακτικό (logits × 0.35) | 0.9830 | 0.1549 | 0.1369 | 1.1990 | 2.80 |
| όπως εκπαιδεύτηκε | 0.9830 | 0.0564 | 0.0147 | 2.4689 | 7.82 |
| υπερσίγουρο (logits × 4) | 0.9830 | 0.1563 | 0.0009 | 9.1427 | 27.63 |
Το διστακτικό μοντέλο πληρώνει έναν μικρό φόρο σε κάθε εξάρτημα, συμπεριλαμβανομένων των χιλιάδων που πετυχαίνει. Το υπερσίγουρο είναι σχεδόν δωρεάν όταν έχει δίκιο και καταστροφικό όταν κάνει λάθος — ένα εξάρτημα σε εκείνο το σύνολο δοκιμής του κοστίζει 27,63 nats μόνο του. Τα δύο καταλήγουν σχεδόν στο ίδιο σύνολο από αντίθετες διαδρομές, και το εκπαιδευμένο μοντέλο, του οποίου οι πιθανότητες είναι βαθμονομημένες στα δεδομένα, κάθεται τρεις φορές χαμηλότερα και από τα δύο.
Αυτός είναι ο πιο αιχμηρός τρόπος να δηλώσετε τη διαφορά ανάμεσα σε μια απώλεια και ένα metric. Η απώλεια είναι αυτό που βελτιστοποιείτε: πρέπει να είναι παραγωγίσιμη, και βλέπει όλα όσα είπε το μοντέλο, μαζί με το πόσο σίγουρο ήταν. Το metric είναι αυτό με βάση το οποίο κρίνεστε: μπορεί να είναι βηματική συνάρτηση, επιχειρησιακός κανόνας, μέτρηση χαμένων ελαττωμάτων. Δεν είναι το ίδιο αντικείμενο και δεν συμφωνούν πάντα — γι’ αυτό ορίζετε και τα δύο πριν ξεκινήσετε, και δεν αφήνετε ποτέ την απώλεια να σταθεί στη θέση του metric επειδή τυχαίνει να βρίσκεται στην οθόνη.
Το χαζό baseline πάει πρώτο
Σύνδεσμος στην ενότητα: Το χαζό baseline πάει πρώτοΠριν από οποιοδήποτε μοντέλο, η απαίτηση: τι σκορ παίρνει η πιο τεμπέλικη δυνατή απάντηση; Σε αυτόν τον ιμάντα, λέτε πάντα εντάξει:
always-say-fine baseline: accuracy = 0.9815
confusion (tn, fp, fn, tp) = (3926, 0, 74, 0)98,15 %. Τώρα το εκπαιδευμένο λογιστικό μοντέλο, στο προεπιλεγμένο κατώφλι 0,5:
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 %. Κέρδισε το baseline κατά 0,15 ποσοστιαίες μονάδες, και οποιαδήποτε αναφορά σταματήσει στην ακρίβεια θα το πει νίκη. Ο πίνακας σύγχυσης λέει τι συνέβη πραγματικά:
| προβλέφθηκε εντάξει | προβλέφθηκε ελαττωματικό | |
|---|---|---|
| πραγματικά εντάξει | 3,924 | 2 |
| πραγματικά ελαττωματικό | 66 | 8 |
Τρεις αριθμοί ονομάζουν τους τρεις τρόπους ανάγνωσης αυτού του πίνακα:
- Precision . Από τα εξαρτήματα που επισήμανε, πόσα ήταν πραγματικά ελαττωματικά. Αυτό είναι το κόστος των χαμένων επιθεωρήσεων.
- Recall . Από τα ελαττωματικά εξαρτήματα, πόσα έπιασε. Αυτό είναι το κόστος αποστολής ενός κακού εξαρτήματος σε πελάτη.
- F1 , ο αρμονικός μέσος τους, που μένει κοντά στο μικρότερο από τα δύο και επομένως αρνείται να κολακευτεί από το ένα μόνο του.
Το ποιο έχει σημασία εξαρτάται από το εργοστάσιο, όχι από τα μαθηματικά: μια επιθεώρηση κοστίζει μερικά δευτερόλεπτα και ένα ελάττωμα που αποστέλλεται κοστίζει ειδοποίηση ανάκλησης, άρα εδώ κυριαρχεί το recall και το 0,108 είναι αποτυχία.
Αλλά το πρόβλημα δεν είναι το μοντέλο. Είναι το κατώφλι, και το κατώφλι δεν είναι μέρος του μοντέλου — είναι επιχειρησιακή απόφαση που εφαρμόζεται μετά σε μια πιθανότητα. Σαρώστε το:
| κατώφλι | TP | FP | FN | ακρίβεια | precision | recall | F1 |
|---|---|---|---|---|---|---|---|
| 0.500 | 8 | 2 | 66 | 0.9830 | 0.800 | 0.108 | 0.190 |
| 0.200 | 27 | 28 | 47 | 0.9812 | 0.491 | 0.365 | 0.419 |
| 0.100 | 42 | 118 | 32 | 0.9625 | 0.263 | 0.568 | 0.359 |
| 0.050 | 54 | 236 | 20 | 0.9360 | 0.186 | 0.730 | 0.297 |
| 0.020 | 67 | 570 | 7 | 0.8558 | 0.105 | 0.905 | 0.188 |
| 0.005 | 71 | 1,360 | 3 | 0.6593 | 0.050 | 0.959 | 0.094 |
Διαβάστε τη στήλη ακρίβειας προς τα κάτω. Πέφτει σε όλη τη διαδρομή — από 98,30 % σε 65,93 % — ενώ το μοντέλο πηγαίνει από το να πιάνει 8 ελαττώματα στο να πιάνει 71 από 74. Κάθε χρήσιμο πράγμα που μπορεί να κάνει αυτό το μοντέλο χειροτερεύει την ακρίβειά του. Μια ομάδα που βελτιστοποιεί τον τίτλο του αριθμού θα έστελνε την έκδοση που δεν βρίσκει τίποτα.
Εμφάνιση λεπτομερειών
Η στάθμιση κλάσεων δεν δημιουργεί σήμα, μετακινεί το σημείο λειτουργίας. Το συνηθισμένο πρώτο αντανακλαστικό με μη ισορροπημένες κλάσεις είναι να σταθμίζετε τη σπάνια κλάση στην απώλεια. Κάνοντάς το αυτό, με βάρη 1, 10 και 60 στα θετικά:
| βάρος στα θετικά | ακρίβεια | precision | recall | F1 | AUC |
|---|---|---|---|---|---|
| 1 | 0.9830 | 0.800 | 0.108 | 0.190 | 0.9363 |
| 10 | 0.9605 | 0.253 | 0.581 | 0.352 | 0.9361 |
| 60 | 0.8290 | 0.091 | 0.919 | 0.166 | 0.9361 |
Precision και recall μετακινούνται πολύ. Το AUC — η πιθανότητα το μοντέλο να κατατάξει ένα τυχαίο ελαττωματικό εξάρτημα πάνω από ένα τυχαίο καλό, αγνοώντας εντελώς το κατώφλι — μετακινείται κατά 0,0002, δηλαδή τίποτα. Η επαναστάθμιση γλίστρησε το ίδιο μοντέλο πάνω στην ίδια καμπύλη ανταλλαγής. Αυτό συχνά είναι που θέλετε, και δεν είναι ποτέ νέα πληροφορία: αν η κατάταξη είναι κακή, κανένα σχήμα στάθμισης δεν θα τη σώσει.
Τρεις διαχωρισμοί, και η διαρροή που πρόκειται να βρείτε
Σύνδεσμος στην ενότητα: Τρεις διαχωρισμοί, και η διαρροή που πρόκειται να βρείτεΓιατί τρεις διαχωρισμοί και όχι δύο; Επειδή τη στιγμή που χρησιμοποιείτε ένα σύνολο παραδειγμάτων για να επιλέξετε οτιδήποτε — ένα κατώφλι, έναν ρυθμό μάθησης, ποιο από έξι μοντέλα να στείλετε — αυτό το σύνολο έχει χρησιμοποιηθεί για fitting, και το σκορ του παύει να είναι αμερόληπτο.3 Μετρημένο σε αυτόν τον ιμάντα: η σάρωση του κατωφλιού στο σύνολο validation επιλέγει 0,196, και το μοντέλο μετά πετυχαίνει F1 = 0,4122 στο ανέγγιχτο σύνολο δοκιμής. Αν η σάρωση είχε γίνει απευθείας στο σύνολο δοκιμής, το καλύτερο εφικτό εκεί ήταν 0,4186 — ένας αριθμός που κανείς δεν δικαιούται να αναφέρει.
Το χάσμα είναι μικρό εδώ, 0,006, επειδή είναι μία hyperparameter που σαρώθηκε μία φορά απέναντι σε 4.000 παραδείγματα validation. Μεγαλώνει με κάθε επιπλέον απόφαση και κάθε συρρίκνωση του συνόλου validation. Σημειώστε επίσης ότι η κατεύθυνση δεν είναι εγγυημένη σε μία εκτέλεση: το επιλεγμένο κατώφλι πέτυχε 0,3902 στο validation και 0,4122 στο test, άρα το validation το υποτίμησε αυτή τη φορά. Η μεροληψία είναι συστηματική σε πολλές αποφάσεις, όχι ορατή σε μία.4
Τώρα η άσκηση. Το αρχείο καταγραφής του ιμάντα φτάνει με τρίτη στήλη, station_seconds: πόσο χρόνο πέρασε κάθε εξάρτημα στον σταθμό επιθεώρησης. Η προσθήκη της είναι αλλαγή μίας γραμμής στην προεπεξεργασία. Να τι κάνει:
| μοντέλο | ακρίβεια | precision | recall | F1 | cross-entropy | AUC |
|---|---|---|---|---|---|---|
| πλάτος + βάρος | 0.9830 | 0.800 | 0.108 | 0.190 | 0.0564 | 0.9363 |
| + station_seconds | 0.9920 | 0.792 | 0.770 | 0.781 | 0.0236 | 0.9970 |
Το recall πηγαίνει από 10,8 % σε 77,0 %. Το F1 υπερτετραπλασιάζεται. Και προσέξτε τι έκανε η ακρίβεια: 98,30 % → 99,20 %, ένα κέρδος εννέα δεκάτων της μονάδας, δηλαδή το είδος αριθμού που στρογγυλοποιείται σε «περίπου 99 % έτσι κι αλλιώς» σε μια συνοπτική διαφάνεια. Η ακρίβεια απέτυχε να δει την αποτυχία νωρίτερα και τώρα αποτυγχάνει να δει την απάτη.
Πριν συνεχίσετε: το μοντέλο κλέβει. Βρείτε πώς.
Πώς να κυνηγήσετε μια διαρροή, με τη σειρά που τη βρίσκει ταχύτερα.
-
Συγκρίνετε train και test. Το overfitting εμφανίζεται ως μεγάλο χάσμα. Εδώ: ειλικρινές μοντέλο 0,9838 train / 0,9830 test· μοντέλο με διαρροή 0,9936 train / 0,9920 test. Και τα δύο χάσματα είναι κάτω από 0,2 μονάδες. Μια διαρροή δεν μοιάζει με overfitting — το χαρακτηριστικό με διαρροή είναι εξίσου διαθέσιμο στο test, άρα το μοντέλο γενικεύει υπέροχα σε έναν κόσμο που δεν υπάρχει.
-
Εκπαιδεύστε ένα μοντέλο ανά χαρακτηριστικό, μόνο του. Οτιδήποτε κουβαλά την απάντηση θα αναγγελθεί μόνο του:
χαρακτηριστικό μόνο του ακρίβεια recall F1 AUC πλάτος 0.9815 0.014 0.026 0.8691 βάρος 0.9815 0.000 0.000 0.7914 station_seconds0.9850 0.405 0.500 0.9960 Μία στήλη, μόνη της, κατατάσσει τα ελαττώματα με AUC 0,9960. Δύο μετρήσεις που λαμβάνονται από παχύμετρο και ζυγαριά καταφέρνουν 0,87 και 0,79. Αυτή η ασυμμετρία είναι ο συναγερμός.
-
Ρωτήστε πότε γράφτηκε κάθε αριθμός. Μέσος χρόνος παραμονής: 2,23 δευτερόλεπτα για εξαρτήματα που πέρασαν, 15,56 δευτερόλεπτα για εξαρτήματα που απέτυχαν. Φυσικά. Ένα εξάρτημα μένει στον σταθμό επειδή ένας επιθεωρητής το τράβηξε από τον ιμάντα — κάτι που συμβαίνει μετά, και μόνο επειδή, κάποιος αποφάσισε ότι ήταν ελαττωματικό. Η στήλη δεν είναι μέτρηση του εξαρτήματος. Είναι μέτρηση της ετυμηγορίας.
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()) Η επισημασμένη γραμμή είναι η διαρροή: ο χρόνος παραμονής ενός ελαττωματικού εξαρτήματος αντλείται από διαφορετική κατανομή, επειδή ένας άνθρωπος το έβγαλε από τον ιμάντα. Αυτό είναι το πιο συνηθισμένο σοβαρό bug στην εφαρμοσμένη μηχανική μάθηση, και έχει όνομα: target leakage — πληροφορία στα χαρακτηριστικά εκπαίδευσης που δεν θα ήταν διαθέσιμη τη στιγμή που πρέπει να γίνει η πρόβλεψη.5 Δεν πετά exception. Παράγει καλύτερο αριθμό. Κάθε κίνητρο σε ένα project δείχνει προς το να τη διατηρήσετε.
Η άμυνα είναι μία ερώτηση, που τίθεται σε κάθε στήλη: τη στιγμή που χρειάζομαι αυτή την πρόβλεψη, υπάρχει ήδη αυτή η τιμή; Σε έναν ζωντανό ιμάντα, το station_seconds είναι άγνωστο μέχρι αφού επιθεωρηθεί το εξάρτημα — που είναι αυτό που υποτίθεται ότι θα αντικαθιστούσε το μοντέλο.
Πόσα παραδείγματα δοκιμής χρειάζομαι;
Σύνδεσμος στην ενότητα: Πόσα παραδείγματα δοκιμής χρειάζομαι;Ας πούμε ότι βαθμολογείτε ένα μοντέλο σε 20 παραδείγματα και πετυχαίνει 17. Αναφέρετε 85 %.
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 %.
Δύο τρόποι να βάλετε διάστημα σε έναν ρυθμό, και και οι δύο ανήκουν στην εργαλειοθήκη σας:
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 για έναν απλό ρυθμό επιτυχίας· παραμένει καλά συμπεριφερόμενο σε οποιοδήποτε και δεν χρειάζεται τυχαιότητα. Σημειώστε παραπάνω ότι στο το πάνω άκρο του bootstrap είναι 1,0000 — η επαναδειγματοληψία 20 σημείων μπορεί εύκολα να τραβήξει 20 σωστά, άρα δεν μπορεί να αναπαραστήσει διάστημα στενότερο από τη δική της κοκκώδη ανάλυση. Χρησιμοποιήστε το bootstrap7 όπου δεν υπάρχει τύπος, δηλαδή στις περισσότερες ενδιαφέρουσες περιπτώσεις: F1, macro-averages, BLEU, pass@1, το σκορ ενός judge βασισμένου σε rubric. Σε αυτόν τον ιμάντα, το F1 0,4122 του ρυθμισμένου μοντέλου κουβαλά bootstrap διάστημα [0.3009, 0.5156] — που είναι ο αριθμός που πρέπει να εμφανιστεί στην αναφορά, επειδή η σημειακή εκτίμηση μόνη της προσκαλεί μια σύγκριση που δεν μπορεί να στηρίξει.
Μία ακόμα μέτρηση, επειδή αλλάζει το πώς πρέπει να συγκρίνετε δύο μοντέλα. Δύο μοντέλα βαθμολογημένα στα ίδια 500 παραδείγματα:
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 από αυτές τις διαφωνίες· τα κοινά παραδείγματα, εύκολα και δύσκολα μαζί, ακυρώνονται αντί να προσθέτουν θόρυβο. Συγκρίνετε μοντέλα paired, και φτάνετε στο ίδιο συμπέρασμα με κλάσμα των δεδομένων.
Πού πηγαίνει αυτό στη συνέχεια
Σύνδεσμος στην ενότητα: Πού πηγαίνει αυτό στη συνέχειαΤώρα έχετε ένα μοντέλο που εξάγει βαθμονομημένες πιθανότητες, μια απώλεια παραγμένη από έναν ισχυρισμό για τα δεδομένα αντί επιλεγμένη για ευκολία, ένα gradient που είναι κυριολεκτικά πρόβλεψη μείον αλήθεια, και — πιο σημαντικό — τον μηχανισμό για να μάθετε αν οποιοδήποτε από αυτά λειτουργεί. Το δεκάγραμμο διάστημα Wilson παραπάνω επαναχρησιμοποιείται αυτολεξεί: κουβαλά τις παραλλαγές prompt στο Κεφάλαιο 15, τους πίνακες retrieval στο Κεφάλαιο 19, και το golden set στο Κεφάλαιο 29. Το bootstrap είναι αυτό που πιάνετε όταν δεν υπάρχει τύπος.
Αλλά το μοντέλο εξακολουθεί να είναι ένα layer. Σχεδιάζει μια γραμμή, και το Κεφάλαιο 1 απέδειξε με τέσσερις γραμμές XOR ότι μια γραμμή δεν αρκεί. Η διόρθωση είναι να στοιβάξετε: ένα πρώτο layer που λυγίζει τον χώρο, ένα δεύτερο που σχεδιάζει τη γραμμή στον λυγισμένο χώρο.
Εκεί τελειώνει το καθαρό gradient αυτού του κεφαλαίου. Όλα τα παραπάνω λειτούργησαν επειδή το μπορούσε να γραφτεί με το χέρι, μία φορά, για ένα μοντέλο με ένα layer ανάμεσα στην είσοδο και την απώλεια. Βάλτε ένα δεύτερο layer στη μέση και η ερώτηση αλλάζει σχήμα: ποια είναι η παράγωγος της απώλειας ως προς ένα βάρος που δεν αγγίζει καθόλου την έξοδο — ένα βάρος του οποίου η επιρροή φτάνει μόνο μέσω ενός άλλου layer, πιθανώς κατά μήκος πολλών διαδρομών ταυτόχρονα;
Αυτή η παράγωγος υπάρχει. Ο υπολογισμός της με το χέρι είναι απελπιστικός για οτιδήποτε μεγαλύτερο από παιχνίδι, και ο υπολογισμός της μία παράμετρο τη φορά είναι απελπιστικός σε άλλη κλίμακα. Αυτό που χρειάζεται είναι μια διαδικασία που παίρνει κάθε παράγωγο στο δίκτυο από ένα μόνο backward pass πάνω στο ίδιο γράφημα που μόλις περπάτησε το forward pass.
Αυτό είναι το Κεφάλαιο 5, και είναι η μηχανή πάνω στην οποία τρέχει το υπόλοιπο μάθημα.
Πηγές και μέθοδος
Σύνδεσμος στην ενότητα: Πηγές και μέθοδοςΑξίζει επίσης να διαβαστούν παράλληλα με αυτό το κεφάλαιο: Bishop, Pattern Recognition and Machine Learning §1.2, §1.5, §1.6 και §4.3, που καλύπτει πιθανότητα, θεωρία αποφάσεων, θεωρία πληροφορίας και γραμμική ταξινόμηση με τη σειρά που ακολουθεί αυτό το κεφάλαιο· Murphy, Probabilistic Machine Learning: An Introduction, κεφάλαια 6 και 10· Prince, Understanding Deep Learning §5.4–5.7· και Saito και 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 % των εξαρτημάτων είναι ελαττωματικά.
Παραπομπές
Σύνδεσμος στην ενότητα: Παραπομπές-
Ma, T. και Ng, A. CS229 Lecture Notes, Stanford University, κεφάλαια 2 και 3. Εκεί όπου η ακύρωση που παράγει το παύει να μοιάζει με τύχη: επιλέξτε την κατανομή της εκθετικής οικογένειας που ταιριάζει με την έξοδό σας, χρησιμοποιήστε τον κανονικό σύνδεσμό της, και το gradient είναι πάντα πρόβλεψη μείον αλήθεια. ↩
-
Olah, C. Visual Information Theory (2015),
colah.github.io/posts/2015-09-Visual-Information. Η καθαρότερη διαθέσιμη εξήγηση της εντροπίας, του cross-entropy και του KL divergence ως κόστη σε bit αντί ως τύπους. ↩ -
Abu-Mostafa, Y. S., Magdon-Ismail, M. και Lin, H.-T. Learning From Data (AMLBook, 2012), διαλέξεις 13 και 17 του μαθήματος του Caltech. Η διάλεξη 13 είναι το validation· η διάλεξη 17, πάνω στις τρεις αρχές μάθησης, είναι όπου κατονομάζεται το data snooping. Μαζί είναι η πηγή της πειθαρχίας σε αυτό το κεφάλαιο: κάθε ματιά σε ένα σύνολο δεδομένων είναι απόφαση fitting, είτε τρέξατε optimiser είτε όχι. ↩
-
James, G., Witten, D., Hastie, T. και Tibshirani, R. An Introduction to Statistical Learning, 2η έκδοση (Springer, 2021), κεφάλαια 2 και 5, για τη διάσπαση bias–variance και για το resampling. Ο συνοδευτικός τόμος είναι όπου η παγίδα επιλογής διατυπώνεται ευθέως: Hastie, Tibshirani και Friedman, The Elements of Statistical Learning, 2η έκδοση, §7.10.2, The Wrong and Right Way to Do Cross-validation. ↩
-
Kaufman, S., Rosset, S., Perlich, C. και Stitelman, O. Leakage in Data Mining: Formulation, Detection, and Avoidance. ACM Transactions on Knowledge Discovery from Data 6(4), 2012. Μια τυπική αντιμετώπιση της αποτυχίας που επιδείχθηκε παραπάνω, με μελέτες περίπτωσης από διαγωνισμούς που κερδήθηκαν από μοντέλο το οποίο είχε μάθει ένα artefact του τρόπου συναρμολόγησης των δεδομένων. ↩
-
Wilson, E. B. Probable Inference, the Law of Succession, and Statistical Inference. Journal of the American Statistical Association 22(158), σελ. 209–212 (1927). Το score interval που χρησιμοποιείται στο
wilson()παραπάνω, ακόμα η σωστή προεπιλογή για μια αναλογία. Το σχολικό διάστημα είναι εκείνο που πρέπει να αποφεύγετε: δίνει ανοησίες κοντά στο 0 και το 1, και υποκαλύπτει άσχημα σε μικρά . ↩ -
Efron, B. Bootstrap Methods: Another Look at the Jackknife. The Annals of Statistics 7(1), σελ. 1–26 (1979). Η ιδέα που σας επιτρέπει να βάλετε διάστημα σε οποιοδήποτε στατιστικό μπορείτε να υπολογίσετε, συμπεριλαμβανομένων εκείνων που δεν έχουν θεωρία δειγματοληψίας. ↩