Jinsi tunavyofanyia kazi ubora na kasi ya uteuzi wa mapendekezo

Jina langu ni Pavel Parkhomenko, mimi ni msanidi programu wa ML. Katika makala hii, ningependa kuzungumza juu ya muundo wa huduma ya Yandex.Zen na kushiriki uboreshaji wa kiufundi, utekelezaji ambao umefanya iwezekanavyo kuongeza ubora wa mapendekezo. Kutoka kwa chapisho hili utajifunza jinsi ya kupata zile zinazofaa zaidi kwa mtumiaji kati ya mamilioni ya hati katika milisekunde chache tu; jinsi ya kufanya mtengano unaoendelea wa matrix kubwa (iliyo na mamilioni ya nguzo na makumi ya mamilioni ya safu) ili hati mpya zipokee vector yao kwa makumi ya dakika; jinsi ya kutumia tena mtengano wa kipengee cha kifungu cha mtumiaji ili kupata uwakilishi mzuri wa vekta kwa video.

Jinsi tunavyofanyia kazi ubora na kasi ya uteuzi wa mapendekezo

Hifadhidata yetu ya mapendekezo ina mamilioni ya hati za miundo mbalimbali: makala ya maandishi yaliyoundwa kwenye jukwaa letu na kuchukuliwa kutoka tovuti za nje, video, masimulizi na machapisho mafupi. Uendelezaji wa huduma hiyo unahusishwa na idadi kubwa ya changamoto za kiufundi. Hapa kuna baadhi yao:

  • Gawanya kazi za kompyuta: fanya shughuli zote nzito nje ya mtandao, na kwa wakati halisi fanya utumizi wa haraka wa mifano ili kuwajibika kwa 100-200 ms.
  • Haraka kuzingatia vitendo vya mtumiaji. Ili kufanya hivyo, ni muhimu kwamba matukio yote yametolewa mara moja kwa pendekezo na kuathiri matokeo ya mifano.
  • Tengeneza malisho ili kwa watumiaji wapya ibadilishe haraka tabia zao. Watu ambao wamejiunga na mfumo wanapaswa kuhisi kuwa maoni yao yanaathiri mapendekezo.
  • Haraka kuelewa ni nani wa kupendekeza makala mpya.
  • Jibu haraka kwa kuibuka mara kwa mara kwa maudhui mapya. Makumi ya maelfu ya makala huchapishwa kila siku, na mengi yao yana maisha mafupi (sema, habari). Hii ndiyo inawatofautisha na filamu, muziki na maudhui mengine ya muda mrefu na ya gharama kubwa kuunda.
  • Hamisha maarifa kutoka eneo la kikoa hadi lingine. Iwapo mfumo wa mapendekezo una miundo iliyofunzwa ya makala ya maandishi na tukaiongeza video, tunaweza kutumia tena miundo iliyopo ili aina mpya ya maudhui iwe bora zaidi.

Nitakuambia jinsi tulivyotatua matatizo haya.

Uteuzi wa wagombea

Jinsi ya kupunguza idadi ya hati zinazozingatiwa kwa maelfu ya nyakati katika milliseconds chache, bila kuzorota kwa ubora wa nafasi?

Tuseme tumefunza miundo mingi ya ML, tukaunda vipengele kulingana nayo, na kutoa mafunzo kwa muundo mwingine unaoorodhesha hati za mtumiaji. Kila kitu kitakuwa sawa, lakini huwezi tu kuchukua na kuhesabu ishara zote kwa nyaraka zote kwa wakati halisi, ikiwa kuna mamilioni ya nyaraka hizi, na mapendekezo yanahitajika kujengwa kwa 100-200 ms. Kazi ni kuchagua kitengo fulani kutoka kwa mamilioni, ambacho kitawekwa kwa mtumiaji. Hatua hii kwa kawaida huitwa uteuzi wa mgombea. Kuna mahitaji kadhaa kwa ajili yake. Kwanza, uteuzi lazima ufanyike haraka sana, ili muda mwingi iwezekanavyo ubaki kwa cheo yenyewe. Pili, kwa kupunguza sana idadi ya hati za kuorodheshwa, lazima tuhifadhi hati zinazofaa kwa mtumiaji kabisa iwezekanavyo.

Kanuni yetu ya uteuzi wa wagombea imebadilika, na kwa sasa tumefika katika mpango wa hatua nyingi:

Jinsi tunavyofanyia kazi ubora na kasi ya uteuzi wa mapendekezo

