DeepSpam 2

Fel eve, majusban nekialltam a kb 6 eve fejlesztetett DeepSpam AI-s spamszurom ujrairasanak.

Anno Keras-t hasznaltam, tensorflow backenddel, mert akkoriban az volt a divat :) Erdekes modon az elmult evekben visszatert a Torch, mint pyTorch, pedig meg regen, a Tensorflow berobbanasa elott is a Torch-ot hasznaltak, igaz akkoriban inkabb a LUA-s verziojat. A TF mindigis eleg problemas volt, egyreszt folyton valtoztatgattak inkompatibilis modon az API-jat, a Keras-t is beleolvasztottak idokozben, a bugokrol (durva memleak-ek stb) nem is szolva. Telepiteni is eleg maceras volt, legalabbis GPU tamogatassal biztosan.

Karpathy videoi eleg szajbaragosan de megse unalmasan elmagyarazzak a pytorch hasznalatat, mukodeset is az alapoktol, ez sokat segitett az atirasban. Miutan megvolt a mukodo, immaron pytorch-os kod, elkezdtem javitgatni, optimalizalgatni.

Legfontosabb valtozas talan a szavak maszkolasanak megoldasa (regen sima dropout() volt, ami igazabol nem egesz szavakat hanem csak a vektorok egy reszet utotte ki veletlenszeruen). Erre azert van szukseg, hogy ne tanuljon ra 1-1 konkret szora (pl. egy nev vagy email cim), hanem tobb szempontbol is vizsgalja a mintakat.

Masik, hogy az accuracy fuggvenyt is ujrairtam. Alapvetoen ugye binary classificationrol van szo, az eredmeny egy float 0..1 kozotti, de a korabbi verzioban is ez nalam nem csak 2 osztalyt (spam/ham) jelentett, hanem igazabol 5+1:  ham, maybeham, dontknow, maybespam, spam + tooshort. De a lenyeg, hogy csak a 0-0.2 es 0.8-1 kozotti tartomanyt veszem figyelembe, a szokasos 0-0.5/0.5-1 helyett. Ha ugy nezzuk, ez mar nem is sima binary classification, mert a 0.2-0.8 kozotti ertek eseten bizonytalan a szuro, es ez gyakorlatilag egy 3. class! Ennek megfeleloen nem csak a ham/spam talalati aranyt kell kiszamolni, hanem kulon a false negative/false positive aranyt is, sot, ezt 3x-os szorzoval veszem figyelembe (az nem akkora baj ha a szuro nem tud donteni, mint ha rosszul dont).

Sajnos/szerencsere kiderult igy az is, hogy a dataset (a mintak, amivel tanitom) nem eleg jo, lehetnek nagyon hasonlo mintak mindket osztalyban, emiatt ugral tanulas kozben az accuacy akar 5-8%-ot is (ugyanazt a levelet hol ide hol oda sorolja). Tippre ilyenek lehetnek a kozmuszamlak, amit gyakran 1:1-ben felhasznalnak az adathalaszok, csak a linkeken modositanak, vagy a kulonbozo konferenciameghivok (CfP), amik kozott is sok a fake.

Honapokig tartott atnezni a rengeteg mintat, meg akkor mar ki is bovitettem friss levelekkel, plusz ujrairtam a html2text konvertert is stb, lenyeg hogy ugyan talaltam par hibat a datasetben de messze nem annyit ami indokolja ezt a merteku ingadozast.

