Jedi tehnika za zmanjševanje konvolucijskih mrež – obrezovanje

Jedi tehnika za zmanjševanje konvolucijskih mrež – obrezovanje

Pred vami je spet naloga odkrivanja predmetov. Prioriteta je hitrost delovanja s sprejemljivo natančnostjo. Vzamete arhitekturo YOLOv3 in jo dodatno usposobite. Natančnost (mAp75) je večja od 0.95. Toda stopnja teka je še vedno nizka. Sranje.

Danes bomo obšli kvantizacijo. In pod rezom bomo pogledali Modelno obrezovanje — obrezovanje odvečnih delov omrežja za pospešitev sklepanja brez izgube natančnosti. Jasno je, kje, koliko in kako rezati. Ugotovimo, kako to storiti ročno in kje lahko to avtomatizirate. Na koncu je repozitorij na keras.

Predstavitev

Na prejšnjem delovnem mestu Macroscop v Permu sem pridobil eno navado - vedno spremljati čas izvajanja algoritmov. In vedno preverite čas delovanja omrežja s filtrom ustreznosti. Običajno najsodobnejše v proizvodnji ne prenesejo tega filtra, kar me je pripeljalo do Obrezovanja.

Obrezovanje je stara tema, o kateri se je razpravljalo v Predavanja na Stanfordu leta 2017. Glavna ideja je zmanjšati velikost usposobljenega omrežja brez izgube natančnosti z odstranitvijo različnih vozlišč. Sliši se kul, a le redko slišim o njegovi uporabi. Verjetno ni dovolj implementacij, ni člankov v ruskem jeziku ali preprosto vsi menijo, da je to znanje o obrezovanju in molčijo.
Toda razstavimo ga

Pogled v biologijo

Všeč mi je, ko Deep Learning obravnava ideje, ki prihajajo iz biologije. Tako kot evoluciji jim je mogoče zaupati (ali ste vedeli, da je ReLU zelo podoben funkcija aktivacije nevronov v možganih?)

Tudi postopek modelnega obrezovanja je blizu biologiji. Odziv omrežja tukaj lahko primerjamo s plastičnostjo možganov. V knjigi je nekaj zanimivih primerov. Norman Doidge:

  1. Možgani ženske, ki je bila rojena samo z eno polovico, so se reprogramirali za opravljanje funkcij manjkajoče polovice.
  2. Tip mu je ustrelil del možganov, ki je odgovoren za vid. Sčasoma so te funkcije prevzeli drugi deli možganov. (ne poskušamo ponavljati)

Podobno lahko iz svojega modela izrežete nekaj šibkih zvitkov. V skrajnem primeru bodo preostali svežnji pomagali nadomestiti odrezane.

Vam je všeč Transfer Learning ali se učite iz nič?

Možnost številka ena. Uporabljate Transfer Learning na Yolov3. Retina, Mask-RCNN ali U-Net. Toda večino časa nam ni treba prepoznati 80 objektnih razredov kot v COCO. V moji praksi je vse omejeno na 1.-2. Lahko bi domnevali, da je arhitektura za 80 razredov tukaj odveč. To nakazuje, da je treba arhitekturo zmanjšati. Poleg tega bi rad to naredil, ne da bi izgubil obstoječe predhodno natrenirane uteži.

Možnost številka dve. Morda imate veliko podatkov in računalniških virov ali pa samo potrebujete arhitekturo po meri. Ni važno. Toda omrežja se učite iz nič. Običajni postopek je, da pogledamo podatkovno strukturo, izberemo arhitekturo, ki ima PREVEČNO moč, in potisnemo osipnike iz ponovnega usposabljanja. Videl sem 0.6 osipa, Karl.

V obeh primerih se lahko omrežje zmanjša. Motiviran. Zdaj pa pojdimo ugotoviti, kakšna je vrsta obrezovanja

Splošni algoritem

Odločili smo se, da lahko odstranimo svežnje. Videti je precej preprosto:

Jedi tehnika za zmanjševanje konvolucijskih mrež – obrezovanje

Odstranjevanje kakršnih koli zvitkov je stresno za omrežje, kar običajno povzroči nekaj povečanja napak. Po eni strani je to povečanje napake pokazatelj, kako pravilno odstranimo vijuge (na primer, veliko povečanje kaže, da delamo nekaj narobe). Toda majhno povečanje je povsem sprejemljivo in se pogosto odpravi z naknadnim lahkim dodatnim treningom z majhnim LR. Dodajte dodaten korak usposabljanja:

Jedi tehnika za zmanjševanje konvolucijskih mrež – obrezovanje

Zdaj moramo ugotoviti, kdaj želimo ustaviti našo zanko Učenje<->Obrezovanje. Tukaj so lahko eksotične možnosti, ko moramo omrežje zmanjšati na določeno velikost in hitrost (na primer za mobilne naprave). Vendar je najpogostejša možnost nadaljevanje cikla, dokler napaka ne postane višja od sprejemljive. Dodajte pogoj:

Jedi tehnika za zmanjševanje konvolucijskih mrež – obrezovanje

Torej, algoritem postane jasen. Še vedno je treba ugotoviti, kako določiti izbrisane zavoje.

Iskanje izbrisanih paketov

Odstraniti moramo nekaj zavojev. Hiteti naprej in kogarkoli "ustreliti" je slaba ideja, čeprav bo delovala. Ker pa imate glavo, lahko razmišljate in poskusite izbrati "šibke" zavoje za odstranitev. Obstaja več možnosti:

  1. Najmanjši ukrep L1 ali obrezovanje z nizko_velikostjo. Ideja, da konvolucije z majhnimi utežmi malo prispevajo h končni odločitvi
  2. Najmanjša L1-mera ob upoštevanju povprečja in standardnega odklona. Dopolnjujemo z oceno narave distribucije.
  3. Maskiranje vijug in izločanje tistih, ki najmanj vplivajo na končno natančnost. Natančnejša določitev nepomembnih zvitkov, vendar zelo zamudna in potratna.
  4. Drugo

Vsaka od možnosti ima pravico do življenja in lastne izvedbene značilnosti. Tu upoštevamo možnost z najmanjšim L1-merom

Ročni postopek za YOLOv3

Prvotna arhitektura vsebuje preostale bloke. Toda ne glede na to, kako kul so za globoka omrežja, nas bodo nekoliko ovirali. Težava je v tem, da ne morete izbrisati uskladitev z različnimi indeksi v teh slojih:

Jedi tehnika za zmanjševanje konvolucijskih mrež – obrezovanje

Zato izberimo sloje, iz katerih lahko poljubno brišemo uskladitve:

Jedi tehnika za zmanjševanje konvolucijskih mrež – obrezovanje

Zdaj pa zgradimo delovni cikel:

  1. Nalaganje aktivacij
  2. Ugotavljanje, koliko zmanjšati
  3. Izrezan
  4. Učenje 10 epoh z LR=1e-4
  5. Testiranje

Razkladanje konvolucij je koristno za oceno, koliko delov lahko odstranimo v določenem koraku. Primeri raztovarjanja:

Jedi tehnika za zmanjševanje konvolucijskih mrež – obrezovanje

Vidimo, da ima skoraj povsod 5 % konvolucij zelo nizko L1-normo in jih lahko odstranimo. Na vsakem koraku se je to razkladanje ponovilo in ocenilo, katere plasti in koliko jih je mogoče izrezati.

Celoten postopek je bil zaključen v 4 korakih (številke tukaj in povsod za RTX 2060 Super):

Korak mAp75 Število parametrov, milijon Velikost omrežja, mb Od začetnega, % Čas delovanja, gdč Stanje obrezovanja
0 0.9656 60 241 100 180 -
1 0.9622 55 218 91 175 5% vseh
2 0.9625 50 197 83 168 5% vseh
3 0.9633 39 155 64 155 15 % za plasti s 400+ zavoji
4 0.9555 31 124 51 146 10 % za plasti s 100+ zavoji

Koraku 2 je bil dodan en pozitiven učinek - velikost serije 4 se prilega spominu, kar je močno pospešilo proces dodatnega usposabljanja.
Pri 4. koraku je bil postopek ustavljen, ker tudi dolgotrajno dodatno usposabljanje ni dvignilo mAp75 na stare vrednosti.
Posledično nam je uspelo sklepanje pospešiti za 15%, zmanjšajte velikost za 35% in ne izgubi točno.

Avtomatizacija za enostavnejše arhitekture

Pri enostavnejših mrežnih arhitekturah (brez pogojnega dodajanja, združevanja in preostalih blokov) se je povsem mogoče osredotočiti na obdelavo vseh konvolucijskih plasti in avtomatizirati proces izrezovanja konvolucij.

To možnost sem implementiral tukaj.
Preprosto je: potrebujete samo funkcijo izgube, optimizator in paketne generatorje:

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)

Če je potrebno, lahko spremenite konfiguracijske parametre:

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

Poleg tega je uvedena omejitev na podlagi standardnega odklona. Cilj je omejiti del, ki se odstrani, in izključiti zavoje z že "zadostnimi" merami L1:

Jedi tehnika za zmanjševanje konvolucijskih mrež – obrezovanje

Tako vam omogočamo, da odstranite samo šibke konvolucije iz porazdelitev, podobnih desni, in ne vplivate na odstranitev iz porazdelitev, podobnih levi:

Jedi tehnika za zmanjševanje konvolucijskih mrež – obrezovanje

Ko se porazdelitev približa normalni, lahko koeficient pruning_standart_deviation_part izberete med:

Jedi tehnika za zmanjševanje konvolucijskih mrež – obrezovanje
Priporočam predpostavko 2 sigma. Lahko pa to funkcijo prezrete in pustite vrednost < 1.0.

Rezultat je graf velikosti omrežja, izgube in časa delovanja omrežja za celoten preizkus, normaliziran na 1.0. Na primer, tu se je velikost omrežja zmanjšala za skoraj 2-krat brez izgube kakovosti (majhno konvolucijsko omrežje s 100k utežmi):

Jedi tehnika za zmanjševanje konvolucijskih mrež – obrezovanje

Hitrost teka je podvržena normalnim nihanjem in ostaja skoraj nespremenjena. Za to obstaja razlaga:

  1. Število konvolucij se spreminja od priročnega (32, 64, 128) do ne najbolj priročnega za video kartice - 27, 51 itd. Lahko da se motim, ampak verjetno ima učinek.
  2. Arhitektura ni široka, ampak dosledna. Z zmanjšanjem širine ne vplivamo na globino. Tako zmanjšamo obremenitev, vendar ne spremenimo hitrosti.

Zato se je izboljšanje izrazilo v zmanjšanju obremenitve CUDA med tekom za 20-30 %, ne pa tudi v zmanjšanju časa delovanja.

Rezultati

Razmislimo. Upoštevali smo 2 možnosti za obrezovanje - za YOLOv3 (ko morate delati z rokami) in za omrežja s preprostejšo arhitekturo. Vidimo lahko, da je v obeh primerih mogoče doseči zmanjšanje velikosti omrežja in pospešitev brez izgube natančnosti. Rezultati:

  • Zmanjšanje velikosti
  • Pospeševalni tek
  • Zmanjšanje obremenitve CUDA
  • Posledično prijaznost do okolja (Optimiziramo prihodnjo uporabo računalniških virov. Somewhere one is happy Greta Thunberg)

Dodatek

Vir: www.habr.com

Dodaj komentar