Իմ անունը Պավել Պարխոմենկո է, ես մեքենայական ծրագրավորող եմ։ Այս հոդվածում ես կցանկանայի խոսել Yandex.Zen ծառայության կառուցվածքի մասին և կիսվել տեխնիկական բարելավումներով, որոնց իրականացումը թույլ է տվել բարձրացնել առաջարկությունների որակը։ Այս գրառումից դուք կսովորեք, թե ինչպես գտնել օգտատիրոջ համար առավել համապատասխան փաստաթղթերը միլիոնավոր փաստաթղթերի մեջ ընդամենը մի քանի միլիվայրկյանում, ինչպես անընդհատ քայքայել մեծ մատրիցը (բաղկացած միլիոնավոր սյուներից և տասնյակ միլիոնավոր տողերից) այնպես, որ նոր փաստաթղթերը ստանան իրենց վեկտորը տասնյակ րոպեների ընթացքում, ինչպես վերօգտագործել օգտատեր-հոդված մատրիցի քայքայումը՝ տեսանյութի համար լավ վեկտորային ներկայացում ստանալու համար։

Մեր առաջարկությունների բազան պարունակում է տարբեր ձևաչափերի միլիոնավոր փաստաթղթեր՝ մեր հարթակում ստեղծված և արտաքին կայքերից վերցված տեքստային հոդվածներ, տեսանյութեր, պատմություններ և կարճ գրառումներ: Նման ծառայության մշակումը կապված է բազմաթիվ տեխնիկական մարտահրավերների հետ: Ահա դրանցից մի քանիսը.
- Բաժանեք հաշվողական առաջադրանքները. կատարեք բոլոր ծանր գործողությունները անցանց և կատարեք մոդելների միայն արագ կիրառումը իրական ժամանակում, որպեսզի դրանք արձագանքեն 100-200 մվրկ-ի ընթացքում։
- Արագորեն հաշվի առեք օգտատիրոջ գործողությունները: Սա պահանջում է, որ բոլոր իրադարձությունները անմիջապես հասցվեն խորհուրդ տվողին և ազդեն մոդելների արդյունքների վրա:
- Ստեղծեք լրահոսը այնպես, որ այն արագ հարմարվի նոր օգտատերերի վարքագծին։ Մարդիկ, ովքեր նոր են մուտք գործել համակարգ, պետք է զգան, որ իրենց կարծիքը ազդում է առաջարկությունների վրա։
- Արագ հասկացեք, թե ում խորհուրդ տալ նոր հոդված։
- Արագ արձագանքեք նոր բովանդակության անընդհատ ի հայտ գալուն։ Ամեն օր հրապարակվում են տասնյակ հազարավոր հոդվածներ, և դրանցից շատերն ունեն սահմանափակ կյանքի տևողություն (ասենք՝ նորություններ)։ Ահա թե ինչով են դրանք տարբերվում ֆիլմերից, երաժշտությունից և այլ երկարակյաց և թանկարժեք բովանդակությունից։
- Փոխանցեք գիտելիքները մեկ ոլորտից մյուսը։ Եթե խորհուրդների համակարգը ունի տեքստային հոդվածների համար մարզված մոդելներ, և մենք դրան ավելացնում ենք տեսանյութեր, կարող ենք վերօգտագործել առկա մոդելները, որպեսզի նոր տեսակի բովանդակությունը ավելի լավ դասակարգվի։
Ես ձեզ կասեմ, թե ինչպես ենք լուծել այս խնդիրները։
Թեկնածուների ընտրություն
Ինչպե՞ս կարող ենք մի քանի միլիվայրկյանում հազարավոր անգամներով կրճատել քննարկվող փաստաթղթերի քանակը՝ գործնականում առանց որևէ ազդեցության դասակարգման որակի վրա։
Ենթադրենք, որ մենք մարզել ենք բազմաթիվ մեքենայական ուսուցման մոդելներ, ստեղծել դրանց հիման վրա գործառույթներ և մարզել ենք մեկ այլ մոդել, որը դասակարգում է փաստաթղթերը օգտատիրոջ համար: Ամեն ինչ լավ կլիներ, բայց մենք չենք կարող պարզապես հաշվարկել բոլոր փաստաթղթերի բոլոր գործառույթները իրական ժամանակում, եթե կան միլիոնավոր նման փաստաթղթեր, և առաջարկությունները պետք է կառուցվեն 100-200 մվրկ-ում: Խնդիրն այն է, որ միլիոնավորներից ընտրենք ենթաբազմություն, որը կդասակարգվի օգտատիրոջ համար: Այս փուլը սովորաբար կոչվում է թեկնածուի ընտրություն: Դրա համար կան մի քանի պահանջներ: Նախ, ընտրությունը պետք է տեղի ունենա շատ արագ, որպեսզի որքան հնարավոր է շատ ժամանակ մնա դասակարգման համար: Երկրորդ, դասակարգման համար փաստաթղթերի քանակը զգալիորեն կրճատելով՝ մենք պետք է հնարավորինս լիարժեք պահպանենք այն փաստաթղթերը, որոնք վերաբերում են օգտատիրոջը:
Թեկնածուներ ընտրելու մեր սկզբունքը զարգացել է, և այս պահին մենք հասել ենք բազմափուլ սխեմայի.