Meg egy dolog okozhatja: idokozben attertem a szavankenti word2vec-rol a SentencePiece tokenizalora, raadasul egy pretrained XML (tobbnyelvu) BERT model embeddingjet felhasznalva, ami a magyar szavak tobbseget 2-3 tokenre bontotta. Ezeket transformer modelhez tanitottak, lehet megse annyira jo a CNN-hez?  Visszaterve a word2vec-hez jelentos javulast (90-92% helyett 95-98% pontossag) tapasztaltam. Viszont a tanitas kozbeni accuracy ugralas megmaradt :(

Meg kiserletezem a hyperparameterekkel (batch size, learning rate/curve, hidden layer size stb) – egeszen erdekes valtozasokat okoz nemelyik parameter, de az esetek tobbsegeben nem reprodukalhato a valtozas, ugyanazt lefuttatva tobbszor is eleg nagy a szoras az eredmenyben. Nyilvan a sok random miatt, amit meg lehetne eroszakolni seed-ekkel de az meg a sebesseg rovasara menne, es igazabol nincs ra szukseg. Most az a terv, hogy par napig fut kulonbozo parameterekkel, minden futast elment 1-1 kulon fileba, es ezek kozul a vegen accuracy alapjan kivalasztom a legjobbat...

Hozzászólások

Nezem.

Every single person is a fool, insane, a failure, or a bad person to at least ten people.

neha szembejon (reklamkent) ilyen pcie/nvme slotba dughato AI tamogato hw. az mennyire hasznalhato egy ilyen projectnel?

A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

coral es intel movidius, ezeknek vannak usb-s valtozata is, ahhoz volt mar "szerencsem", igazabol nem sok mindenre jok... talan kep/beszed felismeres ahol visoznylag kis adaton kell sokat szamolni, ott van ertelme, ezekre is van az SDK-ban pelda.

ezeknek tobb ertelme van, de draga es a mai consumer kartyak gyosabbak:

https://www.ebay.com/itm/225094825387

en csak usb-set lattam eddig azok nem jok tanitasra, csak kis modellek (tensorflow lite) hasznalatara.

meg vannak a computing cardok (nvidia tesla, a100 stb) amik rendes gpu-k csak nincs rajta a vga/hdmi csati.

most egy rtx 3090-en tanitom, ezen eleg jol megy (10-50 sec/step, igy kb fel oran belul lefut egy tanitas)

attol fugg. egyreszt nehez egy pc-be berakni 4db 4090-et, fizikailag is, meg azert is mert nem jellemzo egy pc-re (meg hedt-re se) a 4db pcie 8x vagy 16x slot. a banyasz gepekbe beraknak ugyan tobbet is de azoknal nagyon pici a savszelesseg a cpu-gpu kozott (1 pci lane altalaban), de ott ez nem baj mert a kartya elvan magaban.

masreszt most epp a batch size csokkentesenel tartok, es ugy tunik hogy 32 alatt mar nem tudja kihasznalni az 1db 3090-et sem, egyszeruen tul sok az overhead. 64 es folotte kimaxolja a gpu-t, de ott meg nem eleg jo az eredmeny. ugye a batch eseten sok muveletet parhuzamosit, de ezek eredmenyei nem befolyasoljak egymast (hisz nem is tudjak) es ennek nagyobb batch meret eseten erezhetok a hatranyos hatasai.

lefutott 3x-4x kulonbozo batch size (64,48,32,24,16,12,8) es learning rate (0.005,0.003,0.002,0.001,0.0005,0.0002,0.0001) parameterekkel a tanitas, minden futas kozben a legjobbat elmentette.

most ezek eredmenyere raengedtem egy eval-t, tehat egy masik spam/ham minta gyujtemenyre mint amivel tanitva volt, plusz van meg egy extra spam lista is amit a regi verziok egyaltalan nem detektaltak (ezek eleg problemasak is, sok nem is nez ki spamnek).

https://pastebin.com/dh63vSvg

az elso szam az extra spam-ek atlag % erteke, minel nagyobb annal jobban felismerte oket, ugy 75-80 folott mar jonak tekintheto. (a zarojeles 2 szam a ham-nak felismert es a spam-nal felismert mintak szama)

a ham: es a spam: a nagyobb teszt adatsoron elert eredmeny (accuracy), itt a 96-98% mar jonak szamit. sajnos ahol a spam 98% ott a ham eleg gyenge:

82.079    (1/14)    ham: 95.165/1.734  spam: 98.016/0.570  [model/deepspam.pt.TEST5]
78.689    (2/12)    ham: 94.391/1.899  spam: 98.125/0.336  [model/deepspam-1698883923.pt]
83.744    (0/13)    ham: 92.188/2.728  spam: 98.524/0.250  [model/deepspam-1698891094.pt]
91.939    (0/17)    ham: 91.062/3.219  spam: 98.446/0.195  [model/deepspam-1698929321.pt]
85.869    (0/13)    ham: 92.430/2.901  spam: 98.336/0.211  [model/deepspam-1698941999.pt]

osszesen 1 olyan van ahol 97/97-re jott ki:  85.083    (1/14)    ham: 97.120/1.299  spam: 97.219/0.922

illetve az extra mintan ezek a legjobbak:

89.991    (0/16)    ham: 95.752/1.471  spam: 97.321/0.531  [model/deepspam-1698881941.pt]
91.939    (0/17)    ham: 91.062/3.219  spam: 98.446/0.195  [model/deepspam-1698929321.pt]

de mint lathato az utolsonal a ham detektalas mar nagyon rossz, igy ez felejtos...

viszont erdemes volt megnezni ezzel a modellel az ellenorzeshez hasznalt mintakat, talaltam kozte meg par nem odavalot!

meg agyalok a kivalasztasi fuggvenyen, kozbe meg futtatom a tanitast mas halo meretekkel is, meglatjuk van-e ertelme novelni (vagy csokkenteni) a parameterek szaman...

Szerkesztve: 2023. 11. 02., cs – 23:03

subscribe

Nagyon örülök, hogy még vannak ilyen szakemberek it a hup-on.

Egy nap 24 óra, plusz az éjszaka!

csak erdekessegkepp, egy kb 10 ora alatt (ejszaka) tanitott SPM alapu word2vec model (25 epochs) tesztje:

▁kedves: ▁tisztelt, ▁szia, ▁szervusz, ▁köszönjük, ▁helló, ▁kollégák, ▁köszönöm, ▁kérése, ▁kérés, ▁úr
▁hölgyeim: ▁uraim, ▁képviselőtársaim, ▁barroso, ▁gratulálni, ▁előadónk, ▁végezetül, ▁képviselőtársa, ▁képviselőcsoportom, ▁képviselőtársam, ▁üdvözölni
▁és: ▁az, ▁hogy, ▁egy, ▁ön, ▁meg, ▁nem, ▁vagy, ▁ez, ▁ezt, ▁önnek
▁uraim: ▁hölgyeim, ▁képviselőtársaim, ▁barroso, ▁gratulálni, ▁képviselőcsoportom, ▁előadónk, ▁mindenekelőtt, ▁képviselőtársa, ▁képviselőtársam, ▁úrnak
!: ?, ..., ▁..., ▁-, !», ], ▁[, en, ▁вам, er
▁hello: ▁dear, ▁hi, ▁greetings, ▁friend, ▁sir, ▁good, ▁inquiry, madam, ▁hope, ▁urgent
▁minden: ▁új, ▁egy, ▁csak, ▁ez, ▁már, ▁meg, ▁még, ▁itt, ▁további, ▁így
▁macska: ▁kutya, ▁majom, kutya, farkú, ▁kígyó, ▁kecske, ▁teknős, macska, ▁galamb, ▁macskák
▁es: ▁das, ▁im, ▁hat, ▁zu, ▁ist, ▁um, ▁die, ▁sie, ▁mit, ▁ich
▁beka: ▁muf, ▁kola, gora, ▁segge, ▁kura, ▁gorb, kkar, ▁gavi, ▁elefant, ▁riny
!: ?, ..., ▁..., ▁-, !», ], ▁[, en, ▁вам, er
▁ich: ▁zu, ▁auch, ▁habe, ▁noch, ▁bei, ▁mich, ▁wir, ▁ist, ▁ein, ▁das
▁bin: ▁mich, ▁habe, ▁nur, ▁ich, ▁mir, ▁dir, ▁ist, ▁meine, ▁aber, ▁kann
▁wieder: ▁schon, ▁erst, ▁doch, ▁jetzt, ▁einmal, ▁dann, ▁gerade, ▁heute, ▁wird, ▁werde
▁hier: ▁jetzt, ▁dann, ▁wenn, ▁nicht, ▁auch, ▁noch, ▁kann, ▁bei, ▁sind, ▁wird
,: ▁и, ., ;, ▁также, ▁а, ▁только, ▁в, ▁даже, ▁тоже, ▁̶
▁bei: ▁auf, ▁auch, ▁über, ▁zu, ▁aus, ▁wir, ▁nicht, ▁nach, ▁noch, ▁ist
▁dir: ▁dich, ▁mir, ▁euch, ▁mich, ▁alles, ▁deine, ▁hoffe, ▁wenn, ▁auch, ▁dann
...: ▁ибо, ▁вот, ▁меня, ▁просто, ▁нам, »"., ▁..., ▁действительно, ▁нас, ▁совершенно
▁hasta: ▁desde, ▁antes, ▁después, ▁durante, ▁año, ▁tras, ▁pasado, ▁mientras, ▁cuando, ▁sólo
▁la: ▁de, ▁en, ▁et, ▁le, ▁l, ▁du, le, ▁un, ▁d, ▁si
▁vista: ▁punto, ▁desde, ▁hasta, ▁casi, ▁pero, ▁aunque, ▁naturaleza, ▁estar, ▁completamente, ▁puntos
,: ▁и, ., ;, ▁также, ▁а, ▁только, ▁в, ▁даже, ▁тоже, ▁̶
▁baby: ▁daddy, baby, ▁dog, ▁woman, ▁kids, ▁child, ▁heart, ▁lover, ▁mother, ▁babies

 

az input itt csak 2.3GB text volt HU EN DE ES FR IT RU nyelveken (wikipedia, hirek, blog/forum content).

a RU minta utolag lett hozzafuzve (csak a karakterkeszlet miatt), vszinu ezert tanulta azt meg az irasjelekre...

most fut ujra 12GB szoveggel, rendesen megkeverve (HU es EN nagyobb aranyban, DE kozepes) de ez eltart majd par napig (ugy szamoltam 4-5 ora 1 menet, x 25 tehat kb 1 het lesz... de nezem majd a checkpointokat, lehet 1-2 nap utan mar hasznalhato)

alakul. 12G input, epoch 18:

▁kedves: ▁kedvesen, ▁szerető, ▁hálás, ▁neki, ▁vidám, ▁csajszi, ▁barátunk, ▁szeretettel, ▁szíves, ▁barátaim
▁hölgyeim: ▁uraim, képviselőtársaim, ▁üdvözlöm, ▁önöket, ▁hölgyem, ▁tisztelt, ▁köszönöm, ▁szevasztok, ▁megköszönni, ▁szervusztok
▁és: ▁az, ▁továbbá, ▁meglevő, ▁segítségével, ▁valamint, ▁különféle, források, ▁szellemi, ▁különböző, ▁hazai
▁uraim: ▁hölgyeim, ▁önöket, képviselőtársaim, ▁tőled, ▁önöknek, ▁önök, ▁testvéreim, ▁kérem, ▁tőletek, ▁hozzátok
!: !!!!, !!, ...!, !!!, ▁:), ▁ohhh, ▁;-), ▁sooo, !!!", !?!
▁hello: ▁thanx, ▁thank, ▁hi, ▁hey, ▁thx, ▁thanks, ▁reply, ▁btw, ▁yes, ▁aww

...: ▁....., ....., ...., ▁;-), ▁...., )..., ........, ?!!, !!, ▁;)

bar az és-re jobb volt az elozo, hogy a jelentektelen kotoszavakkal volt rokonsagban, ezt nem is igazan ertem hogy jott ki

Szerkesztve: 2023. 11. 08., sze – 19:52

felraktam egy jol mukodo modelt (txz), lehet tesztelni ha valaki eleg bator :)

https://github.com/gereoffy/deepspam2/releases

install:

- pip3 install torch sentencepiece

- githubrol releases-bol kell a .txz file, kibontani

- ./deepspam3.py

postfixbe:

smtpd_milters = inet:127.0.0.1:1080
milter_default_action = accept