Bemutatjuk a gépi tanulás egyik legjobb csapását: a hashing-trükk

A 2018-at különféle üzletek üdvözölték, mivel a spam elhalálozásának éve megtörtént, mivel a gépi tanulási algoritmusok majdnem tökéletesek lesznek arra, hogy kitalálják, mi az igazi levél, és mi nem. Nem vagyok meggyőződve arról, hogy valaha is megtörténik (a gépi tanulás előrelépése mindkét irányt csökkenti), de szeretnék megosztani néhány általános gondolatot arról, hogyan épülnek az ML alapú egyszerű spam osztályozók, és hogyan lehet legyőzni egy jelentős problémát, a szűrő kijátszását, a gépi tanulás egyik legjobb csapdájának felhasználásával: a kivágási trükk. Hasznos a spam észlelésén kívül is.

Egy egyszerű spam osztályozó létrehozása

A dokumentum-osztályozási feladatok elvégzéséhez, beleértve a spam besorolását, általában az a feladat, hogy létrehozzuk az úgynevezett „zsák-szó” (BOW) kifejezést. Tekintettel az ismert spam és nem spam e-mailek sorozatára, minden egyes szót hozzáadunk a szókincshez, és egyedi indexet adunk hozzá, tipikusan nullától kezdve. Tegyük fel, hogy a rövidség kedvéért két rövid szöveges példa van, az egyik amely spam és egy másik, amely jogszerű:

Hetente tízezer dollárt keresek, csak szörfözés az interneten! (spam)
szabad a találkozóra a jövő hét elején? (nem spam)

Ha átvizsgáljuk az adatkészletet, és elkezdjük kiépíteni a szókincsünket, akkor valami ilyesmire juthatunk:

i: 0
gyártmány: 1
tíz: 2
ezer: 3
dollár: 4
per: 5
hét: 6
csak: 7
szörfözés: 8
a: 9
web: 10
a következők: 11
te: 12
ingyenes: 13
mert: 14
a: 15
ülés: 16
korai: 17
következő: 18

Összesen 19 egyedi szó van, és mindegyikhez egyedi index tartozik (vegye figyelembe, hogy a hét szó szerepel mindkét példában). A következő lépés a szolgáltatásvektorok létrehozása a gépi tanulási modellünkhöz. Először null oszlopvektort készítünk minden példa számára, ugyanannyi elemmel, mint ahogy a szókincsünkben vannak szavak (19):

