Më quajnë Pavel Parkhomenko, jam zhvillues i ML. Në këtë artikull do të doja të flas për mënyrën se si funksionon shërbimi Yandex.Dzen dhe të ndaj përmirësimet teknike që lejuan rritjen e cilësisë së rekomandimeve. Nga ky postim do të mësoni se si të gjeni në vetëm disa milisekonda dokumentet më relevante për përdoruesin nga miliona dokumente; si të bëni një shkrirje të vazhdueshme të një matrice të madhe (e cila përbëhet nga miliona kolona dhe dhjetëra miliona rreshta), në mënyrë që dokumentet e reja të marrin vetorët e tyre brenda dhjetëra minutash; si të ripërdorni shkrirjen e matricës përdorues-artikull për të marrë një përfaqësim të mirë vektorial për videon.

Baza jonë e rekomandimeve përmban miliona dokumente të formatit të ndryshëm: artikuj tekstualë, të krijuar në platformën tonë dhe të marrë nga faqe të jashtme, video, narracione dhe postime të shkurtra. Zhvillimi i një shërbimi të tillë është i lidhur me një numër të madh sfidash teknike. Ja disa prej tyre:
- Të ndanë detyrat llogaritëse: të gjitha operacionet e rënda të bëhen offline, ndërsa në kohë reale të kryhen vetëm aplikimi i shpejtë i modeleve për të u përgjigjur brenda 100-200 ms.
- Të konsideroni shpejt veprimet e përdoruesve. Për këtë, është e nevojshme që të gjitha ngjarjet të dërgohen menjëherë në rekomandues dhe të ndikojnë në rezultatet e punës së modeleve.
- Të bëni që feed-i të jetë i tillë që për përdoruesit e rinj të përshtatet shpejt me sjelljen e tyre. Njerëzit që sapo kanë ardhur në sistem duhet të ndiejnë se feedback-u i tyre ka ndikim në rekomandime.
- Të kuptoni shpejt se kujt t'i rekomandoni një artikull të ri.
- Të përgjigjeni shpejt ndaj shfaqjes së vazhdueshme të përmbajtjes së re. Dhjetëra mijëra artikuj publikohen çdo ditë, dhe shumë prej tyre kanë një kohë të kufizuar ekzistence (p.sh., lajme). Kjo është dallimi ndërmjet tyre dhe filma, muzikë dhe përmbajtje tjetër që ka jetëgjatësi më të madhe dhe është më e shtrenjtë për t'u krijuar.
- Të transferoni njohuritë nga një fushë domeni në një tjetër. Nëse në sistemin e rekomandimeve ka modele të trajnuara për artikuj tekstualë dhe ne shtojmë video, është e mundur të ripërdorim modelet ekzistuese për të renditur më mirë përmbajtjen e llojit të ri.
Do të flas për mënyrat se si i kemi zgjidhur këto sfida.
Përzgjedhja e kandidatëve
Si të reduktoni një sërë dokumentesh në mijëra herë në disa milisekonda, pa përkeqësuar ndjeshëm cilësinë e renditjes?
Le të supozojmë se kemi trajnuar shumë modele ML, kemi gjeneruar karakteristika mbi bazën e tyre dhe kemi trajnuar një model tjetër që rendit dokumentet për përdoruesin. Gjithçka do të ishte mirë, por nuk mund t'i llogarisim të gjitha karakteristikat për të gjitha dokumentet në kohë reale, nëse këto dokumente janë miliona dhe rekomandimet duhet të ndërtohen brenda 100-200 ms. Detyra është të zgjidhni nga miliona një nëngrup të caktuar, i cili do të renditet për përdoruesin. Ky hap zakonisht quhet përzgjedhja e kandidatëve. Ka disa kërkesa për këtë fazë. Së pari, përzgjedhja duhet të ndodhë shumë shpejt, në mënyrë që të mbetet sa më shumë kohë për renditje. Së dyti, duke reduktuar ndjeshëm numrin e dokumenteve për renditje, duhet të ruajmë sa më plotësisht dokumentet e rëndësishme për përdoruesin.
Principi ynë i përzgjedhjes së kandidatëve është evoluar, dhe deri më tani kemi arritur në një skemë me shumë nivele:

Fillimisht, të gjithë dokumentet ndahen në grupe, dhe nga çdo grup merren dokumentet më popullore. Grupet mund të jenë faqe interneti, tema, klastera. Për çdo përdorues, bazuar në historinë e tij, përzgjidhen grupet më të afërta dhe nga ato merren dokumentet më të mira. Gjithashtu, ne përdorim indeksin kNN për të gjetur dokumentet më të afërta për përdoruesin në kohë reale. Ekzistojnë disa metoda për ndërtimin e indeksit kNN, dhe për ne më mirë funksionoi (Grafi Hierarchical Navigable Small World). Kjo është një model hierarkik që lejon të gjeni N vektorët më të afërt për përdoruesin në një bazë prej miliona. Para se të fillojmë gjenerimin, ne indeksojmë të gjithë bazën tonë të dokumenteve offline. Duke qenë se kërkimi në indeks funksionon mjaft shpejt, me disa embeddime të forta është e mundur të krijojmë disa indekse (një për çdo embeddim) dhe të drejtojmë kërkesa për secilin prej tyre në kohë reale.
Ne kemi dhjetĂ«ra mijĂ«ra dokumente pĂ«r çdo pĂ«rdorues. Kjo Ă«shtĂ« ende shumĂ« pĂ«r tĂ« numĂ«ruar tĂ« gjitha karakteristikat, kĂ«shtu qĂ« nĂ« kĂ«tĂ« fazĂ« aplikojmĂ« njĂ« renditje tĂ« lehtĂ« â njĂ« model tĂ« lehtĂ«suar tĂ« renditjes sĂ« rĂ«ndĂ« me njĂ« numĂ«r mĂ« tĂ« vogĂ«l karakteristikash. QĂ«llimi Ă«shtĂ« tĂ« parashikohet se cilat dokumente do tĂ« ishin nĂ« krye nĂ« modelin e rĂ«ndĂ«. Dokumentet me parashikimin mĂ« tĂ« lartĂ« do tĂ« pĂ«rdoren nĂ« modelin e rĂ«ndĂ«, gjegjĂ«sisht nĂ« fazĂ«n e fundit tĂ« renditjes. Ky qasje lejon qĂ« nĂ« disa milisekonda tĂ« reduktojmĂ« bazĂ«n e dokumenteve tĂ« konsideruara pĂ«r pĂ«rdoruesin nga miliona nĂ« mijĂ«ra.
Hapi ALS në kohë reale
Si të mësojmë për feedback-un e përdoruesit menjëherë pas klikimit?
Një faktor i rëndësishëm në rekomandime është koha e reagimit për feedback-un e përdoruesit. Kjo është veçanërisht e rëndësishme për përdoruesit e rinj: kur një person sapo fillon të përdorë sistemin rekomandues, ai merr një fluks të papersonalizuar të dokumenteve të ndryshme. Sapo ai të bëjë klikimin e parë, është e nevojshme të merret parasysh menjëherë dhe të përshtatet me interesat e tij. Nëse kemi për të llogaritur të gjitha faktorët offline, reagimi i shpejtë i sistemit do të bëhet i pamundur për shkak të vonesës. Prandaj është e nevojshme të përpunojmë veprimet e përdoruesit në kohë reale. Për këto qëllime ne përdorim hapin ALS në kohë reale për të ndërtuar një përfaqësim vektorial të përdoruesit.
Supozoni se për të gjitha dokumentet kemi një përfaqësim vektorial. Për shembull, ne mund të ndërtoshim embedding-e offline në bazë të tekstit të artikujve duke përdorur ELMo, BERT ose modele të tjera të mësimit të makinës. Si mund të marrim një përfaqësim vektorial të përdoruesve në të njëjtin hapësirë në bazë të ndërveprimeve të tyre në sistem?
Princi i pĂ«rgjithshĂ«m i formimit dhe dekompozimit tĂ« matricĂ«s pĂ«rdorues-dokumentLe tĂ« themi se kemi m pĂ«rdorues dhe n dokumente. PĂ«r disa pĂ«rdorues dihet lidhja e tyre me disa dokumente. AtĂ«herĂ« kjo informacion mund tĂ« paraqitet nĂ« formĂ«n e njĂ« matrice m x n: rreshtat pĂ«rfaqĂ«sojnĂ« pĂ«rdoruesit, ndĂ«rsa kolonat â dokumentet. Duke qenĂ« se shumica e dokumenteve nuk janĂ« parĂ« nga individĂ«t, njĂ« pjesĂ« e madhe e qelizave tĂ« matricĂ«s do tĂ« mbeten bosh, ndĂ«rsa tĂ« tjerat do tĂ« jenĂ« tĂ« plota. PĂ«r çdo ngjarje (pĂ«lqim, mospĂ«lqim, klik) nĂ« matricĂ« parashikohet njĂ« vlerĂ« â por le tĂ« shqyrtojmĂ« njĂ« model tĂ« thjeshtuar, nĂ« tĂ« cilin pĂ«lqimi pĂ«rfaqĂ«sohet me 1, ndĂ«rsa mospĂ«lqimi me -1.
Le tĂ« zbĂ«rthejmĂ« matricĂ«n nĂ« dy: P (m x d) dhe Q (d x n), ku d â dimensionali i pĂ«rfaqĂ«simit vektorial (zakonisht njĂ« numĂ«r i vogĂ«l). AtĂ«herĂ« çdo objekti do t'i pĂ«rgjigjet njĂ« vektor d-dimensional (pĂ«rdoruesit â rreshti nĂ« matricĂ«n P, dokumentit â kolona nĂ« matricĂ«n Q). KĂ«ta vektorĂ« do tĂ« jenĂ« embedding-e tĂ« objekteve pĂ«rkatĂ«se. PĂ«r tĂ« parashikuar nĂ«se pĂ«rdoruesit do t'i pĂ«lqejĂ« dokumenti, ne mund thjesht tĂ« shumzojmĂ« embedding-et e tyre.

