Konvolyutsion tarmoqlarni qisqartirish uchun Jedi texnikasi - kesish
Sizning oldingizda yana ob'ektlarni aniqlash vazifasi turibdi. Maqbul aniqlik bilan ishlash tezligi ustuvor hisoblanadi. Siz YOLOv3 arxitekturasini olasiz va uni yanada o'rgatasiz. Aniqlik (mAp75) 0.95 dan katta. Ammo yugurish darajasi hali ham past. Axlat.
Bugun biz kvantlashni chetlab o'tamiz. Va kesma ostida biz qaraymiz Modelni kesish — aniqlikni yo'qotmasdan xulosa chiqarishni tezlashtirish uchun tarmoqning ortiqcha qismlarini kesish. Qaerda, qancha va qanday qilib kesish kerakligi aniq. Keling, buni qo'lda qanday qilishni va uni qaerda avtomatlashtirishni aniqlaylik. Oxirida keras bo'yicha ombor mavjud.
kirish
Oldingi ish joyimda, Permdagi Macroscopda men bitta odatga ega bo'ldim - har doim algoritmlarni bajarish vaqtini kuzatib borish. Va har doim tarmoq ish vaqtini etarlilik filtri orqali tekshiring. Odatda ishlab chiqarishda eng so'nggi texnologiyalar bu filtrdan o'tmaydi, bu meni Azizilloga olib keldi.
Azizillo - bu muhokama qilingan eski mavzu Stenford ma'ruzalari 2017 yilda. Asosiy g'oya - turli tugunlarni olib tashlash orqali aniqlikni yo'qotmasdan o'qitilgan tarmoq hajmini kamaytirishdir. Bu ajoyib tuyuladi, lekin men uning ishlatilishi haqida kamdan-kam eshitaman. Ehtimol, amalga oshirishlar etarli emas, rus tilidagi maqolalar yo'q yoki hamma buni nou-xauni kesish deb hisoblaydi va jim qoladi.
Ammo keling, uni ajratib olaylik
Biologiyaga bir qarash
Deep Learning biologiyadan kelib chiqadigan g'oyalarni ko'rib chiqsa, menga yoqadi. Ularga, evolyutsiya kabi, ishonish mumkin (siz ReLU ga juda o'xshashligini bilarmidingiz miyadagi neyronlarning faollashuvi funktsiyasi?)
Model Azizillo jarayoni ham biologiyaga yaqin. Bu erda tarmoqning javobini miyaning plastikligi bilan solishtirish mumkin. Kitobda bir nechta qiziqarli misollar mavjud. Norman Doidj:
Faqat bir yarmi bilan tug'ilgan ayolning miyasi etishmayotgan yarmining funktsiyalarini bajarish uchun o'zini qayta dasturlashtirgan.
Yigit miyasining ko'rish uchun javob beradigan qismini otib tashladi. Vaqt o'tishi bilan miyaning boshqa qismlari bu funktsiyalarni o'z zimmasiga oldi. (takrorlashga urinmayapmiz)
Xuddi shunday, siz modelingizdan ba'zi zaif konvolyutsiyalarni kesib tashlashingiz mumkin. Oxirgi chora sifatida, qolgan to'plamlar kesilganlarni almashtirishga yordam beradi.
Transfer o'rganishni yaxshi ko'rasizmi yoki noldan o'rganyapsizmi?
Birinchi variant. Siz Yolov3 da Transfer Learning dasturidan foydalanasiz. Retina, Mask-RCNN yoki U-Net. Ammo ko'pincha COCOdagi kabi 80 ta ob'ekt sinfini tan olishimiz shart emas. Mening amaliyotimda hamma narsa 1-2 sinflar bilan cheklangan. Bu erda 80 sinf uchun arxitektura ortiqcha deb taxmin qilish mumkin. Bu arxitekturani kichikroq qilish kerakligini ko'rsatadi. Bundan tashqari, men buni oldindan tayyorlangan og'irliklarni yo'qotmasdan qilishni xohlayman.
Ikkinchi variant. Ehtimol, sizda juda ko'p ma'lumotlar va hisoblash resurslari mavjud yoki shunchaki o'ta moslashtirilgan arxitektura kerak. Muhim emas. Lekin siz tarmoqni noldan o'rganyapsiz. Odatdagi protsedura ma'lumotlar tuzilmasini ko'rib chiqish, kuchga ega bo'lgan arxitekturani tanlash va qayta tayyorlashdan voz kechishdir. Men 0.6 ta maktabni tashlab ketishni ko'rdim, Karl.
Ikkala holatda ham tarmoqni qisqartirish mumkin. Motivatsiya qilingan. Keling, sunnatni kesish qanday ekanligini aniqlaylik
Umumiy algoritm
Biz to'plamlarni olib tashlashga qaror qildik. Bu juda oddiy ko'rinadi:
Har qanday konvolyutsiyani olib tashlash tarmoq uchun stressdir, bu odatda xatoning biroz oshishiga olib keladi. Bir tomondan, xatoning bu o'sishi konvolyutsiyalarni qanchalik to'g'ri olib tashlashimizning ko'rsatkichidir (masalan, katta o'sish biz noto'g'ri ish qilayotganimizni ko'rsatadi). Ammo kichik o'sish juda maqbuldir va ko'pincha kichik LR bilan keyingi engil qo'shimcha mashg'ulotlar orqali yo'q qilinadi. Qo'shimcha trening bosqichini qo'shing:
Endi biz Learning<->Pruning loopimizni qachon to'xtatmoqchi ekanligimizni aniqlashimiz kerak. Tarmoqni ma'lum hajm va tezlikka (masalan, mobil qurilmalar uchun) kamaytirishimiz kerak bo'lganda, bu erda ekzotik variantlar bo'lishi mumkin. Biroq, eng keng tarqalgan variant - xato maqbul darajadan yuqori bo'lgunga qadar tsiklni davom ettirishdir. Shart qo'shing:
Shunday qilib, algoritm aniq bo'ladi. O'chirilgan konvolyutsiyalarni qanday aniqlashni aniqlash qoladi.
O'chirilgan to'plamlarni qidiring
Biz ba'zi konvolyutsiyalarni olib tashlashimiz kerak. Oldinga shoshilish va har kimni "otish" yomon fikr, garchi u ishlaydi. Ammo sizning boshingiz borligi sababli, siz o'ylashingiz va olib tashlash uchun "zaif" konvolyutsiyalarni tanlashga harakat qilishingiz mumkin. Bir nechta variant mavjud:
Variantlarning har biri yashash huquqiga va o'zining amalga oshirish xususiyatlariga ega. Bu erda biz eng kichik L1-o'lchov bilan variantni ko'rib chiqamiz
YOLOv3 uchun qo'lda ishlov berish
Asl arxitekturada qoldiq bloklar mavjud. Ammo ular chuqur tarmoqlar uchun qanchalik ajoyib bo'lmasin, ular bizga biroz to'sqinlik qiladi. Qiyinchilik shundaki, siz ushbu qatlamlardagi turli indekslar bilan solishtirishlarni o'chira olmaysiz:
Shuning uchun, keling, yarashuvlarni erkin o'chirib tashlashimiz mumkin bo'lgan qatlamlarni tanlaylik:
Endi ish tsiklini tuzamiz:
Aktivatsiyalar yuklanmoqda
Qancha kesish kerakligini aniqlash
Uni kesib tashlang
LR=10e-1 bilan 4 ta davrni o'rganish
Sinov
Konvolyutsiyalarni tushirish ma'lum bir bosqichda qancha qismni olib tashlashimiz mumkinligini taxmin qilish uchun foydalidir. Yukni tushirish misollari:
Biz deyarli hamma joyda konvolyutsiyalarning 5% juda past L1-normaga ega ekanligini ko'ramiz va biz ularni olib tashlashimiz mumkin. Har bir bosqichda bu tushirish takrorlandi va qaysi qatlamlarni va qanchasini kesish mumkinligi baholandi.
Butun jarayon 4 bosqichda yakunlandi (RTX 2060 Super uchun bu erda va hamma joyda raqamlar):
Qadam
mAp75
Parametrlar soni, million
Tarmoq hajmi, mb
Dastlabki vaqtdan, %
Ish vaqti, ms
Sunnat holati
0
0.9656
60
241
100
180
-
1
0.9622
55
218
91
175
Hammasidan 5%
2
0.9625
50
197
83
168
Hammasidan 5%
3
0.9633
39
155
64
155
15+ konvolyutsiyaga ega qatlamlar uchun 400%
4
0.9555
31
124
51
146
10+ konvolyutsiyaga ega qatlamlar uchun 100%
2-bosqichga bitta ijobiy effekt qo'shildi - 4-to'plam hajmi xotiraga sig'di, bu qo'shimcha mashg'ulotlar jarayonini sezilarli darajada tezlashtirdi.
4-bosqichda jarayon to'xtatildi, chunki hatto uzoq muddatli qo'shimcha ta'lim mAp75 ni eski qiymatlarga ko'tarmadi.
Natijada, biz xulosa chiqarishni tezlashtirishga muvaffaq bo'ldik 15%, tomonidan hajmini kamaytiring 35% va aniq yo'qotmang.
Oddiy arxitekturalar uchun avtomatlashtirish
Oddiyroq tarmoq arxitekturalari uchun (shartli qo'shimchalar, birlashtiruvchi va qoldiq bloklarsiz) barcha konvolyutsion qatlamlarni qayta ishlashga e'tibor qaratish va konvolyutsiyalarni kesish jarayonini avtomatlashtirish mumkin.
Men bu variantni amalga oshirdim shu yerda.
Hammasi oddiy: sizga faqat yo'qotish funktsiyasi, optimallashtiruvchi va ommaviy generatorlar kerak:
import pruning
from keras.optimizers import Adam
from keras.utils import Sequence
train_batch_generator = BatchGenerator...
score_batch_generator = BatchGenerator...
opt = Adam(lr=1e-4)
pruner = pruning.Pruner("config.json", "categorical_crossentropy", opt)
pruner.prune(train_batch, valid_batch)
Agar kerak bo'lsa, siz konfiguratsiya parametrlarini o'zgartirishingiz mumkin:
{
"input_model_path": "model.h5",
"output_model_path": "model_pruned.h5",
"finetuning_epochs": 10, # the number of epochs for train between pruning steps
"stop_loss": 0.1, # loss for stopping process
"pruning_percent_step": 0.05, # part of convs for delete on every pruning step
"pruning_standart_deviation_part": 0.2 # shift for limit pruning part
}
Bundan tashqari, standart og'ishlarga asoslangan cheklov amalga oshiriladi. Maqsad, "etarli" L1 o'lchovlari bilan konvolyutsiyalarni hisobga olmaganda, olib tashlangan qismni cheklashdir:
Shunday qilib, biz sizga o'ngga o'xshash taqsimotlardan faqat zaif konvolyutsiyalarni olib tashlashga ruxsat beramiz va chapga o'xshash taqsimotlardan olib tashlashga ta'sir qilmaymiz:
Tarqatish me'yorga yaqinlashganda, kesish_standart_deviatsiya_qismi koeffitsienti quyidagilardan tanlanishi mumkin:
Men 2 sigma taxminini tavsiya qilaman. Yoki <1.0 qiymatini qoldirib, bu xususiyatni e'tiborsiz qoldirishingiz mumkin.
Chiqish 1.0 ga normallashtirilgan butun test uchun tarmoq o'lchami, yo'qolishi va tarmoq ish vaqtining grafigi. Masalan, bu erda tarmoq hajmi sifatni yo'qotmasdan deyarli 2 baravar qisqartirildi (100 ming og'irlikdagi kichik konvolyutsion tarmoq):
Yugurish tezligi odatdagi tebranishlarga bog'liq va deyarli o'zgarmaydi. Buning uchun tushuntirish mavjud:
Konvolyutsiyalar soni qulay (32, 64, 128) dan video kartalar uchun eng qulay bo'lmaganga - 27, 51 va boshqalarga o'zgaradi. Men bu erda noto'g'ri bo'lishim mumkin, lekin ehtimol bu ta'sir qiladi.
Arxitektura keng emas, lekin izchil. Kenglikni kamaytirish orqali biz chuqurlikka ta'sir qilmaymiz. Shunday qilib, biz yukni kamaytiramiz, lekin tezlikni o'zgartirmaymiz.
Shunday qilib, yaxshilanish ish paytida CUDA yukining 20-30% ga kamayishi bilan ifodalangan, ammo ish vaqtining qisqarishida emas.
natijalar
Keling, mulohaza yuritaylik. Biz kesishning ikkita variantini ko'rib chiqdik - YOLOv2 uchun (siz qo'llaringiz bilan ishlashingiz kerak bo'lganda) va oddiyroq arxitekturali tarmoqlar uchun. Ko'rinib turibdiki, ikkala holatda ham aniqlikni yo'qotmasdan tarmoq hajmini kamaytirish va tezlashtirishga erishish mumkin. Natijalar:
O'lchamni kamaytirish
Tezlashtirish yugurish
CUDA yukini kamaytirish
Natijada, atrof-muhitga do'stlik (Biz hisoblash resurslaridan kelajakda foydalanishni optimallashtiramiz. Qayerdadir baxtli Greta Tunberg)
ilova
Azizillo bosqichidan so'ng siz kvantlashni qo'shishingiz mumkin (masalan, TensorRT bilan)