Hamıya salam! Mənim adım Sasha, mən LoyaltyLab-da CTO və əsas təsisçiyim. İki il öncə dostlarımla, bütün kasıb tələbələr kimi, axşam evin yaxınlığındakı dükanlardan birində pivə alırdıq. Biz çox təəssüflənirdik ki, pərakəndə satıcı, biz pivə almağa gələcəyimizi bilərək, chips və ya krakerlər üçün endirim təklif etmir, halbuki bu çox məntiqlidir! Niyə bu cür vəziyyət yaşandığını başa düşmədik və öz şirkətimizi yaratmağa qərar verdik. Həm də bonus olaraq hər cümə həmin chips-lər üçün özümüzə endirim yazmaq.

Və hər şey o yerə çatdı ki, məhsulun texniki tərəfi ilə bağlı materialla də iştirak edirəm. Biz icma ilə paylaşmağı sevirik, ona görə də mən təqdimatımı məqalə şəklində paylaşırıq.
Giriş
Hər şeyin əvvəlində olduğu kimi, biz tövsiyə sistemlərinin necə yaradıldığını izah edən məruzədən başladıq. Və ən populyar arxitektur bu cür oldu:

Bu iki hissədən ibarətdir:
- Sadə və sürətli model ilə tövsiyələr üçün seçim aparılması, adətən, əməkdaşlıq modelidir.
- Namizədlərin reytinqi daha mürəkkəb və yavaş məzmun modelidir, bütün mümkün atributları əsas götürərək.
Buradan etibarən aşağıdakı terminlərdən istifadə edəcəyəm:
- candidate/kandidatı tövsiyələr üçün — user-product cütlüyü, potensial olaraq istehsalda tövsiyələrə daxil edilə bilər.
- candidates extraction/extractor/namizədlərin çıxarılması metodu — mövcud məlumatlara görə “tövsiyələr üçün namizədlərin” çıxarılması prosesi və ya metodu.
İlk addım adətən müxtəlif əməkdaşlıq filtrindən istifadə edilir. Ən populyar olanı — . Şaşırtıcıdır ki, tövsiyə sistemləri ilə bağlı əksər məqalələr yalnız əməkdaşlıq modellərinin ilk mərhələsindəki müxtəlif təkmilləşdirmələri əhatə edir, lakin digər seçim metodları ilə bağlı demək olar ki, heç kim danışmır. Bizim üçün yalnız əməkdaşlıq modelləri və onlarla müxtəlif optimizasiyalarla yanaşma gözlədiyimiz keyfiyyəti təmin etmədi, buna görə də biz bu sahə üzrə araşdırmalarla məşğul olduq. Və məqalənin sonunda ALS-ni necə yaxşılaşdırdığımızı göstərəcəyəm, bu bizim əsas bazamız oldu.
Öz yanaşmamı təsvir etməyə başlamazdan əvvəl, real vaxtda tövsiyələr edərkən, son 30 dəqiqə ərzində baş verən məlumatları nəzərə almağın vacib olduğunu qeyd etmək lazımdır; əslində, tələb olunan vaxt ərzində işləyə biləcək bir neçə yanaşma var. Lakin bizim vəziyyətimizdə, tövsiyələri gündə bir dəfə dəfədən çox toplamaq lazım gəlmir, əksər hallarda isə həftədə bir dəfə toplanır, bu da bizə mürəkkəb modellərdən istifadə etməyə və keyfiyyəti xeyli artırmağa imkan tanıyır.
ALS-nin namizədlərin çıxarılması problemi üçün yalnız göstəriciləri hansı əsas kimi qəbul edəcəyimizi götürək. İzlədiyimiz əsas göstəricilər bunlardır:
- Dəqiqlik — nümunə götürülmüş müştərilərin düzgün seçilmiş namizədlərinin faizi.
- Xatırlama — hədəf aralığında reallıqda olan namizədlərin baş vermə faizidir.
- F1-score — əvvəlki iki punkt üzərində hesablanmış F-məra.
Eyni zamanda, gradient boosting ilə əlavə məzmun xüsusiyyətləri ilə təlimdən sonra son modelin göstəricilərini də izləyəcəyik. Burada da 3 əsas göstərici var:
- precision@5 — hər müştəri üçün ən yüksək ehtimal olan 5 məhsuldan olan orta isabet faizi.
- response-rate@5 — mağaza ziyarətindən ən az bir şəxsi təklifin satın alınmasına olan müştəri konversiyası (bir təklifdə 5 məhsul).
- avg roc-auc per user — orta hər müştəri üzrə.
Qeyd etmək lazımdır ki, bütün bu göstəricilər , yəni təlim ilk k həftlərdə baş verir, test məlumatları isə k+1 həftəni əhatə edir. Beləliklə, mövsümi artım/azalma modelin keyfiyyətinin interpretasiyasına minimal təsir edir. Sonrakı bütün qrafiklərdə xətti ox kross-validasiyadakı həftənin nömrəsini, ordinat oxu isə göstərilən göstəricinin dəyərini ifadə edir. Bütün qrafiklər bir müştərinin tranzaksiya məlumatları üzərində qurulub ki, müqayisə edərkən düzgün olsun.
Yanaşmamızı təsvir etməyə başlamazdan əvvəl əvvəlcə, ALS modelini təmsil edən baseline-ə baxmalıyıq.
Namizəd çıxarılması göstəriciləri:

Son göstəricilər:

Mən bütün algoritmin icrasını müəyyən bir biznes hipotezi kimi qiymətləndirirəm. Beləliklə, çox ümumi şəkildə, hər cür kooperativ modelləri “insanlar oxşar insanlar tərəfindən satın alınanları alırlar” hipotezi kimi nəzərdən keçirmək olar. Daha əvvəl qeyd etdiyim kimi, yalnız bu semantika ilə məhdudlaşmadıq, burada offline pərakəndə satışda mükəmməl işləyən bəzi hipotezlər var:
- Artıq əvvəlki dövrlərdə alınıb.
- Əvvəlki alınılanlarla oxşar.
- Daha uzun müddət əvvəl alınmış məhsul.
- Kateqoriya/brend üzrə məşhur olanlar.
- Həftədən həftəyə fərqli məhsulların sırayla alışı (Markov zəncirləri).
- Alıcıların, müxtəlif modellərlə (Word2Vec, DSSM və s.) qurulmuş xüsusiyyətlərə əsasən oxşar məhsulları.
Əvvəlki satın almalar
Məhsul pərakəndəsində çox yaxşı işləyən açıq bir yoludur. Burada biz, loyal müştəri üçün son K gün ərzində (adətən 1-3 həftə) və ya bir il əvvəlin K gün ərzində alınan bütün məhsulları hesablayırıq. Yalnız bu üsulu tətbiq etməklə, aşağıdakı göstəriciləri əldə edirik:

Burada aydındır ki, müddət uzandıqca xatırlama artır, dəqiqlik isə azalır və əksinə. Müştərilər üzrə ortalama daha yaxşı nəticələr “son 2 həftə” verir.
Əvvəlcə alınanlarla oxşar.
Məhsul pərakəndə satışında "nə aldım" prinsipi yaxşı işləməsi təəccüblü deyil, amma istifadəçinin əvvəlcə aldığı məhsullardan yalnız namizədləri çıxarmaq çox da effektiv deyil, çünki müştərini yeni bir məhsulla təəccübləndirmək çətin olacaq. Bu səbəbdən, bu heuristikayı bir az inkişaf etdirərək eyni əməkdaşlıq modellərindən istifadə etməyi təklif edirik. ALS zamanı əldə etdiyimiz vektorlardan istifadə edərək istifadəçinin artıq aldığı məhsullara bənzər məhsulları tənqid edə bilərik. Bu ideya, video məzmun xidmətlərindəki "bənzər videolar" bölməsi ilə çox oxşardır, amma biz konkret anlarda istifadəçinin nə yediyini/aldığını bilmədiyimiz üçün yalnız onun artıq aldığı məhsullara bənzərləri axtarmaq qalır, üstəlik, bunun necə yaxşı işlədiyinə dair özümüzdə məlumat var. İstifadəçilərin son iki həftə ərzində keçirdiyi əməliyyatlara belə bir metod tətbiq etdiyimiz zaman aşağıdakı metrikləri alırıq:

Burada kgpoalloyaml — Son 14 gün ərzində hər bir müştərinin aldığı məhsul üçün çıxarılan bənzər məhsul sayı.
Bu yanaşma bizim üçün, istifadəçinin alış tarixində daha əvvəl olan məhsulları tövsiyə etməmək kritik olan müştəri üzərində çox yaxşı işlədi.
Köhnə alış müddəti
Artıq məlumdur ki, məhsulların yüksək alış tezliyi sayəsində ilk yanaşma bizim spesifikamıza yaxşı uyğun gəlir. Amma yuyucu toz/şampun və s. kimi məhsullar üçün nə etmək lazımdır? Yəni, belə məhsullar, hər həftə-iki həftədən bir lazım olmaması nadirdir və əvvəlki metodların çıxara bilmədikləri məhsullardır. Buradan gələn növbəti fikir — hər bir məhsulun alış müddətini, onu daha çox alan müştərilər arasında ortalama olaraq hesablayırıq. kgpoalloyaml Sonra, müştərinin artıq bitdiyi ehtimal olunan məhsulları çıxarmaq. Hesablanmış məhsul müddətlərini gözlə yoxlamaq olar:

Sonra, məhsulun müddətinin sonunun, tövsiyələrin istehsalatda olduğunu bilən vaxt intervalına düşüb-düşmədiyini görməliyik və uyğun olanları səmpləşdirməliyik. Bu yanaşmanı belə təsvir etmək mümkündür:

Burada iki əsas vəziyyət var ki, onları nəzərdən keçirə bilərik:
- Müştərilərə, məhsulu K dəfədən az almış olan məhsulları səmpləşdirmək lazım mı?
- Məhsulun müddətinin sonu, hədəf intervalının başlanğıcından əvvəl düşürsə, məhsulu səmpləşdirmək lazım mı?
Sonra-grafikdə bu metodun müxtəlif hiperparametrlərlə necə nəticələr verdiyi görünür:

ft — Yalnız məhsulu K (burada K=5) dəfədən çox alan müştəriləri seçmək
tm — Yalnız hədəf intervalında yer alan namizədləri seçmək
Təəccüblü deyil ki, bu vəziyyətdə (0, 0) ən böyük recall və ən kiçik precision, çünki bu şərtlə daha çox namizəd çıxarılır. Ancaq ən yaxşı nəticələr, konkret bir məhsulu almış müştərilər üçün məhsulları nümunə götürmədiyimiz halda əldə edilir. kgpoalloyaml və bəzi məhsulları çıxarırıq, dövrün sonu hədəf intervalına düşür.
Kateqoriya üzrə məşhurlar
Bir başqa açıq ideya, fərqli kateqoriyalar və ya brendlər üzrə populyar məhsulları nümunə götürməkdir. Burada hər bir müştəri üçün top-k “sevimli” kateqoriyaları/brendləri hesablayırıq və bu kateqoriyadan/brendən “məşhur” məhsulları çıxarırıq. Bizim halda “sevimli” və “məşhur” ifadələrini məhsul satışlarının sayına görə müəyyən edəcəyik. Bu yanaşmanın əlavə bir üstünlüyü, soyuq başlanğıc vəziyyətində tətbiq oluna bilməsidir. Yəni, az sayda alışveriş edən və ya uzun müddət dükanlarda olmayan müştərilər üçün, ya da ümumiyyətlə, sadəcə loyalit kartı tərtib edən müştərilər üçün. Onlara mövcud müştəri tarixçəsi olan alıcılarda populyar məhsulları tövsiyə etmək daha asan və effektivdir. Əldə edilən metriklər aşağıdakılardır:

Burada “category” sözündən sonra olan rəqəm, kateqoriyanın dərinlik səviyyəsini ifadə edir.
Ümumiyyətlə, daha dar kateqoriyaların, müştərilər üçün daha dəqiq “sevimli” məhsullar çıxardığını görməmək də təəccüblü deyil.
Hər həftə fərqli məhsul alışları
Qət edici sistemlər haqqında məqalələrdə görmədiyim maraqlı bir yanaşma — Markov zəncirləri ilə sadə və eyni zamanda işlək statistik metod. Burada 2 fərqli həftəni götürürük, sonra hər müştəri üzrə məhsul cütlükləri qururuq. [i həftəsində alıb]-[j həftəsində alıb], burada j > i, buradan sonra hər bir məhsulun növbəti həftədə başqa bir məhsula keçmə ehtimalını hesablayaq. Yəni, hər cüt məhsul üçün producti-productj -in tapılmış cütlüklərdəki sayını hesablayırıq və producti -nin birinci həftədə olduğu cütlük sayına bölürük. Namizəd məhsulları çıxarmaq üçün müştərinin son çeki götürülür və top-k keçid matrisindən ən ehtimal olunan növbəti məhsulları əldə edirik. Keçid matricinin tərtibi prosesi belə görünür:

Keçid ehtimal matrisindəki faktiki nümunələrdən belə maraqlı hadisələri görürük:

Burada müştəri davranışında ortaya çıxan maraqlı asılılıqları müşahidə etmək mümkündür: məsələn, sitrus meyvələrini sevənlər və ya digər brendin südü, buna keçmək ehtimalı yüksəkdir. Həmçinin, təkrar alımın yüksək olduğu məhsullar, məsələn, yağ, burada olduğu üçün də təəccüblü deyil.
Markov zəncirləri metodundakı metriklər aşağıdakılardır:

kgpoalloyaml — müştərinin son tranzaksiyası ilə alınan hər bir məhsul üçün çıxarılan məhsul sayı.
Gördüyümüz kimi, ən yaxşı nəticə k=4 olan konfiqurasiya göstərir. 4-cü həftədəki sıçrayışı bayram günlərində mövsümi davranışla izah etmək olar.
Müxtəlif modellərlə qurulmuş xüsusiyyətlərə əsaslanaraq müştərilərə oxşar məhsullar
İndi biz ən çətin və maraqlı hissəyə — müştəri və məhsul vektorlarının yaxın qonşularını tapmağa gəldik, müxtəlif modellər əsasında qurulmuş. İşimizdə biz 3 belə model istifadə edirik:
- ALS
- Word2Vec (bu cür tapşırıqlar üçün Item2Vec)
- DSSM
ALS ilə artıq tanışıq, onun necə öyrəndiyi haqqında oxumaq olar . Word2Vec ilə bağlı, biz bütün dünyada tanınmış modelin tətbiqini istifadə edirik gensim. Mətndə olduğu kimi, biz bir cümləni alış-veriş qəbzi kimi təyin edirik. Beləliklə, məhsul vektoru qurarkən model, qabzdəki məhsul əsasında onun "konteksti"ni (qabzdəki digər məhsullar) proqnozlaşdırmağı öyrənir. E-ticarət məlumatları üçün daha yaxşıdır ki, qəbz əvəzinə müştəri sessiyasını istifadə edək, bununla bağlı Ozon-dan uşaqlar mükəmməl yazdılar. . DSSM-nin analizi daha maraqlıdır. Əslində, onu Microsoft-dan olan uşaqlar yazdılar, axtarış üçün model kimi, . Modelin arxitekturası belə görünür:

Burada Q — sorğu, istifadəçinin axtarış sorğusu, D[i] — dokument, internet səhifəsi. Modelə sorğu və səhifələrin xüsusiyyətləri daxil olur. Hər bir giriş qatından sonra bir neçə tam bağlı qat (çox qatlı perceptron) olur. Sonra model, son qatlarda əldə olunan vektorlar arasında kosinusun minimallaşdırılmasını öyrənir.
Tövsiyə tapşırıqlarında dəqiq eyni arxitektura istifadə edilir, yalnız sorğu əvəzinə istifadəçi, səhifələr əvəzinə isə məhsullar var. Və bizim halda bu arxitektura aşağıdakı şəkildə dəyişir:

İndi nəticələrin yoxlanması üçün son bir mətni tamamlamalıyıq — əgər ALS və DSSM vəziyyətində istifadəçi vektorları açıq şəkildə müəyyənləşdirilmişsə, Word2Vec ilə yalnız məhsul vektorlarına sahibik. Burada istifadəçi vektorunu qurmaq üçün 3 əsas yanaşma müəyyən etdik:
- Vektorları sadəcə toplamaq, beləcə kosinus məsafəsi üçün müştəri tarixindəki məhsulları sadəcə ortalamağa bərabər olacaq.
- Zaman üzrə müəyyən ağırlıqlı vektorların cəmlənməsi.
- Məhsulları TF-IDF koeffisiyenti ilə ağırlıqlandırmaq.
Xətti ağırlıqlandırma ilə müştəri vektorunun qurulması zamanı,biz istifadəçinin dünən aldığı məhsulun, altı ay əvvəl aldığı məhsuldan daha çox onun davranışına təsir etdiyinə inanırıq. Beləliklə, müştərinin keçən həftəsini 1 koeffisiyenti ilə,bundan sonrakı müddətlərdə isə ½, ⅓ və s. koeffisiyentləri ilə nəzərə alırıq:

TF-IDF koeffisiyentləri üçün biz, mətnlərdəki TF-IDF üçün etdiyimiz eyni şeyləri edirik, yalnız ki, alıcı bir sənəd, çeki isə təklif hesab edirik, müvafiq olaraq, söz — məhsuldur. Beləliklə, istifadəçi vektoru nadir məhsullara doğru daha çox hərəkət edəcək, tez-tez və alıcı üçün tanış məhsullar onu xüsusilə dəyişdirməyəcək. Yanaşmanı belə izah etmək olar:

İndi ölçülərə baxaq. ALS nəticələri belə görünür:

Item2Vec-in müxtəlif variantları ilə alıcı vektoru üzrə ölçülər:

Bu halda, bizim bazasımızda istifadə olunan eyni modeldən istifadə edilir. Yeganə fərq, hansı k istifadə edəcəyimizdir. Tətbiq sahəsi yalnız kolaborativ modellərlə məhdudlaşdıqda, hər alıcı üçün təxminən 50-70 ən yaxın məhsul götürmək lazım gəlir.
Və DSSM üzrə ölçülər:

Bütün metodları necə birləşdirmək olar?
Siz deyə bilərsiniz, bu çox gözəl, amma namizədləri çıxarmaq üçün bu qədər böyük alət dəst ilə nə etməliyik? Öz məlumatlarınıza uyğun optimallaşdırma konfiqurasiyasını necə seçmək olar? Burada bir neçə vəzifəmiz var:
- Hər metod üçün hiperparametr axtarış sahəsini necə məhdudlaşdırmalıyıq? Şübhəsiz ki, bu, hər yerdə diskret olsa da, mümkün olan nöqtələrin sayı çoxdur.
- Müəyyən metodlar və xüsusi hiperparametrlərlə məhdud seçkidən öz ölçünüzə uyğun ən yaxşı konfiqurasiyanı necə əldə etmək olar?
İlk sualın tam doğru cavabını hələ tapmamışıq, ona görə də aşağıdakıların üstündə dayanırıq: hər metod üçün bəzi statistikalar üzrə nəzərdə tutulmuş hiperparametr axtarış sahəsi məhdudlaşdırıcı yazılmışdır. Beləliklə, insanların alış-verişləri arasında orta dövrü bilmək sayəsində “nə alınıb” və “uzun müddət əvvəlki alış” metodlarının hansı dövrlə istifadə olunacağını proqnozlaşdıra bilərik.
Və bir qədər ədalətli müxtəlif metodların sayı ilə sınaqdan keçirdikdən sonra, aşağıdakıları qeyd edəcəyik: hər bir icra müəyyən sayda namizəd çıxarır və bizim üçün açar olan metrikanın (recall) bir dəyəri var. Ümumilikdə, maksimum mümkün metrikaya malik, hesablama güclərimizdən asılı olan müəyyən bir sayda namizəd əldə etməyi istəyirik. Burada məsələ gözəl şəkildə çanta problemi ilə birləşir.

