Com treballem la qualitat i la rapidesa de selecció de recomanacions

Em dic Pavel Parkhomenko, sóc desenvolupador de ML. En aquest article, m'agradaria parlar de l'estructura del servei Yandex.Zen i compartir millores tècniques, la implementació de les quals ha permès augmentar la qualitat de les recomanacions. Des d'aquest post aprendràs a trobar els més rellevants per a l'usuari entre milions de documents en només uns mil·lisegons; com fer la descomposició contínua d'una gran matriu (formada per milions de columnes i desenes de milions de files) perquè els nous documents rebin el seu vector en desenes de minuts; com reutilitzar la descomposició de la matriu usuari-article per obtenir una bona representació vectorial per al vídeo.

Com treballem la qualitat i la rapidesa de selecció de recomanacions

La nostra base de dades de recomanacions conté milions de documents de diferents formats: articles de text creats a la nostra plataforma i extrets de llocs externs, vídeos, narracions i publicacions breus. El desenvolupament d'aquest servei està associat a un gran nombre de reptes tècnics. Aquests són alguns d'ells:

  • Dividiu les tasques d'informàtica: feu totes les operacions pesades fora de línia, i en temps real només realitzeu una aplicació ràpida de models per tal de ser responsable de 100-200 ms.
  • Tingueu en compte ràpidament les accions dels usuaris. Per fer-ho, és necessari que tots els esdeveniments es lliurin instantàniament al recomanador i influeixin en els resultats dels models.
  • Fes el feed perquè els usuaris nous s'adapti ràpidament al seu comportament. Les persones que s'acaben d'incorporar al sistema haurien de sentir que els seus comentaris influeixen en les recomanacions.
  • Comprèn ràpidament a qui recomanar un article nou.
  • Respondre ràpidament a l'aparició constant de contingut nou. Cada dia es publiquen desenes de milers d'articles, i molts d'ells tenen una vida útil limitada (per exemple, notícies). Això és el que els distingeix de les pel·lícules, la música i altres continguts de llarga vida i cars de crear.
  • Transferir coneixement d'una àrea de domini a una altra. Si un sistema de recomanació té models entrenats per a articles de text i hi afegim vídeo, podem reutilitzar els models existents perquè el nou tipus de contingut es classifiqui millor.

Us explicaré com hem resolt aquests problemes.

Selecció de candidats

Com reduir el nombre de documents considerats milers de vegades en pocs mil·lisegons, pràcticament sense deteriorar la qualitat de la classificació?

Suposem que hem entrenat molts models de ML, hem generat funcions basades en ells i hem entrenat un altre model que classifica els documents per a l'usuari. Tot aniria bé, però no només podeu prendre i calcular tots els signes de tots els documents en temps real, si hi ha milions d'aquests documents, i les recomanacions s'han de generar en 100-200 ms. La tasca és seleccionar un determinat subconjunt d'entre milions, que es classificarà per a l'usuari. Aquesta etapa sol anomenar-se selecció de candidats. Hi ha diversos requisits per a això. En primer lloc, la selecció s'ha de fer molt ràpid, de manera que quedi el màxim de temps possible per a la pròpia classificació. En segon lloc, havent reduït molt el nombre de documents per a la classificació, hem de conservar els documents rellevants per a l'usuari de la manera més completa possible.

El nostre principi de selecció de candidats ha evolucionat i, de moment, hem arribat a un esquema de diverses etapes:

Com treballem la qualitat i la rapidesa de selecció de recomanacions

En primer lloc, tots els documents es divideixen en grups i els documents més populars es prenen de cada grup. Els grups poden ser llocs, temes, clústers. Per a cada usuari, en funció del seu historial, se seleccionen els grups més propers a ell i se'n treuen els millors documents. També utilitzem l'índex kNN per seleccionar els documents més propers a l'usuari en temps real. Hi ha diversos mètodes per construir un índex kNN; el nostre va funcionar millor HNSW (Gràfics jeràrquics navegables del petit món). Aquest és un model jeràrquic que permet trobar els N vectors més propers per a un usuari a partir d'una base de dades de milions en pocs mil·lisegons. Primer indexem tota la nostra base de dades de documents fora de línia. Com que la cerca a l'índex funciona amb força rapidesa, si hi ha diverses incrustacions fortes, podeu crear diversos índexs (un índex per a cada incrustació) i accedir a cadascun d'ells en temps real.

