Πώς αλλάξαμε το LDA χωρίς επίβλεψη σε ημι-εποπτευόμενο GuidedLDA

Αυτή είναι η ιστορία του πώς και γιατί έπρεπε να γράψουμε τη δική μας μορφή Latent Dirichlet Allocation (LDA). Μιλώ επίσης για το γιατί χρειαζόμασταν να φτιάξουμε ένα Guided Topic Model (GuidedLDA) και τη διαδικασία της ανοιχτής προμήθειας τα πάντα στο GitHub.

Τι είναι το LDA (Topic Modeling);

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

Για τους ακόλουθους τίτλους θα συμφωνήσετε ότι τα 1 και 5 αφορούν την Πολιτική, 2 και 4 για τον Αθλητισμό και 3 και 6 για την Επιστήμη:

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

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

Μόλις ομαδοποιηθούν οι λέξεις σε θέματα, μπορούμε τώρα να δούμε ποια ομάδα λέξεων μιλούν τα άρθρα ειδήσεων και το έγγραφο. Τότε μπορούμε να το ταξινομήσουμε σε αυτήν την ομάδα ή θέμα.

Όπως μπορούμε να δούμε, αυτό το νέο άρθρο ειδήσεων μιλά για το βραβείο Νόμπελ . Μπορούμε τώρα να προβλέψουμε ότι αυτό το έγγραφο μιλά για το θέμα της Επιστήμης .

Σημείωση : Οι λέξεις δεν ομαδοποιούνται απευθείας σε θέματα. Υπολογίζεται μάλλον μια πιθανότητα όπως "Ποια είναι η πιθανότητα μιας λέξης να ανήκει σε ένα θέμα;".

Δίνεται από το p (t | w). Ή πιθανότητα θέματος t δίνεται λέξη w . Στον πυρήνα του είναι απλώς Bayesian_probability.

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

Τι είναι λοιπόν το καθοδηγούμενο LDA;

Το μοντέλο μοντελοποίησης είναι γενικά ένας μη επιτηρούμενος αλγόριθμος μάθησης Γνωρίζουμε ότι το Space and Techείναι δικά τους θέματα. Αλλά αν δεν έχουμε πολλά άρθρα σχετικά με αυτά ή αν αναφέρονται μαζί, μπορεί να ταξινομηθούν σε ένα θέμα.

Πρόσφατα αντιμετώπισα ένα παρόμοιο πρόβλημα. Εργάζομαι ως Επιστήμονας Δεδομένων στο Belong.co και η Επεξεργασία Φυσικής Γλώσσας είναι το ήμισυ της δουλειάς μου. Πρόσφατα έκανα μοντελοποίηση θεμάτων LDA στο σώμα δεδομένων μας. Τα περισσότερα από τα θέματα βγήκαν όπως τα περίμενα. Αλλά μερικά από τα θέματα δεν είχαν νόημα.

Μερικά από τα θέματα ήταν αλληλεπικαλυπτόμενα και μερικά από τα θέματα που περίμενα να βγουν δεν ήταν εκεί. Κάτι τέτοιο συνέβη, ο Space και η Tech συγχωνεύτηκαν.

Σε έναν εποπτευόμενο αλγόριθμο μάθησης μπορείτε να επιστρέψετε και να εντοπίσετε σφάλματα όπου πήγε στραβά στη διαδικασία λήψης αποφάσεων. Ίσως χρειάζεστε περισσότερες δυνατότητες. Ή περισσότερα δεδομένα εκπαίδευσης. Ή ίσως καλύτερη λειτουργία απώλειας, μετρήσεις και δειγματοληψία.

Αλλά από πού να ξεκινήσετε όταν το μοντέλο είναι χωρίς επίβλεψη; Αποφασίσαμε να εντοπίσετε σφάλματα…

Διαπιστώσαμε ότι τα θέματα που αναμίχθηκαν μαζί δεν είχαν αρκετά έγγραφα για να ξεχωρίζουν.

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

