Si punojmë për cilësinë dhe shpejtësinë e përzgjedhjes së rekomandimeve

Emri im është Pavel Parkhomenko, unë jam një zhvillues ML. Në këtë artikull do të doja të flisja për strukturën e shërbimit Yandex.Zen dhe të ndaj përmirësimet teknike, zbatimi i të cilave ka bërë të mundur rritjen e cilësisë së rekomandimeve. Nga ky postim do të mësoni se si të gjeni ato më të rëndësishmet për përdoruesin midis miliona dokumenteve në vetëm disa milisekonda; si të bëhet zbërthimi i vazhdueshëm i një matrice të madhe (e përbërë nga miliona kolona dhe dhjetëra miliona rreshta) në mënyrë që dokumentet e reja të marrin vektorin e tyre në dhjetëra minuta; si të ripërdoret zbërthimi i matricës përdorues-artikull për të marrë një paraqitje të mirë vektoriale për video.

Si punojmë për cilësinë dhe shpejtësinë e përzgjedhjes së rekomandimeve

Baza jonë e rekomandimeve përmban miliona dokumente të formateve të ndryshme: artikuj me tekst të krijuar në platformën tonë dhe të marra nga sajte të jashtme, video, tregime dhe postime të shkurtra. Zhvillimi i një shërbimi të tillë shoqërohet me një numër të madh sfidash teknike. Ja disa prej tyre:

  • Ndani detyrat informatike: kryeni të gjitha operacionet e rënda jashtë linje dhe në kohë reale kryeni vetëm aplikim të shpejtë të modeleve në mënyrë që të jeni përgjegjës për 100-200 ms.
  • Merr shpejt parasysh veprimet e përdoruesit. Për ta bërë këtë, është e nevojshme që të gjitha ngjarjet t'i dorëzohen menjëherë rekomanduesit dhe të ndikojnë në rezultatet e modeleve.
  • Bëni furnizimin në mënyrë që për përdoruesit e rinj të përshtatet shpejt me sjelljen e tyre. Njerëzit që sapo i janë bashkuar sistemit duhet të mendojnë se reagimet e tyre ndikojnë në rekomandimet.
  • Kuptoni shpejt kujt t'i rekomandoni një artikull të ri.
  • Përgjigjuni shpejt shfaqjes së vazhdueshme të përmbajtjes së re. Dhjetëra mijëra artikuj publikohen çdo ditë dhe shumë prej tyre kanë një jetëgjatësi të kufizuar (të themi lajmet). Kjo është ajo që i dallon ata nga filmat, muzika dhe përmbajtje të tjera jetëgjata dhe të shtrenjta për t'u krijuar.
  • Transferoni njohuritë nga një fushë në tjetrën. Nëse një sistem rekomandimi ka modele të trajnuara për artikuj me tekst dhe ne i shtojmë video, ne mund të ripërdorim modelet ekzistuese në mënyrë që lloji i ri i përmbajtjes të renditet më mirë.

Unë do t'ju tregoj se si i zgjidhëm këto probleme.

Përzgjedhja e kandidatëve

Si të zvogëloni numrin e dokumenteve në shqyrtim me mijëra herë në disa milisekonda, pa pothuajse asnjë përkeqësim të cilësisë së renditjes?

Supozoni se kemi trajnuar shumë modele ML, kemi krijuar veçori bazuar në to dhe kemi trajnuar një model tjetër që rendit dokumentet për përdoruesit. Gjithçka do të ishte mirë, por nuk mund të marrësh dhe të llogaritësh të gjitha shenjat për të gjitha dokumentet në kohë reale, nëse ka miliona nga këto dokumente, dhe rekomandimet duhet të ndërtohen në 100-200 ms. Detyra është të zgjidhni një nëngrup të caktuar nga miliona, të cilat do të renditen për përdoruesin. Kjo fazë zakonisht quhet përzgjedhje e kandidatit. Ka disa kërkesa për të. Së pari, përzgjedhja duhet të ndodhë shumë shpejt, në mënyrë që të mbetet sa më shumë kohë për vetë renditjen. Së dyti, pasi kemi reduktuar shumë numrin e dokumenteve për renditje, ne duhet të ruajmë sa më plotësisht të jetë e mundur dokumentet përkatëse për përdoruesit.

Parimi ynë i përzgjedhjes së kandidatëve ka evoluar dhe për momentin kemi arritur në një skemë me shumë faza:

Si punojmë për cilësinë dhe shpejtësinë e përzgjedhjes së rekomandimeve

