Jedi tehnika konvolucionālo tīklu samazināŔanai - atzaroŔana

Jedi tehnika konvolucionālo tīklu samazināŔanai - atzaroŔana

Pirms jums atkal ir uzdevums noteikt objektus. Prioritāte ir darbÄ«bas ātrums ar pieņemamu precizitāti. JÅ«s lietojat YOLOv3 arhitektÅ«ru un turpiniet to apmācÄ«t. Precizitāte (mAp75) ir lielāka par 0.95. Bet skrieÅ”anas ātrums joprojām ir zems. Smuki.

Å odien mēs apiesim kvantÄ“Å”anu. Un mēs skatÄ«simies zem griezuma Modeļa atzaroÅ”ana ā€” lieko tÄ«kla daļu apgrieÅ”ana, lai paātrinātu secinājumu izdarÄ«Å”anu, nezaudējot precizitāti. Ir skaidrs, kur, cik daudz un kā griezt. Izdomāsim, kā to izdarÄ«t manuāli un kur to var automatizēt. Beigās ir krātuve uz keras.

Ievads

IepriekŔējā darba vietā Permā esoÅ”ajā Macroscop ieguvu vienu ieradumu - vienmēr sekot lÄ«dzi algoritmu izpildes laikam. Un vienmēr pārbaudiet tÄ«kla izpildlaiku, izmantojot atbilstÄ«bas filtru. Parasti jaunākās ražoÅ”anas tehnoloÄ£ijas neiztur Å”o filtru, kas mani noveda pie atzaroÅ”anas.

AtzaroÅ”ana ir veca tēma, kas tika apspriesta Stenfordas lekcijas 2017. gadā. Galvenā ideja ir samazināt apmācÄ«tā tÄ«kla izmēru, nezaudējot precizitāti, noņemot dažādus mezglus. Tas izklausās forÅ”i, bet es reti dzirdu par tā izmantoÅ”anu. Iespējams, nav pietiekami daudz implementāciju, nav rakstu krievu valodā vai vienkārÅ”i visi uzskata, ka tas ir apcirpÅ”anas know-how un klusē.
Bet sadalīsim to atseviŔķi

Ieskats bioloģijā

Man patīk, kad Deep Learning aplūko idejas, kas nāk no bioloģijas. Viņiem, tāpat kā evolūcijai, var uzticēties (vai zinājāt, ka ReLU ir ļoti līdzīgs neironu aktivācijas funkcija smadzenēs?)

Modeļu atzaroÅ”anas process ir arÄ« tuvs bioloÄ£ijai. TÄ«kla reakciju Å”eit var salÄ«dzināt ar smadzeņu plastiskumu. Grāmatā ir pāris interesanti piemēri. Normans Doidžs:

  1. Sievietes, kura piedzima tikai ar vienu pusÄ«ti, smadzenes ir pārprogrammējuŔās, lai veiktu trÅ«kstoŔās pusÄ«tes funkcijas.
  2. Puisis noŔāva par redzi atbildÄ«go smadzeņu daļu. Laika gaitā Ŕīs funkcijas pārņēma citas smadzeņu daļas. (mēs nemēģinām atkārtot)

Tāpat no sava modeļa varat izgriezt dažus vājos lÄ«kumus. Kā pēdējais lÄ«dzeklis atlikuÅ”ie saiŔķi palÄ«dzēs aizstāt sagrieztos.

Vai jums patīk Transfer Learning vai jūs mācāties no nulles?

Variants numur viens. JÅ«s izmantojat Transfer Learning vietnē Yolov3. Retina, Mask-RCNN vai U-Net. Bet lielākoties mums nav jāatpazÄ«st 80 objektu klases, piemēram, COCO. Manā praksē viss aprobežojas ar 1.-2.klasi. Varētu pieņemt, ka arhitektÅ«ra 80 klasēm Å”eit ir lieka. Tas liek domāt, ka arhitektÅ«ra ir jāsamazina. Turklāt es vēlētos to darÄ«t, nezaudējot esoÅ”os iepriekÅ” apmācÄ«tos svarus.

Variants numur divi. VarbÅ«t jums ir daudz datu un skaitļoÅ”anas resursu vai jums vienkārÅ”i nepiecieÅ”ama Ä«paÅ”i pielāgota arhitektÅ«ra. Vienalga. Bet jÅ«s apgÅ«stat tÄ«klu no nulles. Parastā procedÅ«ra ir aplÅ«kot datu struktÅ«ru, atlasÄ«t arhitektÅ«ru, kuras jauda ir PĀRĒRÄŖGA, un izstumt no pārkvalificÄ“Å”anās pametuÅ”os. Redzēju 0.6 izkritējus, Kārli.

Abos gadÄ«jumos tÄ«klu var samazināt. Motivēts. Tagad izdomāsim, kāda ir apgraizÄ«Å”anas atzaroÅ”ana

Vispārējs algoritms