Encara tenim desenes de milers de documents per a cada usuari. Això encara és molt per comptar totes les funcions, de manera que en aquesta etapa fem servir una classificació lleugera: un model de classificació pesat lleuger amb menys funcions. La tasca és predir quins documents tindrà un model pesat a la part superior. Els documents amb el predictor més alt s'utilitzaran en el model pesat, és a dir, en l'última etapa de classificació. Aquest enfocament permet reduir la base de dades de documents considerats per a l'usuari de milions a milers en desenes de mil·lisegons.

Pas ALS en temps d'execució

Com tenir en compte els comentaris dels usuaris immediatament després d'un clic?

Un factor important en les recomanacions és el temps de resposta als comentaris dels usuaris. Això és especialment important per als usuaris nous: quan una persona comença a utilitzar el sistema de recomanacions, rep un canal no personalitzat de documents de diversos temes. Tan bon punt fa el primer clic, cal tenir-ho en compte immediatament i adaptar-se als seus interessos. Si calculeu tots els factors fora de línia, una resposta ràpida del sistema serà impossible a causa del retard. Per tant, és necessari processar les accions dels usuaris en temps real. Per a aquests propòsits, utilitzem el pas ALS en temps d'execució per construir una representació vectorial de l'usuari.

Suposem que tenim una representació vectorial per a tots els documents. Per exemple, podem crear incrustacions fora de línia a partir del text d'un article utilitzant ELMo, BERT o altres models d'aprenentatge automàtic. Com podem obtenir una representació vectorial dels usuaris en un mateix espai a partir de les seves interaccions en el sistema?

