Iepazīstinām ar vienu no labākajiem hakatiem mašīnmācībā: hashing trick

2018. gads ir ticis novērtēts dažādās noieta vietās, jo gads, kad sāks atmest surogātpasts, jo mašīnmācīšanās algoritmi kļūs gandrīz ideāli, lai izdomātu, kas ir īsts pasts un kas ne. Es neesmu pārliecināts, ka tas kādreiz notiks (mašīnmācības attīstība abpusēji sakrīt), bet es vēlētos dalīties dažās vispārīgās pārdomās par to, kā tiek veidoti uz ML balstīti vienkāršie surogātpasta klasificētāji un kā pārvarēt būtisku problēmu, kā apiet filtru, izmantojot vienu no labākajiem mašīnu apguves hakatiem: hashiska triks. Tas ir noderīgi arī surogātpasta noteikšanai.

Vienkārša surogātpasta klasifikatora izveidošana

Dokumentu klasifikācijas uzdevumiem, ieskaitot surogātpastu klasifikāciju, parasti vispirms ir jāizveido tā sauktais vārdu salikuma (BOW) attēlojums. Ņemot vērā zināmo surogātpasta un ar surogātpastu nesaistītu e-pastu kopu, katrs unikālais vārds tiek pievienots vārdnīcai un tiek piešķirts unikāls indekss, kas parasti sākas ar 0. Teiksim, īsuma labad, ka mums ir divu īsu teksta piemēru komplekts, viens kas ir surogātpasts un kas ir likumīgs:

Es nopelnu desmit tūkstošus dolāru nedēļā, vienkārši sērfojot tīmeklī! (spams)
vai jūs esat brīvs sanāksmei nākamās nedēļas sākumā? (nav surogātpasts)

Ja mēs skenētu datu kopu un sāktu veidot mūsu vārdu krājumu, mēs varētu nonākt pie kaut kā šāda:

i: 0
padarīt: 1
desmit: 2
tūkstoši: 3
dolāri: 4
par: 5
nedēļa: 6
tikai: 7
sērfošana: 8
: 9
tīmeklis: 10
ir: 11
tu: 12
bezmaksas: 13
par: 14
a: 15
sapulce: 16
agri: 17
nākamais: 18

Kopumā ir 19 unikāli vārdi, un katram ir piešķirts unikāls indekss (ņemiet vērā, ka vārdu nedēļa parādās abos piemēros). Nākamais solis ir iezīmju vektoru izveide mūsu mašīnmācīšanās modelim. Mēs sākam, izveidojot nulles kolonnu vektoru katram piemēram, ar tādu pašu elementu skaitu, cik vārdu krājumā ir vārdi (19):

