Em çawa li ser kalîte û leza hilbijartina pêşniyaran dixebitin

Navê min Pavel Parkhomenko ye, ez pêşdebirek ML im. Di vê gotarê de, ez dixwazim li ser strukturên karûbarê Yandex.Zen biaxivim û çêtirkirinên teknîkî parve bikim, ku pêkanîna wan gengaz kiriye ku kalîteya pêşniyaran zêde bike. Ji vê postê hûn ê fêr bibin ka meriv çawa di nav çend milîsaniyeyan de di nav mîlyonan belgeyan de yên herî têkildar ji bikarhêner re peyda dike; Meriv çawa dabeşkirina domdar a matrixek mezin (ji mîlyon stûn û bi deh mîlyon rêzan pêk tê) dike, da ku belgeyên nû di deh hûrdeman de vektora xwe bistînin; Meriv çawa hilweşandina matrixê-karker-gotar ji nû ve bikar tîne da ku ji bo vîdyoyê nûneriyek vektorê ya baş bistîne.

Em çawa li ser kalîte û leza hilbijartina pêşniyaran dixebitin

Databasa pêşniyara me bi mîlyonan belgeyên cûrbecûr formatan vedihewîne: gotarên nivîsê yên ku li ser platforma me hatine afirandin û ji malperên derveyî, vîdyoy, vegotin û postên kurt hatine girtin. Pêşveçûna karûbarek weha bi hejmareke mezin ji pirsgirêkên teknîkî ve girêdayî ye. Li vir hinek ji wan hene:

  • Karên hesabkirinê dabeş bikin: Hemî operasyonên giran offline bikin, û di demek rast de tenê serîlêdana bilez a modelan pêk bînin da ku ji 100-200 ms berpirsiyar bin.
  • Bi lez tevgerên bikarhêneran hesab bikin. Ji bo vê yekê, pêdivî ye ku hemî bûyer tavilê ji pêşniyarker re werin radest kirin û bandorê li encamên modelan bikin.
  • Xwarinê çêbikin da ku ji bo bikarhênerên nû ew zû bi tevgera wan re biguncîne. Kesên ku nû tevlî pergalê bûne divê hîs bikin ku nerînên wan bandorê li pêşniyaran dike.
  • Zû zû fêm bikin ka ji kê re gotarek nû pêşniyar bikin.
  • Ji derketina domdar a naveroka nû re zû bersiv bidin. Her roj bi deh hezaran gotar têne weşandin, û gelek ji wan jî temenê wan kêm e (bibêjin nûçe). Ya ku wan ji fîlim, muzîk û naverokên din ên demdirêj û biha yên afirandinê cuda dike ev e.
  • Zanyariyê ji herêmek domainê derbasî qada din bikin. Ger pergalek pêşniyarê ji bo gotarên nivîsê modelên perwerdekirî hebe û em vîdyoyê lê zêde bikin, em dikarin modelên heyî ji nû ve bi kar bînin da ku naverok celebê nû çêtir rêz bike.

Ez ê ji we re vebêjim ka me van pirsgirêkan çawa çareser kir.

Hilbijartina namzetan

Meriv çawa di çend milîsaneyan de hejmara belgeyên li ber çavan bi hezaran carî kêm dike, bêyî ku di qalîteya rêzkirinê de bi rastî xirab bibe?

Bifikirin ku me gelek modelên ML perwerde kirin, li ser bingeha wan taybetmendî çêkirin, û modelek din ku belgeyan ji bikarhêner re rêz dike perwerde kir. Dê her tişt baş be, lê hûn nekarin tenê hemî nîşanan ji bo hemî belgeyan di wextê rast de bigirin û hesab bikin, heke bi mîlyonan van belgeyan hebin, û pêdivî ye ku pêşniyar di 100-200 ms de bêne çêkirin. Kar ev e ku meriv ji bi mîlyonan binkeyek diyarkirî hilbijêrin, ku dê ji bo bikarhêner were rêz kirin. Vê qonaxê bi gelemperî wekî hilbijartina berendam tê gotin. Gelek pêdiviyên wê hene. Pêşîn, hilbijartin divê pir zû çêbibe, da ku bi qasî ku gengaz dem ji bo rêzgirtinê bixwe bimîne. Ya duyemîn, ji ber ku jimara belgeyên ji bo rêzgirtinê pir kêm kir, divê em bi qasî ku gengaz be belgeyên têkildar ên bikarhêner biparêzin.

Prensîba me ya hilbijartina berendamê pêşketiye, û di vê gavê de em gihîştine bernameyek pir-qonaxa:

Em çawa li ser kalîte û leza hilbijartina pêşniyaran dixebitin