Së pari, të gjitha dokumentet ndahen në grupe, dhe dokumentet më të njohura merren nga secili grup. Grupet mund të jenë sajte, tema, grupime. Për çdo përdorues, bazuar në historikun e tij, zgjidhen grupet më të afërta me të dhe prej tyre merren dokumentet më të mira. Ne përdorim gjithashtu indeksin kNN për të zgjedhur dokumentet që janë më afër përdoruesit në kohë reale. Ka disa metoda për ndërtimin e një indeksi kNN; e jona funksionoi më së miri HNSW (Grafikët e Botës së Vogël të Lundrueshme Hierarkike). Ky është një model hierarkik që ju lejon të gjeni N vektorët më të afërt për një përdorues nga një bazë të dhënash prej miliona në disa milisekonda. Ne fillimisht indeksojmë të gjithë bazën e të dhënave të dokumenteve jashtë linje. Meqenëse kërkimi në indeks funksionon mjaft shpejt, nëse ka disa ngulitje të forta, mund të krijoni disa indekse (një indeks për çdo ngulitje) dhe t'i qaseni secilit prej tyre në kohë reale.

Ne kemi ende dhjetëra mijëra dokumente për çdo përdorues. Kjo është ende shumë për të numëruar të gjitha veçoritë, kështu që në këtë fazë ne përdorim renditjen e lehtë - një model i lehtë i renditjes së rëndë me më pak karakteristika. Detyra është të parashikoni se cilat dokumente do të ketë një model i rëndë në krye. Dokumentet me parashikuesin më të lartë do të përdoren në modelin e rëndë, pra në fazën e fundit të renditjes. Kjo qasje ju lejon të reduktoni bazën e të dhënave të dokumenteve të konsideruara për përdoruesin nga miliona në mijëra në dhjetëra milisekonda.

ALS hap në kohën e ekzekutimit

Si të merrni parasysh reagimet e përdoruesve menjëherë pas një klikimi?

Një faktor i rëndësishëm në rekomandime është koha e përgjigjes ndaj reagimeve të përdoruesve. Kjo është veçanërisht e rëndësishme për përdoruesit e rinj: kur një person sapo fillon të përdorë sistemin e rekomandimeve, ai merr një furnizim jo të personalizuar të dokumenteve të temave të ndryshme. Sapo ai bën klikimin e parë, duhet ta merrni menjëherë parasysh këtë dhe t'i përshtateni interesave të tij. Nëse i llogaritni të gjithë faktorët jashtë linje, një përgjigje e shpejtë e sistemit do të bëhet e pamundur për shkak të vonesës. Pra, është e nevojshme të përpunohen veprimet e përdoruesit në kohë reale. Për këto qëllime, ne përdorim hapin ALS në kohën e ekzekutimit për të ndërtuar një paraqitje vektoriale të përdoruesit.

Le të supozojmë se kemi një paraqitje vektoriale për të gjitha dokumentet. Për shembull, ne mund të ndërtojmë ngulitje jashtë linje bazuar në tekstin e një artikulli duke përdorur ELMo, BERT ose modele të tjera të mësimit të makinerive. Si mund të marrim një paraqitje vektoriale të përdoruesve në të njëjtën hapësirë ​​bazuar në ndërveprimet e tyre në sistem?

Parimi i përgjithshëm i formimit dhe zbërthimit të matricës përdorues-dokumentLe të kemi m përdorues dhe n dokumente. Për disa përdorues, lidhja e tyre me dokumente të caktuara është e njohur. Pastaj ky informacion mund të përfaqësohet si një matricë m x n: rreshtat korrespondojnë me përdoruesit, dhe kolonat korrespondojnë me dokumentet. Meqenëse personi nuk i ka parë shumicën e dokumenteve, shumica e qelizave të matricës do të mbeten bosh, ndërsa të tjerat do të mbushen. Për çdo ngjarje (pëlqim, mospëlqim, klikim) jepet një vlerë në matricë - por le të shqyrtojmë një model të thjeshtuar në të cilin një pëlqim korrespondon me 1 dhe një mospëlqim korrespondon me -1.

Le ta zbërthejmë matricën në dy: P (m x d) dhe Q (d x n), ku d është dimensioni i paraqitjes së vektorit (zakonisht një numër i vogël). Atëherë çdo objekt do të korrespondojë me një vektor d-dimensional (për një përdorues - një rresht në matricën P, për një dokument - një kolonë në matricën Q). Këta vektorë do të jenë ngulitje të objekteve përkatëse. Për të parashikuar nëse një përdorues do t'i pëlqejë një dokument, thjesht mund të shumëfishoni përfshirjet e tij.

