{"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\/ro\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","title":{"rendered":"Cum ne gestion\u0103m calitatea \u0219i viteza \u00een selec\u021bia recomand\u0103rilor","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>M\u0103 numesc Pavel Parchomenko, sunt dezvoltator ML. \u00cen acest articol, a\u0219 dori s\u0103 v\u0103 povestesc despre structura serviciului Yandex Zen \u0219i s\u0103 \u00eemp\u0103rt\u0103\u0219esc \u00eembun\u0103t\u0103\u021birile tehnice implementate, care au crescut calitatea recomand\u0103rilor. Din acest post ve\u021bi \u00eenv\u0103\u021ba cum, \u00een doar c\u00e2teva milisecunde, s\u0103 g\u0103si\u021bi printre milioane de documente cele mai relevante pentru utilizator; cum s\u0103 realiza\u021bi o descompunere continu\u0103 a unei matrice mari (format\u0103 din milioane de coloane \u0219i zeci de milioane de r\u00e2nduri), astfel \u00eenc\u00e2t documentele recente s\u0103 primeasc\u0103 vectorii lor \u00een c\u00e2teva zeci de minute; cum s\u0103 reutiliza\u021bi descompunerea matricei utilizator-articol pentru a ob\u021bine o bun\u0103 reprezentare vectorial\u0103 pentru videoclipuri.<\/p>\n<p><img decoding=\"async\" alt=\"Cum ne gestion\u0103m calitatea \u0219i viteza \u00een selec\u021bia recomand\u0103rilor\" 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 \/>\nBaza noastr\u0103 de recomand\u0103ri con\u021bine milioane de documente de diferite formate: articole text create pe platforma noastr\u0103 \u0219i luate de pe site-uri externe, videoclipuri, nara\u021biuni \u0219i post\u0103ri scurte. Dezvoltarea unui astfel de serviciu este asociat\u0103 cu numeroase provoc\u0103ri tehnice. Iat\u0103 c\u00e2teva dintre ele:<\/p>\n<ul>\n<li>\u00cemp\u0103r\u021birea sarcinilor de calcul: toate opera\u021biile grele s\u0103 fie efectuate offline, iar \u00een timp real s\u0103 se fac\u0103 doar aplicarea rapid\u0103 a modelului, astfel \u00eenc\u00e2t s\u0103 se r\u0103spund\u0103 \u00een 100-200 ms.<\/li>\n<li>Considerarea rapid\u0103 a ac\u021biunilor utilizatorului. Pentru aceasta, este necesar ca toate evenimentele s\u0103 fie livrate instantaneu \u00een recomandator \u0219i s\u0103 influen\u021beze rezultatul modelelor.<\/li>\n<li>Crearea unui feed care s\u0103 se adapteze rapid comportamentului utilizatorilor noi. Persoanele care tocmai au intrat \u00een sistem trebuie s\u0103 simt\u0103 c\u0103 feedback-ul lor influen\u021beaz\u0103 recomand\u0103rile.<\/li>\n<li>S\u0103 \u00een\u021belegem rapid cui s\u0103-i recomand\u0103m un nou articol.<\/li>\n<li>S\u0103 reac\u021bion\u0103m eficient la apari\u021bia constant\u0103 de con\u021binut nou. Zeci de mii de articole sunt publicate \u00een fiecare zi, iar multe dintre ele au un termen de valabilitate limitat (s\u0103 zicem, \u0219tiri). Aceasta este diferen\u021ba lor fa\u021b\u0103 de filme, muzic\u0103 \u0219i alte tipuri de con\u021binut durabil \u0219i scump de creat.<\/li>\n<li>Transferarea cuno\u0219tin\u021belor dintr-un domeniu de activitate \u00een altul. Dac\u0103 \u00een sistemul de recomand\u0103ri exist\u0103 modele antrenate pentru articole text \u0219i ad\u0103ug\u0103m videoclipuri, putem reutiliza modelele existente pentru a \u00eembun\u0103t\u0103\u021bi clasificarea con\u021binutului de tip nou.<\/li>\n<\/ul>\n<p>\nVoi explica cum am abordat aceste provoc\u0103ri.<\/p>\n<h2>Selec\u021bia candida\u021bilor<\/h2>\n<p>\n<b>Cum putem reduce \u00een c\u00e2teva milisecunde num\u0103rul documentelor analizate de mii de ori, f\u0103r\u0103 a afecta semnificativ calitatea clasific\u0103rii?<\/b><\/p>\n<p>S\u0103 presupunem c\u0103 am antrenat multe modele ML, am generat caracteristici pe baza lor \u0219i am antrenat un alt model care clasific\u0103 documentele pentru utilizator. Totul ar fi bine, dar nu putem pur \u0219i simplu s\u0103 calcul\u0103m toate caracteristicile pentru toate documentele \u00een timp real, dac\u0103 exist\u0103 milioane de aceste documente, iar recomand\u0103rile trebuie generate \u00een 100-200 ms. Sarcina este de a selecta un subset din milioane, care va fi clasificat pentru utilizator. Aceast\u0103 etap\u0103 este de obicei denumit\u0103 selectarea candida\u021bilor. Iat\u0103 c\u00e2teva cerin\u021be pentru aceast\u0103 etap\u0103. \u00cen primul r\u00e2nd, selec\u021bia trebuie s\u0103 se desf\u0103\u0219oare foarte rapid, astfel \u00eenc\u00e2t s\u0103 r\u0103m\u00e2n\u0103 c\u00e2t mai mult timp pentru clasificare. \u00cen al doilea r\u00e2nd, prin reducerea semnificativ\u0103 a num\u0103rului de documente pentru clasificare, trebuie s\u0103 p\u0103str\u0103m c\u00e2t mai complet documentele relevante pentru utilizator.<\/p>\n<p>Principiul nostru de selec\u021bie a candida\u021bilor a evoluat treptat \u0219i \u00een prezent am ajuns la un sistem \u00een mai multe etape:<\/p>\n<p><img decoding=\"async\" alt=\"Cum ne gestion\u0103m calitatea \u0219i viteza \u00een selec\u021bia recomand\u0103rilor\" src=\"\/wp-content\/uploads\/2020\/02\/ed9657ed1febe871f36dc7cf7e585963.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nLa \u00eenceput, toate documentele sunt \u00eemp\u0103r\u021bite \u00een grupuri \u0219i din fiecare grup se aleg cele mai populare documente. Grupurile pot fi site-uri, teme, clustere. Pentru fiecare utilizator, pe baza istoricului s\u0103u, se aleg grupurile care \u00eei sunt cele mai apropiate \u0219i din acestea se aleg cele mai bune documente. De asemenea, folosim un index kNN pentru a selecta \u00een timp real documentele cele mai apropiate utilizatorului. Exist\u0103 mai multe metode de constructie a indexului kNN, iar la noi cel mai bine a func\u021bionat <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1603.09320\">HNSW<\/a><\/noindex> (Grafuri Ierarhice Navigabile de Mic\u0103 Lume). Aceasta este un model ierarhic care permite g\u0103sirea celor mai apropiate N vectori pentru utilizator dintr-o baz\u0103 de date de milioane. Prealabil, index\u0103m offline toat\u0103 baza noastr\u0103 de documente. Deoarece c\u0103utarea \u00een index func\u021bioneaz\u0103 destul de rapid, putem crea mai multe indec\u0219i (c\u00e2te unul pentru fiecare embedding) \u0219i s\u0103 ne adres\u0103m fiec\u0103ruia dintre ei \u00een timp real.<\/p>\n<p>Avem zeci de mii de documente disponibile pentru fiecare utilizator. Acesta r\u0103m\u00e2ne \u00eenc\u0103 o provocare pentru a calcula toate caracteristicile, a\u0219a c\u0103 \u00een aceast\u0103 etap\u0103 aplic\u0103m o clasificare u\u0219oar\u0103 - un model simplificat al unei clasific\u0103ri grele cu un num\u0103r mai mic de caracteristici. Scopul este de a prezice care documente vor ocupa primele pozi\u021bii \u00een modelul greu. Documentele cu cele mai mari predic\u021bii vor fi utilizate \u00een modelul greu, adic\u0103 \u00een ultima etap\u0103 de clasificare. Aceast\u0103 abordare permite reducerea \u00een c\u00e2teva zeci de milisecunde a bazei de documente considerate pentru utilizator de la milioane la mii.<\/p>\n<h2>Pasul ALS \u00een timp real<\/h2>\n<p>\n<b>Cum s\u0103 lu\u0103m \u00een considerare feedback-ul utilizatorului imediat dup\u0103 clic?<\/b><\/p>\n<p>Un factor important \u00een recomand\u0103ri este timpul de reac\u021bie la feedback-ul utilizatorului. Acest lucru este deosebit de important pentru utilizatorii noi: atunci c\u00e2nd o persoan\u0103 \u00eencepe s\u0103 utilizeze sistemul de recomandare, ea prime\u0219te un feed diversificat de documente. Odat\u0103 ce face primul clic, este esen\u021bial s\u0103 lu\u0103m imediat \u00een considerare acest lucru \u0219i s\u0103 ne adapt\u0103m la interesele sale. Dac\u0103 toate factorii sunt calcula\u021bi offline, reac\u021bia rapid\u0103 a sistemului va deveni imposibil\u0103 din cauza \u00eent\u00e2rzierii. A\u0219adar, este necesar s\u0103 proces\u0103m \u00een timp real ac\u021biunile utilizatorului. Pentru aceste scopuri, folosim pasul ALS \u00een timp real pentru a construi o reprezentare vectorial\u0103 a utilizatorului.<\/p>\n<p>S\u0103 presupunem c\u0103 avem o reprezentare vectorial\u0103 pentru toate documentele. De exemplu, putem construi embedding-uri offline pe baza textului articolului utiliz\u00e2nd ELMo, BERT sau alte modele de \u00eenv\u0103\u021bare automat\u0103. Cum putem ob\u021bine o reprezentare vectorial\u0103 a utilizatorilor \u00een acela\u0219i spa\u021biu pe baza interac\u021biunii lor cu sistemul?<\/p>\n<p><b class=\"spoiler_title\">Principiul general de formare \u0219i descompunere a matricei utilizator-document<\/b>S\u0103 presupunem c\u0103 avem m utilizatori \u0219i n documente. Pentru unii utilizatori, se cunoa\u0219te rela\u021bia lor cu anumite documente. Atunci, aceste informa\u021bii pot fi reprezentate sub form\u0103 de matrice m x n: r\u00e2ndurile corespund utilizatorilor, iar coloanele \u2014 documentelor. Deoarece majoritatea documentelor nu au fost vizualizate de utilizatori, majoritatea celulelor matricei vor r\u0103m\u00e2ne goale, iar altele vor fi completate. Fiecare eveniment (like, dislike, click) din matrice are un anumit valoare \u2014 dar s\u0103 lu\u0103m \u00een considerare un model simplificat, \u00een care un like corespunde cu 1, iar un dislike \u20131.<\/p>\n<p>S\u0103 descompunem matricea \u00een dou\u0103: P (m x d) \u0219i Q (d x n), unde d \u2014 dimensionalitatea reprezent\u0103rii vectoriale (de obicei, un num\u0103r mic). Astfel, fiec\u0103rui obiect \u00eei va corespunde un vector de dimensiune d (utilizatorului \u2014 un r\u00e2nd \u00een matricea P, documentului \u2014 o coloan\u0103 \u00een matricea Q). Aceste vectoare vor fi embedding-urile obiectelor respective. Pentru a prezice dac\u0103 utilizatorului \u00eei va pl\u0103cea un document, putem pur \u0219i simplu s\u0103-i \u00eenmul\u021bim embedding-urile.<\/p>\n<p><img decoding=\"async\" alt=\"Cum ne gestion\u0103m calitatea \u0219i viteza \u00een selec\u021bia recomand\u0103rilor\" src=\"\/wp-content\/uploads\/2020\/02\/a0c721bccb3806f2c4a18693a9458a89.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nUna dintre metodele posibile de descompunere a matricei este ALS (Alternating Least Squares). Vom optimiza urm\u0103toarea func\u021bie de pierdere:<\/p>\n<p><img decoding=\"async\" alt=\"Cum ne gestion\u0103m calitatea \u0219i viteza \u00een selec\u021bia recomand\u0103rilor\" src=\"\/wp-content\/uploads\/2020\/02\/aab8a1ae1cdf39de21e7469864c5190a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\nAici rui este interac\u021biunea utilizatorului u cu documentul i, qi este vectorul documentului i, iar pu este vectorul utilizatorului u.<\/p>\n<p>Atunci, vectorul optim \u00een termeni de eroare p\u0103tratic\u0103 medie al utilizatorului (av\u00e2nd vectorii documentelor fixa\u021bi) se g\u0103se\u0219te analitic prin rezolvarea regresiei liniare corespunz\u0103toare.<\/p>\n<p>Acesta se nume\u0219te \u201epasul ALS\u201d. Iar algoritmul ALS const\u0103 \u00een faptul c\u0103 altern\u0103m \u00eentre a fixa una dintre matrice (utilizatorii \u0219i articolele) \u0219i a actualiza cealalt\u0103, g\u0103sind solu\u021bia optim\u0103.<\/p>\n<p>Din fericire, g\u0103sirea reprezent\u0103rii vectoriale a utilizatorului este o opera\u021bie destul de rapid\u0103, pe care o putem face \u00een timpul execu\u021biei, folosind instruc\u021biuni vectoriale. Aceast\u0103 tehnic\u0103 permite s\u0103 lu\u0103m imediat \u00een considerare feedback-ul utilizatorului \u00een clasificare. Acela\u0219i embedding poate fi folosit \u0219i \u00een indexul kNN pentru a \u00eembun\u0103t\u0103\u021bi selec\u021bia candida\u021bilor.<\/p>\n<h2>Filtrare colaborativ\u0103 distribuit\u0103<\/h2>\n<p>\n<b>Cum s\u0103 facem factorizarea incremental\u0103 a matricei distribuite \u0219i s\u0103 g\u0103sim rapid reprezentarea vectorial\u0103 a noilor articole?<\/b><\/p>\n<p>Con\u021binutul nu este singura surs\u0103 de semnale pentru recomand\u0103ri. O alt\u0103 surs\u0103 important\u0103 este informa\u021bia colaborativ\u0103. Semnalele bune pentru clasificare pot fi ob\u021binute tradi\u021bional din descompunerea matricei utilizator-document. \u00cens\u0103, c\u00e2nd am \u00eencercat s\u0103 facem aceast\u0103 descompunere, ne-am confruntat cu probleme:<\/p>\n<p>1. Avem milioane de documente \u0219i zeci de milioane de utilizatori. Matricea nu \u00eencap pe o singur\u0103 ma\u0219in\u0103 \u0219i descompunerea va dura foarte mult.<br \/>\n2. La majoritatea con\u021binutului din sistem, timpul de via\u021b\u0103 este scurt: documentele r\u0103m\u00e2n relevante doar c\u00e2teva ore. Prin urmare, este necesar s\u0103 construim c\u00e2t mai repede o reprezentare vectorial\u0103 a acestora.<br \/>\n3. Dac\u0103 realiz\u0103m descompunerea imediat dup\u0103 publicarea documentului, nu va avea suficiente evalu\u0103ri din partea utilizatorilor. De aceea, reprezentarea sa vectorial\u0103 va fi, cu mare probabilitate, nu foarte bun\u0103.<br \/>\n4. Dac\u0103 un utilizator a dat un like sau un dislike, nu vom putea lua imediat acest lucru \u00een considerare \u00een descompunere.<\/p>\n<p>Pentru a rezolva problemele enumerate, am implementat o descompunere distribuit\u0103 a matricei utilizator-document cu actualiz\u0103ri incrementale frecvente. Cum func\u021bioneaz\u0103 aceasta?<\/p>\n<p>S\u0103 presupunem c\u0103 avem un cluster de N ma\u0219ini (N se contabilizeaz\u0103 \u00een sute) \u0219i dorim s\u0103 facem o descompunere distribuit\u0103 a matricei care nu \u00eencap pe o singur\u0103 ma\u0219in\u0103. \u00centrebarea este - cum se poate efectua aceast\u0103 descompunere astfel \u00eenc\u00e2t, pe de o parte, fiecare ma\u0219in\u0103 s\u0103 aib\u0103 suficiente date \u0219i, pe de alt\u0103 parte, calculele s\u0103 fie independente? <\/p>\n<p><img decoding=\"async\" alt=\"Cum ne gestion\u0103m calitatea \u0219i viteza \u00een selec\u021bia recomand\u0103rilor\" src=\"\/wp-content\/uploads\/2020\/02\/9170b0fecb6efcd41754ec20ee539a15.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVom folosi algoritmul de descompunere ALS descris mai sus. S\u0103 vedem cum se poate efectua distribu\u021bia unui pas ALS - celelalte pa\u0219i vor fi similare. S\u0103 presupunem c\u0103 avem matricea documentelor fixat\u0103 \u0219i dorim s\u0103 construim matricea utilizatorilor. Pentru aceasta, vom \u00eemp\u0103r\u021bi matricea \u00een N p\u0103r\u021bi pe r\u00e2nduri, fiecare parte av\u00e2nd un num\u0103r aproximativ egal de r\u00e2nduri. Vom trimite c\u0103tre fiecare ma\u0219in\u0103 celulele necompletate corespunz\u0103toare r\u00e2ndurilor, precum \u0219i matricea embeddingurilor documentelor (\u00een \u00eentregime). Deoarece aceasta nu are o dimensiune foarte mare, iar matricea utilizator-document este de obicei foarte rar\u0103, aceste date vor \u00eenc\u0103pea pe o ma\u0219in\u0103 obi\u0219nuit\u0103.<\/p>\n<p>Aceast\u0103 tehnic\u0103 poate fi repetat\u0103 pe parcursul mai multor epoci p\u00e2n\u0103 la convergen\u021ba modelului, schimb\u00e2nd alternativ matricea fixat\u0103. Dar chiar \u0219i atunci, descompunerea matricei poate dura c\u00e2teva ore. \u0218i acest lucru nu rezolv\u0103 problema c\u0103 trebuie s\u0103 ob\u021binem rapid embedding-uri pentru documentele noi \u0219i s\u0103 actualiz\u0103m embedding-urile celor care au avut pu\u021bine informa\u021bii \u00een timpul construirii modelului. <\/p>\n<p>Ne-a ajutat implementarea unei actualiz\u0103ri incrementale rapide a modelului. S\u0103 presupunem c\u0103 avem un model antrenat curent. De la antrenarea sa, au ap\u0103rut articole noi cu care utilizatorii no\u0219tri au interac\u021bionat, precum \u0219i articole care au avut pu\u021bin\u0103 interac\u021biune \u00een timpul antrenamentului. Pentru a ob\u021bine rapid embedding-uri pentru aceste articole, folosim embedding-uri de utilizatori ob\u021binute \u00een timpul primei antren\u0103ri mari a modelului \u0219i facem un pas ALS pentru a calcula matricea documentelor cu matricea utilizatorilor fixat\u0103. Acest lucru permite ob\u021binerea embedding-urilor destul de rapid \u2014 \u00een c\u00e2teva minute dup\u0103 publicarea documentului \u2014 \u0219i actualizarea frecvent\u0103 a embedding-urilor documentelor recente.<\/p>\n<p>Pentru ca ac\u021biunile unei persoane s\u0103 fie luate \u00een considerare imediat \u00een recomand\u0103ri, \u00een timpul rul\u0103rii nu folosim embedding-uri de utilizatori ob\u021binute \u00een offline. \u00cen schimb, facem un pas ALS \u0219i ob\u021binem vectorul actualizat al utilizatorului.<\/p>\n<h2>Transfer pe un alt domeniu<\/h2>\n<p>\n<b>Cum s\u0103 utiliz\u0103m feedback-ul utilizatorului pe articolele text pentru a construi o reprezentare vectorial\u0103 a videoclipurilor?<\/b><\/p>\n<p>Ini\u021bial, recomandam doar articole text, a\u0219a c\u0103 multe dintre algoritmii no\u0219tri sunt adapta\u021bi pentru acest tip de con\u021binut. Dar la ad\u0103ugarea de con\u021binut de alt tip, ne-am confruntat cu necesitatea adapt\u0103rii modelelor. Cum am abordat aceast\u0103 problem\u0103 \u00een cazul videoclipurilor? Una dintre op\u021biuni este s\u0103 reantren\u0103m toate modelele de la zero. Dar aceasta dureaz\u0103 mult, iar unele algoritmi sunt preten\u021bio\u0219i \u00een ceea ce prive\u0219te volumul setului de antrenament, care nu exist\u0103 \u00een cantitatea necesar\u0103 pentru con\u021binutul nou \u00een primele momente ale vie\u021bii sale pe serviciu.<\/p>\n<p>Am ales o abordare diferit\u0103 \u0219i am reutilizat modelele de texte pentru video. \u00cen crearea reprezent\u0103rilor vectoriale ale video-urilor, ne-a ajutat acela\u0219i truc cu ALS. Am luat reprezentarea vectorial\u0103 a utilizatorilor bazat\u0103 pe articolele textuale \u0219i am f\u0103cut un pas ALS, folosind informa\u021biile despre vizion\u0103rile video. Astfel, am ob\u021binut f\u0103r\u0103 dificultate reprezentarea vectorial\u0103 a video-urilor. Iar \u00een timpul execu\u021biei, calcul\u0103m pur \u0219i simplu apropierea dintre vectorul utilizatorului, ob\u021binut pe baza articolelor textuale, \u0219i vectorul video.<\/p>\n<h2>Concluzie<\/h2>\n<p>\nDezvoltarea nucleului sistemului de recomandare \u00een timp real este \u00eenso\u021bit\u0103 de multe provoc\u0103ri. Este necesar s\u0103 proces\u0103m rapid datele \u0219i s\u0103 aplic\u0103m metode ML pentru a utiliza eficient aceste date; s\u0103 construim sisteme distribuite complexe capabile s\u0103 proceseze semnalele utilizatorilor \u0219i noile unit\u0103\u021bi de con\u021binut \u00een cel mai scurt timp; \u0219i multe alte sarcini.<\/p>\n<p>\u00cen sistemul actual, a c\u0103rui structur\u0103 o descriu, calitatea recomand\u0103rilor pentru utilizator cre\u0219te odat\u0103 cu activitatea sa \u0219i durata petrecut\u0103 pe serviciu. Dar, desigur, aceasta este \u0219i principala dificultate: sistemul are dificult\u0103\u021bi \u00een a \u00een\u021belege imediat interesele unei persoane care a interac\u021bionat pu\u021bin cu con\u021binutul. \u00cembun\u0103t\u0103\u021birea recomand\u0103rilor pentru utilizatorii noi este sarcina noastr\u0103 principal\u0103. Vom continua s\u0103 optimiz\u0103m algoritmii, astfel \u00eenc\u00e2t con\u021binutul relevant pentru utilizator s\u0103 ajung\u0103 mai repede \u00een feed-ul s\u0103u, iar cel mai pu\u021bin relevant s\u0103 nu fie afi\u0219at.<br \/>\n<br \/>Sursa: <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.2.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\/ro\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Cum lucr\u0103m pentru a asigura calitatea \u0219i viteza recomand\u0103rilor | ProHoster","description":"Numele meu este Pavel Parchomenko, sunt dezvoltator ML. \u00cen acest articol a\u0219 dori s\u0103 v\u0103 povestesc despre structura serviciului Yandex Zen \u0219i s\u0103 \u00eemp\u0103rt\u0103\u0219esc \u00eembun\u0103t\u0103\u021birile tehnice implementate, care au permis cre\u0219terea calit\u0103\u021bii recomand\u0103rilor.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/71852","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=71852"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/71852\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/71853"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=71852"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=71852"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=71852"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}