Ինչպես ենք մենք աշխատում առաջարկությունների ընտրության որակի և արագության վրա

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

Ինչպես ենք մենք աշխատում առաջարկությունների ընտրության որակի և արագության վրա

Մեր առաջարկությունների բազան պարունակում է տարբեր ձևաչափերի միլիոնավոր փաստաթղթեր՝ տեքստային հոդվածներ, որոնք ստեղծված են մեր հարթակում և վերցված արտաքին կայքերից, տեսանյութերից, պատմվածքներից և կարճ հաղորդագրություններից: Նման ծառայության զարգացումը կապված է մեծ թվով տեխնիկական մարտահրավերների հետ։ Ահա դրանցից մի քանիսը.

  • Բաժանեք հաշվողական առաջադրանքները. կատարեք բոլոր ծանր գործողությունները անցանց և իրական ժամանակում կատարեք միայն մոդելների արագ կիրառում, որպեսզի պատասխանատու լինեք 100-200 ms-ի համար:
  • Արագորեն հաշվի առեք օգտվողի գործողությունները: Դա անելու համար անհրաժեշտ է, որ բոլոր իրադարձությունները ակնթարթորեն հանձնվեն առաջարկողին և ազդեն մոդելների արդյունքների վրա:
  • Ստեղծեք լրահոսը այնպես, որ նոր օգտվողների համար այն արագ հարմարվի նրանց վարքագծին: Մարդիկ, ովքեր նոր են միացել համակարգին, պետք է զգան, որ իրենց կարծիքն ազդում է առաջարկությունների վրա:
  • Արագ հասկացեք, թե ում խորհուրդ տալ նոր հոդված:
  • Արագ արձագանքեք նոր բովանդակության անընդհատ առաջացմանը: Ամեն օր տասնյակ հազարավոր հոդվածներ են տպագրվում, որոնցից շատերն ունեն սահմանափակ ժամկետ (ասենք՝ լուրեր): Հենց դա է նրանց տարբերում ֆիլմերից, երաժշտությունից և ստեղծագործելու համար երկարակյաց և թանկարժեք այլ բովանդակությունից:
  • Գիտելիքների փոխանցում մի տիրույթից մյուսը: Եթե ​​առաջարկությունների համակարգը տեքստային հոդվածների համար պատրաստված մոդելներ ունի, և մենք դրան տեսանյութ ենք ավելացնում, մենք կարող ենք նորից օգտագործել գոյություն ունեցող մոդելները, որպեսզի բովանդակության նոր տեսակը ավելի լավ դասակարգվի:

Ես ձեզ կասեմ, թե ինչպես լուծեցինք այս խնդիրները։

Թեկնածուների ընտրություն

Ինչպե՞ս մի քանի միլիվայրկյանում կրճատել քննարկվող փաստաթղթերի թիվը հազարավոր անգամներով, առանց վարկանիշի որակի գրեթե վատթարացման:

Ենթադրենք, որ մենք վերապատրաստել ենք բազմաթիվ ML մոդելներ, ստեղծել ենք դրանց հիման վրա գործառույթներ և վերապատրաստել ենք մեկ այլ մոդել, որը դասակարգում է փաստաթղթերը օգտագործողի համար: Ամեն ինչ լավ կլիներ, բայց դուք չեք կարող պարզապես իրական ժամանակում վերցնել և հաշվարկել բոլոր նշանները բոլոր փաստաթղթերի համար, եթե կան միլիոնավոր այդ փաստաթղթեր, և առաջարկությունները պետք է պատրաստվեն 100-200 ms-ում: Խնդիրը միլիոններից որոշակի ենթաբազմություն ընտրելն է, որը դասակարգվելու է օգտագործողի համար: Այս փուլը սովորաբար կոչվում է թեկնածուի ընտրություն: Դրա համար կան մի քանի պահանջներ. Նախ, ընտրությունը պետք է տեղի ունենա շատ արագ, որպեսզի հնարավորինս շատ ժամանակ մնա հենց վարկանիշին։ Երկրորդ, վարկանիշավորման համար փաստաթղթերի քանակը զգալիորեն կրճատելով, մենք պետք է հնարավորինս ամբողջական պահպանենք օգտագործողին առնչվող փաստաթղթերը:

Թեկնածուների ընտրության մեր սկզբունքը զարգացել է, և այս պահին մենք հասել ենք բազմափուլ սխեմայի.

Ինչպես ենք մենք աշխատում առաջարկությունների ընտրության որակի և արագության վրա

Նախ, բոլոր փաստաթղթերը բաժանվում են խմբերի, և յուրաքանչյուր խմբից վերցվում են ամենատարածված փաստաթղթերը: Խմբերը կարող են լինել կայքեր, թեմաներ, կլաստերներ: Յուրաքանչյուր օգտատիրոջ համար, իր պատմության հիման վրա, ընտրվում են իրեն ամենամոտ խմբերը, որոնցից վերցվում են լավագույն փաստաթղթերը։ Մենք նաև օգտագործում ենք kNN ինդեքսը՝ իրական ժամանակում օգտագործողին առավել մոտ գտնվող փաստաթղթեր ընտրելու համար: KNN ինդեքսի կառուցման մի քանի մեթոդներ կան, մերն ամենալավն է աշխատել HNSW (Հիերարխիկ նավարկելի փոքր աշխարհի գրաֆիկներ): Սա հիերարխիկ մոդել է, որը թույլ է տալիս մի քանի միլիվայրկյանում միլիոնավոր տվյալների բազայից գտնել օգտվողի համար N ամենամոտ վեկտորները: Մենք նախ ինդեքսավորում ենք մեր ամբողջ փաստաթղթերի բազան անցանց: Քանի որ ինդեքսում որոնումը բավականին արագ է աշխատում, եթե կան մի քանի ուժեղ ներկառուցումներ, կարող եք ստեղծել մի քանի ինդեքս (յուրաքանչյուր ներդրման համար մեկ ինդեքս) և իրական ժամանակում մուտք գործել դրանցից յուրաքանչյուրին:

Մենք դեռ ունենք տասնյակ հազարավոր փաստաթղթեր յուրաքանչյուր օգտագործողի համար: Սա դեռ շատ բան է բոլոր հատկանիշները հաշվելու համար, ուստի այս փուլում մենք օգտագործում ենք թեթև դասակարգում` թեթև ծանր վարկանիշային մոդել՝ ավելի քիչ հատկանիշներով: Խնդիրն է կանխատեսել, թե ծանր մոդելը ինչ փաստաթղթեր կունենա վերևում: Ամենաբարձր գուշակող փաստաթղթերը կօգտագործվեն ծանր մոդելում, այսինքն՝ վարկանիշի վերջին փուլում։ Այս մոտեցումը թույլ է տալիս օգտատիրոջ համար դիտարկվող փաստաթղթերի տվյալների բազան տասնյակ միլիվայրկյանների ընթացքում կրճատել միլիոններից մինչև հազարավոր:

ALS քայլը գործարկման ժամանակ

Ինչպե՞ս հաշվի առնել օգտվողի կարծիքը սեղմելուց անմիջապես հետո:

Առաջարկությունների մեջ կարևոր գործոն է օգտատերերի արձագանքներին արձագանքելու ժամանակը: Սա հատկապես կարևոր է նոր օգտատերերի համար. երբ մարդը նոր է սկսում օգտագործել առաջարկությունների համակարգը, նա ստանում է տարբեր թեմաների փաստաթղթերի ոչ անհատականացված հոսք: Հենց նա կատարի առաջին սեղմումը, դուք պետք է անմիջապես հաշվի առնեք դա և հարմարվեք նրա հետաքրքրություններին: Եթե ​​բոլոր գործոնները հաշվում եք անցանց, ապա ուշացման պատճառով համակարգի արագ արձագանքն անհնարին կդառնա: Այսպիսով, անհրաժեշտ է իրական ժամանակում մշակել օգտվողի գործողությունները: Այս նպատակների համար մենք օգտագործում ենք ALS քայլը գործարկման ժամանակ՝ օգտագործողի վեկտորային ներկայացում ստեղծելու համար:

Ենթադրենք, որ մենք ունենք վեկտորային ներկայացում բոլոր փաստաթղթերի համար: Օրինակ՝ մենք կարող ենք անցանց ներկառուցումներ ստեղծել՝ հիմնվելով հոդվածի տեքստի վրա՝ օգտագործելով ELMo, BERT կամ մեքենայական ուսուցման այլ մոդելներ: Ինչպե՞ս կարող ենք ձեռք բերել օգտատերերի վեկտորային ներկայացում միևնույն տարածքում՝ հիմնվելով համակարգում նրանց փոխազդեցությունների վրա:

Օգտագործող-փաստաթղթի մատրիցայի ձևավորման և տարրալուծման ընդհանուր սկզբունքըԵկեք ունենանք m օգտվող և n փաստաթուղթ: Որոշ օգտատերերի համար հայտնի է նրանց կապը որոշակի փաստաթղթերի հետ: Այնուհետև այս տեղեկատվությունը կարող է ներկայացվել որպես m x n մատրիցա. տողերը համապատասխանում են օգտագործողներին, իսկ սյունակները՝ փաստաթղթերին: Քանի որ անձը չի տեսել փաստաթղթերի մեծ մասը, մատրիցային բջիջների մեծ մասը կմնա դատարկ, մինչդեռ մյուսները կլցվեն: Յուրաքանչյուր իրադարձության համար (հավանել, չհավանել, սեղմել) որոշ արժեք է տրամադրվում մատրիցայում, բայց եկեք դիտարկենք պարզեցված մոդելը, որտեղ հավանումը համապատասխանում է 1-ին, իսկ չհավանելը համապատասխանում է -1-ին:

Եկեք քայքայենք մատրիցը երկուսի՝ P (m x d) և Q (d x n), որտեղ 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 քայլ՝ օգտագործելով տեսանյութի դիտման տեղեկատվությունը: Այսպիսով, մենք հեշտությամբ ստացանք տեսանյութի վեկտորային ներկայացում: Իսկ գործարկման ժամանակ մենք պարզապես հաշվում ենք տեքստային հոդվածներից ստացված օգտատիրոջ վեկտորի և վիդեո վեկտորի միջև հարևանությունը:

Ամփոփում

Իրական ժամանակում առաջարկությունների համակարգի առանցքը մշակելը ներառում է բազմաթիվ մարտահրավերներ: Դուք պետք է արագ մշակեք տվյալները և կիրառեք ML մեթոդներ՝ այս տվյալները արդյունավետ օգտագործելու համար. կառուցել բարդ բաշխված համակարգեր, որոնք կարող են նվազագույն ժամանակում մշակել օգտվողի ազդանշանները և բովանդակության նոր միավորները. և շատ այլ առաջադրանքներ:

Ընթացիկ համակարգում, որի դիզայնը ես նկարագրեցի, օգտվողի համար առաջարկությունների որակը աճում է նրա գործունեության և ծառայության մեջ գտնվելու տևողության հետ մեկտեղ: Բայց, իհարկե, այստեղ է հիմնական դժվարությունը. համակարգի համար դժվար է անմիջապես հասկանալ բովանդակության հետ քիչ փոխազդեցություն ունեցող մարդու շահերը: Նոր օգտատերերի համար առաջարկությունների կատարելագործումը մեր հիմնական նպատակն է: Մենք կշարունակենք օպտիմիզացնել ալգորիթմները, որպեսզի անձին առնչվող բովանդակությունն ավելի արագ հայտնվի նրա հոսքում, և չցուցադրվի անհամապատասխան բովանդակություն:

Source: www.habr.com

Добавить комментарий