Një nga mënyrat e mundshme për zbërthimin e matricës është ALS (Alternating Least Squares). Ne do të optimizojmë funksionin e humbjes së mëposhtëm:

KĂ«tu rui â ndĂ«rveprimi i pĂ«rdoruesit u me dokumentin i, qi â vektori i dokumentit i, pu â vektori i pĂ«rdoruesit u.
Atëherë vektori optimal në raport me gabimin mesatar me katror do të gjendet analitikisht duke zgjidhur regresionin përkatës.
Ky quhet 'hapi ALS'. Algoritmi i ALS përfshin se ne alternojmë duke fixuar njërën prej matricave (përdoruesit dhe artikujt) dhe azhurnojmë tjetrën, duke gjetur zgjidhjen optimale.
Fatmirësisht, gjetja e përfaqësimit vektorial të përdoruesit është një operacion mjaft i shpejtë, i cili mund të realizohet në kohë reale duke përdorur instruksionet vektoriale. Ky truk lejon menjëherë të merret parasysh feedback-u i përdoruesit në renditje. I njëjti embedding mund të përdoret gjithashtu në indeksin kNN për të përmirësuar përzgjedhjen e kandidatëve.
Filtrimi kolaborativ i shpërndarë
Si të bëjmë faktorimin e matricës së shpërndarë në mënyrë inkrementale dhe të gjejmë shpejt përfaqësimin vektorial të artikujve të rinj?
Përmbajtja nuk është burimi i vetëm i sinjaleve për rekomandime. Një burim tjetër i rëndësishëm është informacioni kolaborativ. Karakteristika të mira në renditje zakonisht mund të përfitohen nga zbërthimi i matricës përdorues-dokument. Por kur u përpoqëm të bënim një zbërthim të tillë, u ndeshëm me probleme:
1. Ne kemi miliona dokumente dhe dhjetĂ«ra miliona pĂ«rdorues. MatrĂcula nuk mund tĂ« ruhet nĂ« njĂ« makinĂ« tĂ« vetme, dhe zbĂ«rthimi do tĂ« jetĂ« shumĂ« i gjatĂ«.
2. Për shumicën e përmbajtjes në sistem, koha e jetës është e shkurtër: dokumentet mbeten relevante vetëm për disa orë. Prandaj është e nevojshme të ndërtohet sa më shpejt përfaqësimi i tyre vektorial.
3. Nëse bëhet një dekompozim menjëherë pas publikimit të dokumentit, nuk do të arrijë të vlejë një numër i mjaftueshëm përdoruesish. Prandaj, përfaqësimi i tij vektorial me shumë mundësi nuk do të jetë shumë i mirë.
4. Nëse përdoruesi ka vendosur një pëlqim ose një antipëlqim, ne nuk mund ta marrim menjëherë parasysh këtë në dekompozim.
Për të zgjidhur problemet e përmendura, ne kemi realizuar një dekompozim të shpërndarë të matricës përdorues-dokument me përditësim të shpeshtë inkremental. Si funksionon kjo?
Supozoni qĂ« kemi njĂ« grup prej N makinash (N numĂ«rohet me qindra) dhe ne duam tĂ« realizojmĂ« njĂ« dekompozim tĂ« shpĂ«rndarĂ« tĂ« matricĂ«s, e cila nuk mund tĂ« vendoset nĂ« njĂ« makinĂ« tĂ« vetme. Pyetja Ă«shtĂ« â si tĂ« realizojmĂ« kĂ«tĂ« dekompozim, nĂ« mĂ«nyrĂ« qĂ«, nga njĂ«ra anĂ«, çdo makinĂ« tĂ« ketĂ« mjaft tĂ« dhĂ«na dhe, nga ana tjetĂ«r, llogaritjet tĂ« jenĂ« tĂ« pavarura?

