Moje ime je Pavel Parkhomenko i programer sam strojnog učenja. U ovom članku želio bih objasniti dizajn Yandex.Zena i podijeliti tehnička poboljšanja koja su poboljšala kvalitetu preporuka. U ovom postu naučit ćete kako pronaći najrelevantnije dokumente među milijunima dokumenata u samo nekoliko milisekundi; kako kontinuirano faktorizirati veliku matricu (koja se sastoji od milijuna stupaca i desetaka milijuna redaka) tako da novi dokumenti dobiju svoje vektore u desecima minuta; i kako ponovno upotrijebiti faktorizaciju matrice korisničkih članaka kako biste dobili dobru vektorsku reprezentaciju za videozapise.

Naša baza preporuka sadrži milijune dokumenata različitih formata: tekstualne članke kreirane na našoj platformi i preuzete s vanjskih web stranica, videozapise, narative i kratke objave. Razvoj takve usluge predstavlja brojne tehničke izazove. Evo nekih od njih:
- Podijelite računalne zadatke: sve teške operacije obavljajte izvan mreže, a u stvarnom vremenu samo brze primjene modela, tako da vrijeme odziva bude unutar 100-200 ms.
- Brzo uključite korisničke akcije. To zahtijeva da se svi događaji odmah dostavljaju preporučitelju i utječu na performanse modela.
- Dizajnirajte feed tako da se brzo prilagođava ponašanju novih korisnika. Novi korisnici trebali bi osjećati da njihove povratne informacije utječu na preporuke.
- Brzo shvatite kome preporučiti novi članak.
- Brzo reagirajte na stalnu pojavu novog sadržaja. Deseci tisuća članaka objavljuju se svaki dan, a mnogi od njih (poput vijesti, na primjer) imaju ograničen vijek trajanja. To ih razlikuje od filmova, glazbe i ostalog dugotrajnog i skupo produciranog sadržaja.
- Prijenos znanja iz jedne domene u drugu. Ako sustav preporuka ima obučene modele za tekstualne članke i dodamo videozapise, možemo ponovno upotrijebiti postojeće modele za poboljšanje rangiranja novih vrsta sadržaja.
Reći ću vam kako smo riješili ove probleme.
Odabir kandidata
Kako možemo smanjiti broj dokumenata koji se razmatraju za faktor od tisuće u nekoliko milisekundi, bez praktički ikakvog utjecaja na kvalitetu rangiranja?
Recimo da smo obučili više ML modela, generirali značajke na temelju njih i obučili još jedan model koji rangira dokumente za korisnika. To bi sve bilo u redu, ali ne možemo jednostavno izračunati sve značajke za sve dokumente u stvarnom vremenu ako ih ima milijune, a preporuke se moraju generirati za 100-200 ms. Cilj je odabrati podskup od milijuna koji će biti rangirani za korisnika. Ova se faza obično naziva odabir kandidata. Ima nekoliko zahtjeva. Prvo, odabir mora biti vrlo brz, ostavljajući što više vremena za proces rangiranja. Drugo, značajnim smanjenjem broja dokumenata za rangiranje moramo zadržati što više relevantnih dokumenata.
Naš proces odabira kandidata se s vremenom razvijao i sada smo došli do višefaznog pristupa:

Prvo, svi dokumenti su podijeljeni u grupe, a iz svake grupe se odabiru najpopularniji dokumenti. Grupe mogu biti web-mjesta, teme ili klasteri. Za svakog korisnika, najrelevantnije grupe se odabiru na temelju njihove povijesti, a najbolji dokumenti se odabiru iz tih grupa. Također koristimo kNN indeks za odabir najrelevantnijih dokumenata za korisnika u stvarnom vremenu. Postoji nekoliko metoda za izradu kNN indeksa, ali naša najbolje funkcionira. (Hijerarhijski Navigacijski Grafovi Malog Svijeta). Ovo je hijerarhijski model koji nam omogućuje da pronađemo N najbližih vektora za korisnika iz baze podataka od milijuna u nekoliko milisekundi. Prvo indeksiramo cijelu našu bazu podataka dokumenata izvan mreže. Budući da je pretraživanje indeksa prilično brzo, ako postoji nekoliko jakih ugrađivanja, možemo stvoriti više indeksa (jedan indeks za svako ugrađivanje) i pristupiti svakom od njih u stvarnom vremenu.
Ostali su nam deseci tisuća dokumenata za svakog korisnika. To je još uvijek preveliko za izračun svih značajki, pa u ovoj fazi koristimo lagano rangiranje - lagani model teškog rangiranja s manje značajki. Cilj je predvidjeti koji će dokumenti biti na vrhu teškog modela. Dokumenti s najvećom prediktivnom vrijednošću koristit će se u teškom modelu, što je posljednja faza rangiranja. Ovaj pristup nam omogućuje smanjenje baze podataka dokumenata koji se razmatraju za korisnika s milijuna na tisuće u desecima milisekundi.
Korak izvođenja ALS-a
Kako odmah nakon klika uzeti u obzir povratne informacije korisnika?
Ključni faktor u preporukama je vrijeme odziva na povratne informacije korisnika. To je posebno važno za nove korisnike: kada netko prvi put počne koristiti sustav preporuka, prikazuje mu se nepersonalizirani feed dokumenata o raznim temama. Čim napravi prvi klik, potrebno je odmah to uzeti u obzir i prilagoditi se njegovim interesima. Ako se svi faktori izračunavaju izvan mreže, brz odgovor sustava bit će nemoguć zbog latencije. Stoga je potrebno obrađivati korisničke radnje u stvarnom vremenu. U tu svrhu koristimo ALS korak za vrijeme izvođenja programa za izgradnju vektorskog prikaza korisnika.
Pretpostavimo da imamo vektorski prikaz za sve dokumente. Na primjer, možemo konstruirati ugradnje izvan mreže na temelju teksta članka koristeći ELMo, BERT ili druge modele strojnog učenja. Kako možemo dobiti vektorski prikaz korisnika u istom prostoru na temelju njihovih interakcija u sustavu?
Opći princip formiranja i dekompozicije matrice korisnik-dokumentRecimo da imamo m korisnika i n dokumenata. Za neke korisnike poznati su njihovi stavovi prema određenim dokumentima. Te se informacije tada mogu prikazati kao matrica dimenzija m x n: retci odgovaraju korisnicima, a stupci dokumentima. Budući da korisnik nije vidio većinu dokumenata, većina ćelija matrice ostat će prazna, dok će druge biti popunjene. Za svaki događaj (sviđa mi se, ne sviđa mi se, klik), matrica ima vrijednost - ali razmotrimo pojednostavljeni model u kojem sviđanje odgovara 1, a nesviđanje 1.
Rastavimo matricu na dvije: P (m x d) i Q (d x n), gdje je d dimenzionalnost vektorskog prikaza (obično mali broj). Tada će svaki objekt odgovarati d-dimenzionalnom vektoru (korisnik je redak u P matrici, a dokument je stupac u Q matrici). Ovi vektori bit će ugradnje odgovarajućih objekata. Da biste predvidjeli hoće li se korisniku svidjeti dokument, jednostavno možete pomnožiti njihove ugradnje.

Jedna moguća metoda faktorizacije matrice je ALS (Alternating Least Squares - naizmjenični najmanji kvadrati). Optimizirat ćemo sljedeću funkciju gubitka:

Ovdje je rui interakcija korisnika u s dokumentom i, qi je vektor dokumenta i, pu je vektor korisnika u.
Zatim se optimalni vektor korisnika u smislu srednje kvadratne pogreške (s fiksnim vektorima dokumenata) pronalazi analitički rješavanjem odgovarajuće linearne regresije.
To se naziva "ALS korak". Sam ALS algoritam sastoji se od naizmjeničnog fiksiranja jedne od matrica (korisnika i članaka) i ažuriranja druge, pronalazeći optimalno rješenje.
Srećom, pronalaženje korisnikovog vektorskog prikaza prilično je brza operacija koja se može obaviti za vrijeme izvođenja programa pomoću vektorskih instrukcija. Ovaj trik omogućuje da se povratne informacije korisnika odmah uračunaju u rangiranje. Ista ugradnja može se koristiti u kNN indeksu za poboljšanje odabira kandidata.
Distribuirano kolaborativno filtriranje
Kako izvršiti inkrementalnu faktorizaciju distribuirane matrice i brzo pronaći vektorske reprezentacije novih članaka?
Sadržaj nije jedini izvor signala preporuka. Drugi važan izvor su kolaborativni podaci. Dobre značajke rangiranja tradicionalno se mogu izvesti iz dekompozicije matrice korisnik-dokument. Međutim, prilikom pokušaja implementacije takve dekompozicije naišli smo na nekoliko problema:
1. Imamo milijune dokumenata i desetke milijuna korisnika. Cijela matrica ne stane na jedno računalo, a dekompozicija će trajati jako dugo.
2. Većina sadržaja u sustavu ima kratak vijek trajanja: dokumenti ostaju relevantni samo nekoliko sati. Stoga je potrebno što brže izgraditi njihov vektorski prikaz.
3. Ako dekompoziciju izradite odmah nakon objave dokumenta, neće imati vremena da je procijeni dovoljan broj korisnika. Stoga će njegov vektorski prikaz najvjerojatnije biti loš.
4. Ako je korisnik označio objavu sa "sviđa mi se" ili "ne sviđa mi se", to nećemo moći odmah uzeti u obzir prilikom analize.
Kako bismo riješili ove probleme, implementirali smo distribuiranu dekompoziciju matrice korisnik-dokument s čestim inkrementalnim ažuriranjima. Kako to točno funkcionira?
Recimo da imamo skupinu od N strojeva (N je u stotinama) i želimo izvršiti distribuiranu dekompoziciju matrice na njima koja ne stane na jedan stroj. Pitanje je: kako možemo izvršiti ovu dekompoziciju tako da, s jedne strane, svaki stroj ima dovoljno podataka, a s druge strane, izračuni budu neovisni?

