Qo'lda yozilgan chizmalarning tasnifi. Yandex-da hisobot

Bir necha oy oldin, Google'dagi hamkasblarimiz sarflangan Kaggle-da shov-shuvli suratlarda olingan tasvirlar uchun klassifikator yaratish bo'yicha tanlov o'yin "Tezroq, chizing!" “Yandeks” ishlab chiqaruvchisi Roman Vlasovni o‘z ichiga olgan jamoa tanlovda to‘rtinchi o‘rinni egalladi. Yanvar oyidagi mashinani o'rganish bo'yicha treningda Roman o'z jamoasi g'oyalari, tasniflagichning yakuniy amalga oshirilishi va raqiblarining qiziqarli amaliyotlari bilan o'rtoqlashdi.


- Hammaga salom! Mening ismim Roma Vlasov, bugun men sizga Quick, Draw haqida gapirib beraman! Doodle tanib olish sinovi.

Qo'lda yozilgan chizmalarning tasnifi. Yandex-da hisobot

Jamoamizda besh kishi bor edi. Men birlashish muddati tugashidan oldin qo'shildim. Bizga omad kulib boqmadi, biz biroz larzaga tushdik, lekin biz pul pozitsiyasidan, ular esa oltin pozitsiyadan silkitildi. Biz esa faxrli to‘rtinchi o‘rinni egalladik.

(Musobaqa davomida jamoalar taklif etilayotgan ma’lumotlar to‘plamining bir qismida ko‘rsatilgan natijalar asosida tuzilgan reytingda o‘zlarini kuzatishdi. Yakuniy reyting, o‘z navbatida, ma’lumotlar to‘plamining boshqa qismida shakllantirildi. Bu shunday amalga oshiriladi. Musobaqa ishtirokchilari o‘z algoritmlarini aniq ma’lumotlarga moslashtirmasliklari.Shuning uchun final bosqichida reytinglar o‘rtasida almashinishda pozitsiyalar biroz tebranadi (inglizcha shake up – aralashtirishdan): boshqa ma’lumotlar bo‘yicha natija chiqishi mumkin. Roman jamoasi kuchli uchlikdan birinchi bo‘ldi.Bu holda, kuchli uchlik pul, pul reyting zonasi, chunki faqat birinchi uch o‘rin pul mukofoti bilan taqdirlandi.Ko‘tarilishdan keyin jamoa allaqachon o‘rin olgan edi. to'rtinchi o'rin. Xuddi shunday, boshqa jamoa ham g'alabani, oltin o'rnini boy berdi. - Ed.)

Qo'lda yozilgan chizmalarning tasnifi. Yandex-da hisobot

Musobaqaning ahamiyati shundaki, Evgeniy Babaxnin grossmeyster, Ivan Sosin grossmeyster, Roman Solovyov grossmeyster bo'lib qoldi, Aleks Parinov usta bo'ldi, men mutaxassis bo'ldim, endi esa allaqachon ustaman.

Qo'lda yozilgan chizmalarning tasnifi. Yandex-da hisobot

Bu nima Tezkor, Draw? Bu Google xizmati. Google AIni ommalashtirishni maqsad qilgan va bu xizmat yordamida neyron tarmoqlar qanday ishlashini ko'rsatmoqchi edi. Siz u erga borasiz, "Chizamiz" tugmasini bosing va sizga aytilgan yangi sahifa ochiladi: zigzag chizish, buni amalga oshirish uchun sizda 20 soniya bor. Siz 20 soniyada zigzag chizishga harakat qilyapsiz, masalan, bu erda. Agar muvaffaqiyatga erishsangiz, tarmoq zigzag ekanligini aytadi va siz davom etasiz. Bunday rasmlar bor-yo'g'i oltita.

Agar Google tarmog'i siz chizgan narsalarni taniy olmasa, vazifaga xoch qo'yilgan. Keyinchalik men sizga kelajakda chizma tarmoq tomonidan tan olinadimi yoki yo'qmi, bu nimani anglatishini aytaman.

Ushbu xizmat juda ko'p sonli foydalanuvchilarni to'pladi va foydalanuvchilar chizgan barcha rasmlar jurnalga kiritilgan.

Qo'lda yozilgan chizmalarning tasnifi. Yandex-da hisobot

Biz deyarli 50 million tasvirni yig'ishga muvaffaq bo'ldik. Shundan kelib chiqib, musobaqamiz uchun poezd va sinov sanasi shakllantirildi. Aytgancha, testdagi ma'lumotlarning miqdori va sinflar soni biron bir sababga ko'ra qalin harf bilan ta'kidlangan. Ular haqida biroz keyinroq aytib beraman.

