Hvernig við vinnum að gæðum og hraða vals á meðmælum

Ég heiti Pavel Parkhomenko, ég er ML verktaki. Í þessari grein langar mig að tala um uppbyggingu Yandex.Zen þjónustunnar og deila tæknilegum endurbótum, innleiðing þeirra hefur gert það mögulegt að auka gæði tilmæla. Í þessari færslu munt þú læra hvernig á að finna þau sem eiga mest við notandanum meðal milljóna skjala á örfáum millisekúndum; hvernig á að gera stöðuga niðurbrot á stóru fylki (sem samanstendur af milljónum dálka og tugum milljóna raða) þannig að ný skjöl fái vektorinn sinn á tugum mínútna; hvernig á að endurnýta niðurbrot notendagreina fylkisins til að fá góða vektormynd fyrir myndband.

Hvernig við vinnum að gæðum og hraða vals á meðmælum

Meðmælagagnagrunninum okkar inniheldur milljónir skjala af ýmsum sniðum: textagreinar búnar til á vettvangi okkar og teknar af ytri síðum, myndböndum, frásögnum og stuttum færslum. Þróun slíkrar þjónustu tengist miklum fjölda tæknilegra áskorana. Hér eru nokkrar þeirra:

  • Skiptu tölvuverkefnum: gerðu allar þungar aðgerðir án nettengingar og í rauntíma framkvæma aðeins fljótlega beitingu líkana til að bera ábyrgð á 100-200 ms.
  • Taktu fljótt tillit til aðgerða notenda. Til að gera þetta er nauðsynlegt að allir atburðir séu samstundis afhentir meðmælandanum og hafi áhrif á niðurstöður líkananna.
  • Gerðu strauminn þannig að hann lagist fljótt að hegðun þeirra fyrir nýja notendur. Fólk sem er nýbúið að ganga í kerfið ætti að finna að endurgjöf þeirra hafi áhrif á tillögur.
  • Skildu fljótt við hvern á að mæla með nýrri grein.
  • Svaraðu hratt við stöðugri tilkomu nýs efnis. Tugir þúsunda greina birtast á hverjum degi og margar þeirra hafa takmarkaðan líftíma (t.d. fréttir). Þetta er það sem aðgreinir þá frá kvikmyndum, tónlist og öðru langlífu og dýru efni til að búa til.
  • Flytja þekkingu frá einu lénssvæði til annars. Ef meðmælakerfi hefur þjálfað líkön fyrir textagreinar og við bætum við myndbandi við það, getum við endurnýtt núverandi líkön svo nýja gerð efnis raðar betur.

Ég mun segja þér hvernig við leystum þessi vandamál.

Val á umsækjendum

Hvernig á að fækka fjölda skjala sem eru til skoðunar um þúsundir sinnum á nokkrum millisekúndum, með nánast engum rýrnun á gæðum röðun?

Segjum sem svo að við þjálfuðum mörg ML líkön, mynduðum eiginleika út frá þeim og þjálfuðum annað líkan sem raðar skjölum fyrir notandann. Allt væri í lagi, en þú getur ekki bara tekið og reiknað út öll merki fyrir öll skjöl í rauntíma, ef það eru milljónir af þessum skjölum, og ráðleggingar þurfa að vera byggðar á 100-200 ms. Verkefnið er að velja ákveðinn hlutmengi úr milljónum, sem verður raðað fyrir notandann. Þetta stig er venjulega kallað val umsækjenda. Það eru nokkrar kröfur til þess. Í fyrsta lagi þarf valið að gerast mjög hratt, þannig að sem mestur tími sé eftir í röðunina sjálfa. Í öðru lagi, eftir að hafa dregið verulega úr fjölda skjala til röðunar, verðum við að varðveita skjöl sem skipta máli fyrir notandann eins fullkomlega og mögulegt er.

Reglan okkar um val umsækjenda hefur þróast og í augnablikinu erum við komin að fjölþrepa kerfi:

Hvernig við vinnum að gæðum og hraða vals á meðmælum

Fyrst er öllum skjölum skipt í hópa og vinsælustu skjölin tekin úr hverjum hópi. Hópar geta verið síður, efni, klasar. Fyrir hvern notanda, miðað við sögu hans, eru valdir hópar næst honum og bestu skjölin tekin úr þeim. Við notum einnig kNN vísitöluna til að velja skjöl sem eru næst notandanum í rauntíma. Það eru nokkrar aðferðir til að búa til kNN vísitölu; okkar virkaði best HNSW (Herarchical Navigable Small World graphs). Þetta er stigveldislíkan sem gerir þér kleift að finna N nálægustu vektora fyrir notanda úr gagnagrunni með milljónum á nokkrum millisekúndum. Við skráum fyrst allan skjalagagnagrunninn okkar án nettengingar. Þar sem leit í vísitölunni virkar nokkuð hratt, ef það eru nokkrar sterkar innfellingar, geturðu búið til nokkrar vísitölur (eina vísitölu fyrir hverja innfellingu) og nálgast hverja þeirra í rauntíma.

Við höfum enn tugþúsundir skjala fyrir hvern notanda. Þetta er enn mikið að telja alla eiginleikana, þannig að á þessu stigi notum við létt röðun - létt og þung röðunarlíkan með færri eiginleika. Verkefnið er að spá fyrir um hvaða skjöl þungt líkan mun hafa efst. Skjöl með hæstu forspárgildi verða notuð í þunga líkaninu, það er á síðasta stigi röðunar. Þessi nálgun gerir þér kleift að minnka gagnagrunn skjala sem talin eru fyrir notandann úr milljónum í þúsundir á tugum millisekúndna.

ALS skref í keyrslutíma

Hvernig á að taka tillit til athugasemda notenda strax eftir smell?

Mikilvægur þáttur í ráðleggingum er viðbragðstími við athugasemdum notenda. Þetta er sérstaklega mikilvægt fyrir nýja notendur: Þegar einstaklingur er nýbyrjaður að nota meðmælakerfið fær hann ópersónusniðið straum af skjölum um ýmis efni. Um leið og hann gerir fyrsta smellinn þarftu strax að taka mið af þessu og laga sig að áhugamálum hans. Ef þú reiknar út alla þættina án nettengingar verður skjót viðbrögð kerfisins ómöguleg vegna töfarinnar. Svo það er nauðsynlegt að vinna úr aðgerðum notenda í rauntíma. Í þessum tilgangi notum við ALS skrefið á keyrslutíma til að búa til vektormynd af notandanum.

Gerum ráð fyrir að við höfum vektormynd fyrir öll skjöl. Til dæmis getum við smíðað innfellingar án nettengingar byggt á texta greinar með því að nota ELMo, BERT eða önnur vélanámslíkön. Hvernig getum við fengið vektormynd af notendum í sama rými byggt á samskiptum þeirra í kerfinu?

Almenn meginregla um myndun og niðurbrot notendaskjalsfylkisVið skulum hafa m notendur og n skjöl. Fyrir suma notendur er tengsl þeirra við ákveðin skjöl þekkt. Síðan er hægt að tákna þessar upplýsingar sem mxn fylki: línur samsvara notendum og dálkar samsvara skjölum. Þar sem viðkomandi hefur ekki séð flest skjölin verða flestar fylkisfrumur tómar á meðan aðrar fyllast. Fyrir hvern atburð (eins og, mislíkar, smellur) er eitthvert gildi gefið í fylkinu - en við skulum íhuga einfaldað líkan þar sem líkar samsvarar 1 og mislíkar samsvarar -1.