Es nopelnu desmit tūkstošus dolāru nedēļā, vienkārši sērfojot tīmeklī! (spams)
-> [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
vai jūs esat brīvs sanāksmei nākamās nedēļas sākumā? (nav surogātpasts)
-> [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

Pēc tam katram vārdam katrā piemērā mēs veicam vārdu krājuma meklēšanu, lai iegūtu indeksu un palielinātu šī indeksa vērtību par vienu:

Es nopelnu desmit tūkstošus dolāru nedēļā, vienkārši sērfojot tīmeklī! (spams)
-> [1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0]
vai jūs esat brīvs sanāksmei nākamās nedēļas sākumā? (nav surogātpasts)
-> [0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 1 1]

Iegūtie funkciju vektori ir vārdu salikuma attēlojumi. BOW attēli parasti izmet informāciju par pieturzīmēm un vārdu secību, taču daudzām problēmām tā nav problēma. Sarežģītākos BOW attēlos neapstrādātu vārdu skaita vietā tiek izmantoti TF-IDF svari un / vai n-grami, taču pamatideja ir tāda pati.

Kad būs pieejami BOW funkciju vektori, mēs varēsim apmācīt bināro klasifikatoru, lai izveidotu surogātpasta filtru. Ir daudz izvēles attiecībā uz mācību algoritmiem, taču visbiežāk sastopamie aizdomās turamie ir Naaive Bayes, izlases meži, loģistikas regresija un aizvien vairāk neironu tīkli. Ņemot vērā apmācītu modeli, mēs varam izmantot vārdu krājumu, lai ievadītu jaunu e-pastu kā BOW vektoru un paredzētu, vai piemērs ir surogātpasts. Ņemiet vērā, ka, lai izdarītu secinājumus par reāllaiku, mums ir jāsaglabā RAM atmiņā, cik ātri vien iespējams.

Jautājums: filtru apiešana

Surogātpasta izplatītāji ir veikls. Viens populārs veids, kā pārliecināties, ka surogātpasts netiek filtrēts, ir sajaukt vārdus, kas nav vārdnīcā, kuru izmanto klasifikatora apgūšanai. Apsveriet, piemēram, šo nedaudz izdomāto teikumu:

ii mayke jūs esat tūkstošiem bezmaksas USDZ $ sērfošanā Webz sanāksmē nākamās nedēļas sākumā

Skaidrs, ka tas nav kaut kas, ko kāds uzskatītu par likumīgu e-pastu. Bet kas notiek, ja mēs izmantojam savu vārdu krājumu, lai izveidotu BOW vektoru šim piemēram? Pirmie astoņi vārdi mūsu vārdu krājumā vispār nav, un tie netiks iekļauti. Pārējie ir šādi vektori:

ii mayke jūs esat tūkstošiem bezmaksas USDZ $ sērfošanā Webz sanāksmē nākamās nedēļas sākumā
-> [0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 1 1]

Šis vektors ir tāds pats kā likumīgajam piemēram, vai jūs varat brīvi piedalīties sanāksmē nākamās nedēļas sākumā? . Jebkurš klasificētājs, kas apmācīts pēc mūsu piemēriem, domājams, uzskatīs, ka šis surogātpasts ir likumīgs. Šī ir būtiska problēma, un to nav tik viegli atrisināt, kā varētu domāt. Jaunos vārdus mēs varētu pievienot mūsu vārdnīcai, taču tas nozīmētu, ka iegūto pazīmju vektora lielums, tāpat kā pats vārdu krājums, mainīsies. Mašīnmācīšanās modeļi parasti mācās fiksēta lieluma apmācības piemēros, tāpēc mums būs jāpārkvalificē mūsu modelis no nulles. Tas prasa laiku, un, kamēr mēs to darām, vecais klasifikators turpinās pieņemt surogātpastu. Mums ir vajadzīgs risinājums, kas a) var tikt galā ar vārdiem, kas nav saistīti ar vārdiem, b) neprasa, lai mēs katru dienu pārkvalificētu savus modeļus ikreiz, kad sastopamies ar jaunu vārdu vai pareizrakstības kļūdu, un c) ir pēc iespējas precīzāks. Ja mēs varētu izkļūt, paturot milzīgu leksiku RAM, vēl labāk.

Iepazīstinām ar jaukšanas triku

Jaukšanas funkcijas ir svarīgas datorzinātnēs. Ir daudz dažādu jaukšanas funkciju veidu, taču tie visi veic vienu un to pašu: kartē patvaļīgu izmēru datus fiksēta lieluma datiem. Parasti tie izspiež skaitli (ko sauc par hash):

"John Doe" -> hash function -> 34
"Jane Doe" -> jaucējfunkcija -> 48

Loģika, pēc kuras tiek aprēķināta hash, ir atkarīga no pašas hash funkcijas, bet visām hash funkcijām ir vienādas kopīgās īpašības:

  • Ja mēs to pašu ievadi ievadīsim hash funkcijai, tas vienmēr sniegs tādu pašu izvadi.
  • Jaucējfunkcijas izvēle nosaka iespējamo izvades diapazonu, t.i., diapazons vienmēr ir fiksēts (piemēram, skaitļi no 0 līdz 1024).
  • Sajaukšanās funkcijas ir vienvirziena: ņemot vērā sajaukumu, mēs nevaram veikt apgrieztu meklēšanu, lai noteiktu, kāda bija ievade.
  • Jaukšanas funkcijas var ievadīt vienādu vērtību dažādām ieejām (sadursme).

Jaucējfunkcijas ir neticami noderīgas gandrīz jebkurā datorzinātnes jomā, bet kā tās var izmantot, lai labotu mūsu surogātpasta klasifikatora problēmu, kas saistīta ar vārdnīcas trūkumu? Atbilde nav uzreiz acīmredzama, bet pirmais solis ir pavisam atbrīvoties no mūsu vārdu krājuma. Tā vietā, veidojot mūsu BOW reprezentācijas, mēs sāksim ar nulles kolonnas vektoru ar milzīgu elementu skaitu (teiksim, 2²⁸) katram mūsu apmācības piemēram:

Es nopelnu desmit tūkstošus dolāru nedēļā, vienkārši sērfojot tīmeklī! (spams)
-> [0 0 0 0 ... 0 0 0 0] (2 ^ 28 elementi)
vai jūs esat brīvs sanāksmei nākamās nedēļas sākumā? (nav surogātpasts)
-> [0 0 0 0 ... 0 0 0 0] (2 ^ 28 elementi)

Tālāk mēs izvēlēsimies jaucējfunkciju f, kas ēd virknes un izvada vērtības diapazonā [0, 2².). Citiem vārdiem sakot, mēs pārliecināmies, ka mūsu hash funkcija nekad nerisinās indeksu ārpus mūsu funkciju vektora dimensijām.