Pêşîn, hemî belge di koman de têne dabeş kirin, û belgeyên herî populer ji her komê têne girtin. Kom dikarin bibin malper, mijar, kom. Ji bo her bikarhênerek, li gorî dîroka wî, komên herî nêzî wî têne hilbijartin û belgeyên çêtirîn ji wan têne girtin. Em di heman demê de pêveka kNN bikar tînin da ku belgeyên ku di demek rast de nêzî bikarhêner in hilbijêrin. Gelek rêbazên ji bo avakirina indexek kNN hene; HNSW (Grafikên Cîhana Piçûk a Navigable Hiyerarşîk). Ev modelek hiyerarşîk e ku dihêle hûn di nav çend milliseconan de vektorên N-ya herî nêzîk ji bo bikarhênerek ji databasek bi mîlyonan bibînin. Em pêşî tevaya databasa belgeya xwe negirêdayî navnîş dikin. Ji ber ku lêgerîna di pêvekê de pir zû dixebite, heke çend pêvekirinên bihêz hebin, hûn dikarin çend indexan biafirînin (ji bo her vegirtinê yek navnîşek) û di demek rast de bigihîjin her yek ji wan.

Ji bo her bikarhênerek hîn jî bi deh hezaran belgeyên me hene. Ev hîn jî gelek e ku meriv hemî taybetmendiyan bijmêre, ji ber vê yekê di vê qonaxê de em rêzek sivik bikar tînin - modelek rêzek giran a sivik bi taybetmendiyên hindiktir. Erk ev e ku pêşbînî bike ka kîjan belgeyên modelek giran dê di serî de hebe. Belgeyên bi pêşbîniya herî bilind dê di modela giran de, ango di qonaxa paşîn a rêzkirinê de werin bikar anîn. Ev nêzîkatî dihêle hûn databasa belgeyên ku ji bo bikarhêner têne hesibandin ji mîlyonan bi hezaran di deh millisecond de kêm bikin.

ALS gav di dema xebitandinê de

Meriv çawa di cih de piştî klîkek bertekên bikarhêner hesab dike?

Di pêşnîyaran de faktorek girîng dema bersivdayînê ya bikarhêner e. Ev bi taybetî ji bo bikarhênerên nû girîng e: gava ku kesek nû dest bi karanîna pergala pêşniyarê dike, ew pelgeyên ne-kesane yên belgeyên mijarên cihêreng werdigire. Gava ku ew yekem klîk dike, hûn hewce ne ku tavilê vê yekê li ber çavan bigirin û li gorî berjewendiyên wî tevbigerin. Ger hûn hemî faktoran offline hesab bikin, dê bersivek bilez a pergalê ji ber derengbûnê ne mumkun bibe. Ji ber vê yekê pêdivî ye ku meriv kiryarên bikarhêner di demek rast de pêvajoyê bike. Ji bo van armancan, em gavavêtina ALS di dema xebitandinê de bikar tînin da ku nûneriyek vektorî ya bikarhêner ava bikin.

Ka em bihesibînin ku me ji bo hemî belgeyan nûneriyek vektorî heye. Mînakî, em dikarin bi karanîna ELMo, BERT an modelên din ên fêrbûna makîneyê li ser bingeha metna gotarek negirêdayî vehewandinan ava bikin. Em çawa dikarin li ser bingeha danûstendinên wan ên di pergalê de nûneriyek vektorê ya bikarhêneran li heman cîhê bistînin?

Prensîba giştî ya damezrandin û hilweşandina matrixa bikarhêner-belgeBila m bikarhêner û n belgeyên me hebin. Ji bo hin bikarhêneran, têkiliya wan bi hin belgeyan re tê zanîn. Wê hingê ev agahdarî dikare wekî matrixek mxn were destnîşan kirin: rêz bi bikarhêneran re, û stûn bi belgeyan re têkildar in. Ji ber ku mirov piraniya belgeyan nedîtine, piraniya şaneyên matrixê dê vala bimînin, lê yên din dê bêne dagirtin. Ji bo her bûyerekê (wek, nehezkirin, bitikîne) hin nirx di matrixê de tê peyda kirin - lê em modelek sadekirî bihesibînin ku tê de mîna 1, û nehezkirin bi -1 re têkildar e.

Ka em matrixê bikin du: P (mxd) û Q (dxn), ku d pîvana temsîla vektorê ye (bi gelemperî hejmarek piçûk). Dê her tişt bi vektorek d-dimensîyonel re têkildar be (ji bo bikarhênerek - rêzek di matrixê P de, ji bo belgeyek - stûnek di matrixê Q de). Ev vektor dê bicîkirina tiştên têkildar bin. Ji bo pêşbînîkirin ka bikarhênerek dê ji belgeyek hez bike, hûn dikarin bi tenê vegirtinên wan zêde bikin.

