Tere kĂ”igile! Minu nimi on Sasha, ma olen CTO ja kaasasutaja LoyaltyLabis. Kaks aastat tagasi kĂ€isin koos sĂ”pradega, nagu kĂ”ik vaesed ĂŒliĂ”pilased, Ă”htuti Ă”lut lĂ€himast poest ostmas. Meid hĂ€iris, et jaemĂŒĂŒja, teades, et tuleme Ă”lle jĂ€rele, ei pakkunud kĂ€tte krĂ”psude ega snĂ€kkide allahindlust, kuigi see oleks olnud nii loogiline! Me ei saanud aru, miks selline olukord eksisteerib ja otsustasime asutada oma ettevĂ”tte. Ja lisaks kirjutada endale igal reedel allahindlusi nende samade krĂ”psude peale.

Asi jÔudis sinna maale, et esitatud tehnilise materjali pÔhjal esitan ma . Meil on hea meel kogemusi kogukonnaga jagada, seetÔttu jagan oma ettekannet artikli vormis.
Sissejuhatus
Nagu kĂ”igil alguses, alustasime sellest, kuidas soovitussĂŒsteemid toimivad. KĂ”ige populaarsem oli jĂ€rgmise tĂŒĂŒbi arhitektuur:

See koosneb kahest osast:
- Kandidaatide soovituste valimine lihtsa ja kiire mudeli abil, tavaliselt koostöömudeli baasil.
- Kandidaatide jÀrjestamine keerukama ja aeglasema sisu mudeli abil, arvestades kÔiki andmetes olevaid tunnuseid.
Edasi kasutan jÀrgmisi termineid:
- candidate/kandidaat soovituste jaoks â user-product paar, mis potentsiaalselt vĂ”ib tootmisprotsessis soovitustesse sattuda.
- candidates extraction/extractor/kandidaatide vĂ€ljavĂ”tmise meetod â kandidaatide soovituste vĂ€ljavĂ”tmise protsess vĂ”i meetod olemasolevate andmete pĂ”hjal.
Esimeses etapis kasutatakse tavaliselt erinevaid koostöfiltreerimise variatsioone. KĂ”ige populaarsem on . Ăllatav on see, et enamik artikleid soovitussĂŒsteemide kohta kĂ€sitleb vaid erinevaid koostöömudelite tĂ€iustusi esimeses etapis, kuid teiste proovivĂ”tmise meetodite kohta ei rÀÀgi peaaegu keegi. Meie lĂ€henemine, mis kasutab ainult koostöömudeleid ja nende erinevaid optimeerimisi, ei andnud soovitud kvaliteeti, seetĂ”ttu sukeldusime uuringutesse just selle osa kohta. Artikli lĂ”puks nĂ€itan, kui palju suutsime ALS-i, mis oli meie baasmudel, tĂ€iustada.
Enne kui liikuda meie lÀhenemise kirjeldamise juurde, on oluline mÀrkida, et reaalajas soovituste puhul, kui on oluline arvestada andmetega, mis on kogunenud 30 minuti jooksul, on tÔepoolest vaid vÀhe lÀhenemisi, mis suudavad vajalikul ajal töötada. Kuid meie puhul tuleb soovitusi genereerida mitte tihemini kui kord pÀevas, enamasti kord nÀdalas, mis annab meile vÔimaluse kasutada keerukaid mudeleid ja oluliselt tÔsta kvaliteeti.
VÔtame baasiks selle, milline on ainult ALS-i nÀitaja kandidaatide vÀljavÔtmisel. Peamised mÔÔdikud, millele tÀhelepanu pöörame, on jÀrgmised:
- Precision â Ă”igesti valitud kandidaatide osakaal valitud kandidaatide seas.
- Recall â esinenud kandidaatide osakaal nendest, mis olid tĂ”eliselt sihtintervallis.
- F1-score â F-meetod, mis arvutatakse eelmainitud kahe punkti pĂ”hjal.
Samuti vaatame Ôpetatud gradientide tÔstmiseks lisanduvat sisu kasutades lÔpptulemuste mÔÔdikuid. Siin on samuti 3 peamist mÔÔdikut:
- precision@5 â keskmine tooteosakaal viie kĂ”ige tĂ”enĂ€olisema toote seas iga ostja jaoks.
- response-rate@5 â ostjate konversioon kauplusesse minekust vĂ€hemalt ĂŒhe isikliku pakkumise ostmiseks (ĂŒhes pakkumises 5 toodet).
- avg roc-auc per user â keskmine iga ostja kohta.
Oluline on mĂ€rkida, et kĂ”ik nimetatud mÔÔdikud mÔÔdetakse , see tĂ€hendab, et Ă”ppimine toimub esimestel k nĂ€dalal ning testandmetena kasutatakse k+1 nĂ€dalat. Nii et hooajalised tĂ”usud/kadumised peegelduvad minimaalsetel mÀÀral mudelite kvaliteedi tĂ”lgendamisel. Edasi kĂ”igil graafikutel tĂ€histab horisontaalne telg nĂ€dalate numbrit valideerimisprotsessis ja vertikaalne telg â nimetatud mÔÔdiku vÀÀrtust. KĂ”ik graafikud on koostatud ĂŒhe kliendi tehinguandmete pĂ”hjal, et omavaheline vĂ”rdlus oleks korrektne.
Enne kui hakata kirjeldama meie lÀhenemist, vaatame esmalt baasmudelit, mis esindab Ôpetatud ALS mudelit.
MÔÔdikud kandidaadi vÀljavÔtmiseks:

