Machine Learning Diagnostics

Είναι συχνό φαινόμενο στις μέρες μας, αρκετοί φοιτητές που ασχολούνται με τον τομέα της έρευνας και της μηχανικής μάθησης (also known as Machine Learning ή ML) να χρησιμοποιούν αλγορίθμους τους οποίους βρήκαν στο Google. Έμαθαν, έψαξαν και τελικά βρήκαν, ότι αυτός ο αλγόριθμος "κάνει" την δουλειά, οπότε και τον χρησιμοποιούν, χωρίς να γνωρίζουν πώς δουλεύει "πίσω από την κουκούλα" (under the hood όπως θα λέγαμε και στην αγγλιστί).



Αυτό είναι απόλυτα λογικό και δεν υπάρχει κανένα πρόβλημα. Έστω λοιπόν ότι φτιάχνετε έναν αλγόριθμο εκμάθησης για object detection, και προσπαθείτε να εκπαιδεύσετε το σύστημα να αναγνωρίζει πορτοκάλια (τυχαίο παράδειγμα - btw φάτε και κανένα φρούτο, καλό κάνει :P). Ενώ όλα πάνε καλά με το dataset που έχετε και ο αλγόριθμος φαίνεται ότι είναι ικανός να ξεχωρίσει τα πορτοκάλια στις φωτογραφίες για τις οποίες έχει εκπαιδευτεί, ξαφνικά διαπιστώνετε ότι υπάρχει πρόβλημα.... Όταν του δίνετε νέες φωτογραφίες για τις οποίες δεν έχει εκπαιδευτεί, τότε δυστυχώς παίρνετε τεράστιο σφάλμα...  Τι θα κάνετε τότε;


Θα τροποποιήσετε τον αλγόριθμο που βρήκατε στο Ρώσικο porn warez torrento site; Okay, πάτε λοιπόν: Δεξί Κλικ > Άνοιγμα: ΜΠΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΑΜ. Δεν καταλαβαίνετε Jesus :P Εμ, λογικό είναι... Τι θα κάνετε λοιπόν; Οέο;

Μερικές ιδέες που έρχονται στα γρήγορα στο μυαλό του καθενός είναι: πρώτη απ' όλα θα σκεφτείτε ότι χρειάζεστε περισσότερα δεδομένα. Είναι λογικό αν το σκεφτεί κανείς, όσο περισσότερα παραδείγματα έχω, τόσο καλύτερο σύστημα θα φτιάξω. Αυτό όμως κρύβει μία παγίδα πολλές φορές, γιατί ενδέχεται να πέσετε θύμα του overfitting/underfitting (θα τα δούμε στην συνέχεια). Μία δεύτερη ιδέα θα ήταν να προσθέσετε μερικούς όρους πολυωνύμων ( κλπ). Κάποιοι άλλοι θα λέγανε να πειράξουμε τον συντελεστή κανονικοποίησης λάμδα (λ), να τον αυξήσουμε ή να τον μειώσουμε. Σε κάθε περίπτωση, θα πρέπει να επιλέξετε κάτι, κάποια μέθοδο που θα βελτιώσει τον αλγοριθμό σας. Τι γίνετε όμως αν επιλέξετε την λάθος μέθοδο ή τύχει να δείτε μία φωτογραφία του Μητσοτάκη; (Hint)

"Klein mein, θα δοκιμάσω μια άλλη", θα ήταν μία πιθανή απάντηση. Αλλά τι γίνεται όταν εργάζεστε σε large scale projects (όχι δεν είναι μόνο η IBM, και το σύστημα στάσης λεωφορείων του ΟΑΣΘ θεωρείται ευρείας κλίμακας project) και η υλοποίηση και μόνο της μίας μεθόδου (πχ να συλλέξετε περισσότερα δεδομένα) θα σας έπαιρνε ενα ολόκληρο εξάμηνο; Φαντάζεστε να έρθει κάποιος μετά απο 6 μήνες και να σας πει "Οk, τζάμπα και άδικος κόπος τα λεφτά που έδινες για 6 μήνες, είχαμε λάθος μέθοδο".
- Απ: @@&&^*^%&@$#^%@#@(#*&@^%#$  you got the point....

