Dastur 2.0

Ba'zida odamlar neyron tarmoqlarni "sizning kompyuteringizni o'qitish asboblar qutisidagi boshqa vosita" deb atashlarini ko'raman. Ularning kamchiliklari va kamchiliklari bor, ular bu erda yoki u erda ishlaydi va ba'zida siz ularni Kaggle musobaqalarida g'alaba qozonish uchun ishlatishingiz mumkin. Afsuski, bu talqin daraxtlar uchun o'rmonni butunlay sog'inadi. Neyron tarmoqlari bu shunchaki boshqa bir tasniflagich emas, ular biz dasturiy ta'minotni yozishda tub o'zgarishlarning boshlanishini anglatadi. Ular Software 2.0.

Dasturiy ta'minot 1.0 ning "klassik to'plami" bizlarga yaxshi tanish bo'lgan narsa - bu Python, C ++ va hokazo tillarda yozilgan. Bu kompyuterga dasturchi tomonidan yozilgan aniq ko'rsatmalardan iborat. Kodning har bir satrini yozib, dasturchi istalgan xatti-harakatlar bilan dastur maydonidagi ma'lum bir nuqtani aniqlaydi.

Bundan farqli o'laroq, Software 2.0 neyron tarmoqning og'irliklari kabi insonning do'stona tilida yanada mavhum, yozilishi mumkin. Ushbu kodni yozishda hech kim ishtirok etmaydi, chunki juda ko'p og'irliklar mavjud (odatda tarmoqlarda millionlar bo'lishi mumkin) va to'g'ridan-to'g'ri og'irliklarda kodlash juda qiyin (men sinab ko'rdim).

Buning o'rniga, bizning yondashuvimiz istalgan dasturning ishlashi bo'yicha biron bir maqsadni belgilashdan iborat (masalan, "kirish misollari juftliklari to'plamini qondirish" yoki "Go o'yinini yutib olish"), kodning qo'pol skeletini yozing (masalan. neyron aniq arxitektura), bu qidirish uchun dastur maydonining pastki qismini aniqlaydi va hisoblash resurslarini bizning ixtiyorimizda ishlaydigan dastur uchun izlash uchun foydalanadi. Neyron tarmoqlarining o'ziga xos holatida, biz qidirish jarayonini backpropagatsiya va stoxastik gradientning tushishi bilan samarali (biroz hayratlanarli) amalga oshiriladigan dastur maydonining uzluksiz to'plami bilan cheklaymiz.

Aniqlanishicha, real dunyo muammolarining katta qismi dasturni aniq yozishdan ko'ra ma'lumotlarni yig'ish (yoki umuman istalgan xulq-atvorni aniqlash) osonroq bo'lgan xususiyatga ega. Bunday hollarda dasturchilar ikkita jamoaga bo'linadilar. 2.0 dasturchilari ma'lumotlar to'plamlarini qo'lda yo'naltirish, saqlash, massaj qilish, tozalash va yorliqlash; har bir belgilangan misol tom ma'noda yakuniy tizimni dasturlashtiradi, chunki ma'lumotlar bazasi optimallashtirish orqali Dastur 2.0 kodiga kiritiladi. Shu bilan birga, 1.0 dasturchilari atrofdagi vositalarni, tahlillarni, vizualizatsiyani, etiket interfeyslarini, infratuzilmani va o'quv kodlarini saqlab turishadi.

Davomli o'tish

Bu davom etayotgan o'tishning ba'zi aniq misollarini qisqacha ko'rib chiqaylik. Ushbu har bir sohada so'nggi bir necha yil ichida yaxshilanishlarni ko'rdik, biz aniq kodni yozib, kodni 2.0 stekiga o'tqazish orqali murakkab muammoni hal qilishdan voz kechganimizda.

Vizual tanib olish texnologiya xususiyatlaridan iborat bo'lib, oxirida bir oz mashina o'rganishga ega (masalan, SVM). O'shandan beri biz katta ma'lumotlar to'plamlarini (masalan ImageNet) olish va Convolutional Neural Network arxitekturalarida qidirish orqali yanada kuchli vizual xususiyatlarni topdik. So'nggi paytlarda biz o'zimizga arxitekturalarni kodlashtirishga ham ishonmaymiz va ularni ham qidira boshladik.

