Hi almal! My naam is Sasha, ek is CTO & Mede-stigter by LoyaltyLab. Twee jaar gelede het ek en my vriende, soos alle arm studente, saans gaan bier koop by die naaste winkel naby ons huis. Ons was baie ontsteld dat die kleinhandelaar, wetende dat ons vir bier sou kom, nie 'n afslag op skyfies of beskuitjies aangebied het nie, alhoewel dit so logies was! Ons het nie verstaan hoekom hierdie situasie gebeur nie en het besluit om ons eie maatskappy te begin. Wel, as 'n bonus, gee jouself elke Vrydag afslag op daardie selfde skyfies.

En dit het alles by die punt gekom waar ek materiaal oor die tegniese kant van die produk aanbied by . Ons deel graag ons werk met die gemeenskap, daarom publiseer ek my verslag in die vorm van 'n artikel.
Inleiding
Soos almal aan die begin van die reis, het ons begin met 'n oorsig van hoe aanbevelingstelsels gemaak word. En die gewildste argitektuur blyk die volgende tipe te wees:

Dit bestaan uit twee dele:
- Steekproefneming van kandidate vir aanbevelings deur 'n eenvoudige en vinnige model te gebruik, gewoonlik 'n samewerkende een.
- Rangskikking van kandidate met 'n meer komplekse en stadige inhoudmodel, met inagneming van alle moontlike kenmerke in die data.
Hierna sal ek die volgende terme gebruik:
- kandidaat/kandidaat vir aanbevelings — 'n gebruiker-produk-paar wat moontlik by aanbevelings in produksie ingesluit kan word.
- kandidate onttrekking/onttrekking/kandidaat onttrekking metode — 'n proses of metode om "aanbevelingskandidate" uit beskikbare data te onttrek.
Die eerste stap behels gewoonlik die gebruik van verskillende variasies van samewerkende filtering. Die gewildste - . Dit is verbasend dat die meeste artikels oor aanbevelingstelsels slegs verskeie verbeterings aan samewerkende modelle in die eerste stadium openbaar, maar niemand praat veel oor ander steekproefmetodes nie. Vir ons het die benadering om slegs samewerkende modelle en verskeie optimaliserings daarmee te gebruik nie gewerk met die kwaliteit wat ons verwag het nie, daarom het ons spesifiek oor hierdie deel navorsing gedoen. En aan die einde van die artikel sal ek wys hoeveel ons ALS kon verbeter, wat ons basislyn was.
Voordat ek verder gaan met die beskrywing van ons benadering, is dit belangrik om daarop te let dat in reële tyd aanbevelings, wanneer dit vir ons belangrik is om data wat 30 minute gelede plaasgevind het in ag te neem, daar regtig nie baie benaderings is wat in die vereiste tyd kan werk nie. Maar in ons geval moet ons aanbevelings nie meer as een keer per dag insamel nie, en in die meeste gevalle - een keer per week, wat ons die geleentheid gee om komplekse modelle te gebruik en kwaliteit verskeie kere te verbeter.
Kom ons neem as basislyn watter maatstawwe slegs ALS toon oor die taak om kandidate te onttrek. Die sleutelmaatstawwe wat ons monitor is:
- Presisie - die proporsie van korrek geselekteerde kandidate uit die steekproef.
- Herroeping is die proporsie kandidate wat gebeur het uit dié wat werklik in die teikeninterval was.
- F1-telling - F-maat bereken op die vorige twee punte.
Ons sal ook kyk na die statistieke van die finale model na opleidingsgradiëntversterking met bykomende inhoudskenmerke. Daar is ook 3 hoofmaatstawwe hier:
- presisie@5 - die gemiddelde persentasie produkte van die top 5 in terme van waarskynlikheid vir elke koper.
- response-rate@5 - omskakeling van kliënte van 'n besoek aan die winkel na die aankoop van ten minste een persoonlike aanbod (5 produkte in een aanbod).
- gem. roc-auc per gebruiker - gemiddeld vir elke koper.
Dit is belangrik om daarop te let dat al hierdie maatstawwe gemeet word , dit wil sê, opleiding vind plaas in die eerste k weke, en k+1 week word as toetsdata geneem. Seisoenale op- en afdraandes het dus minimale impak op die interpretasie van die kwaliteit van die modelle gehad. Verder op alle grafieke sal die abskis-as die weeknommer in kruisvalidering aandui, en die ordinaat-as sal die waarde van die gespesifiseerde metriek aandui. Alle grafieke is gebaseer op transaksiedata van een kliënt sodat vergelykings tussen mekaar korrek is.
Voordat ons begin om ons benadering te beskryf, kyk ons eers na die basislyn, wat 'n ALS-opgeleide model is.
Kandidaat herwinning maatstawwe:

Finale maatstawwe:

Ek behandel alle implementering van algoritmes as 'n soort besigheidshipotese. Dus, baie rofweg, kan enige samewerkende model beskou word as 'n hipotese dat "mense geneig is om te koop wat mense soortgelyk aan hulle koop." Soos ek reeds gesê het, het ons onsself nie beperk tot net sulke semantiek nie, en hier is 'n paar hipoteses wat goed werk op data in vanlyn kleinhandel:
- Wat ek al voorheen gekoop het.
- Soortgelyk aan wat ek voorheen gekoop het.
- Tydperk van 'n lang vorige aankoop.
- Gewild volgens kategorie/handelsmerk.
- Wissel afwisselende aankope van verskillende goedere van week tot week (Markov-kettings).
- Soortgelyke produkte aan kopers, volgens eienskappe wat deur verskillende modelle gebou is (Word2Vec, DSSM, ens.).
Wat het jy voorheen gekoop?
Die mees voor die hand liggende heuristiek wat baie goed werk in kruideniersware kleinhandel. Hier neem ons al die goedere wat die lojaliteitskaarthouer gekoop het in die laaste K dae (gewoonlik 1-3 weke), of K dae 'n jaar gelede. Deur slegs hierdie metode toe te pas, kry ons die volgende maatstawwe:

Hier is dit duidelik dat hoe langer ons die tydperk neem, hoe meer herroeping het ons en hoe minder akkuraatheid het ons en omgekeerd. Gemiddeld gee die “laaste 2 weke” beter resultate vir kliënte.
Soortgelyk aan wat ek voorheen gekoop het
Dit is nie verbasend dat vir kruideniersware kleinhandel "wat ek voorheen gekoop het" goed werk, maar om kandidate slegs te onttrek uit wat die gebruiker reeds gekoop het, is nie baie cool nie, want dit is onwaarskynlik dat dit die koper sal verras met een of ander nuwe produk. Daarom stel ons voor om hierdie heuristiek effens te verbeter deur dieselfde samewerkende modelle te gebruik. Uit die vektore wat ons tydens ALS-opleiding ontvang het, kan ons soortgelyke produkte kry as wat die gebruiker reeds gekoop het. Hierdie idee is baie soortgelyk aan "soortgelyke video's" in dienste vir die kyk van video-inhoud, maar aangesien ons nie weet wat die gebruiker op 'n spesifieke oomblik eet/koop nie, kan ons net soek na soortgelykes as wat hy reeds gekoop het, veral aangesien ons Ons weet reeds hoe goed dit werk. Deur hierdie metode toe te pas op gebruikertransaksies oor die afgelope 2 weke, kry ons die volgende maatstawwe:

Hier k — die aantal soortgelyke produkte wat vir elke produk wat die koper oor die afgelope 14 dae gekoop het, opgespoor word.
Hierdie benadering het veral goed gewerk vir ons kliënt, vir wie dit van kritieke belang was om niks aan te beveel wat reeds in die gebruiker se aankoopgeskiedenis was nie.
Laat aankoop tydperk
Soos ons reeds uitgevind het, as gevolg van die hoë frekwensie van die aankoop van goedere, werk die eerste benadering goed vir ons spesifieke behoeftes. Maar wat van goed soos waspoeier/sjampoe/ens. Dit wil sê met produkte wat waarskynlik nie elke week of twee nodig sal wees nie en wat vorige metodes nie kan onttrek nie. Dit lei tot die volgende idee - dit word voorgestel om die aankooptydperk van elke produk gemiddeld te bereken vir kliënte wat die produk meer gekoop het k een keer. En haal dan uit waaruit die koper heel waarskynlik reeds opgeraak het. Die berekende tydperke vir goedere kan met u oë nagegaan word vir toereikendheid:

En dan sal ons kyk of die einde van die produkperiode binne die tydsinterval val wanneer die aanbevelings in produksie sal wees en monster wat gebeur. Die benadering kan soos volg geïllustreer word:

Hier het ons 2 hoofgevalle wat oorweeg kan word:
- Is dit nodig om produkte te proe van kliënte wat die produk minder as K keer gekoop het.
- Is dit nodig om 'n produk te monster as die einde van sy periode voor die begin van die teikeninterval val.
Die volgende grafiek toon watter resultate hierdie metode met verskillende hiperparameters behaal:

ft — Neem slegs klante wat die produk minstens K (hier K=5) keer gekoop het
tm — Neem slegs kandidate wat binne die teikeninterval val
Dit is nie verbasend dat hy in staat is nie (0, 0) grootste onthou en die kleinste presisie, aangesien onder hierdie toestand die meeste kandidate gehaal word. Die beste resultate word egter behaal wanneer ons nie produkte proe vir kliënte wat 'n spesifieke produk minder as gekoop het nie k tye en uittreksel, insluitend goedere, waarvan die einde van die tydperk voor die teikeninterval val.
Gewild volgens kategorie
Nog 'n redelik voor die hand liggende idee is om gewilde produkte oor verskillende kategorieë of handelsmerke te proe. Hier bereken ons vir elke koper top-k "gunsteling" kategorieë/handelsmerke en onttrek "gewild" uit hierdie kategorie/handelsmerk. In ons geval sal ons "gunsteling" en "gewild" bepaal deur die aantal aankope van die produk. 'n Bykomende voordeel van hierdie benadering is die toepaslikheid daarvan in die koue begin geval. Dit wil sê vir kliënte wat óf baie min aankope gedoen het, óf lanklaas in die winkel was, óf pas 'n lojaliteitskaart uitgereik het. Vir hulle is dit makliker en beter om items in voorraad te hê wat gewild is onder klante en 'n geskiedenis het. Die gevolglike maatstawwe is:

Hier beteken die nommer na die woord "kategorie" die vlak van nes van die kategorie.
Oor die algemeen is dit ook nie verbasend dat nouer kategorieë beter resultate behaal nie, aangesien dit meer akkurate "gunsteling" produkte vir kopers onttrek.
Wissel afwisselende aankope van verskillende goedere van week tot week
'n Interessante benadering wat ek nie in artikels oor aanbevelingstelsels gesien het nie, is 'n redelik eenvoudige en terselfdertyd werkende statistiese metode van Markov-kettings. Hier neem ons 2 verskillende weke, dan bou ons vir elke kliënt pare produkte [gekoop in week i]-[gekoop in week j], waar j > i, en van hier af bereken ons vir elke produk die waarskynlikheid om volgende week na 'n ander produk oor te skakel. Dit wil sê vir elke paar goedere produkti-produkj Ons tel hul getal in die gevind pare en deel deur die aantal pare, waar produkte was in die eerste week. Om kandidate te onttrek, neem ons die koper se laaste kwitansie en trek dit uit top-k die mees waarskynlike volgende produkte uit die oorgangsmatriks wat ons ontvang het. Die proses om 'n oorgangsmatriks te bou lyk soos volg:

Uit werklike voorbeelde in die oorgangswaarskynlikheidsmatriks sien ons die volgende interessante verskynsels:

Hier kan jy interessante afhanklikhede opmerk wat in verbruikersgedrag geopenbaar word: byvoorbeeld liefhebbers van sitrusvrugte of 'n merk melk waarvan hulle waarskynlik na 'n ander sal oorskakel. Dit is ook nie verbasend dat produkte met 'n hoë frekwensie van herhaalde aankope, soos botter, ook hier beland nie.
Die maatstawwe in die metode met Markov-kettings is soos volg:

k — die aantal produkte wat vir elke aangekoopte produk van die koper se laaste transaksie afgehaal word.
Soos ons kan sien, word die beste resultaat getoon deur die konfigurasie met k=4. Die styging in week 4 kan verklaar word deur seisoenale gedrag rondom die vakansie.
Soortgelyke produkte aan kopers, volgens eienskappe gebou deur verskillende modelle
Nou het ons by die moeilikste en interessantste deel gekom - soek na naaste bure gebaseer op vektore van kliënte en produkte wat volgens verskillende modelle gebou is. In ons werk gebruik ons 3 sulke modelle:
- AS
- Word2Vec (Item2Vec vir sulke take)
- DSSM
Ons het reeds met ALS gehandel, jy kan lees hoe dit leer . In die geval van Word2Vec gebruik ons die bekende implementering van die model vanaf gensim. Na analogie van die tekste definieer ons die aanbod as 'n aankoopbewys. Dus, wanneer 'n produkvektor gekonstrueer word, leer die model om vir die produk in die kwitansie sy "konteks" (die oorblywende produkte in die kwitansie) te voorspel. In e-handelsdata is dit beter om die kopersessie te gebruik in plaas van 'n kwitansie van die ouens . En DSSM is meer interessant om te ontleed. Aanvanklik is dit geskryf deur die ouens van Microsoft as 'n model vir soek, . Die argitektuur van die model lyk soos volg:

Hier Q - navraag, gebruiker soek navraag, D[i] - dokument, internetblad. Die insette tot die model is onderskeidelik die eienskappe van die versoek en bladsye. Na elke invoerlaag is daar 'n aantal volledig gekoppelde lae (meerlaagperseptron). Vervolgens leer die model om die cosinus tussen die vektore wat in die laaste lae van die model verkry is, te minimaliseer.
Aanbevelingstake gebruik presies dieselfde argitektuur, net in plaas van 'n versoek is daar 'n gebruiker, en in plaas van bladsye is daar produkte. En in ons geval word hierdie argitektuur omskep in die volgende:

Nou, om die resultate na te gaan, bly dit om die laaste punt te dek - as ons in die geval van ALS en DSSM uitdruklik gebruikersvektore gedefinieer het, dan het ons in die geval van Word2Vec net produkvektore. Hier, om die gebruikersvektor te bou, het ons 3 hoofbenaderings gedefinieer:
- Voeg net die vektore by, dan vir die cosinus-afstand blyk dit dat ons eenvoudig die produkte in die aankoopgeskiedenis gemiddeld het.
- Vektoropsomming met 'n bietjie tydgewig.
- Weeg goedere met TF-IDF-koëffisiënt.
In die geval van lineêre gewig van die kopervektor gaan ons uit van die hipotese dat die produk wat die gebruiker gister gekoop het 'n groter invloed op sy gedrag het as die produk wat hy ses maande gelede gekoop het. Ons beskou dus die koper se vorige week met kans van 1, en wat volgende gebeur het met kans van ½, ⅓, ens.:

Vir TF-IDF-koëffisiënte doen ons presies dieselfde as in TF-IDF vir tekste, net ons beskou die koper as 'n dokument, en die tjek onderskeidelik as 'n aanbod, die woord is 'n produk. Op hierdie manier sal die gebruiker se vektor meer na skaars goedere verskuif, terwyl gereelde en bekende goedere vir die koper dit nie veel sal verander nie. Die benadering kan soos volg geïllustreer word:

Kom ons kyk nou na die maatstawwe. Dit is hoe die ALS-resultate lyk:

Metrieke vir Item2Vec met verskillende variasies van die konstruksie van die kopervektor:

In hierdie geval word presies dieselfde model gebruik as in ons basislyn. Die enigste verskil is watter k ons sal gebruik. Om slegs samewerkende modelle te gebruik, moet jy ongeveer 50-70 naaste produkte vir elke kliënt neem.
En statistieke volgens DSSM:

Hoe om alle metodes te kombineer?
Cool, sê jy, maar wat om te doen met so 'n groot stel kandidaat-ekstraksie-instrumente? Hoe om die optimale konfigurasie vir jou data te kies? Hier het ons verskeie probleme:
- Dit is nodig om op een of ander manier die soekruimte vir hiperparameters in elke metode te beperk. Dit is natuurlik oral diskreet, maar die aantal moontlike punte is baie groot.
- Deur 'n klein beperkte steekproef van spesifieke metodes met spesifieke hiperparameters te gebruik, hoe kan jy die beste konfigurasie vir jou metrieke kies?
Ons het nog nie 'n definitief korrekte antwoord op die eerste vraag gevind nie, daarom gaan ons van die volgende uit: vir elke metode word 'n hiperparametersoekruimtebeperker geskryf, afhangende van sommige statistieke oor die data wat ons het. As ons dus die gemiddelde tydperk tussen aankope van mense ken, kan ons raai met watter tydperk om die "wat reeds gekoop is" en "tydperk van 'n lang verlede aankoop" metode te gebruik.
En nadat ons deur 'n sekere voldoende aantal variasies van verskillende metodes gegaan het, let ons op die volgende: elke implementering onttrek 'n sekere aantal kandidate en het 'n sekere waarde van die sleutelmetriek vir ons (herroeping). Ons wil 'n totaal van 'n sekere aantal kandidate kry, afhangende van ons toelaatbare rekenaarkrag, met die hoogste moontlike metrieke. Hier stort die probleem pragtig in die rugsakprobleem in.