Ήταν μια απλή και διαισθητική ιδέα, αλλά δεν μπορέσαμε να βρούμε καμία εφαρμογή του GuidedLDA. Υπήρχαν πολύ λίγα έγγραφα που μίλησαν για την καθοδήγηση του LDA.

Αναφερθήκαμε στο Paper των Jagadeesh Jagarlamudi, Hal Daume III και Raghavendra Udupa που ενσωματώνει Lexical Priors σε Topic Models. Το έγγραφο μιλάει για το πώς τα προγενέστερα (σε αυτήν την περίπτωση προγενέστερα σημαίνουν λέξεις με σπόρους) μπορούν να τοποθετηθούν στο μοντέλο για να το καθοδηγήσουν σε μια συγκεκριμένη κατεύθυνση. Θα αναφερθούμε σε λίγο.

Μόλις κάναμε αυτές τις αλλαγές, το μοντέλο συγκλίθηκε με τον τρόπο που το θέλαμε.

Πώς αλλάξαμε το LDA σε GuidedLDA;

Για να εξηγήσουμε αυτό το μέρος, θα πρέπει να αναφερθούμε στις λεπτομέρειες του τρόπου λειτουργίας του LDA. Θα προσπαθήσω το καλύτερό μου για να το κρατήσω απλό. Εάν δεν θέλετε να μπείτε σε αυτό, μπορείτε να προχωρήσετε στην ενότητα Using GuidedLDA .

Ο τρόπος με τον οποίο λειτουργεί το κανονικό LDA, πρώτα κάθε λέξη αντιστοιχεί τυχαία σε ένα θέμα. Αυτή η εκκίνηση μπορεί να ελεγχθεί με Dirichlet priors μέσω της παραμέτρου Alpha. Εκεί παίρνει το όνομά του το LDA (Latent Dirichlet Allocation). Αυτή η τυχαιότητα θα μπορούσε να είναι ομοιόμορφη αρχικοποίηση εάν το άλφα είναι μεγάλο, ή λοξή αρχικοποίηση όταν το άλφα είναι μικρό. Ας προχωρήσουμε με ομοιόμορφη προετοιμασία για τώρα.

Το επόμενο βήμα είναι να μάθετε ποιος όρος ανήκει σε ποιο θέμα. Αυτό είναι το θέμα μοντελοποίησης θέματος του αλγορίθμου. Το LDA ακολουθεί μια πολύ απλή προσέγγιση, βρίσκοντας το θέμα για έναν όρο τη φορά.

Ας υποθέσουμε ότι θέλετε να βρείτε ένα θέμα για τον όρο Blue Origin . Το LDA θα υποθέσει πρώτα ότι κάθε άλλος όρος στο σώμα αντιστοιχεί στο σωστό θέμα. Στο τελευταίο βήμα είχαμε διανείμει ομοιόμορφα κάθε όρο σε όλα τα θέματα, οπότε θα υποθέσουμε ότι είναι το σωστό θέμα για αυτούς τους όρους.

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

Το Blue Origin πιθανότατα θα πλησιάσει σε οποιοδήποτε θέμα βρίσκονται τα SpaceX και NASA . Τώρα μπορείτε να δείτε ότι η NASA , το SpaceX και η Blue Origin είναι λίγο πιο κοντά ο ένας στον άλλο από ότι ήταν πριν από αυτό το βήμα. Τότε θα προχωρήσουμε στον επόμενο όρο και θα επαναλάβουμε τη διαδικασία. Θα επαναλάβουμε ολόκληρη τη διαδικασία αρκετές φορές που απαιτούνται για να συγκλίνει το μοντέλο.

Ο τύπος για αυτό θα είναι:

Probabilityτου Blue Origin για να ταιριάζει στο θέμα Z{0,1,2, ..} όταν εμφανίζεται στο a documentισούται με τον αριθμό των φορών που το Blue Origin έχει αντιστοιχιστεί στο θέμα Zπολλαπλασιασμένο με τον αριθμό άλλων wordsστο έγγραφο που ανήκουν ήδη Z, διαιρούμενο συνολικά ο αριθμός των φορών που κάθε λέξη έχει αντιστοιχιστεί στο θέμα Z.