Burada namizədlərin sayı — ingotun çəkisi, metodun recall-u isə onun dəyəridir. Ancaq algoritmin icrasında əlavə etməli olduğumuz 2 məqam daha var:
- Metodların çıxardığı namizəd cəmlərində üst-üstə düşmə ola bilər.
- Bəzən bir metodu iki dəfə fərqli parametrlərlə almaq düzgün olacaqdır və birincinin nəticəsi ikinci ilə alt dəst olmayacaq.
Məsələn, "artıq satın alınmış şeylər" metodunun müxtəlif çıxarma intervalları ilə tətbiqini götürsək, onların bir çox namizədləri bir-birinə daxil edilir. Eyni zamanda, "müntəzəm satınalmalar" da çıxışda tam kəsişmə vermir. Buna görə də, müxtəlif parametrlərlə nümunə alınma metodlarını bloklara bölürük ki, hər blokdan müəyyən hiperparametrlərlə bir çıxarma yanaşmasını götürmək istəyirik. Bunun üçün çantanın problemi ilə bağlı tapşırığın icrasında bir az fəndgir olmaq lazımdır, amma asimptotik və nəticə bundan dəyişməz.
Belə ağıllı bir kombinasiyanın müqayisə ilə sadəcə kollaborativ modellərdən əldə etdiyimiz metrikalar:

Son metrikalar üzrə aşağıdakı mənzərəni görürük:

Amma burada bir məsələnin hələ də üzə çıxmadığını görmək mümkündür ki, bu da biznes üçün faydalı tövsiyələrdir. İndi biz sadəcə istifadəçinin məsələn, gələn həftə nə alacağını möhtəşəm proqnozlaşdırmağı öyrənmişik. Lakin istifadəçinin həmçinin alacağına endirim vermək o qədər də maraqlı deyil. Bunun əvəzinə, məsələn, növbəti metrikaları maksimizasiya etmək fantastikdir:
- Şəxsi tövsiyələr üçün marja/mallar dövriyyəsi.
- Alıcıların ortalama çeki.
- Ziyarətlərin tezliyi.
Beləliklə, əldə olunan ehtimalları müxtəlif koeffisiyentlərlə vuraraq onların sıralamasını dəyişdiririk ki, ən yuxarıda daha yüksək metrikalara təsir edən məhsullar olsun. Hər hansı bir yanaşmanın daha yaxşı olduğunu göstərən hazır bir həll yoxdur. Hətta biz də bu cür koeffisiyentləri istehsalata birbaşa sınaqdan keçiririk. Amma burada ən yaxşı nəticələr verən maraqlı üsullar var:
- Məhsulun qiymətinə/marjasına vurmaq.
- Məhsulun olduğu ortalama çeki vurmaq. Bu şəkildə yuxarıda digər bir şey alan məhsullar görünəcək.
- Bu məhsula görə alıcıların ortalama ziyarət tezliyinə vurmaq, həmin məhsulun daha tez geri dönməni tetiklediği hipotezindən yola çıxaraq.
Koeffisiyentlərlə təcrübələr apardıqdan sonra, istehsatda aşağıdakı metrikaları əldə etdik:

Burada ümumi məhsul konversiyası — yaradılan tövsiyələrdən satın alınan məhsulların nisbəti.
Diqqətli oxucu, offline və online metrikalar arasında əhəmiyyətli fərq gördüyünü başa düşəcək. Bu cür davranış, tövsiyə olunan mallar arasında nəzərə alınması çətin olan dinamik filtrələrin modelin öyrədilməsi zamanı hesablanmalıdır. Bizim üçün normal bir vəziyyətdir ki, çıxarılan namizədlərin yarısı süzgəcdən keçirilə bilər, bu isə bizim sahəmizə məhsuldar bir spesifikadır.
Gəlirə gəldikdə, aşağıdakı vəziyyət yaranır, görünür ki, tövsiyələrin istifadəyə verilməsindən sonra sınaq qrupunda gəlir xeyli yüksəlir, hal-hazırda bizim tövsiyələrlə ortalama gəlir artımı 3-4%-dir:

Nəticə olaraq demək istəyirəm ki, əgər sizə real vaxtda tövsiyələr lazımdırsa, o zaman tövsiyələr üçün namizədlərin çıxarılması ilə təcrübələr aparmaqda keyfiyyətdə çox böyük artım var. Onların generasiyası üçün çox vaxt vermək, bir çox yaxşı metodları birləşdirməyə imkan tanıyır ki, bu da biznes üçün möhtəşəm nəticələr verir.
Maraqlı hesab edən hər kəslə şərhlərdə ünsiyyət qurmağı çox sevinirəm. Sualları mənə şəxsi olaraq ünvanlaya bilərsiniz . Həmçinin AI/başlanğıclar haqqında fikirlərimi özümün — xoş gəlmisiniz 🙂
Mənbə: habr.com