... άρα συμφωνούμε στο ότι πρέπει να γνωρίζουμε από ΠΡΙΝ αν η μέθοδος που θα χρησιμοποιήσουμε για την βελτίωση του αλγορίθμου εκμάθησης, είναι η σωστή ή όχι. Δηλαδή να μπορούμε να αξιολογήσουμε τις επιλογές που έχουμε, και να επιλέξουμε την καλύτερη από αυτές. Αυτό λέγεται Machine Learning Diagnostics, όπου στην ουσία είναι ένα test του οποίου τα αποτέλεσμα είναι αρκετά ξεκάθαρα και σαφή για να μας βοηθήσουν στην επιλογή μας.

Έτσι, μπορεί να ξοδέψετε λίγο παραπάνω χρόνο για να κάνετε έλεγχο των επιλογών που έχετε, αλλά σίγουρα δεν θα πάει χαμένος, αφού θα σας γλυτώσει από τις λάθος επιλογές. Για αυτό, το να τρέχει κανείς ένα "Διαγνωστικό Τεστ Μηχανικής Εκμάθησης" είναι απαραίτητο πριν παραδώσει το project του στην εταιρεία.

Αξιολογώντας την επιθυμητή έξοδο - Diagnostics

Όταν έχετε ένα μικρό πρόβλημα ή γενικά λίγες ή μία μεταβλητές προς προσδιορισμό, τότε μπορείτε πολύ εύκολα να κάνετε το γράφημα της επιθυμητής εξόδου (υπόθεσης) του συστήματος, και να δείτε πόσο απέχει από την πραγματική τιμή (το σφάλμα). Αν έχετε συλλέξει υπερβολικά πολλά δεδομένα και έχετε εκπαιδεύσει το σύστημα σε μεγάλο βαθμό, τότε το σφάλμα θα είναι πολύ πολύ μικρό (πχ 0.00001). Στις περισσότερες όμως των περιπτώσεων, ένα τέτοιο σύστημα (υπερβολικά εκπαιδευμένο) παρουσιάζει overfitting (ή αλλιώς High Bias). Απο κει λοιπόν που είχατε σχεδόν μηδέν σφάλμα για τα δεδομένα σας, αν τώρα έρθει ο κυρ Andre Ng και σας δώσει νέα δεδομένα θα έχετε ένα τεράστιο σφάλμα, γιατί το σύστημα σας δεν "έμαθε" -- αλλά "παπαγάλισε".

-- Κύριε, κύριε: Δεν κατάλαβα, μπορείτε να το ξανά εξηγείσετε; :P
[noobmode]Φανταστείτε έναν μαθητή που μαθαίνει απ'έξω την ιστορία της Ελλάδας. Στο διαγώνισμα όμως πέφτει ερώτηση με την ιστορία της Κύπρου, και αυτός γράφει την ιστορία της Ελλάδας. Κάπως έτσι λοιπόν θα ανταποκριθεί το υπερ-εκπαιδευμένο σύστημα. Δεν σκέφτεται, δεν βλέπει ότι του δίνεις νέα δεδομένα. Απαντάει αυτά που ξέρει. Για αυτό και το σφάλμα (η απάντηση του μαθητή στην ιστορία της Κύπρου) θα είναι τεράστιο. Το αν υπάρχει overfitting ή όχι, μπορούμε να το δούμε κάνοντας στα γρήγορα την γραφική παράσταση του dataset -- δηλαδή να διαβάσουμε την απάντηση στο γραπτό του μαθητή.[/noobmode]

Τι γίνεται όμως όταν έχουμε πολλές μεταβλητές και ένα dataset μερικών χιλιάδων τιμών; Σίγουρα δεν είναι εύκολο να κάνουμε plot, αλλά και αν το καταφέρουμε, άντε βγάλε άκρη περί τίνος πρόκειται... Για αυτό χρησιμοποιούμε την εξής λογική:

