Τα πλαίσια βαθιάς μάθησης έχουν υπεραπλουστεύσει τη διαδικασία υλοποίησης νευρωνικών δικτύων και μερικές φορές είναι εύκολο να πέσεις στην παγίδα της αφαίρεσης της διαδικασίας μάθησης, πιστεύοντας ότι μπορείτε απλά να στοιβάζετε αυθαίρετα επίπεδα μαζί και θα φροντίσει τα πάντα αυτόματα[1]. Είναι σημαντικό να έχετε μια σταθερή βάση στη μηχανική μάθηση (ML) με την εφαρμογή βασικών εννοιών από την αρχή, όπως ο αλγόριθμος backpropagation (για NN, CNN και RNNs). Αφιερώστε χρόνο για να κατανοήσετε τις προελεύσεις του και προσπαθήστε να το αντλήσετε μόνοι σας από την αρχή και επίσης να το εφαρμόσετε από την αρχή σε κώδικα και δείτε αν μπορείτε να το κάνετε να λειτουργήσει. Η γνώση που θα αποκτήσετε θα παραμείνει και θα είναι ανεξάρτητη από οποιοδήποτε πλαίσιο αποφασίσετε να μάθετε αργότερα. Στη μαθησιακή μου διαδικασία σκέφτηκα ότι αξίζει να μάθω τι συμβαίνει κάτω από τις κουκούλες για πνευματική περιέργεια. Σε αυτό το άρθρο σας παρουσιάζω την απλή μου υλοποίηση ενός NN δύο επιπέδων σε καθαρή java.

ΕΔΩ ΕΙΝΑΙ Η ΔΕΥΤΕΡΗ ΑΝΑΡΤΗΣΗ ΜΟΥ

Εάν βιάζεστε, εδώ είναι ο πλήρης κωδικός. Μπορείτε να βρείτε την python/numpy έκδοσή του εδώ

Αρχιτεκτονική Δικτύων

Παρακάτω παρουσιάζεται ένα νευρωνικό δίκτυο δύο επιπέδων τροφοδοσίας που πρόκειται να εφαρμόσουμε στη Java. Θα χρησιμοποιήσουμε την ακόλουθη αρχιτεκτονική δικτύου, αλλά όλες οι έννοιες μπορούν να κλιμακωθούν για οποιοδήποτε αριθμό επιπέδων και κόμβων.

Το μοτίβο που θα μάθουμε να αναγνωρίζει το νευρωνικό μας δίκτυο είναι η λειτουργία XOR. Ο XORπίνακας αλήθειας τελεστή εμφανίζεται παρακάτω για την πράξη y= x1 XOR x2

Μερικά μαθηματικά υποβάθρου

Ακολουθούν οι εξισώσεις προς τα εμπρός για την παραπάνω αρχιτεκτονική νευρωνικών δικτύων [2]. Οι ανώτεροι δείκτες υποδεικνύουν το επίπεδο και οι κάτω δείκτες υποδεικνύουν το δείκτη του κόμβου.

Μέρος 1: Εξισώσεις προς τα εμπρός διάδοσης

Διανυσματοποίηση

Όλοι έχουμε χρησιμοποιήσει βρόχους for για τις περισσότερες εργασίες που χρειάζονται επανάληψη σε μια μακρά λίστα στοιχείων. Είμαι βέβαιος ότι σχεδόν όλοι όσοι διαβάζουν αυτό το άρθρο, έγραψαν τον πρώτο τους κώδικα για πολλαπλασιασμό μήτρας ή διανυσμάτων χρησιμοποιώντας έναν βρόχο for πίσω στο γυμνάσιο ή στο κολέγιο. Το For-loop έχει εξυπηρετήσει την κοινότητα προγραμματισμού για μεγάλο χρονικό διάστημα και σταθερά. Ωστόσο, συνοδεύεται από κάποιες αποσκευές και είναι συχνά αργή στην εκτέλεση όταν πρόκειται για την επεξεργασία μεγάλων συνόλων δεδομένων (πολλά εκατομμύρια εγγραφές όπως σε αυτήν την εποχή των Big Data) [3].

Ας διανυσματοποιήσουμε λοιπόν τις εξισώσεις μας. Συνδυασμός του υπολογισμού των κόμβων για το κρυφό στρώμα (Αγνοήστε πρώτα τις συναρτήσεις ενεργοποίησης, θα επιστρέψετε σε αυτές).

Αυτά που πρέπει να σημειωθούν είναι