Si punojmë për cilësinë dhe shpejtësinë e përzgjedhjes së rekomandimeve
Një nga mënyrat e mundshme për të zbërthyer një matricë është ALS (Alternating Least Squares). Ne do të optimizojmë funksionin e mëposhtëm të humbjes:

Si punojmë për cilësinë dhe shpejtësinë e përzgjedhjes së rekomandimeve

Këtu rui është ndërveprimi i përdoruesit u me dokumentin i, qi është vektori i dokumentit i, pu është vektori i përdoruesit u.

Pastaj vektori optimal i përdoruesit nga pikëpamja e gabimit mesatar katror (për vektorët e dokumenteve fikse) gjendet në mënyrë analitike duke zgjidhur regresionin linear përkatës.

Ky quhet "hapi ALS". Dhe vetë algoritmi ALS është që ne rregullojmë në mënyrë alternative njërën nga matricat (përdoruesit dhe artikujt) dhe përditësojmë tjetrën, duke gjetur zgjidhjen optimale.

Për fat të mirë, gjetja e paraqitjes së vektorit të përdoruesit është një operacion mjaft i shpejtë që mund të bëhet në kohën e ekzekutimit duke përdorur udhëzimet e vektorit. Ky truk ju lejon të merrni menjëherë parasysh reagimet e përdoruesve në renditje. E njëjta përfshirje mund të përdoret në indeksin kNN për të përmirësuar përzgjedhjen e kandidatëve.

Shpërndarja e filtrimit bashkëpunues

Si të bëni faktorizimin në rritje të matricës së shpërndarë dhe të gjeni shpejt paraqitjet vektoriale të artikujve të rinj?

Përmbajtja nuk është burimi i vetëm i sinjaleve të rekomandimit. Një burim tjetër i rëndësishëm është informacioni bashkëpunues. Tipare të mira të renditjes tradicionalisht mund të merren nga zbërthimi i matricës së dokumentit përdorues. Por kur u përpoqëm të bënim një dekompozim të tillë, hasëm probleme:

1. Kemi miliona dokumente dhe dhjetëra miliona përdorues. Matrica nuk përshtatet plotësisht në një makinë, dhe dekompozimi do të marrë një kohë shumë të gjatë.
2. Shumica e përmbajtjes në sistem ka një jetëgjatësi të shkurtër: dokumentet mbeten të rëndësishme vetëm për disa orë. Prandaj, është e nevojshme të ndërtohet paraqitja e tyre vektoriale sa më shpejt që të jetë e mundur.
3. Nëse ndërtoni një dekompozim menjëherë pas publikimit të dokumentit, një numër i mjaftueshëm përdoruesish nuk do të kenë kohë për ta vlerësuar atë. Prandaj, paraqitja e tij vektoriale ka shumë të ngjarë të mos jetë shumë e mirë.
4. Nëse një përdorues pëlqen ose nuk i pëlqen, ne nuk do të jemi në gjendje ta marrim menjëherë parasysh këtë në dekompozim.

Për të zgjidhur këto probleme, ne kemi zbatuar një zbërthim të shpërndarë të matricës së dokumentit përdorues me përditësime të shpeshta në rritje. Si funksionon saktësisht?

Supozoni se kemi një grup makinash N (N është në qindra) dhe duam të bëjmë një zbërthim të shpërndarë të një matrice mbi to që nuk përshtatet në një makinë. Pyetja është se si të kryhet ky zbërthim në mënyrë që, nga njëra anë, të ketë të dhëna të mjaftueshme për secilën makinë dhe, nga ana tjetër, në mënyrë që llogaritjet të jenë të pavarura?

Si punojmë për cilësinë dhe shpejtësinë e përzgjedhjes së rekomandimeve

Ne do të përdorim algoritmin e dekompozimit ALS të përshkruar më sipër. Le të shohim se si të ekzekutojmë një hap ALS në një mënyrë të shpërndarë - pjesa tjetër e hapave do të jetë e ngjashme. Le të themi se kemi një matricë fikse dokumentesh dhe duam të ndërtojmë një matricë përdoruesish. Për ta bërë këtë, ne do ta ndajmë atë në N pjesë me rreshta, secila pjesë do të përmbajë afërsisht të njëjtin numër rreshtash. Ne do t'i dërgojmë çdo makinerie qeliza jo boshe të rreshtave përkatës, si dhe matricën e ngulitjes së dokumenteve (në tërësi). Meqenëse madhësia e tij nuk është shumë e madhe, dhe matrica e dokumentit të përdoruesit është zakonisht shumë e rrallë, këto të dhëna do të përshtaten në një makinë të rregullt.