Έστω ότι έχουμε 100 τιμές εισόδου πακέτο μαζί με τις 100 επιμέρους εξόδους τους. Αυτό που θα κάνουμε είναι να χρησιμοποιήσουμε τις 70 πρώτες για την εκμάθηση του συστήματος, και τις 30 τελευταίες για το τεστάρισμά του (για να διαπιστώσουμε αν έμαθε καλά). Προσοχή, αν τιμές είναι sorted κάτα αύξοντα ή φθίνοντα αριθμό ή γενικά αν δεν είναι τυχαία η σειρά τους, τότε ενδέχεται να έχουμε πρόβλημα. Για αυτό θέλουμε γενικά το 70% για train set, και το 30% για test set. Η διαδικασία που ακολουθούμε είναι απλή:

  1. Κάνε εκμάθηση (ελαχιστοποίησε δηλαδή το σφάλμα  J(Θ) της cost function ) στο train set (70%)
  2. Υπολόγισε το σφάλμα που έχεις στο test set (SSE - Sum Square Error του test set (30% ) )
To SSE για το testset για linear regression υπολογίζεται ως εξής:

Αν έχουμε ένα classification πρόβλημα, όπου η λύση είναι 0 ή 1, τότε το SSE για το testset της logistic regression θα είναι:



Υπάρχει όμως και μία πιο γρήγορη οδός (clever lad's street :p) για να υπολογίσουμε τα classification problems, γνωστή ως Misclassification error (ή 0/1 error). Η λογική είναι πολύ απλή, σκεφτείτε ότι έχουμε μία συνάρτηση error(x,y) όπου x είναι η είσοδος και y είναι η έξοδος του dataset. Επειδή το σύνολο τιμών που εργαζόμαστε είναι από 0 ως 1 τότε θέτουμε ένα όριο (threshold) και λέμε ότι πχ από το 0.5 και πάνω θεωρώ 1, και από απο 0.5 και κατω θεωρώ 0. Άρα αν το x είναι πάνω από 0.5 και το y είναι 0 τότε η συνάρτηση δίνει 1 (δηλαδή βρήκε error). Επίσης και στην ανάλογη περίπτωση που το x<0.5 και y=1 τότε πάλι η συνάρτηση θα επιστρέψει 1 (έχω error). Πότε θα επιστρέψει μηδέν; Στις αντίθετες περιπτώσεις όπου δεν υπάρχει σφάλμα...



... έτσι έχουμε φτιάξει την συνάρτηση error που μας επιτρέφει 1 αν υπάρχει error ή 0 αν όλα πάνε καλά. Για το τεστάρισμα, δεν θα χρησιμοποιήσουμε την μέθοδο SSE, αλλά κάτι πιο απλό. Θα δώσουμε στην συνάρτηση το testset και θα δούμε πόσα errors έχουμε αθροιζοντάς τα. Διαιρώντας με τον αριθμό των παραδειγμάτων που τσεκάραμε (testset) έχουμε ένα κλάσμα που έχει στον αριθμητή τον αριθμό των errors και στον παρονομαστή το σύνολο των tests. πχ 3/30 θα σημαίνει ότι στα 30 test τα 3 βγήκαν λάθος.




Έτσι με αυτές τις τεχνικές μπορείτε να αξιολογήσετε την επιθυμητή έξοδο του συστήματός σας, και να τεστάρετε κατά πόσο σωστά προβλέπει τις νέες τιμές που του δίνετε.


Επιλογή βαθμού πολυωνύμου

Με πιο απλά λόγια θα μπορούσαμε να πούμε "επιλογή μοντέλου", διότι περί αυτού πρόκειται. Είμαστε λοιπόν στην περίπτωση που θέλουμε να βελτιώσουμε τον αλγόριθμο εκμάθησης προσθέτοντας πολυωνομικούς όρους, πχ δευτεροβάθμια συνάρτηση, τριτοβάθμια, τεταρτοβάθμια κοκ. Έχουμε λοιπόν πολλές επιλογές, αλλά ποια θα επιλέξουμε;




Και για τις 5 αυτές υλοποιήσεις (μπορεί να είναι 10, 20, 30 ,40, όσες θέλετε) πρέπει να εξετάσουμε κατά πόσο βελτιώνουν τον αλγόριθμο. Αν υπολογίσουμε την cost function, δηλαδή ελαχιστοποιήσουμε το σφάλμα στην καθεμία, τότε μπορούμε να πάρουμε μία πρώτη γεύση. Η (1) θα μας δώσει κάποιο J1, η (2) θα μας δώσει κάποιο J2, η (3) θα μας δώσει κάποιο J3 κλπ. Η προφανής επιλογή θα ήταν να "ταΐσουμε" την καθεμία στο testset και να δούμε πώς συμπεριφέρεται. Επειδή αυτό όμως θα ήταν αρκετά χρονοβόρο να το κάνουμε για την κάθε μία επιλογή, θα φτιάξουμε ένα καινούριο set.

... εκείνο που θα βρίσκει το καλύτερο δυνατό μοντέλο (βαθμό πολυωνύμου) και έπειτα, αφού το βρει, τότε αυτό θα είναι και το μοντέλο που θα ταϊσουμε σαν είσοδο στο testset. Άρα, χρειαζόμαστε ένα set το οποίο θα υπολογίζει το σφάλμα για κάθε ένα από αυτά τα μοντέλα. Αυτό θα λέγεται Cross Validation Error.

Συνεπώς, το αρχικό data set, το χωρίζουμε σε

  • 60% training set
  • 20% Cross Validation error
  • 20% Test error
Βρίσκοντας τις εξόδους του training set για όλα τα μοντέλα, τις περνάμε μέσα από το CV (cross validation) και βρίσκουμε το σφάλμα που έχει το καθένα. Στην συνέχεια επιλέγουμε αυτό με το μικρότερο cross validation error σφάλμα, και το δίνουμε στο testset.




Αυτό που κάνουμε χοντρικά στο CVset είναι μία γρήγορη και αισιόδοξη πρόβλεψη, ότι αυτό το μοντέλο με το μικρότερο δυνατό J(Θ), θα είναι η καλύτερη γενική λύση του προβλήματος. Έστω λοιπόν ότι η καλύτερη λύση είναι το τεταρτοβάθμιο. Αυτό θα περάσουμε στο testset.

Βρίσκοντας το πρόβλημα: Overfitting ή Underfitting ;

Κάνοντας λοιπόν όλα αυτά, βλέπουμε ότι υπάρχει μία βελτίωση στα αποτελέσματα. Ωστόσο εξακολουθεί να υπάρχει πρόβλημα (κατάρααα!!). Αυτό το πρόβλημα θα είναι είτε overfitting είτε underfitting. Λέγοντας Underfitting εννοούμε ότι έχουμε πολύ λίγα στοιχεία, όπου έχουμε σχεδόν μία ευθεία γραμμή η οποία έχει μεγάλο trainset error και θα ταυτίζεται σχεδόν με το Cross Validation error. Η άλλη περίπτωση είναι να έχουμε Οverfitting, δηλαδή τα δεδομένα να μην έχουν σχεδόν κανένα λάθος (υπερεκμάθηση) αλλά όταν του δίνω νέα δεδομένα, βγάζει ότι να ναι στην έξοδο. Αυτό σημαίνει ότι έχω πολύ χαμηλό ή σχεδόν μηδενικό trainset error, αλλά το CrossValidation Error θα είναι πολύ μεγαλύτερο από το trainset.


Αν αρχίσουμε δηλαδή από ένα απλό πολυώνυμο πρώτης τάξης, τότε το training error θα είναι πολύ μεγάλο (underfitting), ενώ ένα πολυώνυμο της 10ης τάξης θα έχει πολύ μικρό training error (overfitting).

Άρα, το test error ή validation error (και το δυο την ίδια δουλειά κάνουν πάνω-κάτω) θα μας δείξουν τι πρόβλημα έχουμε. Η μέση λύση και το πιο σωστό θα είναι να μην έχουμε ούτε overfitting, ούτε underfitting. Άρα για τάξη 1, έχω μεγάλο test error, όπως και για τάξη 10, πάλι έχω το ίδιο μεγάλο test error. Η χρυσή τομή, είναι κάπου στην μέση.

  • Για ένα απλό πολυώνυμο πρώτης τάξης έχω underfitting (High Bias)
  • Για ένα μεγάλο πολυώνυμο μεγάλη τάξης (πχ x^7) έχω Overfitting (High Variance)
  • Ενώ κάπου στην μέση, για τάξη 3, έχω την πιο σωστή λύση (το μικρότερο test error).


Για να τα συνοψίσουμε:
  • Bias (Underfit)
    • Jtrain(θ) = πολύ μεγάλο
    • Jcu(θ) = Jtrain(θ) στο περίπου
  • Variance (Overfit)
    • Jtrain(θ) = πολύ μικρό, κοντά στο μηδέν
    • Jcu(θ)  > > Jtrain(θ)
Με αυτούς τους δύο αυτούς κανόνες λοιπόν μπορούμε να εντοπίσουμε τι είδους πρόβλημα έχουμε :)


