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
04/04/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.

Mihailo Isakov

Objavio/la članak.

ponedeljak, 4. April, 2016.

IT Industrija

🔥 Najčitanije

Nemanja

četvrtak, 7. April, 2016.

Jedna ne-tehnicka cinjenica je to da je u realnosti nemoguce ostaviti komentar na velikim portalima, na bitnim temama. Moje misljenje je da random citalac moze da posalje komentar, ali se isti nikada nece pojaviti na sajtu. Tako da je malo besmislena cela prica oko otkrivanja bot komentara, kad su svi u stvari takvi :)

Stefan2142

utorak, 5. April, 2016.

Ovo je odlično, svaka čast :) A što se tiče problema sa komentarima koji nisu gramatički ispravni..radim na nekom drugom Python projektu i imam vrlo sličan problem. Po meni je neka od ovih metoda rešenje: https://en.wikipedia.org/wiki/Category%3aString_similarity_measures Verovatno ću da koristim Levenštajnovo rastojanje a ti vidi šta tebi najviše odgovara...srećno!

VladanM

utorak, 5. April, 2016.

Najveci problem za trening neuronske mreze je sto za svaki set ulaznih parametara (post) moras da znas dali je zaista botovski ili ne, kako bi mreza pravilno ucila. Ne vidim kako mozes to 100% da znas.

Mirko

utorak, 5. April, 2016.

Jedan od načina da potvrdiš ulazne je podatke je da uzmeš isti softer koji ti botovi i koriste (Valter i SkyNet). Jeste stara priča 2 god, ali ne verujem da se softver mnogo promenio. Morao bi malo da se igraš sa dekompajliranjem (možda je neko već to uradio), i odatle saznaš koji su komentari botovski. Anyway, gl&hf :-D

Mladen

ponedeljak, 4. April, 2016.

Svaka čast Vučiću, za samo nekoliko meseci učinio je da se oseti napredak u svim sferama života u Srbiji.

hintonwannabe

ponedeljak, 4. April, 2016.

Svaka cast druze, i meni je padalo na pamet da tako nesto probam. Imam par komentara za predlozeni model i generisanje dataseta: 1) za dobar model jezika (npr word2vec) mislim da ce biti potreban daleko veci korpus od komentara, vidi da li neke grupe na nasim univerzitetima (filoloski i matf mi se cine kao da imaju nlp grupe) nude korpus srpskog ili bi mozda mogao da iskoristis srpsku (i hrvatsku i ostale ex-yu) wikipediju; 2) mozda mozes prosiriti dataset augmentacijom podataka, npr, dodavanjem i pomeranjem nekih reci; 3) mislim da bi brzi nacin za labelovanje podataka bio da se iskoriste plusevi i minusi na komentarima - kada se primeti aktivnost botova na nekoj vesti sa 100+ komentara obicno se dobro vidi da li botovi upvote-uju ili downvote-uju pa onda jednim klikom korisnika ekstenzije dobijes 100+ obelezenih primera; 4) mozda bi se mogla uraditi i analiza sentimenta teksta vesti (da li je pozitivan ili negativan prema onome koga sendvicari podrzavaju) i onda prema upvote-ovima automatski obeleziti bot komentare, bez potrebe da se to crowdsource-uje. Mislim da bi i predlozeni korak sa genetskim algoritmom trebalo ostaviti za kasnije, ne deluje mi obecavajuce. May the source be with you!

tole

ponedeljak, 4. April, 2016.

zaludno je boriti se protiv posledica (botova), mnogo bi bilo produktivnije napasti sam uzrok (izborni sistem)

Nenad Milosavljevic

ponedeljak, 4. April, 2016.

Nije mi jasno kako cete spreciti botove da instaliraju ekstenziju i namerno "zdrave" komentare oznace kao "botovske". Na taj nacin bi se obesmislila cela ideja, jer bi bilo nemoguce razdvojiti zito od kukolja. Po meni je kljucna kontrola ulaznih podataka, jer ukoliko su podaci "nenadgledani" mislim da ce rezultat biti moguce korumpirati reverznim inzenjeringom cak i dovesti do toga da botovske komentare oznacava kao ispravne a ispravne kao botovske. U svakom slucaju srecno, vredi pokusati.

Djura

ponedeljak, 4. April, 2016.

bolje pisati clanak kada se zavrsi "eksperiment"

Juga

ponedeljak, 4. April, 2016.

Biće malo nezgodno jer su česte slovne greške. Možda je bolje prvi pokušati sa analizom reči i ispravkom slovnih grešaka, pa tek onda daljom analizom reči i redosleda reči u rečenci praviti neuronsku mrežu za detekciju botova. Olakšica je da se botovski komentari doslovce nalaze na više portala.

Filip

ponedeljak, 4. April, 2016.

Nadam se da će biti neki meetup na ovu temu! :)