Mēs nolēmām, ka varam izņemt saiņus. Tas izskatās pavisam vienkārÅ”i:

Jedi tehnika konvolucionālo tīklu samazināŔanai - atzaroŔana

Jebkuru konvolÅ«ciju noņemÅ”ana rada stresu tÄ«klam, kas parasti izraisa kļūdu pieaugumu. No vienas puses, Å”is kļūdu pieaugums ir rādÄ«tājs tam, cik pareizi mēs noņemam konvolucijas (piemēram, liels pieaugums norāda, ka mēs darām kaut ko nepareizi). Bet neliels pieaugums ir diezgan pieņemams un bieži tiek novērsts ar sekojoÅ”u vieglu papildu apmācÄ«bu ar nelielu LR. Pievienojiet papildu apmācÄ«bas posmu:

Jedi tehnika konvolucionālo tīklu samazināŔanai - atzaroŔana

Tagad mums ir jānoskaidro, kad mēs vēlamies pārtraukt mÅ«su MācÄ«bu<->AtzaroÅ”anas cilpu. Å eit var bÅ«t eksotiskas iespējas, kad mums ir jāsamazina tÄ«kls lÄ«dz noteiktam izmēram un ātrumam (piemēram, mobilajām ierÄ«cēm). Tomēr visizplatÄ«tākā iespēja ir turpināt ciklu, lÄ«dz kļūda kļūst lielāka par pieņemamu. Pievienojiet nosacÄ«jumu:

Jedi tehnika konvolucionālo tīklu samazināŔanai - atzaroŔana

Tātad algoritms kļūst skaidrs. Atliek izdomāt, kā noteikt dzēstos līkumus.

Meklēt izdzēstās pakotnes

Mums ir jānovērÅ” daži satricinājumi. Steidzoties uz priekÅ”u un ā€œnoÅ”autā€ kādu ir slikta ideja, lai gan tas darbosies. Bet, tā kā jums ir galva, varat domāt un mēģināt noņemt noņemÅ”anai "vājus" lÄ«kumus. Ir vairākas iespējas:

  1. Mazākais L1 mērs vai maza lieluma_apgrieÅ”ana. Ideja, ka savērpumi ar maziem svariem maz ietekmē galÄ«go lēmumu
  2. Mazākais L1-mērs, ņemot vērā vidējo un standarta novirzi. Papildinām ar sadalījuma rakstura novērtējumu.
  3. Maskē lÄ«kumus un izslēdz tos, kas vismazāk ietekmē galÄ«go precizitāti. PrecÄ«zāka nenozÄ«mÄ«gu apgriezienu noteikÅ”ana, bet ļoti laikietilpÄ«ga un resursietilpÄ«ga.
  4. Pārējie

Katrai no iespējām ir tiesÄ«bas uz dzÄ«vÄ«bu un savas Ä«stenoÅ”anas iezÄ«mes. Å eit mēs apsveram iespēju ar mazāko L1 pasākumu

Manuāls process YOLOv3

Sākotnējā arhitektÅ«rā ir atlikuÅ”ie bloki. Bet neatkarÄ«gi no tā, cik forÅ”i tie ir dziļajiem tÄ«kliem, tie mums nedaudz traucēs. GrÅ«tÄ«bas ir tādas, ka Å”ajos slāņos nevar izdzēst saskaņojumus ar dažādiem indeksiem:

Jedi tehnika konvolucionālo tīklu samazināŔanai - atzaroŔana

Tāpēc atlasīsim slāņus, no kuriem varam brīvi dzēst saskaņojumus:

Jedi tehnika konvolucionālo tīklu samazināŔanai - atzaroŔana

Tagad izveidosim darba ciklu:

  1. Notiek aktivizācijas augŔupielāde
  2. Izdomājot, cik daudz nogriezt
  3. Izbeidz
  4. 10 laikmetu apguve ar LR=1e-4
  5. TestēŔana

KonvolÅ«ciju izkrauÅ”ana ir noderÄ«ga, lai novērtētu, cik daudz daļas mēs varam noņemt noteiktā posmā. IzkrauÅ”anas piemēri:

Jedi tehnika konvolucionālo tīklu samazināŔanai - atzaroŔana

Mēs redzam, ka gandrÄ«z visur 5% lÄ«kumu ir ļoti zema L1 norma, un mēs varam tos noņemt. Katrā solÄ« Ŕī izkrauÅ”ana tika atkārtota un tika novērtēts, kuras kārtas un cik daudz var izgriezt.

Viss process tika pabeigts 4 soļos (numuri Ŕeit un visur RTX 2060 Super):

Solis mAp75 Parametru skaits, milj TÄ«kla izmērs, mb No sākuma, % DarbÄ«bas laiks, ms ApgraizÄ«Å”anas stāvoklis
0 0.9656 60 241 100 180 Sākot no
1 0.9622 55 218 91 175 5% no visa
2 0.9625 50 197 83 168 5% no visa
3 0.9633 39 155 64 155 15% slāņiem ar 400+ līkumiem
4 0.9555 31 124 51 146 10% slāņiem ar 100+ līkumiem