Επιλέγοντας τον σωστό συντελεστή κανονικοποίησης λάμδα - λ

Σε πολλές περιπτώσεις, θέλουμε να ενσωματώσουμε κανονικοποίηση (regularization) στο μοντέλο μας ώστε να μην έχουμε προβλήματα overfitting. Αυτό γίνεται προσθέτοντας έναν ακόμα παράγοντα στην εξίσωση J(θ), ο οποίος αυτός παράγοντας αποτελεί τον regularization term. Το κατά πόσο θα παίξει μεγάλο ή μικρό ρόλο αυτός ο παράγοντας, δηλαδή μεγάλη ή μικρή κανονικοποίηση, εξαρτάται από έναν συντελεστή λ, ο οποίος πολλαπλασιάζεται με αυτόν τον όρο.

Regularization Term:



Δηλαδή το μοντέλο μας μαζί με την κανονικοποίηση γίνεται:



Εδώ θα μελετήσουμε λοιπόν πώς αλληλεπιδρά το συντελεστής λάμδα στο πρόβλημα underfitting και overfitting (νωρίτερα είδαμε πως αλληλεπιδρά η τάξη του πολυωνύμου). Αρχίζουμε λοιπόν και δοκιμάζουμε διάφορες τιμές του λάμδα (διπλασιάζοντας το λ μέχρι 10.24) και γράφουμε για κάθε παράδειγμα την έξοδο.


  1. Δοκιμή για λ=0 ---> J1(θ) = κάτι
  2. Δοκιμή για λ=0.1 ---> J2(θ) = κάτι άλλο
  3. Δοκιμή για λ=0.2 ---> J3(θ) = κάτι άλλο
  4. Δοκιμή για λ=0.04 --> J4(θ) = κάτι άλλο
  5. Δοκιμή για λ =0.08 --> J5(θ) = κάτι άλλο
  6. Δοκιμή για λ = 0.16 --> J6(θ) = κάτι άλλο
  7. .... κλπ κλπ μέχρι το λ = 10.24 (είναι 12 παραδείγματα)
