Η βαθιά μάθηση είναι μια τεχνολογία που έχει καταστεί ουσιαστικό μέρος των ροών εργασίας της μηχανικής μάθησης. Αξιοποιώντας τις βελτιώσεις της παράλληλης υπολογιστικής ισχύος και των υποστηρικτικών εργαλείων, σύνθετα και βαθιά νευρωνικά δίκτυα που κάποτε ήταν πρακτικά γίνονται πλέον βιώσιμα.
Η εμφάνιση ισχυρών και προσβάσιμων βιβλιοθηκών όπως Τάση ροής , Δάδα , και Deeplearning4j έχει επίσης ανοίξει την ανάπτυξη σε χρήστες εκτός ακαδημαϊκών και ερευνητικών τμημάτων μεγάλων εταιρειών τεχνολογίας. Σε απόδειξη της αυξανόμενης πανταχού παρουσίας της, εταιρείες όπως η Huawei και η Apple περιλαμβάνουν πλέον αποκλειστικούς επεξεργαστές σε βάθος, βελτιστοποιημένες στη μάθηση στις νεότερες συσκευές τους για την τροφοδοσία εφαρμογών βαθιάς μάθησης.
Η βαθιά μάθηση έχει αποδείξει τη δύναμή της σε πολλούς τομείς. Πιο συγκεκριμένα, το Google AlphaGo μπόρεσε να νικήσει τους ανθρώπινους παίκτες σε ένα παιχνίδι Go, ένα παιχνίδι του οποίου η πολυπλοκότητα του μυαλού θεωρήθηκε κάποτε ένα σχεδόν ανυπέρβλητο εμπόδιο στους υπολογιστές στον ανταγωνισμό του εναντίον ανθρώπινων παικτών. Έργο Flow Machines από τη Sony έχει αναπτύξει ένα νευρωνικό δίκτυο που μπορεί να συνθέσει μουσική στο στυλ των διάσημων μουσικών του παρελθόντος. FaceID , ένα χαρακτηριστικό ασφαλείας που αναπτύχθηκε από την Apple, χρησιμοποιεί βαθιά μάθηση για να αναγνωρίζει το πρόσωπο του χρήστη και να παρακολουθεί τις αλλαγές στο πρόσωπο του χρήστη με την πάροδο του χρόνου.
Σε αυτό το άρθρο, θα εφαρμόσουμε τη βαθιά μάθηση σε δύο από τα αγαπημένα μου θέματα: επεξεργασία φυσικής γλώσσας και κρασί. Θα φτιάξουμε ένα μοντέλο για να κατανοήσουμε τις κριτικές κρασιών φυσικής γλώσσας από ειδικούς και θα συμπεράνουμε την ποικιλία του κρασιού που εξετάζουν.
Η βαθιά μάθηση έχει χρησιμοποιηθεί εκτενώς στο επεξεργασία φυσικής γλώσσας (NLP) επειδή είναι κατάλληλο για την εκμάθηση της σύνθετης υποκείμενης δομής μιας πρότασης και σημασιολογική εγγύτητα διαφόρων λέξεων. Για παράδειγμα, η τρέχουσα στάθμη της τεχνολογίας για ανάλυση συναισθημάτων χρησιμοποιεί βαθιά μάθηση προκειμένου να συλλάβει δύσκολες στο μοντέλο γλωσσικές έννοιες, όπως αρνητικές και μικτές αισθήσεις.
Η βαθιά μάθηση έχει πολλά πλεονεκτήματα έναντι άλλων αλγορίθμων για το NLP:
Σήμερα, θα χτίσουμε έναν αλγόριθμο βαθιάς μάθησης για να προσδιορίσουμε την ποικιλία του κρασιού που θα αξιολογηθεί βάσει του κειμένου αξιολόγησης. Θα χρησιμοποιήσουμε το σύνολο δεδομένων του περιοδικού κρασιού στη διεύθυνση https://www.kaggle.com/zynicide/wine-reviews που παρέχεται από τον χρήστη Kaggle zackthoutt .
Εννοιολογικά, το ερώτημα είναι, μπορούμε να κάνουμε μια αναθεώρηση κρασιού όπως…
Τα αρώματα περιλαμβάνουν τροπικά φρούτα, σκούπα, θειάφι και αποξηραμένα βότανα. Ο ουρανίσκος δεν είναι υπερβολικά εκφραστικός, προσφέροντας μη ωριμασμένο μήλο, εσπεριδοειδή και αποξηραμένο φασκόμηλο παράλληλα με έντονη οξύτητα.
… Και να αναγνωρίσετε ότι πρόκειται για ένα λευκό μείγμα; Μερικοί λάτρεις του κρασιού μπορεί να αναγνωρίσουν ενδεικτικά σημάδια λευκών κρασιών όπως μήλο, εσπεριδοειδή και έντονη οξύτητα, αλλά μπορούμε να εκπαιδεύσουμε το νευρικό μας δίκτυο για να αναγνωρίσουμε αυτά τα σήματα; Επιπλέον, μπορούμε να εκπαιδεύσουμε το νευρικό μας δίκτυο για να αναγνωρίσουμε τις λεπτές διαφορές ανάμεσα σε μια ανασκόπηση λευκού μίγματος και μια κριτική pinot grigio;
Το πρόβλημα με το οποίο εργαζόμαστε σήμερα είναι ουσιαστικά ένα πρόβλημα ταξινόμησης NLP. Υπάρχουν διάφοροι αλγόριθμοι ταξινόμησης NLP που έχουν εφαρμοστεί σε διάφορα προβλήματα στο NLP. Για παράδειγμα, αφελής Bayes έχουν χρησιμοποιηθεί σε διάφορους αλγόριθμους ανίχνευσης ανεπιθύμητων μηνυμάτων και υποστήριξη μηχανών φορέα (SVM) έχουν χρησιμοποιηθεί για την ταξινόμηση κειμένων όπως σημειώσεις προόδου σε ιδρύματα υγειονομικής περίθαλψης. Θα ήταν ενδιαφέρον να εφαρμόσουμε μια απλή έκδοση αυτών των αλγορίθμων για να χρησιμεύσουμε ως βάση για το μοντέλο της βαθιάς μάθησης.
Μια δημοφιλής εφαρμογή του naive Bayes για NLP περιλαμβάνει την προεπεξεργασία του κειμένου χρησιμοποιώντας TF-IDF και, στη συνέχεια, την εκτέλεση των πολυεθνικών αφελών Bayes στις προεπεξεργασμένες εξόδους. Αυτό επιτρέπει στον αλγόριθμο να εκτελείται στις πιο εμφανείς λέξεις ενός εγγράφου. Μπορούμε να εφαρμόσουμε τους αφελείς Bayes ως εξής:
import numpy as np from sklearn.naive_bayes import MultinomialNB from sklearn.feature_extraction.text import CountVectorizer import pandas as pd from collections import Counter from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfTransformer df = pd.read_csv('data/wine_data.csv') counter = Counter(df['variety'].tolist()) top_10_varieties = {i[0]: idx for idx, i in enumerate(counter.most_common(10))} df = df[df['variety'].map(lambda x: x in top_10_varieties)] description_list = df['description'].tolist() varietal_list = [top_10_varieties[i] for i in df['variety'].tolist()] varietal_list = np.array(varietal_list) count_vect = CountVectorizer() x_train_counts = count_vect.fit_transform(description_list) tfidf_transformer = TfidfTransformer() x_train_tfidf = tfidf_transformer.fit_transform(x_train_counts) train_x, test_x, train_y, test_y = train_test_split(x_train_tfidf, varietal_list, test_size=0.3) clf = MultinomialNB().fit(train_x, train_y) y_score = clf.predict(test_x) n_right = 0 for i in range(len(y_score)): if y_score[i] == test_y[i]: n_right += 1 print('Accuracy: %.2f%%' % ((n_right/float(len(test_y)) * 100)))
Εκτελέστε τον παραπάνω κώδικα και θα δείτε κάτι σαν το εξής: 73,56%
Λαμβάνοντας υπόψη ότι εξετάζουμε 10 τάξεις, αυτό είναι πολύ καλό αποτέλεσμα.
Μπορούμε επίσης να χρησιμοποιήσουμε μηχανή φορέα υποστήριξης και να δούμε πώς θα έκανε. Για να δείτε πώς λειτουργεί, απλώς αντικαταστήστε τον ορισμό του ταξινομητή με
clf = SVC(kernel='linear').fit(train_x, train_y)
Εκτελέστε αυτό και θα δείτε την ακόλουθη έξοδο:
Η κατάργηση του ποτηριού steagall δεν προκάλεσε οικονομική κρίση
Ακρίβεια: 80,66%
Ούτε πολύ άθλια.
Ας δούμε αν μπορούμε να δημιουργήσουμε ένα μοντέλο βαθιάς μάθησης που μπορεί να ξεπεράσει ή τουλάχιστον να ταιριάξει με αυτά τα αποτελέσματα. Εάν το καταφέρουμε αυτό, θα ήταν μια εξαιρετική ένδειξη ότι το μοντέλο βαθιάς μάθησης είναι αποτελεσματικό τουλάχιστον στην αναπαραγωγή των αποτελεσμάτων των δημοφιλών μοντέλων μηχανικής μάθησης που ενημερώνονται από την εξειδίκευση του τομέα.
Σήμερα, θα χρησιμοποιούμε Σκληρός με την Tensorflow για να δημιουργήσουμε το μοντέλο μας. Το Keras είναι μια βιβλιοθήκη Python που καθιστά την κατασκευή μοντέλων βαθιάς μάθησης πολύ εύκολη σε σύγκριση με τη σχετικά χαμηλού επιπέδου διεπαφή του Tensorflow API. Εκτός από τα πυκνά στρώματα, θα χρησιμοποιήσουμε επίσης ενσωματωμένα και συνελικτικά επίπεδα για να μάθουμε τις βασικές σημασιολογικές πληροφορίες των λέξεων και των πιθανών δομικών προτύπων στα δεδομένα.
Πρώτον, θα πρέπει να αναδιαρθρώσουμε τα δεδομένα με τρόπο που να μπορεί εύκολα να υποβληθεί σε επεξεργασία και να γίνει κατανοητό από το νευρικό μας δίκτυο. Μπορούμε να το κάνουμε αυτό αντικαθιστώντας τις λέξεις με μοναδικά αναγνωρίζοντας αριθμούς. Σε συνδυασμό με έναν ενσωματωμένο φορέα, είμαστε σε θέση να αναπαριστούμε τις λέξεις με τρόπο που να είναι τόσο ευέλικτος όσο και σημασιολογικά ευαίσθητος.
Στην πράξη, θα θέλουμε να είμαστε λίγο πιο έξυπνοι για αυτήν την προεπεξεργασία. Θα ήταν λογικό να επικεντρωθούμε στις λέξεις που χρησιμοποιούνται συνήθως και να φιλτράρουμε επίσης τις πιο συχνά χρησιμοποιούμενες λέξεις (π.χ., το, αυτό, α).
Μπορούμε να εφαρμόσουμε αυτήν τη λειτουργικότητα χρησιμοποιώντας Defaultdict και NLTK. Γράψτε τον ακόλουθο κώδικα σε ξεχωριστή μονάδα Python. Το έβαλα στο lib/get_top_x_words.py
.
from nltk import word_tokenize from collections import defaultdict def count_top_x_words(corpus, top_x, skip_top_n): count = defaultdict(lambda: 0) for c in corpus: for w in word_tokenize(c): count[w] += 1 count_tuples = sorted([(w, c) for w, c in count.items()], key=lambda x: x[1], reverse=True) return [i[0] for i in count_tuples[skip_top_n: skip_top_n + top_x]] def replace_top_x_words_with_vectors(corpus, top_x): topx_dict = {top_x[i]: i for i in range(len(top_x))} return [ [topx_dict[w] for w in word_tokenize(s) if w in topx_dict] for s in corpus ], topx_dict def filter_to_top_x(corpus, n_top, skip_n_top=0): top_x = count_top_x_words(corpus, n_top, skip_n_top) return replace_top_x_words_with_vectors(corpus, top_x)
Τώρα είμαστε έτοιμοι να δημιουργήσουμε το μοντέλο. Θέλουμε ένα επίπεδο ενσωμάτωσης, ένα συνελικτικό επίπεδο και ένα πυκνό στρώμα για να εκμεταλλευτούμε όλες τις δυνατότητες βαθιάς μάθησης που μπορούν να είναι χρήσιμες για την εφαρμογή μας. Με την Keras, μπορούμε να φτιάξουμε το μοντέλο πολύ απλά:
from keras.models import Sequential from keras.layers import Dense, Conv1D, Flatten from keras.layers.embeddings import Embedding from keras.preprocessing import sequence from keras.utils import to_categorical import pandas as pd from collections import Counter from sklearn.model_selection import train_test_split from lib.get_top_xwords import filter_to_top_x df = pd.read_csv('data/wine_data.csv') counter = Counter(df['variety'].tolist()) top_10_varieties = {i[0]: idx for idx, i in enumerate(counter.most_common(10))} df = df[df['variety'].map(lambda x: x in top_10_varieties)] description_list = df['description'].tolist() mapped_list, word_list = filter_to_top_x(description_list, 2500, 10) varietal_list_o = [top_10_varieties[i] for i in df['variety'].tolist()] varietal_list = to_categorical(varietal_list_o) max_review_length = 150 mapped_list = sequence.pad_sequences(mapped_list, maxlen=max_review_length) train_x, test_x, train_y, test_y = train_test_split(mapped_list, varietal_list, test_size=0.3) max_review_length = 150 embedding_vector_length = 64 model = Sequential() model.add(Embedding(2500, embedding_vector_length, input_length=max_review_length)) model.add(Conv1D(50, 5)) model.add(Flatten()) model.add(Dense(100, activation='relu')) model.add(Dense(max(varietal_list_o) + 1, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit(train_x, train_y, epochs=3, batch_size=64) y_score = model.predict(test_x) y_score = [[1 if i == max(sc) else 0 for i in sc] for sc in y_score] n_right = 0 for i in range(len(y_score)): if all(y_score[i][j] == test_y[i][j] for j in range(len(y_score[i]))): n_right += 1 print('Accuracy: %.2f%%' % ((n_right/float(len(test_y)) * 100)))
Εκτελέστε τον κωδικό και θα δείτε την ακόλουθη έξοδο.
Ακρίβεια: 77,20%
Θυμηθείτε ότι η ακρίβεια για τους αφελείς Bayes και SVC ήταν 73,56% και 80,66% αντίστοιχα. Έτσι, το νευρικό μας δίκτυο διατηρεί σε μεγάλο βαθμό ενάντια σε μερικές από τις πιο κοινές μεθόδους ταξινόμησης κειμένου εκεί έξω.
Σήμερα, καλύψαμε τη δημιουργία ενός μοντέλου βαθιάς μάθησης ταξινόμησης για την ανάλυση των κρασιών.
Διαπιστώσαμε ότι καταφέραμε να δημιουργήσουμε ένα μοντέλο ικανό να ανταγωνιστεί και να ξεπεράσει μερικούς από τους άλλους αλγόριθμους μηχανικής μάθησης. Ελπίζουμε να εμπνευστείτε να χρησιμοποιήσετε αυτές τις πληροφορίες για να δημιουργήσετε εφαρμογές που αναλύουν πιο πολύπλοκα σύνολα δεδομένων και δημιουργούν πιο περίπλοκα αποτελέσματα!
Σημείωση: Μπορείτε να βρείτε τον κωδικό που χρησιμοποίησα για αυτό το άρθρο GitHub .
Η επεξεργασία φυσικής γλώσσας είναι το εύρος των υπολογιστικών τεχνικών που χρησιμοποιούνται για την ανάλυση ή την παραγωγή ανθρώπινης γλώσσας και λόγου.