Konvolyutsion tarmoqlarni qisqartirish uchun Jedi texnikasi - kesish

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:

  1. Faqat bir yarmi bilan tug'ilgan ayolning miyasi etishmayotgan yarmining funktsiyalarini bajarish uchun o'zini qayta dasturlashtirgan.
  2. 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:

Konvolyutsion tarmoqlarni qisqartirish uchun Jedi texnikasi - kesish

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:

Konvolyutsion tarmoqlarni qisqartirish uchun Jedi texnikasi - kesish

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:

Konvolyutsion tarmoqlarni qisqartirish uchun Jedi texnikasi - kesish

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:

  1. Eng kichik L1-o'lchov yoki past_katta_qirqish. Kichkina og'irlikdagi konvolyutsiyalar yakuniy qarorga ozgina hissa qo'shadigan fikr
  2. Eng kichik L1 - o'rtacha va standart og'ishlarni hisobga olgan holda o'lchov. Biz taqsimotning tabiatini baholash bilan to'ldiramiz.
  3. Konvolyutsiyalarni niqoblash va yakuniy aniqlikka eng kam ta'sir qiladiganlarni istisno qilish. Ahamiyatsiz konvolyutsiyalarni aniqroq aniqlash, lekin juda ko'p vaqt va resurslarni talab qiladi.
  4. boshqa

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:

Konvolyutsion tarmoqlarni qisqartirish uchun Jedi texnikasi - kesish

Shuning uchun, keling, yarashuvlarni erkin o'chirib tashlashimiz mumkin bo'lgan qatlamlarni tanlaylik:

Konvolyutsion tarmoqlarni qisqartirish uchun Jedi texnikasi - kesish

Endi ish tsiklini tuzamiz:

  1. Aktivatsiyalar yuklanmoqda
  2. Qancha kesish kerakligini aniqlash
  3. Uni kesib tashlang
  4. LR=10e-1 bilan 4 ta davrni o'rganish
  5. Sinov

Konvolyutsiyalarni tushirish ma'lum bir bosqichda qancha qismni olib tashlashimiz mumkinligini taxmin qilish uchun foydalidir. Yukni tushirish misollari:

Konvolyutsion tarmoqlarni qisqartirish uchun Jedi texnikasi - kesish

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:

Konvolyutsion tarmoqlarni qisqartirish uchun Jedi texnikasi - kesish

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:

Konvolyutsion tarmoqlarni qisqartirish uchun Jedi texnikasi - kesish

Tarqatish me'yorga yaqinlashganda, kesish_standart_deviatsiya_qismi koeffitsienti quyidagilardan tanlanishi mumkin:

Konvolyutsion tarmoqlarni qisqartirish uchun Jedi texnikasi - kesish
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):

Konvolyutsion tarmoqlarni qisqartirish uchun Jedi texnikasi - kesish

Yugurish tezligi odatdagi tebranishlarga bog'liq va deyarli o'zgarmaydi. Buning uchun tushuntirish mavjud:

  1. 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.
  2. 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)
  • Tensorflow imkoniyatlarini taqdim etadi past_katta_qirqish. Ishlar.
  • ombori Men rivojlanishni xohlayman va yordam berishdan xursand bo'laman

Manba: www.habr.com

a Izoh qo'shish