Kwanza, nyaraka zote zimegawanywa katika vikundi, na nyaraka maarufu zaidi zinachukuliwa kutoka kwa kila kikundi. Vikundi vinaweza kuwa tovuti, mada, makundi. Kwa kila mtumiaji, kulingana na historia yake, vikundi vilivyo karibu naye vinachaguliwa na nyaraka bora zinachukuliwa kutoka kwao. Pia tunatumia faharasa ya kNN kuchagua hati ambazo ziko karibu na mtumiaji kwa wakati halisi. Kuna njia kadhaa za kuunda faharisi ya kNN; yetu ilifanya kazi vizuri zaidi HNSW (Grafu za Ulimwengu Mdogo Zinazoweza Kusafirishwa za Kihierarkia). Huu ni muundo wa hali ya juu ambao hukuruhusu kupata vekta N za karibu zaidi za mtumiaji kutoka kwa hifadhidata ya mamilioni katika milisekunde chache. Kwanza tunafahamisha hifadhidata yetu yote ya hati nje ya mtandao. Kwa kuwa kutafuta katika faharisi hufanya kazi haraka sana, ikiwa kuna upachikaji kadhaa wenye nguvu, unaweza kuunda faharisi kadhaa (faharasa moja kwa kila upachikaji) na kufikia kila moja yao kwa wakati halisi.

Bado tuna makumi ya maelfu ya hati kwa kila mtumiaji. Hii bado ni mengi ya kuhesabu vipengele vyote, kwa hiyo katika hatua hii tunatumia cheo cha mwanga - mfano wa cheo mzito na vipengele vichache. Kazi ni kutabiri ni hati gani ambayo mtindo mzito utakuwa nao hapo juu. Hati zilizo na kitabiri cha juu zaidi zitatumika katika muundo mzito, yaani, katika hatua ya mwisho ya cheo. Mbinu hii hukuruhusu kupunguza hifadhidata ya hati zinazozingatiwa kwa mtumiaji kutoka mamilioni hadi maelfu katika makumi ya milliseconds.

Hatua ya ALS katika wakati wa utekelezaji

Jinsi ya kuzingatia maoni ya mtumiaji mara baada ya kubofya?

Jambo muhimu katika mapendekezo ni wakati wa kujibu kwa maoni ya mtumiaji. Hii ni muhimu hasa kwa watumiaji wapya: wakati mtu anaanza tu kutumia mfumo wa mapendekezo, anapokea malisho yasiyo ya kibinafsi ya nyaraka za mada mbalimbali. Mara tu anapofanya kubofya kwanza, unahitaji mara moja kuzingatia hili na kukabiliana na maslahi yake. Ukihesabu vipengele vyote nje ya mtandao, jibu la haraka la mfumo halitawezekana kutokana na kuchelewa. Kwa hivyo ni muhimu kusindika vitendo vya mtumiaji kwa wakati halisi. Kwa madhumuni haya, tunatumia hatua ya ALS wakati wa utekelezaji kuunda uwakilishi wa vekta ya mtumiaji.

Wacha tuchukue kuwa tuna uwakilishi wa vekta kwa hati zote. Kwa mfano, tunaweza kuunda upachikaji nje ya mtandao kulingana na maandishi ya makala kwa kutumia ELMo, BERT au miundo mingine ya kujifunza kwa mashine. Tunawezaje kupata uwakilishi wa vekta wa watumiaji katika nafasi sawa kulingana na mwingiliano wao kwenye mfumo?

Kanuni ya jumla ya malezi na mtengano wa matrix ya hati ya mtumiajiWacha tuwe na watumiaji m na hati n. Kwa watumiaji wengine, uhusiano wao na hati fulani unajulikana. Kisha maelezo haya yanaweza kuwakilishwa kama matrix ya mxn: safu mlalo zinalingana na watumiaji, na safu wima zinalingana na hati. Kwa kuwa mtu huyo hajaona hati nyingi, seli nyingi za matrix zitabaki tupu, wakati zingine zitajazwa. Kwa kila tukio (kama, kutopenda, bofya) thamani fulani imetolewa kwenye tumbo - lakini hebu tuzingatie muundo uliorahisishwa ambao kupenda kunalingana na 1, na kutopenda kunalingana na -1.

Wacha tutengane matrix kuwa mbili: P (mxd) na Q (dxn), ambapo d ni kipimo cha uwakilishi wa vekta (kawaida nambari ndogo). Kisha kila kitu kitalingana na vekta ya d-dimensional (kwa mtumiaji - safu kwenye tumbo P, kwa hati - safu kwenye matrix Q). Vekta hizi zitakuwa upachikaji wa vitu vinavyolingana. Ili kutabiri ikiwa mtumiaji atapenda hati, unaweza tu kuzidisha upachikaji wake.

