Kako smo promijenili nenadzirani LDA u polunadgledani vođeni LDA

Ovo je priča o tome kako i zašto smo morali napisati vlastiti oblik Latentne Dirichletove dodjele (LDA). Govorim i o tome zašto smo trebali izgraditi model s vođenom temom (GuidedLDA) i procesu otvorenog izvođenja svega na GitHubu.

Što je LDA (modeliranje tema)?

Recimo da imate niz članaka vijesti koji su bili dokumenti. Čitajući te članke moći ćete reći jesu li u pitanju sport, politika ili znanost.

Za slijedeće naslove složit ćete se da 1 i 5 govore o politici, 2 i 4 o sportu, a 3 i 6 o znanosti:

Za čovjeka nije izazov odgonetnuti kojoj temi pripada vijest. Ali kako možemo naučiti računalo da razumije iste teme?

Ovdje se modeliranje tema pojavljuje. Modeliranje tema neupravljana je klasa algoritama strojnog učenja. Ovi modeli općenito dobro grupiraju riječi u teme. LDA je najpopularnija tehnika modeliranja tema.

Nakon što riječi grupiramo u teme, sada možemo vidjeti o kojoj skupini riječi govore novinski članci i dokumenti. Tada ga možemo svrstati u tu skupinu ili temu.

Kao što vidimo, ovaj novi članak vijesti govori o Nobelovoj nagradi . Sada možemo predvidjeti da ovaj dokument govori o temi Znanost .

Napomena : Riječi se ne grupiraju izravno u teme. Umjesto toga izračunava se vjerojatnost poput "Kolika je vjerojatnost riječi koja pripada temi?".

Daje se s p (t | w). Ili vjerojatnost teme t zadane riječi w . U osnovi je samo Bayesova_vjerojatnost.

Volio bih više razgovarati o tome, ali ne želim odstupiti od suštinskog problema. Ako ste zainteresirani, više o tome možete pročitati ovdje.

Dakle, što je vođeni LDA?

Modeliranje tema općenito je algoritam učenja bez nadzora. Znamo taj prostor i tehnologijusu vlastite teme. Ali ako o njima ne dobijemo puno članaka ili ako ih se zajedno spominje, mogli bi se svrstati u jednu temu.

Nedavno sam naletio na sličan problem. Radim kao znanstvenik podataka na Belong.co, a obrada prirodnih jezika polovica je mog rada. Nedavno sam radio LDA modeliranje tema na našem korpusu podataka. Većina tema izašla je onako kako sam očekivao. No neke teme nisu imale smisla.

Nekoliko se tema preklapalo, a neke teme za koje sam očekivao da će izaći nisu bile tamo. Nešto se od ove vrste dogodilo, Space i Tech su se spojili.

U nadgledanom algoritmu učenja možete se vratiti i ispraviti pogreške tamo gdje ste pogriješili u procesu donošenja odluka. Možda su vam trebale dodatne značajke. Ili više podataka o treningu. Ili možda bolja funkcija gubitka, mjerni podaci i uzorkovanje.

Ali gdje početi kada je model bez nadzora? Odlučili smo ispraviti pogreške ...

Otkrili smo da teme koje su se miješale nisu imale dovoljno dokumenata da bi se istakle.

Odlučili smo reći modelu da drži Space i Tech odvojene. Ideja je bila postaviti neke početne riječi za svemir i neke početne riječi za tehniku. Zatim vodite model da se približi tim pojmovima.

Bila je to jednostavna i intuitivna ideja, ali nismo uspjeli pronaći primjenu GuidedLDA. Bilo je vrlo malo radova koji su govorili o vođenju LDA.

Osvrnuli smo se na članak Jagadeesha Jagarlamudija, Hala Daumea III i Raghavendre Udupe koji uključuje leksičke pretore u tematske modele. Članak govori o tome kako priori (u ovom slučaju priori znače zasijane riječi) mogu biti postavljeni u model da ga vode u određenom smjeru. Za malo ćemo ući u detalje.

Jednom kada smo napravili te promjene, model se približio onako kako smo mi željeli.

Pa Kako smo promijenili LDA u GuidedLDA?

Da bismo objasnili ovaj dio, morat ćemo ući u detalje kako LDA radi. Trudit ću se da bude jednostavno. Ako ne želite ulaziti u to, možete prijeći na odjeljak Using GuidedLDA .

Način na koji redoviti LDA funkcionira je, prvo je svaka riječ nasumično dodijeljena temi. Ovom se inicijalizacijom može upravljati s Dirichletovim priorima putem parametra Alpha. Tu LDA (Latent Dirichlet Allocation) dobiva svoje ime. Ta slučajnost može biti jednolika inicijalizacija ako je alfa velika ili iskrivljena inicijalizacija kad je alfa mala. Krenimo za sada s jednoobraznom inicijalizacijom.

Sljedeći je korak saznati koji pojam kojoj temi pripada. Ovo je dio algoritma za modeliranje tema. LDA se zalaže za vrlo jednostavan pristup pronalaženjem teme po jedan pojam.

Recimo da želite pronaći temu za pojam Plavo podrijetlo . LDA će prvo pretpostaviti da je svaki drugi pojam u korpusu dodijeljen pravoj temi. U posljednjem smo koraku ravnomjerno rasporedili svaki pojam u sve teme, pa ćemo pretpostaviti da je to ispravna tema za te pojmove.

Zatim izračunavamo uz koje pojmove Blue Origin često dolazi. Zatim, što je najčešća tema među tim pojmovima. Mi ćemo toj temi dodijeliti Blue Origin .

Blue Origin će se vjerojatno približiti bilo kojoj temi SpaceX i NASA . Sada možete vidjeti da su NASA , SpaceX i Blue Origin malo bliži jedni drugima nego što su bili prije ovog koraka. Tada ćemo prijeći na sljedeći mandat i ponoviti postupak. Ponovit ćemo cijeli ovaj postupak dovoljan broj puta potrebnih da se model konvergira.

Formula za to bit će:

Probabilityod Blue Origin da stane u temi Z{0,1,2, ..} kada se pojavljuje u documentjednak broj puta Plava Porijeklo je dodijeljen temu Zpomnožen s brojem drugi wordsu tom dokumentu koji je već pripadaju Z, podijeljena ukupan broj puta dodijeljenja bilo kojoj riječi temi Z.

Evo stvarne formule:

Za svaki dokument ( D) i za svaku riječ ( W) u tom dokumentu izračunati ćemo vjerojatnost da ta riječ pripada svakoj temi ( 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))

The initial results will be wrong. But we will run this entire process multiple times and with each iteration they will get better. Over time they will converge to form word topic distribution.

What changes when we seed the documents?

Say we want to seed SpaceX, NASAto converge towards topic_0. During initialization we can give some extra boost to SpaceXand NASA to lie in this specific topic.

We can control this parameter of how much extra boost should be given to a term. In our algorithm we call it seed_confidence and it can range between 0 and 1. With a seed_confidence of 0.1 you can bias the seeded words by 10% more towards the seeded topics.

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 is the dictionary {word_id to topic_id}
  3. X is the document term matrix.
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).

Documentation for GuidedLDA is linked here.

Credits

A major part of the code is borrowed from python LDA library.

A huge shoutout to the authors of that library : Allen Riddell and Tim Hopper.

Special thanks to Vinodh Ravindranath, who mentored me throughout the project.

By using GuidedLDA we were able to separate out topics which had smaller representation in the corpus and guide the classification of documents.

We have seen success with this model in production. But still, the Algorithm and the implementation is at an early stage. We request you to try it out and share your thoughts, experiments and results. Would love to hear from you.