Við skulum skipta fylkinu niður í tvennt: P (mxd) og Q (dxn), þar sem d er vídd vigurframsetningar (venjulega lítil tala). Þá mun hver hlutur samsvara d-víddar vektor (fyrir notanda - röð í fylkinu P, fyrir skjal - dálk í fylkinu Q). Þessir vektorar verða innfellingar samsvarandi hluta. Til að spá fyrir um hvort notanda muni líka við skjal geturðu einfaldlega margfaldað innfellingar þeirra.

Hvernig við vinnum að gæðum og hraða vals á meðmælum
Ein af mögulegum leiðum til að sundra fylki er ALS (Alternating Least Squares). Við munum fínstilla eftirfarandi tapaðgerð:

Hvernig við vinnum að gæðum og hraða vals á meðmælum

Hér er rui samspil notanda u við skjal i, qi er vektor skjal i, pu er vektor notanda u.

Þá er ákjósanlegur notendavigur frá sjónarhóli meðalferningsvillu (fyrir fasta skjalavigra) fundin með greiningu með því að leysa samsvarandi línulega aðhvarf.

Þetta er kallað "ALS skrefið". Og ALS reikniritið sjálft er að við lagfærum til skiptis annað fylkið (notendur og greinar) og uppfærum hitt og finnum bestu lausnina.

Sem betur fer er það nokkuð hröð aðgerð að finna vektorframsetningu notandans sem hægt er að gera á keyrslutíma með því að nota vektorleiðbeiningar. Þetta bragð gerir þér kleift að taka strax tillit til athugasemda notenda í röðun. Hægt er að nota sömu innfellingu í kNN vísitölunni til að bæta val umsækjenda.

Dreifð samvinnusíun

Hvernig á að gera stigvaxandi dreifða fylkisþátttöku og finna fljótt vektormyndir fyrir nýjar greinar?

Innihald er ekki eina uppspretta meðmælamerkja. Önnur mikilvæg uppspretta er samvinnuupplýsingar. Venjulega er hægt að fá góða röðunareiginleika með niðurbroti notendaskjalsfylkisins. En þegar reynt var að gera slíkt niðurbrot lentum við í vandræðum:

1. Við höfum milljónir skjala og tugi milljóna notenda. Fylkið passar ekki alveg á eina vél og niðurbrot mun taka mjög langan tíma.
2. Flest efni í kerfinu hefur stuttan líftíma: skjöl eru aðeins viðeigandi í nokkrar klukkustundir. Þess vegna er nauðsynlegt að smíða vektormynd þeirra eins fljótt og auðið er.
3. Ef þú byggir niðurbrot strax eftir að skjalið er birt mun nægjanlegur fjöldi notenda ekki hafa tíma til að meta það. Þess vegna mun vektorframsetning þess líklegast ekki vera mjög góð.
4. Ef notanda líkar við eða líkar ekki við getum við ekki tekið þetta strax með í reikninginn við niðurbrotið.

Til að leysa þessi vandamál innleiddum við dreifða niðurbrot á notendaskjalafylki með tíðum stigvaxandi uppfærslum. Hvernig nákvæmlega virkar það?

Segjum að við höfum þyrping af N vélum (N er í hundruðum) og við viljum gera dreifða niðurbrot á fylki á þeim sem passar ekki á eina vél. Spurningin er hvernig á að framkvæma þessa niðurbrot þannig að annars vegar séu næg gögn á hverri vél og hins vegar þannig að útreikningar séu óháðir?

Hvernig við vinnum að gæðum og hraða vals á meðmælum

Við munum nota ALS niðurbrotsreikniritið sem lýst er hér að ofan. Við skulum skoða hvernig á að framkvæma eitt ALS skref á dreifðan hátt - restin af skrefunum verða svipuð. Segjum að við höfum fast fylki skjala og við viljum byggja upp fylki notenda. Til að gera þetta munum við skipta því í N hluta eftir línum, hver hluti mun innihalda um það bil jafnmarga línur. Við munum senda á hverja vél ótómar frumur samsvarandi raða, svo og fylki innfellinga skjala (alveg). Þar sem stærð þess er ekki mjög stór og notendaskjalafylki er venjulega mjög dreifð, munu þessi gögn passa á venjulega vél.

