Mi chjamu Pavel Parkhomenko, sò un sviluppatore ML. In questu articulu, vogliu parlà di a struttura di u serviziu Yandex.Zen è sparte e migliure tecniche, l'implementazione di quale hà permessu di aumentà a qualità di i cunsiglii. Da questu post amparate cumu truvà i più pertinenti per l'utilizatori trà milioni di documenti in pocu millisecondi; cumu fà a descomposizione cuntinua di una grande matrice (custituita da milioni di culonni è decine di milioni di fila) per chì i novi documenti ricevenu u so vettore in decine di minuti; cumu riutilizà a descomposizione di a matrice di l'articulu di l'utilizatori per uttene una bona rapprisintazioni vettoriali per u video.
A nostra basa di dati di ricunniscenza cuntene milioni di documenti di diversi formati: articuli di testu creati nantu à a nostra piattaforma è pigliati da siti esterni, video, narrazioni è brevi posti. U sviluppu di un tali serviziu hè assuciatu cù un gran numaru di sfide tecniche. Eccu alcuni di elli:
- Divide i compiti di l'informatica: fate tutte e operazioni pesanti offline, è in tempu reale eseguite solu l'applicazione rapida di mudelli per esse rispunsevuli di 100-200 ms.
- Pigliate rapidamente in contu l'azzioni di l'utilizatori. Per fà questu, hè necessariu chì tutti l'avvenimenti sò immediatamente consegnati à u recomendatore è influenzanu i risultati di i mudelli.
- Fate l'alimentazione in modu chì per i novi utilizatori si adatta rapidamente à u so cumpurtamentu. E persone chì sò appena unitu à u sistema duveranu sente chì i so feedback influenzanu i cunsiglii.
- Capisce rapidamente à quale ricumandemu un novu articulu.
- Rispondi rapidamente à l'emergenza constante di novu cuntenutu. Decine di millaie d'articuli sò publicati ogni ghjornu, è assai di elli anu una vita limitata (per dì, nutizie). Questu hè ciò chì li distingue da i filmi, a musica è altri cuntenutu longu è caru per creà.
- Trasferisce a cunniscenza da una zona di duminiu à l'altru. Se un sistema di ricunniscenza hà furmatu mudelli per l'articuli di testu è aghjunghjenu video à questu, pudemu reutilizà i mudelli esistenti per chì u novu tipu di cuntenutu si classificà megliu.
Vi dicu cumu avemu risoltu sti prublemi.
Selezzione di i candidati
Cumu riduce u nùmeru di documenti in cunsiderazione da millaie di volte in uni pochi di millisecondi, cù quasi nisuna deteriorazione in a qualità di u ranking?
Eppo supponimu chì avemu furmatu parechji mudelli ML, generatu funzioni basati nantu à elli, è furmatu un altru mudellu chì classifica i documenti per l'utilizatore. Tuttu saria bè, ma ùn pudete micca solu piglià è calculà tutti i segni per tutti i ducumenti in tempu reale, s'ellu ci sò milioni di sti documenti, è i cunsiglii deve esse custruitu in 100-200 ms. U compitu hè di selezziunà un certu subset da milioni, chì serà classificatu per l'utilizatore. Questa tappa hè generalmente chjamata selezzione di candidati. Ci hè parechje esigenze per questu. Prima, a selezzione deve accade assai rapidamente, perchè u più tempu pussibule per u ranking stessu. Siconda, avè riduciutu assai u numeru di documenti per a classificazione, duvemu priservà i documenti pertinenti per l'utilizatore cum'è cumpletamente pussibule.
U nostru principiu di selezzione di candidati hà evolutu, è in u mumentu avemu ghjuntu à un schema multi-stadi:
Prima, tutti i documenti sò spartuti in gruppi, è i documenti più populari sò pigliati da ogni gruppu. I gruppi ponu esse siti, temi, clusters. Per ogni utilizatore, basatu annantu à a so storia, i gruppi più vicinu à ellu sò selezziunati è i più boni documenti sò pigliati da elli. Avemu ancu aduprà l'indici kNN per selezziunà i documenti chì sò più vicinu à l'utilizatore in tempu reale. Ci hè parechje metudi per custruisce un indice kNN; u nostru hà travagliatu megliu
Avemu sempre decine di millaie di documenti per ogni utilizatore. Questu hè sempre assai per cuntà tutte e funziunalità, cusì in questa tappa usemu una classificazione ligera - un mudellu di classificazione pesante ligeru cù menu caratteristiche. U compitu hè di predichendu chì documenti un mudellu pesante averà in cima. I ducumenti cù u più altu predictore seranu utilizati in u mudellu pisanti, vale à dì à l'ultima tappa di u ranking. Stu approcciu permette di riduce a basa di dati di documenti cunsiderati per l'utilizatore da milioni à millaie in decine di millisecondi.
Passu ALS in runtime
Cumu piglià in contu i feedback di l'utilizatori immediatamente dopu un clic?
Un fattore impurtante in i cunsiglii hè u tempu di risposta à i feedback di l'utilizatori. Questu hè soprattuttu impurtante per i novi utilizatori: quandu una persona principia solu à utilizà u sistema di ricunniscenza, riceve un feed micca persunalizatu di documenti di diversi temi. Appena ellu faci u primu clicu, avete bisognu à piglià immediatamente in contu di questu è adattà à i so interessi. Se calcule tutti i fatturi offline, una risposta rapida di u sistema diventerà impussibile per via di u ritardu. Dunque hè necessariu di processà l'azzioni di l'utilizatori in tempu reale. Per questi scopi, usemu u passu ALS in runtime per custruisce una rappresentazione vettoriale di l'utilizatore.
Assumimu chì avemu una rapprisintazioni vettoriali per tutti i documenti. Per esempiu, pudemu custruisce embeddings offline basatu annantu à u testu di un articulu utilizendu ELMo, BERT o altri mudelli di machine learning. Cumu pudemu ottene una rapprisintazioni vettoriali di l'utilizatori in u stessu spaziu basatu nantu à e so interazzione in u sistema?
Principiu generale di furmazione è di cumpusizioni di a matrice di l'utilizatori-documentuAvemu m utilizatori è n documenti. Per certi utilizatori, a so relazione cù certi documenti hè cunnisciuta. Allora sta infurmazione pò esse rapprisintata cum'è una matrice m x n: e fila currispondenu à l'utilizatori, è e culonne currispondenu à i ducumenti. Siccomu a persona ùn hà micca vistu a maiò parte di i ducumenti, a maiò parte di e cellule di a matrice restanu viote, mentre chì l'altri seranu pieni. Per ogni avvenimentu (cum'è, dislike, clic) qualchì valore hè furnitu in a matrice - ma cunsideremu un mudellu simplificatu in quale un like currisponde à 1, è un dislike currisponde à -1.
Scompone a matrice in dui: P (m x d) è Q (d x n), induve d hè a dimensione di a rapprisintazioni vettoriali (di solitu un picculu numeru). Allora ogni ughjettu currisponde à un vettore d-dimensionale (per un utilizatore - una fila in a matrice P, per un documentu - una colonna in a matrice Q). Questi vettori seranu l'embeddings di l'uggetti currispundenti. Per predichendu se un utilizatore piacerà un documentu, pudete simpricimenti multiplicà e so incrustazioni.
Unu di i modi pussibuli per decompone una matrice hè ALS (Alternating Least Squares). Ottimisimu a seguente funzione di perdita:
Qui rui è l'interazione dell'utente u con il documento i, qi è il vettore del documento i, pu è il vettore dell'utente u.
Allora u vettore ottimali di l'utilizatori da u puntu di vista di l'errore quadratu mediu (per i vettori di documentu fissi) si trova analiticamente risolvendu a regressione lineale currispundente.
Questu hè chjamatu "passu ALS". È l'algoritmu di l'ALS stessu hè chì alternate solu una di e matrici (utilizatori è articuli) è aghjurnà l'altru, truvendu a suluzione ottima.
Fortunatamente, truvà a rapprisintazioni vettoriali di l'utilizatori hè una operazione abbastanza veloce chì pò esse fatta in runtime usendu struzzioni vettoriali. Stu truccu permette di piglià immediatamente in contu i feedback di l'utilizatori in u ranking. U listessu incrustu pò esse usatu in l'indici kNN per migliurà a selezzione di candidati.
Filtrazione Cullaburazione Distribuita
Cumu fà a factorizazione di matrice distribuita incrementale è truvà rapidamente rapprisentazione vettoriali di novi articuli?
U cuntenutu ùn hè micca l'unica fonte di signali di raccomandazione. Un'altra fonte impurtante hè l'infurmazione cullaburazione. E boni funzioni di classificazione ponu esse tradizionalmente ottenute da a descomposizione di a matrice di l'utilizatori-documentu. Ma quandu pruvate à fà una tale descomposizione, avemu scontru prublemi:
1. Avemu milioni di ducumenti è decine di milioni di utilizatori. A matrice ùn si mette micca sanu à una macchina, è a descomposizione duverà assai tempu.
2. A maiò parte di u cuntenutu in u sistema hà una vita curta: i ducumenti restanu pertinenti per uni pochi d'ore. Dunque, hè necessariu di custruisce a so rapprisintazioni vettoriali u più prestu pussibule.
3. Se custruite una descomposizione subitu dopu chì u documentu hè publicatu, un numeru suffirenziu d'utilizatori ùn avarà micca tempu per evaluà. Dunque, a so rapprisintazioni vettoriali ùn serà micca assai bona.
4. Se un utilizatore piace o dislike, ùn pudemu micca piglià immediatamente in contu in a descomposizione.
Per risolve questi prublemi, avemu implementatu una descomposizione distribuita di a matrice di u documentu di l'utilizatori cù frequenti aghjurnamenti incrementali. Cumu funziona esattamente?
Suppone chì avemu un cluster di N machini (N hè in cintunari) è vulemu fà una descomposizione distribuita di una matrice nantu à elli chì ùn si mette micca in una macchina. A quistione hè cumu fà sta descomposizione per chì, da una banda, ci hè abbastanza dati nantu à ogni macchina è, da l'altru, per chì i calculi sò indipindenti?
Avemu aduprà l'algoritmu di descomposizione ALS descritta sopra. Fighjemu cumu eseguisce un passu ALS in una manera distribuita - u restu di i passi seranu simili. Dicemu chì avemu una matrice fissa di documenti è vulemu custruisce una matrice d'utilizatori. Per fà questu, avemu da divisu in N parte per linee, ogni parte cuntene apprussimatamente u listessu numeru di linii. Manderemu à ogni machina cellule non vacanti di e fila currispundenti, è ancu a matrice di embeddings di documentu (interamente). Siccomu a so dimensione ùn hè micca assai grande, è a matrice di u documentu di l'utilizatori hè generalmente assai sparsa, sta dati si mette in una macchina regulare.
Stu truccu pò esse ripetutu annantu à parechje epoche finu à chì u mudellu cunverge, alternendu a matrice fissa una per una. Ma ancu allora, a descomposizione di a matrice pò piglià parechje ore. È questu ùn risolve micca u prublema chì avete bisognu di riceve rapidamente embeddings di novi documenti è aghjurnà l'embeddings di quelli chì ci era pocu infurmazione quandu custruisce u mudellu.
L'intruduzioni di l'aghjurnamenti veloci di mudelli incrementali ci hà aiutatu. Diciamu chì avemu un mudellu attualmente furmatu. Dapoi a so furmazione, ci sò stati novi articuli chì i nostri utilizatori anu interazzione cù, è ancu articuli chì avianu pocu interazzione durante a furmazione. Per ottene rapidamente l'embeddings di tali articuli, usemu l'embeddings d'utilizatori ottenuti durante a prima grande furmazione di u mudellu è fate un passu ALS per calculà a matrice di documentu datu una matrice d'utilizatore fissa. Questu permette di riceve embeddings abbastanza rapidamente - in pochi minuti dopu chì u documentu hè publicatu - è spessu aghjurnà l'embeddings di documenti recenti.
Per fà cunsiglii immediatamente pigliate in contu l'azzioni umani, in runtime ùn usemu micca embeddings d'utilizatori ottenuti offline. Invece, facemu un passu ALS è uttene u vettore di l'utilizatore attuale.
Trasfirimentu à un altru spaziu di duminiu
Cumu aduprà u feedback di l'utilizatori nantu à l'articuli di testu per custruisce una rappresentazione vettoriale di un video?
In principiu, avemu cunsigliatu solu articuli di testu, cusì parechji di i nostri algoritmi sò adattati à stu tipu di cuntenutu. Ma quandu aghjunghjenu altri tipi di cuntenutu, avemu avutu affruntatu cù a necessità di adattà i mudelli. Cumu risolvemu stu prublema cù un esempiu video? Una opzione hè di ricuperà tutti i mudelli da zero. Ma questu pigghia assai tempu, è alcuni di l'algoritmi sò esigenti nantu à a dimensione di a mostra di furmazione, chì ùn hè ancu dispunibule in a quantità necessaria per un novu tipu di cuntenutu in i primi mumenti di a so vita nantu à u serviziu.
Avemu andatu in l'altru modu è riutilizate i mudelli di testu per u video. U stessu truccu ALS ci hà aiutatu à creà rapprisentazione vettoriali di video. Avemu pigliatu una rapprisintazioni vettoriali di l'utilizatori basatu nantu à l'articuli di testu è avemu fattu un passu ALS utilizendu l'infurmazioni di vista video. Cusì avemu facilmente una rapprisintazioni vettoriali di u video. È in runtime avemu solu calculà a vicinanza trà u vettore d'utilizatore ottenutu da l'articuli di testu è u vettore video.
cunchiusioni
Sviluppà u core di un sistema di raccomandazione in tempu reale implica parechje sfide. Avete bisognu di trasfurmà rapidamente e dati è applicà i metudi ML per utilizà sti dati in modu efficace; custruì sistemi distribuiti cumplessi capaci di processà i signali di l'utilizatori è novi unità di cuntenutu in un tempu minimu; è parechje altre attività.
In u sistema attuale, u disignu di quale aghju descrittu, a qualità di ricunniscenza per l'utilizatori cresce cù a so attività è a durata di a permanenza in u serviziu. Ma sicuru, quì si trova a difficultà principale: hè difficiule per u sistema di capisce immediatamente l'interessi di una persona chì hà pocu interazzione cù u cuntenutu. A migliurà i cunsiglii per i novi utilizatori hè u nostru scopu chjave. Continueremu à ottimisà l'algoritmi per chì u cuntenutu chì hè pertinenti per una persona entra in u so feed più veloce, è u cuntenutu irrilevante ùn hè micca mostratu.
Source: www.habr.com