Em çawa li ser kalîte û leza hilbijartina pêşniyaran dixebitin
Yek ji awayên gengaz ên hilweşandina matrixê ALS (Alternating Least Squares) ye. Em ê fonksiyona windabûna jêrîn xweşbîn bikin:

Em çawa li ser kalîte û leza hilbijartina pêşniyaran dixebitin

Li vir rui danûstendina bikarhêner u bi belge i ye, qi vektora belgeya i ye, pu vektora bikarhêner u ye.

Dûv re vektora bikarhêner a çêtirîn ji nihêrîna xeletiya çargoşeya navîn (ji bo vektorên belgeyên sabît) bi çareserkirina regresyona xêzikî ya têkildar ve analîtîk tê dîtin.

Ji vê re "gava ALS" tê gotin. Û algorîtmaya ALS bi xwe ev e ku em bi alternatîf yek ji matrican (bikarhêner û gotar) rast dikin û ya din nûve dikin, çareseriya çêtirîn bibînin.

Xweşbextane, dîtina nûneriya vektorê ya bikarhêner xebatek bi lez e ku dikare di dema xebitandinê de bi karanîna rêwerzên vektorê were kirin. Ev hîle dihêle hûn tavilê nerînên bikarhêner di rêzgirtinê de hesab bikin. Heman vegirtin dikare di navnîşa kNN de were bikar anîn da ku hilbijartina berendamê baştir bike.

Parzûnkirina Hevkarî ya Belavkirî

Meriv çawa faktorîzasyona matrixê ya belavbûyî ya zêde dike û zû temsîlên vektorî yên gotarên nû dibîne?

Naverok ne tenê çavkaniya nîşanên pêşniyarê ye. Çavkaniyek din a girîng agahdariya hevkariyê ye. Taybetmendiyên rêzkirina baş bi kevneşopî dikarin ji hilweşandina matrixê-belgeya bikarhêner-ê werin wergirtin. Lê dema ku em hewl didin ku perçebûnek weha bikin, em rastî pirsgirêkan hatin:

1. Bi mîlyonan belge û bi deh mîlyon bikarhênerên me hene. Matrix bi tevahî li ser yek makîneyê cîh nagire, û hilweşandin dê demek pir dirêj bigire.
2. Piraniya naverokê di pergalê de xwedan jiyanek kurt e: belge tenê çend demjimêran têkildar dimînin. Ji ber vê yekê, pêdivî ye ku bi zûtirîn dem nûneriya vektora wan were avakirin.
3. Ger hûn tavilê piştî weşandina belgeyê veqetandinê ava bikin, dê hejmarek têr a bikarhêneran wext tune ku wê binirxînin. Ji ber vê yekê, nûneriya vektorê wê bi îhtîmalek pir ne baş be.
4. Ger bikarhênerek jê hez bike an jê hez neke, em ê nikaribin tavilê vê yekê di hilweşandinê de bihesibînin.

Ji bo çareserkirina van pirsgirêkan, me dabeşkirinek belavkirî ya matrixê-belgeya bikarhêner bi nûvekirinên zêdebûyî yên pir caran pêk anî. Bi rastî ew çawa dixebite?

Bihesibînin ku komeke me ji N makîneyan heye (N bi sedan e) û em dixwazin li ser wan perçebûnek belavkirî ya matrixek ku li ser yek makîneyê cîh nagire bikin. Pirs ev e ku meriv çawa vê hilweşandinê pêk tîne da ku, ji aliyekî ve, li ser her makîneyek têra xwe dane hebe û ji hêla din ve, da ku hesab serbixwe bin?

Em çawa li ser kalîte û leza hilbijartina pêşniyaran dixebitin

Em ê algorîtmaya hilweşandina ALS-ê ku li jor hatî destnîşan kirin bikar bînin. Ka em binihêrin ka meriv gavek ALS-ê çawa bi rengek belavkirî bicîh tîne - gavên mayî dê mîna hev bin. Em bibêjin ku me matrixek belgeyên sabît heye û em dixwazin matrixek bikarhêneran ava bikin. Ji bo vê yekê, em ê wê bi rêzan li N beşan dabeş bikin, her beş dê bi qasî heman hejmara rêzan hebe. Em ê ji her makîneyê re hucreyên ne-vala yên rêzên têkildar, û hem jî matrixa binavkirina belgeyan (bi tevahî) bişînin. Ji ber ku mezinahiya wê ne pir mezin e, û matrixa belgeya bikarhêner bi gelemperî pir kêm e, ev dane dê li ser makîneyek birêkûpêk bicîh bibe.