Þetta bragð er hægt að endurtaka á nokkrum tímabilum þar til líkanið rennur saman, til skiptis fasta fylkið eitt af öðru. En jafnvel þá getur niðurbrot fylki tekið nokkrar klukkustundir. Og þetta leysir ekki vandamálið að þú þarft fljótt að taka á móti innfellingum nýrra skjala og uppfæra innfellingar þeirra sem litlar upplýsingar voru um við smíði líkansins.

Kynning á hröðum stigvaxandi líkanauppfærslum hjálpaði okkur. Segjum að við séum með þjálfað líkan. Frá þjálfun hennar hafa komið nýjar greinar sem notendur okkar hafa haft samskipti við, sem og greinar sem höfðu lítil samskipti við þjálfun. Til að fá fljótt innfellingar slíkra greina notum við innfellingar notenda sem fengust við fyrstu stóru þjálfun líkansins og gerum eitt ALS skref til að reikna út skjalafylki með fastri notendafylki. Þetta gerir þér kleift að taka á móti innfellingum nokkuð fljótt - innan nokkurra mínútna eftir að skjalið er birt - og oft uppfæra innfellingar nýlegra skjala.

Til að gera tillögur strax taka tillit til mannlegra aðgerða, á keyrslutíma notum við ekki innfellingar notenda sem eru fengnar án nettengingar. Í staðinn gerum við ALS skref og fáum raunverulegan notendavigur.

Flytja á annað lénssvæði

Hvernig á að nota endurgjöf notenda um textagreinar til að búa til vektormynd af myndbandi?

Upphaflega mældum við eingöngu með textagreinum, þannig að mörg reiknirit okkar eru sérsniðin að þessari tegund efnis. En þegar önnur tegund efnis var bætt við stóðum við frammi fyrir þörfinni á að aðlaga módelin. Hvernig leystum við þetta vandamál með því að nota myndbandsdæmi? Einn valkostur er að endurþjálfa allar gerðir frá grunni. En þetta tekur langan tíma og sum reikniritin krefjast stærðar þjálfunarúrtaksins, sem er ekki enn fáanlegt í tilskildu magni fyrir nýja tegund efnis á fyrstu augnablikum lífs síns á þjónustunni.

Við fórum í hina áttina og endurnotuðum textalíkönin fyrir myndbandið. Sama ALS bragðið hjálpaði okkur að búa til vektormyndir af myndböndum. Við tókum vektormynd af notendum út frá textagreinum og gerðum ALS skref með því að nota upplýsingar um myndbandsskoðun. Þannig að við fengum auðveldlega vektormynd af myndbandinu. Og á keyrslutíma reiknum við einfaldlega nálægð milli notendavigursins sem fæst úr textagreinum og myndbandsvektorsins.

Ályktun

Að þróa kjarna rauntíma meðmælakerfis felur í sér margar áskoranir. Þú þarft að vinna hratt úr gögnum og beita ML aðferðum til að nota þessi gögn á áhrifaríkan hátt; byggja flókin dreifð kerfi sem geta unnið úr notendamerkjum og nýjum efniseiningum á lágmarkstíma; og mörg önnur verkefni.

Í núverandi kerfi, þeirri hönnun sem ég lýsti, vex gæði ráðlegginga fyrir notandann með virkni hans og lengd dvalar á þjónustunni. En hér liggur auðvitað helsti vandinn: það er erfitt fyrir kerfið að átta sig strax á hagsmunum einstaklings sem hefur lítil samskipti við efnið. Að bæta ráðleggingar fyrir nýja notendur er lykilmarkmið okkar. Við munum halda áfram að hagræða reikniritunum þannig að efni sem er viðeigandi fyrir mann komist hraðar inn í strauminn hans og óviðkomandi efni sé ekki sýnt.

Heimild: www.habr.com

Bæta við athugasemd