Hier is die aantal kandidate die gewig van die staaf, en die herroepmetode is die waarde daarvan. Daar is egter nog 2 punte wat in ag geneem moet word wanneer die algoritme geïmplementeer word:
- Metodes kan oorvleuel in die kandidate wat hulle herwin.
- In sommige gevalle sal dit korrek wees om een metode twee keer met verskillende parameters te neem, en die kandidaat-uitset van die eerste sal nie 'n subset van die tweede wees nie.
Byvoorbeeld, as ons die implementering van die "wat ek reeds gekoop het" metode met verskillende intervalle neem vir herwinning, dan sal hul stelle kandidate in mekaar geneste wees. Terselfdertyd bied verskillende parameters in "periodieke aankope" by die uitgang nie volledige kruising nie. Daarom verdeel ons die steekproefmetodes met verskillende parameters in blokke sodat ons uit elke blok hoogstens een ekstraksiebenadering met spesifieke hiperparameters wil volg. Om dit te doen, moet jy 'n bietjie slim raak in die implementering van die rugsakprobleem, maar die asimptotika en die resultaat sal nie verander nie.
Hierdie slim kombinasie stel ons in staat om die volgende maatstawwe te kry in vergelyking met bloot samewerkende modelle:

In die finale maatstawwe sien ons die volgende prentjie:

Hier kan jy egter opmerk dat daar een onbedekte punt is vir aanbevelings wat nuttig is vir besigheid. Nou het ons pas geleer hoe om 'n goeie werk te doen om te voorspel wat die gebruiker byvoorbeeld volgende week gaan koop. Maar om bloot afslag te gee op iets wat hy reeds gaan koop, is nie baie cool nie. Maar dit is gaaf om die verwagting, byvoorbeeld, van die volgende maatstawwe te maksimeer:
- Marge/omset gebaseer op persoonlike aanbevelings.
- Gemiddelde kliënt tjek.
- Frekwensie van besoeke.
Ons vermenigvuldig dus die verkrygde waarskynlikhede met verskillende koëffisiënte en herrangskik hulle sodat die produkte wat die metrieke hierbo beïnvloed, boaan kom. Daar is geen klaargemaakte oplossing vir watter benadering die beste is om te gebruik nie. Ons eksperimenteer selfs met sulke koëffisiënte direk in produksie. Maar hier is interessante tegnieke wat ons meestal die beste resultate gee:
- Vermenigvuldig met die prys/marge van die produk.
- Vermenigvuldig met die gemiddelde kwitansie waarin die produk verskyn. So kom goedere op, waarmee hulle gewoonlik iets anders vat.
- Vermenigvuldig met die gemiddelde frekwensie van besoeke deur kopers van hierdie produk, gebaseer op die hipotese dat hierdie produk mense uitlok om meer gereeld daarvoor terug te keer.
Nadat ons eksperimente met koëffisiënte uitgevoer het, het ons die volgende metrieke in produksie verkry:

Hier algehele produkte omskakeling — die aandeel van gekoopte produkte uit alle produkte in die aanbevelings wat ons gegenereer het.
'n Oplettende leser sal 'n beduidende verskil tussen vanlyn en aanlyn statistieke opmerk. Hierdie gedrag word verklaar deur die feit dat nie alle dinamiese filters vir produkte wat aanbeveel kan word, in ag geneem kan word wanneer die model opgelei word nie. Vir ons is dit 'n normale storie wanneer die helfte van die opgespoorde kandidate uitgefiltreer kan word hierdie spesifisiteit is tipies in ons bedryf.
In terme van inkomste word die volgende storie verkry, dit is duidelik dat na die bekendstelling van aanbevelings, die inkomste van die toetsgroep sterk groei, nou is die gemiddelde toename in inkomste met ons aanbevelings 3-4%:

Ten slotte wil ek sê dat as u nie-intydse aanbevelings nodig het, 'n baie groot toename in kwaliteit gevind kan word in eksperimente met die onttrekking van kandidate vir aanbevelings. 'n Groot hoeveelheid tyd vir hul generasie maak dit moontlik om baie goeie metodes te kombineer, wat in totaal goeie resultate vir die besigheid sal gee.
Ek sal bly wees om in die kommentaar te gesels met enigiemand wat die materiaal interessant vind. Jy kan my persoonlik vrae vra by . Ek deel ook my gedagtes oor KI/startups in my - welkom :)
Bron: will.com
