Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле

Ўсім прывітанне! Мяне клічуць Саша, я CTO & Co-Founder у LoyaltyLab. Два гады таму я з сябрамі, як і ўсе бедныя студэнты, хадзіў увечары за півам у бліжэйшую краму каля дома. Нас вельмі засмучала, што рытэйлер, ведаючы, што мы прыйдзем за півам, не прапануе скідку на чыпсы або сухарыкі, хоць гэта так лагічна! Мы не зразумелі, чаму такая сытуацыя адбываецца і вырашылі зрабіць сваю кампанію. Ну і як бонус выпісваць сабе скідкі кожную пятніцу на тыя самыя чыпсы.

Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле

І дайшло ўсё да таго, што з матэрыялам па тэхнічным боку прадукта я выступаю на NVIDIA GTC. Мы рады дзяліцца напрацоўкамі з кам'юніці, таму я выкладваю свой даклад у выглядзе артыкула.

Увядзенне

Як і ўсё ў пачатку шляху, мы стартанулі з агляду таго, як робяцца рэкамендацыйныя сістэмы. І самай папулярнай аказалася архітэктура наступнага тыпу:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле

Яна складаецца з дзвюх частак:

  1. Сэмпляванне кандыдатаў для рэкамендацый простай і хуткай мадэллю, звычайна калабаратыўнай.
  2. Ранжыраванне кандыдатаў больш складанай і павольнай кантэнтнай мадэллю з улікам усіх магчымых прыкмет у дадзеных.

Тут і далей буду выкарыстоўваць наступныя тэрміны:

  • candidate/кандыдат для рэкамендацый - пара user-product, якая патэнцыйна можа патрапіць у рэкамендацыі ў прадакшн.
  • candidates extraction/extractor/метад вымання кандыдатаў - працэс або метад вымання "кандыдатаў для рэкамендацый" па наяўных дадзеных.

На першым кроку звычайна выкарыстоўваюць розныя варыяцыі калабаратыўнай фільтрацыі. Самая папулярная - ALS. Дзіўна, што большасць артыкулаў пра рэкамендацыйныя сістэмы раскрываюць толькі розныя паляпшэнні калабаратыўных мадэляў на першым этапе, але пра іншыя метады сэмпліравання асоба ніхто не распавядае. Для нас падыход з выкарыстаннем толькі калабаратыўных мадэляў і розных аптымізацый з імі не спрацаваў з якасцю, якія мы чакалі, таму мы закапаліся ў даследаванні канкрэтна па гэтай частцы. А ў канцы артыкула я пакажу, наколькі мы змаглі палепшыць ALS, які быў для нас baseline'ам.

Перад тым, як я перайду да апісання нашага падыходу, важна адзначыць, што пры realtime рэкамендацыях, калі нам важна ўлічваць дадзеныя, якія адбыліся 30 хвілін таму, сапраўды не так шмат падыходаў, якія могуць працаваць за патрэбны час. Але, у нашым выпадку, збіраць рэкамендацыі даводзіцца не часцей, чым раз у дзень, а ў большасці выпадкаў - раз у тыдзень, што дае нам магчымасць выкарыстоўваць складаныя мадэлі і кратна павысіць якасць.

Возьмем за baseline тое, якія метрыкі паказвае толькі ALS на задачы вымання кандыдатаў. Ключавыя метрыкі, за якімі мы сочым, наступныя:

  • Precision - доля правільна падабраных кандыдатаў з насэмпляваных.
  • Recall - доля якія здарыліся кандыдатаў з тых, якія рэальна былі ў target інтэрвале.
  • F1-score - F-мера, разлічаная на папярэдніх двух пунктах.

Таксама будзем глядзець на метрыкі фінальнай мадэлі пасля навучання градыентнага бустынгу з дадатковымі кантэнтнымі прыкметамі. Тут таксама 3 асноўныя метрыкі:

  • precision@5 - сярэдняя доля траплення тавараў з топ-5 па верагоднасці па кожным пакупніку.
  • response-rate@5 — канверсія пакупнікоў з візіту ў краму ў набыццё хаця б адной персанальнай прапановы (у адной прапанове 5 тавараў).
  • avg roc-auc per user - сярэдні roc-auc па кожным пакупніку.