Նախ, բոլոր փաստաթղթերը բաժանվում են խմբերի, և յուրաքանչյուր խմբից վերցվում են ամենատարածված փաստաթղթերը: Խմբերը կարող են լինել կայքեր, թեմաներ, կլաստերներ: Յուրաքանչյուր օգտատիրոջ համար, իրենց պատմության հիման վրա, ընտրվում են ամենամոտ խմբերը և դրանցից վերցվում են լավագույն փաստաթղթերը: Մենք նաև օգտագործում ենք kNN ինդեքս՝ իրական ժամանակում օգտատիրոջը ամենամոտ փաստաթղթերը ընտրելու համար: kNN ինդեքս կառուցելու մի քանի մեթոդներ կան, որոնցից մեզ համար ամենաարդյունավետն է. (Հիերարխիկ նավարկելի փոքր աշխարհի գրաֆիկներ): Սա հիերարխիկ մոդել է, որը թույլ է տալիս մեզ գտնել օգտատիրոջ համար N ամենամոտ վեկտորները միլիոնավոր տվյալների բազայից մի քանի միլիվայրկյանների ընթացքում: Մենք նախապես ինդեքսավորում ենք մեր ամբողջ փաստաթղթերի տվյալների բազան անցանց ռեժիմով: Քանի որ ինդեքսների որոնումը բավականին արագ է աշխատում, եթե կան մի քանի ուժեղ ներդրվածքներ, մենք կարող ենք ստեղծել մի քանի ինդեքսներ (մեկ ինդեքս յուրաքանչյուր ներդրման համար) և մուտք գործել դրանցից յուրաքանչյուրին իրական ժամանակում:
Մեզ մնում են տասնյակ հազարավոր փաստաթղթեր յուրաքանչյուր օգտատիրոջ համար։ Սա դեռ շատ է բոլոր հատկանիշները հաշվարկելու համար, ուստի այս փուլում մենք օգտագործում ենք թեթև դասակարգում՝ ծանր դասակարգման թեթև մոդել՝ ավելի քիչ հատկանիշներով։ Խնդիրն այն է, որ կանխատեսենք, թե որ փաստաթղթերը կլինեն ծանր մոդելի գագաթնակետին։ Ամենաբարձր կանխատեսող գործոն ունեցող փաստաթղթերը կօգտագործվեն ծանր մոդելում, այսինքն՝ դասակարգման վերջին փուլում։ Այս մոտեցումը թույլ է տալիս մեզ տասնյակ միլիվայրկյանների ընթացքում կրճատել օգտատիրոջ համար դիտարկվող փաստաթղթերի բազան միլիոններից մինչև հազարավորներ։
ALS քայլը կատարման ընթացքում
Ինչպե՞ս հաշվի առնել օգտատիրոջ կարծիքը սեղմելուց անմիջապես հետո։
Առաջարկությունների կարևոր գործոն է օգտատիրոջ կարծիքին արձագանքելու ժամանակը։ Սա հատկապես կարևոր է նոր օգտատերերի համար. երբ մարդը սկսում է օգտագործել առաջարկությունների համակարգ, նա ստանում է տարբեր թեմաներով փաստաթղթերի ոչ անհատականացված հոսք։ Հենց որ նրանք կատարում են իրենց առաջին սեղմումը, դուք պետք է անմիջապես հաշվի առնեք սա և հարմարվեք նրանց հետաքրքրություններին։ Եթե հաշվարկեք բոլոր գործոնները անցանց, համակարգի արագ արձագանքը անհնար կլինի ուշացման պատճառով։ Այսպիսով, դուք պետք է մշակեք օգտատիրոջ գործողությունները իրական ժամանակում։ Այս նպատակով մենք օգտագործում ենք ALS քայլը գործարկման ժամանակ՝ օգտատիրոջ վեկտորային ներկայացում կառուցելու համար։
Ենթադրենք, որ մենք ունենք բոլոր փաստաթղթերի վեկտորային ներկայացում: Օրինակ, մենք կարող ենք կառուցել ներդրված ֆայլեր օֆլայն ռեժիմով՝ հոդվածի տեքստի հիման վրա՝ օգտագործելով ELMo, BERT կամ այլ մեքենայական ուսուցման մոդելներ: Ինչպե՞ս կարող ենք ստանալ նույն տարածքում գտնվող օգտատերերի վեկտորային ներկայացում՝ հիմնվելով համակարգում նրանց փոխազդեցությունների վրա:
Օգտատեր-փաստաթուղթ մատրիցի ձևավորման և քայքայման ընդհանուր սկզբունքըԵնթադրենք, որ ունենք m օգտատեր և n փաստաթուղթ։ Որոշ օգտատերերի համար հայտնի է նրանց վերաբերմունքը որոշ փաստաթղթերի նկատմամբ։ Այնուհետև այս տեղեկատվությունը կարող է ներկայացվել որպես mxn մատրից. տողերը համապատասխանում են օգտատերերին, իսկ սյուները՝ փաստաթղթերին։ Քանի որ անձը չի տեսել փաստաթղթերի մեծ մասը, մատրիցի բջիջների մեծ մասը կմնա դատարկ, իսկ մյուսները կլրացվեն։ Մատրիցում յուրաքանչյուր իրադարձության համար (հավանել, չհավանել, սեղմել) տրամադրվում է որոշակի արժեք, բայց եկեք դիտարկենք պարզեցված մոդել, որտեղ «հավանել» -ը համապատասխանում է 1-ի, իսկ «չհավանել» -ը՝ 1-ի։
Եկեք մատրիցը բաժանենք երկու մասի՝ P (mxd) և Q (dxn), որտեղ d-ն վեկտորային ներկայացման չափայնությունն է (սովորաբար փոքր թիվ): Այնուհետև յուրաքանչյուր օբյեկտ կհամապատասխանի d-չափանի վեկտորի (օգտատերը P մատրիցում տող է, փաստաթուղթը՝ Q մատրիցում սյուն): Այս վեկտորները կլինեն համապատասխան օբյեկտների ներդրվածությունները: Կանխատեսելու համար, թե արդյոք օգտատիրոջը դուր կգա փաստաթուղթը, կարող եք պարզապես բազմապատկել դրանց ներդրվածությունները:

Մատրիցը քայքայելու հնարավոր եղանակներից մեկը ALS-ն է (Փոխարինող նվազագույն քառակուսիներ): Մենք կօպտիմալացնենք հետևյալ կորստի ֆունկցիան.

Այստեղ rui-ն u օգտատիրոջ փոխազդեցությունն է i փաստաթղթի հետ, qi-ն i փաստաթղթի վեկտորն է, pu-ն u օգտատիրոջ վեկտորն է։
Այնուհետև միջին քառակուսի սխալի տեսանկյունից օպտիմալ օգտատիրոջ վեկտորը (ֆիքսված փաստաթղթային վեկտորներով) անալիտիկորեն որոշվում է՝ լուծելով համապատասխան գծային ռեգրեսիան։
Սա կոչվում է «ALS քայլ»։ Եվ ALS ալգորիթմն ինքնին բաղկացած է նրանից, որ մենք հերթով շտկում ենք մատրիցներից մեկը (օգտատերեր և հոդվածներ) և թարմացնում մյուսը՝ գտնելով օպտիմալ լուծումը։
Բարեբախտաբար, օգտատիրոջ ներդրման որոնումը բավականին արագ գործողություն է, որը կարող է կատարվել վեկտորային հրահանգների միջոցով՝ գործարկման ժամանակ։ Այս հնարքը թույլ է տալիս մեզ անմիջապես հաշվի առնել օգտատիրոջ արձագանքը դասակարգման ժամանակ։ Նույն ներդրումը կարող է օգտագործվել kNN ինդեքսում՝ թեկնածուների ընտրությունը բարելավելու համար։
Բաշխված համագործակցային ֆիլտրացում
Ինչպե՞ս անել աճողական բաշխված մատրիցային ֆակտորիզացիա և արագ գտնել նոր հոդվածների վեկտորային ներկայացումը։
Բովանդակությունը առաջարկությունների համար ազդանշանների միակ աղբյուրը չէ: Մեկ այլ կարևոր աղբյուր է համագործակցային տեղեկատվությունը: Լավ դասակարգման հատկանիշներ ավանդաբար կարելի է ստանալ օգտատեր-փաստաթուղթ մատրիցը վերլուծելով: Սակայն, երբ մենք փորձեցինք նման վերլուծություն անել, մենք հանդիպեցինք հետևյալ խնդիրներին.
1. Մենք ունենք միլիոնավոր փաստաթղթեր և տասնյակ միլիոնավոր օգտատերեր։ Մատրիցը ամբողջությամբ չի տեղավորվում մեկ մեքենայի վրա, և քայքայումը շատ երկար ժամանակ կպահանջի։
2. Համակարգի բովանդակության մեծ մասն ունի կարճ կյանքի տևողություն. փաստաթղթերը մնում են արդիական միայն մի քանի ժամ։ Հետևաբար, անհրաժեշտ է հնարավորինս արագ կառուցել դրանց վեկտորային ներկայացումը։
3. Եթե փաստաթղթի հրապարակումից անմիջապես հետո կառուցեք վերլուծական տարբերակը, այն ժամանակ չի ունենա բավարար թվով օգտատերերի կողմից գնահատվելու։ Հետևաբար, դրա վեկտորային ներկայացումը, ամենայն հավանականությամբ, շատ լավ չի լինի։
4. Եթե օգտատիրոջը ինչ-որ բան դուր է եկել կամ դուր չի եկել, մենք չենք կարողանա դա անմիջապես հաշվի առնել վերլուծության ժամանակ։
Վերոնշյալ խնդիրները լուծելու համար մենք իրականացրեցինք օգտատեր-փաստաթուղթ մատրիցի բաշխված վերլուծում՝ հաճախակի աստիճանական թարմացումներով։ Ինչպե՞ս է այն ճիշտ աշխատում։
Ենթադրենք, որ մենք ունենք N մեքենաների կլաստեր (N-ը հարյուրավոր է) և մենք ուզում ենք դրանց վրա կատարել մատրիցայի բաշխված վերլուծում, որը չի տեղավորվում որևէ մեքենայի վրա: Հարցն այն է, թե ինչպե՞ս իրականացնել այս վերլուծումը, որպեսզի մի կողմից յուրաքանչյուր մեքենա ունենա բավարար տվյալներ, իսկ մյուս կողմից՝ հաշվարկները լինեն անկախ:

Մենք կօգտագործենք վերը նկարագրված ALS քայքայման ալգորիթմը։ Եկեք քննարկենք, թե ինչպես կատարել ALS-ի մեկ քայլը բաշխված եղանակով՝ մյուս քայլերը նման կլինեն։ Ենթադրենք, որ մենք ունենք ֆիքսված փաստաթղթի մատրից և ցանկանում ենք կառուցել օգտատիրոջ մատրից։ Դա անելու համար մենք այն կբաժանենք N մասերի՝ տողերով, յուրաքանչյուր մասը կպարունակի մոտավորապես նույն քանակությամբ տողեր։ Մենք կուղարկենք համապատասխան տողերի ոչ դատարկ բջիջները յուրաքանչյուր մեքենային, ինչպես նաև փաստաթղթի ներդրման մատրիցը (ամբողջությամբ)։ Քանի որ այն շատ մեծ չէ, իսկ օգտատեր-փաստաթղթի մատրիցը սովորաբար շատ նոսր է, այս տվյալները կտեղավորվեն սովորական մեքենայի վրա։
Այս հնարքը կարող է կրկնվել մի քանի դարաշրջան, մինչև մոդելը զուգամիտվի՝ հերթագայաբար փոխելով ֆիքսված մատրիցը։ Սակայն նույնիսկ այդ դեպքում մատրիցի քայքայումը կարող է տևել մի քանի ժամ։ Եվ սա չի լուծում նոր փաստաթղթերի ներդրման արագ ստացման և այն ներդրման թարմացման խնդիրը, որոնց մասին մոդելի կառուցման ժամանակ քիչ տեղեկատվություն կար։
Մեզ օգնեց մոդելի արագ աստիճանական թարմացումների իրականացումը։ Ենթադրենք, որ մենք ունենք արդեն մարզված մոդել։ Մարզումից հետո հայտնվել են նոր հոդվածներ, որոնց հետ մեր օգտատերերը փոխազդել են, ինչպես նաև հոդվածներ, որոնք քիչ փոխազդեցություններ են ունեցել մարզման ընթացքում։ Նման հոդվածների համար ներդրված տվյալներ արագ ստանալու համար մենք օգտագործում ենք մոդելի առաջին մեծ մարզման ընթացքում ստացված օգտատիրոջ ներդրված տվյալները և մեկ ALS քայլով հաշվարկում ենք փաստաթղթի մատրիցը ֆիքսված օգտատիրոջ մատրիցով։ Սա մեզ թույլ է տալիս բավականին արագ ստանալ ներդրված տվյալներ՝ փաստաթղթի հրապարակումից մի քանի րոպե անց՝ և հաճախակի թարմացնել նոր փաստաթղթերի ներդրված տվյալները։
Որպեսզի համոզվենք, որ մարդկային գործողությունները հաշվի են առնվում առաջարկությունների համար, մենք չենք օգտագործում օգտատիրոջ ներդրված տվյալները, որոնք ստացվել են աշխատանքի ընթացքում անցանց ռեժիմում: Դրա փոխարեն մենք կատարում ենք ALS քայլ և ստանում ենք ընթացիկ օգտատիրոջ վեկտորը:
Տեղափոխում մեկ այլ դոմեյնային տարածք
Ինչպե՞ս օգտագործել տեքստային հոդվածների վերաբերյալ օգտատերերի կարծիքը՝ տեսանյութի վեկտորային ներկայացում կառուցելու համար։
Սկզբում մենք խորհուրդ էինք տալիս միայն տեքստային հոդվածներ, ուստի մեր ալգորիթմներից շատերը հարմարեցված են այս տեսակի բովանդակությանը: Սակայն, երբ ավելացնում էինք տարբեր տեսակի բովանդակություն, մենք բախվեցինք մոդելները հարմարեցնելու անհրաժեշտության հետ: Ինչպե՞ս լուծեցինք այս խնդիրը՝ օգտագործելով տեսանյութի օրինակը: Մեկ տարբերակ է բոլոր մոդելները զրոյից վերապատրաստելը: Սակայն դա երկար ժամանակ է պահանջում, և որոշ ալգորիթմներ պահանջում են վերապատրաստման նմուշի ծավալ, որը դեռևս հասանելի չէ նոր տեսակի բովանդակության համար անհրաժեշտ քանակությամբ՝ ծառայության վրա դրա գործունեության առաջին պահերին:
Մենք գնացինք մյուս ճանապարհով և վերօգտագործեցինք տեքստային մոդելներ տեսանյութերի համար: Նույն ALS հնարքը մեզ օգնեց ստեղծել տեսանյութերի վեկտորային ներկայացումներ: Մենք վերցրեցինք օգտատերերի վեկտորային ներկայացումը տեքստային հոդվածների հիման վրա և կատարեցինք ALS քայլ՝ օգտագործելով տեսանյութերի դիտումների մասին տեղեկատվությունը: Այս կերպ մենք հեշտությամբ ստացանք տեսանյութերի վեկտորային ներկայացումը: Եվ կատարման ժամանակ մենք պարզապես հաշվարկում ենք տեքստային հոդվածներից ստացված օգտատիրոջ վեկտորի և տեսանյութի վեկտորի միջև եղած մոտիկությունը:
Ամփոփում
Իրական ժամանակի առաջարկությունների համակարգի միջուկի մշակումը ներառում է բազմաթիվ մարտահրավերներ: Անհրաժեշտ է արագ մշակել տվյալները և կիրառել մեքենայական ուսուցման մեթոդներ՝ այդ տվյալները արդյունավետ օգտագործելու համար, կառուցել բարդ բաշխված համակարգեր, որոնք կարող են մշակել օգտատիրոջ ազդանշանները և նոր բովանդակության միավորները նվազագույն ժամանակում, և բազմաթիվ այլ առաջադրանքներ:
Ներկայիս համակարգում, որի կառուցվածքը ես նկարագրեցի, օգտատիրոջ համար առաջարկությունների որակը աճում է նրա ակտիվության և ծառայությունում գտնվելու տևողության հետ մեկտեղ։ Բայց, իհարկե, այստեղ է կայանում գլխավոր դժվարությունը. համակարգի համար դժվար է անմիջապես հասկանալ այն անձի հետաքրքրությունները, ով քիչ է շփվում բովանդակության հետ։ Նոր օգտատերերի համար առաջարկությունների բարելավումը մեր հիմնական խնդիրն է։ Մենք կշարունակենք օպտիմալացնել ալգորիթմները, որպեսզի համապատասխան բովանդակությունը ավելի արագ հայտնվի անձի լրահոսում, և անտեղի բովանդակությունը չցուցադրվի։
Source: www.habr.com
