ბოლო წლებში, ღია ტიპის ენის გენერაციის მიმართ მზარდი ინტერესი შეინიშნება, რაც განპირობებულია დიდი ტრანსფორმერზე დაფუძნებული ენობრივი მოდელების აღზევებით. ეს მოდელები, მათ შორის OpenAI-ის ChatGPT და Meta-ს LLaMA, მილიონობით ვებგვერდზეა გაწვრთნილი. პირობითი ღია ტიპის ენის გენერაციის შედეგები შთამბეჭდავია; მათ აჩვენეს ახალ ამოცანებზე განზოგადების, კოდის დამუშავების და არატექსტური მონაცემების შეტანად მიღების უნარი. გაუმჯობესებული ტრანსფორმერის არქიტექტურისა და მასიური ზედამხედველობის გარეშე სასწავლო მონაცემების გარდა, მნიშვნელოვანი როლი შეასრულა დეკოდირების უკეთესმა მეთოდებმაც. ეს ბლოგპოსტი წარმოგიდგენთ დეკოდირების სხვადასხვა სტრატეგიის მოკლე მიმოხილვას და, რაც მთავარია, გაჩვენებთ, თუ როგორ შეგიძლიათ მათი დანერგვა მინიმალური ძალისხმევით პოპულარული `transformers` ბიბლიოთეკის გამოყენებით! ყველა ქვემოთ მოცემული ფუნქციონალი გამოიყენება ავტორეგრესიული ენის გენერაციისთვის (იხილეთ განახლება). მოკლედ, ავტორეგრესიული ენის გენერაცია ეფუძნება ვარაუდს, რომ სიტყვათა მიმდევრობის ალბათობის განაწილება შეიძლება დაიშალოს პირობითი მომდევნო სიტყვების განაწილებების ნამრავლად: P(w1:T∣W0)=∏t=1TP(wt∣w1:t−1,W0), სადაც w1:0=∅, ხოლო W0 არის საწყისი კონტექსტური სიტყვათა მიმდევრობა. სიტყვათა მიმდევრობის T სიგრძე, როგორც წესი, დინამიურად განისაზღვრება და შეესაბამება t=T დროს, როდესაც EOS (End-Of-Sequence) ტოკენი გენერირდება P(wt∣w1:t−1,W0)-დან. ჩვენ განვიხილავთ ამჟამად ყველაზე გამორჩეულ დეკოდირების მეთოდებს, კერძოდ, ხარბ ძიებას (Greedy search), სხივურ ძიებას (Beam search) და სემპლინგს (Sampling). მოდით სწრაფად დავაინსტალიროთ `transformers` და ჩავტვირთოთ მოდელი. დემონსტრირებისთვის გამოვიყენებთ GPT2-ს PyTorch-ში, მაგრამ API იდენტურია TensorFlow-სა და JAX-ისთვის. **ხარბი ძიება (Greedy Search)** ხარბი ძიება (Greedy search) დეკოდირების უმარტივესი მეთოდია. ის ყოველ t ნაბიჯზე ირჩევს სიტყვას, რომელსაც უმაღლესი ალბათობა აქვს, როგორც მის მომდევნო სიტყვას: wt=argmaxwP(w∣w1:t−1). ქვემოთ მოცემული სქემა ასახავს ხარბ ძიებას. სიტყვიდან "The" დაწყებული, ალგორითმი ხარბად ირჩევს უმაღლესი ალბათობის მქონე მომდევნო სიტყვას "nice" და ასე შემდეგ, რის შედეგადაც საბოლოო გენერირებული სიტყვათა მიმდევრობა არის ("The", "nice", "woman"), საერთო ალბათობით 0.5×0.4=0.2. შემდეგში ჩვენ GPT2-ის გამოყენებით სიტყვათა მიმდევრობებს გენერირებას მოვახდენთ კონტექსტზე ("I", "enjoy", "walking", "with", "my", "cute", "dog"). ვნახოთ, როგორ გამოიყენება ხარბი ძიება `transformers`-ში: მშვენიერია! ჩვენ GPT2-ით ჩვენი პირველი მოკლე ტექსტი შევქმენით 😊. კონტექსტის შემდეგ გენერირებული სიტყვები გონივრულია, მაგრამ მოდელი სწრაფად იწყებს გამეორებას! ეს ენის გენერაციის ზოგადი პრობლემაა და, როგორც ჩანს, განსაკუთრებით ხარბი და სხივური ძიების დროს ვლინდება - იხილეთ Vijayakumar et al., 2016 და Shao et al., 2017. ხარბი ძიების მთავარი ნაკლი ის არის, რომ ის გამოტოვებს მაღალი ალბათობის სიტყვებს, რომლებიც დაბალი ალბათობის სიტყვის უკან იმალება, როგორც ეს ზემოთ მოცემულ ჩვენს სქემაში ჩანს: სიტყვა "has", თავისი მაღალი პირობითი ალბათობით (0.9), იმალება სიტყვა "dog"-ის უკან, რომელსაც მხოლოდ მეორე უმაღლესი პირობითი ალბათობა აქვს, შესაბამისად, ხარბი ძიება გამოტოვებს სიტყვათა მიმდევრობას ("The", "dog", "has"). საბედნიეროდ, ამ პრობლემის შესამსუბუქებლად ჩვენ გვაქვს სხივური ძიება (Beam search)! **სხივური ძიება (Beam Search)** სხივური ძიება ამცირებს დამალული მაღალი ალბათობის სიტყვათა მიმდევრობების გამოტოვების რისკს, ყოველ დროის ნაბიჯზე `num_beams` ყველაზე სავარაუდო ჰიპოთეზის შენარჩუნებით და საბოლოოდ ისეთი ჰიპოთეზის არჩევით, რომელსაც საერთო უმაღლესი ალბათობა აქვს. მოდით, ეს `num_beams=2`-ის მაგალითზე ვაჩვენოთ: დროის 1 ნაბიჯზე, ყველაზე სავარაუდო ჰიპოთეზის ("The", "nice") გარდა, სხივური ძიება ასევე თვალყურს ადევნებს მეორე ყველაზე სავარაუდოს ("The", "dog"). დროის 2 ნაბიჯზე, სხივური ძიება აღმოაჩენს, რომ სიტყვათა მიმდევრობას ("The", "dog", "has") აქვს 0.36 ალბათობა, რაც უფრო მაღალია, ვიდრე ("The", "nice", "woman")-ის 0.2. მშვენიერია, მან იპოვა ყველაზე სავარაუდო სიტყვათა მიმდევრობა ჩვენს სათამაშო მაგალითში! სხივური ძიება ყოველთვის იპოვის გამომავალ მიმდევრობას, რომლის ალბათობაც ხარბ ძიებაზე მაღალია, თუმცა ის არ იძლევა გარანტიას, რომ იპოვის ყველაზე სავარაუდო გამოსავალს. ვნახოთ, როგორ შეიძლება სხივური ძიების გამოყენება `transformers`-ში. ჩვენ დავაყენეთ `num_beams > 1` და `early_stopping=True`, რათა გენერაცია დასრულდეს, როდესაც ყველა სხივური ჰიპოთეზა მიაღწევს EOS ტოკენს. მიუხედავად იმისა, რომ შედეგი უდავოდ უფრო გამართულია, გამომავალი მაინც შეიცავს იგივე სიტყვათა მიმდევრობების გამეორებებს. ერთ-ერთი ხელმისაწვდომი გამოსავალია n-გრამების (ანუ n სიტყვისგან შემდგარი სიტყვათა მიმდევრობების) ჯარიმების დანერგვა, როგორც შესავალი...