Важна адзначыць, што ўсе названыя метрыкі вымяраюцца на time-series крос-валідацыі, гэта значыць навучанне адбываецца на першых k тыднях, а ў якасці test дадзеных бярэцца k+1 тыдзень. Такім чынам сезонныя ўзлёты/падзенні мінімальна адбіваліся на інтэрпрэтацыі якасці мадэляў. Далей на ўсіх графіках вось абсцыс будзе азначаць нумар тыдня ў крос-валідацыі, а вось ардынат - значэнне названай метрыкі. Усе графікі пабудаваны на транзакцыйных дадзеных аднаго кліента, каб параўнанне паміж сабой было карэктным.

Перад тым, як пачаць апісваць наш падыход, спачатку паглядзім на baseline, які ўяўляе з сябе навучаную ALS мадэль.
Метрыкі па выманні кандыдатаў:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле

Фінальныя метрыкі:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле

Я стаўлюся да ўсіх рэалізацый алгарытмаў, як да некаторай бізнес гіпотэзе. Такім чынам, вельмі грубіянска, любыя калабаратыўныя мадэлі можна разглядаць, як гіпотэзу, што "людзі схільныя купляць тое, што купляюць падобныя на іх людзі". Як я ўжо казаў, толькі такой семантыкай мы не абмежаваліся і вось, якія гіпотэзы яшчэ крута працуе на дадзеных у афлайн рытэйле:

  1. Што ўжо купляў раней.
  2. Падобнае на тое, што купляў раней.
  3. Перыяд даўно якая прайшла пакупкі.
  4. Папулярнае па катэгорыях / брэндах.
  5. Пачарговыя пакупкі розных тавараў ад тыдня да тыдня (ланцугі Маркава).
  6. Падобныя тавары на пакупнікоў, па характарыстыках, пабудаваным рознымі мадэлямі (Word2Vec, DSSM, etc.).

Што купляў раней

Самая відавочная эўрыстыка, якая вельмі добрае працуе ў прадуктовым рытэйле. Тут мы бярэм усе тавары, якія ўладальнік карты лаяльнасці купляў за апошнія K дзён (звычайна 1-3 тыдні), альбо K дзён за год таму. Ужыўшы толькі такі метад, атрымліваем наступныя метрыкі:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле

Тут цалкам відавочна, што чым больш мы бярэм перыяд, тым больш у нас recall і менш precision і наадварот. Лепш вынікі ў сярэднім па кліентах дае "апошнія 2 тыдні".

Падобнае на тое, што купляў раней

Не дзіўна, што для прадуктовага рытэйла "што купляў раней" працуе добра, але здабываць кандыдатаў толькі з таго, што карыстач ужо купляў не вельмі крута, таму што так здзівіць пакупніка нейкім новым таварам ці наўрад атрымаецца. Таму прапануем крыху ўдасканалім гэтую эўрыстыку з дапамогай тых жа калабаратыўных мадэляў. З вектараў, якія мы атрымалі падчас навучання ALS, можна дастаць падобныя тавары на тое, што карыстач ужо купляў. Такая ідэя вельмі падобная на "падобныя ролікі" у сэрвісах па праглядзе відэакантэнту, але так як мы не ведаем, што ў пэўны момант есць / купляе юзэр, нам застаецца толькі шукаць падобнае толькі да таго, што ён ужо купляў, тым больш, што мы ужо ведаем, наколькі гэта добра працуе. Ужыўшы такі метад на транзакцыях карыстальнікаў за апошнія 2 тыдні атрымліваем наступныя метрыкі:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле

Тут k - колькасць падобных тавараў, якія здабываюцца на кожны набыты пакупніком тавар за апошнія 14 дзён.
Гэты падыход у нас асабліва добра спрацаваў на кліенце, якому было крытычна зусім не рэкамендаваць тое, што ўжо было ў гісторыі пакупак карыстальніка.

Перыяд даўно якая прайшла пакупкі

Як мы ўжо высветлілі, з-за высокай перыядычнасці пакупкі тавараў першы падыход добра працуе на нашай спецыфіцы. Але што рабіць з таварамі, тыпу пральны парашок/шампунь/тд. Гэта значыць, з такімі прадуктамі, якія наўрад ці патрэбныя кожныя тыдзень-два і якія папярэднія метады не могуць атрымаць. Адсюль выцякае наступная ідэя - прапануецца вылічаць перыяд пакупкі кожнага тавару ў сярэднім па пакупнікам, якія набывалі тавар больш k раз. А далей здабываць тое, што хутчэй за ўсё ў пакупніка ўжо скончылася. Падлічаныя перыяды па таварах можна праверыць вачыма на адэкватнасць:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле

А далей будзем глядзець, ці пападае канец перыяду прадукта ў інтэрвал часу, калі рэкамендацыі будуць у прадакшн і сэмпляваць тое, што пападае. Праілюстраваць падыход можна так:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле

Тут у нас ёсць 2 асноўных кейса, якія можна разгледзець:

  1. Ці трэба сэмпляваць тавары пакупнікам, якія куплялі тавар менш, чым K разоў.
  2. Ці трэба сэмпляваць тавар, калі канец яго перыяду пападае да пачатку таргет інтэрвалу.

На наступным графіку відаць, якія вынікі дасягае такі метад з рознымі гіперпараметрамі:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле
ft - Браць толькі пакупнікоў, якія куплялі прадукт не менш K (тут K = 5) разоў
tm - Браць толькі кандыдатаў, якія трапляюць у таргет інтэрвал

Не дзіўна, што ў стане (0, 0) самы вялікі водгук і самы маленькі дакладнасць, бо пры такой умове здабываецца больш за ўсё кандыдатаў. Аднак лепшых вынікаў дасягае сітуацыя, калі мы не сэмплюем тавары для пакупнікоў, якія куплялі пэўны тавар менш k раз і здабываем у тым ліку тавары, канец перыяду якіх пападае да таргет інтэрвалу.

Папулярнае па катэгорыі

Яшчэ адна даволі відавочная ідэя - сэмпляваць папулярныя тавары па розных катэгорыях, альбо брэндах. Тут мы для кожнага пакупніка вылічаем топ-k "любімых" катэгорый / брэндаў і здабываем "папулярнае" з гэтай катэгорыі / брэнда. У нашым выпадку вызначым "любімыя" і "папулярныя" па колькасці пакупак тавара. Дадатковай перавагай гэтага падыходу з'яўляецца дастасавальнасць у кейсе халоднага старту. Гэта значыць для пакупнікоў, якія здзейснілі альбо вельмі мала пакупак, альбо даўно не былі ў краме, альбо ўвогуле толькі аформілі карту лаяльнасці. Для іх прасцей і лепш за ўсё накідваць тавары з папулярнага ў пакупнікоў з наяўнай гісторыяй. Метрыкі атрымліваюцца наступныя:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле
Тут лічба пасля слова "category" азначае ўзровень укладзенасці катэгорыі.

У цэлым, таксама не дзіўна, што лепшых вынікаў дасягаюць вузейшыя катэгорыі, бо здабываюць больш дакладныя "любімыя" тавары для пакупнікоў.

Пачарговыя пакупкі розных тавараў ад тыдня да тыдня

