{"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\/da\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","title":{"rendered":"Hvordan vi arbejder p\u00e5 kvaliteten og hastigheden af anbefalinger","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Mit navn er Pavel Parhomenko, jeg er ML-udvikler. I denne artikel vil jeg gerne fort\u00e6lle om, hvordan Yandex.Zen-service fungerer, og dele de tekniske forbedringer, hvis implementering har gjort det muligt at \u00f8ge kvaliteten af anbefalingerne. I dette indl\u00e6g vil du l\u00e6re, hvordan man p\u00e5 bare f\u00e5 millisekunder finder de mest relevante dokumenter blandt millioner af dokumenter; hvordan man udf\u00f8rer en kontinuerlig decomposition af en stor matrix (best\u00e5ende af millioner af kolonner og titusinder af millioner r\u00e6kker), s\u00e5 nye dokumenter f\u00e5r deres vektor p\u00e5 under ti minutter; hvordan man genbruger matrixdekompositionen bruger-artikel for at opn\u00e5 en god vektorpr\u00e6sentation for video.<\/p>\n<p><img decoding=\"async\" alt=\"Hvordan vi arbejder p\u00e5 kvaliteten og hastigheden af anbefalinger\" 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 \/>\nVores anbefalingsdatabase indeholder millioner af dokumenter i forskellige formater: tekstartikler, der er oprettet p\u00e5 vores platform og hentet fra eksterne websteder, videoer, fort\u00e6llinger og korte indl\u00e6g. Udviklingen af en s\u00e5dan service er forbundet med et stort antal tekniske udfordringer. Her er nogle af dem:<\/p>\n<ul>\n<li>Opdele computingopgaver: alle tunge operationer skal udf\u00f8res offline, mens hurtige anvendelser af modeller kun skal finde sted i realtid, s\u00e5 vi kan svare inden for 100-200 ms.<\/li>\n<li>Hurtigt tage h\u00f8jde for brugerens handlinger. For dette er det n\u00f8dvendigt, at alle begivenheder straks leveres til anbefaleren og p\u00e5virker resultaterne af modellerne.<\/li>\n<li>G\u00f8re nyhedsfeedet s\u00e5dan, at det hurtigt tilpasser sig nye brugeres adf\u00e6rd. Nyligt ankomne til systemet skal f\u00f8le, at deres feedback p\u00e5virker anbefalingerne.<\/li>\n<li>Hurtigt forst\u00e5, hvem man skal anbefale en ny artikel til.<\/li>\n<li>Reagere hurtigt p\u00e5 den konstante str\u00f8m af nyt indhold. Ti tusinde artikler offentligg\u00f8res hver dag, og mange af dem har en begr\u00e6nset levetid (lad os sige, nyheder). Dette adskiller dem fra film, musik og andet indhold, der lever l\u00e6nge og er dyrt at producere.<\/li>\n<li>Overf\u00f8re viden fra \u00e9t dom\u00e6ne til et andet. Hvis der i anbefalingssystemet er tr\u00e6nede modeller for tekstartikler, og vi tilf\u00f8jer video, kan vi genbruge eksisterende modeller, s\u00e5 indhold af den nye type rangeres bedre.<\/li>\n<\/ul>\n<p>\nJeg vil fort\u00e6lle, hvordan vi l\u00f8ste disse opgaver.<\/p>\n<h2>Udv\u00e6lgelse af kandidater<\/h2>\n<p>\n<b>Hvordan kan man p\u00e5 f\u00e5 millisekunder reducere et stort antal dokumenter tusindfold, uden v\u00e6sentligt at forringe rangeringen?<\/b><\/p>\n<p>Lad os antage, at vi har tr\u00e6net mange ML-modeller, genereret funktioner baseret p\u00e5 dem, og tr\u00e6net endnu en model, der rangerer dokumenter for brugeren. Alt ville v\u00e6re godt, men man kan ikke bare beregne alle funktionerne for alle dokumenter i realtid, hvis der er millioner af disse dokumenter, og anbefalinger skal laves p\u00e5 100-200 ms. Opgaven er at v\u00e6lge et underomr\u00e5de fra millioner, som vil blive rangeret for brugeren. Dette trin kaldes normalt kandidatudv\u00e6lgelse. Der stilles flere krav til det. For det f\u00f8rste skal udv\u00e6lgelsen ske meget hurtigt, s\u00e5 der er mest muligt tid til selve rangeringen. For det andet, ved kraftigt at reducere antallet af dokumenter til rangering, skal vi maksimalt bevare de relevante dokumenter for brugeren.<\/p>\n<p>Vores princip for kandidatudv\u00e6lgelse har udviklet sig over tid, og i \u00f8jeblikket er vi n\u00e5et til et flertrins-system:<\/p>\n<p><img decoding=\"async\" alt=\"Hvordan vi arbejder p\u00e5 kvaliteten og hastigheden af anbefalinger\" src=\"\/wp-content\/uploads\/2020\/02\/ed9657ed1febe871f36dc7cf7e585963.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nF\u00f8rst opdeles alle dokumenter i grupper, og fra hver gruppe v\u00e6lges de mest popul\u00e6re dokumenter. Grupperne kan v\u00e6re websteder, emner eller klynger. For hver bruger v\u00e6lges de grupper, der passer bedst til deres historie, og herfra v\u00e6lges de bedste dokumenter. Vi bruger ogs\u00e5 en kNN-indeks til at finde de dokumenter, der mest ligner brugeren, i realtid. Der findes flere metoder til at opbygge kNN-indeks, hos os fungerer den bedst <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1603.09320\">HNSW<\/a><\/noindex> (Hierarchical Navigable Small World graphs). Dette er en hierarkisk model, der g\u00f8r det muligt at finde N n\u00e6rmeste vektorer for brugeren fra en millionbase p\u00e5 f\u00e5 millisekunder. Forud for dette indekserer vi offline hele vores dokumentbase. Da s\u00f8gning i indekset fungerer ret hurtigt, kan man ved at have flere kraftige embeddings lave flere indekser (\u00e9n for hver embedding) og tilg\u00e5 hver af dem i realtid.<\/p>\n<p>Vi har titusindvis af dokumenter til hver bruger. Det er stadig mange at t\u00e6lle alle egenskaber, s\u00e5 p\u00e5 dette tidspunkt anvender vi en let rangering - en forenklet model af tung rangering med f\u00e6rre egenskaber. Opgaven er at forudsige, hvilke dokumenter der vil v\u00e6re i toppen hos den tunge model. Dokumenter med den h\u00f8jeste forudsigelse vil blive brugt i den tunge model, dvs. p\u00e5 det sidste rangeringstrin. Denne tilgang g\u00f8r det muligt at reducere m\u00e6ngden af dokumenter, der overvejes for brugeren, fra millioner til tusinder p\u00e5 blot nogle f\u00e5 millisekunder.<\/p>\n<h2>ALS-trin i runtime<\/h2>\n<p>\n<b>Hvordan tager man h\u00f8jde for brugerens feedback straks efter et klik?<\/b><\/p>\n<p>En vigtig faktor i anbefalinger er responstiden p\u00e5 brugerfeedback. Dette er is\u00e6r vigtigt for nye brugere: n\u00e5r en person f\u00f8rst begynder at bruge anbefalingssystemet, f\u00e5r han en upersonlig str\u00f8m af forskellige tematiske dokumenter. S\u00e5 snart han foretager sit f\u00f8rste klik, skal dette straks tages i betragtning, og systemet skal tilpasse sig hans interesser. Hvis man beregner alle faktorer offline, vil hurtig respons fra systemet blive umulig p\u00e5 grund af forsinkelser. Derfor er det n\u00f8dvendigt at behandle brugerens handlinger i realtid. Til disse form\u00e5l bruger vi ALS-trinnet i runtime til at opbygge en vektorrepr\u00e6sentation af brugeren.<\/p>\n<p>Antag, at vi har en vektorrepr\u00e6sentation for alle dokumenter. For eksempel kan vi offline opbygge indlejringer baseret p\u00e5 tekstindholdet i artiklen ved hj\u00e6lp af ELMo, BERT eller andre maskinl\u00e6ringsmodeller. Hvordan kan vi f\u00e5 brugerens vektorrepr\u00e6sentation i det samme rum baseret p\u00e5 deres interaktion i systemet?<\/p>\n<p><b class=\"spoiler_title\">Den generelle metode til dannelse og nedbrydning af brugerdokumentmatrixen<\/b>Lad os sige, at vi har m brugere og n dokumenter. For nogle brugere kender vi deres forhold til nogle dokumenter. S\u00e5 kan denne information repr\u00e6senteres i en matrix m x n: r\u00e6kkerne svarer til brugerne, og kolonnerne svarer til dokumenterne. Da de fleste dokumenter aldrig er blevet set af en person, vil st\u00f8rstedelen af matrixens celler forblive tomme, mens andre vil v\u00e6re udfyldt. For hver h\u00e6ndelse (like, dislike, klik) i matrixt er der foreskrevet en bestemt v\u00e6rdi - men lad os overveje en forenklet model, hvor et like svarer til 1, og et dislike til -1.<\/p>\n<p>Lad os opdele matrixen i to: P (m x d) og Q (d x n), hvor d er dimensionen af den vektorm\u00e6ssige repr\u00e6sentation (normalt et lille tal). S\u00e5 vil hver objekt have en d-dimensionel vektor (brugerens r\u00e6kke i matrixen P, dokumentets kolonne i matrixen Q). Disse vektorer vil v\u00e6re indlejringerne af de tilsvarende objekter. For at forudsige, om et dokument vil blive bestemt som v\u00e6rende godt af brugeren, kan vi blot multiplicere deres indlejringer.<\/p>\n<p><img decoding=\"async\" alt=\"Hvordan vi arbejder p\u00e5 kvaliteten og hastigheden af anbefalinger\" src=\"\/wp-content\/uploads\/2020\/02\/a0c721bccb3806f2c4a18693a9458a89.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEn mulig metode til matrixopdeling er ALS (Alternating Least Squares). Vi vil optimere den f\u00f8lgende tabfunktion:<\/p>\n<p><img decoding=\"async\" alt=\"Hvordan vi arbejder p\u00e5 kvaliteten og hastigheden af anbefalinger\" src=\"\/wp-content\/uploads\/2020\/02\/aab8a1ae1cdf39de21e7469864c5190a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\nHer er rui interaktionen mellem bruger u og dokument i, qi er dokument i's vektor, pu er bruger u's vektor.<\/p>\n<p>S\u00e5 den optimale vektor for brugeren (givet de faste dokumentvektorer) findes analytisk ved at l\u00f8se den relevante line\u00e6re regression.<\/p>\n<p>Dette kaldes \"ALS-trinnet\". Selve ALS-algoritmen best\u00e5r i, at vi skiftevis fasts\u00e6tter en af matrixerne (brugere og artikler) og opdaterer den anden, og finder den optimale l\u00f8sning.<\/p>\n<p>Heldigvis er det en ret hurtig operation at finde brugerens vektorrepr\u00e6sentation, som kan udf\u00f8res ved runtime ved hj\u00e6lp af vektorinstruktioner. Dette trick tillader os med det samme at tage h\u00f8jde for brugerens feedback i rangeringen. Den samme indlejring kan ogs\u00e5 bruges i kNN-indekset for at forbedre udv\u00e6lgelsen af kandidater.<\/p>\n<h2>Fordelt kollaborativ filtrering<\/h2>\n<p>\n<b>Hvordan laver man inkrementel distribueret matrixfaktorisering og hurtigt finder den vektorm\u00e6ssige repr\u00e6sentation af nye artikler?<\/b><\/p>\n<p>Indhold er ikke den eneste kilde til signaler for anbefalinger. En anden vigtig kilde er samarbejdsinformation. Gode indikatorer for rangering kan traditionelt opn\u00e5s ved at nedbryde bruger-dokument-matricen. Men n\u00e5r vi fors\u00f8gte at udf\u00f8re en s\u00e5dan nedbrydning, st\u00f8dte vi p\u00e5 problemer:<\/p>\n<p>1. Vi har millioner af dokumenter og titusinder af millioner af brugere. Matricen kan ikke opbevares p\u00e5 \u00e9n enkelt maskine, og nedbrydningen vil v\u00e6re meget langvarig.<br \/>\n2. St\u00f8rstedelen af indholdet i systemet har en kort levetid: dokumenter er kun relevante i et par timer. Derfor er det n\u00f8dvendigt at opbygge deres vektoriske repr\u00e6sentation s\u00e5 hurtigt som muligt.<br \/>\n3. Hvis man laver nedbrydningen lige efter dokumentets offentligg\u00f8relse, vil det ikke n\u00e5 at blive vurderet af et tilstr\u00e6kkeligt antal brugere. Derfor vil dens vektoriske repr\u00e6sentation h\u00f8jst sandsynligt ikke v\u00e6re s\u00e6rlig god.<br \/>\n4. Hvis en bruger har givet et like eller dislike, vil vi ikke kunne tage dette i betragtning i nedbrydningen med det samme.<\/p>\n<p>For at l\u00f8se de n\u00e6vnte problemer har vi implementeret en distribueret nedbrydning af bruger-dokument-matricen med hyppige inkrementelle opdateringer. Hvordan fungerer det pr\u00e6cist?<\/p>\n<p>Antag, at vi har et cluster af N maskiner (N t\u00e6lles i hundreder), og vi \u00f8nsker at udf\u00f8re en distribueret nedbrydning af matricen, som ikke kan opbevares p\u00e5 \u00e9n maskine. Sp\u00f8rgsm\u00e5let er, hvordan vi udf\u00f8rer denne nedbrydning, s\u00e5 der p\u00e5 den ene side er tilstr\u00e6kkeligt med data p\u00e5 hver maskine, og p\u00e5 den anden side at beregningerne forbliver uafh\u00e6ngige? <\/p>\n<p><img decoding=\"async\" alt=\"Hvordan vi arbejder p\u00e5 kvaliteten og hastigheden af anbefalinger\" src=\"\/wp-content\/uploads\/2020\/02\/9170b0fecb6efcd41754ec20ee539a15.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi vil bruge den beskrevne ALS-nedbrydningsalgoritme. Lad os se p\u00e5, hvordan vi distribuerer \u00e9n ALS-trin - de \u00f8vrige trin vil v\u00e6re lignende. Antag, at vi har den dokumentmatrix fastlagt, og vi \u00f8nsker at opbygge brugermatricen. For at g\u00f8re dette opdelar vi den i N dele efter r\u00e6kkerne, hver del vil indeholde omtrent det samme antal r\u00e6kker. Vi sender ikke-tomme celler af de tilsvarende r\u00e6kker til hver maskine samt dokumentembedding matricen (i sin helhed). Da dens st\u00f8rrelse ikke er s\u00e6rlig stor, og bruger-dokument matricen normalt er meget sparsom, vil disse data kunne opbevares p\u00e5 en almindelig maskine.<\/p>\n<p>Denne metode kan gentages i flere epoker indtil modelkonvergens, ved skiftevis at \u00e6ndre den faste matrix. Men selv da kan matrixfaktoriseringen tage flere timer. Og det l\u00f8ser ikke problemet med, at vi hurtigt skal generere embedding af nye dokumenter og opdatere embeddingene af de dokumenter, som havde lidt information under modeltr\u00e6ningen. <\/p>\n<p>Vi blev hjulpet af implementeringen af en hurtig inkrementel opdatering af modellen. Lad os antage, at vi har en nuv\u00e6rende tr\u00e6net model. Siden dens tr\u00e6ning er der kommet nye artikler, som vores brugere har interageret med, samt artikler som under tr\u00e6ningen havde lidt interaktioner. For hurtigt at generere embedding af s\u00e5danne artikler bruger vi brugerembeddingene, der blev opn\u00e5et under den f\u00f8rste store tr\u00e6ning af modellen, og udf\u00f8rer et ALS-trin for at beregne dokumentmatrixen med en fast bruger-matrix. Dette g\u00f8r det muligt at f\u00e5 embedding ret hurtigt - inden for f\u00e5 minutter efter offentligg\u00f8relsen af dokumentet - og ofte opdatere embedding af friske dokumenter.<\/p>\n<p>For at anbefalingerne straks tager h\u00f8jde for menneskelige handlinger, bruger vi ikke bruger-embedding opn\u00e5et offline i runtime. I stedet udf\u00f8rer vi et ALS-trin og f\u00e5r den aktuelle brugervektor.<\/p>\n<h2>Overf\u00f8rsel til et andet dom\u00e6ne<\/h2>\n<p>\n<b>Hvordan kan man bruge feedback fra brugere af tekstartikler til at opbygge en vektorisk repr\u00e6sentation af video?<\/b><\/p>\n<p>Oprindeligt anbefalede vi kun tekstartikler, s\u00e5 mange af vores algoritmer er skr\u00e6ddersyet til denne type indhold. Men ved tils\u00e6tning af indhold af en anden type st\u00f8dte vi p\u00e5 behovet for at tilpasse modellerne. Hvordan l\u00f8ste vi denne opgave i forbindelse med video? En mulighed er at gentr\u00e6ne alle modeller fra bunden. Men det tager tid, desuden er nogle af algoritmerne kr\u00e6vende, hvad ang\u00e5r st\u00f8rrelsen af tr\u00e6ningsdatas\u00e6ttet, som endnu ikke er tilstr\u00e6kkeligt for det nye indholds type i de f\u00f8rste \u00f8jeblikke af dets liv p\u00e5 tjenesten.<\/p>\n<p>Vi tog en anden tilgang og genbrugt tekstmodeller til video. I skabelsen af vektorrepr\u00e6sentationer for video hjalp den samme ALS-trick os. Vi tog brugerens vektorrepr\u00e6sentation baseret p\u00e5 tekstartikler og udf\u00f8rte et ALS-tr\u00e6k ved at bruge videoafspilningsdata. S\u00e5dan fik vi nemt vektorrepr\u00e6sentationen for video. Og i runtime beregner vi blot n\u00e6rheden mellem brugerens vektor, der er opn\u00e5et p\u00e5 baggrund af tekstartikler, og videoens vektor.<\/p>\n<h2>Konklusion<\/h2>\n<p>\nUdviklingen af kernen i det realtidsanbefalingssystem er forbundet med mange opgaver. Det er n\u00f8dvendigt hurtigt at behandle data og anvende ML-metoder for effektivt at udnytte disse data; opbygge komplekse distribuerede systemer, der kan behandle brugerens signaler og nye indholdsenheder p\u00e5 kort tid; og mange andre opgaver.<\/p>\n<p>I det nuv\u00e6rende system, hvis enhed jeg har beskrevet, vokser kvaliteten af anbefalinger for brugeren i takt med deres aktivitet og opholdstid i tjenesten. Men naturligvis ligger den st\u00f8rste udfordring her: systemet har sv\u00e6rt ved straks at forst\u00e5 en persons interesser, som har haft lidt interaktion med indholdet. Forbedring af anbefalinger til nye brugere er vores n\u00f8gleopgave. Vi vil forts\u00e6tte med at optimere algoritmerne, s\u00e5 relevant indhold hurtigere n\u00e5r brugerens feed, mens irrelevant indhold ikke vises.<br \/>\n<br \/>Kilde: <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.3 - 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\/da\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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\udd47Hvordan vi arbejder med kvalitet og hastighed i anbefalinger | ProHoster","description":"Mit navn er Pavel Parkhomenko, jeg er ML-udvikler. I denne artikel vil jeg gerne fort\u00e6lle om opbygningen af Yandex.Zen-tjenesten og dele tekniske forbedringer, hvis implementering har gjort det muligt at \u00f8ge kvaliteten af anbefalinger.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/71852","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=71852"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/71852\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/71853"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=71852"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=71852"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=71852"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}