Kuidas me töötame soovituste valiku kvaliteedi ja kiirusega

Minu nimi on Pavel Parkhomenko, olen ML-i arendaja. Selles artiklis tahaksin rääkida Yandex.Zen teenuse struktuurist ja jagada tehnilisi täiustusi, mille rakendamine on võimaldanud tõsta soovituste kvaliteeti. Sellest postitusest saate teada, kuidas miljonite dokumentide hulgast vaid mõne millisekundi jooksul leida kasutaja jaoks kõige asjakohasemad; kuidas teha suure maatriksi (mis koosneb miljonitest veergudest ja kümnetest miljonitest ridadest) pidevat dekomponeerimist nii, et uued dokumendid saaksid oma vektori kätte kümnete minutitega; kuidas taaskasutada kasutajaartikli maatriksi lagunemist, et saada video jaoks hea vektoresitus.

Kuidas me töötame soovituste valiku kvaliteedi ja kiirusega

Meie soovituste andmebaas sisaldab miljoneid erinevas vormingus dokumente: meie platvormil loodud ja välistelt saitidelt võetud tekstiartikleid, videoid, narratiive ja lühikesi postitusi. Sellise teenuse väljatöötamine on seotud suure hulga tehniliste väljakutsetega. Siin on mõned neist:

  • Jagage arvutusülesanded: tehke kõiki raskeid toiminguid võrguühenduseta ja tehke reaalajas ainult mudelite kiire rakendamine, et vastutada 100–200 ms eest.
  • Võtke kiiresti arvesse kasutaja toiminguid. Selleks on vaja, et kõik sündmused jõuaksid koheselt soovitajani ja mõjutaksid mudelite tulemusi.
  • Muutke voog nii, et uute kasutajate jaoks kohaneks see kiiresti nende käitumisega. Inimesed, kes on äsja süsteemiga liitunud, peaksid tundma, et nende tagasiside mõjutab soovitusi.
  • Saate kiiresti aru, kellele uut artiklit soovitada.
  • Reageerige kiiresti uue sisu pidevale ilmumisele. Iga päev avaldatakse kümneid tuhandeid artikleid ja paljudel neist on piiratud eluiga (näiteks uudised). See eristabki neid filmidest, muusikast ja muust pikaajalisest ja kulukast loodavast sisust.
  • Edastage teadmisi ühest domeenialast teise. Kui soovitussüsteemis on tekstiartiklite jaoks väljaõpetatud mudelid ja me lisame sellele video, saame olemasolevaid mudeleid uuesti kasutada, et uut tüüpi sisu paremusjärjestuses oleks.

Ma räägin teile, kuidas me need probleemid lahendasime.

Kandidaatide valik

Kuidas vähendada vaadeldavate dokumentide arvu mõne millisekundi jooksul tuhandeid kordi, ilma et järjestuse kvaliteet praktiliselt halveneks?

Oletame, et koolitasime palju ML-mudeleid, genereerisime nende põhjal funktsioone ja koolitasime välja teise mudeli, mis järjestab kasutaja jaoks dokumente. Kõik oleks korras, kuid te ei saa lihtsalt võtta ja arvutada reaalajas kõigi dokumentide kõiki märke, kui neid dokumente on miljoneid ja soovitused tuleb koostada 100-200 ms jooksul. Ülesanne on valida miljonite hulgast teatud alamhulk, mis kasutaja jaoks järjestatakse. Seda etappi nimetatakse tavaliselt kandidaatide valikuks. Sellele on kehtestatud mitmeid nõudeid. Esiteks peab valik toimuma väga kiiresti, et paremusjärjestuse enda jaoks jääks võimalikult palju aega. Teiseks, olles oluliselt vähendanud järjestatavate dokumentide arvu, peame säilitama kasutaja jaoks olulised dokumendid võimalikult täielikult.

Meie kandidaatide valiku põhimõte on edasi arenenud ja praeguseks oleme jõudnud mitmeetapilise skeemini:

Kuidas me töötame soovituste valiku kvaliteedi ja kiirusega

Esiteks jagatakse kõik dokumendid rühmadesse ja igast rühmast võetakse kõige populaarsemad dokumendid. Rühmad võivad olla saidid, teemad, klastrid. Iga kasutaja jaoks valitakse tema ajaloo põhjal välja talle kõige lähedasemad rühmad ja neist võetakse parimad dokumendid. Samuti kasutame kNN indeksit, et valida reaalajas kasutajale kõige lähemal olevad dokumendid. KNN-indeksi koostamiseks on mitu meetodit; meie oma töötas kõige paremini HNSW (Hierarhilised navigeeritavad väikese maailma graafikud). See on hierarhiline mudel, mis võimaldab mõne millisekundi jooksul miljonite andmebaaside põhjal leida kasutajale N lähimat vektorit. Esmalt indekseerime kogu oma dokumendibaasi võrguühenduseta. Kuna indeksist otsimine toimib üsna kiiresti, siis mitme tugeva manustamise korral saab luua mitu indeksit (iga manustamise kohta üks register) ja pääseda igaühele neist reaalajas juurde.

Meil on endiselt iga kasutaja kohta kümneid tuhandeid dokumente. Kõikide funktsioonide kokkulugemiseks on seda veel palju, nii et praeguses etapis kasutame kerget järjestust – kerget rasket järjestusmudelit, millel on vähem funktsioone. Ülesanne on ennustada, millised dokumendid raskel mudelil üleval on. Kõrgeima ennustajaga dokumente kasutatakse raskes mudelis, st paremusjärjestuse viimases etapis. Selline lähenemine võimaldab vähendada kasutaja jaoks arvestatavate dokumentide andmebaasi miljonitelt tuhandeteni kümnete millisekundite jooksul.

ALS-i samm käitusajal

Kuidas võtta arvesse kasutajate tagasisidet kohe pärast klõpsamist?

Soovituste oluline tegur on kasutaja tagasisidele reageerimise aeg. See on eriti oluline uutele kasutajatele: kui inimene alles alustab soovitussüsteemi kasutamist, saab ta erinevate teemade dokumentide isikupärastamata voo. Niipea, kui ta teeb esimese klõpsu, peate sellega kohe arvestama ja kohanema tema huvidega. Kui arvutate kõik tegurid võrguühenduseta, muutub süsteemi kiire reageerimine viivituse tõttu võimatuks. Seega on vaja kasutaja toiminguid reaalajas töödelda. Nendel eesmärkidel kasutame käitusajal ALS-i sammu, et luua kasutaja vektorkujutis.

Oletame, et meil on kõigi dokumentide jaoks vektoresitus. Näiteks saame luua manused võrguühenduseta artikli teksti põhjal, kasutades ELMo, BERT või muid masinõppe mudeleid. Kuidas saada samas ruumis olevate kasutajate vektorkujutist nende interaktsioonide põhjal süsteemis?

Kasutaja-dokumendi maatriksi moodustamise ja dekomponeerimise üldpõhimõteOlgu meil m kasutajat ja n dokumenti. Mõne kasutaja puhul on nende seos teatud dokumentidega teada. Seejärel saab seda teavet esitada mxn-maatriksina: read vastavad kasutajatele ja veerud vastavad dokumentidele. Kuna inimene pole enamikku dokumentidest näinud, siis jääb enamik maatriksi lahtreid tühjaks, teised aga täidetakse. Iga sündmuse (meeldib, ei meeldi, klõps) jaoks antakse maatriksis mingi väärtus – kuid vaatleme lihtsustatud mudelit, kus meeldimine vastab 1-le ja mittemeeldimine -1-le.