Цікавы падыход, які я не бачыў у артыкулах пра рэкамендацыйныя сістэмы - даволі просты і адначасова працоўны статыстычны метад ланцугоў Маркава. Тут мы бярэм 2 розныя тыдні, далей па кожным пакупніку будуем пары прадуктаў [купіў у тыдзень i]-[купіў у тыдзень j], дзе j > i, а адсюль лічым для кожнага тавара верагоднасць пераходу ў іншы тавар на наступным тыдні. Гэта значыць, для кожнай пары тавараў producti-productj лічым іх колькасць у знойдзеных парах і дзелім на колькасць пар, дзе producti быў на першым тыдні. Для вымання кандыдатаў бярэм апошні чэк пакупніка і дастаем топ-k найболей верагодных наступных тавараў з матрыцы пераходаў, якую мы атрымалі. Працэс пабудовы матрыцы пераходаў выглядае так:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле

З рэальных прыкладаў у матрыцы верагоднасцяў пераходаў бачым наступныя цікавыя з'явы:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле
Тут можна заўважыць цікавыя залежнасці, якія выяўляюцца ў спажывецкіх паводзінах: напрыклад, аматары цытрусаў ці брэнд малака, з якога з вялікай верагоднасці пераходзяць на іншы. Таксама не дзіўна, што тавары з вялікай частатой паўторных пакупак, як алей, таксама тут аказваюцца.

Метрыкі ў метадзе з ланцугамі Маркава атрымліваюцца наступныя:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле
k - Колькасць тавараў, якія здабываюцца на кожны набыты тавар з апошняй транзакцыі пакупніка.
Як мы бачым, найлепшы вынік паказвае канфігурацыя з k=4. Усплёск на 4 тыдні можна растлумачыць сезоннымі паводзінамі ў святочныя дні. 

Падобныя тавары на пакупнікоў, па характарыстыках, пабудаваным рознымі мадэлямі

Вось мы і падышлі да самай складанай і цікавай часткі - пошуку бліжэйшых суседзяў па вектарах пакупнікоў і прадуктаў, пабудаваных па розных мадэлях. У сваёй працы мы такіх мадэляў выкарыстоўваны 3:

  • ALS
  • Word2Vec (Item2Vec для такіх задач)
  • DSSM

З ALS мы ўжо разабраліся, пачытаць пра тое, як ён вучыцца можна тут. У выпадку з Word2Vec, мы выкарыстоўваем усім вядомую рэалізацыю мадэлі з gensim. Па аналогіі з тэкстамі, вызначаем прапанову, як чэк пакупкі. Такім чынам, пры пабудове вектара прадукта, мадэль вучыцца прадказваць па тавары ў чэку яго "кантэкст" (астатнія тавары ў чэку). У ecommerce дадзеных лепш замест чэка выкарыстоўваць сесію пакупніка, пра гэта крута напісалі хлопцы з азон. А DSSM разабраць цікавей. Першапачаткова яго напісалі хлопцы з Microsoft, як мадэльку для пошуку, тут можна пачытаць зыходны research paper. Архітэктура мадэлі выглядае так:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле

Тут Q - query, пошукавы запыт карыстальніка, D[i] - document, інтэрнэт-старонка. На ўваход мадэлі паступаюць прыкметы запыту і старонак, адпаведна. Пасля кожнага ўваходнага пласта ідзе некаторая колькасць полносвязных пластоў (multilayer perceptron). Далей мадэль вучыцца мінімізаваць косінус паміж вектарамі, якія атрымаліся ў апошніх пластах мадэлі.
У задачах рэкамендацый выкарыстоўваецца сапраўды такая ж архітэктура, толькі замест запыту ідзе карыстач, а замест старонак - тавары. І ў нашым выпадку такая архітэктура трансфармуецца ў наступнае:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле

Цяпер для праверкі вынікаў засталося пакрыць апошні момант - калі ў выпадку ALS і DSSM вектары карыстальнікаў у нас відавочна вызначаны, то ў выпадку з Word2Vec у нас ёсць толькі вектары тавараў. Тут для пабудовы вектара карыстальніка мы вызначылі 3 асноўныя падыходы:

  1. Проста скласці вектары, тады для косінуснай адлегласці атрымаецца, што мы проста асераднілі тавары ў пакупальніцкай гісторыі.
  2. Сумаванне вектараў з некаторым узважваннем па часе.
  3. Узважванне тавараў з TF-IDF каэфіцыентам.