Ma'lumotlar formati quyidagicha edi. Bu nafaqat RGB tasvirlari, balki, taxminan, foydalanuvchi qilgan barcha narsalar jurnali. Word - bizning maqsadimiz, mamlakat kodi - dudl muallifi qaerdan, vaqt tamg'asi - vaqt. Taniqli yorliq tarmoqning Google-dan rasmni tanigan-tanmaganligini ko'rsatadi. Chizmaning o'zi esa ketma-ketlik, foydalanuvchi nuqtalar bilan chizadigan egri chiziqning yaqinlashuvidir. Va vaqtlar. Bu rasm chizish boshlangan vaqt.

Qo'lda yozilgan chizmalarning tasnifi. Yandex-da hisobot

Ma'lumotlar ikki formatda taqdim etildi. Bu birinchi format, ikkinchisi esa soddalashtirilgan. Ular vaqtni o'sha erdan kesib tashladilar va bu nuqtalar to'plamini kichikroq nuqtalar to'plami bilan yaqinlashtirdilar. Buning uchun ular foydalandilar Duglas-Peker algoritmi. Sizda oddiygina to'g'ri chiziqqa yaqinlashadigan katta nuqtalar to'plami bor, lekin aslida siz bu chiziqni faqat ikkita nuqta bilan taxmin qilishingiz mumkin. Bu algoritmning g'oyasi.

Ma'lumotlar quyidagicha taqsimlandi. Hamma narsa bir xil, lekin ba'zi bir chetga surib qo'yish mumkin. Muammoni hal qilganimizda, biz unga qaramadik. Asosiysi, haqiqatan ham kam bo'lgan sinflar yo'q edi, biz vaznli namunalar va ma'lumotlardan ortiqcha namuna olishimiz shart emas edi.

Qo'lda yozilgan chizmalarning tasnifi. Yandex-da hisobot

Rasmlar qanday ko'rinishga ega edi? Bu "samolyot" sinfi va undan namunalar tanilgan va tan olinmagan yorliqlar. Ularning nisbati 1 dan 9 gacha bo'lgan. Ko'rib turganingizdek, ma'lumotlar juda shovqinli. Menimcha, bu samolyot. Agar tan olinmaganga qarasangiz, aksariyat hollarda bu shunchaki shovqin. Kimdir hatto "samolyot" ni yozishga harakat qildi, lekin frantsuz tilida.

Aksariyat ishtirokchilar oddiygina katakchalarni oldilar, ushbu qatorlar ketma-ketligidan ma'lumotlarni RGB rasmlari sifatida chizdilar va ularni tarmoqqa tashladilar. Men taxminan xuddi shu tarzda chizdim: men ranglar palitrasini oldim, birinchi qatorni bitta rang bilan chizdim, bu palitraning boshida, oxirgi chiziq boshqa rang bilan, palitraning oxirida va ular orasida. Men bu palitradan foydalanib, hamma joyda interpolyatsiya qildim. Aytgancha, bu birinchi slayddagidek - qora rangda chizganingizdan ko'ra yaxshiroq natija berdi.

Ivan Sosin kabi boshqa jamoa a'zolari rasm chizishda biroz boshqacha yondashuvlarni sinab ko'rishdi. Bir kanal bilan u oddiygina kulrang rasm chizdi, boshqa kanal bilan u har bir zarbani boshidan oxirigacha, 32 dan 255 gacha gradient bilan chizdi va uchinchi kanal bilan 32 dan 255 gacha bo'lgan barcha chiziqlar ustida gradient chizdi.

Yana bir qiziq jihat shundaki, Aleks Parinov tarmoqqa mamlakat kodi yordamida ma'lumot yuklagan.

Qo'lda yozilgan chizmalarning tasnifi. Yandex-da hisobot

Tanlovda foydalaniladigan ko'rsatkich o'rtacha o'rtacha aniqlikdir. Raqobat uchun ushbu ko'rsatkichning mohiyati nimada? Siz uchta predikani berishingiz mumkin, agar bu uchtasida to'g'ri predikat bo'lmasa, siz 0 ni olasiz. Agar to'g'ri bo'lsa, unda uning tartibi hisobga olinadi. Va maqsadli natija sizning bashoratingiz tartibiga bo'lingan holda 1 deb hisoblanadi. Misol uchun, siz uchta bashorat qildingiz va to'g'ri birinchisi, keyin siz 1 ni 1 ga bo'lasiz va 1 ni olasiz. Agar bashoratchi to'g'ri bo'lsa va uning tartibi 2 bo'lsa, 1 ni 2 ga bo'ling, siz 0,5 ni olasiz. Xo'sh, va hokazo.

