Neyron mashinaviy tarjima modellarini vizualizatsiya qilish (E’tiborga asoslangan seq2seq modellari mexanikasi)
Haqiqiy maqola Jey Alammar tomonidan jalammar.github.io saytida 2018-yil 9-mayda e’lon qilingan. Abror Shopulatov tomonidan tarjima va tahrir qilindi.
Sequence-to-sequence (yoki seq2seq) modellari mashinaviy tarjima, matnni umumlashtirish va rasmga sarlavha qo‘yish kabi vazifalarda katta muvaffaqiyatlarga erishgan chuqur o‘rganish (deep learing) modellaridir. Google Translate 2016-yil oxiridan beri bunday modellardan foydalanadi. Bu modellar ikkita mashhur maqolalar orqali dunyo yuzini ko‘rgan (Sutskever va boshqalar, 2014, Cho va boshqalar, 2014).
Ammo, bu modellarni yaxshi tushunish bir-birining ustiga qurilgan bir qator tushunchalarni bilishni talab qiladi. Ushbu fikrlarni vizual tarzda ifodalansa, yanada qulayroq bo‘ladi deb o‘yladim. Bu postda aynan shuni maqsad qilganman. Postni tushunish uchun sizga chuqur o‘rganish haqida boshlang‘ich tushunchalar kerak bo‘ladi. Umid qilamanki, bu yuqorida aytib o‘tilgan maqolalarni (va keyinroq postda havola qilingan diqqat maqolasini) o‘qish bu postni tushunishga ancha yordam beradi.
seq2seq modeli - bu elementlar ketma-ketligini (so‘zlar, harflar, tasvirlarning xususiyatlari va boshqalar) qabul qiladigan va boshqa elementlar ketma-ketligini chiqaradigan model. O‘qitilgan model quyidagicha ishlaydi:
Neyron mashinaviy tarjimasida kiruvchi ketma-ketlik qayta ishlanadigan so‘zlar qatoridir. Chiquvchi ham xuddi shunday so‘zlar qatoridan iborat:
Chuqurroq kirish
Chuqurroq kiradigan bo‘lsak, model kodlovchi (encoder) va dekodlovchidan (decoder) iborat.
Kodlovchi kirish ketma-ketligidagi har bir elementni qayta ishlaydi va olgan ma’lumotni vektorga (kontekst deb ataladi) jamlaydi. Butun kirish ketma-ketligini qayta ishlagandan so‘ng, kodlovchi kontekstni dekodlovchiga yuboradi. Keyin dekodlovchi chiqish ketma-ketligini birma-bir chiqara boshlaydi.
Xuddi shu jarayon mashinaviy tarjima modellarida ham sodir bo‘ladi.
Mashinaviy tarjima modellarida kontekst bu vektor (asosan sonlar qatori). Kodlovchi va dekodlovchi RNNlardan (Recurrent Neural Networks - Takrorlanuvchi Neyron Tarmoqlari) iborat bo‘ladi (RNNlarga kirish uchun Luis Serranoning "A friendly introduction to Recurrent Neural Networks" videosini ko‘ring).
Modelingizni yaratayotganda kontekst vektorining o‘lchamini belgilashingiz mumkin. Bu RNN kodlovchisidagi yashirin birliklar (hidden state) soni. Ushbu vizualizatsiyada 4 o‘lchamdagi vektordan foydalandik, ammo haqiqiy ilovalarda kontekst vektori 256, 512 yoki 1024 kabi o‘lchamlarda bo‘ladi.
Dizayni bo‘yicha, RNN har bir bosqichda ikkita kiruvchi qabul qiladi: kiruvchi (kodlovchi holatda, kirish jumlasidan bitta so‘z) va yashirin holat (hidden state). Biroq, RNN so‘zni o‘z holicha qabul qilmaydi. U vektor bilan ifodalanishi kerak. So‘zni vektorga aylantirish uchun biz "word embedding" (so‘zni joylashtirish) algoritmidan foydalanamiz. Bunda so‘zlarni vektorlar yordamida ifodalash orqali so‘zlarning ko‘plab ma’nolari/semantik ma’lumotlarini qamrab olishimiz mumkin. (masalan, qirol - erkak + ayol = malika)
Endi asosiy vektorlarimiz bilan tanishib chiqqandan keyin, keling, RNN mexanikasini takrorlaymiz va ushbu modellarni tasvirlaymiz:
Keyingi bosqichda RNN ikkinchi kiruvchi vektor va 1-yashirin holatni olib, keyingi chiquvchini chiqaradi. Keyinchalik postda biz neyron mashinaviy tarjima modeli ichidagi vektorlarni tasvirlash uchun shunga o‘xshash animatsiyadan foydalanamiz.
Quyidagi vizualizatsiyada kodlovchi yoki dekodlovchi uchun har bir bosqich RNN o‘z kiruvchilarini qayta ishlash va o‘sha vaqt bosqichi uchun chiquvchi ishlab chiqarishidir. Kodlovchi va dekodlovchi ikkalasi ham RNN bo‘lganligi sababli, RNN har safar oldingi va hozirgi kiruvchilari asosida yashirin holatini yangilaydi.
Keling, kodlovchining yashirin holatlarini ko‘rib chiqaylik. E’tibor bering, oxirgi yashirin holat aslida biz dekodlovchiga uzatadigan kontekstdir.
Dekodlovchi ham har bir bosqichda yashirin holatni saqlaydi. Biz hozircha modelning asosiy qismlariga o‘tmaganimiz uchun biz buni animatsiyada ko‘rmadik.
Keling, seq2seq modelini boshqa tomondan tasavvur qilib ko‘raylik. Ushbu animatsiya ushbu modellarni tavsiflovchi statik grafiklarni tushunishni osonlashtiradi. Bunda biz bitta dekodlovchini ko‘rsatish o‘rniga, har bir vaqt bosqichi uchun uning nusxasini ko‘rsatamiz. Shu tarzda biz har bir vaqt bosqichining kiruvchi va chiquvchilarini ko‘rib chiqishimiz mumkin.
Endi e’tibor beraylik
Bu modellarni yaxshilashda kontekst vektori muammo tug‘dirayotgan edi. Chunki bu modellar uchun uzun jumlalar bilan ishlashni qiyinlashtirgan. Yechim Bahdanau va boshqalar, 2014 va Luong va boshqalar, 2015 maqolalarida taklif qilingan. Ushbu maqolalar “E’tibor” (Attention) deb nomlangan texnikani joriy qilgan va mashinaviy tarjima modellarining sifatini yuqori darajada yaxshilagan. E’tibor, kerak bo‘lganda, modelga kiruvchi ketma-ketligining tegishli qismlariga e’tibor qaratish imkonini beradi.
Keling, e’tibor mexanizmiga ega modellarni yuqoridan ko‘rib chiqishda davom etaylik. E’tibor modeli klassik modellardan ikkita asosiy jihatdan farq qiladi:
Birinchidan, kodlovchi dekodlovchiga ko‘proq ma’lumotlarni uzatadi. Kodlash bosqichining oxirgi yashirin holatini o‘tkazish o‘rniga, kodlovchi barcha yashirin holatlarni dekodlovchiga o‘tkazadi:
Ikkinchidan, dekodlash vaqtida kiruvchi matnning tegishli qismlariga e’tibor qaratish uchun dekodlovchi quyidagilarni bajaradi:
Kodlovchidan olingan yashirin holatlarni ko‘rib chiqadi - har bir yashirin holat kirish matnidagi ma’lum bir so‘z bilan bog‘liq.
Har bir yashirin holatga ball beradi. (hozircha ball qanday berilganiga e’tibor bermay turaylik)
Har bir yashirin holatni softmax qilingan ball bilan ko‘paytirish orqali yuqori balli yashirin holatlarni kuchaytirib va past balli yashirin holatlarni susaytiradi.
Ushbu ball berish dekodlovchi tomonidan har bir bosqichda amalga oshiriladi.
Keling, hamma narsani quyidagi vizualizatsiyada birlashtiramiz va e’tibor mexanizmi qanday ishlashini ko‘rib chiqamiz:
E’tiborga asoslangan dekodlovchi RNN <END> tokenining vektori va dastlabki dekodlovchining yashirin holatini oladi.
RNN o‘z kiruvchilarini qayta ishlaydi, chiquvchi va yangi yashirin holat vektorini (h4) ishlab chiqaradi. Chiquvchi tashlab yuboriladi.
E’tibor bosqichi: Biz bu bosqichda kontekst vektorini (C4) hisoblash uchun kodlovchining yashirin holati va h4 vektorlaridan foydalanamiz.
h4 va C4 ni bitta vektorga birlashtiramiz.
Ushbu vektorni feedforward (oldinga yo‘naltirilgan) neyron tarmog‘i (model bilan birgalikda o‘qitilgan) orqali o‘tkazamiz.
Feedforward neyron tarmoqlarining chiquvchi vektori bu bosqichning chiqish so‘ziga aylantiriladi.
Keyin bu qadamlarni yana takrorlaymiz.
Bu har bir dekodlash bosqichida kirish matnining qaysi qismiga e’tibor qaratayotganimizni ko‘rishning yana bir usuli:
E’tibor bergan bo‘lsangiz, model shunchaki chiquvchidagi birinchi so‘zni kiruvchidagi birinchi so‘z bilan moslashtirmaydi. U aslida o‘sha tillardagi so‘zlarni qanday moslashni o‘rgandi (bizning misolimizda fransuz va ingliz tillari). Ushbu mexanizm qanchalik aniq bo‘lishi mumkinligiga misol yuqorida sanab o‘tilgan e’tibor maqolalarida keltirilgan:
Agar o‘rganganlaringizni sinab ko‘rmoqchi bo‘lsangiz, TensorFlowning Neyron Mashinaviy Tarjima (seq2seq) qo‘llanmasini tekshirib ko‘ring.