Emri im është Pavel Parkhomenko dhe jam një zhvillues i ML. Në këtë artikull, dua të shpjegoj dizajnin e Yandex.Zen dhe të ndaj përmirësimet teknike që kanë përmirësuar cilësinë e rekomandimeve. Në këtë postim, do të mësoni se si të gjeni dokumentet më të rëndësishme midis miliona dokumenteve në vetëm disa milisekonda; si të faktorizoni vazhdimisht një matricë të madhe (të përbërë nga miliona kolona dhe dhjetëra miliona rreshta) në mënyrë që dokumentet e reja të marrin vektorët e tyre në dhjetëra minuta; dhe si të ripërdorni faktorizimin e matricës përdorues-artikull për të marrë një përfaqësim të mirë vektorial për videot.

Baza jonë e të dhënave të rekomandimeve përmban miliona dokumente të formateve të ndryshme: artikuj tekstualë të krijuar në platformën tonë dhe të marrë nga faqet e internetit të jashtme, video, rrëfime dhe postime të shkurtra. Zhvillimi i një shërbimi të tillë paraqet sfida të shumta teknike. Ja disa prej tyre:
- Ndani detyrat llogaritëse: kryeni të gjitha operacionet e rënda jashtë linje dhe kryeni vetëm aplikime të modelit të shpejtë në kohë reale, në mënyrë që kohët e reagimit të jenë brenda 100-200 ms.
- Përfshini shpejt veprimet e përdoruesit. Kjo kërkon që të gjitha ngjarjet t'i dorëzohen menjëherë rekomanduesit dhe të ndikojnë në performancën e modeleve.
- Dizajnoni burimin në mënyrë që të përshtatet shpejt me sjelljen e përdoruesve të rinj. Përdoruesit e rinj duhet të ndiejnë se reagimet e tyre ndikojnë në rekomandime.
- Kuptoni shpejt se 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 (si lajmet, për shembull) kanë një jetëgjatësi të kufizuar. Kjo i dallon ato nga filmat, muzika dhe përmbajtje të tjera jetëgjatë dhe të prodhuara me kosto të lartë.
- Transferoni njohuritë nga një fushë në tjetrën. Nëse një sistem rekomandimi ka modele të trajnuara për artikuj me tekst dhe ne shtojmë video, ne mund të ripërdorim modelet ekzistuese për të përmirësuar renditjen e llojeve të reja të përmbajtjes.
Do t'ju tregoj se si i zgjidhëm këto probleme.
Përzgjedhja e kandidatëve
Si mund ta zvogëlojmë numrin e dokumenteve që shqyrtohen me një faktor mijërash në pak milisekonda, praktikisht pa asnjë ndikim në cilësinë e renditjes?
Le të themi se kemi trajnuar modele të shumta të ML, kemi gjeneruar veçori bazuar në to dhe kemi trajnuar një model tjetër që rendit dokumentet për përdoruesin. Kjo do të ishte mirë dhe në rregull, por nuk mund t'i llogarisim thjesht të gjitha veçoritë për të gjitha dokumentet në kohë reale nëse ka miliona prej tyre, dhe rekomandimet duhet të gjenerohen në 100-200 ms. Qëllimi është të zgjedhim një nëngrup prej milionash që do të renditen për përdoruesin. Kjo fazë zakonisht quhet përzgjedhje e kandidatëve. Ka disa kërkesa. Së pari, përzgjedhja duhet të jetë shumë e shpejtë, duke i lënë sa më shumë kohë të jetë e mundur procesit të renditjes. Së dyti, duke ulur ndjeshëm numrin e dokumenteve për t'u renditur, duhet të ruajmë sa më shumë dokumente relevante të jetë e mundur.
Procesi ynë i përzgjedhjes së kandidatëve ka evoluar me kalimin e kohës dhe tani kemi arritur në një qasje shumëfazore:

Së pari, të gjitha dokumentet ndahen në grupe dhe dokumentet më të njohura zgjidhen nga secili grup. Grupet mund të jenë faqe interneti, tema ose grupe. Për secilin përdorues, grupet më të rëndësishme zgjidhen bazuar në historikun e tyre dhe dokumentet më të mira zgjidhen nga këto grupe. Ne gjithashtu përdorim një indeks kNN për të zgjedhur dokumentet më të rëndësishme për përdoruesin në kohë reale. Ekzistojnë disa metoda për ndërtimin e një indeksi kNN, por e jona funksionon më mirë. (Grafë të Vogël të Botës Hierarkike të Lundrueshme). Ky është një model hierarkik që na lejon të gjejmë N vektorët më të afërt për një përdorues nga një bazë të dhënash prej milionash në pak milisekonda. Së pari ne indeksojmë të gjithë bazën e të dhënave të dokumenteve tona jashtë linje. Meqenëse kërkimi i indeksit është mjaft i shpejtë, nëse ka disa ngulitje të forta, ne mund të krijojmë indekse të shumta (një indeks për secilin ngulitje) dhe t'i qasemi secilit prej tyre në kohë reale.
Na mbeten dhjetëra mijëra dokumente për secilin përdorues. Kjo është ende shumë e madhe për të llogaritur të gjitha karakteristikat, kështu që në këtë fazë përdorim renditjen e lehtë - një model i lehtë i renditjes së rëndë me më pak karakteristika. Qëllimi është të parashikohet se cilat dokumente do të jenë në krye të modelit të rëndë. Dokumentet me vlerën më të lartë parashikuese do të përdoren në modelin e rëndë, i cili është faza përfundimtare e renditjes. Kjo qasje na lejon të zvogëlojmë bazën e të dhënave të dokumenteve të konsideruara për një përdorues nga miliona në mijëra në dhjetëra milisekonda.
Hapi i ekzekutimit të ALS
Si të merren në konsideratë reagimet e përdoruesve menjëherë pas një klikimi?
Një faktor kyç në rekomandime është koha e reagimit ndaj reagimeve të përdoruesit. Kjo është veçanërisht e rëndësishme për përdoruesit e rinj: kur dikush fillon të përdorë për herë të parë një sistem rekomandimesh, atij i paraqitet një burim dokumentesh i pasponalizuar mbi tema të ndryshme. Sapo të bëjë klikimin e parë, është e nevojshme që menjëherë ta marrësh parasysh këtë dhe ta përshtatësh me interesat e tij. Nëse të gjithë faktorët llogariten jashtë linje, një përgjigje e shpejtë e sistemit do të jetë e pamundur për shkak të vonesës. Prandaj, është e nevojshme të përpunohen veprimet e përdoruesit në kohë reale. Për këtë qëllim, ne përdorim hapin ALS në kohën e ekzekutimit për të ndërtuar një përfaqësim vektorial të përdoruesit.
Le tĂ« supozojmĂ« se kemi njĂ« pĂ«rfaqĂ«sim vektorial pĂ«r tĂ« gjitha dokumentet. PĂ«r shembull, mund tĂ« ndĂ«rtojmĂ« ngulitje jashtĂ« linje bazuar nĂ« tekstin e artikullit duke pĂ«rdorur ELMo, BERT ose modele tĂ« tjera tĂ« tĂ« mĂ«suarit automatik. Si mund tĂ« marrim njĂ« pĂ«rfaqĂ«sim vektorial 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ë themi se kemi m përdorues dhe n dokumente. Për disa përdorues, qëndrimet e tyre ndaj dokumenteve të caktuara janë të njohura. Ky informacion mund të përfaqësohet më pas si një matricë m x n: rreshtat korrespondojnë me përdoruesit dhe kolonat me dokumentet. Meqenëse shumica e dokumenteve nuk janë parë nga përdoruesi, 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), matrica ka një vlerë - por le të shqyrtojmë një model të thjeshtuar në të cilin një pëlqim korrespondon me 1 dhe një mospëlqim me 1.
Le ta zbërthejmë matricën në dy pjesë: P (m x d) dhe Q (d x n), ku d është dimensionaliteti i përfaqësimit vektorial (zakonisht një numër i vogël). Pastaj, çdo objekt do të korrespondojë me një vektor d-dimensional (përdoruesi është një rresht në matricën P, dhe dokumenti është 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 ta pëlqejë një dokument, thjesht mund të shumëzoni ngulitje të tyre.

Një metodë e mundshme e faktorizimit të matricës është ALS (Alternimi i Katrorëve Më të Vogël). Ne do të optimizojmë funksionin e mëposhtëm të humbjes:

Këtu rui është bashkëveprimi 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 në terma të gabimit mesatar katror (me vektorë të fiksuar të dokumenteve) gjendet në mënyrë analitike duke zgjidhur regresionin linear përkatës.
Kjo quhet "hapi ALS". Vetë algoritmi ALS konsiston në rregullimin alternativ të njërës prej matricave (përdoruesve dhe artikujve) dhe përditësimin e tjetrës, duke gjetur zgjidhjen optimale.
Për fat të mirë, gjetja e përfaqësimit vektorial të një përdoruesi është një operacion mjaft i shpejtë që mund të bëhet gjatë kohës së ekzekutimit duke përdorur udhëzime vektoriale. Ky truk lejon që reagimet e përdoruesit të merren menjëherë në konsideratë në renditje. I njëjti integrim mund të përdoret në një indeks kNN për të përmirësuar përzgjedhjen e kandidatëve.
Filtrim bashkëpunues i shpërndarë
Si të kryhet faktorizimi inkremental i matricës së shpërndarë dhe të gjenden shpejt përfaqësimet 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 janë të dhënat bashkëpunuese. Karakteristikat e mira të renditjes tradicionalisht mund të nxirren nga dekompozimi i matricës përdorues-dokument. Megjithatë, kur u përpoqëm të zbatonim një dekompozim të tillë, hasëm disa probleme:
1. Ne kemi miliona dokumente dhe dhjetëra miliona përdorues. E gjithë matrica nuk përshtatet në një makinë të vetme dhe zbërthimi do të zgjasë shumë.
2. Pjesa më e madhe 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 përfaqësimi i tyre vektorial sa më shpejt të jetë e mundur.
3. Nëse e ndërtoni dekompozimin menjëherë pasi një dokument të publikohet, ai nuk do të ketë kohë të vlerësohet nga një numër i mjaftueshëm përdoruesish. Prandaj, përfaqësimi i tij vektorial ka shumë të ngjarë të jetë i dobët.
4. Nëse një përdorues ka pëlqyer ose jo një postim, ne nuk do të jemi në gjendje ta marrim menjëherë parasysh këtë në analizën e të dhënave.
Për të zgjidhur këto probleme, ne zbatuam një dekompozim të shpërndarë të matricës përdorues-dokument me përditësime të shpeshta graduale. Si funksionon saktësisht?
Le të themi se kemi një grumbull prej N makinash (N është në qindra) dhe duam të kryejmë një dekompozim të shpërndarë të një matrice nëpër to që nuk përshtatet në një makinë të vetme. Pyetja është: si mund ta kryejmë këtë dekompozim në mënyrë që, nga njëra anë, çdo makinë të ketë të dhëna të mjaftueshme dhe, nga ana tjetër, llogaritjet të jenë të pavarura?

Do të përdorim algoritmin e dekompozimit ALS të përshkruar më sipër. Le të shqyrtojmë se si të kryejmë një hap ALS në një mënyrë të shpërndarë - hapat e mbetur do të jenë të ngjashëm. Supozojmë se kemi një matricë dokumenti fikse dhe duam të ndërtojmë një matricë përdoruesi. Për ta bërë këtë, do ta ndajmë atë në N pjesë sipas rreshtave, secila pjesë që përmban afërsisht të njëjtin numër rreshtash. Do t'i shpërndajmë qelizat jo-boshe të rreshtave përkatëse në secilën makinë, si dhe të gjithë matricën e ngulitur të dokumentit. Meqenëse këto të dhëna nuk janë shumë të mëdha, dhe matricat përdorues-dokument zakonisht janë shumë të rralla, këto të dhëna do të përshtaten në një makinë tipike.
Ky truk mund të përsëritet për disa epoka derisa modeli të konvergojë, duke ndryshuar alternativisht matricën fikse. Por edhe atëherë, dekompozimi i matricës mund të zgjasë disa orë. Dhe kjo nuk e zgjidh problemin e marrjes së shpejtë të ngulitjeve për dokumente të reja dhe përditësimit të ngulitjeve të atyre për të cilat kishte pak informacion të disponueshëm gjatë ndërtimit të modelit.
Ne u ndihmuam duke zbatuar përditësime të shpejta graduale të modelit. Le të supozojmë se kemi një model të trajnuar aktualisht. Që nga trajnimi i tij, janë shtuar artikuj të rinj me të cilët përdoruesit tanë kanë ndërvepruar, si dhe artikuj që kanë pasur pak ndërveprime gjatë trajnimit. Për të marrë shpejt ngulitje për këto artikuj, ne përdorim ngulitje të përdoruesve të marra gjatë trajnimit të parë në shkallë të gjerë të modelit dhe kryejmë një hap të vetëm ALS për të llogaritur matricën e dokumentit me një matricë përdoruesi fikse. Kjo na lejon të marrim ngulitje mjaft shpejt - brenda disa minutash nga publikimi i një dokumenti - dhe të përditësojmë shpesh ngulitje të dokumenteve të reja.
Për të siguruar që rekomandimet bazohen menjëherë në veprimet njerëzore, ne nuk përdorim ngulitje të përdoruesve të marra jashtë linje gjatë kohës së ekzekutimit. Në vend të kësaj, ne kryejmë një hap ALS dhe marrim vektorin aktual të përdoruesit.
Transferimi në një zonë tjetër domeni
Si të përdoren reagimet e përdoruesve mbi artikujt me tekst për të ndërtuar një përfaqësim vektorial të videos?
Fillimisht, ne rekomandonim vetëm artikuj me tekst, kështu që shumë nga algoritmet tona janë të përshtatura për këtë lloj përmbajtjeje. Megjithatë, kur shtuam lloje të tjera përmbajtjeje, hasëm nevojën për të përshtatur modelet tona. Si e zgjidhëm këtë problem duke përdorur videon si shembull? Një mundësi ishte të ritrajnonim të gjitha modelet nga e para. Por kjo kërkon shumë kohë dhe disa algoritme po kërkojnë shumë për madhësinë e mostrës së trajnimit, e cila nuk është ende e disponueshme në sasi të mjaftueshme për llojet e reja të përmbajtjes në fazat e hershme të jetëgjatësisë së tyre në shërbim.
Ne ndoqëm një qasje të ndryshme dhe ripërdorëm modele teksti për videot. I njëjti truk i ALS na ndihmoi të krijonim përfaqësime vektoriale video. Ne morëm përfaqësimin vektorial të përdoruesit bazuar në artikujt tekstualë dhe kryem një hap ALS duke përdorur të dhënat e shikimit të videos. Në këtë mënyrë, morëm lehtësisht një përfaqësim vektorial video. Gjatë kohës së ekzekutimit, ne thjesht llogarisim ngjashmërinë midis vektorit të përdoruesit të marrë nga artikujt tekstualë dhe vektorit të videos.
Përfundim
Zhvillimi i thelbit të një sistemi rekomandimesh në kohë reale përfshin sfida të shumta. Ai kërkon përpunim të shpejtë të të dhënave dhe aplikimin e metodave të të mësuarit automatik për t'i përdorur ato në mënyrë efektive; ndërtimin e sistemeve komplekse të shpërndara të afta për të përpunuar sinjalet e përdoruesve dhe njësitë e reja të përmbajtjes në kohë minimale; dhe shumë detyra të tjera.
Në sistemin aktual, dizajnin e të cilit e kam përshkruar, cilësia e rekomandimeve për një përdorues rritet së bashku me aktivitetin dhe kohëzgjatjen e përdorimit të tij. Por sigurisht, këtu qëndron edhe sfida kryesore: është e vështirë për sistemin të kuptojë menjëherë interesat e dikujt që nuk ka ndërvepruar shumë 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 për të siguruar që përmbajtja relevante të arrijë në burimin e një përdoruesi më shpejt dhe përmbajtja e parëndësishme të mos shfaqet.
Burimi: www.habr.com