Qo'lda yozilgan chizmalarning tasnifi. Yandex-da hisobot

Ma'lumotlarni oldindan qayta ishlash bilan - rasmlarni qanday chizish va hokazo - biz biroz qaror qildik. Biz qanday arxitekturalardan foydalanganmiz? Biz PNASNet, SENet kabi yog'li arxitekturalardan va SE-Res-NeXt kabi allaqachon klassik arxitekturalardan foydalanishga harakat qildik, ular tobora ko'proq yangi musobaqalarga kirishmoqda. ResNet va DenseNet ham bor edi.

Qo'lda yozilgan chizmalarning tasnifi. Yandex-da hisobot

Qo'lda yozilgan chizmalarning tasnifi. Yandex-da hisobot

Qo'lda yozilgan chizmalarning tasnifi. Yandex-da hisobot

Biz buni qanday o'rgatganmiz? Biz olgan barcha modellar imagenetda oldindan o'qitilgan. Ko'p ma'lumotlar, 50 million tasvir mavjud bo'lsa-da, lekin baribir, agar siz imagenet-da oldindan o'qitilgan tarmoqni olsangiz, uni noldan o'qiganingizdan ko'ra yaxshiroq natijalarni ko'rsatdi.

Biz qanday o'qitish usullaridan foydalanganmiz? Bu iliq qayta ishga tushirish bilan tavlanish jarayoni, bu haqda biroz keyinroq gaplashaman. Bu men yaqinda o'tkazgan deyarli barcha musobaqalarimda foydalanadigan usul va ular yordamida to'rlarni juda yaxshi mashq qilish, yaxshi minimumga erishish uchun chiqadi.

Qo'lda yozilgan chizmalarning tasnifi. Yandex-da hisobot

Keyingi platoda o'rganish tezligini kamaytiring. Siz tarmoqni o'qitishni boshlaysiz, ma'lum bir o'rganish tezligini o'rnatasiz, uni o'rgatishda davom etasiz va sizning yo'qotishingiz asta-sekin ma'lum bir qiymatga yaqinlashadi. Siz buni tekshirib ko'ring, masalan, o'n davr mobaynida yo'qotish umuman o'zgarmadi. Siz o'rganish tezligini biroz pasaytirasiz va o'rganishni davom ettirasiz. U yana bir oz pasayadi, minimal darajada yaqinlashadi va siz o'rganish tezligini yana pasaytirasiz va hokazo, sizning tarmog'ingiz nihoyat birlashmaguncha.

Keyingi qiziqarli usul: o'rganish tezligini pasaytirmang, to'plam hajmini oshiring. Xuddi shu nomdagi maqola bor. Tarmoqni o'rgatganingizda, o'rganish tezligini kamaytirishingiz shart emas, shunchaki paket hajmini oshirishingiz mumkin.

Aytgancha, bu usul Aleks Parinov tomonidan ishlatilgan. U 408 ga teng bo'lgan partiyadan boshladi va uning tarmog'i qandaydir platoga yetganda, u shunchaki partiya hajmini ikki baravar oshirdi va hokazo.

Darhaqiqat, uning partiya hajmi qanday qiymatga erishganini eslay olmayman, lekin qiziq tomoni shundaki, Kaggle’da bir xil texnikani qo‘llagan jamoalar bor edi, ularning partiya hajmi 10000 XNUMX ga yaqin edi.Aytgancha, chuqur o‘rganish uchun zamonaviy ramkalar, masalan. Masalan, PyTorch buni juda oson qilish imkonini beradi. Siz to'plamingizni yaratasiz va uni tarmoqqa avvalgidek emas, to'liqligicha yuborasiz, lekin uni video kartangizga mos kelishi uchun bo'laklarga bo'lasiz, gradientlarni hisoblang va butun partiya uchun gradientni hisoblab chiqqandan so'ng, yangilang. og'irliklar.

Aytgancha, katta partiya o'lchamlari hali ham ushbu tanlovga kiritilgan, chunki ma'lumotlar juda shovqinli edi va katta partiya hajmi gradientni aniqroq taxmin qilishga yordam berdi.

