Α. ΤΕΙ ΚΡΗΤΗΣ Τµήµα Εφαρµοσµένης Πληροφορικής και Πολυµέσων Εργαστήριο Νευρωνικών Δικτύων 5 BACKPROPAGATION MULTILAYER FEEDFORWARD ΔΙΚΤΥΑ Α. ΕΙΣΑΓΩΓΗ Τα νευρωνικά δίκτυα που εξετάσαµε µέχρι τώρα είχαν το µειονέκτηµα ότι δεν µπορούσαν να αντιµετωπίσουν προβλήµατα που απαιτούσαν µη γραµµικό διαχωρισµό των προτύπων που εισάγουµε. Τα Backpropagation δίκτυα λόγω των πολλών επιπέδων που διαθέτουν και κυρίως της µη γραµµικής συνάρτησης µεταφοράς που υλοποιούν οι νευρώνες τους έρχονται να αντιµετωπίσουν το πρόβληµα αυτό. Το πλήθος των προβληµάτων που µπορούν να αντιµετωπίσουν τα δίκτυα αυτά είναι ευρύ. Είναι κατάλληλα για να συσχετίσουν τα διανύσµατα εισόδου στο νευρωνικό µε τα διανύσµατα εξόδου, να προσεγγίσουν συναρτήσεις, ακόµα και να κατατάξουν διανύσµατα σε προκαθορισµένες κλάσεις. Στο συγκεκριµένο εργαστήριο θα κατασκευάσουµε ένα πολυεπίπεδο δίκτυο και στην συνέχεια θα το εκπαιδεύσουµε προκειµένου να το χρησιµοποιήσουµε σε εφαρµογές αναγνώρισης προτύπων καθώς και προσοµοίωσης συναρτήσεων. Τα βήµατα που θα ακολουθήσουµε είναι: Προεπεξεργασία παρουσίαση των δεδοµένων εισόδου. Κατασκευή του νευρωνικού δικτύου. εκπαίδευση του δικτύου. Δοκιµή Βελτιστοποίηση του δικτύου. Β. ΑΡΧΙΤΕΚΤΟΝΙΚΗ Τα multilayer feedforward backpropagation δίκτυα αποτελούνται από επίπεδα νευρώνων τα οποία συνδέονται µεταξύ τους νευρώνα προς νευρώνα. Το χαρακτηριστικό της κάθε σύνδεσης είναι το βάρος wij το οποίο σταθµίζει την έξοδο του j νευρώνα και την αποδίδει στον i νευρώνα. Είναι φανερό λοιπόν ότι µεταξύ των επιπέδων δηµιουργούνται δισδιάστατοι πίνακες βαρών. Ο κάθε νευρώνας επίσης έχει επιπλέον µοναδιαία είσοδο µε βάρος b (bias). Το κάθε επίπεδο δηλαδή έχει έναν µονοδιάστατο πίνακα µε τα biases του κάθε νευρώνα. Σε ένα πολυεπίπεδο δίκτυο το πρώτο επίπεδο που συναντούν τα δεδοµένα εισαγωγής ονοµάζεται επίπεδο εισόδου (input layer) το τελευταίο ονοµάζεται επίπεδο εξόδου (output layer) και τα ενδιάµεσα Σελίδα 1 από 9
ονοµάζονται κρυφά επίπεδα (hidden layers). Στο Σχήµα 1 παρουσιάζεται η µαθηµατική γραφική αναπαράσταση ενός επιπέδου του δικτύου και συγκεκριµένα του επιπέδου εισόδου. Σχήµα 1: Επίπεδο εισόδου ενός multilayer feedforward δικτύου Λόγω του ότι επιθυµούµε το δίκτυο να µας επιλύσει µη γραµµικά προβλήµατα, η συνάρτηση µεταφοράς που θα υλοποιεί ο κάθε νευρώνας θα πρέπει να είναι µη γραµµική. Για το λόγο αυτό οι νευρώνες ενός backpropagation multilayer feedforward δικτύου υλοποιούν την σιγµοειδή συνάρτηση µεταφοράς, της οποίας η γραφική παράσταση παρουσιάζεται στο Σχήµα 2. Σχήµα 2: Η σιγµοειδής συνάρτηση Σελίδα 2 από 9
Όπως βλέπουµε από το Σχήµα 2 η συγκεκριµένη συνάρτηση µπορεί να αποδώσει στην έξοδό της οποιοδήποτε αριθµό που βρίσκεται µεταξύ του 0 και του 1. Μπορούµε επίσης να χρησιµοποιήσουµε στο νευρωνικό και την tan sigmoid συνάρτηση µεταφοράς που δεν είναι άλλη από µια σιγµοειδή η οποία µας προσφέρει στην έξοδο αριθµούς που βρίσκονται στο διάστηµα -1 έως 1, όπως φαίνεται από την γραφική παράσταση του Σχήµατος 3: Σχήµα 3: Η tan sigmoid συνάρτηση Όπως παρατηρούµε οι συναρτήσεις αυτές περιορίζουν το εύρος τιµών που έχουµε στην έξοδο του δικτύου. Αν λοιπόν σε µια εφαρµογή απαιτείται να έχουµε έξοδο από το νευρωνικό όχι απαραίτητα στο διάστηµα 0 έως 1 ή -1 έως 1 τότε µπορούµε εναλλακτικά στο τελευταίο επίπεδο του δικτύου να βάλουµε την γραµµική συνάρτηση η οποία µπορεί να µας προσφέρει οποιαδήποτε τιµή εξόδου (Σχήµα 4). Σχήµα 4: Η γραµµική συνάρτηση µεταφοράς Γ. ΚΑΤΑΣΚΕΥΗ ΤΟΥ ΔΙΚΤΥΟΥ Η ΣΥΝΑΡΤΗΣΗ NEWFF( ) Από την στιγµή που έχουµε τα δεδοµένα εισόδου τα οποία στο matlab θα πρέπει να τα παρουσιάσουµε ως ένα ενιαίο πίνακα, το επόµενο βήµα είναι η κατασκευή του Σελίδα 3 από 9
πολυεπίπεδου δικτύου. Η συνάρτηση newff( ) δηµιουργεί ένα feedforward δίκτυο απαιτώντας τέσσερις παραµέτρους για να καθορίσει την δοµή του δικτύου. Η σύνταξη της συνάρτησης είναι: net=newff(pr, a, b, c) Όπου: pr: είναι ο πίνακας µε τις ελάχιστες και τις µέγιστες τιµές για κάθε χαρακτηριστική τιµή των διανυσµάτων εισόδου. α: Μονοδιάστατος πίνακας ο οποίος µας δίδει πληροφορία για τον αριθµό των νευρώνων που βρίσκονται στο κάθε επίπεδο του δικτύου. b: Μονοδιάστατος πίνακας χαρακτήρων που µας δίδει την πληροφορία για το ποια συνάρτηση µεταφοράς υλοποιούν τα επίπεδα του δικτύου. c: Τιµή η οποία υποδεικνύει την µεθοδολογία µε την οποία γίνεται η εκπαίδευση του νευρωνικού δικτύου. Παράδειγµα: Έστω ότι έχουµε την συνάρτηση net=newff([-1 2; 0 5], [3,1],{ logsig, purelin }, traingd ); Η συνάρτηση αυτή µας κατασκευάζει ένα δίκτυο το οποίο θα δέχεται διανύσµατα εισόδου µε δύο χαρακτηριστικές τιµές. Οι ελάχιστες και οι µέγιστες τιµές τους φαίνονται στον πίνακα του πρώτου ορίσµατος της συνάρτησης. Επίσης όπως παρατηρούµε από το δεύτερο όρισµα της συνάρτησης κατασκευάζουµε ένα νευρωνικό µε δύο επίπεδα το οποίο έχει στο επίπεδο εισόδου τρεις νευρώνες ενώ στο επίπεδο εξόδου έναν. Στο πρώτο επίπεδο οι νευρώνες υλοποιούν την σιγµοειδή συνάρτηση µεταφοράς ενώ στο τελευταίο επίπεδο υλοποιούν την γραµµική συνάρτηση. Η µεθοδολογία εκπαίδευσης του δικτύου είναι η traingd η οποία είναι µια εφαρµογή του Backpropagation. Δ. ΕΚΠΑΙΔΕΥΣΗ ΤΟΥ ΔΙΚΤΥΟΥ Η ΣΥΝΑΡΤΗΣΗ TRAIN( ) Το επόµενο βήµα µετά την κατασκευή του δικτύου είναι η εκπαίδευσή του. Στο συγκεκριµένο εργαστήριο θα ασχοληθούµε µε την εκπαίδευση µε επίβλεψη (supervised learning) η οποία προϋποθέτει την εκ των προτέρων γνώση για την κατηγορία στην οποία ανήκουν τα διανύσµατα που θα χρησιµοποιήσουµε για την εκπαίδευση του δικτύου. Για το σκοπό αυτό κατασκευάζουµε τον πίνακα των στόχων (targets). Ο πίνακας αυτός µας δείχνει το κάθε διάνυσµα εισόδου σε ποια κατηγορία ανήκει. Ο πίνακας αυτός θα πρέπει να έχει τόσα διανύσµατα όσα και τα διανύσµατα εισόδου, ενώ το µέγεθος του κάθε διανύσµατος καθορίζεται από τον αριθµό των νευρώνων που έχουµε στο εξωτερικό επίπεδο. Με άλλα λόγια το κάθε διάνυσµα εισόδου έχει το Σελίδα 4 από 9
διάνυσµα εξόδου και το αντίστοιχο διάνυσµα του στόχου. Το διάνυσµα εξόδου είναι η πραγµατική έξοδος του νευρωνικού. Ο στόχος είναι η τιµή που επιθυµούµε να βγάλει το δίκτυο αν ως είσοδο βάλουµε το αντίστοιχο διάνυσµα εισόδου. Το ανεκπαίδευτο δίκτυο όµως δεν µας προσφέρει τις τιµές που επιθυµούµε και ως εκ τούτου προκύπτει ένα σφάλµα. Αν για παράδειγµα έχουµε ένα νευρωνικό που στο τελευταίο επίπεδο έχει µονάχα έναν νευρώνα και η πραγµατική τιµή εξόδου είναι το α ενώ η επιθυµητή τιµή είναι το t προκύπτει σφάλµα εξόδου ίσο µε e=t-α. Λόγω των πολλών τιµών που χρησιµοποιούµε για την εκπαίδευση του δικτύου, προκύπτουν και πολλές τιµές σφάλµατος οι οποίες ορίζουν τελικά µια συνάρτηση µε διακριτές τιµές. Η οπισθοδροµική διάδοση του σφάλµατος (Backpropagation) ξεκινά από το τέλος του δικτύου και αναπροσαρµόζει τα βάρη και τα biases µε µοναδικό στόχο την µείωση του σφάλµατος. Με άλλα λόγια αναπροσαρµόζει τα βάρη και τα biases προς την κατεύθυνση της αρνητικής παραγώγου της συνάρτησης του σφάλµατος. Ο γενικός τύπος µε τον οποίο γίνεται η αναπροσαρµογή είναι ο: xk+1=xk-lr*gk Όπου x θα µπορούσε να είναι οποιαδήποτε τιµή βάρους ή bias xκ+1 είναι η τιµή µετά την προσαρµογή της εκπαίδευσης ενώ xk είναι η αρχική του τιµή. Η τιµή του gk αφορά την αντίστοιχη παράγωγο του σφάλµατος ενώ ο συντελεστής lr (learning rateσυντελεστής εκµάθησης) καθορίζει το µέγεθος της επιρροής του gk στην αναπροσαρµογή. Μεγάλη τιµή του lr σηµαίνει και µεγάλη αναπροσαρµογή στις τιµές των βαρών και των biases και είναι µια παράµετρος η οποία ρυθµίζεται από εµάς και ανάλογα µε τις ανάγκες της εκπαίδευσης. Η συνάρτηση η οποία πραγµατοποιεί την εκπαίδευση του δικτύου στο matlab είναι η train( ) η οποία δέχεται τα ακόλουθα ορίσµατα: net=train(net,a,t); Για να χρησιµοποιήσουµε την συνάρτηση αυτή υποτίθεται ότι έχουµε δηµιουργήσει µε την συνάρτηση newff( ) το νευρωνικό δίκτυο (net), έχουµε έτοιµο τον πίνακα των διανυσµάτων εισόδου a και έχουµε κατασκευάσει τον αντίστοιχο πίνακα µε τους στόχους t. Πριν από την χρήση της συνάρτησης εκπαίδευσης θα πρέπει να ρυθµίσουµε τις παραµέτρους εκπαίδευσης του νευρωνικού οι οποίες είναι: net.trainparam.lr=0.05; Το 0,05 είναι µια τυπική τιµή, εµείς για το δικό µας δίκτυο µπορούµε να επιλέξουµε µια διαφορετική. net.trainparam.epochs=1000; Το batch training είναι µια µέθοδος εκπαίδευσης σύµφωνα µε την οποία τα βάρη και τα biases του δικτύου δεν αναπροσαρµόζονται κάθε φορά που εισέρχεται ένα διάνυσµα στο δίκτυο και βγάλει ένα αποτέλεσµα, αλλά η εκπαίδευση αρχίζει µε το που έχουν Σελίδα 5 από 9
περάσει όλα τα διανύσµατα εκπαίδευσης από το δίκτυο. Το σφάλµα του δικτύου µειώνεται αν τα διανύσµατα περάσουν αρκετές φορές. Κάθε πέρασµα όλων των διανυσµάτων το ονοµάζουµε epoch και για την εκπαίδευση του δικτύου, ανάλογα και µε το πρόβληµα απαιτούνται αρκετά (και διανύσµατα και epochs). net.trainparam.goal=1e-5; Και πάλι το 10-5 είναι µια τυπική τιµή που µπορούµε να διαλέξουµε, σε κάθε περίπτωση πάντως η παράµετρος αυτή καθορίζει το όριο στο οποίο αν πέσει το σφάλµα θεωρούµε εµείς ότι το δίκτυο έχει εκπαιδευτεί και σταµατάµε την διαδικασία της εκπαίδευσης. Η καλύτερη περίπτωση ασφαλώς είναι να ορίσουµε µηδενικό σφάλµα ως στόχο. Το πρόβληµα είναι ότι την τιµή αυτή δεν την καταφέρνει κανένα νευρωνικό δίκτυο για την συντριπτική πλειοψηφία των προβληµάτων που έχουµε να αντιµετωπίσουµε. Υπάρχουν λοιπόν δύο δυνατότητες για να τερµατίσει η εκπαίδευση του δικτύου. Να τερµατίσουν τα epochs συνήθως χωρίς να έχουµε καταφέρει να προσεγγίσουµε ικανοποιητικά το όριο του σφάλµατος ή το δίκτυο να ικανοποιήσει το κριτήριο του ορίου του σφάλµατος. net.trainparam.show=50; Η ρύθµιση αυτή µας προσφέρει στην οθόνη για κάθε 50 epochs το σηµείο που έχει φτάσει το σφάλµα µαζί µε την αντίστοιχη γραφική παράσταση. Είναι µια πολύ χρήσιµη εντολή διότι µπορούµε να δούµε άµεσα αν το δίκτυο εκπαιδεύεται (πτώση του σφάλµατος) ή αν χρειάζεται να κάνουµε κάποιες αλλαγές στις παραµέτρους ή και στην δοµή του δικτύου. net=init(net) Την αρχικοποίηση των τιµών των βαρών και των biases την αναλαµβάνει µε την συνάρτηση rand( ) αυτόµατα το matlab. Παρόλα αυτά ύστερα από µια αποτυχηµένη διαδικασία εκπαίδευσης του δικτύου (σφάλµα το οποίο δεν µειώνεται από υψηλή τιµή) καλό θα είναι πριν τον επαναπροσδιορισµό των παραµέτρων να αρχικοποιήσουµε ξανά το δίκτυο µε την συγκεκριµένη εντολή. ΠΑΡΑΔΕΙΓΜΑ Στο ακόλουθο παράδειγµα έχουµε 6 διανύσµατα εισόδου για τα οποία γνωρίζουµε εκ των προτέρων ότι τα δύο πρώτα ανήκουν σε µια κατηγορία ενώ τα τέσσερα επόµενα ανήκουν στην δεύτερη κατηγορία. Το νευρωνικό που κατασκευάζουµε έχει 3 επίπεδα µε 3, 4, 2 νευρώνες αντίστοιχα και µε τις συναρτήσεις µεταφοράς που εµφανίζονται στην συνάρτηση newff( ). a=[-1; 2; 9; -7]; b=[-4; 6; 5; 0 ]; c=[2; 5; 6; 2]; Σελίδα 6 από 9
d=[9; 15; 3; 1]; e=[5; 12; 11; 3]; f=[8; 14; 2; 2]; v=[a b c d e f]; pr=minmax(v); net=newff(pr,[3,4,2],{'logsig','logsig','logsig'},'traingd'); net.trainparam.show=15; net.trainparam.lr=0.005; net.trainparam.epochs=30000; net.trainparam.goal=1e-5; t=[[1 ;0] [1;0] [0;1] [0;1] [0;1] [0;1]]; net=train(net,v,t); Στο Σχήµα 5 φαίνεται µια χαρακτηριστική περίπτωση όπου µετά από 20040 epochs το σφάλµα παραµένει σταθερό χωρίς να παρουσιάζει καµιά ιδιαίτερη πτωτική τάση. Κατά πάσα πιθανότητα το δίκτυο µας θα µείνει ανεκπαίδευτο µε τις συγκεκριµένες ρυθµίσεις που έχουµε κάνει. Σχήµα 5: Η πτώση; του σφάλµατος σε σχέση µε τα epochs της εκπαίδευσης. Ε π α ν ε κ π α ι δ ε ύ ο υ µ ε τ ο δ ί κ τ υ ο µ ε τ α β ά λ λ ο ν τ α ς µ ο ν ά χ α τ η ν π α ρ ά µ ε τ ρ ο net.trainparam.lr=0.05; και παρατηρούµε µια µείωση του σφάλµατος µετά από αρκετά epochs καθώς και µια δραµατική µείωση του σφάλµατος προς το τέλος των epochs (Σχήµα 6) Σελίδα 7 από 9
Σχήµα 6: Το σφάλµα σε σχέση µε τα epochs µε ρύθµιση του learning rate. Η καθοδική τάση του σφάλµατος ανακόπτεται λόγω του ότι έχουµε δηλώσει ως ανώτατο όριο για τα epochs το νούµερο 30000. Καλό θα ήταν να το αυξήσουµε για να πετύχουµε τελικά µικρότερη τιµή σφάλµατος. Ε. ΔΟΚΙΜΗ ΤΗΣ ΑΠΟΔΟΣΗΣ ΤΟΥ ΔΙΚΤΥΟΥ Η ΣΥΝΑΡΤΗΣΗ SIM( ) Μετά την εκπαίδευση του δικτύου και αφού έχουµε επιτύχει το µικρότερο αριθµό σφάλµατος που είναι δυνατό µέσα από ένα πλήθος δοκιµών µε αλλαγές παραµέτρων, δοκιµάζουµε το δίκτυο προκειµένου να βγάλουµε ένα συµπέρασµα για την απόδοση του. Ως απόδοση του δικτύου για ένα σύστηµα αναγνώρισης προτύπων ορίζουµε το ποσοστό των σωστών αναγνωρίσεων σε άγνωστα πρότυπα. Με άλλα λόγια δοκιµάζουµε την ικανότητα του δικτύου να κατηγοριοποιεί διανύσµατα τα οποία δεν έχουν χρησιµοποιηθεί για την εκπαίδευση του. Ο λόγος είναι απλός: Θέλουµε να διαπιστώσουµε αν µε την εκπαίδευση του δικτύου φτιάξαµε ένα σύστηµα το οποίο είναι ικανό να αναγνωρίζει τα χαρακτηριστικά εκείνα των προτύπων τα οποία διαχωρίζουν τις κλάσεις µεταξύ τους. Σε καµιά περίπτωση πάντως δεν θέλουµε να φτιάξουµε ένα σύστηµα το οποίο να µαθαίνει τέλεια τα διανύσµατα εκπαίδευσης και να καταφέρνει να κατηγοριοποιεί αυτά και µόνο αυτά (υπερεκπαίδευση του δικτύου). Επειδή ασχοληθήκαµε µε την επιβλεπόµενη εκπαίδευση εάν έχουµε ένα σετ δεδοµένων για τα οποία γνωρίζουµε την κατηγορία τους, χρησιµοποιούµε ένα ποσοστό 70 80% για την εκπαίδευση και το υπόλοιπο 30 20 % για τον έλεγχο της απόδοσης του δικτύου. Επίσης είναι πολύ σηµαντικό να παρατηρήσουµε ότι στο σετ διανυσµάτων εκπαίδευσης όλες οι κατηγορίες των προτύπων θα πρέπει να εκπροσωπούνται ισάξια. Για παράδειγµα στο σετ δεδοµένων του fisheriris (load fisheriris) το οποίο στον πίνακα meas περιέχει 150 πρότυπα από 3 κατηγορίες (setosa verginica versicolor) επιλέγουµε Σελίδα 8 από 9
ως σετ εκπαίδευσης 40 πρότυπα από τα verginica, 40 πρότυπα από τα versicolor και 40 πρότυπα από τα setosa. Τα υπόλοιπα 30 διανύσµατα που αποµένουν τα χρησιµοποιούµε για το τεστ απόδοσης του δικτύου. Σελίδα 9 από 9