Jagame maatriksi kaheks: P (mxd) ja Q (dxn), kus d on vektoresituse mõõde (tavaliselt väike arv). Seejärel vastab iga objekt d-mõõtmelisele vektorile (kasutaja jaoks - maatriksi P rida, dokumendi jaoks - maatriksi Q veerg). Need vektorid on vastavate objektide manused. Et ennustada, kas kasutajale dokument meeldib, saate nende manuseid lihtsalt korrutada.

Kuidas me töötame soovituste valiku kvaliteedi ja kiirusega
Üks võimalikke viise maatriksi lagundamiseks on ALS (Alternating Least Squares). Optimeerime järgmise kadufunktsiooni:

Kuidas me töötame soovituste valiku kvaliteedi ja kiirusega

Siin on rui kasutaja u interaktsioon dokumendiga i, qi on dokumendi i vektor, pu on kasutaja u vektor.

Seejärel leitakse analüütiliselt optimaalne kasutajavektor keskmise ruutvea seisukohalt (fikseeritud dokumendivektorite puhul), lahendades vastava lineaarse regressiooni.

Seda nimetatakse "ALS-i sammuks". Ja ALS-i algoritm ise seisneb selles, et kordamööda fikseerime ühe maatriksi (kasutajad ja artiklid) ja värskendame teist, leides optimaalse lahenduse.

Õnneks on kasutaja vektorkujutuse leidmine üsna kiire toiming, mida saab vektorjuhiste abil teha käitusajal. See nipp võimaldab teil järjestamisel koheselt kasutaja tagasisidet arvesse võtta. Sama manustamist saab kasutada kNN-i indeksis, et parandada kandidaatide valikut.

Jaotatud koostööfiltreerimine

Kuidas teha järkjärgulist hajutatud maatriksi faktoriseerimist ja leida kiiresti uute artiklite vektoresitusi?

Sisu pole ainus soovitussignaalide allikas. Teine oluline allikas on koostööteave. Häid järjestamisomadusi saab traditsiooniliselt saada kasutaja-dokumendi maatriksi lagunemisest. Kuid sellise lagunemise proovimisel tekkisid probleemid:

1. Meil ​​on miljoneid dokumente ja kümneid miljoneid kasutajaid. Maatriks ei mahu täielikult ühele masinale ja lagunemine võtab väga kaua aega.
2. Suurem osa süsteemi sisust on lühikese elueaga: dokumendid jäävad asjakohaseks vaid mõne tunni. Seetõttu on vaja võimalikult kiiresti konstrueerida nende vektoresitus.
3. Kui koostate dekompositsiooni kohe pärast dokumendi avaldamist, ei jää piisaval hulgal kasutajatel aega seda hinnata. Seetõttu ei ole selle vektorkujutus tõenäoliselt väga hea.
4. Kui kasutajale meeldib või ei meeldi, ei saa me seda kohe lagunemisel arvesse võtta.

Nende probleemide lahendamiseks rakendasime kasutaja-dokumendi maatriksi hajutatud lagunemise koos sagedaste järkjärguliste värskendustega. Kuidas see täpselt töötab?

Oletame, et meil on N masinast koosnev klaster (N on sadades) ja me tahame teha neile maatriksi hajutatud dekomponeerimise, mis ei mahu ühele masinale. Küsimus on selles, kuidas seda dekompositsiooni teha nii, et ühelt poolt oleks iga masina kohta piisavalt andmeid ja teisest küljest, et arvutused oleksid sõltumatud?

Kuidas me töötame soovituste valiku kvaliteedi ja kiirusega

Kasutame ülalkirjeldatud ALS-i lagunemisalgoritmi. Vaatame, kuidas teostada üht ALS-i sammu hajutatud viisil – ülejäänud sammud on sarnased. Oletame, et meil on fikseeritud dokumentide maatriks ja me tahame luua kasutajate maatriksi. Selleks jagame selle ridade kaupa N osaks, iga osa sisaldab ligikaudu sama arvu ridu. Saadame igasse masinasse vastavate ridade mittetühjad lahtrid, samuti dokumendi manustamise maatriksi (täielikult). Kuna selle suurus ei ole väga suur ja kasutaja-dokumendi maatriks on tavaliselt väga hõre, mahuvad need andmed tavalisele masinale.

