ბუნებრივი ენის დამუშავება Jupyter ნოუთბუქი · PyTorch

სასწავლო CBoW მოდელი

ეს არის პრაქტიკული ნოუთბუქი. წაიკითხე კოდი და შედეგები აქ, ან გაუშვი ინტერაქტიულად Google Colab-ში ან Jupyter-ში.

ეს ნოუთბუქები არის AI დამწყებთათვის სასწავლო პროგრამა-ის ნაწილი

ამ მაგალითში ჩვენ განვიხილავთ სასწავლო CBoW ენის მოდელს, რომ მივიღოთ საკუთარი Word2Vec ჩაშენებული სივრცე. ჩვენ გამოვიყენებთ AG News მონაცემთა ბაზას, როგორც ტექსტის წყაროს.

იტვირთება…
იტვირთება…

ჯერ ავტვირთოთ ჩვენი მონაცემთა ნაკრები და განვსაზღვროთ ტოკენიზატორი და ლექსიკა. ჩვენ დავაყენებთ vocab_size-ზე 5000-ზე, რათა ცოტა შევზღუდოთ გამოთვლები.

იტვირთება…
იტვირთება…
გამოტანა
Loading dataset...
Building vocab...
იტვირთება…

CBoW მოდელი

CBoW სწავლობს სიტყვის წინასწარმეტყველებას $2N$ მეზობელ სიტყვებზე დაყრდნობით. მაგალითად, როდესაც $N=1$, ჩვენ მივიღებთ შემდეგ წყვილებს წინადადებიდან I like to train networks: (like,I), (I, like), (to, like), (like,to), (train,to), (to, train), (networks, train), (train,networks). აქ, პირველი სიტყვა არის მეზობელი სიტყვა, რომელიც გამოიყენება შეყვანის სახით, ხოლო მეორე სიტყვა არის ის, რასაც ჩვენ ვიწინასწარმეტყველებთ.

შემდეგი სიტყვის პროგნოზირებისთვის ქსელის ასაშენებლად, ჩვენ უნდა მივაწოდოთ მეზობელი სიტყვა შეყვანის სახით და მივიღოთ სიტყვის ნომერი, როგორც გამოსავალი. CBoW ქსელის არქიტექტურა შემდეგია:

  • შეყვანის სიტყვა გადადის ჩაშენების ფენაში. სწორედ ეს ჩაშენებული ფენა იქნება ჩვენი Word2Vec ემბედინგი, ამიტომ ჩვენ განვსაზღვრავთ მას ცალკე, როგორც embedder ცვლადი. ჩვენ გამოვიყენებთ ჩაშენების ზომას = 30 ამ მაგალითში, მიუხედავად იმისა, რომ თქვენ შეიძლება გქონდეთ ექსპერიმენტი უფრო მაღალი ზომებით (რეალური word2vec აქვს 300)
  • ჩაშენების ვექტორი შემდეგ გადაეცემა ხაზოვან ფენას, რომელიც იწინასწარმეტყველებს გამომავალ სიტყვას. ამრიგად, მას აქვს vocab_size ნეირონები.

გამოსასვლელად, თუ გამოვიყენებთ CrossEntropyLoss-ს, როგორც დაკარგვის ფუნქციას, ჩვენ ასევე მოგვიწევს მხოლოდ სიტყვების რიცხვების მიწოდება, როგორც მოსალოდნელი შედეგები, ერთჯერადი კოდირების გარეშე.

იტვირთება…
გამოტანა
Sequential(
  (0): Embedding(5002, 30)
  (1): Linear(in_features=30, out_features=5002, bias=True)
)

ტრენინგის მონაცემების მომზადება

ახლა მოდით დავაპროგრამოთ მთავარი ფუნქცია, რომელიც გამოთვლის CBoW სიტყვების წყვილებს ტექსტიდან. ეს ფუნქცია საშუალებას მოგვცემს დავაზუსტოთ ფანჯრის ზომა და დააბრუნოს წყვილების ნაკრები - შემავალი და გამომავალი სიტყვა. გაითვალისწინეთ, რომ ამ ფუნქციის გამოყენება შესაძლებელია როგორც სიტყვებზე, ასევე ვექტორებზე/ტენზორებზე - რაც მოგვცემს ტექსტის დაშიფვრის საშუალებას, სანამ გადავიტანთ მას to_cbow ფუნქციაზე.

იტვირთება…
გამოტანა
[['like', 'I'], ['to', 'I'], ['I', 'like'], ['to', 'like'], ['train', 'like'], ['I', 'to'], ['like', 'to'], ['train', 'to'], ['networks', 'to'], ['like', 'train'], ['to', 'train'], ['networks', 'train'], ['to', 'networks'], ['train', 'networks']]
[[232, 172], [5, 172], [172, 232], [5, 232], [0, 232], [172, 5], [232, 5], [0, 5], [1202, 5], [232, 0], [5, 0], [1202, 0], [5, 1202], [0, 1202]]

