Software 2.0
Dasturlashni qayta tasavvur qilish: SI qanday qilib dasturiy ta’minotni ishlab chiqishni o‘zgartiradi.
Haqiqiy maqola Andrey Karpati tomonidan karpathy.medium.com saytida 2017-yil 12-noyabrda e’lon qilingan. Abror Shopulatov tomonidan tarjima va tahrir qilindi.
Ba’zida odamlar neyron tarmoqlarni "ML asboblari ichida yana bitta asbob" deyayotganlarini eshitaman. Ularning ijobiy va salbiy tomonlari bor, ba’zi joylarda yordam beradi va ba’zida ular bilan Kaggle musobaqalarida yutsangiz bo‘ladi deyishadi. Afsuski, bu talqinni daraxtlarni ko‘rib, butun o‘rmonni ko‘rmaslikka qiyoslasak bo‘ladi. Neyron tarmoqlar shunchaki boshqa klassifikator emas, ular dasturiy ta’minotni ishlab chiqishda fundamental o‘zgarishlarning boshlanishini anglatadi. Ular Software’ning (yoki dasturiy ta’minot) 2.0 versiyasi.
Software 1.0 ning "klassik to‘plami" (classical stack) - bu barchamizga yaxshi bilgan Python, C++ va boshqa shu kabi tillarda yozilgan. U dasturchi tomonidan kompyuterga yozilgan aniq ko‘rsatmalardan iborat. Har bir qator kod yozish orqali dasturchi dasturning ma’lum bir qismidagi xatti-harakatini belgilaydi.
Bundan farqli o‘laroq, Software 2.0 mavhumroq, insonga xos bo‘lmagan neyron tarmoqlarining og‘irligi (weight) tilida yoziladi. Ushbu kodni yozishda hech kim ishtirok etmaydi, chunki og‘irliklar juda ko‘p (odatda millionlarda bo‘lishi mumkin) va to‘g‘ridan-to‘g‘ri og‘irliklarda kodlash juda qiyin (harakat qilib ko‘rganman).
Buning o‘rniga, bizning yondashuvimiz istalgan dasturning xatti-harakati bo‘yicha biron-bir maqsadni belgilash (masalan, "vebsayt tuzib ber" yoki "Go o‘yinida yut"), va dasturning kerakli qismini topib, hisoblash resurslari orqali shu maqsadlarni amalga oshiruvchi neyron tarmoqning taxminiy skeletini (ya’ni. arxitekturasini) yozishdan iborat. Neyron tarmoqlar uchun esa biz qidiruvni backprop va stohastik gradient descent (hosila tushishi) bilan (biroz ajablanarli darajada) samarali ishlashi uchun dastur maydonining kichik to‘plamlari bilan cheklaymiz.
Solishtirish uchun Software 1.0 da inson tomonidan ishlab chiqilgan kodlar (masalan, .cpp fayllari) foydali ishlarni bajarish uchun ikkilik sanoq tizimidagi kodga kompilyatsiya qilinadi. Software 2.0 da ko‘pincha kodlar 1) kerakli xatti-harakatni belgilaydigan datasetini (ma’lumotlar to‘plam) va 2) kodning skeletini beruvchi neyron tarmoq arxitekturasini (ammo to‘ldirilishi kerak bo‘lgan ko‘plab tafsilotlarni (og‘irliklarni)) o‘z ichiga oladi. Neyron tarmoqni o‘qitish datasetini yakuniy neyron tarmoqqa kompilyatsiya qiladi. Bugungi kunda ko‘pgina amaliy dasturlarda neyron tarmoq arxitekturasi va o‘qitish tizimlari borgan sari standartlashtirilmoqda, shuning uchun faol "dasturiy ta’minotni ishlab chiqish"ning (software development) aksariyati datasetini tozalash, ko‘paytirish, ishlov berish va filtrlash shaklida amalga oshirilyapti. Bu bizning hozirgi dasturiy ta’minotimizdan tubdan farq qiladi, chunki jamoalar ikkiga bo‘lingan: 2.0 dasturchilar (ma’lumotlarga ishlov beruvchilar) datasetini tahrirlash va kengaytirish bilan shug‘ullansa, 1.0 dasturchilar esa atrofdagi o‘qitish, tahlil, vizualizatsiya va ishlov berish kodlari infratuzilmasiga javob beradi.
Ma’lum bo‘lishicha, haqiqiy muammolarning katta qismi dasturni aniq yozishdan ko‘ra ma’lumotlarni to‘plash (yoki umuman olganda, kerakli xatti-harakatni aniqlash) osonroq. Shu va boshqa men quyida to‘xtalib o‘tadigan ko‘plab afzalliklari tufayli sanoat bo‘ylab ko‘plab 1.0 kodlari 2.0 kodiga o‘tkazilishi bilan Software 2.0 ga o‘tishning guvohi bo‘lamiz. Software (1.0) dunyoni egallamoqda, endi esa Sun’iy Intellekt (Software 2.0) Software’ni egallaydi.
Davom etayotgan o‘tish
Keling, davom etayotgan o‘tishning ba’zi aniq misollarini qisqacha ko‘rib chiqaylik. Ushbu sohalarning har birida biz so‘nggi bir necha yil ichida aniq kod yozish orqali murakkab muammoni hal qilishga urinishdan voz kechib va kodni 2.0 ko‘rinishga o‘tkazganimizda, sezilarli yaxshilanishlarni ko‘rdik.
Vizual tanib olish (Visual Recognition) avvallari oxirida biroz ML’ni (masalan, SVM) o‘z ichiga oladigan muhandislik vazifasi edi. O‘shandan beri biz katta datasetlarini (masalan, ImageNet) yig‘ish va Konvolutsion neyron tarmog‘i (CNN) arxitekturasi bo‘ylab qidirish orqali ancha kuchli vizual xususiyatlarni kashf etdik. Yaqinda biz arxitekturalarni qo‘lda kodlashni to‘xtatamiz va arxitekturalarni qidirishni ham neyron tarmoqlarga topshiramiz.
Nutqni tanish (Speech Recognition) oldindan ko‘plab ishlov berish, Gauss aralashma modellari (gaussian mixture models) va yashirin Markov modellarini o‘z ichiga olgan, ammo bugungi kunda deyarli butunlay neyron tarmoqdan iborat. 1985-yilda Fred Jelinek kulgili iqtibosida "Men har safar tilshunosni ishdan bo‘shatganimda, nutqni tanish tizimimizning samaradorligi oshyapti" degan edi.
Nutq sintezi (Speech synthesis) texnologiyasi avvallari turli xil yig‘ish (stitching) usullari bilan ishlab chiqilgan, ammo hozirgi zamonda eng ilg‘or modellari katta konvolutsion tarmoqlar bo‘lib (masalan, WaveNet), ular to‘g‘ridan-to‘g‘ri audio signallarini chiqaradi.
Mashinaviy tarjima (Machine Translation) odatda iboralarga asoslangan statistik (SMT) usullardan foydalangan holda yondashilgan, ammo neyron tarmoqlar tezda ommalashmoqda. Men modellarni ko‘p tilli muhitda o‘qitilishini afzal ko‘raman, ya’ni bitta model zaif nazorat ostida (yoki butunlay nazoratsiz) o‘qitilib, istalgan tildan istalgan tilga tarjima qila olishidir.
O‘yinlar. Qo‘lda kodlangan Go o‘ynash dasturlari uzoq vaqt davomida ishlab chiqilgan, ammo AlphaGo Zero (taxtaning holatini ko‘rib va keyingi harakatni belgilaydigan ConvNet) hozirda o‘yinning eng kuchli o‘yinchisiga aylandi. O‘ylaymanki, biz yaqin orada boshqa turdagi o‘yinlarda (masalan. DOTA 2 yoki StarCraft) ham juda o‘xshash natijalarni ko‘ramiz.
Ma’lumotlar bazasi (Database). Sun’iy intellektdan tashqari an’anaviy tizimlar ham o‘tishning dastlabki bosqichlarini ko‘rmoqda. Masalan, “The Case for Learned Index Structures” (O‘rganilgan indeks tuzilmalari uchun misol) ma’lumotlarni boshqarish tizimining asosiy komponentlarini neyron tarmoq bilan almashtirib, kesh uchun optimallashtirilgan B-daraxtlarining xotirasini karrasiga kamaytirib, 70% gacha tezlashtirdi.
Yuqoridagi havolalarimning ko‘pchiligi Google’da bajarilgan ishlar bilan bog‘liqligini sezishingiz mumkin. Buning sababi, Google hozirda o‘z kodlarining katta qismlarini Software 2.0 kodiga o‘tkazishda ildam o‘rinlarda turadi. “One model to rule them all” (Hammasini boshqaradigan model) maqolasi alohida sohalarning statistik kuchini yagona izchil modelga birlashtirib, bu qanday ko‘rinishda bo‘lishi mumkinligi haqida dastlabki taassurotlarini taqdim etdi.
Software 2.0 ning afzalliklari
Nima uchun biz murakkab dasturlarni Software 2.0 ga o‘tkazishimiz kerak? Shubhasiz, oson javob shundaki, ular amalda yaxshiroq ishlaydi. Biroq, bu to‘plamni afzal ko‘rish uchun boshqa sabablar ham juda ko‘p. Keling, Software 2.0 (ConvNet) ning Software 1.0 ga (ishlayotgan C++ kod bazasi) nisbatan ba’zi afzalliklarini ko‘rib chiqaylik. Software 2.0 - bu:
hisoblash jihatidan bir xil. Oddiy neyron tarmoq, birinchi navbatda, faqat ikkita operatsiyadan iborat: matritsalarni ko‘paytirish va nolga chegaralash (ReLU). Klassik dasturiy ta’minotning ko‘rsatmalar to‘plami (instruction set) esa sezilarli darajada xilma-xil va murakkab. Siz faqat Software 1.0 hisoblash vositalarini (masalan, matritsalarni ko‘paytirish) kam ishlatganingiz uchun turli xil to‘g‘rilik/ishlash kafolatlarini berish ancha oson.
kremniyga kiritish oson. Neyron tarmoqning ko‘rsatmalar to‘plami nisbatan kichik bo‘lganligi sababli, bu tarmoqlarni kremniyda ishlatishni sezilarli darajada osonlashtirish mumkin (masalan. maxsus ASIClar, neyromorfik chiplar va boshqalar bilan). Atrofimizda kam quvvatda ishlovchi keng tarqalgan qurilmalar dunyoni o‘zgartiradi. Masalan, ConvNet, nutqni tanuvchi va WaveNet nutq sintezi tarmog‘ini o‘z ichiga oladigan arzon chiplar kichik qurilmalarga biriktirilsa, ular yordamida ishingizni osongina bitirishingiz mumkin.
o‘zgarmas ishlash vaqtiga ega. Odatiy neyron tarmog‘i oldinga o‘tishning (forward pass) har bir bosqichida bir xil miqdordagi FLOPS sarflanadi. Sizning kodingiz ba’zi bir kengaygan C++ kod bazasi orqali turli xil yo‘llar yo‘llarni hisobga olganda ham, bir xil vaqt talab qiladi. Albatta, siz dinamik hisoblash grafiklariga ega bo‘lishingiz mumkin, ammo bajarish oqimi odatda hali ham ko‘pincha o‘zgarmaydi. Shunday qilib, biz hech qachon o‘zimizning ko‘zda tutilmagan cheksiz looplarga duch kelmaymiz.
doimiy xotiradan foydalanadi. Yuqoridagilar bilan bog‘liq holda, hech qanday dinamik ravishda ajratilgan xotiraga ehtiyoj yo‘q, shuning uchun diskni almashtirish yoki kodingizda qidirishingiz kerak bo‘lgan xotira leak bo‘lishi ehtimoli juda kam.
juda portativ. Klassik ikkilik yoki skriptlar bilan solishtirganda matritsalarni ko‘paytirish ketma-ketligini turli qurilmalarda ishlatish ancha oson.
juda moslashuvchan. Agar sizning C++ kodingiz bo‘lib, kimdir uni ikki karra tezlashtirishni xohlasa (agar zarur bo‘lsa va unumdorlik evaziga), tizimni yangi holatga moslashtirish juda qiyin bo‘ladi. Biroq, Software 2.0 da biz o‘z tarmog‘imizni olishib, og‘irliklarning yarmini olib tashlab va qayta o‘qitsak - u ikki baravar tezroq va biroz yomonroq ishlaydi. Bu aqlbovar qilmas hodisa. Aksincha, agar sizda ko‘proq ma’lumot/hisoblash mashinalari bo‘lsa, ko‘proq og‘irliklar qo‘shish va qayta o‘qitish orqali modelingizni yaxshilashingiz mumkin.
modullari optimal ravishda butunga birlashishi mumkin. Bizning dasturiy ta’minotimiz ko‘pincha umumiy funksiyalar, API yoki endpoint’lar orqali aloqa qiladigan modullarga bo‘linadi. Biroq, dastlab alohida o‘qitilgan ikkita Software 2.0 moduli bir-biri bilan ishlasa, biz butun jarayonni backpropagation orqali osongina kuzatib borishimiz mumkin. Agar veb-brauzeringiz veb-sahifalarni yuklashini tezlashtirish uchun past darajadagi tizim ko‘rsatmalarini avtomatik ravishda 10 daraja pastda qayta loyihalashtira olsa, bu qanchalik zo‘r bo‘lishini bir o‘ylab ko‘ring. Yoki siz import qilgan kompyuter ko‘rish kutubxonasi (masalan, OpenCV) sizning maxsus ma’lumotlaringizga avtomatik sozlanishi mumkin bo‘lsa. 2.0 uchun bular shunchaki standart ishlar.
sizdan yaxshiroq. Nihoyat, va eng muhimi, neyron tarmoq - bu siz yoki men juda ko‘p qimmatli vertikallarni o‘ylab topishimiz mumkin bo‘lgan har qanday narsadan yaxshiroq. Hozirda kamida tasvirlar/video va tovush/nutq bilan bog‘liq vazifalarda.
Software 2.0 ning kamchiliklari
2.0 ilovalarining ham o‘ziga xos kamchiliklari bor. Optimallashtirish oxirida bizda yaxshi ishlaydigan modellar qoladi, ammo buni qanday ishlashini aytish juda qiyin. Ko‘pgina sohalarda biz tushunadigan 90% aniq modelni yoki biz tushunmaydigan 99% aniq modelni tanlash imkoniyatiga ega bo‘lamiz.
2.0 ilovalar noaniq va sharmandali tarzda ishlamay qolishi, yoki bundan ham yomoni, ular o‘z datasetlaridagi noto‘g‘ri ma’lumotlarni jimgina qabul qilgan bo‘lishi mumkin. Aksariyat hollarda ularning o‘lchamlari millionlab millionlarda oson bo‘lganda ularni to‘g‘ri tahlil qilish va tekshirish juda qiyin.
Va nihoyat, biz hali ham ushbu oqimning o‘ziga xos xususiyatlarini kashf qilishda davom etyapmiz. Masalan, qarama-qarshi (adversarial) misollar va hujumlarning mavjudligi 2.0 ning noaniqligini ta’kidlaydi.
2.0 davrida dasturlash
Software 1.0 - bu biz yozadigan kod. Software 2.0 - bu baholash mezoniga (masalan, "ushbu ma’lumotlarini to‘g‘ri klassifikatsiyalash") asoslangan optimallashtirish orqali yozilgan koddir. Ehtimol, dasturlar ishlashi aniq bo‘lmasligi mumkin, lekin uning ishlashini baholash mumkin bo‘lgan har qanday sozlamalar (masalan, ba’zi rasmlarni to‘g‘ri klassifikatsiyaladingizmi? Go o‘yinlarini yutdingizmi?) ushbu o‘tish davrida takomillashib boraveradi, chunki optimallashtirilgan tizimlar inson yozishi mumkin bo‘lgan koddan ko‘ra yaxshiroq kodni yozadi.
O‘zgarishlarga shunday ko‘z bilan qarash ahamiyatga ega. Agar siz neyron tarmoqlarni shunchaki juda yaxshi klassifikator sifatida ko‘rib chiqish o‘rniga Software 2.0 ni yangi va rivojlanayotgan dasturlash paradigmasi deb bilsangiz, bu davrda ko‘plab ishlar qilinishi kerakligiga amin bo‘lasiz.
Xususan, biz odamlarga 1.0 kodini yozishda yordam beradigan juda ko‘p vositalarni yaratdik, masalan, kuchli IDElar bilan birga sintaksisni ajratib ko‘rsatish, debuggerlar, profilerlar, go to def, git integratsiyasi va boshqalar. 2.0 kodlash jarayoni, datasetlarni to‘plash, ularni tozalash va ishlov berish orqali amalga oshiriladi. Misol uchun, ilovamiz ba’zi qiyin yoki kamdan-kam hollarda ishlamay qolganda, biz qo‘shimcha kod yozib emas, balki datasetimizga bu holatlarning aks ettiruvchi misollar qo‘shish orqali hal qilamiz. Datasetlarni to‘plash, vizualizatsiya qilish, tozalash, belgilash va versiyalashda barcha ish jarayonlarida yordam beradigan birinchi Software 2.0 IDE’ni kim yaratmoqchi? Ehtimol, IDE har bir misolni yo‘qotish asosida tarmoq noto‘g‘ri belgilangan rasmlarni ajratib qo‘yishi yoki belgilashda taxminiy belgilar qo‘yishi yoki model noto‘g‘ri ishlashi mumkin bo‘lgan holatlar uchun qo‘shimcha rasmlar taqdim qilishi mumkin.
Xuddi shunday, Github Software 1.0 kodi uchun juda muvaffaqiyatli saqlash joyidir. Software 2.0 Github uchun joy bormi? Bunday holda, repozitoriyalar bu datasetlardir va o‘zgarishlar (commit) teglarni qo‘shish va tahrirlashdan iborat.
An’anaviy paket menejerlari va tegishli xizmat ko‘rsatish infratuzilmasi, masalan, pip, conda, docker va boshqalar bizga ikkilik fayllarni osonroq joylashtirish va yaratishga yordam beradi. Software 2.0 ikkilik fayllarini qanday qilib samarali o‘rnatamiz, almashamiz, import qilamiz va ishlaymiz? Neyron tarmoqlar uchun conda ekvivalenti nima?
Qisqa muddatda Software 2.0 qayta-qayta baholash mumkin va arzon bo‘lgan va algoritmni aniq loyihalash qiyin bo‘lgan har qanday sohaga tobora ko‘proq tarqalyapti. Butun dasturiy ta’minotni ishlab chiqish ekotizimini va uni ushbu yangi dasturlash paradigmasiga qanday moslashtirish mumkinligini ko‘rib chiqish uchun juda ko‘p qiziqarli imkoniyatlar mavjud. Va uzoq muddatda bu paradigmaning kelajagi porloq, chunki AGI albatta Software 2.0 da yozilishi aniq bo‘lib bormoqda.