2. darbÄ«bai tika pievienots viens pozitÄ«vs efekts - 4. partijas izmērs ietilpa atmiņā, kas ievērojami paātrināja papildu apmācÄ«bas procesu.
4. darbÄ«bā process tika apturēts, jo pat ilgstoÅ”a papildu apmācÄ«ba nepaaugstināja mAp75 lÄ«dz vecajām vērtÄ«bām.
Rezultātā mums izdevās paātrināt secinājumu izdarÄ«Å”anu par 15%, samaziniet izmēru par 35% un nezaudē tieÅ”i.

Automatizācija vienkārŔākām arhitektūrām

VienkārŔākām tÄ«kla arhitektÅ«rām (bez nosacÄ«juma pievienoÅ”anas, salikÅ”anas un atlikuÅ”ajiem blokiem) ir pilnÄ«gi iespējams koncentrēties uz visu konvolucionālo slāņu apstrādi un automatizēt konvolÅ«ciju izgrieÅ”anas procesu.

Es Ä«stenoju Å”o iespēju Å”eit.
Tas ir vienkārÅ”i: jums ir nepiecieÅ”ama tikai zaudÄ“Å”anas funkcija, optimizētājs un pakeÅ”u Ä£eneratori:

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)

Ja nepiecieŔams, varat mainīt konfigurācijas parametrus:

{
    "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
}

Turklāt tiek ieviests ierobežojums, kas balstÄ«ts uz standarta novirzi. MērÄ·is ir ierobežot noņemto daļu, izslēdzot lÄ«kumus ar jau ā€œpietiekamiemā€ L1 pasākumiem:

Jedi tehnika konvolucionālo tīklu samazināŔanai - atzaroŔana

Tādējādi mēs ļaujam noņemt tikai vājās konvolÅ«cijas no sadalÄ«jumiem, kas ir lÄ«dzÄ«gi labajam, un neietekmējam noņemÅ”anu no sadalÄ«jumiem, kas lÄ«dzÄ«gi kreisajam:

Jedi tehnika konvolucionālo tīklu samazināŔanai - atzaroŔana

Kad sadalÄ«jums tuvojas normālam, atzaroÅ”anas_standarta_deviācijas_daļas koeficientu var izvēlēties no:

Jedi tehnika konvolucionālo tīklu samazināŔanai - atzaroŔana
Es iesaku pieņemt 2 sigmas. Vai arÄ« varat ignorēt Å”o funkciju, atstājot vērtÄ«bu < 1.0.

Izvade ir tÄ«kla lieluma, zudumu un tÄ«kla izpildlaika diagramma visam testam, normalizēta uz 1.0. Piemēram, Å”eit tÄ«kla izmērs tika samazināts gandrÄ«z 2 reizes, nezaudējot kvalitāti (mazs konvolucionālais tÄ«kls ar 100 XNUMX svaru):

Jedi tehnika konvolucionālo tīklu samazināŔanai - atzaroŔana

BraukŔanas ātrums ir pakļauts normālām svārstībām un praktiski nemainās. Tam ir izskaidrojums:

  1. Konvolūciju skaits mainās no ērta (32, 64, 128) uz videokartēm ne ērtāko - 27, 51 utt. Šeit es varētu kļūdīties, bet visticamāk tam ir ietekme.
  2. ArhitektÅ«ra nav plaÅ”a, bet konsekventa. Samazinot platumu, mēs neietekmējam dziļumu. Tādējādi mēs samazinām slodzi, bet nemainām ātrumu.

Tāpēc uzlabojums izpaudās kā CUDA slodzes samazinājums palaiÅ”anas laikā par 20-30%, bet ne darbÄ«bas laika samazinājums.

Rezultāti

Pārdomāsim. Mēs apsvērām 2 atzaroÅ”anas iespējas - YOLOv3 (kad jāstrādā ar rokām) un tÄ«kliem ar vienkārŔāku arhitektÅ«ru. Redzams, ka abos gadÄ«jumos ir iespējams panākt tÄ«kla izmēra samazināŔanu un paātrinājumu, nezaudējot precizitāti. Rezultāti:

  • Samazinot izmēru
  • Paātrinājuma skrējiens
  • CUDA slodzes samazināŔana
  • Rezultātā videi draudzÄ«gums (Mēs optimizējam skaitļoÅ”anas resursu izmantoÅ”anu nākotnē. Kaut kur ir laimÄ«gs Grēta TÅ«nberga)

Pielikums

  • Pēc atzaroÅ”anas posma varat pievienot kvantÄ“Å”anu (piemēram, ar TensorRT)
  • Tensorflow nodroÅ”ina iespējas zema_lieluma_apgrieÅ”ana. Darbojas.
  • krātuve Vēlos attÄ«stÄ«ties un ar prieku palÄ«dzÄ“Å”u

Avots: www.habr.com

Pievieno komentāru