Στο τέλος λοιπόν θα προκύψουν 12 διαφορετικά J(Θ). Αυτά θα τα περάσουμε από το Cross Validation Error, και εκεί θα μας δείξει το σφάλμα για το καθένα J(Θ). Όποιο J(θ) θα έχει το μικρότερο σφάλμα, αυτήν και θα επιλέξουμε. Τέλος, αυτή την θα την περάσουμε και από το test error για να δούμε κατά πόσο μπορούμε να την προτείνουμε για γενική λύση και αν βελτιώσαμε τον αλγόριθμο σε σχέση με πριν (πριν εφαρμόσουμε κανονικοποίηση).

Προσοχή: Τον όρο κανονικοποίησης τον εφαρμόζουμε μόνο στο μοντέλο μας (την συνάρτηση J(θ) ) και όχι στα train/cv/test errors. Αυτά παραμένουν ως έχουν:




  • Μεγάλο λ: High bias (underfitting)
  • Μεσαίο λ: η πιο σωστή επιλογή
  • Μικρό λ: High variance (overfitting)
Ένα πολύ μικρό λάμδα έχει ως αποτέλεσμα να εξαλείφει τους παράγοντες θ και να τους κάνει σχεδόν μηδέν, συνεπώς θ*x θα ισούται με 0. Άρα θα πάρουμε ως αποτέλεσμα μία ευθεία οριζόντια γραμμή -- με άλλα λόγια μεγάλο train error και test error.

Ένα πολύ μεγάλο λάμδα θα μας δώσει πάλι μεγάλο σφάλμα και αυτό γιατί θα έχουμε underfitting.