Hetente tízezer dollárt keresek, csak szörfözés az interneten! (spam)
-> [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
szabad a találkozóra a jövő hét elején? (nem spam)
-> [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]

Ezután minden példa minden szójára szókincs-keresést hajtunk végre, hogy megkapjuk az indexet, és az indexben szereplő értéket eggyel növeljük:

Hetente tízezer dollárt keresek, csak szörfözés az interneten! (spam)
-> [1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0]
szabad a találkozóra a jövő hét elején? (nem spam)
-> [0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 1 1]

Az eredményül kapott vektorvektorok szavak zsák reprezentációi. A BOW ábrázolások általában kivezetik az írásjelekkel és a szórenddel kapcsolatos információkat, de sok probléma esetén ez nem jelent problémát. A kifinomultabb BOW reprezentációk TF-IDF súlyokat és / vagy n-gramokat használnak a nyers szószám helyett, de az alapötlet ugyanaz.

Miután megvan a BOW szolgáltatásvektorunk, kiképezhetünk egy bináris osztályozót spamszűrő felépítéséhez. Számos választási lehetőség van a tanulási algoritmusok tekintetében, de a leggyakoribb gyanúsítottak a naiv Bayes, a véletlenszerű erdők, a logisztikai regresszió és egyre inkább az idegi hálózatok. Ha egy képzett modellt használunk, akkor a szókincset felhasználva új e-maileket BOW-vektorként adagolhatunk és megjósolhatjuk, hogy a példa spam. Vegye figyelembe, hogy a valós idejű következtetésekhez a szókincsét a RAM-ban kell a lehető leggyorsabban megőrizni.

A kérdés: a szűrők kijátszása

A spamerek ravaszak. Az egyik népszerű módszer annak biztosítására, hogy a spam ne kerüljön kiszűrésre, az olyan szavak keverése, amelyek nem szerepelnek az osztályozó elsajátításához használt szókincsben. Vegyük például a következő, kissé meghúzott mondatot:

ii May ezernyi ingyenes egy $ $ $ szörfözésről a webz találkozóra a jövő hét elején

Nyilvánvaló, hogy ez nem olyasmi, amit senki elismert legitim e-mailnek tartana. De mi történik, ha a szókincsünket egy BOW vektor felépítéséhez használjuk ehhez a példához? Az első nyolc szó egyáltalán nincs a szókincsünkben, és nem fogja beilleszteni. A többi a következő vektort eredményezi:

ii May ezernyi ingyenes egy $ $ $ szörfözésről a webz találkozóra a jövő hét elején
-> [0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 1 1]

Ez a vektor megegyezik a legitim példakéval. Ön szabad a jövő hét elején tartandó találkozóra? . Bármely, a példáinkra kiképzett osztályozó valószínűleg azt gondolja, hogy ez a spam jogszerű. Ez jelentős probléma, és nem olyan könnyű megoldani, mint gondolnánk. Az új szavakat hozzáadhatnánk a szókincsünkhöz, de ez azt jelentené, hogy a megjelenő szolgáltatásvektorok mérete megváltozik, ugyanúgy, mint maga a szókincs. A gépi tanulási modellek általában rögzített méretű edzési példákon tanulnak, így a modellünket a semmiből kellene továbbképzni. Időbe telik, és amíg ezt megtesszük, a régi osztályozó továbbra is elfogadja a spánt. Olyan megoldásra van szükségünk, amely a) foglalkozhat a szókincsen kívüli szavakkal, b) nem követeli meg, hogy modelleinket a nulláról egészítsük át minden alkalommal, amikor új szót tapasztalunk vagy hibásan írunk, és c) a lehető legpontosabb. Még jobban tudnánk elmenekülni anélkül, hogy hatalmas szókincset tárolnánk a RAM-ban.

Bemutatjuk a kivágási trükköt

A has-funkciók alapvető fontosságúak a számítástechnikában. Sokféle kivonat-függvénytípus létezik, de mindegyik ugyanazt végzi: tetszőleges méretű adatokat rögzít egy rögzített méretű adatra. Jellemzően egy számot kibasznak (hash néven ismert):

"John Doe" -> hash function -> 34
"Jane Doe" -> hash funkció -> 48

A hash kiszámításának logikája maga a hash függvénytől függ, de az összes hash függvény ugyanazon közös jellemzőkkel rendelkezik:

  • Ha ugyanazt a bemenetet tápláljuk hash-függvénybe, akkor mindig ugyanazt a kimenetet kapjuk.
  • A hash-funkció kiválasztása meghatározza a lehetséges kimenetek tartományát, azaz a tartomány mindig rögzített (például 0 és 1024 közötti szám).
  • A hasítófunkciók egyirányúak: hash-hoz adva, nem végezhetünk fordított keresést annak meghatározására, hogy mi volt a bemenet.
  • A hasítási funkciók ugyanazt az értéket szolgáltathatják a különböző bemeneteknél (ütközés).

A hashi funkciók hihetetlenül hasznosak a számítástechnika bármelyik területén, de hogyan lehet ezek javítani a spam osztályozónk szóhasználatának problémáját? A válasz nem azonnal nyilvánvaló, de az első lépés az, hogy megszabaduljunk szókincsünktől. Ehelyett, amikor BOW reprezentációkat állítunk elő, azzal kezdjük, hogy nulla oszlopvektort készítünk hatalmas számú (mondjuk 2²⁸) elemmel minden képzési példánkhoz:

Hetente tízezer dollárt keresek, csak szörfözés az interneten! (spam)
-> [0 0 0 0 ... 0 0 0 0] (2 ^ 28 elem)
szabad a találkozóra a jövő hét elején? (nem spam)
-> [0 0 0 0 ... 0 0 0 0] (2 ^ 28 elem)

Ezután az f hash függvényt választjuk, amely karakterláncokat vesz fel és kimeneti értékeket [0, 2²⁸) tartományban. Más szóval, biztosak vagyunk abban, hogy a hash-funkciónk soha nem foglalkozik egy mutatóval, amely a szolgáltatásvektorok dimenzióin kívül esik.

