Այստեղ բովանդակության մեծ մասը Քրիսի բլոգից է: Ես խտացրել եմ այն և փոքր ադապտացիաներ եմ արել։
վարկեր՝ Քրիս ՄաքՔորմիկ
http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/
http://mccormickml.com/2017/01/11/word2vec-tutorial-part-2-negative-sampling/
Ալգորիթմը գոյություն ունի երկու տարբերակով՝ CBOW և Skip-Gram: Հաշվի առնելով նախադասությունների մի շարք (որը նաև կոչվում է կորպուս), մոդելը պտտվում է յուրաքանչյուր նախադասության բառերի վրա և կամ փորձում է օգտագործել ներկայիս բառը` կանխատեսելու իր հարևանները (դրա համատեքստը), որի դեպքում մեթոդը հետևյալն է. կոչվում է «Skip-Gram», կամ այն օգտագործում է այս համատեքստերից յուրաքանչյուրը ընթացիկ բառը կանխատեսելու համար, որի դեպքում մեթոդը կոչվում է «Continuous Bag Of Word» (CBOW): Յուրաքանչյուր համատեքստում բառերի քանակի սահմանափակումը որոշվում է «պատուհանի չափը» կոչվող պարամետրով:
Ինտուիցիա
Skip-gram նեյրոնային ցանցի մոդելն իրականում զարմանալիորեն պարզ է իր ամենահիմնական ձևով: Վարժեցրեք պարզ նեյրոնային ցանցը մեկ թաքնված շերտով՝ որոշակի առաջադրանք կատարելու համար, բայց այդ դեպքում մենք իրականում չենք օգտագործի այդ նեյրոնային ցանցը այն առաջադրանքի համար, որի վրա մենք մարզել ենք այն: Փոխարենը, նպատակն իրականում պարզապես թաքնված շերտի կշիռներն իմանալն է. մենք կտեսնենք, որ այս կշիռները իրականում «բառերի վեկտորներն» են, որոնք մենք փորձում ենք սովորել:
Մենք պատրաստվում ենք նեյրոնային ցանցին վարժեցնել հետևյալն անելու համար. Նախադասության մեջտեղում որոշակի բառ տալով (մուտքագրված բառը), նայեք մոտակայքում գտնվող բառերին և ընտրեք մեկը պատահականորեն: Ցանցը պատրաստվում է պատմել մեզ մեր բառապաշարի յուրաքանչյուր բառի համար մեր ընտրած «մոտակա բառը» լինելու հավանականությունը:
Արդյունքների հավանականությունները կապված են այն բանի հետ, թե որքան հավանական է գտնել բառապաշարի յուրաքանչյուր բառ մեր մուտքային բառի մոտ: Օրինակ, եթե դուք մարզված ցանցին տվել եք մուտքագրված «Սովետական» բառը, ապա ելքի հավանականությունը շատ ավելի մեծ կլինի «Միություն» և «Ռուսաստան» բառերի համար, քան «ձմերուկ» և «կենգուրու» անկապ բառերի համար:
Մենք կսովորեցնենք նեյրոնային ցանցին դա անել՝ կերակրելով նրան մեր ուսումնական փաստաթղթերում հայտնաբերված բառերի զույգերով: Ստորև բերված օրինակը ցույց է տալիս վարժեցման որոշ նմուշներ (բառերի զույգեր), որոնք մենք կվերցնեինք «Արագ շագանակագույն աղվեսը ցատկում է ծույլ շան վրայով» նախադասությունից։ Ես օգտագործել եմ 2 փոքր պատուհանի չափը հենց օրինակի համար: Կապույտով ընդգծված բառը մուտքային բառն է:
Մենք կներկայացնենք մուտքային բառը, ինչպիսին է «մրջյունները», որպես մեկ տաք վեկտոր: Այս վեկտորը կունենա 10000 բաղադրիչ (մեկը մեր բառապաշարի յուրաքանչյուր բառի համար), և մենք «1» կտեղադրենք «մրջյուններ» բառին համապատասխանող դիրքում, իսկ մնացած բոլոր դիրքերում՝ 0:
Ցանցի ելքը մեկ վեկտոր է (նաև 10000 բաղադրիչով), որը պարունակում է մեր բառապաշարի յուրաքանչյուր բառի հավանականությունը, որ մոտակայքում պատահականորեն ընտրված բառը հենց այդ բառային բառն է:
Ահա մեր նեյրոնային ցանցի ճարտարապետությունը:
Թաքնված շերտի նեյրոնների վրա ակտիվացման ֆունկցիա չկա, բայց ելքային նեյրոններն օգտագործում են softmax:
Մեր օրինակի համար մենք պատրաստվում ենք ասել, որ մենք սովորում ենք բառերի վեկտորներ 300 հատկանիշներով: Այսպիսով, թաքնված շերտը կներկայացվի քաշային մատրիցով՝ 10000 տողերով (մեկը մեր բառապաշարի յուրաքանչյուր բառի համար) և 300 սյունակով (մեկը յուրաքանչյուր թաքնված նեյրոնի համար):
300 գործառույթն այն է, ինչ Google-ն օգտագործել է իր հրապարակված մոդելում, որը վերապատրաստվել է Google-ի նորությունների տվյալների բազայի վրա (կարող եք ներբեռնել այն այստեղից): Հատկությունների թիվը հիպեր պարամետր է, որը դուք պարզապես պետք է համապատասխանեցնեք ձեր հավելվածին (այսինքն՝ փորձեք տարբեր արժեքներ և տեսեք, թե որն է լավագույն արդյունքները):
Եթե նայեք այս քաշային մատրիցայի տողերին, ապա սրանք իրականում կլինեն մեր բառերի վեկտորները:
Այսպիսով, այս ամենի վերջնական նպատակն իրականում պարզապես սովորել է այս թաքնված շերտի քաշի մատրիցը. ելքային շերտը, որը մենք պարզապես կշպրտենք, երբ ավարտենք: «Մրջյունների» 1 x 300
բառի վեկտորն այնուհետև սնվում է ելքային շերտին: Ելքային շերտը softmax ռեգրեսիոն դասակարգիչ է:
Մասնավորապես, յուրաքանչյուր ելքային նեյրոն ունի քաշի վեկտոր, որը բազմապատկվում է թաքնված շերտից բառի վեկտորի դեմ, այնուհետև արդյունքի վրա կիրառում է exp(x)
ֆունկցիան: Վերջապես, որպեսզի ելքերը գումարվեն մինչև 1, մենք այս արդյունքը բաժանում ենք բոլոր 10000 ելքային հանգույցների արդյունքների գումարի վրա:
Ահա «մեքենա» բառի համար ելքային նեյրոնի ելքը հաշվարկելու նկարազարդումը:
Եթե երկու տարբեր բառեր ունեն շատ նման «համատեքստեր» (այսինքն, թե ինչ բառեր կարող են հայտնվել դրանց շուրջ), ապա մեր մոդելը պետք է շատ նման արդյունքներ տա այս երկու բառերի համար: Եվ ցանցի համար այս երկու բառերի համատեքստի համանման կանխատեսումներ արտադրելու եղանակներից մեկն այն է, որ բառերի վեկտորները նման են: Այսպիսով, եթե երկու բառեր ունեն նմանատիպ ենթատեքստ, ապա մեր ցանցը մոտիվացված է սովորելու այս երկու բառերի համար նմանատիպ բառերի վեկտորներ: Ta da!
Իսկ ի՞նչ է նշանակում, որ երկու բառ ունեն նմանատիպ համատեքստեր: Կարծում եմ, դուք կարող եք ակնկալել, որ «խելացի» և «խելացի» հոմանիշները շատ նման ենթատեքստ կունենան: Կամ, որ փոխկապակցված բառերը, ինչպիսիք են «շարժիչը» և «փոխանցումը», հավանաբար կունենան նաև նմանատիպ ենթատեքստ:
Սա կարող է նաև կարգավորել բխում ձեզ համար. ցանցը, հավանաբար, կսովորի նմանատիպ բառերի վեկտորներ «մրջյուն» և «մրջյուն» բառերի համար, քանի որ դրանք պետք է ունենան նմանատիպ համատեքստեր:
Մեզ անհրաժեշտ են մի քանի լրացուցիչ փոփոխություններ հիմնական skip-gram մոդելի համար, որոնք կարևոր են այն իրականում հնարավոր դարձնելու համար: Այս մեծ նեյրոնային ցանցի վրա գրադիենտ իջնելը դանդաղ է լինելու: Եվ ամեն ինչ ավելի վատթարացնելու համար, ձեզ անհրաժեշտ է հսկայական քանակությամբ մարզումների տվյալներ, որպեսզի կարգավորեք այդքան կշիռները և խուսափեք ավելորդ տեղակայումից: միլիոնավոր կշիռներ անգամ միլիարդավոր մարզումների նմուշներ նշանակում է, որ այս մոդելի մարզումը գազան է լինելու: Word2Vec-ի հեղինակներն անդրադարձել են այս խնդիրներին իրենց երկրորդ թղթում:
Այս երկրորդ փաստաթղթում կան երեք նորամուծություններ.
- Ընդհանուր բառազույգերը կամ արտահայտությունները որպես առանձին «բառեր» իրենց մոդելում:
- Հաճախակի բառերի ենթամեկուսիչ՝ վերապատրաստման օրինակների քանակը նվազեցնելու համար:
- Օպտիմալացման նպատակը փոփոխելով «Բացասական նմուշառում» տեխնիկայով, որը ստիպում է յուրաքանչյուր ուսումնական նմուշ թարմացնել մոդելի կշիռների միայն փոքր տոկոսը:
Հարկ է նշել, որ հաճախակի բառերի ենթամեկուսիչները և բացասական նմուշառման կիրառումը ոչ միայն նվազեցրեց ուսուցման գործընթացի հաշվարկային բեռը, այլև բարելավեց դրանց արդյունքում ստացված բառային վեկտորների որակը:
Ենթ նմուշառում:
Կան երկու «խնդիրներ» ընդհանուր բառերով, ինչպիսիք են «the»-ը.
- Բառային զույգերին նայելիս («աղվես», «ա») մեզ շատ բան չի ասում «աղվես» բառի իմաստի մասին: «the»-ը հայտնվում է գրեթե յուրաքանչյուր բառի համատեքստում:
- Մենք կունենանք («the», …) շատ ավելի շատ նմուշներ, քան մեզ անհրաժեշտ է «the»-ի լավ վեկտոր սովորելու համար:
Word2Vec-ն իրականացնում է «ենթանմուշավորման» սխեմա՝ դա լուծելու համար: Յուրաքանչյուր բառի համար, որը մենք հանդիպում ենք մեր ուսումնական տեքստում, հնարավորություն կա, որ մենք այն արդյունավետորեն կջնջենք տեքստից: Բառը կտրելու հավանականությունը կապված է բառի հաճախականության հետ:
Եթե մենք ունենք 10 պատուհանի չափ, և մեր տեքստից հեռացնում ենք «the»-ի հատուկ օրինակը.
- Մինչ մենք մարզվում ենք մնացած բառերի վրա, «the»-ը չի հայտնվի դրանց համատեքստի պատուհաններից որևէ մեկում:
- Մենք կունենանք 10 ավելի քիչ ուսուցման նմուշներ, որտեղ «the»-ը մուտքային բառն է:
Նկատի ունեցեք, թե ինչպես են այս երկու էֆեկտներն օգնում լուծել վերը նշված երկու խնդիրները:
Բացասական նմուշառում.
Ինչպես մենք քննարկեցինք վերևում, մեր բառային բառապաշարի չափը նշանակում է, որ մեր skip-gram նեյրոնային ցանցն ունի հսկայական թվով կշիռներ, որոնք բոլորը մի փոքր կթարմացվեն մեր միլիարդավոր ուսումնական նմուշներից յուրաքանչյուրի կողմից:
Բացասական նմուշառումն անդրադառնում է դրան՝ յուրաքանչյուր ուսուցման նմուշ փոխելով միայն կշիռների փոքր տոկոսը, այլ ոչ թե բոլորը: Ահա թե ինչպես է այն աշխատում.
Զույգ բառի վրա ցանցը վարժեցնելիս («աղվես», «արագ») հիշեք, որ ցանցի «պիտակը» կամ «ճիշտ ելքը» մեկ տաք վեկտոր է: Այսինքն՝ ելքային նեյրոնի համար, որը համապատասխանում է «արագ»-ին, թողարկի 1, իսկ բոլոր մնացած հազարավոր ելքային նեյրոնների համար թողարկվի 0:
Բացասական ընտրանքով մենք, փոխարենը, պատահականորեն ընտրելու ենք ընդամենը մի փոքր քանակությամբ «բացասական» բառեր (ասենք 5)՝ կշիռները թարմացնելու համար: (Այս համատեքստում «բացասական» բառն այն բառն է, որի համար մենք ցանկանում ենք, որ ցանցը թողարկի 0 համար): Մենք նաև դեռ կթարմացնենք մեր «դրական» բառի կշիռները (որը մեր ներկայիս օրինակում «արագ» բառն է):
Թերթում ասվում է, որ 5-20 բառ ընտրելը լավ է աշխատում ավելի փոքր տվյալների հավաքածուների համար, և դուք կարող եք ազատվել միայն 2-5 բառից մեծ տվյալների հավաքածուների համար:
Հիշեցնենք, որ մեր մոդելի ելքային շերտն ունի 300 x 10,000 քաշի մատրիցա: Այսպիսով, մենք պարզապես կթարմացնենք մեր դրական բառի («արագ») կշիռները, գումարած 5 այլ բառերի կշիռները, որոնք մենք ցանկանում ենք դուրս բերել 0: Դա ընդհանուր առմամբ 6 ելքային նեյրոն է և ընդհանուր քաշի 1800 արժեք: Դա ելքային շերտի 3M կշիռների միայն 0,06%-ն է:
Թաքնված շերտում թարմացվում են միայն մուտքային բառի կշիռները (սա ճիշտ է՝ անկախ նրանից, որ դուք օգտագործում եք բացասական նմուշառում, թե ոչ):
«Բացասական նմուշները» (այսինքն՝ 5 ելքային բառերը, որոնք մենք կսովորեցնենք 0-ի համար) ընտրվում են «միգրամի բաշխման» միջոցով։
Ըստ էության, բառը որպես բացասական նմուշ ընտրելու հավանականությունը կապված է դրա հաճախականության հետ, ընդ որում ավելի հաճախակի բառերն ավելի հավանական է, որ ընտրվեն որպես բացասական նմուշներ:
վարկեր՝ Քրիս ՄաքՔորմիկ
http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/
http://mccormickml.com/2017/01/11/word2vec-tutorial-part-2-negative-sampling/