Այստեղ բովանդակության մեծ մասը Քրիսի բլոգից է: Ես խտացրել եմ այն ​​և փոքր ադապտացիաներ եմ արել։

վարկեր՝ Քրիս ՄաքՔորմիկ

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-ի հեղինակներն անդրադարձել են այս խնդիրներին իրենց երկրորդ թղթում:

Այս երկրորդ փաստաթղթում կան երեք նորամուծություններ.

  1. Ընդհանուր բառազույգերը կամ արտահայտությունները որպես առանձին «բառեր» իրենց մոդելում:
  2. Հաճախակի բառերի ենթամեկուսիչ՝ վերապատրաստման օրինակների քանակը նվազեցնելու համար:
  3. Օպտիմալացման նպատակը փոփոխելով «Բացասական նմուշառում» տեխնիկայով, որը ստիպում է յուրաքանչյուր ուսումնական նմուշ թարմացնել մոդելի կշիռների միայն փոքր տոկոսը:

Հարկ է նշել, որ հաճախակի բառերի ենթամեկուսիչները և բացասական նմուշառման կիրառումը ոչ միայն նվազեցրեց ուսուցման գործընթացի հաշվարկային բեռը, այլև բարելավեց դրանց արդյունքում ստացված բառային վեկտորների որակը:

Ենթ նմուշառում:

Կան երկու «խնդիրներ» ընդհանուր բառերով, ինչպիսիք են «the»-ը.

  1. Բառային զույգերին նայելիս («աղվես», «ա») մեզ շատ բան չի ասում «աղվես» բառի իմաստի մասին: «the»-ը հայտնվում է գրեթե յուրաքանչյուր բառի համատեքստում:
  2. Մենք կունենանք («the», …) շատ ավելի շատ նմուշներ, քան մեզ անհրաժեշտ է «the»-ի լավ վեկտոր սովորելու համար:

Word2Vec-ն իրականացնում է «ենթանմուշավորման» սխեմա՝ դա լուծելու համար: Յուրաքանչյուր բառի համար, որը մենք հանդիպում ենք մեր ուսումնական տեքստում, հնարավորություն կա, որ մենք այն արդյունավետորեն կջնջենք տեքստից: Բառը կտրելու հավանականությունը կապված է բառի հաճախականության հետ:

Եթե ​​մենք ունենք 10 պատուհանի չափ, և մեր տեքստից հեռացնում ենք «the»-ի հատուկ օրինակը.

  1. Մինչ մենք մարզվում ենք մնացած բառերի վրա, «the»-ը չի հայտնվի դրանց համատեքստի պատուհաններից որևէ մեկում:
  2. Մենք կունենանք 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/