У выпадку лінейнага ўзважвання вектара пакупніка мы зыходзім з гіпотэзы аб тым, што тавар, які карыстач купіў учора больш уплывае на яго паводзіны, чым тавар, які ён купіў паўгода назад. Так мы лічым папярэдні тыдзень пакупніка з каэфіцыентам 1, а тое, што было далей з каэфіцыентамі ½, ⅓, і тд.:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле

Для TF-IDF каэфіцыентаў мы робім роўна тое ж самае, што і ў TF-IDF для тэкстаў, толькі лічым пакупніка за дакумент, а чэк за прапанову, адпаведна, слова - тавар. Так вектар карыстальніка будзе больш зрушвацца ў бок рэдкіх тавараў, а частыя і звыклыя для пакупніка тавары яго змяняць асабліва не будуць. Праілюстраваць падыход можна так:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле

Цяпер паглядзім на метрыкі. Так выглядаюць вынікі ALS:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле
Метрыкі па Item2Vec з рознымі варыяцыямі пабудовы вектара пакупніка:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле
У дадзеным выпадку выкарыстоўваецца роўна тая ж мадэль, што і ў нашым baseline. Розніца толькі ў тым, якое мы будзем выкарыстоўваць. Для таго, каб выкарыстоўваць толькі калабаратыўныя мадэлі, даводзіцца браць каля 50-70 найбліжэйшых тавараў на кожнага пакупніка.

І метрыкі па DSSM:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле

Як аб'яднаць усе метады?

Класна, скажаце вы, але што рабіць з такім вялікім наборам прылад для вымання кандыдатаў? Як падабраць аптымальную канфігурацыю пад свае дадзеныя? Тут у нас узнікае некалькі задач:

  1. Трэба неяк абмежаваць прастору пошуку гіперпараметраў у кожным метадзе. Яно, вядома, дыскрэтнае ўсюды, але колькасць магчымых кропак вельмі вялікая.
  2. Як па невялікай абмежаванай выбарцы з пэўных метадаў з пэўнымі гіперпараметрамі падабраць лепшую канфігурацыю пад сваю метрыку?

Адназначна дакладнага адказу на першае пытанне мы пакуль не знайшлі, таму зыходзім з наступнага: пад кожны метад напісаны абмежавальнік прасторы пошуку гіперпараметраў у залежнасці ад некаторых статыстык па дадзеных, якія мы маем. Такім чынам, ведаючы сярэдні перыяд паміж пакупкамі ў людзей, мы можам меркаваць, з якім перыядам выкарыстоўваць метад "што ўжо куплялі" і "перыяд даўно якая прайшла пакупкі".

А пасля таго, як мы перабралі некаторую адэкватную колькасць варыяцый розных метадаў, заўважым наступнае: кожная рэалізацыя здабывае некаторую колькасць кандыдатаў і мае некаторае значэнне ключавой для нас метрыкі (recall). Мы хочам у суме атрымаць пэўную колькасць кандыдатаў, якая залежыць ад нашых дапушчальных вылічальных магутнасцей, з максімальна магчымай метрыкай. Тут задача хораша схлопваецца ў задачу аб заплечніку.
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле

Тут колькасць кандыдатаў - вага злітка, а recall метаду - яго каштоўнасць. Аднак ёсць яшчэ 2 моманты, якія варта закладваць пры рэалізацыі алгарытму:

  • У метадаў можа быць скрыжаванне ў кандыдатах, якія яны дастаюць.
  • У некаторых выпадках узяць адзін метад два разы з рознымі параметрамі будзе карэктна і кандыдаты на выхадзе з першага не будуць з'яўляцца падмноствам другога.