LÔppmÔÔdikud:

Suhtun kĂ”igisse algoritmide rakendustesse kui mingisse Ă€rilisesse hĂŒpoteesi. Seega, vĂ€ga ĂŒldiselt, vĂ”ib igasuguseid koostöömudeleid kĂ€sitleda kui hĂŒpoteesi, et "inimesed on kalduvad ostma seda, mida ostavad nende sarnased inimesed." Nagu ĂŒtlesin, ei piirdunud me ainult sellise semantikaga ja siin on veel hĂŒpoteese, mis töötavad andmetes offline jaemĂŒĂŒgis:
- Mida on varem ostetud.
- Sarnane sellele, mida on varem ostetud.
- Aega tagasiostetud ostu tegemiseni.
- Populaarsed kategooriate/brÀndide lÔikes.
- Erinevate toodete korduvad ostud nÀdalast nÀdalasse (Markovi ahelad).
- Sarnased tooted ostjatele, mis pÔhinevad erinevate mudelite (Word2Vec, DSSM jne) omadustel.
Mida osteti varem
Ilmselge heuristika, mis töötab vÀga hÀsti toidupoodides. Siin vÔtame kÔik tooted, mida lojaalsuskaardi omanik on viimase K pÀeva jooksul (tavaliselt 1-3 nÀdalat) ostnud, vÔi K pÀeva jooksul aasta tagasi. Kasutades ainult sellist meetodit, saame jÀrgmised nÀitajad:

Siin on selgelt nÀha, et mida pikemat perioodi me vÔtame, seda rohkem on meil kÔlapinda ja vÀhem tÀpsust ning vastupidi. Parimad tulemused keskmiselt klientide kaupa annavad "viimased 2 nÀdalat".
Sarnane sellele, mida osteti varem
Pole ĂŒllatav, et toidupoodides töötab "mida osteti varem" hĂ€sti, kuid kandidaatide valimine ainult sellest, mida kasutaja juba ostis, ei ole teabestari sisuliselt vĂ€ga huvitav, sest uute toodete soovitamiseks on see kĂŒsitav. Seega aitame natuke tĂ€iustada seda heuristikat sama koostöömudelite abil. ALS-i koolitusel saadud vektorite abil saame leida sarnaseid tooteid sellele, mida kasutaja juba ostis. See idee sarnaneb "sarnaste videote" otsimisega videoteenustes, kuid kuna me ei tea, mida kasutaja konkreetselt praegu sööb/ostab, peame otsima ainult sarnaseid tooteid sellele, mida ta juba ostis, eriti kuna me teame, kui hĂ€sti see töötab. Rakendades sellist meetodit kasutajate tehingute pĂ”hjal viimase 2 nĂ€dala jooksul, saame jĂ€rgmised nĂ€itajad:

Siit k â sarnaste toodete arv, mis leitakse iga ostetud toote kohta viimase 14 pĂ€eva jooksul.
See lÀhenemine töötas meil eriti hÀsti kliendi puhul, kelle jaoks oli kriitiline mitte soovitada seda, mida juba kasutaja ostetud ajaloos oli.
Pikaajalise ostu periood
Nagu oleme juba vĂ€lja selgitanud, töötab esimene lĂ€henemine hĂ€sti meie eripĂ€ra tĂ”ttu toote sageli ostmise tĂ”ttu. Aga kuidas olla toodetega, nagu pesupulber/ĆĄampoon/jne? See tĂ€hendab, et selliste toodetega, mis ilmselt ei ole vajalikud iga nĂ€dala-kaks jooksul ja mille eelnevad meetodid ei saa vĂ€lja tuua. Seega tuleb jĂ€rgmine idee â arvutada iga toote ostu periood keskmiselt klientide pĂ”hjal, kes on toodet rohkem kui k korda ostnud. SeejĂ€rel saame vĂ€lja tuua tooted, mis tĂ”enĂ€oliselt on ostjal juba otsas. Arvutatud perioodid tooteid saab visuaalselt kontrollida adekvaatsuse osas:

SeejÀrel vaatame, kas toote perioodi lÔpp jÀÀb ajavahemikku, mil soovitused tehakse ja kogume selle, mis sinna mahtus. Seda lÀhenemist saab illustreerida jÀrgmiselt:

Siin on meil kaks peamist juhtumit, mida kaaluda:
- Kas tuleb soovitada tooteid klientidele, kes on toodet ostnud vÀhem kui K korda.
- Kas tuleb soovitada toodet, kui selle perioodi lÔpp jÀÀb enne sihitud ajavahemikku.
JĂ€rgmises graafikus on nĂ€ha, milliseid tulemusi see meetod saavutab erinevate hĂŒperparameetritega:

ft â Vaatame ainult kliente, kes on toodet ostnud vĂ€hemalt K korda (siin K=5)
tm â Vaatame ainult kandidaate, kes jÀÀvad sihitud ajavahemikku
Pole ĂŒllatav, et sellises seisundis on (0, 0) kĂ”ige suurem kĂ”lapind ja kĂ”ige vĂ€iksem tĂ€psus, kuna selles tingimuses toimub kandidaate kĂ”ige rohkem. Kuid parimaid tulemusi saavutatakse olukorras, kus me ei soovita tooteid neile klientidele, kes on kindlat toodet ostnud vĂ€hem kui k korda ja valime hulka ka tooteid, mille perioodi lĂ”pp jÀÀb enne sihitud ajavahemikku.
Populaarne kategooriate lÔikes
Veel ĂŒks ĂŒsna ilmne idee â soovitada populaarseid tooteid erinevates kategooriates vĂ”i kaubamĂ€rkides. Siin arvutame iga kliendi jaoks top-k "lemmik" kategooriad/kaubamĂ€rgid ja valime "populaarse" selle kategooria/kaubamĂ€rgi hulgast. Meie puhul mÀÀratleme "lemmik" ja "populaarne" pĂ”hjal tooteidostude arvu. Selle lĂ€henemise tĂ€iendav eelis on rakendatavust kĂŒlma stardi olukordades. See tĂ€hendab kliente, kes on teinud kas vĂ€ga vĂ€he oste, Ă”ige pea ei ole poodi kĂŒlastanud vĂ”i on hoopis alles registreerinud lojaalsuskaardi. Nende jaoks on lihtsam ja parem soovitada tooteid ostjatelt, kellel on juba ostuajalugu. Saadud nĂ€itajad on jĂ€rgmised:

Siin numbrid sÔna "category" jÀrel tÀhistavad kategooria hiilgemust.
Ăldiselt pole ĂŒllatav, et parimaid tulemusi annavad kitsamad kategooriad, kuna nad toovad vĂ€lja tĂ€psemaid "lemmik" tooteid klientide jaoks.
Erinevate toodete jÀrkjÀrgulised ostud nÀdalast nÀdalasse
Huvitav lĂ€henemine, mida ma pole nĂ€inud soovitusĂŒsteemide artiklites â suhteliselt lihtne ja samas töötav Markovi ahelate statistiline meetod. Siin vĂ”tame 2 erinevat nĂ€dalat, seejĂ€rel koostame iga kliendi jaoks toodete paare. [ostetud nĂ€dalal i]-[ostetud nĂ€dalal j], kus j > i, ja siit arvutame iga toote jĂ€rgneva nĂ€dala ĂŒlemineku tĂ”enĂ€osuse teisele tootearvule. See tĂ€hendab, et iga toote paari producti-productj arvutame nende arvu leitud paarides ja jagame selle paaride arvuga, kus producti oli esimesel nĂ€dalal. Kandidaatide vĂ€ljavĂ”tmiseks vĂ”tame kliendi viimase arve ja otsime top-k tĂ”enĂ€oliselt jĂ€rgmised tooted ĂŒleminekute maatriksist, mille oleme saanud. Ăleminekute maatriksi koostamise protsess nĂ€eb vĂ€lja jĂ€rgmine:

Reaalsetest nĂ€idetest ĂŒlemineku tĂ”enĂ€osuste maatriksis nĂ€eme jĂ€rgmisi huvitavaid nĂ€htusi:

Siin vĂ”ib mĂ€rgata huvitavaid seoseid, mis ilmnevad tarbijakĂ€itumises: nĂ€iteks tsitrusviljade armastajad vĂ”i piimatootemargee, millelt tĂ”enĂ€oliselt ĂŒle lĂ€hevad. Samuti pole ĂŒllatav, et tooted, mida ostetakse sageli uuesti, nagu vĂ”i, on siin samuti olemas.
Markovi ahelate meetodi mÔÔdikud on jÀrgmised:

k â tooted, mida tuuakse esile iga viimases tehingus ostetud toote kohta.
Kuidas nĂ€eme, et parim tulemus ilmub konfiguratsiooniga k=4. Neljanda nĂ€dala tippaeg on seletatav hooajalise kĂ€itumisega pĂŒhade ajal.Â
Sarnased tooted klientide jaoks, erinevate mudelite pÔhjal koostatud omadustega
NĂŒĂŒd oleme jĂ”udnud kĂ”ige keerulisemasse ja huvitavasse ossa â lĂ€himate naabrite otsing kliendi ja toodete vektorite pĂ”hjal, mis on koostatud erinevate mudelitega. Oma töös kasutame selliseid mudeleid 3:
- ALS
- Word2Vec (Item2Vec selliste ĂŒlesannete jaoks)
- DSSM
ALS-iga oleme juba tutvunud, selle Ă”ppimise kohta saab lugeda . Word2Veci puhul kasutame kĂ”igile tuntud mudeli teostust, mille ees gensim. Sarnaselt tekstidega mÀÀratleme lause, kui ostuarve. Seega, toote vektori koostamisel Ă”pib mudel ennustama toote "kontrolli" (ĂŒlejÀÀnud tooted arves). E-kaubanduse andmete puhul on parem kasutada arve asemel kliendi sessiooni, mille kohta on hĂ€sti kirjutanud inimesed . DSSM-i analĂŒĂŒs on huvitavam. Esmalt kirjutati see Microsofti teadlaste poolt mudeliks otsinguks, . Mudeli arhitektuur nĂ€eb vĂ€lja jĂ€rgmiselt:

Siit K â pĂ€ring, kasutaja sisestatud otsingupĂ€ring, D[i] â dokument, veebileht. Mudelile antakse sisendiks pĂ€ringu ja lehtede omadused vastavalt. Iga sisendkihiga jĂ€rgneb talle teatav arv tĂ€ielikult seotud kihtide (multilayer perceptron). EdasiĂ”ppe kĂ€igus Ă”pib mudel minimaaliseerima kosinust viimaste kihtide vektorite vahel.
Soovituste juhtumites kasutatakse just sama arhitektuuri, ainult pÀringu asemel on kasutaja ja lehtede asemel tooted. Ja meie puhul muudetakse selline arhitektuur jÀrgnevaks:

NĂŒĂŒd tulemuste kontrollimiseks jÀÀb ĂŒle katsetada viimane moment â kui ALS-i ja DSSM-i puhul on kasutajate vektorid selgelt mÀÀratletud, siis Word2Veci puhul on meil ainult toodete vektorid. Siin kasutame kasutajate vektori koostamiseks kolme peamist lĂ€henemist:
- Lihtsalt liita vektorid, siis kosinuse kauguse jaoks saame, et oleme lihtsalt keskmistanud tooteid ostuajaloos.
- Vektorite summeerimine mingi aegade kaalumisega.
- Toodete kaalumine TF-IDF koefitsiendiga.
Lineaarse kaalumise puhul meie ostja vektoris lĂ€htume hĂŒpoteesist, et toode, mille kasutaja ostis eile, mĂ”jutab tema kĂ€itumist rohkem kui toode, mille ta ostis kuue kuu eest. Seega arvutame eelneva nĂ€dala ostja koos koefitsiendiga 1, ja see, mis toimus kauem siis koefitsiendiga œ, â
jne:

TF-IDF koefitsiendid puhul teeme tĂ€pselt sama, mis tekstide TF-IDF puhul, ainult et ostjat peame dokumendiks ja arvet lauseks, see tĂ€hendab, et sĂ”na â toode. Nii kaldub kasutaja vektor rohkem haruldaste toodete poole, samas kui sagedased ja harjumuspĂ€rased tooted ei muuda seda eriti. LĂ€henemist on vĂ”imalik illustreerida jĂ€rgmiselt:

NĂŒĂŒd vaatame mÔÔdikuid. Sellised on ALS-i tulemused:

MÔÔdikud Item2Veci puhul erinevates ostja vektori koostamise variatsioonides:

Selles olukorras kasutatakse tÀpselt samat mudelit, nagu meie aluseks. Erinevus seisneb vaid selles, millist k-d me kasutame. Ainult koostöömudeleid kasutades tuleb vÔtta umbes 50-70 lÀhimat toodet iga kliendi jaoks.
Ja metrikad DSSM-i jaoks:

Kuidas kĂ”ik meetodid ĂŒhendada?
See on kĂŒll tore, aga mis teha nii suure tööriistade komplektiga kandidaatide leidmiseks? Kuidas leida oma andmete jaoks optimaalne konfiguratsioon? Siit kerkivad esile mitmed ĂŒlesanded:
- Peame kuidagi piirama hĂŒperparameetrite otsinguruumi igas meetodis. See on muidugi igal pool diskreetne, kuid vĂ”imalike punktide arv on vĂ€ga suur.
- Kuidas valida vĂ€ikesest piiratud valimist konkreetsete meetoditega ja konkreetsete hĂŒperparameetritega parim konfiguratsioon oma metoodika jaoks?
Ăhtset vastust esimesele kĂŒsimusele me hetkel ei ole leidnud, seega lĂ€htume jĂ€rgmistest eeldustest: igale meetodile on kirjutatud hĂŒperparameetrite otsinguruumi piiraja sĂ”ltuvalt meie kĂ€sutuses olevatest andmete statistikatest. Niisiis, teadaoleva keskmise ostupeatumise ajaga saame oletada, millise ajaga kasutada meetodit âmida on juba ostetudâ ja âkaupade ostmise aeg, mis on möödasâ.
Ja kui oleme lĂ€bi katsetanud mĂ”istlikus koguses erinevaid meetodite variatsioone, mĂ€rkame jĂ€rgmist: iga rakendus kaevandab teatud arvu kandidaate ja omab meie jaoks olulist metoodika vÀÀrtust (recall). Soovime, et kokku oleks meil teatud arv kandidaate, sĂ”ltuvalt meie lubatud arvutusvĂ”imsusest, maksimaalse vĂ”imaliku metoodika vÀÀrtusega. Siin muutub ĂŒlesanne ilusti knapsack probleemiks.