Nutqni aniqlash uchun ko'p ishlov berish, gaussiya aralashmasi va markovning yashirin modellari ko'p ishlatilgan, ammo bugungi kunda deyarli butunlay asabiy narsalardan iborat. 1985 yilda Fred Jelinekga tegishli bo'lgan juda tez-tez tilga olinadigan haziliy iqtibos: "Men har safar tilshunosni ishdan bo'shatganimda, nutqni aniqlash tizimimiz ishlashi yaxshilanadi".

Nutq sintezi tarixan turli xil tikuv mexanizmlari bilan yaqinlashdi, ammo bugungi kunda zamonaviy modellarning holati katta ConvNets (masalan, WaveNet) bo'lib, ular tovushsiz signal signallarini chiqaradi.

Mashinani tarjima qilish odatda iboralarga asoslangan statistik uslublar bilan yondoshgan, ammo neyron tarmoqlari tezda dominant bo'lib qolmoqda. Mening sevimli arxitekturalarim ko'p tilli tilda o'qitiladi, bu erda bitta model istalgan manbadan istalgan tilga va zaif boshqariladigan (yoki umuman nazorat qilinmaydigan) sozlamalarga tarjima qilinadi.

O'yinlar. Qo'l bilan kodlangan Go o'yinlarini o'ynash dasturlari uzoq vaqtdan beri ishlab chiqilgan, ammo AlphaGo Zero (taxtaning holatiga qaraydigan va harakatni o'ynaydigan ConvNet) hozirda o'yinning eng kuchli o'yinchisiga aylandi. Shunga o'xshash natijalarni boshqa sohalarda ko'rishimiz mumkin deb umid qilaman, masalan. DOTA 2 yoki StarCraft.

Ma'lumotlar bazalari. Sun'iy intellektdan tashqari an'anaviy tizimlar ham o'tishning dastlabki belgilarini ko'rishmoqda. Masalan, "O'rganilgan indeks tuzilmalari to'g'risida" ma'lumotni boshqarish tizimining asosiy tarkibiy qismlarini neyron tarmog'i bilan almashtiradi, kesh-optimallashtirilgan B daraxtlarini tezligini 70% ga oshirib, xotirada kattalik tartibini saqlaydi.

Yuqoridagi havolalarimning ko'pi Google-da bajarilgan ishlarni o'z ichiga oladi. Buning sababi, Google hozirda dasturiy ta'minot 2.0 kodiga o'zining katta qismlarini qayta yozishda birinchi o'rinda turadi. "Barchasini boshqarishning bitta modeli" bu qanday ko'rinishi mumkinligi haqida dastlabki eskizni taqdim etadi, bu erda alohida domenlarning statistik kuchi dunyoni yaxlit tushunchaga birlashtiradi.

Dastur 2.0 ning afzalliklari

Nega biz murakkab dasturlarni Software 2.0-ga joylashtirishni afzal ko'rishimiz kerak? Shubhasiz, bitta oson javob - ular amalda yaxshiroq ishlaydi. Biroq, bu suyakni afzal ko'rish uchun juda ko'p qulay sabablar mavjud. Software 2.0-ning (o'ylab ko'ring: ishlab chiqarish darajasidagi C ++ kod bazasi) Software 2.0-ga nisbatan ba'zi bir afzalliklarini ko'rib chiqaylik (o'ylab ko'ring: a ConvNet). Dasturiy ta'minot 2.0 bu:

Hisoblash bir hil. Oddiy neyron tarmog'i, birinchi navbatda, faqat ikkita operatsiyadan iborat bo'lgan sendvichdan iborat: matritsani ko'paytirish va nolga teng qiymat (ReLU). Buni an'anaviyroq va murakkabroq bo'lgan klassik dasturiy ta'minot bilan solishtiring. Siz ozgina miqdordagi yadro hisoblash primitivlari uchun (masalan, matritsani ko'paytirish) faqat Software 1.0 dasturini amalga oshirishni ta'minlashingiz kerak, shuning uchun har xil to'g'ri / ishlash kafolatlarini berish ancha oson.

Silikonga yopishtirish uchun oddiy. To'g'ri, neyron tarmog'ining qo'llanmasi nisbatan kichik bo'lgani sababli, ushbu tarmoqlarni kremniyga yaqinroq qilish osonroq bo'ladi, masalan. maxsus ASICs, neyromorf chiplari va boshqalar bilan. Atrofimizdagi past quvvatli razvedka tarqalganda dunyo o'zgaradi. Masalan, kichik, arzon chiplar oldindan ConvNet, nutqni tanib oluvchi va WaveNet nutq sintezi tarmog'iga ega bo'lishi mumkin, ularning barchasi siz ulashingiz mumkin bo'lgan kichik protobrenga birlashtirilgan.

Doimiy ish vaqti. Oddiy neyron aniq oldinga yo'naltirish passivining har bir iteratsiyasi FLOPS miqdoriga to'g'ri keladi. Sizning kodingiz C ++ kod bazasi orqali o'tishi mumkin bo'lgan turli xil bajarish usullariga asoslangan nol o'zgaruvchanlik mavjud. Albatta, sizda dinamik hisoblash grafikasi mavjud bo'lishi mumkin, ammo bajarilish oqimi odatda sezilarli darajada cheklanadi. Shu bilan biz o'zimizni hech qachon beixtiyor cheksiz ilmoqlarda uchratmasligimiz uchun deyarli kafolatlanganmiz.

Doimiy xotiradan foydalanish. Yuqoridagilar bilan bog'liq holda, biron bir joyda dinamik ravishda ajratilgan xotira yo'q, shuning uchun diskda almashish yoki kodda ovlashga to'g'ri keladigan xotira etishmasligi ehtimoli juda kam.

Bu juda ko'chma. Klassik ikkiliklar yoki skriptlarga nisbatan o'zboshimchalik bilan hisoblash konfiguratsiyalarida matritsa ko'paytirish ketma-ketligi ancha oson.

Bu juda chaqqon. Agar sizda C ++ kodi bo'lsa va kimdir uni ikki baravar tezroq qilishingizni xohlasa (kerak bo'lsa, ishlash narxiga qarab), tizimni yangi namunaga moslashtirish juda oddiy emas. Ammo, dasturiy ta'minot 2.0-da biz o'z tarmog'imizni olamiz, kanallarning yarmini olib tashlaymiz, qayta o'qitamiz va u erda - u aniq ikki baravar tezlikda ishlaydi va biroz yomon ishlaydi. Bu sehr. Aksincha, agar siz ko'proq ma'lumot olish / hisoblashni boshlasangiz, darhol qo'shimcha kanallarni qo'shish va qayta tayyorlash orqali dasturingizni yaxshilay olasiz.

Modullar optimal yaxlitlikka birlashtirilishi mumkin. Bizning dasturiy ta'minotimiz odatda jamoat funktsiyalari, API yoki oxirgi nuqtalar orqali aloqa qiladigan modullarga bo'linadi. Ammo, agar dastlab alohida ishlab chiqilgan ikkita dasturiy ta'minot 2.0 modullari o'zaro ta'sir qilsa, biz ularni osonlikcha orqaga surib qo'yamiz. Veb-sahifalarni yuklashda yuqori samaradorlikka erishish uchun veb-brauzeringiz past darajadagi tizim ko'rsatmalarini avtomatik ravishda 10-chi stack-dizaynni qayta loyihalashtirishi qanchalik ajoyib bo'lishi mumkinligini o'ylab ko'ring. 2.0 bilan bu odatiy xatti-harakatlardir.

Bu sizdan yaxshiroqdir. Va nihoyat, eng muhimi, neyron tarmog'i - bu siz yoki men juda ko'p qiymatga ega bo'lgan vertikal vertikallarning ko'p qismini yig'ishim mumkin bo'lgan narsalarga qaraganda yaxshiroq kodlar to'plamidir, ular hozirgi paytda hech bo'lmaganda rasmlar / video va ovoz / nutq bilan hech qanday aloqasi yo'q. .

Software 2.0 ning cheklashlari

2.0 stack-ning o'ziga xos kamchiliklari ham bor. Optimallashtirish oxirida bizda yaxshi ishlaydigan katta tarmoqlar qoldi, ammo qanday bo'lishini aytish juda qiyin. Ko'pgina dasturlar sohalarida biz 90% aniq modelni yoki 99% aniq modelni tanlashimiz qoladi.

2.0 stack asossiz va xijolatli tarzda muvaffaqiyatsiz bo'lishi mumkin, yoki undan ham yomoni, ular "jimgina muvaffaqiyatsizlikka" olib kelishi mumkin, masalan, o'qitish ma'lumotlariga sukut saqlagan holda, ularning o'lchamlari millionlar ichida osongina topilganda to'g'ri tahlil qilish va tekshirish juda qiyin. ko'p hollarda.

Va nihoyat, biz hali ham ushbu ustunning o'ziga xos xususiyatlarini kashf etmoqdamiz. Masalan, bahsli misollar va hujumlarning mavjudligi ushbu ustunning asossiz ekanligini ta'kidlaydi.

2.0 stekida dasturlash

Dastur 1.0 - bu biz yozadigan kod. Dasturiy ta'minot 2.0 - bu baholash mezoniga asoslangan optimallashtirish orqali yozilgan kod ("o'qitish ma'lumotlarini to'g'ri tasniflash" kabi). Ehtimol, dastur aniq bo'lmagan joyda, lekin uning ishlashini qayta-qayta baholash mumkin bo'lgan biron bir muhit (masalan, siz ba'zi rasmlarni to'g'ri tasnifladingizmi? Go o'yinlarini yutib oldingizmi?) Ushbu o'tish davri o'tishi mumkin, chunki optimallashtirish mumkin inson yozishi mumkin bo'lganidan yaxshiroq kodni toping.

Biz tendentsiyalarni ko'radigan ob'ektiv. Agar siz dasturiy ta'minot 2.0 ni yangi va rivojlanayotgan dasturiy paradigma sifatida tanitsangiz, shunchaki neyron tarmoqlarini mashinalarni o'qitish metodikasi sinfida juda yaxshi klassifikator sifatida ko'rib chiqsangiz, ekstrapolyatsiyalar yanada ravshan bo'lib qoladi va shunda yana ko'p ish qilish kerakligi ayon bo'ladi.

Xususan, biz odamlarga 1.0 kodini yozishda yordam beradigan juda ko'p vositalarni yaratdik, masalan sintaksini ajratib ko'rsatish, disk raskadrovka qiluvchilar, profillar, def to get, git integratsiyasi va boshqalar kabi kuchli IDE. dasturlash ma'lumotlar to'plamlarini to'plash, massaj qilish va tozalash orqali amalga oshiriladi. Masalan, ba'zi bir qiyin yoki kamdan-kam holatlarda tarmoq ishlamay qolganda, biz ushbu bashoratlarni kod yozish orqali tuzatmaymiz, aksincha, ushbu holatlarga ko'proq markalangan misollarni qo'shamiz. Ma'lumotlar to'plamini yig'ish, vizualizatsiya qilish, tozalash, yorliqlash va manbalarni topishda barcha ish oqimlariga yordam beradigan birinchi dasturiy ta'minot 2.0 IDE-larini kim ishlab chiqadi? Ehtimol, IDE tarmoq shubhali misollar yo'qolganligi sababli noto'g'ri tanlangan rasmlarni ko'paytiradi yoki etiketkalarni prognozlar bilan ajratib olishda yordam beradi yoki tarmoqni bashorat qilishning noaniqligi asosida yoritish uchun foydali misollarni taklif qiladi.

Xuddi shunday, Github Software 1.0 kodi uchun juda muvaffaqiyatli uydir. Software 2.0 Github uchun bo'sh joy bormi? Bu holda omborlar ma'lumotlar to'plami bo'lib, teglar qo'shimchalar va tahrirlar asosida tuziladi.

Qisqa / o'rta muddatli istiqbolda, dasturiy ta'minot 2.0 har qanday sohada, takroriy baholash mumkin va arzon bo'lgan va algoritmni aniq loyihalash qiyin bo'lgan joylarda keng tarqalgan. Oxir oqibat, ushbu paradigmaning kelajagi porloq, chunki biz AGIni ishlab chiqishda u Software 2.0-da yozilishi ko'pchilikka ravshan.