1. Η αύξηση του αριθμού των κόμβων θα αυξήσει τον αριθμό των σειρών του πίνακα βάρους μας.

2. Η αύξηση του αριθμού των χαρακτηριστικών θα αυξήσει τον αριθμό των στηλών των πινάκων.

Να τι εννοώ

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

Λειτουργία ενεργοποίησης

Χρειαζόμαστε συναρτήσεις ενεργοποίησης για να μάθουμε μη γραμμικές πολύπλοκες λειτουργικές αντιστοιχίσεις μεταξύ των εισόδων και των εξόδων στόχου των δεδομένων μας. Από την προηγούμενη ενότητα, απλώς αγνόησα τις εξισώσεις της συνάρτησης ενεργοποίησης για εύκολη αιτιολόγηση. Θα χρησιμοποιήσουμε μια συνάρτηση ενεργοποίησης σιγμοειδούς.

Μέρος 2: Εξισώσεις οπίσθιας διάδοσης

Για να κατανοήσω διαισθητικά πώς λειτουργεί το back prop, θα χρησιμοποιήσω το παρακάτω διάγραμμα για να δείξω τον υπολογισμό της κλίσης, ο οποίος στη συνέχεια θα χρησιμοποιηθεί από την κατάβαση κλίσης για να εκτελέσει μια ενημέρωση των μαθησίων παραμέτρων w και b. Για λόγους απλότητας, θα χρησιμοποιήσω ένα νευρωνικό δίκτυο ενός επιπέδου (μια λογιστική παλινδρόμηση). Η ιδέα μπορεί να κλιμακωθεί στο νευρωνικό δίκτυο N επιπέδου [2].

Θα χρησιμοποιήσουμε την απώλεια διασταυρούμενης εντροπίας για να υπολογίσουμε το κόστος

Υπολογισμός της (dw)παραγώγου απώλειας w.r.t σε βάρη. Αυτό μπορεί να γίνει χρησιμοποιώντας τον κανόνα αλυσίδας όπως φαίνεται παρακάτω.

Υπολογισμός του παραγώγου (db) της απώλειας w.r.t σε προκαταλήψεις.

Ενημέρωση εξισώσεων

Θα χρησιμοποιήσουμε gradient descent για να εκτελέσουμε ενημέρωση παραμέτρων για κάθε επίπεδο ως εξής.

Πλήρης κώδικας Java

Η κατανόηση των παραπάνω εννοιών είναι ένα κρίσιμο μέρος της κατανόησης του πώς λειτουργεί αυτός ο κώδικας.

Το np.java περιέχει όλες τις λειτουργίες μήτρας

Αποτελέσματα εκπαίδευσης

Παρακάτω είναι το αποτέλεσμα μετά την εκπαίδευση του NN για 4000 επαναλήψεις. Μπορούμε ξεκάθαρα να δούμε (Πρόβλεψη = [[0.01212, 0.9864, 0.986300, 0.01569]]) ότι το δίκτυό μας έχει κάνει καλή δουλειά προσπαθώντας να μιμηθεί τη λειτουργία XOR. Όπως μπορούμε να δούμε, οι εσωτερικές τιμές ωθούνται στο 1 ενώ οι εξωτερικές ωθούνται στο μηδέν.

==============
Κόστος = 0,1257569282040295
Πρόβλεψη = [[0,15935, 0,8900528, 0,88589, 0,0877284694]

.

.
Κόστος = 0,015787269324306925
Πρόβλεψη = [[0,013838, 0,984561, 0,9844246, 0,0177971]]
=========9. 8404
Πρόβλεψη = [[0,01212, 0,9864, 0,986300, 0,01569]]

Συμπέρασμα

Αυτή δεν είναι μια αποτελεσματική υλοποίηση ενός νευρωνικού δικτύου, αλλά πρόθεσή μου ήταν να μεταφέρω μια διαισθητική κατανόηση των εννοιών μηχανικής μάθησης και να έχω τη δυνατότητα να τις μεταφέρω σε κώδικα.

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

Η ΔΕΥΤΕΡΗ ΑΝΑΡΤΗΣΗ ΜΟΥ ΕΙΝΑΙ ΕΔΩ

Αναφορές

[1] https://medium.com/@karpathy/yes-you-should-understand-backprop-e2f06eab496b

[2] https://www.coursera.org/specializations/deep-learning

[3] https://towardsdatascience.com/why-you-should-forget-for-loop-for-data-science-code-and-embrace-vectorization-696632622d5f

Λάβετε τις καλύτερες προσφορές λογισμικού απευθείας στα εισερχόμενά σας