Напрыклад, калі ўзяць рэалізацыю метаду "тое, што ўжо купляў" з рознымі інтэрваламі для вымання, то іх мноства кандыдатаў будуць укладзены сябар у сябра. У той жа час, розныя параметры ў "перыядычных пакупках" на выхадзе не даюць поўнае скрыжаванне. Таму мы дзелім метады сэмпліравання з рознымі параметрамі на блокі так, што з кожнага блока мы жадаем узяць не больш аднаго падыходу вымання з пэўнымі гіперпараметрамі. Для гэтага трэба трохі пахітрыцца ў рэалізацыі задачы аб заплечніку, але асімптотыка і вынік ад гэтага не памяняюцца.

Такая разумная камбінацыя дазваляе атрымаць нам наступныя метрыкі ў параўнанні з проста калабаратыўнымі мадэлямі:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле
На фінальных метрыках бачым наступную карціну:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле

Аднак тут можна заўважыць, што застаўся адзін непакрыты момант для рэкамендацый, карысных бізнэсу. Цяпер мы проста навучыліся крута прадказваць тое, што карыстач купіць, напрыклад, на наступным тыдні. Але проста даваць скідку на тое, што ён і так купіць не вельмі прышпільна. Затое крута максымізаваць матчакаданне, напрыклад, наступных метрык:

  1. Маржу / тавараабарот па персанальных рэкамендацыях.
  2. Сярэдні чэк пакупнікоў.
  3. Частату візітаў.

Так мы памнажаем атрыманыя верагоднасці на розныя каэфіцыенты і пераранжыруем іх так, каб у топ пападалі тавары, якія ўплываюць на метрыкі вышэй. Тут няма гатовага рашэння, які падыход лепш выкарыстоўваць. Нават мы эксперыментуем з такімі каэфіцыентамі праводзім прама ў прадакшн. Але вось цікавыя прыёмы, якія найчасцей даюць у нас лепшыя вынікі:

  1. Дамнажаць на кошт/маржу тавара.
  2. Дамнажаць на сярэдні чэк, у якім сустракаецца тавар. Так наверх вылезуць тавары, з якімі бяруць звычайна яшчэ нешта.
  3. Памнажаць на сярэднюю частату візітаў пакупнікоў дадзенага тавара, зыходзячы з гіпотэзы, што гэты тавар правакуе часцей за ім вяртацца.

Правёўшы эксперыменты з каэфіцыентамі мы атрымалі наступныя метрыкі ў прадакшн:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле
Тут overall products conversion - доля набытых тавараў з усіх тавараў у рэкамендацыях, якія мы згенеравалі.

Уважлівы чытач заўважыць істотную розніцу паміж афлайн і анлайн метрыкамі. Такія паводзіны тлумачыцца тым, што далёка не ўсе дынамічныя фільтры па таварах, якія можна рэкамендаваць, можна ўлічваць пры навучанні мадэлі. Для нас нармальная гісторыя, калі палова вынятых кандыдатаў можа быць адфільтраваная, такая спецыфіка характэрна ў нашай галіне.

Па выручцы атрымліваецца наступная гісторыя, відаць, што пасля запуску рэкамендацый, выручка ў тэставай групы моцна расце, зараз сярэдні прырост выручкі з нашымі рэкамендацыямі - 3-4%:
Як мы кратна палепшылі якасць рэкамендацый у афлайн рытэйле

У заключэнне хачу сказаць, што, калі вам патрэбныя не realtime рэкамендацыі, то вельмі вялікі прырост у якасці знаходзіцца ў эксперыментах з атрыманнем кандыдатаў для рэкамендацый. Вялікая колькасць часу для іх генерацыі дае магчымасць камбінаваць шмат добрых метадаў, што ў суме дасць крутыя вынікі для бізнэсу.

Буду рады паразмаўляць у каментарах з усімі, хто палічыць матэрыял цікавым. Пытанні задаць можна мне асабіста ў тэлеграма. Таксама я дзялюся сваімі думкамі пра AI/стартапы ў сваім telegram канале - welcome 🙂

Крыніца: habr.com

Дадаць каментар