Hogyan dolgozunk az ajánlások kiválasztásának minőségén és sebességén

A nevem Pavel Parkhomenko, ML fejlesztő vagyok. Ebben a cikkben szeretnék beszélni a Yandex.Zen szolgáltatás felépítéséről, és megosztani azokat a technikai fejlesztéseket, amelyek végrehajtása lehetővé tette az ajánlások minőségének javítását. Ebből a bejegyzésből megtudhatja, hogyan találhatja meg néhány ezredmásodperc alatt több millió dokumentum között a felhasználó számára legrelevánsabbat; hogyan lehet egy nagy (több millió oszlopból és több tízmillió sorból álló) mátrix folyamatos felbontását úgy, hogy az új dokumentumok több tíz perc alatt megkapják a vektorukat; hogyan lehet újra felhasználni a felhasználói cikk mátrix bontását, hogy jó vektoros ábrázolást kapjunk a videóhoz.

Hogyan dolgozunk az ajánlások kiválasztásának minőségén és sebességén

Ajánlási adatbázisunk több millió különböző formátumú dokumentumot tartalmaz: a platformunkon létrehozott és külső oldalakról származó szöveges cikkeket, videókat, narratívákat és rövid bejegyzéseket. Egy ilyen szolgáltatás fejlesztése számos technikai kihívással jár. Itt van néhány közülük:

  • Ossza meg a számítási feladatokat: hajtson végre minden nehéz műveletet offline, és valós időben csak a modellek gyors alkalmazását hajtsa végre, hogy 100-200 ms-ért legyen felelős.
  • Gyorsan vegye figyelembe a felhasználói műveleteket. Ehhez az szükséges, hogy minden esemény azonnal eljusson az ajánlóhoz, és befolyásolja a modellek eredményét.
  • Tegye úgy a hírcsatornát, hogy az új felhasználók számára gyorsan alkalmazkodjon viselkedésükhöz. Azoknak, akik most csatlakoztak a rendszerhez, érezniük kell, hogy visszajelzéseik befolyásolják az ajánlásokat.
  • Gyorsan megértheti, kinek ajánlhat új cikket.
  • Gyorsan reagáljon az új tartalom folyamatos megjelenésére. Naponta több tízezer cikk jelenik meg, és sok közülük korlátozott élettartamú (mondjuk hírek). Ez az, ami megkülönbözteti őket a filmektől, zenéktől és más hosszú életű és drága tartalmaktól.
  • A tudás átadása egyik tartomány területéről a másikra. Ha egy ajánlórendszerben vannak betanított modellek a szöveges cikkekhez, és videót adunk hozzá, akkor újra felhasználhatjuk a meglévő modelleket, hogy az új típusú tartalom jobb legyen.

Elmondom, hogyan oldottuk meg ezeket a problémákat.

A jelöltek kiválasztása

Hogyan lehet néhány ezredmásodperc alatt több ezerszeresére csökkenteni a vizsgált dokumentumok számát úgy, hogy a rangsorolás minősége gyakorlatilag nem romlik?

Tegyük fel, hogy sok ML modellt betanítottunk, ezek alapján szolgáltatásokat generáltunk, és betanítottunk egy másik modellt, amely rangsorolja a dokumentumokat a felhasználó számára. Minden rendben lenne, de nem lehet csak az összes dokumentumhoz valós időben kiszámolni az összes jelet, ha több millió ilyen dokumentum van, és az ajánlásokat 100-200 ms alatt kell elkészíteni. A feladat az, hogy milliók közül válasszunk ki egy bizonyos részhalmazt, amelyet a felhasználó számára rangsorolunk. Ezt a szakaszt általában jelöltválasztásnak nevezik. Számos követelmény van rá. Először is, a kiválasztásnak nagyon gyorsan kell történnie, hogy a lehető legtöbb idő maradjon magára a rangsorolásra. Másodszor, miután nagymértékben csökkentettük a rangsorolandó dokumentumok számát, a felhasználó számára releváns dokumentumokat a lehető legteljesebb mértékben meg kell őriznünk.

Jelöltkiválasztási elvünk fejlődött, és jelenleg egy többlépcsős rendszerhez érkeztünk:

Hogyan dolgozunk az ajánlások kiválasztásának minőségén és sebességén

Először az összes dokumentumot csoportokra osztják, és minden csoportból a legnépszerűbb dokumentumokat veszik. A csoportok lehetnek webhelyek, témák, klaszterek. Minden felhasználó számára az előzményei alapján kiválasztják a hozzá legközelebb álló csoportokat, és ezekből veszik ki a legjobb dokumentumokat. A kNN indexet arra is használjuk, hogy valós időben válasszuk ki a felhasználóhoz legközelebb álló dokumentumokat. Számos módszer létezik a kNN index felépítésére, a miénk működött a legjobban HNSW (Hierarchikus navigálható kisvilág grafikonok). Ez egy hierarchikus modell, amely lehetővé teszi, hogy néhány ezredmásodperc alatt megtalálja a felhasználóhoz legközelebbi N vektort egy milliós adatbázisból. Először offline indexeljük a teljes dokumentumadatbázisunkat. Mivel az indexben történő keresés meglehetősen gyorsan működik, több erős beágyazás esetén több indexet is létrehozhat (minden beágyazáshoz egy index), és mindegyiket valós időben érheti el.

Továbbra is több tízezer dokumentum áll rendelkezésünkre minden felhasználó számára. Ez még mindig sok az összes funkció megszámlálásához, ezért ebben a szakaszban a könnyű besorolást használjuk – egy könnyű, nehéz rangsorolású modellt, kevesebb funkcióval. A feladat annak megjóslása, hogy egy nehéz modell mely dokumentumai lesznek a tetején. A legmagasabb prediktorral rendelkező dokumentumokat a nehéz modellben, azaz a rangsor utolsó szakaszában fogják használni. Ezzel a megközelítéssel több tízezredmásodperc alatt több millióról több ezerre csökkentheti a felhasználó számára figyelembe vett dokumentumok adatbázisát.

ALS lépés a futásidőben

Hogyan vehetjük figyelembe a felhasználói visszajelzéseket közvetlenül a kattintás után?

Az ajánlások fontos tényezője a felhasználói visszajelzésekre adott válaszidő. Ez különösen fontos az új felhasználók számára: amikor egy személy csak elkezdi használni az ajánlórendszert, egy nem személyre szabott feedet kap különböző témájú dokumentumokból. Amint megtette az első kattintást, ezt azonnal figyelembe kell vennie, és az érdeklődési köréhez kell igazodnia. Ha az összes tényezőt offline számítja ki, a rendszer gyors reagálása lehetetlenné válik a késés miatt. Tehát a felhasználói műveleteket valós időben kell feldolgozni. Ebből a célból az ALS lépést használjuk futás közben a felhasználó vektoros reprezentációjának elkészítéséhez.

Tegyük fel, hogy van vektoros ábrázolásunk minden dokumentumhoz. Például létrehozhatunk beágyazásokat offline módban egy cikk szövege alapján ELMo, BERT vagy más gépi tanulási modellek segítségével. Hogyan kaphatunk vektoros reprezentációt az azonos térben lévő felhasználókról a rendszerben való interakcióik alapján?

A felhasználói-dokumentum mátrix kialakításának és lebontásának általános elveLegyen m felhasználónk és n dokumentumunk. Egyes felhasználók számára ismert a kapcsolatuk bizonyos dokumentumokkal. Ezután ez az információ mxn mátrixként ábrázolható: a sorok a felhasználóknak, az oszlopok pedig a dokumentumoknak felelnek meg. Mivel a személy a legtöbb dokumentumot nem látta, a mátrixcellák nagy része üresen marad, míg mások kitöltve. Minden eseményhez (tetszik, nem tetszik, kattintás) adunk valamilyen értéket a mátrixban – de nézzünk egy egyszerűsített modellt, amelyben a tetszik 1-nek, a nem tetszik pedig -1-nek felel meg.