Jinsi tunavyofanyia kazi ubora na kasi ya uteuzi wa mapendekezo
Mojawapo ya njia zinazowezekana za kuoza matrix ni ALS (Alternating Least Squares). Tutaboresha utendaji wa upotezaji ufuatao:

Jinsi tunavyofanyia kazi ubora na kasi ya uteuzi wa mapendekezo

Hapa rui ni mwingiliano wa mtumiaji u na hati i, qi ni vekta ya hati i, pu ni vekta ya mtumiaji u.

Kisha vekta bora ya mtumiaji kutoka kwa mtazamo wa makosa ya mraba ya wastani (kwa vekta za hati zisizohamishika) hupatikana kwa uchanganuzi kwa kutatua urejeshaji wa mstari unaolingana.

Hii inaitwa "hatua ya ALS". Na algorithm ya ALS yenyewe ni kwamba tunarekebisha moja ya matrices (watumiaji na vifungu) na kusasisha nyingine, kutafuta suluhisho bora.

Kwa bahati nzuri, kupata uwakilishi wa vekta ya mtumiaji ni operesheni ya haraka sana ambayo inaweza kufanywa wakati wa kukimbia kwa kutumia maagizo ya vekta. Ujanja huu hukuruhusu kuchukua mara moja maoni ya mtumiaji katika akaunti katika nafasi. Upachikaji sawa unaweza kutumika katika faharasa ya kNN ili kuboresha uteuzi wa mgombea.

Uchujaji Ushirikiano Uliosambazwa

Jinsi ya kufanya uboreshaji wa matrix uliosambazwa kwa kuongezeka na kupata uwakilishi wa vekta wa nakala mpya?

Maudhui sio chanzo pekee cha ishara za mapendekezo. Chanzo kingine muhimu ni habari shirikishi. Vipengele vyema vya cheo vinaweza kupatikana kwa kawaida kutokana na mtengano wa matrix ya hati ya mtumiaji. Lakini wakati wa kujaribu kufanya mtengano kama huo, tulipata shida:

1. Tuna mamilioni ya hati na makumi ya mamilioni ya watumiaji. Matrix haifai kabisa kwenye mashine moja, na mtengano utachukua muda mrefu sana.
2. Maudhui mengi katika mfumo yana muda mfupi wa maisha: hati hubakia kuwa muhimu kwa saa chache tu. Kwa hiyo, ni muhimu kujenga uwakilishi wao wa vector haraka iwezekanavyo.
3. Ikiwa utaunda mtengano mara baada ya hati kuchapishwa, idadi ya kutosha ya watumiaji haitakuwa na muda wa kutathmini. Kwa hiyo, uwakilishi wake wa vector hautakuwa mzuri sana.
4. Ikiwa mtumiaji anapenda au hapendi, hatutaweza kuzingatia hili mara moja katika mtengano.

Ili kutatua matatizo haya, tulitekeleza mtengano uliosambazwa wa matriki ya hati ya mtumiaji na masasisho ya mara kwa mara ya nyongeza. Jinsi gani hasa kazi?

Tuseme tunayo nguzo ya mashine N (N iko katika mamia) na tunataka kufanya mtengano uliosambazwa wa matrix juu yao ambayo haifai kwenye mashine moja. Swali ni jinsi ya kufanya mtengano huu ili, kwa upande mmoja, kuna data ya kutosha kwenye kila mashine na, kwa upande mwingine, ili mahesabu yawe huru?

Jinsi tunavyofanyia kazi ubora na kasi ya uteuzi wa mapendekezo

Tutatumia algoriti ya mtengano ya ALS iliyoelezwa hapo juu. Wacha tuangalie jinsi ya kutekeleza hatua moja ya ALS kwa njia iliyosambazwa - hatua zingine zitakuwa sawa. Wacha tuseme tuna muundo thabiti wa hati na tunataka kuunda matrix ya watumiaji. Ili kufanya hivyo, tutaigawanya katika sehemu za N kwa mistari, kila sehemu itakuwa na takriban idadi sawa ya mistari. Tutatuma kwa kila mashine seli zisizo tupu za safu mlalo zinazolingana, pamoja na matriki ya upachikaji wa hati (kabisa). Kwa kuwa saizi yake sio kubwa sana, na matrix ya hati ya mtumiaji kawaida ni ndogo sana, data hii itatoshea kwenye mashine ya kawaida.