Pseudo-yorliqlash ham qo'llanilgan, asosan Roman Solovyov tomonidan ishlatilgan. U sinovdan olingan ma'lumotlarning qariyb yarmini partiyalarda namuna oldi va bunday to'plamlarda tarmoqni o'rgatdi.

Rasmlarning o'lchami muhim edi, lekin haqiqat shundaki, sizda juda ko'p ma'lumotlar bor, siz uzoq vaqt mashq qilishingiz kerak va agar sizning rasmingiz o'lchami juda katta bo'lsa, unda siz juda uzoq vaqt mashq qilasiz. Ammo bu sizning yakuniy klassifikatoringiz sifatiga ko'p qo'shilmadi, shuning uchun qandaydir savdo-sotiqdan foydalanishga arziydi. Va biz faqat o'lchami unchalik katta bo'lmagan rasmlarni sinab ko'rdik.

Bularning barchasi qanday o'rganildi? Birinchidan, kichik o'lchamdagi suratlar olindi, ular ustida bir necha davrlar o'tkazildi, bu juda ko'p vaqtni oldi. Keyin katta o'lchamdagi rasmlar berildi, tarmoqni o'rgatdi, keyin uni noldan o'rgatmaslik va ko'p vaqtni behuda sarf qilmaslik uchun undan ham ko'proq, undan ham ko'proq.

Optimizatorlar haqida. Biz SGD va Adam dan foydalandik. Shu tarzda umumiy peshqadamlar jadvalida 0,941-0,946 tezlikni bergan yagona modelni olish mumkin edi, bu juda yaxshi.

Agar siz modellarni qandaydir tarzda birlashtirsangiz, siz 0,951 atrofida bir joyga erishasiz. Agar siz yana bitta texnikadan foydalansangiz, xuddi bizda bo'lgani kabi, umumiy taxtada yakuniy 0,954 ball olasiz. Ammo bu haqda keyinroq. Keyinchalik men sizga modellarni qanday yig'ganimizni va bunday yakuniy tezlikka qanday erishganimizni aytib beraman.

Keyin men issiq qayta ishga tushirishlar bilan tavlanish jarayoni yoki issiq qayta ishga tushirish bilan stokastik gradient tushishi haqida gaplashmoqchiman. Taxminan aytganda, siz har qanday optimallashtiruvchidan foydalanishingiz mumkin, ammo gap shundaki: agar siz bitta tarmoqni o'rgatsangiz va u asta-sekin minimal darajaga yaqinlashsa, hamma narsa yaxshi, siz bitta tarmoqqa ega bo'lasiz, u ma'lum xatolarga yo'l qo'yadi, lekin siz uni biroz boshqacha o'rgatishi mumkin. Siz boshlang'ich o'rganish tezligini o'rnatasiz va uni ushbu formulaga muvofiq asta-sekin pasaytirasiz. Siz uni pasaytirasiz, tarmoqingiz minimal darajaga tushadi, keyin siz og'irliklarni saqlaysiz va yana mashg'ulot boshida bo'lgan o'rganish tezligini o'rnatasiz, shu bilan bu minimaldan yuqoriga ko'tariladi va yana o'rganish tezligini pasaytirasiz.

Shunday qilib, siz bir vaqtning o'zida bir nechta minimal darajalarga tashrif buyurishingiz mumkin, bunda sizning yo'qotishingiz ortiqcha yoki minus bir xil bo'ladi. Ammo haqiqat shundaki, bunday og'irliklarga ega tarmoqlar sizning sanada turli xil xatolar beradi. Ularni o'rtacha hisoblab, siz qandaydir taxminlarga ega bo'lasiz va tezligingiz yuqori bo'ladi.

Qo'lda yozilgan chizmalarning tasnifi. Yandex-da hisobot

Modellarimizni qanday yig'ganimiz haqida. Taqdimot boshida testdagi ma’lumotlar miqdori va darslar soniga e’tibor berishni aytdim. Agar siz test to'plamidagi maqsadlar soniga 1 ni qo'shsangiz va sinflar soniga bo'lsangiz, siz 330 raqamini olasiz va bu forumda yozilgan - testdagi sinflar muvozanatli. Bu foydalanish mumkin edi.

Shunga asoslanib, Roman Solovyov ko'rsatkichni o'ylab topdi, biz uni Proksi-skor deb nomladik, bu peshqadamlar jadvali bilan juda yaxshi bog'liq edi. Gap shundaki: siz bashorat qilasiz, bashorat qiluvchilaringizning birinchi 1 tasini olasiz va har bir sinf uchun ob'ektlar sonini hisoblaysiz. Keyin har bir qiymatdan 330 ni ayiring va natijada olingan mutlaq qiymatlarni qo'shing.