Ev hîle dikare di çend serdeman de were dubare kirin heya ku model bigihîje hev, matrixa sabît yek bi yek biguhezîne. Lê tewra wê hingê jî, hilweşandina matrixê dikare çend demjimêran bigire. Û ev pirsgirêkê çareser nake ku hûn hewce ne ku hûn zû bişkojkên belgeyên nû werbigirin û cîhên wan ên ku di çêkirina modelê de hindik agahdarî li ser wan hebûn nûve bikin.

Danasîna nûvekirinên modela zêdebûyî yên bilez alîkariya me kir. Ka em bibêjin modelek me ya niha hatî perwerdekirin heye. Ji perwerdehiya wê û vir ve, gotarên nû hene ku bikarhênerên me pê re têkilî danîbûn, û her weha gotarên ku di dema perwerdehiyê de pêwendiyek hindik hebû. Ji bo ku em bi lez danûstendinên gotarên weha bi dest bixin, em veguheztinên bikarhêner ên ku di yekem perwerdehiya mezin a modelê de hatine wergirtin bikar tînin û yek gav ALS dikin da ku matrixa belgeyê ya ku matrixek bikarhênerek sabît tê dayîn hesab bike. Ev rê dide we ku hûn bi lez û bez pêvekêşan bistînin - di nav çend hûrdeman de piştî weşandina belgeyê - û pir caran bicîhkirina belgeyên dawîn nûve bikin.

Ji bo ku tavilê pêşnîyaran bikin kiryarên mirovî li ber çavan bigirin, di dema xebitandinê de em binavkirinên bikarhêner ên ku offline hatine bidestxistin bikar naynin. Di şûna wê de, em gavek ALS-ê dikin û vektora bikarhênerê rastîn digirin.

Veguheztin qada domainek din

Meriv çawa bertekên bikarhêner li ser gotarên nivîsê bikar tîne da ku nûneriyek vektorî ya vîdyoyek ava bike?

Di destpêkê de, me tenê gotarên nivîsê pêşniyar kir, ji ber vê yekê gelek algorîtmayên me li gorî vê celebê naverokê têne çêkirin. Lê dema ku cûreyên naverokê yên din lê zêde kirin, em bi hewcedariya adaptasyona modelan re rû bi rû man. Me ev pirsgirêk çawa bi karanîna mînakek vîdyoyê çareser kir? Vebijarkek ev e ku hûn hemî modelan ji nû ve perwerde bikin. Lê ev demek dirêj digire, û hin algorîtmayan li ser mezinahiya nimûneya perwerdehiyê daxwaz dikin, ku hîna di demên pêşîn ên jiyana xwe de li ser karûbarê ji bo celebek nû ya naverok di hêjmara pêwîst de peyda nabe.

Em çûn rêyek din û ji bo vîdyoyê modelên nivîsê ji nû ve bikar anîn. Heman fêlbaziya ALS alîkariya me kir ku nûnertiyên vektorî yên vîdyoyan biafirînin. Me li ser bingeha gotarên nivîsê nûneriyek vektor a bikarhêneran girt û bi karanîna agahdariya dîtina vîdyoyê gavek ALS kir. Ji ber vê yekê me bi hêsanî nûnertiya vektorê ya vîdyoyê girt. Û di dema xebitandinê de em bi tenê nêzîkbûna di navbera vektora bikarhêner a ku ji gotarên nivîsê hatî wergirtin û vektora vîdyoyê de hesab dikin.

encamê

Pêşxistina bingeha pergala pêşnûmeya rast-dem gelek dijwariyan vedihewîne. Pêdivî ye ku hûn zû daneyan pêvajoyê bikin û rêbazên ML-ê bicîh bikin ku bi bandor vê daneyê bikar bînin; pergalên belavkirî yên tevlihev ava bikin ku dikarin di demek hindiktirîn de îşaretên bikarhêner û yekîneyên nû yên naverokê hilînin; û gelek karên din.

Di pergala heyî de, sêwirana ku min diyar kir, kalîteya pêşniyarên ji bo bikarhêner digel çalakî û dirêjahiya mayîna wî ya li ser karûbarê mezin dibe. Lê bê guman, li vir dijwariya sereke heye: ji bo pergalê zehmet e ku tavilê berjewendîyên kesek ku pêwendiyek piçûk bi naverokê re heye fam bike. Pêşniyarên ji bo bikarhênerên nû çêtirkirina armanca me ya sereke ye. Em ê xweşbînkirina algorîtmayan bidomînin da ku naveroka ku bi kesek re têkildar zûtir bikeve nav xwarina wî, û naveroka negirêdayî neyê xuyang kirin.

Source: www.habr.com