Az inicializálás után minden egyes képzési példa esetében minden szót egyenként adagolunk a hash-funkción keresztül, és az adott indexhez tartozó értéket eggyel növeljük - ugyanúgy, mint korábban. Találhatunk ilyen ritka vektorokat:

Hetente tízezer dollárt keresek, csak szörfözés az interneten! (spam)
-> [0 ... 0 1 1 1 0 1 1 0 ... 0 1 1 1 1 1 1 1 0] (2 ^ 28 elem)
szabad a találkozóra a jövő hét elején? (nem spam)
-> [0 1 0 1 0 ... 0 1 0 ... 0 1 0 ... 0 1 1 0 1 1 0 1] (2 ^ 28 elem)

Ezt a folyamatot hashicknak ​​nevezik.

Most megvan a BOW képviseletünk, és a korábbiakhoz hasonlóan képesek osztályozni az adatokat. Egyszerű, nem? Elhagytunk egy külön szókincs használatát, ami azt jelenti, hogy nem kell, hogy a RAM-ban tároljuk a potenciálisan nagy szavak listáját. De ez csak egy szép mellékhatás - a valódi kérdés, amelyet meg akarunk oldani, a kijátszás szűrőn keresztüli szűrése. Tehát hogyan segít a kivágási trükk?

Tegyük fel, hogy van egy spam osztályozó, amely egy sok ritka 2²⁸ BOW jellemző vektorra van kiképezve. Egy új levél adásával a korábbiak szerint járunk el, inicializálunk egy 2²⁸ vektort, és minden szót átadunk a hash funkciónkon. Korábban ellentétben minden egyes szó növeli a funkció értékét. Tekintettel a BOW vektorunkra, minden szót - még új szavakat is - figyelembe veszünk a jóslatkor. Az új szavak továbbra is rontják osztályozónk pontosságát, ám az új szavak elkészítésével már nem lehet teljes mértékben megkerülni a spamszűrőt. Mivel a BOW vektorok mind azonos méretűek maradnak, fokozatosan illeszthetjük modellünket új spam / nem spam példákhoz anélkül, hogy az egészet a semmiből át kellene képezniük. Ez az online tanulás egyik formája: amikor a felhasználó e-mailt spamként jelöl meg, a modell képes arra, hogy fokozatosan tanuljon ettől az egész folyamat újraindítása nélkül. Egy olyan gyakorlati alkalmazáshoz, mint a spamszűrés, ez egyértelmű előnye a szolgáltatás-kivonásnak: Gyorsan reagálhatunk a támadásokra úgy, hogy megtanuljuk, amint új spam / nem spam példa érkezik.

De mi van az ütközésekkel, hallom, hogy kérdezed? Nem lehetséges, hogy valamely szándékos helyesírási eredmény növeli ugyanazt az indexet, mint egy legitim szó, amikor áthaladja a hash-funkciót? Igen, ez megtörténhet, de ha a vektorméretet (amennyire csak lehetséges) és a hash funkciót óvatosan választja, ennek esélye elhanyagolható, és még ha igen is, általában nem befolyásolja a tanulást (vagy a pontosságot) ) ennyit. A szokásos hash-funkciók dokumentációja általában tartalmaz ütközési valószínűségeket, ezért feltétlenül vizsgálja meg ezeket, amikor saját hash-trükk megoldását készíti.

Vegye figyelembe, hogy bizonyos esetekben esetleg ütközésekre is szükség lehet (például hasonló jogos szavak csoportosítása céljából), ebben az esetben érdemes vázolni ezeket a kivágás előtt.

Néhány utolsó gondolat

A hashing-trükk egyike a gépi tanulás ügyes trükköinek, amely nem ér szinte annyira szerelmet, mint amennyit megérdemel. Az egyetlen igazi hátránya az, hogy a fordított keresés (output to input) nem lehetséges, de sok probléma esetén ez nem követelmény. Általánosabban véve, a hash-trükk lehetővé teszi változó méretű jellemzők vektorának használatát szokásos tanulási algoritmusokkal (regresszió, véletlenszerű erdők, feed-forward neurális hálózatok, SVM-ek, mátrix faktorizálás stb.). Ennek elegendőnek kell lennie ahhoz, hogy a legtöbb gépi tanulást gyakorló szakember legalább kissé izgatott legyen.