{"id":71852,"date":"2020-02-28T20:59:58","date_gmt":"2020-02-28T17:59:58","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij"},"modified":"2020-03-03T16:14:08","modified_gmt":"2020-03-03T13:14:08","slug":"kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","title":{"rendered":"Come lavoriamo sulla qualit\u00e0 e sulla velocit\u00e0 delle raccomandazioni","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Mi chiamo Pavel Parkhomenko, sono uno sviluppatore di ML. In questo articolo vorrei parlare del funzionamento del servizio Yandex.Zen e condividere i miglioramenti tecnici che hanno consentito di aumentare la qualit\u00e0 delle raccomandazioni. Dall'articolo scoprirai come trovare in pochi millisecondi i documenti pi\u00f9 rilevanti per l'utente tra milioni di documenti; come eseguire una decomposizione continua di una grande matrice (composta da milioni di colonne e decine di milioni di righe), in modo che i nuovi documenti ricevano il loro vettore in pochi minuti; come riutilizzare la decomposizione della matrice utente-articolo per ottenere una buona rappresentazione vettoriale per i video.<\/p>\n<p><img decoding=\"async\" alt=\"Come lavoriamo sulla qualit\u00e0 e sulla velocit\u00e0 delle raccomandazioni\" src=\"\/wp-content\/uploads\/2020\/02\/d63caf9162ca3533548fdef9cd740c24.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <br \/>\nLa nostra base di raccomandazioni contiene milioni di documenti di diversi formati: articoli testuali creati sulla nostra piattaforma e presi da siti esterni, video, narrazioni e brevi post. Sviluppare un servizio simile \u00e8 legato a un numero elevato di sfide tecniche. Ecco alcune di esse:<\/p>\n<ul>\n<li>Suddividere i compiti computazionali: eseguire tutte le operazioni pesanti offline, mentre in tempo reale eseguire solo l'applicazione rapida dei modelli, per rispondere entro 100-200 ms.<\/li>\n<li>Calcolare rapidamente le azioni dell'utente. \u00c8 necessario che tutti gli eventi vengano immediatamente inviati al raccomandatore e influenzino il risultato del lavoro dei modelli.<\/li>\n<li>Creare un feed in modo che per i nuovi utenti si adatti rapidamente al loro comportamento. Le persone che appena arrivano nel sistema devono sentire che il loro feedback influisce sulle raccomandazioni.<\/li>\n<li>Comprendere rapidamente a chi raccomandare un nuovo articolo.<\/li>\n<li>Reagire rapidamente alla continua apparizione di nuovi contenuti. Decine di migliaia di articoli vengono pubblicati ogni giorno, e molti di essi hanno una vita limitata (ad esempio, le notizie). Questa \u00e8 la loro differenza rispetto a film, musica e altri contenuti di lungo termine e costosi da creare.<\/li>\n<li>Trasferire conoscenze da un dominio a un altro. Se nel sistema di raccomandazione ci sono modelli addestrati per articoli testuali e aggiungiamo video ad esso, possiamo riutilizzare i modelli esistenti affinch\u00e9 il nuovo tipo di contenuto venga classificato meglio.<\/li>\n<\/ul>\n<p>\nParler\u00f2 di come abbiamo affrontato queste sfide.<\/p>\n<h2>Selezione dei candidati<\/h2>\n<p>\n<b>Come ridurre in millisecondi un gran numero di documenti analizzati di mille volte, senza praticamente compromettere la qualit\u00e0 del ranking?<\/b><\/p>\n<p>Supponiamo di aver addestrato molti modelli ML, generato delle caratteristiche basate su di essi e addestrato un altro modello che classifica i documenti per l'utente. Tutto sarebbe perfetto, ma non si possono semplicemente calcolare tutte le caratteristiche per tutti i documenti in tempo reale, se questi documenti sono milioni e le raccomandazioni devono essere costruite in 100-200 ms. Il compito \u00e8 selezionare un sottoinsieme da milioni di documenti, che verr\u00e0 classificato per l'utente. Questa fase viene di solito chiamata selezione dei candidati. A essa sono richiesti alcuni requisiti. Innanzitutto, la selezione deve avvenire molto rapidamente, per lasciare il maggior tempo possibile per il ranking stesso. In secondo luogo, riducendo significativamente il numero di documenti per il ranking, dobbiamo preservare il pi\u00f9 possibile i documenti pertinenti per l'utente.<\/p>\n<p>Il nostro principio di selezione dei candidati si \u00e8 evoluto nel tempo, e attualmente abbiamo raggiunto uno schema multilivello:<\/p>\n<p><img decoding=\"async\" alt=\"Come lavoriamo sulla qualit\u00e0 e sulla velocit\u00e0 delle raccomandazioni\" src=\"\/wp-content\/uploads\/2020\/02\/ed9657ed1febe871f36dc7cf7e585963.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nInizialmente, tutti i documenti vengono suddivisi in gruppi e dai quali vengono presi i documenti pi\u00f9 popolari. I gruppi possono essere siti, temi o cluster. Per ogni utente, in base alla sua storia, vengono selezionati i gruppi a lui pi\u00f9 vicini e dai quali vengono poi estratti i migliori documenti. Utilizziamo anche un indice kNN per la selezione dei documenti pi\u00f9 vicini all'utente in tempo reale. Ci sono diversi metodi per costruire l'indice kNN, il nostro ha funzionato meglio con <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1603.09320\">HNSW<\/a><\/noindex> (Grafi a Mondo Piccolo Navigabile Gerarchico). Questo \u00e8 un modello gerarchico che consente di trovare in pochi millisecondi N vettori pi\u00f9 vicini per l'utente da una base di milioni. In precedenza, indicizziamo offline tutto il nostro database di documenti. Poich\u00e9 la ricerca nell'indice \u00e8 piuttosto veloce, con diversi embedding potenti \u00e8 possibile creare pi\u00f9 indici (uno per ogni embedding) e accedere a ciascuno di essi in tempo reale.<\/p>\n<p>Abbiamo decine di migliaia di documenti per ogni utente. Questo \u00e8 ancora molto per conteggiare tutte le caratteristiche, quindi in questa fase applichiamo un ranking semplificato: un modello di ranking leggero con un numero ridotto di caratteristiche. L'obiettivo \u00e8 prevedere quali documenti arriveranno in cima al ranking del modello pesante. I documenti con il punteggio predittivo pi\u00f9 alto saranno utilizzati nel modello pesante, ossia nell'ultima fase del ranking. Questo approccio consente di ridurre in decine di millisecondi la base di documenti considerati per l'utente da milioni a migliaia.<\/p>\n<h2>Passo ALS in tempo reale<\/h2>\n<p>\n<b>Come tenere conto del feedback dell'utente subito dopo il clic?<\/b><\/p>\n<p>Un fattore importante nelle raccomandazioni \u00e8 il tempo di risposta al feedback dell'utente. Questo \u00e8 particolarmente importante per i nuovi utenti: quando una persona inizia a usare il sistema di raccomandazione, riceve un feed non personalizzato di documenti vari. Non appena effettua il primo clic, \u00e8 necessario considerarlo immediatamente e adattarsi ai suoi interessi. Se tutti i fattori vengono calcolati offline, la reazione rapida del sistema diventa impossibile a causa dei ritardi. Quindi \u00e8 necessario elaborare le azioni dell'utente in tempo reale. A questo scopo utilizziamo il passo ALS in tempo reale per costruire una rappresentazione vettoriale dell'utente.<\/p>\n<p>Supponiamo di avere una rappresentazione vettoriale per tutti i documenti. Ad esempio, possiamo offline costruire embedding basati sul testo dell'articolo utilizzando ELMo, BERT o altri modelli di machine learning. Come possiamo ottenere una rappresentazione vettoriale degli utenti nello stesso spazio in base alle loro interazioni all'interno del sistema?<\/p>\n<p><b class=\"spoiler_title\">Principio generale di formazione e decomposizione della matrice utente-documento<\/b>Supponiamo di avere m utenti e n documenti. Per alcuni utenti \u00e8 noto il loro rapporto con alcuni documenti. Queste informazioni possono essere rappresentate sotto forma di matrice m x n: le righe corrispondono agli utenti, mentre le colonne ai documenti. Poich\u00e9 la maggior parte dei documenti non \u00e8 stata vista dall'individuo, gran parte delle celle della matrice rimarr\u00e0 vuota, mentre altre saranno riempite. Per ciascun evento (like, dislike, click) nella matrice \u00e8 previsto un certo valore, ma consideriamo un modello semplificato in cui il like corrisponde a 1 e il dislike a -1.<\/p>\n<p>Scomponiamo la matrice in due: P (m x d) e Q (d x n), dove d \u00e8 la dimensione della rappresentazione vettoriale (di solito \u00e8 un numero ridotto). Cos\u00ec, ad ogni oggetto corrisponderebbe un vettore di dimensione d (l'utente sarebbe una riga nella matrice P, il documento una colonna nella matrice Q). Questi vettori costituiranno gli embedding degli oggetti corrispondenti. Per prevedere se un documento piacer\u00e0 a un utente, \u00e8 sufficiente moltiplicare i loro embedding.<\/p>\n<p><img decoding=\"async\" alt=\"Come lavoriamo sulla qualit\u00e0 e sulla velocit\u00e0 delle raccomandazioni\" src=\"\/wp-content\/uploads\/2020\/02\/a0c721bccb3806f2c4a18693a9458a89.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nUno dei modi possibili per scomporre la matrice \u00e8 l'ALS (Alternating Least Squares). Andremo a ottimizzare la seguente funzione di perdita:<\/p>\n<p><img decoding=\"async\" alt=\"Come lavoriamo sulla qualit\u00e0 e sulla velocit\u00e0 delle raccomandazioni\" src=\"\/wp-content\/uploads\/2020\/02\/aab8a1ae1cdf39de21e7469864c5190a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\nQui rui \u00e8 l'interazione dell'utente u con il documento i, qi \u00e8 il vettore del documento i, pu \u00e8 il vettore dell'utente u.<\/p>\n<p>Quindi, il vettore dell'utente ottimale dal punto di vista dell'errore quadratico medio (con i vettori dei documenti fissati) si trova analiticamente risolvendo la corrispondente regressione lineare.<\/p>\n<p>Questo \u00e8 chiamato \"step ALS\". E l'algoritmo ALS consiste nel fissare alternativamente una delle matrici (utenti e articoli) e aggiornare l'altra, trovando la soluzione ottimale.<\/p>\n<p>Fortunatamente, trovare la rappresentazione vettoriale dell'utente \u00e8 un'operazione piuttosto veloce, che pu\u00f2 essere effettuata in tempo reale, utilizzando istruzioni vettoriali. Questo trucco consente di tener conto immediatamente del feedback dell'utente nel ranking. Lo stesso embedding pu\u00f2 essere utilizzato anche nell'indice kNN per migliorare la selezione dei candidati.<\/p>\n<h2>Filtraggio collaborativo distribuito<\/h2>\n<p>\n<b>Come eseguire la fattorizzazione della matrice distribuita incrementale e trovare rapidamente la rappresentazione vettoriale di nuovi articoli?<\/b><\/p>\n<p>Il contenuto non \u00e8 l'unica fonte di segnali per le raccomandazioni. Un'altra fonte importante \u00e8 l'informazione collaborativa. Buoni segnali nel ranking possono tradizionalmente derivare dalla scomposizione della matrice utente-documento. Ma tentando di fare tale scomposizione ci siamo imbattuti in problemi:<\/p>\n<p>1. Abbiamo milioni di documenti e decine di milioni di utenti. La matrice non pu\u00f2 essere ospitata su una sola macchina e la scomposizione sar\u00e0 molto lunga.<br \/>\n2. La maggior parte dei contenuti nel sistema ha una vita breve: i documenti rimangono rilevanti solo per alcune ore. Pertanto, \u00e8 necessario costruire la loro rappresentazione vettoriale il pi\u00f9 rapidamente possibile.<br \/>\n3. Se si costruisce la scomposizione subito dopo la pubblicazione del documento, non avr\u00e0 abbastanza valutazioni da parte degli utenti. Pertanto, la sua rappresentazione vettoriale sar\u00e0 probabilmente di qualit\u00e0 non ottimale.<br \/>\n4. Se un utente mette un like o un dislike, non saremo in grado di tenerne conto immediatamente nella scomposizione.<\/p>\n<p>Per risolvere i problemi elencati, abbiamo implementato una scomposizione distribuita della matrice utente-documento con aggiornamenti incrementali frequenti. Come funziona esattamente?<\/p>\n<p>Supponiamo di avere un cluster di N macchine (N conta centinaia) e desideriamo effettuare una scomposizione distribuita della matrice, che non pu\u00f2 essere ospitata su una sola macchina. La domanda \u00e8: come eseguire questa scomposizione in modo che, da un lato, ogni macchina abbia dati sufficienti e, dall'altro, che i calcoli siano indipendenti? <\/p>\n<p><img decoding=\"async\" alt=\"Come lavoriamo sulla qualit\u00e0 e sulla velocit\u00e0 delle raccomandazioni\" src=\"\/wp-content\/uploads\/2020\/02\/9170b0fecb6efcd41754ec20ee539a15.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUtilizzeremo l'algoritmo di scomposizione ALS descritto sopra. Vediamo come eseguire un passo ALS in modo distribuito \u2014 gli altri passi saranno simili. Supponiamo di avere una matrice di documenti fissa e vogliamo costruire una matrice di utenti. A tal fine, la divideremo in N parti per righe, ciascuna contenente circa lo stesso numero di righe. Invieremo a ogni macchina le celle non vuote delle righe corrispondenti, cos\u00ec come la matrice degli embedding dei documenti (per intero). Poich\u00e9 la sua dimensione non \u00e8 molto grande, e la matrice utente-documento \u00e8 generalmente molto sparsa, questi dati si adatteranno a una macchina normale.<\/p>\n<p>Questo trucco pu\u00f2 essere ripetuto per diverse epoche fino alla convergenza del modello, cambiando a turno la matrice fissa. Ma anche allora, la fattorizzazione della matrice pu\u00f2 richiedere diverse ore. E questo non risolve il problema di dover ottenere rapidamente gli embedding di nuovi documenti e aggiornare gli embedding di quelli per cui si disponeva di poche informazioni durante la costruzione del modello. <\/p>\n<p>Ci ha aiutato l'implementazione di un aggiornamento incrementale rapido del modello. Supponiamo di avere il nostro attuale modello addestrato. Dalla sua formazione, sono apparsi nuovi articoli con cui i nostri utenti hanno interagito, cos\u00ec come articoli che durante la formazione hanno avuto poche interazioni. Per ottenere rapidamente l'embedding di tali articoli, utilizziamo gli embedding degli utenti ottenuti durante il primo grande addestramento del modello e facciamo un passo ALS per calcolare la matrice dei documenti con una matrice fissa degli utenti. Questo permette di ottenere embedding abbastanza rapidamente \u2014 in pochi minuti dopo la pubblicazione del documento \u2014 e di aggiornare frequentemente gli embedding dei documenti freschi.<\/p>\n<p>Per garantire che le azioni dell'utente siano immediatamente considerate nelle raccomandazioni, durante il runtime non utilizziamo gli embedding degli utenti ottenuti offline. Invece, facciamo un passo ALS e otteniamo il vettore utente attuale.<\/p>\n<h2>Trasferimento in un'altra area tematica<\/h2>\n<p>\n<b>Come utilizzare il feedback degli utenti sugli articoli di testo per costruire una rappresentazione vettoriale dei video?<\/b><\/p>\n<p>Inizialmente, raccomandavamo solo articoli di testo, quindi molti dei nostri algoritmi sono ottimizzati per questo tipo di contenuto. Ma con l'aggiunta di contenuti di altro tipo, ci siamo imbattuti nella necessit\u00e0 di adattare i modelli. Come abbiamo affrontato questa sfida con i video? Una delle opzioni \u00e8 riaddestrare tutti i modelli da zero. Ma questo richiede tempo, e inoltre alcuni algoritmi sono esigenti in termini di volume del campione di addestramento, che non \u00e8 ancora disponibile in quantit\u00e0 sufficiente per il nuovo tipo di contenuto nei primi momenti della sua vita nel servizio.<\/p>\n<p>Abbiamo seguito un'altra strada e riutilizzato modelli di testi per i video. Nella creazione delle rappresentazioni vettoriali dei video ci ha aiutato lo stesso trucco con ALS. Abbiamo preso la rappresentazione vettoriale degli utenti basata su articoli testuali e abbiamo effettuato un passo ALS, utilizzando le informazioni sulle visualizzazioni video. In questo modo abbiamo ottenuto senza sforzo una rappresentazione vettoriale dei video. E durante il runtime calcoliamo semplicemente la vicinanza tra il vettore dell'utente, ottenuto sulla base degli articoli testuali, e il vettore del video.<\/p>\n<h2>Conclusione<\/h2>\n<p>\nLo sviluppo del nucleo di un sistema di raccomandazione in tempo reale \u00e8 accompagnato da molteplici compiti. \u00c8 necessario elaborare rapidamente i dati e applicare metodi di ML per un utilizzo efficace di questi dati; costruire sistemi distribuiti complessi, in grado di elaborare i segnali degli utenti e nuove unit\u00e0 di contenuto nel minor tempo possibile; e molte altre sfide.<\/p>\n<p>Nell'attuale sistema, la cui architettura ho descritto, la qualit\u00e0 delle raccomandazioni per l'utente cresce insieme alla sua attivit\u00e0 e alla durata del tempo trascorso sul servizio. Ma naturalmente, qui si cela anche la principale difficolt\u00e0: il sistema fatica a comprendere immediatamente gli interessi di una persona che ha interagito poco con il contenuto. Migliorare le raccomandazioni per i nuovi utenti \u00e8 il nostro obiettivo chiave. Continueremo a ottimizzare gli algoritmi affinch\u00e9 i contenuti pertinenti per l'utente arrivino pi\u00f9 velocemente nel suo feed, mentre quelli non pertinenti non vengano mostrati.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/yandex\/blog\/490140\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041f\u0430\u0432\u0435\u043b \u041f\u0430\u0440\u0445\u043e\u043c\u0435\u043d\u043a\u043e, \u044f ML-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0437\u0435\u043d \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f\u043c\u0438, \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439. \u0418\u0437 \u043f\u043e\u0441\u0442\u0430 \u0432\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u0432\u0441\u0435\u0433\u043e \u0437\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u0440\u0435\u0434\u0438 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f; \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0435 \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b (\u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u0438\u0437 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":71853,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-71852","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041f\u0430\u0432\u0435\u043b \u041f\u0430\u0440\u0445\u043e\u043c\u0435\u043d\u043a\u043e, \u044f ML-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0437\u0435\u043d \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f\u043c\u0438, \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0434 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0434\u0431\u043e\u0440\u0430 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041f\u0430\u0432\u0435\u043b \u041f\u0430\u0440\u0445\u043e\u043c\u0435\u043d\u043a\u043e, \u044f ML-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0437\u0435\u043d \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f\u043c\u0438, \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-28T17:59:58+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:14:08+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Come lavoriamo sulla qualit\u00e0 e sulla velocit\u00e0 delle raccomandazioni | ProHoster","description":"Mi chiamo Pavel Parchomenko, sono uno sviluppatore di ML. In questo articolo vorrei parlare dell'architettura del servizio Yandex.Zen e condividere i miglioramenti tecnici la cui implementazione ha permesso di aumentare la qualit\u00e0 delle raccomandazioni.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0434 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0434\u0431\u043e\u0440\u0430 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439 | ProHoster","og:description":"\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041f\u0430\u0432\u0435\u043b \u041f\u0430\u0440\u0445\u043e\u043c\u0435\u043d\u043a\u043e, \u044f ML-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0437\u0435\u043d \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f\u043c\u0438, \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439.","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-28T17:59:58+00:00","article:modified_time":"2020-03-03T13:14:08+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"71852","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:55:28","updated":"2022-10-09 15:47:56","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/71852","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=71852"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/71852\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/71853"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=71852"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=71852"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=71852"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}