დიდი ენობრივი მოდელების ხარისხის ზრდასთან ერთად, გაიზარდა ჩვენი მოლოდინიც იმის მიმართ, თუ რისი გაკეთება შეეძლოთ ამ მოდელებს. განსაკუთრებით OpenAI-ის GPT-2-ის გამოშვების შემდეგ, ტექსტის გენერაციის შესაძლებლობების მქონე მოდელები ყურადღების ცენტრში მოექცა. ეს გამართლებულია – ასეთი მოდელების გამოყენება შესაძლებელია ტექსტის შესაჯამებლად, სათარგმნელად და მათ ზოგიერთ ენობრივ დავალებაზე „zero-shot“ სწავლის უნარიც კი აჩვენეს. ეს ბლოგ-პოსტი აჩვენებს, თუ როგორ გამოვიყენოთ ეს ტექნოლოგია მაქსიმალურად TensorFlow-ის მეშვეობით. 🤗 `transformers` ბიბლიოთეკა NLP მოდელებით დაიწყო, ამიტომ ბუნებრივია, რომ ტექსტის გენერაცია ჩვენთვის უმნიშვნელოვანესია. ეს არის Hugging Face-ის დემოკრატიზაციის ძალისხმევის ნაწილი, რათა უზრუნველყოს მისი ხელმისაწვდომობა, მარტივი კონტროლი და ეფექტურობა. არსებობს წინა ბლოგ-პოსტი ტექსტის გენერაციის სხვადასხვა ტიპის შესახებ. მიუხედავად ამისა, ქვემოთ მოცემულია ძირითადი ფუნქციონალურობის მოკლე მიმოხილვა – თავისუფლად შეგიძლიათ გამოტოვოთ, თუ იცნობთ ჩვენს `generate` ფუნქციას და პირდაპირ TensorFlow-ის სპეციფიკაზე გადასვლა გსურთ. დავიწყოთ საფუძვლებით. ტექსტის გენერაცია შეიძლება იყოს დეტერმინისტული ან სტოქასტური, რაც დამოკიდებულია `do_sample` დროშაზე. ნაგულისხმევად ის დაყენებულია `False`-ზე, რაც გამომავალს დეტერმინისტულს ხდის და ცნობილია როგორც Greedy Decoding. როდესაც ის დაყენებულია `True`-ზე, რაც ასევე ცნობილია როგორც Sampling (სემპლინგი), გამომავალი იქნება სტოქასტური, მაგრამ თქვენ მაინც შეგიძლიათ მიიღოთ რეპროდუცირებადი შედეგები `seed` არგუმენტის მეშვეობით (იმავე ფორმატით, როგორც TensorFlow-ის უსახელო შემთხვევითი რიცხვების გენერაციისას). ზოგადი წესის მიხედვით, დეტერმინისტული გენერაცია საჭიროა, თუ გსურთ მოდელისგან ფაქტობრივი ინფორმაციის მიღება, ხოლო სტოქასტური გენერაცია – თუ უფრო კრეატიულ შედეგებს ისახავთ მიზნად. სამიზნე აპლიკაციიდან გამომდინარე, შესაძლოა სასურველი იყოს უფრო გრძელი გამომავალი. გენერირებული ტექსტის სიგრძის კონტროლი შეგიძლიათ `max_new_tokens` პარამეტრით, თუმცა გაითვალისწინეთ, რომ უფრო გრძელი გენერაცია მეტ რესურსს მოითხოვს. Sampling-ს (სემპლინგს) აქვს რამდენიმე პარამეტრი, რომლითაც შეგიძლიათ შემთხვევითობის კონტროლი. ყველაზე მნიშვნელოვანია `temperature` (ტემპერატურა), რომელიც ადგენს გამომავალი ტექსტის საერთო ენტროპიას – 1.0-ზე დაბალი მნიშვნელობები პრიორიტეტს ანიჭებს უფრო მაღალი ალბათობის მქონე ტოკენების სემპლინგს, ხოლო 1.0-ზე მაღალი მნიშვნელობები საპირისპიროდ მოქმედებს. მისი 0.0-ზე დაყენება ამცირებს ქცევას Greedy Decoding-მდე, ხოლო ძალიან დიდი მნიშვნელობები უახლოვდება ერთგვაროვან სემპლინგს. Sampling-ისგან განსხვავებით, Greedy Decoding ყოველთვის ირჩევს ყველაზე სავარაუდო ტოკენს გენერაციის ყოველ იტერაციაზე. თუმცა, ის ხშირად იწვევს არაოპტიმალურ გამომავალს. შედეგების ხარისხის გაზრდა შესაძლებელია `num_beams` არგუმენტის მეშვეობით. როდესაც ის 1-ზე მეტია, ის იწვევს Beam Search-ს, რომელიც განუწყვეტლივ იკვლევს მაღალი ალბათობის მქონე მიმდევრობებს. ეს კვლევა მოითხოვს დამატებით რესურსებსა და გამოთვლით დროს. და ბოლოს, Sampling-ის ან Beam Search-ის გაშვებისას, შეგიძლიათ გამოიყენოთ `num_return_sequences` რამდენიმე მიმდევრობის დასაბრუნებლად. Sampling-ისთვის ეს ეკვივალენტურია `generate` ფუნქციის რამდენჯერმე გაშვებისა ერთი და იგივე შეყვანის მოთხოვნიდან, ხოლო Beam Search-ისთვის ის აბრუნებს უმაღლესი ქულის მქონე გენერირებულ „სხივებს“ კლებადობით. ტექსტის გენერაციის საფუძვლები, როგორც ხედავთ, მარტივი გასაკონტროლებელია. თუმცა, ზემოთ მოცემულ მაგალითებში მრავალი ვარიანტი არ არის განხილული და მოწინავე გამოყენების შემთხვევებისთვის რეკომენდებულია დოკუმენტაციის გაცნობა. სამწუხაროდ, როდესაც TensorFlow-ით `generate` ფუნქციას ამუშავებთ, შესაძლოა შეამჩნიოთ, რომ მის შესრულებას დიდი დრო სჭირდება. თუ თქვენი სამიზნე აპლიკაცია დაბალ დაყოვნებას ან შეყვანის მოთხოვნების დიდ რაოდენობას მოითხოვს, TensorFlow-ით ტექსტის გენერაცია ძვირადღირებულ წამოწყებას ჰგავს. 😬 ნუ შეგეშინდებათ, რადგან ამ ბლოგ-პოსტის დარჩენილი ნაწილი მიზნად ისახავს აჩვენოს, რომ კოდის ერთი ხაზითაც კი შესაძლებელია დრამატული გაუმჯობესების მიღწევა. თუ პირდაპირ პრაქტიკაზე გადასვლა გირჩევნიათ, Colab-ში არის ინტერაქტიული მაგალითი, რომლითაც შეგიძლიათ ივარჯიშოთ! XLA, ანუ Accelerated Linear Algebra (ხაზოვანი ალგებრის დაჩქარება), არის კომპაილერი, რომელიც თავდაპირველად შეიქმნა TensorFlow მოდელების დასაჩქარებლად. დღესდღეობით ის ასევე არის JAX-ის უკან მდგარი კომპაილერი და მისი გამოყენება PyTorch-თანაც კი შესაძლებელია. მიუხედავად იმისა, რომ სიტყვა „კომპაილერი“ ზოგისთვის შეიძლება დამაშინებლად ჟღერდეს, XLA მარტივი გამოსაყენებელია TensorFlow-თან – ის შედის `tensorflow` ბიბლიოთეკის შემადგენლობაში და მისი გააქტიურება შესაძლებელია `jit_compile` არგუმენტით ნებისმიერ გრაფის შემქმნელ ფუნქციაში. მათთვის, ვინც იცნობს TensorFlow 1-ს 🧓, TensorFlow გრაფის კონცეფცია ბუნებრივია, რადგან ეს იყო მუშაობის ერთადერთი რეჟიმი. ჯერ ოპერაციებს დეკლარაციული გზით განვსაზღვრავდით გრაფის შესაქმნელად. შემდეგ შეგვეძლო შეყვანის მონაცემების გატარება გრაფის მეშვეობით და გამომავალი შედეგების დანახვა. სწრაფი, ეფექტური, მაგრამ რთული დებაგინგისთვის. TensorFlow 2-თან ერთად მოვიდა Eager Execution და მოდელების იმპერატიული კოდირების შესაძლებლობა – TensorFlow-ის გუნდი განსხვავებას უფრო დეტალურად ხსნის თავის ბლოგ-პოსტში. Hugging Face-ი თავის TensorFlow მოდელებს Eager Execution-ის გათვალისწინებით წერს. გამჭვირვალობა არის ძირითადი ღირებულება და მოდელის შიდა სტრუქტურის ნებისმიერ დროს შემოწმების შესაძლებლობა ძალიან სასარგებლოა ამ მიზნით. თუმცა, ეს ნიშნავს, რომ მოდელების ზოგიერთი გამოყენება არ იღებს სარგებელს გრაფის რეჟიმის მუშაობის უპირატესობებიდან (მაგ. `model(args)` გამოძახებისას). საბედნიეროდ, TensorFlow-ის გუნდმა ჩვენნაირი მომხმარებლებიც გაითვალისწინა 🥳! ფუნქციის შეფუთვა, რომელიც შეიცავს TensorFlow-ს