Pēc šīs inicializācijas katram apmācības piemēram mēs katru vārdu pa vienam ievadām, izmantojot mūsu jaucējfunkciju, un palielinām dotā indeksa vērtību par vienu - tāpat kā iepriekš. Mēs varētu nonākt ar šādiem maz vektoriem:

Es nopelnu desmit tūkstošus dolāru nedēļā, vienkārši sērfojot tīmeklī! (spams)
-> [0 ... 0 1 1 1 0 1 1 0 ... 0 1 1 1 1 1 0 1 1 0] (2 ^ 28 elementi)
vai jūs esat brīvs sanāksmei nākamās nedēļas sākumā? (nav surogātpasts)
-> [0 1 0 1 0 ... 0 1 0 ... 0 1 0 ... 0 1 1 0 1 1 0 1] (2 ^ 28 elementi)

Šis process ir pazīstams kā sajaukšanas triks.

Mums tagad ir mūsu BOW pārstāvība, un mēs tāpat kā iepriekš varam apmācīt datu klasificētāju. Vienkārši, nē? Mēs esam atteikušies no atsevišķas vārdu krājuma izmantošanas, kas nozīmē, ka mums RAM nav jāglabā potenciāli liels vārdu saraksts. Bet tā ir tikai jauka blakusparādība - īstā problēma, kuru vēlamies risināt, ir filtru apiešana, izmantojot vārdus, kas neizmanto vārdu krājumu. Tātad, kā palīdz sajaukšanas triks?

Pieņemsim, ka mums ir surogātpasta klasifikators, kas apmācīts uz daudzām mazām 2²⁸ BOW funkciju vektoriem. Ņemot vērā jaunu pasta sūtījumu, mēs rīkojamies tāpat kā iepriekš, inicializējot 2²⁸ vektoru un izlaižot katru vārdu caur mūsu hash funkciju. Atšķirībā no iepriekš, katrs vārds beidzas ar pazīmes vērtības palielināšanu. Ņemot vērā mūsu BOW vektoru, katrs vārds - pat jauns - tiek ņemts vērā prognozēšanas laikā. Jauni vārdi joprojām pasliktina mūsu klasifikatora precizitāti, taču vairs nav iespējams pilnībā apiet surogātpasta filtru, veidojot jaunus vārdus. Tā kā visi BOW vektori paliek vienādi, mēs varam pakāpeniski pielāgot mūsu modeli ar jauniem surogātpastu / surogātpastu piemēriem, nepārkvalificējot visu no nulles. Tas ir tiešsaistes mācīšanās veids: ja lietotājs atzīmē e-pastu kā surogātpastu, modelis to var mācīties pakāpeniski, neatsākot visu procesu. Tādam praktiskam pielietojumam kā surogātpasta filtrēšana ir acīmredzams ieguvums funkciju sajaukšanā: mēs varam ātri reaģēt uz uzbrukumiem, mācoties, tiklīdz parādās jauni surogātpasta / surogātpasta piemēri.

Bet kā ir ar sadursmēm, es dzirdu, ka jūs jautājat? Vai nav iespējams, ka kāda apzināta kļūdaina kļūda palielina to pašu indeksu kā dažam likumīgam vārdam, kad tas iziet caur hash funkciju? Jā, tas var notikt, bet, ja uzmanīgi izvēlaties vektora izmēru (padariet to pēc iespējas lielāku) un hash funkciju, šīs izredzes ir maznozīmīgas, un pat ja tā notiek, tas parasti neietekmē mācīšanos (vai precizitāti ) tik daudz. Standarta jaucējfunkciju dokumentācijā parasti ir iekļautas sadursmes varbūtības, tāpēc, veidojot savu sajaukšanas triku risinājumu, pārliecinieties, ka tie tiek meklēti.

Ņemiet vērā, ka dažos gadījumos jūs pat varētu vēlēties sadursmes (piemēram, līdzīgu likumīgu vārdu grupēšanai); šādā gadījumā jūs varētu vēlēties sadalīt tos pirms sajaukšanas.

Dažas nobeiguma domas

Jaukšanas triks ir viens no glītajiem mašīnmācības trikiem, kas nesaņem gandrīz tik daudz mīlestības, cik tas ir pelnījis. Vienīgais reālais negatīvais ir fakts, ka reversie meklējumi (izeja uz ievadi) nav iespējami, taču daudzām problēmām tas nav nepieciešams. Domājot vispārīgāk, sajaukšanas triks ļauj izmantot mainīga lieluma funkciju vektorus ar standarta mācību algoritmiem (regresija, izlases meži, barības priekšu neironu tīkli, SVM, matricas faktorizēšana utt.). Ar to vajadzētu pietikt, lai vairums mašīnu apguves praktiķu vismaz mazliet satrauktos.