Kako sam napravio Lovca na sendviče: treniranjem neuralne mreže do prepoznavanja botova

Već neko vreme želim da istreniram neuralnu mrežu da prepoznaje bot komentare na internetu i odlučio sam da konačno to i uradim, a tajming se ispostavio savršenim.

Mihailo Isakov - 4. April, 2016.

Već neko vreme želim da istreniram mrežu da prepoznaje bot komentare na internetu i odlučio sam da konačno to i uradim, a tajming se ispostavio savršenim. Direktan podsticaj došao mi je kada sam ispratio Kokanov tekst o skrejpovanju B92 koji je naišao na odličan odziv zajednice.

I tako je nastao Lovac na sendviče  aplikacija za Chrome kojom korisnici mogu označiti komentare na sajtovima B92 i Blic kao botovske, a u cilju prepoznavanja plaćenih/guranih komentara.

Iako ovo radim pre izbora, namera mi je da budem apolitičan i podržim fer borbu.

Prvi izazov: kako oformiti veliki dataset?

Problem kod obučavanja takve mreže je što je potreban veliki dataset labeliranih komentara. Neko vreme sam planirao da ručno skinem 1000 do 10000 komentara i da ih nekoliko dana ručno obeležavam. Kada sam shvatio koliko je to beznadežno, gledao sam kako da crowdsource-ujem ovakav dataset.

Inicijalno sam isprobavao da napravim nekolko Google formi gde je svaki komentar pitanje sa dva ponuđena odgovora, ali to se pokazalo prilično mukotrpno. Pre par nedelja sam shvatio da je najbolji način da navedem korisnike da koriste ovo više od jedanput to da ugradim dugmiće u HTML stranicu, pored dugmića za upvote/downvote.

Chrome ekstenzije su iznenađujuće lake za pravljenje budući da zahtevaju poznavanje samo HTML, CSS-a, i Javascripta. Konkretno koristim content skripte koje se ubacuju u sajtove čiji URL odgovara nekom formatu (zadat regex-om).

U okviru prvih par sati od posta na Facebooku dobio sam više stotina šerova, i trenutno imam više od 6000 reakcija na 2500 komentara, od više od 400 korisnika. Ipak, žao mi je što nisam sačekao još koji dan i objavio aplikaciju koja radi i na B92, N1, i ostalim portalima, budući da je u jednom trenutku odaziv odumro.

Kako prepoznati bota?

Postoji više metoda koje bi mogle da se koriste za prepoznavanje botova u komentarima. Klasičan izbor bi bio TF-IDF, ili term frequency-inverse document frequency. Najbolji primer ove metode je anti-spam filter za poštu.

Kako bismo napravili anti-spam filter, potrebno je da uzmemo velik broj spam mejlova i veliki broj mejlova za koje smo sigurni da nisu spam.

TF-IDF traži reči koje se često pojavljuju u oređenom mejlu, ali retko u ostatku korpusa, tako da je dosta lako naći feature-e kojima prepoznaješ spam.

Recimo, Nigerija i prinčevi su prilično standarni za spam, a verovatno je da te reči skoro nikada nećete sresti u običnom mejlu.

Za prepoznavanje plaćenih komentara na internetu će verovatno biti potrebne kompleksnije metode od TF-IDF. TF-IDF ne uzima u obzir ni sintaksu ni semantiku, već induvidualne reči.

Za to planiram da koristim rekurentne neuralne mreže, konkretno GRU (Gated Recurrent Units) i LSTM (Long Short-Term Memory) strukture. Ove mreže rešavaju dugogodišnji problem treniranja rekurentnih neuralnih mreža i pokazale su se odličnim za treniranje tekstom.

Postoji dva tipa treninga neuralnih mreža: nadgledano i nenadgledano. Ukoliko znamo i ulazne podatke i željene vrednosti, treniranje je nadgledano, budući da neuralnu mrežu hranimo parovima ulaz-izlaz, i (relativno) lako možemo da utvrdimo koji neuron je odgovoran za loše performanse mreže.

Nažalost, u većini slučajeva nemamo željene izlazne podatke, ili nedovoljno velik dataset. Danas vrlo lako možemo naći milione slika na internetu, dok je sve do pojave Instagrama bilo vrlo teško pronaći bilo kakve labele za te slike – skupovi slika su mukotrpno obrađivani kako bismo imali baze kao što su Imagenet.

Iz tog razloga je nenadgledano učenje primamljivo, budući da nam nudi mogućnost da koristimo daleko veće baze podataka.

Kako ću trenirati mreže

Treniranje neuralne mreže planiram da obavim u dva poteza.

Prvo planiram da skrejpujem Blic, B92, i ostale portale koje budem koristio. Odavde ću moći da nabavim više miliona komentara na kojima ću moći da treniram LSTM mrežu. Iako za te komentare nemam labele, tj. ne znam da li su plaćeni ili ne, moguće je stvoriti dobar model jezika uz njih.

Standardni pristup je treniranje mreže da predviđa buduća slova ili reči u mreži: mreža sasluša prvih X karaktera komentara, i ima zadatak da predvidi narednih Y karaktera.

Često se u sklopu cilja zahteva i da mreža bude u stanju da ponovi prvih X karaktera unazad, kako bismo forsirali da čuva znanje, što potpomaže generalizaciji kasnije. Ovim pristupom možemo nadgledano trenirati mrežu nad datasetom za koji nemamo labele.

Nakon što mreža ima dobar model jezika, planiram iskoristiti labelirani dataset koji trenutno pokušavam da dobijem. Ovo treniranje se zove fine-tuning i  dovoljan je manji skup podataka, budući da je mreža već pre-trenirana.

Teoretski, korišćenjem LSTM-ova, mreža bi trebala da pokupi sintaksu jezika i primeti sitne razlike u pisanju regularnih korisnika u odnosu na plaćene komentatore čak i ako je skup reči koje oni koriste identičan.

Naravno, nemam garanciju da će išta od ovoga raditi dok ne probam – moguće je da mi za prepoznavanje botova treba 10 ili 100 puta veći trening skup, što jednostavno nije izvodljivo.

Ukoliko uspem da istreniram mrežu…

Ukoliko eksperiment uspe, bilo bi zanimljivo uraditi nekoliko stvari:

Prvo, naterati ekstenziju da unapred proceni bot komentare, tako da je moguće sakriti ih ili ih potamneti ili nešto. Moguće da će to naterati ljude da još i sami ispravljaju kada ekstenzija pogreši.

Drugo, koristeći neuralnu mrežu kao fitnes funkciju, genetskim algoritmima pronaći komentare za koje je mreža 100% sigurna da je u pitanju bot komentar. Za te komentare mreža bi bila sigurnija čak i u odnosu na stvarne bot komentare, tako da je to zgodan način da se vizuelizuje šta je to mreža naučila.

Treće, proći kroz nove ili stare komentare, napraviti listu komentara za koje je mreža sigurna da su botovski/nisu botovski, i ponuditi ih u nekom formatu. Možda kao tabelu, možda kao tviter bot, itd.

Bilo bi kul napraviti igricu gde ti je serviran komentar, pa ga oceniš. Ukoliko bi mi ljudi davali feedback na takve komentare, mogao bih još istrenirati mrežu, i to na primerima koji mi najviše znače.

Učestvuj u drugom velikom istraživanju srpske programerske scene →