Quyidagi qiymatlar olindi. Bu bizga sinchkovlik reytingini yaratishga emas, balki mahalliy darajada tasdiqlashga va ansambllarimiz uchun koeffitsientlarni tanlashga yordam berdi.

Ansambl bilan siz bunday tezlikni olishingiz mumkin. Yana nima qila olardim? Aytaylik, siz testdagi sinflar muvozanatli ekanligi haqidagi ma'lumotdan foydalandingiz.

Muvozanat boshqacha edi. Ulardan biriga misol — birinchi o'rinni egallagan yigitlardan muvozanat.

Biz nima qildik? Bizning muvozanatimiz juda oddiy edi, buni Evgeniy Babaxnin taklif qildi. Biz birinchi navbatda bashoratlarimizni birinchi o‘ringa ko‘ra saralab oldik va ulardan nomzodlarni tanladik - sinflar soni 1 dan oshmasligi uchun. Lekin ba'zi sinflar uchun 330 dan kam bashoratchiga ega bo‘lasiz. Mayli, keling, eng yaxshi 330 va eng yaxshi 2 ta bo‘yicha ham saralab olaylik. , va biz ham nomzodlarni tanlaymiz.

Bizning muvozanatimiz birinchi o'rindagi muvozanatdan qanday farq qildi? Ular iterativ yondashuvdan foydalanganlar, eng ommabop sinfni olishgan va u eng mashhur sinf bo'lmaguncha, bu sinf uchun ehtimolliklarni kichik songa kamaytirishgan. Biz keyingi eng mashhur sinfni oldik. Shunday qilib, ular barcha sinflar soni teng bo'lgunga qadar ularni tushirishda davom etdilar.

Poezd tarmoqlari uchun hamma ortiqcha yoki minus bitta yondashuvdan foydalangan, ammo hamma ham muvozanatdan foydalanmagan. Balanslashdan foydalanib, siz oltinga kirishingiz mumkin, agar omadingiz bo'lsa, pulga.

Qanday qilib sanani oldindan qayta ishlash kerak? Hamma bir xil tarzda sanani, plyus yoki minusni oldindan qayta ishladi - qo'lda ishlangan funksiyalarni yasash, vaqtni turli xil ranglar bilan kodlashga harakat qilish va hokazo. Bu haqda 8-o'rinni egallagan Aleksey Nozdrin-Plotnitskiy gapirdi.

Qo'lda yozilgan chizmalarning tasnifi. Yandex-da hisobot

U buni boshqacha qildi. U sizning qo'lda ishlangan barcha xususiyatlaringiz ishlamaydi, buni qilishingiz shart emas, sizning tarmog'ingiz bularning barchasini o'z-o'zidan o'rganishi kerakligini aytdi. Buning o'rniga, u sizning ma'lumotlaringizni oldindan qayta ishlaydigan o'quv modullarini ishlab chiqdi. U dastlabki ma'lumotlarni ularga oldindan ishlov bermasdan tashladi - nuqta koordinatalari va vaqtlari.

Keyin u koordinatalar asosida farqni oldi va vaqtlar asosida hammasini o'rtacha hisobladi. Va u ancha uzun matritsani o'ylab topdi. U 1xn o'lchamdagi matritsani olish uchun unga bir necha marta 64D konvolyutsiyani qo'lladi, bu erda n - umumiy nuqtalar soni va natijada olingan matritsani kanallar sonini qabul qiladigan har qanday konvolyutsion tarmoq qatlamiga berish uchun 64 amalga oshiriladi. - 64. u 64xn matritsani oldi, undan keyin kanallar soni 64 ga teng bo'lishi uchun qandaydir o'lchamdagi tenzorni yaratish kerak edi. 0x32 o'lchamdagi tensor. Nima uchun u 32x32 ni xohlayotganini bilmayman, shunchaki shunday bo'ldi. Va bu koordinatada u 32xn o'lchamdagi ushbu matritsaning bir qismini joylashtirdi. Shunday qilib, u 32x64x32 tensor bilan yakunlandi, uni konvolyutsion neyron tarmog'ingizga qo'yish mumkin. Aytmoqchi bo‘lganim shu edi.

Manba: www.habr.com

a Izoh qo'shish