Ky truk mund të përsëritet në disa epoka derisa modeli të konvergojë, duke alternuar matricën fikse një nga një. Por edhe atëherë, dekompozimi i matricës mund të zgjasë disa orë. Dhe kjo nuk e zgjidh problemin që ju duhet të merrni me shpejtësi ngulitje të dokumenteve të reja dhe të përditësoni futjet e atyre për të cilat kishte pak informacion gjatë ndërtimit të modelit.

Futja e përditësimeve të shpejta në rritje të modelit na ndihmoi. Le të themi se kemi një model të trajnuar aktualisht. Që nga trajnimi i saj, ka pasur artikuj të rinj me të cilët kanë bashkëvepruar përdoruesit tanë, si dhe artikuj që kanë pasur pak ndërveprim gjatë trajnimit. Për të marrë me shpejtësi futjet e artikujve të tillë, ne përdorim futjet e përdoruesve të marra gjatë trajnimit të parë të madh të modelit dhe bëjmë një hap ALS për të llogaritur matricën e dokumentit të dhënë një matricë fikse të përdoruesit. Kjo ju lejon të merrni ngulitje mjaft shpejt - brenda pak minutash pas publikimit të dokumentit - dhe shpesh të përditësoni futjet e dokumenteve të fundit.

Për të bërë rekomandime që menjëherë të merren parasysh veprimet e njeriut, gjatë ekzekutimit ne nuk përdorim ngulitje të përdoruesve të marra jashtë linje. Në vend të kësaj, ne bëjmë një hap ALS dhe marrim vektorin aktual të përdoruesit.

Transferoni në një zonë tjetër domeni

Si të përdorni reagimet e përdoruesve për artikujt me tekst për të ndërtuar një paraqitje vektoriale të një videoje?

Fillimisht, ne rekomanduam vetëm artikuj me tekst, kështu që shumë nga algoritmet tona janë përshtatur për këtë lloj përmbajtjeje. Por gjatë shtimit të llojeve të tjera të përmbajtjes, u përballëm me nevojën për të përshtatur modelet. Si e zgjidhëm këtë problem duke përdorur një shembull video? Një opsion është të rikualifikoni të gjitha modelet nga e para. Por kjo kërkon një kohë të gjatë dhe disa nga algoritmet kërkojnë madhësinë e kampionit të trajnimit, i cili nuk është ende i disponueshëm në sasinë e kërkuar për një lloj të ri përmbajtjeje në momentet e para të jetës së tij në shërbim.

Ne shkuam në anën tjetër dhe ripërdorëm modelet e tekstit për videon. I njëjti mashtrim ALS na ndihmoi të krijonim paraqitje vektoriale të videove. Ne morëm një paraqitje vektoriale të përdoruesve bazuar në artikuj me tekst dhe bëmë një hap ALS duke përdorur informacionin e shikimit të videos. Kështu që ne morëm lehtësisht një paraqitje vektoriale të videos. Dhe në kohën e ekzekutimit ne thjesht llogarisim afërsinë midis vektorit të përdoruesit të marrë nga artikujt e tekstit dhe vektorit të videos.

Përfundim

Zhvillimi i thelbit të një sistemi rekomandimi në kohë reale përfshin shumë sfida. Ju duhet të përpunoni shpejt të dhënat dhe të aplikoni metoda ML për t'i përdorur në mënyrë efektive këto të dhëna; të ndërtojë sisteme komplekse të shpërndara të afta për të përpunuar sinjalet e përdoruesit dhe njësi të reja të përmbajtjes në një kohë minimale; dhe shumë detyra të tjera.

Në sistemin aktual, dizajnin e të cilit përshkrova, cilësia e rekomandimeve për përdoruesin rritet së bashku me aktivitetin e tij dhe kohëzgjatjen e qëndrimit në shërbim. Por sigurisht, këtu qëndron vështirësia kryesore: është e vështirë që sistemi të kuptojë menjëherë interesat e një personi që ka pak ndërveprim me përmbajtjen. Përmirësimi i rekomandimeve për përdoruesit e rinj është qëllimi ynë kryesor. Ne do të vazhdojmë të optimizojmë algoritmet në mënyrë që përmbajtja që është e rëndësishme për një person të futet më shpejt në burimin e tij dhe të mos shfaqet përmbajtja e parëndësishme.

Burimi: www.habr.com

Shto një koment