Koristit ćemo gore opisani ALS algoritam dekompozicije. Razmotrimo kako izvršiti jedan ALS korak na distribuirani način - preostali koraci bit će slični. Pretpostavimo da imamo fiksnu matricu dokumenata i želimo konstruirati korisničku matricu. Da bismo to učinili, podijelit ćemo je na N dijelova po retcima, pri čemu svaki dio sadrži približno isti broj redaka. Podijelit ćemo neprazne ćelije odgovarajućih redaka svakom računalu, kao i cijelu matricu ugradnje dokumenata. Budući da ovi podaci nisu jako veliki, a matrice korisnik-dokument obično su vrlo rijetke, ovi će se podaci smjestiti na tipično računalo.
Ovaj trik se može ponavljati nekoliko epoha dok model ne konvergira, naizmjenično mijenjajući fiksnu matricu. Ali čak i tada, dekompozicija matrice može potrajati nekoliko sati. A to ne rješava problem brzog dobivanja ugradnji za nove dokumente i ažuriranja ugradnji onih o kojima je bilo dostupno malo informacija prilikom izgradnje modela.
Pomoglo nam je implementiranje brzih inkrementalnih ažuriranja modela. Pretpostavimo da imamo trenutno obučen model. Od njegovog obučavanja dodani su novi članci s kojima su naši korisnici komunicirali, kao i članci koji su imali malo interakcija tijekom obučavanja. Kako bismo brzo dobili ugrađivanja za ove članke, koristimo korisnička ugrađivanja dobivena tijekom prvog velikog obučavanja modela i izvodimo jedan ALS korak za izračun matrice dokumenta s fiksnom korisničkom matricom. To nam omogućuje prilično brzo dobivanje ugrađivanja - unutar nekoliko minuta od objave dokumenta - i često ažuriranje ugrađivanja novih dokumenata.
Kako bismo osigurali da se preporuke odmah temelje na ljudskim radnjama, ne koristimo korisničke embeddinge dobivene izvan mreže tijekom izvođenja. Umjesto toga, izvršavamo ALS korak i dobivamo trenutni vektor korisnika.
Prijenos na drugo područje domene
Kako koristiti povratne informacije korisnika o tekstualnim člancima za izradu vektorskog prikaza videa?
U početku smo preporučili samo tekstualne članke, pa su mnogi naši algoritmi prilagođeni toj vrsti sadržaja. Međutim, prilikom dodavanja drugih vrsta sadržaja naišli smo na potrebu prilagodbe naših modela. Kako smo riješili ovaj problem koristeći video kao primjer? Jedna od mogućnosti bila je ponovno obučiti sve modele od nule. No, to oduzima puno vremena, a neki algoritmi su zahtjevni za veličinu uzorka za obuku, koji još nije dostupan u dovoljnoj količini za nove vrste sadržaja u ranim fazama njihovog životnog vijeka na usluzi.
Koristili smo drugačiji pristup i ponovno upotrijebili tekstualne modele za videozapise. Isti ALS trik nam je pomogao u stvaranju vektorskih prikaza videa. Uzeli smo vektorski prikaz korisnika na temelju tekstualnih članaka i izveli ALS korak koristeći podatke o pregledu videa. Na taj smo način lako dobili vektorski prikaz videa. Tijekom izvođenja jednostavno izračunavamo sličnost između vektora korisnika dobivenog iz tekstualnih članaka i vektora videa.
Zaključak
Razvoj jezgre sustava preporuka u stvarnom vremenu uključuje brojne izazove. Zahtijeva brzu obradu podataka i primjenu metoda strojnog učenja za njihovo učinkovito korištenje; izgradnju složenih distribuiranih sustava sposobnih za obradu korisničkih signala i novih jedinica sadržaja u minimalnom vremenu; i mnoge druge zadatke.
U trenutnom sustavu, čiji sam dizajn opisao, kvaliteta preporuka za korisnika raste s njegovom aktivnošću i trajanjem korištenja. Ali naravno, tu leži i glavni izazov: sustavu je teško odmah razumjeti interese nekoga tko nije puno komunicirao sa sadržajem. Poboljšanje preporuka za nove korisnike naš je ključni cilj. Nastavit ćemo optimizirati algoritme kako bismo osigurali da relevantan sadržaj brže dođe do korisnikovog feeda i da se ne prikazuje nebitan sadržaj.
Izvor: www.habr.com
