Αποφάσισα να ξεκινήσω μια σειρά άρθρων με θέμα τα Νευρωνικά Δίκτυα. Προσπαθώ να τα κρατήσω όσο πιο συνοπτικά γίνεται και κατανοητά σε κάποιον με γνώσεις προγραμματισμού.
Θα ήμουν ευγνόμων αν αφήνατε κάποιο comment σε αυτό το post, είτε αφορά σχόλιο, ερώτηση ή διόρθωση.
Πιο κάτω ακολουθούν σημαντικές πληροφορίες, περί Νευρωνικών Δικτύων που είναι και το εισαγωγικό:
Εισαγωγή στα Νευρωνικά Δίκτυα
Εισαγωγή
Το παρόν άρθρο, όπως και όλα όσα ακολουθήσουν αποτελούν μια προσπάθεια για τη συγγραφή ενός ελληνικού κειμένου με σκοπό την εισαγωγή στην ανάπτυξη και τον τρόπο σκέψης των Νευρωνικών Δικτύων με όσο το δυνατόν λιγότερες προαπαιτούμενες γνώσεις (καλό θα ήταν όμως ο αναγνώστης να έχει τουλάχιστον ελάχιστη εμπειρία με τον προγραμματισμό για λόγους βατότητας).
Τι είναι τα Νευρωνικά δίκτυα (ΝΔ);
Γενικά μιλώντας, νευρωνικό δίκτυο είναι ένα σύνολο κόμβων που συνεργάζονται για να επιτελέσουν κάποιο σκοπό.
Ο ανθρώπινος εγκέφαλος, αποτελεί το κλασσικό παράδειγμα Βιολογικού Νευρωνικού Δικτύου, όπου οι κόμβοι είναι στην πραγματικότητα τα νευρικά κύτταρα (“νευρώνες”).
Από την άλλη μεριά, υπάρχουν τα Τεχνητά Νευρωνικά Δίκτυα, τα οποία δεν είναι τίποτα παραπάνω από απομιμήσεις των Βιολογικών ΝΔ και υλοποιούνται συνήθως χρησιμοποιώντας λογισμικό, αλλά δεν λείπουν και οι περιπτώσεις που προτιμάται η υλοποίηση με hardware.
Σε αυτήν τη σειρά άρθρων θα ασχοληθούμε με την υλοποίηση μέσω λογισμικού. Στα Τεχνητά ΝΔ, ο κόμβος μπορεί να είναι ένα αντικείμενο (class σε C++ και Java) ή ακόμα και να υπονοείται η ύπαρξή του μέσω απλών πολλαπλασιασμών πινάκων (περισσότερα για την υλοποίηση ακολουθούν).
Γιατί να χρησιμοποιήσει κανείς Νευρωνικά Δίκτυα;
Καταρχάς, αξίζει να αναφέρουμε ότι τα ΤΝΔ χρησιμοποιούνται ήδη σε μεγάλο βαθμό. Κάποιες από τις εφαρμογές του στην καθημερινότητά μας περιλαμβάνουν την εφαρμογή αναγνώρισης τραγουδιών Shazam η οποία χρησιμοποιεί ΤΝΔ όπως και αρκετοί πάροχοι email για να ξεχωρίζουν τα ανεπιθύμητα μηνύματα (spam detection). Ένας άλλος τρόπος να προσεγγίσουμε αυτήν την ερώτηση, θα ήταν με μια άλλη ερώτηση:
Που θα μπορούσε κανείς να χρησιμοποιήσει έναν άνθρωπο με την ταχύτητα ενός υπολογιστή;
Δομή ενός ΒΝΔ
Ο ανθρώπινος εγκέφαλος αποτελείται από περίπου 10 στην 11η, νευρώνες οι οποίοι λειτουργούν αυτόνομα αλλά και συνεργάζονται μεταξύ τους ανταλλάσσοντας ηλεκτρικἀ σήματα.
Ένας νευρώνας αποτελείται από 4 κυρίως μέρη. Στο κυρίως σώμα είναι που επιτελούνται οι αυτόνομες διεργασίες, οι οποίες προς το παρόν δεν μας ενδιαφέρουν.
Μέ τον άξονα, μπορεί κάθε νευρώνας να στείλει ηλεκτρικά σήματα σε όλους τους υπόλοιπους με τους οποίους είναι συνδεδεμένος, ενώ μέσω των δενδριτών μπορεί και λαμβάνει τα σήματα από “ξένους” άξονες. Το σημείο όπου συναντάται ο άξονας και οι δενδρίτες λέγεται σύναψη και είναι ένα κενό (ο άξονας και οι δενδρίτες δεν ακουμπούν και το σήμα μεταφέρεται σε εκείνο το σημείο εξ αποστάσεως), στο οποίο μπορεί και μεταφέρεται το ηλεκτρικό σήμα με χημικές αντιδράσεις. Κατά τις αντιδράσεις αυτές, το σήμα μεταβάλλεται, κάτι που είναι πιο ξεκάθαρο παρακάτω, στα ΤΝΔ.
Δομή ενός ΤΝΔ
Στα ΤΝΔ η δομή είναι παρόμοια με τα ΒΝΔ, ίσως και απλούστερη. Στα περισσότερα μοντέλα ΝΔ τα δεδομένα που μπορούν να ανταλλάξουν μεταξύ τους οι νευρώνες περιορίζονται σε ένα συγκεκριμένο εύρος τιμών, συνήθως ανάμεσα σε 0 και 1 (σαν υπολογιστής). Σε κάθε σύνδεση ανάμεσα σε δύο κόμβους (στη θέση της σύναψης που υπάρχει στα ΒΝΔ) αναλογεί ένα βάρος, το οποίο πολλαπλασιάζεται με την έξοδο του νευρώνα-αποστολέα και σχηματίζει την είσοδο που θα έχει ο νευρώνας – λήπτης.
Στον πρώτο τύπο ΝΔ που θα εξετάσουμε, η απόφαση για το αν ο κάθε νευρώνας θα εκπέμψει κάποιο σήμα, γίνεται με βάση εάν το άθροισμα όλων των (πολλαπλασιασμένων με τα ανάλογα βάρη) εισόδων του ξεπερνά κάποιο συγκεκριμένο αριθμό, ο οποίος κάθε φορά που ξεπερνιέται, ο νευρώνας “πυροκροτεί (fires)” και έτσι έχει ως έξοδο συνήθως τον αριθμό 1, ενώ σε περίπτωση που δεν ξεπεραστεί το όριο, η έξοδος είναι 0.
Ο τρόπος οργάνωσης των περισσότερων μοντέλων γίνεται χρησιμοποιώντας “στρώσεις (layers)”.
Η είσοδος στο νευρωνικό δίκτυο γίνεται μέσω της πρώτης στρώσης (“input layer”), η οποία θα πολλαπλασιάσει την είσοδο με τα βάρη της και θα περάσει τα τροποποιημένα πλέον δεδομένα στην επόμενη στρώση. Αυτή η διαδικασία κατά την οποία η κάθε στρώση τροποποιεί την είσοδό της και την “περνά” στην επόμενη συνεχίζεται μέχρι να φτάσουμε στην τελευταία στρώση (“output layer”), από την οποία διαβάζουμε και την έξοδο του ΝΔ μας.
Για παράδειγμα, αν θέλουμε να φτιάξουμε ένα ΝΔ για να αναγνωρίζει έναν χειρόγραφο χαρακτήρα, ως είσοδο θα περνούσαμε τα pixels του χαρακτήρα προς αναγνώριση στους νευρώνες της πρώτης στρώσης και θα παίρναμε την έξοδο από την τελευταία στρώση η οποία θα αποτελούταν πιθανώς από 24 νευρώνες από τους οποίους ο “σωστός χαρακτήρας” θα ήταν ο ανάλογος νευρώνας με έξοδο 1.
Πως λειτουργεί ένα ΤΝΔ;
Για να καταλάβει κανείς (προς το παρόν αφηρημένα) πώς λειτουργεί ένα ΤΝΔ, μπορεί να το φανταστεί ως μια μικρογραφία του εγκεφάλου.
Όπως και ένα άτομο, έτσι και κάθε ΝΔ πριν εκτελέσει κάποια εργασία, θα πρέπει να του τη διδάξουμε. Αλλάζοντας τα βάρη στις συνδέσεις μεταξύ των νευρώνων, μπορεί κανείς να αναγκάσει το ΝΔ να υποβάλλει τα δεδομένα στην κατάλληλη επεξεργασία, παίρνοντας έτσι την επιθυμητή έξοδο.
Ο αλγόριθμος ο οποίος είναι υπεύθυνος να προσαρμόσει τα βάρη του ΝΔ ονομάζεται “κανόνας εκμάθησης (learning rule)”.
Συνήθως, για την εκμάθηση ενός ΤΝΔ, πρέπει να συλλέξει κανείς δεδομένα εισόδου και την επιθυμητή έξοδο για το καθένα (“training set”). Έπειτα, θα πρέπει να περάσει την είσοδο στο ΝΔ και αφότου πάρει την έξοδο, ο κανόνας εκμάθησης θα αναλάβει να προσαρμόσει τα βάρη έτσι ώστε η έξοδος που πήρε να ταιριάζει αυτήν που περίμενε. Αυτό επαναλαμβάνεται με όλα τα δεδομένα μέχρι το δίκτυο να έχει κάποιο ικανοποιητικό ποσοστό σωστών απαντήσεων.
Όντας παντελώς ανίδεος στα ΝΔ με βοήθησε πάρα πολύ το άρθρο.