Siin on kandidaatide arv â selle kaalu vÀÀrtus, ja meetodi recall â selle vÀÀrtus. Siiski on veel kaks punkti, mida tasub algoritmi rakendamisel silmas pidada:
- Meetoditel vÔib olla kattuvust kandidaatides, mida nad vÀlja toovad.
- MĂ”nel juhul on Ă”igustatud vĂ”tta ĂŒks meetod kaks korda erinevate parameetritega, ja esimesest tulemusest kandidaatide kogum ei ole teise alamhulk.
NĂ€iteks, kui vĂ”tta meetodi âmida on juba ostetudâ rakendus erinevate intervallidega kaevandamiseks, siis nende kandidaatide kogum on ĂŒksteise sees. Samas, erinevad parameetrid âperioodilistes ostudesâ ei anna tĂ€ielikku kattuvust. Seega jagame proovimise meetodid erinevate parameetritega plokkideks nii, et igast plokist soovime vĂ”tta mitte rohkem kui ĂŒks kandidaat kindlate hĂŒperparameetritega. Selleks on vaja veidi nutikust knapsack probleemi rakendamisel, kuid asĂŒmptoatika ja tulemus ei muutu.
Selline nutikas kombinatsioon vÔimaldab meil saada jÀrgmised metoodikad vÔrreldes lihtsalt koosteiliste mudelitega:

LÔpptulemuste metoodikates nÀeme jÀrgmist pilti:

Kuid siin vĂ”ib tĂ€hele panna, et ĂŒks soovitus, mis on kasulik Ă€ri jaoks, on kĂ€imata. NĂŒĂŒd oleme lihtsalt Ă”ppinud suurepĂ€raselt ennustama, mida kasutaja ostab, nĂ€iteks jĂ€rgmisel nĂ€dalal. Kuid lihtsalt allahindluse andmine sellele, mida ta niikuinii ostab, ei ole vĂ€ga huvitav. Aga oleks suurepĂ€rane maksimeerida oodatavas vÀÀrtuses jĂ€rgmiste metoodikate osas:
- Marginaal / kaupade mĂŒĂŒgimaht personaalses soovitustes.
- Keskne ostusumma klientide seas.
- KĂŒlastuste sagedus.
Niisiis, me korrutame saadud tĂ”enĂ€osused erinevate koefitsientidega ja jĂ€rjestame need ĂŒmber nii, et tippu jĂ”uavad tooted, mis mĂ”jutavad kĂ”rgemaid metoodikaid. Siin ei ole valmis lahendust, kuidas lĂ€heneda. Isegi me katsetame selliste koefitsientidega otse tootmises. Kuid mĂ”ned huvitavad nipid, mis annavad meil sageli paremaid tulemusi, on:
- Korrutada toote hinna/marginaali jÀrgi.
- Korrutada keskmise ostusumma, milles see toode esineb. Nii ilmuvad ĂŒles tooted, millega tavaliselt ostetakse midagi veel.
- Korrutada toote kĂŒlastuste keskmise sageduse jĂ€rgi, lĂ€htudes hĂŒpoteesist, et see toode kutsub esile tihedama tagasituleku.
Katsed koefitsientide osas andsid meile jÀrgmised metoodikad tootmises:

Siit overall products conversion â ostetud kaupade osakaal kĂ”ikidest soovitatud kaupadest, mille me genereerisime.
TĂ€helepanelik lugeja mĂ€rkab olulist erinevust offline ja online metoodikate vahel. Selline kĂ€itumine on seletatav sellega, et kaugeltki mitte kĂ”ik dĂŒnaamilised toote filtrid, mida soovitatakse, ei ole mudeleid treenimisel arvestatavad. Meie jaoks on normaalne, kui pool vĂ€lja kaevandatud kandidaatidest vĂ”ib olla filtreeritud, see on meie tööstusele iseloomulik eripĂ€ra.
Tulude osas on jÀrgmine lugu, on nÀha, et soovituste kÀivitamisel kasvab testgrupi tulud olulisel mÀÀral, praegu on meie soovitustega keskmine tulu kasv 3-4%:

KokkuvÔttes tahan öelda, et kui teil ei ole vaja reaalajas soovitusi, siis on katsetamine kandidaatide valimisega soovituste jaoks suur kvaliteedi tÔus. Suur osa ajast nende genereerimisel vÔimaldab kombineerida palju hÀid meetodeid, mis kokkuvÔttes toovad Àri jaoks suurepÀraseid tulemusi.
Olen hea meelega valmis arutama kommentaarides kĂ”igiga, kellele see materjal huvitav tundub. KĂŒsimusi saab mulle esitada isiklikult . Samuti jagan ma oma mĂ”tteid AI/dir startups oma â welcome đ
Allikas: habr.com