Εδώ είναι ο πραγματικός τύπος:

Για κάθε Έγγραφο ( D) και για κάθε λέξη ( W) σε αυτό το έγγραφο, θα υπολογίσουμε την πιθανότητα αυτής της λέξης να ανήκει σε κάθε θέμα ( Z) .

for d in all_documents_D: for w in all_words_W_in_d: for z in all_topics_Z: w_in_z = count(across all documents w belongs to z) d_in_z = count(in d all words that belong to z) tokens_in_z = count(all assignments in z) p(z| w, d) = w_in_z * d_in_z / tokens_in_z # so w belong to max p(z) # whichever topic the probability was maximum for w w_z = max(p(z| w, d))

Τα αρχικά αποτελέσματα θα είναι λάθος. Αλλά θα εκτελέσουμε ολόκληρη τη διαδικασία πολλές φορές και με κάθε επανάληψη θα βελτιωθούν. Με την πάροδο του χρόνου θα συγκλίνουν για να σχηματίσουν κατανομή θεμάτων λέξεων.

Τι αλλάζει όταν σπέρνουμε τα έγγραφα;

Ας πούμε ότι θέλουμε να σπέρνουμε SpaceX, NASAνα συγκλίνουμε προς topic_0. Κατά την προετοιμασία μπορούμε να δώσουμε κάποια επιπλέον ώθηση SpaceXκαι NASAνα βρεθούμε σε αυτό το συγκεκριμένο θέμα.

Μπορούμε να ελέγξουμε αυτήν την παράμετρο για το πόση επιπλέον ώθηση πρέπει να δοθεί σε έναν όρο. Στον αλγόριθμό μας το ονομάζουμε seed_confidenceκαι μπορεί να κυμαίνεται μεταξύ 0 και 1. Με το seed_confidence0,1 μπορείτε να προκαλέσετε προκαταλήψεις των σπόρων λέξεων κατά 10% περισσότερο προς τα θέματα που έχουν δημιουργηθεί.

In the above shown initialization, NASA and SpaceX are being seeded for Topic_0, Apple and Google for Topic_1, and Physics and Chemistry for Topic_2.

Now when we run the above process we will have higher count for seeded words belonging to the seeded topics. The formula will remain the same for GuidedLDA and the convergence will change towards the seeded topics.

# for seeded words belonging to seeded topics# this count will be higher now for seeded z.
w_in_z = count(across all documents w belongs to z)
# Thus probability of p belonging to seeded z will be higher
p(z| w, d) ∝ w_in_z

Hence guiding the LDA. Or GuidedLDA.

We tried a lot of different approaches before finally making this one work.

Using GuidedLDA

GuidedLDA is a python library that I have open sourced on GitHub repo.

You can install it with a simple pip install:

pip install guidedlda

The code to use it is fairly simple. Create a dictionary for seed_topics with word_id to topic_id map. And pass it to the model.fit() method.

  1. seed_confidence can vary between 0 to 1.
  2. seed_topicsείναι το λεξικό { word_idto topic_id}
  3. X είναι η μήτρα όρου εγγράφου.
seed_topics = { 'NASA': 0, 'SpaceX': 0, 'Apple': 1, 'Google': 1, 'Physics': 2, 'Chemistry': 2,}model.fit(X, seed_topics=seed_topics, seed_confidence=0.15).

Η τεκμηρίωση για το GuidedLDA συνδέεται εδώ.

Πιστώσεις

Ένα μεγάλο μέρος του κώδικα δανείζεται από τη βιβλιοθήκη python LDA.

Μια τεράστια κραυγή στους συγγραφείς αυτής της βιβλιοθήκης: Allen Riddell και Tim Hopper.

Ιδιαίτερες ευχαριστίες στον Vinodh Ravindranath, ο οποίος με καθοδήγησε σε όλο το έργο.

Χρησιμοποιώντας το GuidedLDA καταφέραμε να διαχωρίσουμε θέματα που είχαν μικρότερη αναπαράσταση στο σώμα και να καθοδηγήσουμε την ταξινόμηση των εγγράφων.

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