Do tĂ« pĂ«rdorim algoritmin e pĂ«rshkruar mĂ« lart pĂ«r dekompozimin ALS. Le tĂ« shohim se si tĂ« realizojmĂ« njĂ« hap tĂ« shpĂ«rndarĂ« ALS â hapat e tjerĂ« do tĂ« jenĂ« tĂ« ngjashĂ«m. Supozoni se kemi ndalur matricĂ«n e dokumenteve dhe duam tĂ« ndjekim matricĂ«n e pĂ«rdoruesve. PĂ«r kĂ«tĂ«, do ta ndajmĂ« atĂ« nĂ« N pjesĂ« sipas rreshtave, çdo pjesĂ« do tĂ« pĂ«rmbajĂ« njĂ« numĂ«r tĂ« ngjashĂ«m rreshtash. Do tĂ« dĂ«rgojmĂ« nĂ« çdo makinĂ« qelizat e pa bosh tĂ« rreshtave pĂ«rkatĂ«s, si dhe matricĂ«n e embeddingut tĂ« dokumenteve (nĂ« tĂ«rĂ«si). Duke qenĂ« se ajo nuk ka njĂ« madhĂ«si shumĂ« tĂ« madhe, dhe matrica pĂ«rdues-dokument Ă«shtĂ« zakonisht shumĂ« e pĂ«rhapur, kĂ«to tĂ« dhĂ«na do tĂ« vendosen nĂ« njĂ« makinĂ« tĂ« zakonshme.
Ky truk mund të përsëritet për disa epoka deri në konvergjencën e modelit, duke ndërruar gradualisht matricën e ndaluar. Por edhe atëherë, dekompozimi i matricës mund të zgjasë disa orë. Dhe kjo nuk zgjidh problemin që duhet të marrim shpejt embeddinget e dokumenteve të reja dhe të përditësojmë embeddinget e atyre që kishin pak informacion gjatë ndërtimit të modelit.
Na ndihmoi implementimi i njĂ« pĂ«rditĂ«simi tĂ« shpejtĂ« inkremental tĂ« modelit. Supozoni se kemi modelin e tanishĂ«m tĂ« trajnuar. QĂ« nga momenti i trajnimit, janĂ« shfaqur artikuj tĂ« rinj, me tĂ« cilĂ«t pĂ«rdoruesit tanĂ« kanĂ« ndĂ«rvepruar, si dhe artikuj qĂ« gjatĂ« trajnimit kishin pak ndĂ«rveprime. PĂ«r tĂ« marrĂ« shpejt embeddingun e kĂ«tyre artikujve, ne pĂ«rdorim embeddinget e pĂ«rdoruesve tĂ« marrĂ« gjatĂ« trajnimit tĂ« parĂ« tĂ« madh tĂ« modelit dhe bĂ«jmĂ« njĂ« hap ALS pĂ«r tĂ« llogaritur matricĂ«n e dokumenteve me matricĂ«n e ndaluar tĂ« pĂ«rdoruesve. Kjo na lejon tĂ« marrim embeddinget mjaft shpejt â brenda disa minutash pas publikimit tĂ« dokumentit â dhe tâi pĂ«rditĂ«sojmĂ« shpesh embeddinget e dokumenteve tĂ« reja.
Për të marrë parasysh menjëherë veprimet e njeriut për rekomandimet, në kohën e ekzekutimit ne nuk përdorim embeddinget e përdoruesve të marrë offline. Në vend të kësaj, ne bëjmë një hap ALS dhe marrim vektorin aktual të përdoruesit.
Transferimi në një domen tjetër
Si të përdorim feedback-un e përdoruesve për artikujt tekstualë për të ndërtuar një përfaqësim vektorial të videove?
Fillimisht ne rekomanduam vetëm artikuj tekstualë, prandaj algoritmet tona janë të orientuara për këtë lloj përmbajtjeje. Por me shtimin e përmbajtjes së llojeve të tjera, u përballëm me nevojën për të adaptuar modelet. Si e zgjidhëm këtë problem duke marrë shembull videon? Një nga mundësitë ishte të ripërdoreshim të gjitha modelet nga e para. Por kjo është e gjatë, gjithashtu disa algoritme kërkojnë sasi të madhe të të dhënave për trajnim, të cilat nuk janë akoma në sasinë e nevojshme për përmbajtjen e llojeve të reja në momentet e para të jetës së saj në shërbim.
Ne ndoqëm një rrugë tjetër dhe ripërdorëm modelet tekstuale për videon. Në krijimin e përfaqësimeve vektoriale të videove na ndihmoi prapë truku me ALS. Ne morëm përfaqësimin vektorial të përdoruesve të bazuar në artikujt tekstualë dhe bëmë një hap ALS, duke përdorur informacionin mbi shikimet e videove. Kështu ne morëm pa asnjë vështirësi përfaqësimin vektorial të videove. Dhe në kohën e ekzekutimit ne thjesht llogarisim afërsinë midis vektorit të përdoruesit, të marrë mbi bazën e artikujve tekstualë, dhe vektorit të videos.
Përfundimi
Zhvillimi i bërthamës së sistemit rekomandues në kohë reale është i lidhur me shumë detyra. Duhet të përpunojmë të dhënat shpejt dhe të aplikojmë metoda ML për të përdorur këto të dhëna në mënyrë efektive; të ndërtojmë sisteme të ndërlikuara të shpërndara, të cilat janë në gjendje të përpunojnë sinjalet e përdoruesve dhe njësitë e reja të përmbajtjes për një kohë minimale; dhe shumë detyra të tjera.
Në sistemin aktual, i cili është përshkruar, cilësia e rekomandimeve për përdoruesit rritet bashkë me aktivitetin dhe qëndrimin e tij në shërbim. Por natyrisht, këtu qëndron dhe vështirësia kryesore: sistemi ka të vështirë të kuptojë menjëherë interesat e një personi që ka ndërvepruar pak me përmbajtjen. Përmirësimi i rekomandimeve për përdoruesit e rinj është detyra jonë kryesore. Ne do të vazhdojmë të optimizojmë algoritmet, në mënyrë që përmbajtja relevante të arrijë më shpejt në feed-in e tij, ndërsa ajo që nuk është relevante të mos shfaqet.
Burimi: habr.com