Συγκρίνοντας το λάμδα με την τάξη του πολυωνύμου βλέπουμε ότι το ένα είναι το αντίστροφο του άλλου: Overfitting έχουμε για πολύ μεγάλη τάξη και πολύ μικρό λάμδα, ενώ underfitting έχουμε για πολύ μικρή τάξη και πολύ μεγάλο λάμδα. Και στις δύο περιπτώσεις όμως, η χρυσή τομή βρίσκεται κάπου στην μέση, όπου αυτά τα δύο θα δώσουν το επιθυμητό αποτέλεσμα.

Χρειάζομαι περισσότερα δείγματα; Κάνε Learning Curves και βρες την απάντηση.

Το να σχεδιάζει κανείς τις Learning Curves (καμπύλες εκμάθησης) είναι πολύ σύνηθες καθώς μπορεί αμέσως αμέσως να δει το πρόβλημα που έχει ο αλγοριθμός του (overfitting ή underfitting ή και τα δύο) αλλά και πως μπορούν να τον βελτιώσουν. Στην ουσία πρόκειται να δείτε κατά πόσο θα επηρεάσει τον αλγόριθμο αν αυξήσετε το learning set. Δηλαδή αν αυξήσετε κατά 10.000 τιμές το σετ εκμάθησης, σχεδιάζοντας τις Learning Curves μπορείτε να δείτε από πριν, αν θα βελτιώσει ή όχι τον αλγοριθμό σας.

Χρησιμοποιούμε δύο συναρτήσεις, την Jtrain και την Jcv και σχεδιάζουμε σε άξονες. Ο άξονας y θα δείχνει το σφάλμα, ενώ ο άξονας x θα δείχνει τον αριθμό των δειγμάτων (training examples). Βάζοντας την λογική να δουλέψει, καταλαβαίνετε πως όταν έχουμε μόνο ένα δείγμα προς εκμάθηση, ο training error θα είναι μηδέν και το test error θα είναι τεράστιο. Αυξάνοντας τον αριθμό των δειγμάτων εκμάθησης, πχ m=2, πάλι θα έχουμε παρόμοια κατάσταση. Όσο αυξάνουμε τον αριθμό των δειγμάτων, όσο δηλαδή μεγαλώνει το dataset που έχουμε, τόσο πιο δύσκολο είναι να έχουμε μία καμπύλη που να περιγράφει τέλεια όλα τα σημεία. Συνεπώς αυτό που μας λέει η λογική μας είναι πως όσο μεγαλώνουμε το dataset: το training error θα μεγαλώνει και το test error θα μειώνεται. Από κάποιο σημείο και μετά, ανάλογα με το τι πρόβλημα θα μας παρουσιαστεί (overfitting) ή (underfitting) μπορούμε να δούμε τι θα γίνει αν αυξήσουμε το dataset.

Περίπτωση underfitting (high bias)
Αν έχουμε High bias αυτό σημαίνει ότι έχω τάξη πολυωνύμου n=1, δηλαδή δεν υπάρχει δευτεροβάθμιος όρος και αν χρησιμοποιούμε κανονικοποίηση τότε το λ είναι πολύ μεγάλο. Συνεπώς έχοντας ένα μοντέλο J(x) = θο + θ*x  θα μας επιστρέψει μία ευθεία γραμμή, η οποία είτε έχουμε 10 δείγματα, είτε έχουμε 10.000 δείγματα θα είναι το ίδιο.


  • Μικρός αριθμός δειγμάτων: Μεγάλο Jcv, Μικρο Jtrain
  • Μεγάλος αριθμός δειγμάτων: Μεγάλο Jcv, Μεγάλο Jtrain

Άρα αυξάνοντας των αριθμό των δειγμάτων δεν θα βοηθήσει αν πάσχουμε από Underfitting (High Bias) problem. Θα είναι άδικος κόπος να το κάνετε...