Seda trikki saab korrata mitme ajajärgu jooksul, kuni mudel ühtlustub, muutes fikseeritud maatriksit ükshaaval. Kuid isegi siis võib maatriksi lagunemine kesta mitu tundi. Ja see ei lahenda probleemi, et peate kiiresti vastu võtma uute dokumentide manused ja värskendama nende dokumentide manuseid, mille kohta mudeli loomisel oli vähe teavet.

Meile aitas kaasa mudelite kiirete järkjärguliste uuenduste kasutuselevõtt. Oletame, et meil on praegu koolitatud modell. Alates tema koolitusest on ilmunud uusi artikleid, millega meie kasutajad on suhelnud, aga ka artikleid, millega on koolituse ajal vähe suhelnud. Selliste artiklite manustamise kiireks hankimiseks kasutame mudeli esimese suure koolituse käigus saadud kasutajate manuseid ja teeme ühe ALS-i sammu, et arvutada fikseeritud kasutajamaatriksiga dokumendimaatriks. See võimaldab teil saada manuseid üsna kiiresti – mõne minuti jooksul pärast dokumendi avaldamist – ja sageli värskendada hiljutiste dokumentide manuseid.

Soovituste andmiseks võtke viivitamatult arvesse inimeste tegevust, ei kasuta me käitusajal võrguühenduseta saadud kasutajate manuseid. Selle asemel teeme ALS-i sammu ja saame tegeliku kasutajavektori.

Teisaldage teisele domeenialale

Kuidas kasutada kasutajate tagasisidet tekstiartiklite kohta video vektorkujutuse koostamiseks?

Esialgu soovitasime ainult tekstiartikleid, nii et paljud meie algoritmid on seda tüüpi sisu jaoks kohandatud. Kuid muud tüüpi sisu lisamisel seisime silmitsi vajadusega mudeleid kohandada. Kuidas me selle probleemi videonäite abil lahendasime? Üks võimalus on kõik mudelid nullist ümber õpetada. Kuid see võtab kaua aega ja mõned algoritmid nõuavad koolitusvalimi suurust, mis pole teenuse esimestel hetkedel uut tüüpi sisu jaoks vajalikus koguses saadaval.

Läksime teist teed ja kasutasime video jaoks tekstimudeleid uuesti. Sama ALS-i trikk aitas meil luua videote vektoresitusi. Tegime kasutajate vektorkujutise tekstiartiklite põhjal ja tegime ALS-i sammu, kasutades videovaate teavet. Nii saime hõlpsalt video vektorkujutise. Ja käitusajal arvutame lihtsalt tekstiartiklitest saadud kasutajavektori ja videovektori vahelise läheduse.

Järeldus

Reaalajas soovitussüsteemi tuuma väljatöötamine hõlmab palju väljakutseid. Nende andmete tõhusaks kasutamiseks peate andmeid kiiresti töötlema ja rakendama ML-meetodeid; luua keerulisi hajutatud süsteeme, mis suudavad töödelda kasutaja signaale ja uusi sisuühikuid minimaalse aja jooksul; ja palju muid ülesandeid.

Praeguses süsteemis, mille ülesehitust ma kirjeldasin, kasvab kasutajale antud soovituste kvaliteet koos tema aktiivsuse ja teenuses viibimise pikkusega. Kuid siin peitub muidugi peamine raskus: süsteemil on raske sisuga vähe suhtleva inimese huvidest kohe aru saada. Meie peamine eesmärk on uutele kasutajatele mõeldud soovituste täiustamine. Jätkame algoritmide optimeerimist, et inimese jaoks asjakohane sisu jõuaks tema voogu kiiremini ja ebaolulist sisu ei kuvataks.

Allikas: www.habr.com

Lisa kommentaar