Bontsuk fel a mátrixot két részre: P (mxd) és Q (dxn), ahol d a vektoros ábrázolás dimenziója (általában kis szám). Ezután minden objektum egy d-dimenziós vektornak felel meg (felhasználónál - egy sor a P mátrixban, dokumentumnál - egy oszlop a Q mátrixban). Ezek a vektorok a megfelelő objektumok beágyazásai lesznek. Annak előrejelzéséhez, hogy a felhasználónak tetszeni fog-e egy dokumentum, egyszerűen megsokszorozhatja a beágyazásukat.

Hogyan dolgozunk az ajánlások kiválasztásának minőségén és sebességén
A mátrix felbontásának egyik lehetséges módja az ALS (Alternating Least Squares). A következő veszteségfüggvényt optimalizáljuk:

Hogyan dolgozunk az ajánlások kiválasztásának minőségén és sebességén

Itt rui az u felhasználó interakciója az i dokumentummal, a qi az i dokumentum vektora, a pu az u felhasználó vektora.

Ekkor a megfelelő lineáris regresszió megoldásával analitikusan megtaláljuk az átlagos négyzetes hiba szempontjából optimális felhasználói vektort (fix dokumentumvektorok esetén).

Ezt "ALS-lépésnek" nevezik. Maga az ALS algoritmus pedig az, hogy felváltva javítjuk az egyik mátrixot (felhasználók és cikkek), és frissítjük a másikat, megtalálva az optimális megoldást.

Szerencsére a felhasználó vektoros reprezentációjának megtalálása meglehetősen gyors művelet, amely futás közben elvégezhető vektoros utasítások segítségével. Ezzel a trükkel azonnal figyelembe veheti a felhasználói visszajelzéseket a rangsorolásnál. Ugyanez a beágyazás használható a kNN indexben a jelöltek kiválasztásának javítására.

Elosztott együttműködési szűrés

Hogyan lehet növekményes elosztott mátrixfaktorizálást végezni, és gyorsan megtalálni az új cikkek vektoros reprezentációit?

A tartalom nem az egyetlen ajánlási jelzés forrása. Egy másik fontos forrás az együttműködésen alapuló információ. A jó rangsorolási jellemzők hagyományosan a felhasználói-dokumentum mátrix felbontásával érhetők el. De amikor megpróbáltunk egy ilyen bontást végrehajtani, problémákba ütköztünk:

1. Több millió dokumentummal és több tízmillió felhasználóval rendelkezünk. A mátrix nem fér el teljesen egy gépen, és a lebontás nagyon hosszú ideig tart.
2. A rendszerben található tartalom nagy része rövid élettartamú: a dokumentumok csak néhány óráig maradnak relevánsak. Ezért a lehető leggyorsabban meg kell alkotni vektoros ábrázolásukat.
3. Ha közvetlenül a dokumentum közzététele után készít egy dekompozíciót, akkor elegendő számú felhasználónak nem lesz ideje kiértékelni. Ezért a vektoros ábrázolása valószínűleg nem lesz túl jó.
4. Ha egy felhasználónak tetszik vagy nem tetszik, ezt nem tudjuk azonnal figyelembe venni a bontásban.

E problémák megoldása érdekében a felhasználói-dokumentum mátrix elosztott dekompozícióját valósítottuk meg gyakori növekményes frissítésekkel. Pontosan hogyan működik?

Tegyük fel, hogy van egy N gépből álló klaszterünk (N értéke százban van), és egy olyan mátrixot akarunk rajtuk elosztott dekompozíciót végezni, amely nem fér el egy gépen. A kérdés az, hogy hogyan lehet ezt a bontást úgy végrehajtani, hogy egyrészt minden gépen legyen elegendő adat, másrészt a számítások függetlenek legyenek?

Hogyan dolgozunk az ajánlások kiválasztásának minőségén és sebességén

A fent leírt ALS-felbontási algoritmust fogjuk használni. Nézzük meg, hogyan hajthatunk végre egy ALS-lépést elosztott módon – a többi lépés hasonló lesz. Tegyük fel, hogy van egy rögzített dokumentummátrixunk, és szeretnénk felépíteni egy mátrixot a felhasználókból. Ehhez soronként N részre osztjuk, mindegyik rész megközelítőleg ugyanannyi sort tartalmaz majd. Minden gépre elküldjük a megfelelő sorok nem üres celláit, valamint a dokumentumbeágyazások mátrixát (teljesen). Mivel a mérete nem túl nagy, és a felhasználói-dokumentummátrix általában nagyon ritka, ezek az adatok elférnek egy normál gépen.

Ez a trükk több korszakon keresztül megismételhető, amíg a modell konvergál, a rögzített mátrixot egyenként váltogatva. De a mátrix lebontása még ekkor is több óráig tarthat. És ez nem oldja meg azt a problémát, hogy gyorsan meg kell kapnia az új dokumentumok beágyazásait, és frissítenie kell azok beágyazásait, amelyekről a modell felépítése során kevés információ volt.

A gyors inkrementális modellfrissítések bevezetése segített nekünk. Tegyük fel, hogy van egy jelenleg betanított modellünk. Képzése óta megjelentek olyan új cikkek, amelyekkel a felhasználóink ​​interakcióba léptek, valamint olyan cikkek, amelyek kevés interakciót váltottak ki a képzés során. Az ilyen cikkek beágyazásainak gyors megszerzéséhez a modell első nagy betanítása során kapott felhasználói beágyazásokat használjuk, és egy ALS-lépéssel kiszámítjuk a rögzített felhasználói mátrixon adott dokumentummátrixot. Ez lehetővé teszi a beágyazások gyors fogadását - a dokumentum közzététele után néhány percen belül -, és gyakran frissíti a legutóbbi dokumentumok beágyazásait.

Annak érdekében, hogy az ajánlásokat azonnal figyelembe vegyük az emberi tevékenységekkel, futásidőben nem használunk offline beágyazásokat. Ehelyett végrehajtunk egy ALS lépést, és megkapjuk a tényleges felhasználói vektort.

Átvitel másik domain területre

Hogyan használhatjuk fel a szöveges cikkekre adott felhasználói visszajelzéseket egy videó vektoros ábrázolására?

Kezdetben csak szöveges cikkeket javasoltunk, ezért sok algoritmusunk az ilyen típusú tartalomhoz van szabva. Más típusú tartalmak hozzáadásakor azonban szembesültünk a modellek adaptációjával. Hogyan oldottuk meg ezt a problémát egy videós példa segítségével? Az egyik lehetőség az összes modell újraképzése a semmiből. Ez azonban sok időt vesz igénybe, és az algoritmusok egy része megköveteli a betanítási minta méretét, amely még nem áll rendelkezésre a szükséges mennyiségben egy új típusú tartalomhoz a szolgáltatáson belüli életének első pillanataiban.

Másik úton jártunk, és újra felhasználtuk a szövegmodelleket a videóhoz. Ugyanez az ALS-trükk segített nekünk a videók vektoros ábrázolásában. A felhasználók vektoros ábrázolását szöveges cikkek alapján készítettük el, és egy ALS-lépést hajtottunk végre a videómegtekintési információk felhasználásával. Így könnyen megkaptuk a videó vektoros ábrázolását. Futás közben pedig egyszerűen kiszámítjuk a szöveges cikkekből nyert felhasználói vektor és a videó vektor közötti közelséget.

Következtetés

A valós idejű ajánlási rendszer magjának kidolgozása számos kihívással jár. Az adatok hatékony felhasználásához gyorsan kell feldolgoznia az adatokat, és ML módszereket kell alkalmaznia; komplex elosztott rendszereket építenek, amelyek képesek minimális idő alatt feldolgozni a felhasználói jeleket és az új tartalomegységeket; és sok más feladat.

A jelenlegi rendszerben, amelynek kialakítását leírtam, a felhasználónak szóló ajánlások minősége az aktivitásával és a szolgáltatásban való tartózkodási idejével együtt nő. De természetesen itt rejlik a fő nehézség: a rendszernek nehéz azonnal megértenie annak az embernek az érdekeit, aki alig érintkezik a tartalommal. Legfontosabb célunk az új felhasználóknak szóló ajánlások javítása. Folytatjuk az algoritmusok optimalizálását, hogy az egyén számára releváns tartalom gyorsabban bekerüljön a hírfolyamába, és az irreleváns tartalom ne jelenjen meg.

Forrás: will.com

Hozzászólás