{"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\/sv\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","title":{"rendered":"Hur vi arbetar med kvalitet och hastighet f\u00f6r rekommendationer","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Jag heter Pavel Parkhomenko och jag \u00e4r ML-utvecklare. I den h\u00e4r artikeln skulle jag vilja ber\u00e4tta om hur Yandex Zen-tj\u00e4nsten fungerar och dela med mig av tekniska f\u00f6rb\u00e4ttringar som har gjort det m\u00f6jligt att \u00f6ka kvaliteten p\u00e5 rekommendationerna. I inl\u00e4gget kommer du att l\u00e4ra dig hur man hittar de mest relevanta dokumenten f\u00f6r anv\u00e4ndaren bland miljoner dokument p\u00e5 bara n\u00e5gra millisekunder; hur man g\u00f6r kontinuerlig nedbrytning av en stor matris (som best\u00e5r av miljoner kolumner och tiotals miljoner rader), s\u00e5 att nya dokument f\u00e5r sin vektor p\u00e5 bara n\u00e5gra minuter; hur man \u00e5teranv\u00e4nder nedbrytning av matrisen anv\u00e4ndare-artikel f\u00f6r att f\u00e5 en bra vektorrepr\u00e4sentation f\u00f6r videor.<\/p>\n<p><img decoding=\"async\" alt=\"Hur vi arbetar med kvalitet och hastighet f\u00f6r rekommendationer\" 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 \/>\nV\u00e5r rekommendationsdatabas inneh\u00e5ller miljoner dokument i olika format: textartiklar skapade p\u00e5 v\u00e5r plattform och h\u00e4mtade fr\u00e5n externa webbplatser, videor, ber\u00e4ttelser och korta inl\u00e4gg. Utvecklingen av en s\u00e5dan tj\u00e4nst \u00e4r kopplad till ett stort antal tekniska utmaningar. H\u00e4r \u00e4r n\u00e5gra av dem:<\/p>\n<ul>\n<li>Dela upp ber\u00e4kningsuppgifterna: alla tunga operationer ska g\u00f6ras offline, medan vi endast ska utf\u00f6ra snabb till\u00e4mpning av modeller i realtid f\u00f6r att svara inom 100-200 ms.<\/li>\n<li>Snabbt ta h\u00e4nsyn till anv\u00e4ndarens handlingar. F\u00f6r detta beh\u00f6ver alla h\u00e4ndelser omedelbart levereras till rekommendatorn och p\u00e5verka modellernas resultat.<\/li>\n<li>G\u00f6ra fl\u00f6det s\u00e5 att det snabbt anpassar sig till nya anv\u00e4ndares beteende. Nya anv\u00e4ndare som just kommit in i systemet m\u00e5ste k\u00e4nna att deras feedback p\u00e5verkar rekommendationerna.<\/li>\n<li>Snabbt f\u00f6rst\u00e5 vem man ska rekommendera en ny artikel till.<\/li>\n<li>Omedelbart reagera p\u00e5 det st\u00e4ndiga fl\u00f6det av nytt inneh\u00e5ll. Tiotusentals artiklar publiceras varje dag, och m\u00e5nga av dem har en begr\u00e4nsad livsl\u00e4ngd (l\u00e5t oss s\u00e4ga nyheter). Detta skiljer dem fr\u00e5n filmer, musik och annat l\u00e5nglivat och kostsamt inneh\u00e5ll.<\/li>\n<li>\u00d6verf\u00f6ra kunskaper fr\u00e5n ett dom\u00e4nomr\u00e5de till ett annat. Om det finns utbildade modeller f\u00f6r textartiklar i rekommendationssystemet och vi l\u00e4gger till videor kan vi \u00e5teranv\u00e4nda befintliga modeller s\u00e5 att nytt inneh\u00e5ll rankas b\u00e4ttre.<\/li>\n<\/ul>\n<p>\nJag kommer att ber\u00e4tta hur vi l\u00f6ste dessa uppgifter.<\/p>\n<h2>Urval av kandidater<\/h2>\n<p>\n<b>Hur man p\u00e5 n\u00e5gra millisekunder kan minska m\u00e4ngden dokument som \u00f6verv\u00e4gs tusenfalt, utan att f\u00f6rs\u00e4mra rankingkvaliteten avsev\u00e4rt?<\/b><\/p>\n<p>Anta att vi har tr\u00e4nat m\u00e5nga ML-modeller, genererat funktioner baserade p\u00e5 dem och tr\u00e4nat en annan modell som rankar dokument f\u00f6r anv\u00e4ndaren. Det skulle vara bra, men man kan inte bara ber\u00e4kna alla funktioner f\u00f6r alla dokument i realtid, om det handlar om miljontals dokument och rekommendationer m\u00e5ste byggas p\u00e5 100-200 ms. Utmaningen \u00e4r att v\u00e4lja ett delm\u00e4ngd av miljontals dokument som ska rankas f\u00f6r anv\u00e4ndaren. Steget kallas vanligtvis kandidatselektion. Det finns flera krav p\u00e5 detta steg. F\u00f6r det f\u00f6rsta m\u00e5ste valet g\u00e5 mycket snabbt s\u00e5 att det finns s\u00e5 mycket tid som m\u00f6jligt kvar f\u00f6r sj\u00e4lva rankningen. F\u00f6r det andra, genom att kraftigt minska antalet dokument f\u00f6r rankning, m\u00e5ste vi bevara s\u00e5 relevanta dokument f\u00f6r anv\u00e4ndaren som m\u00f6jligt.<\/p>\n<p>V\u00e5r princip f\u00f6r kandidatselektion har utvecklats \u00f6ver tid, och just nu har vi kommit fram till ett flerlagersschema:<\/p>\n<p><img decoding=\"async\" alt=\"Hur vi arbetar med kvalitet och hastighet f\u00f6r rekommendationer\" src=\"\/wp-content\/uploads\/2020\/02\/ed9657ed1febe871f36dc7cf7e585963.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nF\u00f6rst delas alla dokument upp i grupper, och fr\u00e5n varje grupp v\u00e4ljs de mest popul\u00e4ra dokumenten. Grupper kan vara webbplatser, \u00e4mnen, kluster. F\u00f6r varje anv\u00e4ndare anges de n\u00e4rmaste grupperna baserat p\u00e5 dess historik, och de b\u00e4sta dokumenten tas fr\u00e5n dessa. Vi anv\u00e4nder dessutom ett kNN-index f\u00f6r att snabbt kunna hitta de mest relevanta dokumenten f\u00f6r anv\u00e4ndaren i realtid. Det finns flera metoder f\u00f6r att bygga kNN-index, och v\u00e5r metod som har funkat b\u00e4st \u00e4r <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1603.09320\">HNSW<\/a><\/noindex> (Hierarchical Navigable Small World graphs). Detta \u00e4r en hierarkisk modell som g\u00f6r det m\u00f6jligt att p\u00e5 n\u00e5gra millisekunder hitta de N n\u00e4rmaste vektorerna f\u00f6r anv\u00e4ndaren fr\u00e5n en bas av miljoner. Vi indexerar hela v\u00e5r dokumentbas offline i f\u00f6rv\u00e4g. Eftersom s\u00f6kningen i indexet g\u00e5r ganska snabbt kan man, vid tillg\u00e5ng till flera starka inb\u00e4ddningar, skapa flera index (ett f\u00f6r varje inb\u00e4ddning) och f\u00e5 \u00e5tkomst till var och en av dem i realtid.<\/p>\n<p>Vi har tiotusentals dokument f\u00f6r varje anv\u00e4ndare. Det \u00e4r fortfarande mycket att r\u00e4kna p\u00e5 alla attribut, s\u00e5 i det h\u00e4r steget till\u00e4mpar vi en l\u00e4tt rangordning \u2014 en f\u00f6renklad modell av tung rangordning med f\u00e4rre attribut. M\u00e5let \u00e4r att f\u00f6ruts\u00e4ga vilka dokument som kommer att hamna p\u00e5 toppen hos den tunga modellen. Dokument med h\u00f6gst prediktion kommer att anv\u00e4ndas i den tunga modellen, det vill s\u00e4ga i det sista rangordningssteget. Denna metod g\u00f6r att vi p\u00e5 n\u00e5gra tiotal millisekunder kan minska m\u00e4ngden dokument som \u00f6verv\u00e4gs f\u00f6r anv\u00e4ndaren fr\u00e5n miljoner till tusentals.<\/p>\n<h2>ALS-steget i realtid<\/h2>\n<p>\n<b>Hur beaktar man anv\u00e4ndarfeedback direkt efter klick?<\/b><\/p>\n<p>En viktig faktor i rekommendationer \u00e4r responstiden p\u00e5 anv\u00e4ndarfeedback. Detta \u00e4r s\u00e4rskilt viktigt f\u00f6r nya anv\u00e4ndare: n\u00e4r en person f\u00f6rst b\u00f6rjar anv\u00e4nda rekommendationssystemet f\u00e5r han en opersonifierad fl\u00f6de av dokument av olika \u00e4mnen. S\u00e5 snart han g\u00f6r sitt f\u00f6rsta klick m\u00e5ste detta beaktas omedelbart och anpassas efter hans intressen. Om man ber\u00e4knar alla faktorer offline blir systemets snabba respons om\u00f6jlig p\u00e5 grund av f\u00f6rdr\u00f6jning. S\u00e5 det \u00e4r n\u00f6dv\u00e4ndigt att bearbeta anv\u00e4ndarens \u00e5tg\u00e4rder i realtid. F\u00f6r detta syfte anv\u00e4nder vi ALS-steget i realtid f\u00f6r att bygga en vektorrepresentation av anv\u00e4ndaren.<\/p>\n<p>Anta att vi har en vektorrepresentation f\u00f6r alla dokument. Till exempel kan vi offline bygga inb\u00e4ddningar baserade p\u00e5 texten i artikeln med hj\u00e4lp av ELMo, BERT eller andra maskininl\u00e4rningsmodeller. Hur f\u00e5r man en vektorrepresentation av anv\u00e4ndarna i samma rum baserat p\u00e5 deras interaktioner i systemet?<\/p>\n<p><b class=\"spoiler_title\">Den allm\u00e4nna principen f\u00f6r att bilda och dekomponera anv\u00e4ndardokumentmatrisen<\/b>L\u00e5t oss s\u00e4ga att vi har m anv\u00e4ndare och n dokument. F\u00f6r vissa anv\u00e4ndare \u00e4r deras relation till vissa dokument k\u00e4nd. Denna information kan d\u00e5 representeras i en matris m x n: raderna motsvarar anv\u00e4ndarna och kolumnerna \u2014 dokumenten. Eftersom de flesta dokument en person inte har sett, kommer en stor del av cellerna i matrisen att f\u00f6rbli tomma, medan andra kommer att fyllas i. F\u00f6r varje h\u00e4ndelse (gilla, ogilla, klicka) finns det ett visst v\u00e4rde i matrisen \u2014 men l\u00e5t oss \u00f6verv\u00e4ga en f\u00f6renklad modell d\u00e4r ett gilla motsvarar 1, och ett ogilla \u20131.<\/p>\n<p>Vi delar upp matrisen i tv\u00e5: P (m x d) och Q (d x n), d\u00e4r d \u00e4r dimensionen av den vektoriska representationen (vanligtvis ett litet tal). D\u00e5 motsvarar varje objekt en d-dimensionell vektor (anv\u00e4ndaren \u2014 en rad i matrisen P, dokumentet \u2014 en kolumn i matrisen Q). Dessa vektorer kommer att vara inb\u00e4ddningar av motsvarande objekt. F\u00f6r att f\u00f6ruts\u00e4ga om en anv\u00e4ndare kommer att gilla ett dokument kan vi helt enkelt multiplicera deras inb\u00e4ddningar.<\/p>\n<p><img decoding=\"async\" alt=\"Hur vi arbetar med kvalitet och hastighet f\u00f6r rekommendationer\" src=\"\/wp-content\/uploads\/2020\/02\/a0c721bccb3806f2c4a18693a9458a89.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEtt av de m\u00f6jliga s\u00e4tten att dekonstruera matrisen \u00e4r ALS (Alternating Least Squares). Vi kommer att optimera f\u00f6ljande f\u00f6rlustfunktion:<\/p>\n<p><img decoding=\"async\" alt=\"Hur vi arbetar med kvalitet och hastighet f\u00f6r rekommendationer\" src=\"\/wp-content\/uploads\/2020\/02\/aab8a1ae1cdf39de21e7469864c5190a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\nH\u00e4r \u00e4r rui \u2014 interaktionen mellan anv\u00e4ndaren u och dokumentet i, qi \u2014 vektorn f\u00f6r dokument i, pu \u2014 vektorn f\u00f6r anv\u00e4ndare u.<\/p>\n<p>D\u00e5 hittas den optimala vektorn f\u00f6r anv\u00e4ndaren (med fasta dokumentvektorer) analytiskt genom att l\u00f6sa den motsvarande linj\u00e4ra regressionen.<\/p>\n<p>Detta kallas \"steget ALS\". Sj\u00e4lva algoritmen f\u00f6r ALS g\u00e5r ut p\u00e5 att vi v\u00e4xelvis h\u00e5ller en av matriserna (anv\u00e4ndarna och artiklarna) fixa och uppdaterar den andra, med m\u00e5let att hitta den optimala l\u00f6sningen.<\/p>\n<p>Lyckligtvis \u00e4r det en ganska snabb operation att hitta den vektoriska representationen av anv\u00e4ndaren, vilken kan g\u00f6ras i realtid med hj\u00e4lp av vektorinstruktioner. Denna trick g\u00f6r att vi genast kan ta h\u00e4nsyn till anv\u00e4ndarens feedback i rankningen. Samma inb\u00e4ddning kan ocks\u00e5 anv\u00e4ndas i kNN-indexet f\u00f6r att f\u00f6rb\u00e4ttra urvalet av kandidater.<\/p>\n<h2>Distribuerad kollaborativ filtrering<\/h2>\n<p>\n<b>Hur man g\u00f6r inkrementell distribuerad matrisfaktorisering och snabbt finner den vektoriska representationen av nya artiklar?<\/b><\/p>\n<p>Inneh\u00e5ll \u00e4r inte den enda k\u00e4llan till signaler f\u00f6r rekommendationer. En annan viktig k\u00e4lla \u00e4r den kollaborativa informationen. Bra indikationer f\u00f6r rangordning kan traditionellt f\u00e5s genom att bryta ner anv\u00e4ndardokumentmatrisen. Men n\u00e4r vi f\u00f6rs\u00f6kte g\u00f6ra en s\u00e5dan nedbrytning st\u00f6tte vi p\u00e5 problem:<\/p>\n<p>1. Vi har miljoner dokument och tiotals miljoner anv\u00e4ndare. Matrisen f\u00e5r inte plats p\u00e5 en enda dator, och nedbrytningen kommer att ta v\u00e4ldigt l\u00e5ng tid.<br \/>\n2. Den st\u00f6rsta delen av inneh\u00e5llet i systemet har kort livsl\u00e4ngd: dokumenten f\u00f6rblir relevanta endast i n\u00e5gra timmar. D\u00e4rf\u00f6r \u00e4r det n\u00f6dv\u00e4ndigt att skapa deras vektorrepresentation s\u00e5 snabbt som m\u00f6jligt.<br \/>\n3. Om nedbrytningen g\u00f6rs direkt efter publiceringen av dokumentet kommer det inte att ha utv\u00e4rderats av tillr\u00e4ckligt m\u00e5nga anv\u00e4ndare. D\u00e4rf\u00f6r kommer dess vektorrepresentation med stor sannolikhet att vara av ganska d\u00e5lig kvalitet.<br \/>\n4. Om en anv\u00e4ndare ger en positiv eller negativ feedback kan vi inte direkt beakta detta i nedbrytningen.<\/p>\n<p>F\u00f6r att l\u00f6sa de n\u00e4mnda problemen har vi implementerat en distribuerad nedbrytning av anv\u00e4ndardokumentmatrisen med frekventa inkrementella uppdateringar. Hur fungerar detta?<\/p>\n<p>Anta att vi har en kluster av N datorer (N r\u00e4kna hundratals) och vi vill g\u00f6ra en distribuerad nedbrytning av matrisen som inte f\u00e5r plats p\u00e5 en enda dator. Fr\u00e5gan \u00e4r hur vi ska genomf\u00f6ra denna nedbrytning s\u00e5 att, \u00e5 ena sidan, varje dator har tillr\u00e4ckligt med data och, \u00e5 andra sidan, att ber\u00e4kningarna \u00e4r oberoende? <\/p>\n<p><img decoding=\"async\" alt=\"Hur vi arbetar med kvalitet och hastighet f\u00f6r rekommendationer\" src=\"\/wp-content\/uploads\/2020\/02\/9170b0fecb6efcd41754ec20ee539a15.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi kommer att anv\u00e4nda den ovan beskrivna ALS-nedbrytningsalgoritmen. L\u00e5t oss se hur ett steg av ALS utf\u00f6rs i distribuerad form \u2013 de \u00f6vriga stegen kommer att vara liknande. Anta att vi har l\u00e5st dokumentmatrisen och vi vill bygga anv\u00e4ndarmatrisen. F\u00f6r detta kommer vi att dela upp den i N delar efter rader, varje del kommer att inneh\u00e5lla ungef\u00e4r lika m\u00e5nga rader. Vi skickar icke-tomma celler fr\u00e5n aktuella rader till varje dator, samt hela dokumentens embeddingsmatris. Eftersom den inte har s\u00e5 stor storlek och anv\u00e4ndardokumentmatrisen vanligtvis \u00e4r mycket gles, f\u00e5r dessa data plats p\u00e5 en vanlig dator.<\/p>\n<p>Denna teknik kan upprepas under flera epoker tills modellens konvergens, genom att v\u00e4xla den fasta matrisen. Men \u00e4ven d\u00e5 kan matrisfaktorisering ta flera timmar. Och det l\u00f6ser inte problemet att snabbt f\u00e5 inb\u00e4ddningar f\u00f6r nya dokument och uppdatera inb\u00e4ddningar f\u00f6r dem som hade lite information n\u00e4r modellen byggdes. <\/p>\n<p>Vi har hj\u00e4lpt till med att inf\u00f6ra en snabb inkrementell uppdatering av modellen. Anta att vi har en aktuell tr\u00e4nad modell. Sedan dess har nya artiklar dykt upp, som v\u00e5ra anv\u00e4ndare har interagerat med, samt artiklar som hade lite interaktion under tr\u00e4ningen. F\u00f6r att snabbt f\u00e5 inb\u00e4ddningar f\u00f6r s\u00e5dana artiklar anv\u00e4nder vi inb\u00e4ddningar f\u00f6r anv\u00e4ndare som fick under den f\u00f6rsta stora tr\u00e4ningen av modellen, och vi g\u00f6r ett steg av ALS f\u00f6r att ber\u00e4kna dokumentmatrisen med en fast anv\u00e4ndarmatris. Detta m\u00f6jligg\u00f6r att f\u00e5 inb\u00e4ddningar ganska snabbt \u2014 inom n\u00e5gra minuter efter publiceringen av dokumentet \u2014 och ofta uppdatera inb\u00e4ddningar f\u00f6r nya dokument.<\/p>\n<p>F\u00f6r att anv\u00e4ndarens handlingar ska beaktas omg\u00e5ende anv\u00e4nder vi inte anv\u00e4ndarinb\u00e4ddningarna som erh\u00f6lls offline i realtid. Ist\u00e4llet g\u00f6r vi ett steg av ALS och f\u00e5r den aktuella anv\u00e4ndarvektorn.<\/p>\n<h2>\u00d6verf\u00f6ring till ett annat dom\u00e4nomr\u00e5de<\/h2>\n<p>\n<b>Hur kan vi anv\u00e4nda anv\u00e4ndarfeedback p\u00e5 textartiklar f\u00f6r att skapa en vektorrepresentation av videor?<\/b><\/p>\n<p>Inledningsvis rekommenderade vi endast textartiklar, s\u00e5 m\u00e5nga av v\u00e5ra algoritmer \u00e4r anpassade f\u00f6r denna typ av inneh\u00e5ll. Men n\u00e4r vi lade till inneh\u00e5ll av annan typ st\u00e4lldes vi inf\u00f6r behovet av att anpassa modellerna. Hur l\u00f6ste vi denna uppgift med videoinneh\u00e5ll? Ett alternativ \u00e4r att tr\u00e4na om alla modeller fr\u00e5n grunden. Men detta tar tid, dessutom \u00e4r vissa algoritmer kr\u00e4vande n\u00e4r det kommer till storleken p\u00e5 tr\u00e4ningsdata, som \u00e4nnu inte finns i tillr\u00e4cklig m\u00e4ngd f\u00f6r det nya typen av inneh\u00e5ll under de f\u00f6rsta \u00f6gonblicken av dess liv p\u00e5 tj\u00e4nsten.<\/p>\n<p>Vi valde en annan v\u00e4g och \u00e5teranv\u00e4nde textmodeller f\u00f6r videor. I skapandet av vektorrepr\u00e4sentationer av videor hj\u00e4lpte samma trick med ALS oss. Vi tog anv\u00e4ndarnas vektorrepr\u00e4sentation baserad p\u00e5 textartiklar och gjorde ett ALS-steg, med hj\u00e4lp av information om videovisningar. S\u00e5 vi fick enkelt vektorrepr\u00e4sentationen av videon. Vid k\u00f6rning ber\u00e4knar vi bara n\u00e4rheten mellan anv\u00e4ndarens vektor, som erh\u00e5llits baserat p\u00e5 textartiklar, och videovektorn.<\/p>\n<h2>Slutsats<\/h2>\n<p>\nUtvecklingen av k\u00e4rnan i det realtidsbaserade rekommendationssystemet \u00e4r f\u00f6renad med m\u00e5nga utmaningar. Det kr\u00e4vs snabb databehandling och till\u00e4mpning av ML-metoder f\u00f6r att effektivt anv\u00e4nda dessa data; bygga komplexa distribuerade system som kan bearbeta anv\u00e4ndarsignaler och nya inneh\u00e5llsenheter p\u00e5 minimal tid; och m\u00e5nga andra uppgifter.<\/p>\n<p>I det nuvarande systemet, vars arkitektur jag beskrev, \u00f6kar kvaliteten p\u00e5 rekommendationerna f\u00f6r anv\u00e4ndaren i takt med hans aktivitet och den tid han spenderar p\u00e5 tj\u00e4nsten. Men sj\u00e4lvklart ligger den st\u00f6rsta sv\u00e5righeten h\u00e4r: systemet har sv\u00e5rt att snabbt f\u00f6rst\u00e5 intressena hos en person som har interagerat minimalt med inneh\u00e5llet. F\u00f6rb\u00e4ttringen av rekommendationer f\u00f6r nya anv\u00e4ndare \u00e4r v\u00e5r centrala uppgift. Vi kommer att forts\u00e4tta optimera algoritmerna s\u00e5 att relevant inneh\u00e5ll snabbare n\u00e5r deras fl\u00f6de, medan irrelevant inneh\u00e5ll inte visas.<br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/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.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Hur vi arbetar med kvalitet och hastighet vid rekommendationsval | ProHoster","description":"Jag heter Pavel Parkhomenko, jag \u00e4r ML-utvecklare. I den h\u00e4r artikeln vill jag beskriva hur tj\u00e4nsten Yandex Zen fungerar och dela med mig av tekniska f\u00f6rb\u00e4ttringar vars implementering har gjort det m\u00f6jligt att \u00f6ka kvaliteten p\u00e5 rekommendationerna.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/71852","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=71852"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/71852\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/71853"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=71852"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=71852"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=71852"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}