Κατηφόρα: Gradient Descent και τα δύο βήματα που όλοι παραλείπουν
Υπολογίστε το ακριβές όριο του ρυθμού μάθησης και δείτε μια brute-force αναζήτηση σε 3.600 κατευθύνσεις να ξαναβρίσκει το gradient.
Σε αυτή τη σελίδα
Το προηγούμενο κεφάλαιο τελείωσε με μια κοιλάδα.
Όχι μεταφορική: μια πραγματική καμπύλη, με την απώλεια σχεδιασμένη ως προς μία μόνο παράμετρο, να κατεβαίνει και να ανεβαίνει ξανά. Και η απώλεια από κάτω της δεν επιλέχθηκε επειδή ήταν βολική — προέκυψε από μια δήλωση για τον θόρυβο στις μετρήσεις, και το τετραγωνικό σφάλμα βγήκε στο τέλος ως συνέπεια, όχι ως σύμβαση.
Άρα έχουμε ένα τοπίο με πάτο και έναν λόγο να πιστεύουμε ότι ο πάτος είναι το σωστό μέρος. Αυτό που δεν έχουμε είναι έναν τρόπο να φτάσουμε εκεί.
Αυτό το κεφάλαιο χτίζει έναν τέτοιο τρόπο, και είναι ο αλγόριθμος που εκπαιδεύει κάθε μοντέλο στο υπόλοιπο αυτού του μαθήματος — κάθε ένα, χωρίς εξαίρεση, μέχρι και εκείνα με εκατοντάδες δισεκατομμύρια παραμέτρους. Χωράει σε περίπου είκοσι γραμμές. Τα δύο δύσκολα σημεία δεν βρίσκονται σε αυτές τις είκοσι γραμμές, και είναι τα δύο πράγματα που σχεδόν κάθε εξήγηση παραλείπει:
- Γιατί το σύμβολο μείον. Η ενημέρωση αφαιρεί το gradient. Κάθε tutorial το γράφει· πολύ λίγα λένε γιατί το gradient είναι η κατεύθυνση που πηγαίνει προς τα πάνω, το μόνο γεγονός που κάνει το μείον κάτι περισσότερο από πράξη πίστης.
- Πόσο μεγάλο βήμα. Το «πολύ μεγάλο αποκλίνει, το πολύ μικρό είναι αργό» είναι αλήθεια και άχρηστο. Υπάρχει ένας ακριβής αριθμός, υπολογίζεται από την απώλεια, και αυτό το κεφάλαιο τον υπολογίζει δύο φορές — μία για μια απλή παραβολή και μία για τα πραγματικά δεδομένα.
Η διατύπωση και γιατί δεν μπορείτε απλώς να ψάξετε
Σύνδεσμος στην ενότητα: Η διατύπωση και γιατί δεν μπορείτε απλώς να ψάξετεΞαναδιατυπωμένο ώστε αυτό το κεφάλαιο να στέκεται μόνο του: τα οκτώ εξαρτήματα από τον ιμάντα μεταφοράς του Κεφαλαίου 1, αλλά με διαφορετική ερώτηση. Όχι αποδοχή ή απόρριψη — αυτό επιστρέφει αργότερα — αλλά πρόβλεψη του βάρους ενός εξαρτήματος από το πλάτος του.
import numpy as np
WIDTH = np.array([18.0, 19.5, 20.2, 21.0, 24.0, 25.5, 23.0, 26.0])
WEIGHT = np.array([47.0, 52.0, 49.0, 55.0, 61.0, 66.0, 70.0, 58.0])
x = WIDTH - WIDTH.mean() # 22.15 mm
y = WEIGHT - WEIGHT.mean() # 57.25 gΟι μετρήσεις είναι κεντραρισμένες, ακριβώς όπως στο Κεφάλαιο 1 και για έναν λόγο που θα επιστρέψει με τόκο πριν τελειώσει αυτό το κεφάλαιο. Το μοντέλο είναι μια ευθεία, , και η απώλεια είναι το μέσο τετραγωνικό σφάλμα που παρήγαγε το προηγούμενο κεφάλαιο:
Δύο παράμετροι. Γιατί να μην δοκιμάσουμε απλώς πολλές τιμές; Ας το κάνουμε στ’ αλήθεια — ένα πλέγμα από έως και από έως , με βήμα :
grid 501 x 1001 = 501,501 evaluations in 3.67 s
best found: a = 2.1000, b = -0.0000, L = 24.592450Μισό εκατομμύριο αξιολογήσεις για να καρφώσουμε δύο αριθμούς στα δύο δεκαδικά ψηφία — και αυτό το δευτερόλεπτο είναι χρόνος τοίχου σε ένα μηχάνημα, άρα μια επανάληψη μπορεί να πέσει οπουδήποτε από τρία έως έξι· το πλήθος αξιολογήσεων και το ελάχιστο είναι το κομμάτι που αναπαράγεται. Το gradient descent, στο τέλος αυτού του κεφαλαίου, βρίσκει τέσσερα δεκαδικά ψηφία σε οκτώ βήματα και την πλήρη float64 απάντηση σε τριάντα έξι.
Αλλά η ταχύτητα δεν είναι το επιχείρημα, και αυτό είναι το σημείο που κρίνει όλο το μάθημα. Η αναζήτηση σε πλέγμα κοστίζει αξιολογήσεις για παραμέτρους με τιμές η καθεμία. Με χίλιες τιμές ανά άξονα:
| μοντέλο | παράμετροι | αξιολογήσεις πλέγματος |
|---|---|---|
| αυτή η ευθεία | 2 | |
| το δίκτυο XOR του Κεφαλαίου 5 | 9 | |
| ένα μικρό πολυεπίπεδο δίκτυο | 20.000 |
Η τρίτη σειρά δεν είναι μεγάλος αριθμός, είναι χωρίς νόημα — υπάρχουν περίπου άτομα στο παρατηρήσιμο σύμπαν. Η αναζήτηση δεν γίνεται απλώς πιο αργή όσο μεγαλώνουν τα μοντέλα· παύει να υπάρχει. Όλα όσα ακολουθούν υπάρχουν εξαιτίας αυτού του πίνακα.
Η παράγωγος είναι μια μέτρηση που μπορείτε να πάρετε
Σύνδεσμος στην ενότητα: Η παράγωγος είναι μια μέτρηση που μπορείτε να πάρετεΚρατήστε το σταθερό για μια στιγμή, ώστε να υπάρχει μία παράμετρος και μία καμπύλη, δηλαδή η εικόνα με την οποία σας άφησε το προηγούμενο κεφάλαιο. Πάρτε ένα σημείο πάνω της, , και ρωτήστε: αν μετακινήσω ελαφρά το κατά μια μικρή ποσότητα , πόσο μετακινείται η απώλεια ανά μονάδα μετακίνησης;
Αυτός ο λόγος είναι άνοδος προς οριζόντια μετατόπιση — η κλίση της ευθείας που περνά από δύο σημεία της καμπύλης. Καθώς το μικραίνει, τα δύο σημεία γλιστρούν το ένα προς το άλλο και η ευθεία γίνεται εφαπτομένη. Η κλίση της είναι η παράγωγος : ο ρυθμός με τον οποίο αλλάζει η απώλεια ανά μονάδα αλλαγής στο . Δεν είναι προσέγγιση κάποιου πράγματος και δεν είναι μια απειροελάχιστη ποσότητα. Είναι όριο συνηθισμένων λόγων.
Αξίζει να το τρέξουμε, γιατί οι αριθμοί λένε κάτι που ο ορισμός δεν λέει:
def loss1(a):
return np.mean((a * x - y) ** 2)
for h in [1.0, 1e-2, 1e-4, 1e-6, 1e-8, 1e-10, 1e-12, 1e-14]:
q = (loss1(1.0 + h) - loss1(1.0)) / h
print(f"h = {h:<8.0e} slope estimate = {q:.10f} error = {abs(q + 16.385):.3e}")h = 1e+00 slope estimate = -8.9400000000 error = 7.445e+00
h = 1e-02 slope estimate = -16.3105500000 error = 7.445e-02
h = 1e-04 slope estimate = -16.3842555001 error = 7.445e-04
h = 1e-06 slope estimate = -16.3849925556 error = 7.444e-06
h = 1e-08 slope estimate = -16.3850003787 error = 3.787e-07
h = 1e-10 slope estimate = -16.3850444324 error = 4.443e-05
h = 1e-12 slope estimate = -16.3851154866 error = 1.155e-04
h = 1e-14 slope estimate = -17.0530256582 error = 6.680e-01Δύο πράγματα συμβαίνουν εδώ και και τα δύο στηρίζουν όλο το βάρος.
Το σφάλμα δεν είναι αόριστα ανάλογο του — είναι ακριβώς . Διαιρέστε το με εκατό, και το σφάλμα διαιρείται με εκατό, κάθε φορά στα τέσσερα σημαντικά ψηφία. Αυτή η σταθερά δεν είναι διακόσμηση: είναι το μισό της δεύτερης παραγώγου της απώλειας και είναι η πρώτη εμφάνιση μιας ιδέας που θα έρθει σε δύο ενότητες — ότι μια καμπύλη κοντά σε ένα σημείο μοιάζει με ευθεία συν μια διόρθωση ανάλογη του .
Και μετά το μοτίβο σπάει. Κάτω από η εκτίμηση γίνεται χειρότερη, και στο είναι λάθος στο δεύτερο ψηφίο. Δεν συνέβη τίποτα μαθηματικό· συνέβη το κουτί κινητής υποδιαστολής του προηγούμενου κεφαλαίου. Τα και συμφωνούν στα πρώτα δέκα ψηφία τους, η αφαίρεσή τους καταστρέφει αυτά τα ψηφία, και η διαίρεση των υπολειμμάτων με έναν μικροσκοπικό αριθμό μεγεθύνει ό,τι έμεινε. Υπάρχει ένα καλύτερο — εδώ γύρω στο , περίπου η τετραγωνική ρίζα του machine epsilon — και το να πάτε μικρότερα δεν είναι πιο προσεκτικό, είναι λιγότερο. Θυμηθείτε το· μια συνάρτηση στο τέλος αυτού του κεφαλαίου εξαρτάται από αυτό.
Η ακριβής κλίση, από λογισμό αντί για μέτρηση, είναι . Άρα μπορούμε να σταματήσουμε να μετράμε και να αρχίσουμε να παράγουμε.
Σύνθεση και ο κανόνας της αλυσίδας
Σύνδεσμος στην ενότητα: Σύνθεση και ο κανόνας της αλυσίδαςΕδώ είναι η ιδέα πάνω στην οποία χτίζεται το υπόλοιπο μάθημα, ειπωμένη μία φορά, καθαρά.
Το να συνθέσετε δύο συναρτήσεις σημαίνει να τροφοδοτήσετε τη μία μέσα στην άλλη: . Τίποτα περισσότερο.
Ένα βαθύ δίκτυο δεν είναι σαν σύνθεση. Είναι σύνθεση. Ένα επίπεδο είναι συνάρτηση· το στοίβαγμα επιπέδων είναι σύνθεση συναρτήσεων· το «βάθος» είναι ο αριθμός των συναρτήσεων στην αλυσίδα. Όταν το Κεφάλαιο 5 χτίζει ένα δίκτυο, χτίζει και τίποτα άλλο. Αυτό σημαίνει ότι ο μοναδικός πιο σημαντικός κανόνας του λογισμού, για τους σκοπούς μας, είναι εκείνος που παραγωγίζει μια σύνθεση:
Οι ρυθμοί πολλαπλασιάζονται. Αν το αλλάζει τρεις φορές πιο γρήγορα από το , και το αλλάζει δύο φορές πιο γρήγορα από το , τότε το αλλάζει έξι φορές πιο γρήγορα από το . Αυτό είναι όλο το περιεχόμενο, και είναι ο λόγος που ένα σήμα που περνά προς τα πίσω μέσα από δέκα επίπεδα πολλαπλασιάζεται με δέκα αριθμούς — γι’ αυτό το Κεφάλαιο 6 αφιερώνει μια ενότητα στο τι συμβαίνει όταν όλοι αυτοί οι αριθμοί είναι λίγο μικρότεροι από ένα.
Χρησιμοποιήστε το στην απώλειά μας. Γράψτε το υπόλοιπο , ώστε . Κάθε εξαρτάται από το μέσω της εσωτερικής συνάρτησης , της οποίας η παράγωγος είναι . Κανόνας αλυσίδας, όρο προς όρο:
Αυτά τα καλλιγραφικά σύμβολα δηλώνουν μια μερική παράγωγο: παραγωγίζετε ως προς μία μεταβλητή και αντιμετωπίζετε κάθε άλλη ως σταθερά. Δεν συμβαίνει κάτι νέο — είναι το ίδιο όριο όπως πριν, παρμένο κατά μήκος ενός άξονα. Συλλέξτε τις μερικές παραγώγους σε ένα διάνυσμα και έχετε το gradient:
Στο σημείο αυτό το διάνυσμα είναι . Δύο αριθμοί. Το ερώτημα είναι τι σημαίνουν, και αυτό είναι το πρώτο βήμα που όλοι παραλείπουν.
Γιατί το gradient δείχνει προς την ανηφόρα
Σύνδεσμος στην ενότητα: Γιατί το gradient δείχνει προς την ανηφόραΤο gradient είναι ένα διάνυσμα κλίσεων κατά μήκος των αξόνων. Αυτό είναι όλο που έχουμε αποδείξει. Δεν είναι προφανές — δεν πρέπει να είναι προφανές — ότι η συναρμολόγησή τους σε ένα διάνυσμα παράγει κάτι που δείχνει προς κάποια συγκεκριμένη κατεύθυνση.
Ορίστε λοιπόν αυτό που πραγματικά θέλουμε. Διαλέξτε ένα μοναδιαίο διάνυσμα , μια κατεύθυνση. Η κατευθυντική παράγωγος είναι ο ρυθμός με τον οποίο αλλάζει η απώλεια καθώς περπατάτε προς τα εκεί:
Ο κανόνας της αλυσίδας το μετατρέπει σε κάτι υπολογίσιμο. Περπατώντας κατά μήκος του , το αλλάζει με ρυθμό και το με ρυθμό , και οι συνεισφορές αθροίζονται:
Ο ρυθμός μεταβολής σε οποιαδήποτε κατεύθυνση είναι το εσωτερικό γινόμενο του gradient με αυτή την κατεύθυνση. Και τώρα η κορύφωση, που είναι μία γραμμή γεωμετρίας. Γράφοντας το εσωτερικό γινόμενο με τη γωνία ανάμεσα στα διανύσματα,
αφού το έχει μήκος 1. Το μόνο πράγμα που ελέγχετε είναι το , το οποίο είναι μέγιστο στο και ελάχιστο σε μισή στροφή, μοίρες. Άρα:
- Η πιο απότομη άνοδος είναι κατά μήκος του ίδιου του , και η κλίση εκεί είναι ακριβώς .
- Η πιο απότομη κάθοδος είναι κατά μήκος του , και η κλίση εκεί είναι .
- Κάθετα στο gradient, η απώλεια δεν αλλάζει καθόλου. Γι’ αυτό οι γραμμές ενός χάρτη ισοϋψών τέμνουν το gradient σε ορθές γωνίες.
Αυτό είναι το σύμβολο μείον. Όχι σύμβαση, όχι αντιστροφή πρόσημου που διάλεξε κάποιος: η κατεύθυνση της ταχύτερης μείωσης είναι το αρνητικό gradient επειδή το ελαχιστοποιείται στη μισή στροφή, και για κανέναν άλλο λόγο.
Αφού αυτό είναι ισχυρισμός για όλες τις κατευθύνσεις, δοκιμάστε τον σε όλες τις κατευθύνσεις. Δειγματοληπτήστε 3.600 από αυτές, μία ανά δέκατο της μοίρας, και μετρήστε καθεμία με μια μικρή μετατόπιση:
theta = np.array([1.0, 4.0])
g = grad(theta)
print("gradient ", g)
print("its length ", np.linalg.norm(g))
print("its angle ", np.degrees(np.arctan2(g[1], g[0])) % 360, "degrees")
best = max(
((loss(theta + 1e-6 * u) - loss(theta - 1e-6 * u)) / 2e-6, np.degrees(ang))
for ang, u in (
(a, np.array([np.cos(a), np.sin(a)])) for a in np.arange(3600) * 2 * np.pi / 3600
)
)
print("steepest slope", best[0], "at", best[1], "degrees")gradient [-16.385 8. ]
its length 18.23371122399386
its angle 153.97598928042032 degrees
steepest slope 18.233709624837502 at 154.0 degreesΜια αναζήτηση που δεν ξέρει τίποτα για gradients, σε 3.600 κατευθύνσεις, βρίσκει την πιο απότομη άνοδο στις 154,0 μοίρες — την ίδια την κατεύθυνση του gradient, μέσα στην ανάλυση 0,1 μοίρας της αναζήτησης. Και η κλίση που βρίσκει εκεί, 18,2337, είναι το μήκος του gradient στα έξι ψηφία. Το θεώρημα δεν είναι μια ιστορία για το τι σημαίνουν τα gradients· είναι ένα μετρήσιμο γεγονός, και αυτή είναι η μέτρηση.
Γιατί ένα μικρό βήμα προς τα κάτω βοηθά πραγματικά
Σύνδεσμος στην ενότητα: Γιατί ένα μικρό βήμα προς τα κάτω βοηθά πραγματικάΤώρα το δεύτερο βήμα που παραλείπεται. Ξέρουμε προς τα πού είναι η κατηφόρα. Δεν συνεπάγεται ότι το να περπατήσουμε προς τα εκεί μειώνει την απώλεια, επειδή η «κατηφόρα» είναι δήλωση για μια απειροελάχιστη μετατόπιση και ένα βήμα δεν είναι απειροελάχιστο.
Η γέφυρα είναι η γραμμικοποίηση. Κοντά σε ένα σημείο, μια ομαλή συνάρτηση είναι η εφαπτομένη της συν μια διόρθωση:
Αυτό είναι το ανάπτυγμα Taylor πρώτης τάξης. Το απορριπτόμενο είναι η καμπυλότητα — ο ίδιος όρος που έκανε την εκτίμηση του πίνακα κλίσεων λανθασμένη κατά ακριβώς . Βάλτε μέσα το βήμα που σκοπεύουμε να κάνουμε, :
Η απώλεια πέφτει κατά . Κάθε μέρος αυτού είναι μη αρνητικό, άρα η υπόσχεση είναι πραγματική — για αρκετά μικρό , επειδή ο παραλειπόμενος όρος μεγαλώνει σαν και τελικά την καταπίνει. Αυτή είναι όλη η θεωρία. Εδώ είναι η υπόσχεση να τηρείται και μετά να σπάει:
eta = 0.2 promised 66.49364500 delivered -16.01619240 ratio -0.240868
eta = 0.1 promised 33.24682250 delivered 12.61936315 ratio 0.379566
eta = 0.01 promised 3.32468225 delivered 3.11840766 ratio 0.937957
eta = 0.001 promised 0.33246822 delivered 0.33040548 ratio 0.993796
eta = 0.0001 promised 0.03324682 delivered 0.03322620 ratio 0.999380
eta = 1e-05 promised 0.00332468 delivered 0.00332448 ratio 0.999938Διαβάστε το από κάτω. Καθώς το μικραίνει, η πραγματική πτώση συγκλίνει στην υποσχεμένη — λόγος 0,99938, μετά 0,99994 — δηλαδή το θεώρημα Taylor είναι σωστό. Διαβάστε το από πάνω και στο η πραγματική «πτώση» είναι αρνητικό δεκαέξι. Το βήμα πήγε προς την κατηφόρα και η απώλεια ανέβηκε.
Άρα ο κανόνας ενημέρωσης είναι
και συνοδεύεται από μια συνθήκη που κανείς δεν δηλώνει: ότι το είναι αρκετά μικρό. Αρκετά μικρό σε σχέση με τι, ακριβώς, είναι η επόμενη ενότητα.
Ο ρυθμός μάθησης έχει οροφή, και υπολογίζεται
Σύνδεσμος στην ενότητα: Ο ρυθμός μάθησης έχει οροφή, και υπολογίζεταιΞεκινήστε με την απλούστερη κοιλάδα που υπάρχει, , όπου . Ένα βήμα gradient descent είναι
Η θέση πολλαπλασιάζεται με σε κάθε βήμα. Αυτό είναι γεωμετρική ακολουθία, και οι γεωμετρικές ακολουθίες έχουν ακριβώς έναν κανόνα: μικραίνουν όταν ο πολλαπλασιαστής είναι μικρότερος από 1 σε απόλυτη τιμή και μεγαλώνουν αλλιώς. Άρα , δηλαδή .
Το όριο είναι ακριβώς στο . Όχι «γύρω στο 1», όχι «το 1 είναι συνήθως πολύ μεγάλο». Στο ο πολλαπλασιαστής είναι και το σημείο αναπηδά για πάντα μεταξύ και , χωρίς ούτε να πλησιάζει ούτε να ξεφεύγει. Κάτω από αυτό, συγκλίνει· πάνω από αυτό, αποκλίνει. Το διάστημα χωρίζεται ξανά στο , όπου ο πολλαπλασιαστής αλλάζει πρόσημο: κάτω από εκεί η προσέγγιση είναι μονότονη, πάνω από εκεί το σημείο υπερπηδά και εναλλάσσει πλευρές, και ακριβώς στο ο πολλαπλασιαστής είναι 0 και ένα μόνο βήμα προσγειώνεται στο ελάχιστο.
Τέσσερα καθεστώτα, από τέσσερις γραμμές άλγεβρας. Πηγαίνετε να περάσετε τα όρια μόνοι σας:
Και τώρα το ενδιαφέρον:
Τώρα ο γενικός κανόνας, που βγαίνει από το ίδιο επιχείρημα. Ο πολλαπλασιαστής ήταν στην πραγματικότητα , και κοντά σε ένα ελάχιστο μια απώλεια πολλών παραμέτρων έχει έναν τέτοιο αριθμό ανά κατεύθυνση — τις ιδιοτιμές του πίνακα δεύτερων παραγώγων. Κάθε κατεύθυνση πρέπει να είναι σταθερή ταυτόχρονα, άρα η οροφή ορίζεται από τη μεγαλύτερη:
Για , , οροφή 1, που είναι αυτό που μόλις παράξαμε. Για τον ιμάντα μας, ο πίνακας δεύτερων παραγώγων είναι με τον δίστηλο πίνακα εισόδων, και οι ιδιοτιμές του είναι 2 και 14,89, άρα η οροφή είναι . Αυτό είναι μια πρόβλεψη με πέντε σημαντικά ψηφία. Δοκιμάστε την:
lr=0.1343 -> L = 24.5924
lr=0.13431 -> L = 24.5924
lr=0.13432 -> L = 4707.8 BLEW UP
lr=0.13433 -> L = 4.00452e+16 BLEW UP
lr=0.1344 -> L = 1.18229e+107 BLEW UPΠέντε δεκαδικά ψηφία συμφωνίας ανάμεσα σε μια γραμμή γραμμικής άλγεβρας και εκατό χιλιάδες επαναλήψεις ενός βρόχου for.
Και εδώ επιστρέφει το Κεφάλαιο 1. Όλα τα παραπάνω χρησιμοποίησαν τις κεντραρισμένες μετρήσεις. Τρέξτε τον ίδιο ακριβώς κώδικα στα ωμά χιλιοστά και γραμμάρια και οι ιδιοτιμές είναι 0,0298 και 998,1 αντί για 2 και 14,89. Η οροφή καταρρέει από 0,134 σε 0,002004 — εξίσου ακριβώς, συγκλίνοντας στο lr=0.002003 και εκρήγνυται στο lr=0.002004.
Χειρότερος από την οροφή είναι ο λόγος ανάμεσα στις ιδιοτιμές. Ο αριθμός κατάστασης μετρά πόσο μακριά από στρογγυλή είναι η κοιλάδα: μια μακριά, λεπτή τάφρος επιβάλλει έναν ρυθμό αρκετά μικρό για τα απότομα τοιχώματα, και μετά ο πυθμένας της τάφρου περπατιέται με το ίδιο σύρσιμο. Ο δικός μας πηγαίνει από 7,44 κεντραρισμένος σε 33.452 ωμός. Με τον καλύτερο ρυθμό που μπορεί να πάρει κάθε εκδοχή:
| χαρακτηριστικά | αριθμός κατάστασης | καλύτερος ρυθμός | βήματα μέχρι εντός 1% του βέλτιστου |
|---|---|---|---|
| κεντραρισμένα | 7,44 | 0,1184 | 10 |
| ωμά χιλιοστά και γραμμάρια | 33.452 | 0,0020037 | 79.513 |
Ίδια δεδομένα, ίδιος κώδικας, ίδια απάντηση στο τέλος — και οκτώ χιλιάδες φορές περισσότερη δουλειά, επειδή κανείς δεν αφαίρεσε έναν μέσο όρο. Στο Κεφάλαιο 1 η ίδια παράλειψη κόστισε στον perceptron έναν παράγοντα έξι χιλιάδων σε εποχές, και η διάγνωση εκεί ήταν γεωμετρική: τα δεδομένα αιωρούνταν μακριά από την αρχή. Είναι η ίδια γεωμετρία εδώ με κοστούμι βελτιστοποίησης, και γι’ αυτό η κανονικοποίηση εισόδων δεν είναι συμβουλή υγιεινής αλλά αριθμητική.1
Είκοσι γραμμές
Σύνδεσμος στην ενότητα: Είκοσι γραμμέςΤίποτα από τα παραπάνω δεν χρειάστηκε βιβλιοθήκη. Εδώ είναι ολόκληρος ο optimiser.
def loss(theta):
a, b = theta
return np.mean((a * x + b - y) ** 2)
def grad(theta):
a, b = theta
residual = a * x + b - y
return np.array([np.mean(2 * residual * x), np.mean(2 * residual)])
def descend(theta, lr, steps):
theta = np.array(theta, dtype=float)
for _ in range(steps):
theta = theta - lr * grad(theta)
return theta
theta = descend([0.0, 0.0], lr=0.05, steps=60)
print(theta, loss(theta))[ 2.10040296e+00 -2.76445533e-15] 24.592448791134984Η κλειστή λύση ελαχίστων τετραγώνων για αυτά τα οκτώ σημεία είναι , , με απώλεια . Ο βρόχος τη βρήκε στα οκτώ σημαντικά ψηφία χωρίς να γνωρίζει ότι υπάρχει κλειστή μορφή — κάτι που έχει σημασία, επειδή από το Κεφάλαιο 5 και μετά δεν θα υπάρχει.
Η τροχιά, επειδή το νόημα είναι να τη δείτε:
0 a=0.000000 b=0.000000 L=57.437500
1 a=1.563750 b=0.000000 L=26.736582
2 a=1.963288 b=-0.000000 L=24.732418
5 a=2.098116 b=-0.000000 L=24.592488
10 a=2.100400 b=-0.000000 L=24.592449
60 a=2.100403 b=-0.000000 L=24.592449Το μεγαλύτερο μέρος της απόστασης καλύπτεται στα πρώτα δύο βήματα, επειδή το gradient είναι μεγαλύτερο όταν είστε πιο μακριά από τον πάτο και μικραίνει όσο πλησιάζετε. Το gradient descent επιβραδύνει αυτόματα κοντά σε ένα ελάχιστο. Αυτό είναι χαρακτηριστικό και είναι επίσης, στο Κεφάλαιο 6, πρόβλημα.
Πού αλλού η κλίση είναι μηδέν
Σύνδεσμος στην ενότητα: Πού αλλού η κλίση είναι μηδένΤο επιχείρημα μέχρι τώρα έχει μια τρύπα. Το βήμα σταματά όταν , και εμείς το αποκαλούσαμε «το ελάχιστο». Ένα σημείο με μηδενικό gradient είναι ένα κρίσιμο σημείο, και το να είναι ελάχιστο είναι μόνο ένας από τους τρόπους να είναι τέτοιο:
- ένα τοπικό ελάχιστο: ανηφόρα προς κάθε κατεύθυνση, αλλά πιθανώς όχι το χαμηλότερο τέτοιο σημείο οπουδήποτε·
- ένα τοπικό μέγιστο: κατηφόρα προς κάθε κατεύθυνση·
- ένα σαγματικό σημείο: ανηφόρα σε κάποιες κατευθύνσεις και κατηφόρα σε άλλες. Η επιφάνεια έχει , που είναι μηδέν στην αρχή, όπου η συνάρτηση είναι ελάχιστο κατά μήκος του άξονα και μέγιστο κατά μήκος του άξονα ταυτόχρονα.
Το gradient descent δεν μπορεί να τα ξεχωρίσει, επειδή κοιτάζει πάντα μόνο το gradient, και το gradient είναι μηδέν και στα τρία.
Η ευθεία μας έχει ένα κρίσιμο σημείο και είναι η απάντηση — μια απώλεια τετραγωνικού σφάλματος πάνω σε γραμμικό μοντέλο είναι κυρτή, ένα μόνο μπολ, και η κάθοδος σε αυτή δεν μπορεί να αποτύχει να βρει το ολικό ελάχιστο. Αυτή η ιδιότητα δεν επιβιώνει την επαφή με αυτό το μάθημα. Η απώλεια ενός νευρωνικού δικτύου δεν είναι κυρτή, και από το Κεφάλαιο 5 και μετά «το ελάχιστο» δεν είναι κάτι που υπάρχει: υπάρχουν πολλά, διαφορετικού βάθους, και το ποιο θα πάρετε εξαρτάται από το πού ξεκινήσατε. Αυτό είναι μία πρόταση και παραμένει μία πρόταση, επειδή η θεωρία είναι μεγάλη και η πρακτική συνέπεια μικρή.
Μπορείτε να δείτε όλη τη συνέπεια σε μία καμπύλη. Πάρτε , που έχει δύο κοιλάδες διαφορετικού βάθους:
x = -1.046681 f(x) = -0.352386 minimum
x = 0.101031 f(x) = 0.005026 maximum
x = 0.945649 f(x) = -0.152639 minimumΗ προσγείωση στη ρηχή κοιλάδα είναι 56,7% χειρότερη σε απώλεια, και ο αλγόριθμος δεν έχει τρόπο να το ξέρει, επειδή μέσα από μια κοιλάδα κάθε κατεύθυνση είναι ανηφόρα. Δεν υπάρχει επιδιόρθωση γι’ αυτό στο gradient descent και δεν έρχεται καμία. Αυτό που υπάρχει, στην πράξη, είναι το εύρημα ότι έχει πολύ μικρότερη σημασία από όσο υποδηλώνει αυτή η εικόνα — στις πολύ υψηλές διαστάσεις ενός πραγματικού δικτύου, τα περισσότερα κρίσιμα σημεία αποδεικνύονται σάγματα αντί για παγίδες,2 και το Κεφάλαιο 5 μετρά πόσο συχνά κολλάει πραγματικά ένα μικρό δίκτυο.
Φθηνότερα βήματα: στοχαστικό, minibatch, momentum
Σύνδεσμος στην ενότητα: Φθηνότερα βήματα: στοχαστικό, minibatch, momentumΈνα πράγμα στο grad παραπάνω πρέπει να σας ενοχλεί: αθροίζει πάνω σε ολόκληρο το dataset για κάθε βήμα. Οκτώ εξαρτήματα δεν είναι τίποτα. Ένα εκατομμύριο είναι ένα εκατομμύριο υπολογισμοί gradient για να μετακινηθούν οι παράμετροι μία φορά.
Η διέξοδος είναι ότι το gradient είναι ένας μέσος όρος, και ένας μέσος όρος μπορεί να εκτιμηθεί από ένα δείγμα. Υπολογίστε το σε μια τυχαία χούφτα — ένα minibatch — και κάντε βήμα πάνω σε αυτό. Η εκτίμηση είναι θορυβώδης· είναι επίσης αμερόληπτη, και εκατοντάδες φθηνά θορυβώδη βήματα νικούν ένα ακριβό ακριβές. Σε εκατό χιλιάδες συνθετικά εξαρτήματα, μετρώντας gradients ανά παράδειγμα αντί για βήματα:
| μέθοδος | βήματα μέχρι εντός 0,1% του βέλτιστου | gradients ανά παράδειγμα |
|---|---|---|
| πλήρες batch | 7 | 700.000 |
| minibatch των 32 | 100 | 3.200 |
| ένα παράδειγμα τη φορά | 17.580 | 17.580 |
Διακόσιες δεκαεννέα φορές λιγότερη αριθμητική για να φτάσουμε στο ίδιο σημείο. Και το άκρο — ένα παράδειγμα τη φορά, η αρχική στοχαστική προσέγγιση των Robbins και Monro3 — δεν είναι ο νικητής: είναι πέντε φορές χειρότερο από batches των 32, επειδή 32 παραδείγματα κοστίζουν σχεδόν τίποτα περισσότερο από ένα σε hardware που πολλαπλασιάζει πίνακες, ενώ ο θόρυβος πέφτει με την τετραγωνική ρίζα του μεγέθους batch. Αυτός ο συμβιβασμός είναι ο λόγος που κάθε script εκπαίδευσης που θα διαβάσετε ποτέ έχει ένα batch_size μέσα του.
Momentum είναι η άλλη φθηνή διόρθωση, και στοχεύει ευθέως στην τάφρο. Σε μια κακοσχηματισμένη κοιλάδα τα βήματα ζιγκ-ζαγκάρουν κατά μήκος της στενής κατεύθυνσης ενώ σέρνονται κατά μήκος της μακριάς. Το momentum κρατά έναν κυλιόμενο μέσο όρο των προηγούμενων gradients, ώστε οι ταλαντούμενες συνιστώσες να ακυρώνονται και η συνεπής να συσσωρεύεται:4
Δύο επιπλέον γραμμές. Στον ωμό μη κεντραρισμένο ιμάντα — αριθμός κατάστασης 33.452, η χειρότερη περίπτωση που έχουμε — με τον καλύτερο ρυθμό που μπορεί να πάρει η απλή κάθοδος:
momentum beta=0.0 -> 79,513 steps to 1%
momentum beta=0.9 -> 1,609 steps to 1%
momentum beta=0.99 -> 461 steps to 1%Παράγοντας 172 για δύο γραμμές κώδικα. Το Κεφάλαιο 6 το μετατρέπει σε Adam· ο μηχανισμός είναι ήδη εδώ.
Ο έλεγχος που θα χρειαστείτε στο Κεφάλαιο 5
Σύνδεσμος στην ενότητα: Ο έλεγχος που θα χρειαστείτε στο Κεφάλαιο 5Κάθε gradient σε αυτό το κεφάλαιο παράχθηκε με το χέρι και επομένως θα μπορούσε να είναι λάθος. Η λύση είναι ο πίνακας κλίσεων από την αρχή: μετρήστε την παράγωγο αριθμητικά και συγκρίνετε. Χρησιμοποιήστε την κεντρική διαφορά, , που ακυρώνει τον κύριο όρο σφάλματος και είναι πολύ πιο ακριβής για το ίδιο .
def numeric_grad(f, theta, h=1e-5):
theta = np.asarray(theta, dtype=float)
out = np.zeros_like(theta)
for i in range(theta.size):
bump = np.zeros_like(theta)
bump[i] = h
out[i] = (f(theta + bump) - f(theta - bump)) / (2 * h)
return out
def gradcheck(f, df, theta, h=1e-5):
analytic = np.asarray(df(theta), dtype=float)
numeric = numeric_grad(f, theta, h)
return np.max(np.abs(analytic - numeric) / np.maximum(1e-8, np.abs(analytic) + np.abs(numeric)))Η σχετική μορφή της σύγκρισης έχει σημασία: μια απόλυτη διαφορά είναι καταστροφή σε gradient μεγέθους και άσχετη σε ένα μεγέθους .
relative error: 1.8929136036763527e-11
with 2 dropped: 0.33333333331650744Η πρώτη γραμμή είναι το gradient που παράχθηκε με το χέρι παραπάνω. Η δεύτερη είναι η ίδια συνάρτηση με τον παράγοντα 2 παραλειμμένο από μία συνιστώσα — ένα typo ενός χαρακτήρα — και ο έλεγχος το πιάνει αμέσως. Οτιδήποτε κάτω από περίπου είναι συμφωνία· οτιδήποτε πάνω από είναι bug. Κρατήστε αυτή τη συνάρτηση: το Κεφάλαιο 5 τη χρησιμοποιεί για να debugάρει μια μηχανή αυτόματης διαφοροποίησης, και είναι ο μόνος λόγος που ένα λάθος gradient μπορεί να βρεθεί überhaupt.
Πού πηγαίνει αυτό στη συνέχεια
Σύνδεσμος στην ενότητα: Πού πηγαίνει αυτό στη συνέχειαΌλα σε αυτό το κεφάλαιο στηρίχθηκαν σε μία υπόθεση που δεν δηλώθηκε ποτέ: ότι μπορείτε να γράψετε κάτω το .
Για μια ευθεία με δύο παραμέτρους, αυτό ήταν μία γραμμή άλγεβρας. Σταματά να είναι σχεδόν αμέσως. Ζητήστε από ένα σύστημα συμβολικής άλγεβρας την παράγωγο της απώλειας ενός δικτύου ως προς ένα μόνο βάρος πρώτου επιπέδου, για ένα μόνο παράδειγμα, και μετρήστε την αριθμητική στην απάντηση:
| δίκτυο | πράξεις σε μία μερική παράγωγο |
|---|---|
| τέσσερις κρυφές μονάδες, ένα επίπεδο | 40 |
| τέσσερις κρυφές μονάδες, δύο επίπεδα | 301 |
| τέσσερις κρυφές μονάδες, τρία επίπεδα | 1.717 |
Η τρίτη σειρά είναι ένα δίκτυο με 57 παραμέτρους — ένα δίκτυο τόσο μικρό που θα ήταν υποσημείωση στο Κεφάλαιο 6 — και το να γράψετε το gradient του με το χέρι σημαίνει περίπου 97.869 πράξεις για ένα παράδειγμα εκπαίδευσης. Δεν υπάρχει συμβολισμός που να το σώζει αυτό. Αυτό που το σώζει είναι η παρατήρηση ότι ο κανόνας της αλυσίδας εφαρμοσμένος σε μια σύνθεση έχει τεράστια δομή, ότι οι ίδιες ενδιάμεσες ποσότητες εμφανίζονται ξανά και ξανά, και ότι ο υπολογισμός τους με τη σωστή σειρά δίνει όλες τις παραγώγους με περίπου το κόστος ενός forward pass. Αυτό είναι το Κεφάλαιο 5.
Αλλά υπάρχει πρώτα ένα μικρότερο πρόβλημα, και περιμένει αμέσως.
Έχουμε τώρα μια μηχανή που θα κυλήσει προς τα κάτω σε οποιαδήποτε διαφορίσιμη απώλεια. Στρέψτε τη στην αρχική ερώτηση του ιμάντα — αποδοχή ή απόρριψη, στόχος 1 ή 0 — βάλτε ένα sigmoid στην έξοδο ώστε να προβλέπει πιθανότητα, και ελαχιστοποιήστε το τετραγωνικό σφάλμα. Θα τρέξει. Θα κινηθεί επίσης ελάχιστα όταν κάνει το πιο λάθος, και το gradient λέει γιατί:
| έξοδος | πρόβλεψη | αλήθεια | gradient με τετραγωνικό σφάλμα | gradient με cross-entropy |
|---|---|---|---|---|
| 0.5000 | 1 | |||
| 0.1192 | 1 | |||
| 0.0025 | 1 | |||
| 1 |
Ένα μοντέλο που είναι με αυτοπεποίθηση, καταστροφικά λάθος — προβλέποντας 0,0000454 όταν η απάντηση είναι 1 — παράγει gradient τετραγωνικού σφάλματος . Δεν έχει ιδέα ότι βρίσκεται σε μπελάδες. Η άλλη στήλη, από μια απώλεια που δεν έχουμε ακόμη παράξει, αναφέρει 1,0: μέγιστη επείγουσα ανάγκη, ακριβώς εκεί όπου αξίζει.
Αυτό εγείρει το ερώτημα με το οποίο ανοίγει το επόμενο κεφάλαιο. Το προηγούμενο κεφάλαιο είπε ότι μια απώλεια είναι μια υπόθεση για τον θόρυβο, και το τετραγωνικό σφάλμα υποθέτει Gaussian θόρυβο. Τι μοντέλο θορύβου έχει μια απάντηση ναι-ή-όχι — και ποια απώλεια βγαίνει όταν τρέξετε την ίδια παραγωγή πάνω του;
Πηγές και μέθοδος
Σύνδεσμος στην ενότητα: Πηγές και μέθοδοςΗ μέθοδος είναι παλαιότερη από όλα αυτά: ο Cauchy την περιέγραψε σε ένα σημείωμα προς την Académie des Sciences το 1847, ως έναν τρόπο επίλυσης συστημάτων εξισώσεων περπατώντας προς τα κάτω πάνω στο άθροισμα των τετραγώνων των υπολοίπων τους. Αξίζει επίσης να διαβαστεί μαζί με αυτό το κεφάλαιο το An overview of gradient descent optimization algorithms του Sebastian Ruder (arXiv:1609.04747), που καλύπτει το momentum μέχρι τον Adam σε δεκατέσσερις ευανάγνωστες σελίδες· το κεφάλαιο 3 των Nocedal και Wright, Numerical Optimization (2η έκδ., Springer, 2006), του οποίου το θεώρημα 3.3 δίνει τον ρυθμό σύγκλισης της steepest descent σε ένα τετραγωνικό ως συνάρτηση του αριθμού κατάστασης — είναι η θεωρία πίσω από το γιατί το conditioning αποφασίζει το πλήθος βημάτων, αν και αντιμετωπίζει line search αντί για την οροφή σταθερού βήματος που μετρήθηκε παραπάνω, ή οι §5.8 και §7.1 των Deisenroth, Faisal και Ong, Mathematics for Machine Learning, για το ίδιο έδαφος με λιγότερη μηχανή· η §6.1 του Prince, Understanding Deep Learning, και η §4.3 των Goodfellow, Bengio και Courville, Deep Learning· το Dive into Deep Learning §12.1–12.3, που έχει την ανάλυση minibatch με περισσότερες μετρήσεις από όσες χωράνε εδώ· και το κεφάλαιο 4 του Géron, Hands-On Machine Learning (3η έκδ.), η πιο πρακτική αντιμετώπιση του ρυθμού μάθησης ως κάτι που ρυθμίζετε αντί να παράγετε. Οι σημειώσεις MIT 6.390 βάζουν το gradient descent πριν από την ταξινόμηση, όπως κάνει αυτό το μάθημα και για τον ίδιο λόγο.
Παραπομπές
Σύνδεσμος στην ενότητα: Παραπομπές-
LeCun, Y., Bottou, L., Orr, G. B. and Müller, K.-R. Efficient BackProp, στο Neural Networks: Tricks of the Trade (Springer, 1998), σ. 9–50. Η ενότητα 4.3 δίνει τη σύσταση και η ενότητα 5.1 το επιχείρημα που χρησιμοποιήθηκε στο πλαίσιο λεπτομέρειας παραπάνω: το κεντράρισμα και η κλιμάκωση των εισόδων αλλάζουν τις ιδιοτιμές του πίνακα δεύτερων παραγώγων, και επομένως τον αριθμό των βημάτων, όχι απλώς την αριθμητική άνεση. ↩
-
Dauphin, Y. N., Pascanu, R., Gulcehre, C., Cho, K., Ganguli, S. and Bengio, Y. Identifying and attacking the saddle point problem in high-dimensional non-convex optimization, arXiv:1406.2572 (2014). Το επιχείρημα ότι σε υψηλές διαστάσεις τα κρίσιμα σημεία είναι συντριπτικά σάγματα και όχι τοπικά ελάχιστα, αφού ένα ελάχιστο απαιτεί κάθε μία από χιλιάδες κατευθύνσεις να καμπυλώνει προς τα πάνω ταυτόχρονα. ↩
-
Robbins, H. and Monro, S. A Stochastic Approximation Method. Annals of Mathematical Statistics 22(3), σ. 400–407 (1951). Η εργασία που καθιέρωσε ότι μια θορυβώδης εκτίμηση ενός gradient αρκεί, με δεδομένο ένα μέγεθος βήματος που μικραίνει με τον σωστό τρόπο. ↩
-
Polyak, B. T. Some methods of speeding up the convergence of iteration methods. USSR Computational Mathematics and Mathematical Physics 4(5), σ. 1–17 (1964). Η μέθοδος heavy-ball, που είναι η ενημέρωση momentum παραπάνω, είκοσι δύο χρόνια πριν το backpropagation φτάσει σε αυτό το πεδίο. ↩