მოდით მოვამზადოთ ტრენინგის მონაცემთა ბაზა. ჩვენ გადავხედავთ ყველა სიახლეს, დავურეკეთ to_cbow-ს, რათა მივიღოთ სიტყვების წყვილების სია და დავამატოთ ეს წყვილები X და Y. დროის გულისთვის ჩვენ განვიხილავთ მხოლოდ პირველ 10000 სიახლეს - შეგიძლიათ მარტივად მოხსნათ შეზღუდვა იმ შემთხვევაში, თუ მეტი დრო გექნებათ ლოდინი და გსურთ მიიღოთ უკეთესი ემბედინგები :)

იტვირთება…

ჩვენ ასევე გადავიყვანთ ამ მონაცემებს ერთ მონაცემთა ბაზაში და შევქმნით მონაცემთა ჩამტვირთველს:

იტვირთება…

ჩვენ ასევე გადავიყვანთ ამ მონაცემებს ერთ მონაცემთა ბაზაში და შევქმნით მონაცემთა ჩამტვირთველს:

იტვირთება…

ახლა მოდით გავაკეთოთ რეალური ტრენინგი. ჩვენ გამოვიყენებთ SGD ოპტიმიზატორს საკმაოდ მაღალი სწავლის სიჩქარით. ასევე შეგიძლიათ სცადოთ თამაში სხვა ოპტიმიზატორებთან, როგორიცაა Adam. დასაწყისისთვის ჩვენ ვივარჯიშებთ 10 ეპოქისთვის - და შეგიძლიათ ხელახლა გაუშვათ ეს უჯრედი, თუ გსურთ კიდევ უფრო დაბალი დანაკარგი.

იტვირთება…
იტვირთება…
გამოტანა
Epoch: 1: loss=5.664632366860172
Epoch: 2: loss=5.632101973960962
Epoch: 3: loss=5.610399051405015
Epoch: 4: loss=5.594621561080262
Epoch: 5: loss=5.582538017415446
Epoch: 6: loss=5.572900234519603
Epoch: 7: loss=5.564951676341915
Epoch: 8: loss=5.558288112064614
Epoch: 9: loss=5.552576955031129
Epoch: 10: loss=5.547634165194347
5.547634165194347

ვცდილობ Word2Vec

Word2Vec-ის გამოსაყენებლად, მოდით გამოვყოთ ვექტორები, რომლებიც შეესაბამება ჩვენს ლექსიკაში ყველა სიტყვას:

იტვირთება…

ვნახოთ, მაგალითად, როგორ არის დაშიფრული სიტყვა Paris ვექტორში:

იტვირთება…
გამოტანა
tensor([-0.0915,  2.1224, -0.0281, -0.6819,  1.1219,  0.6458, -1.3704, -1.3314,
        -1.1437,  0.4496,  0.2301, -0.3515, -0.8485,  1.0481,  0.4386, -0.8949,
         0.5644,  1.0939, -2.5096,  3.2949, -0.2601, -0.8640,  0.1421, -0.0804,
        -0.5083, -1.0560,  0.9753, -0.5949, -1.6046,  0.5774],
       grad_fn=<EmbeddingBackward>)

საინტერესოა Word2Vec-ის გამოყენება სინონიმების მოსაძებნად. შემდეგი ფუნქცია დააბრუნებს n უახლოეს სიტყვებს მოცემულ შენატანს. მათი საპოვნელად, ჩვენ გამოვთვალეთ $|w_i - v|$-ის ნორმა, სადაც $v$ არის ვექტორი, რომელიც შეესაბამება ჩვენს შეყვანილ სიტყვას და $w_i$ არის $i$-th სიტყვის კოდირება ლექსიკაში. შემდეგ ვახარისხებთ მასივს და ვაბრუნებთ შესაბამის ინდექსებს argsort-ის გამოყენებით და ვიღებთ სიის პირველ n ელემენტებს, რომლებიც შიფრავს ყველაზე ახლო სიტყვების პოზიციებს ლექსიკაში.

იტვირთება…
გამოტანა
['microsoft', 'quoted', 'lp', 'rate', 'top']
იტვირთება…
გამოტანა
['basketball', 'lot', 'sinai', 'states', 'healthdaynews']
იტვირთება…
გამოტანა
['funds', 'travel', 'sydney', 'japan', 'business']

Takeaway

ჭკვიანური ტექნიკის გამოყენებით, როგორიცაა CBoW, ჩვენ შეგვიძლია მოვამზადოთ Word2Vec მოდელი. თქვენ ასევე შეგიძლიათ სცადოთ skip-gram მოდელის გაწვრთნა, რომელიც გაწვრთნილი იქნება მეზობელი სიტყვის პროგნოზირებისთვის, რომელიც მოცემულია ცენტრალურში და ნახოთ რამდენად კარგად მუშაობს იგი.

ეს გაკვეთილი არის Microsoft “AI for Beginners” კურსის ქართული თარგმანი, გავრცელებული MIT ლიცენზიით.