Principi general de formació i descomposició de la matriu usuari-documentTinguem m usuaris i n documents. Per a alguns usuaris, es coneix la seva relació amb determinats documents. Aleshores, aquesta informació es pot representar com una matriu mxn: les files corresponen als usuaris i les columnes als documents. Com que la persona no ha vist la majoria dels documents, la majoria de cel·les de la matriu romandran buides, mentre que d'altres s'ompliran. Per a cada esdeveniment (com, no m'agrada, clic) es proporciona algun valor a la matriu, però considerem un model simplificat en què un m'agrada correspon a 1 i un no m'agrada correspon a -1.

Descomposem la matriu en dos: P (mxd) i Q (dxn), on d és la dimensió de la representació vectorial (normalment un nombre petit). Aleshores, cada objecte correspondrà a un vector d-dimensional (per a un usuari - una fila a la matriu P, per a un document - una columna a la matriu Q). Aquests vectors seran les incrustacions dels objectes corresponents. Per predir si un usuari li agradarà un document, només podeu multiplicar les seves incrustacions.

Com treballem la qualitat i la rapidesa de selecció de recomanacions
Una de les maneres possibles de descompondre una matriu és ALS (Alternating Least Squares). Optimitzarem la següent funció de pèrdua:

Com treballem la qualitat i la rapidesa de selecció de recomanacions

Aquí rui és la interacció de l'usuari u amb el document i, qi és el vector del document i, pu és el vector de l'usuari u.

Aleshores, el vector d'usuari òptim des del punt de vista de l'error quadrat mitjà (per a vectors de documents fixos) es troba analíticament resolent la regressió lineal corresponent.

Això s'anomena "pas ALS". I el propi algorisme d'ALS és que arreglem alternativament una de les matrius (usuaris i articles) i actualitzem l'altra, trobant la solució òptima.

Afortunadament, trobar la representació vectorial de l'usuari és una operació bastant ràpida que es pot fer en temps d'execució mitjançant instruccions vectorials. Aquest truc us permet tenir en compte immediatament els comentaris dels usuaris en la classificació. La mateixa incrustació es pot utilitzar a l'índex kNN per millorar la selecció de candidats.

Filtret col·laboratiu distribuït

Com fer la factorització de matrius distribuïdes incrementals i trobar ràpidament representacions vectorials d'articles nous?

El contingut no és l'única font de senyals de recomanació. Una altra font important és la informació col·laborativa. Tradicionalment, es poden obtenir bones característiques de classificació a partir de la descomposició de la matriu usuari-document. Però quan vam intentar fer aquesta descomposició, vam trobar problemes:

1. Tenim milions de documents i desenes de milions d'usuaris. La matriu no encaixa completament en una màquina i la descomposició trigarà molt de temps.
2. La major part del contingut del sistema té una vida útil curta: els documents són rellevants només unes poques hores. Per tant, és necessari construir la seva representació vectorial el més ràpidament possible.
3. Si creeu una descomposició immediatament després de la publicació del document, un nombre suficient d'usuaris no tindran temps per avaluar-lo. Per tant, la seva representació vectorial probablement no serà molt bona.
4. Si a un usuari li agrada o no li agrada, no podrem tenir-ho en compte immediatament en la descomposició.

Per resoldre aquests problemes, vam implementar una descomposició distribuïda de la matriu usuari-document amb actualitzacions incrementals freqüents. Com funciona exactament?

Suposem que tenim un clúster de N màquines (N està entre els centenars) i volem fer-hi una descomposició distribuïda d'una matriu que no encaixi en una màquina. La qüestió és com realitzar aquesta descomposició perquè, d'una banda, hi hagi prou dades a cada màquina i, de l'altra, perquè els càlculs siguin independents?

Com treballem la qualitat i la rapidesa de selecció de recomanacions

Utilitzarem l'algorisme de descomposició ALS descrit anteriorment. Vegem com executar un pas d'ALS de manera distribuïda: la resta de passos seran similars. Suposem que tenim una matriu fixa de documents i volem construir una matriu d'usuaris. Per fer-ho, el dividirem en N parts per línies, cada part contindrà aproximadament el mateix nombre de línies. Enviarem a cada màquina cel·les no buides de les files corresponents, així com la matriu d'incrustacions de documents (totalment). Com que la seva mida no és molt gran i la matriu de document d'usuari sol ser molt escassa, aquestes dades s'adaptaran a una màquina normal.

Aquest truc es pot repetir durant diverses èpoques fins que el model convergeix, alternant la matriu fixa una per una. Però fins i tot llavors, la descomposició de la matriu pot trigar diverses hores. I això no resol el problema que necessiteu per rebre ràpidament incrustacions de documents nous i actualitzar les incrustacions d'aquells sobre els quals hi havia poca informació a l'hora de construir el model.

La introducció d'actualitzacions ràpides de models incrementals ens va ajudar. Suposem que tenim un model entrenat actualment. Des de la seva formació, hi ha hagut articles nous amb els quals els nostres usuaris han interactuat, així com articles que van tenir poca interacció durant la formació. Per obtenir ràpidament les incrustacions d'aquests articles, utilitzem les incrustacions d'usuari obtingudes durant la primera gran formació del model i fem un pas ALS per calcular la matriu del document donada una matriu d'usuari fixa. Això us permet rebre incrustacions amb força rapidesa, en pocs minuts després de la publicació del document, i sovint actualitzar les incrustacions dels documents recents.

Perquè les recomanacions tinguin en compte immediatament les accions humanes, en temps d'execució no fem servir les incrustacions d'usuari obtingudes fora de línia. En canvi, fem un pas ALS i obtenim el vector real de l'usuari.

Transferència a una altra àrea de domini

Com utilitzar els comentaris dels usuaris sobre articles de text per crear una representació vectorial d'un vídeo?

Inicialment, recomanàvem només articles de text, de manera que molts dels nostres algorismes s'adapten a aquest tipus de contingut. Però a l'hora d'afegir un altre tipus de contingut, ens hem trobat amb la necessitat d'adaptar els models. Com hem resolt aquest problema amb un exemple de vídeo? Una opció és tornar a formar tots els models des de zero. Però això porta molt de temps i alguns algorismes exigeixen la mida de la mostra d'entrenament, que encara no està disponible en la quantitat necessària per a un nou tipus de contingut en els primers moments de la seva vida al servei.

Hem anat a l'altra banda i hem reutilitzat els models de text per al vídeo. El mateix truc d'ALS ens va ajudar a crear representacions vectorials de vídeos. Vam fer una representació vectorial dels usuaris basada en articles de text i vam fer un pas d'ALS mitjançant la informació de visualització de vídeo. Així que vam obtenir fàcilment una representació vectorial del vídeo. I en temps d'execució simplement calculem la proximitat entre el vector d'usuari obtingut dels articles de text i el vector de vídeo.

Conclusió

Desenvolupar el nucli d'un sistema de recomanació en temps real implica molts reptes. Heu de processar dades ràpidament i aplicar mètodes d'ML per utilitzar aquestes dades de manera eficaç; construir sistemes distribuïts complexos capaços de processar senyals d'usuari i noves unitats de contingut en un temps mínim; i moltes altres tasques.

En el sistema actual, el disseny del qual he descrit, la qualitat de les recomanacions per a l'usuari creix juntament amb la seva activitat i la durada de l'estada al servei. Però, per descomptat, aquí rau la principal dificultat: és difícil que el sistema entengui immediatament els interessos d'una persona que té poca interacció amb el contingut. Millorar les recomanacions per a usuaris nous és el nostre objectiu clau. Continuarem optimitzant els algorismes perquè el contingut rellevant per a una persona entri més ràpidament al seu feed i no es mostri el contingut irrellevant.

Font: www.habr.com

Afegeix comentari