Ujanja huu unaweza kurudiwa kwa nyakati kadhaa hadi muundo uungane, ukibadilisha matrix isiyobadilika moja baada ya nyingine. Lakini hata hivyo, mtengano wa matrix unaweza kuchukua saa kadhaa. Na hii haisuluhishi shida ambayo unahitaji kupokea haraka upachikaji wa hati mpya na kusasisha upachikaji wa zile ambazo kulikuwa na habari kidogo wakati wa kujenga mfano.

Kuanzishwa kwa masasisho ya haraka ya miundo ya ziada kulitusaidia. Wacha tuseme tunayo mfano uliofunzwa kwa sasa. Tangu mafunzo yake, kumekuwa na makala mapya ambayo watumiaji wetu wametangamana nayo, pamoja na makala ambayo yalikuwa na mwingiliano mdogo wakati wa mafunzo. Ili kupata upachikaji wa vipengee kama hivyo kwa haraka, tunatumia upachikaji wa mtumiaji zilizopatikana wakati wa mafunzo makubwa ya kwanza ya muundo na kufanya hatua moja ya ALS ili kukokotoa mkusanyiko wa hati kutokana na mkusanyiko usiobadilika wa mtumiaji. Hii hukuruhusu kupokea upachikaji haraka - ndani ya dakika chache baada ya hati kuchapishwa - na mara nyingi kusasisha upachikaji wa hati za hivi majuzi.

Ili kutoa mapendekezo kuzingatia vitendo vya kibinadamu mara moja, katika muda wa utekelezaji hatutumii upachikaji wa watumiaji uliopatikana nje ya mtandao. Badala yake, tunafanya hatua ya ALS na kupata vekta halisi ya mtumiaji.

Hamisha hadi eneo lingine la kikoa

Jinsi ya kutumia maoni ya mtumiaji kwenye vifungu vya maandishi ili kuunda uwakilishi wa vekta ya video?

Hapo awali, tulipendekeza makala za maandishi pekee, kwa hivyo kanuni zetu nyingi zimeundwa kulingana na aina hii ya maudhui. Lakini wakati wa kuongeza aina nyingine za maudhui, tulikabiliwa na haja ya kurekebisha mifano. Je, tulitatuaje tatizo hili kwa kutumia mfano wa video? Chaguo moja ni kurejesha mifano yote kutoka mwanzo. Lakini hii inachukua muda mrefu, na baadhi ya algorithms zinadai juu ya ukubwa wa sampuli ya mafunzo, ambayo bado haipatikani kwa kiasi kinachohitajika kwa aina mpya ya maudhui katika dakika za kwanza za maisha yake kwenye huduma.

Tulikwenda kwa njia nyingine na kutumia tena mifano ya maandishi ya video. Ujanja ule ule wa ALS ulitusaidia kuunda viwakilishi vya vekta vya video. Tulichukua uwakilishi wa vekta wa watumiaji kulingana na nakala za maandishi na tukachukua hatua ya ALS kwa kutumia maelezo ya mwonekano wa video. Kwa hivyo tulipata uwakilishi wa vekta wa video kwa urahisi. Na wakati wa utekelezaji tunakokotoa tu ukaribu kati ya vekta ya mtumiaji iliyopatikana kutoka kwa makala ya maandishi na vekta ya video.

Hitimisho

Kukuza msingi wa mfumo wa mapendekezo ya wakati halisi huhusisha changamoto nyingi. Unahitaji kuchakata data haraka na kutumia mbinu za ML ili kutumia data hii kwa ufanisi; jenga mifumo tata iliyosambazwa yenye uwezo wa kuchakata mawimbi ya mtumiaji na vitengo vipya vya maudhui kwa muda mfupi; na kazi nyingine nyingi.

Katika mfumo wa sasa, muundo ambao nilielezea, ubora wa mapendekezo kwa mtumiaji hukua pamoja na shughuli zake na urefu wa kukaa kwenye huduma. Lakini kwa kweli, hapa kuna ugumu kuu: ni ngumu kwa mfumo kuelewa mara moja masilahi ya mtu ambaye ana mwingiliano mdogo na yaliyomo. Kuboresha mapendekezo kwa watumiaji wapya ndilo lengo letu kuu. Tutaendelea kuboresha algoriti ili maudhui ambayo ni muhimu kwa mtu yaingie kwenye mpasho wake kwa haraka, na maudhui yasiyomuhusu yasionyeshwe.

Chanzo: mapenzi.com

Kuongeza maoni