Περίπτωση overfitting (high variance)
Αν έχουμε την αντίθετη περίπτωση, δηλαδή έχουμε μεγάλη τάξη πολυωνύμου (πχ x^100) και αν υπάρχει κανονικοποίηση τότε το λάμδα έστω ότι είναι πολύ πολύ μικρό, τότε πάσχουμε από high variance - δηλαδή overfitting. Αυτό φαίνεται στην γραφική παράσταση από το μεγάλο gap που έχουν οι δύο γραφικές. Παρατηρούμε όμως, πως όσο αυξάνουμε τον αριθμό των δειγμάτων, το Jcv μειώνεται εκθετικά και στην τελική το σφάλμα μειώνεται σε ικανοποιητικό βαθμό. Συνεπώς, συμπεραίνουμε πως αν ο αλγοριθμός μας πάσχει από Underfitting problem, θα ήταν καλό να αυξήσουμε τον αριθμό των δειγμάτων. Θα δούμε δηλαδή κάποια αισθητική βελτίωση.


  • Μικρός αριθμός δειγμάτων: Μεγάλο Jcv, Μικρο Jtrain    --- (ίδιο με το underfitting)
  • Μεγάλος αριθμός δειγμάτων: Λίγο μικρότερο Jcv, Λίγο μεγαλύτερο Jtrain

Άρα αν ο αλγόριθμος μας πάσχει από Overfitting, μία λύση είναι να αυξήσουμε τα δείγματα. Θα δούμε μία βελτίωση από το Cross Validation Error βλέπουμε ότι μειώνεται, αλλά δεν θα είναι κάτι δραματικό.

Για να απαντήσουμε λοιπόν στην αρχική ερώτηση, αν ο αλγόριθμός μας πάσχει από Variance, τότε αυξάνοντας τον αριθμό των δειγμάτων, μπορεί να βελτιώσει την κατάσταση.


Τι μάθαμε λοιπόν; (Απάντηση στο αρχικό ερώτημα)

Έστω ότι φτιάχνετε έναν αλγόριθμο για object detection, και προσπαθείτε να εκπαιδεύσετε το σύστημα να αναγνωρίζει πορτοκάλια (τυχαίο παράδειγμα). Ενώ όλα πάνε καλά με το dataset που έχετε και ο αλγόριθμος φαίνεται ότι είναι ικανός να ξεχωρίσει τα πορτοκάλια, όταν του δίνετε νέες φωτογραφίες για τις οποίες δεν έχει εκπαιδευτεί, τότε δυστυχώς παίρνετε τεράστιο σφάλμα... 

Τι θα κάνετε; Οέο; Ο απαίδευτος -- άσχετος -- θα αρχίσει να ψάχνει στο google και να κάνει το μακρύ και το κοντό του καθενός. Εσείς όμως, έχοντας διαβάσει αυτό το άρθρο είστε σε θέση να πράξετε σωστά.

Η λογική που θα ακολουθήσουμε συνοψίζεται ως εξής:

  • Βρείτε περισσότερα δείγματα προς εκμάθηση (aka μεγαλώστε το training set): Διορθώνει το overfitting
  • Μειώστε τα χαρακτηριστικά (ιδιότητες): Διορθώνει το overfitting
  • Προσθέστε περισσότερα χαρακτηριστικά (ιδιότητες): Διορθώνει το underfitting
  • Αυξήστε την τάξη του πολυωνύμου: Διορθώνει το underfitting
  • Μειώστε το λ: Διορθώνει το underfitting
  • Αυξήστε το λ: Διορθώνει το overfitting

Εφαρμογή σε επίπεδο Νευρωνικών Δικτύων

Ένα πολύ απλό νευρωνικό δίκτυο με λίγες παραμέτρους είναι πιθανό να οδηγήσει σε high bias - underfitting problem. Το πλεονέκτημα του είναι ότι δεν χρειάζεται ισχυρή υπολογιστική ισχύ για να κάνει computing.

Ένα αρκετά σύνθετο και πολύπλοκο νευρωνικό δίκτυο με πολλές παραμέτρους, είναι πιθανό να οδηγήσει σε overfitting και να χρειάζεται ισχυρή υπολογιστική δύναμη για το computing. Μία λύση θα ήταν να αυξήσετε το λ - regularization parameter.

Το default είναι να αρχίσετε με ένα single hidden layer και στην πορεία ανάλογα με το Validation set να προσθέσετε αναλόγως.


Δείτε το βίντεο: