Jedi tækni til að draga úr flækjunetum - klipping

Jedi tækni til að draga úr flækjunetum - klipping

Áður en þú aftur er verkefnið að greina hluti. Forgangsverkefni er hraði reksturs með viðunandi nákvæmni. Þú tekur YOLOv3 arkitektúrinn og þjálfar hann frekar. Nákvæmni (mAp75) er meiri en 0.95. En hlaupahlutfallið er enn lágt. Djöfull.

Í dag munum við framhjá magngreiningu. Og undir skurðinum munum við skoða Fyrirmynd pruning — klippa óþarfa hluta netkerfisins til að flýta fyrir ályktunum án þess að missa nákvæmni. Það er ljóst hvar, hversu mikið og hvernig á að skera. Við skulum reikna út hvernig á að gera þetta handvirkt og hvar þú getur gert það sjálfvirkt. Í lokin er geymsla á keras.

Inngangur

Á fyrri vinnustað mínum, Macroscop í Perm, tileinkaði ég mér eina vana - að fylgjast alltaf með framkvæmdartíma reikniritanna. Og athugaðu alltaf keyrslutíma netsins í gegnum fullnægjandi síu. Venjulega standast nýjustu tækni í framleiðslu ekki þessa síu, sem leiddi mig til Pruning.

Snyrting er gamalt efni sem rætt var í Stanford fyrirlestrar árið 2017. Meginhugmyndin er að minnka stærð þjálfaðs nets án þess að missa nákvæmni með því að fjarlægja ýmsa hnúta. Það hljómar flott, en ég heyri sjaldan um notkun þess. Líklega eru ekki til nægar útfærslur, engar greinar á rússnesku, eða einfaldlega allir telja það klippa þekkingu og þegja.
En við skulum taka það í sundur

Innsýn í líffræði

Ég elska það þegar Deep Learning skoðar hugmyndir sem koma úr líffræði. Þeim, eins og þróun, er hægt að treysta (vissir þú að ReLU er mjög svipað hlutverk taugafrumnavirkjunar í heilanum?)

Módelklippingarferlið er líka nálægt líffræði. Viðbrögð netsins hér má líkja við mýkt heilans. Það eru nokkur áhugaverð dæmi í bókinni. Norman Doidge:

  1. Heili konu sem fæddist með aðeins einn helming hefur endurforritað sig til að sinna hlutverki þess helmings sem vantar.
  2. Gaurinn skaut af þeim hluta heilans sem ber ábyrgð á sjóninni. Með tímanum tóku aðrir hlutar heilans yfir þessar aðgerðir. (við erum ekki að reyna að endurtaka)

Sömuleiðis geturðu klippt út nokkrar af veiku snúningunum úr líkaninu þínu. Sem síðasta úrræði munu búntarnir sem eftir eru hjálpa til við að skipta um klipptu.

Elskarðu Transfer Learning eða ertu að læra frá grunni?

Valkostur númer eitt. Þú notar Transfer Learning á Yolov3. Retina, Mask-RCNN eða U-Net. En oftast þurfum við ekki að þekkja 80 hlutaflokka eins og í COCO. Á minni æfingu er allt bundið við 1-2 bekk. Gera má ráð fyrir að arkitektúr fyrir 80 flokka sé óþarfi hér. Þetta bendir til þess að gera þurfi arkitektúrinn minni. Þar að auki langar mig til að gera þetta án þess að missa núverandi forþjálfaðar lóðir.

Valkostur númer tvö. Kannski ertu með mikið af gögnum og tölvuauðlindum eða þarft bara ofursérsniðna arkitektúr. Skiptir ekki máli. En þú ert að læra netið frá grunni. Venjulegt verklag er að skoða gagnauppbygginguna, velja arkitektúr sem er OF MIKIL í krafti og ýta brottfalli frá endurmenntun. Ég sá 0.6 brottfall, Karl.

Í báðum tilfellum er hægt að minnka netið. Hvetjandi. Nú skulum við finna út hvers konar umskurður klipping er

Almennt reiknirit

Við ákváðum að við gætum fjarlægt búntana. Það lítur frekar einfalt út:

Jedi tækni til að draga úr flækjunetum - klipping

Það er streituvaldandi fyrir netið að fjarlægja allar samfellingar, sem venjulega leiðir til einhverrar aukningar á villum. Annars vegar er þessi aukning á skekkju vísbending um hversu rétt við fjarlægjum beygjur (til dæmis gefur mikil aukning til kynna að við séum að gera eitthvað rangt). En lítil aukning er alveg ásættanleg og er oft útrýmt með síðari léttri viðbótarþjálfun með litlum LR. Bættu við viðbótarþjálfunarskrefum:

Jedi tækni til að draga úr flækjunetum - klipping

Nú þurfum við að finna út hvenær við viljum stöðva Learning<->Pruning lykkjuna okkar. Það geta verið framandi valkostir hér þegar við þurfum að minnka netið í ákveðna stærð og hraða (til dæmis fyrir farsíma). Hins vegar er algengasti kosturinn að halda hringrásinni áfram þar til villan verður meiri en viðunandi. Bæta við skilyrði:

Jedi tækni til að draga úr flækjunetum - klipping

Þannig að reikniritið verður ljóst. Það er eftir að finna út hvernig á að ákvarða eyddar snúninga.

Leitaðu að eyddum pakka

Við verðum að fjarlægja nokkrar snúningar. Að flýta sér á undan og „skjóta“ hvern sem er er slæm hugmynd, þó það muni virka. En þar sem þú ert með höfuð geturðu hugsað og reynt að velja „veikar“ snúningar til að fjarlægja. Það eru nokkrir valkostir:

  1. Minnsta L1-mæling eða lítill_magnitude_pruning. Hugmyndin um að snúningar með litlum vægi leggi lítið af mörkum til lokaákvörðunar
  2. Minnsta L1-mæling að teknu tilliti til meðaltals og staðalfráviks. Við bætum við með mati á eðli úthlutunar.
  3. Að fela snúninga og útiloka þá sem hafa minnst áhrif á lokanákvæmni. Nákvæmari ákvörðun á óverulegum snúningum, en mjög tímafrekt og auðlindafrekt.
  4. Aðrir

Hver af valkostunum hefur rétt til lífs og eigin útfærslueiginleika. Hér skoðum við möguleikann með minnstu L1-mælingu

Handvirkt ferli fyrir YOLOv3

Upprunalega arkitektúrinn inniheldur leifar af blokkum. En sama hversu flott þau eru fyrir djúp net, munu þau hindra okkur nokkuð. Erfiðleikarnir eru að þú getur ekki eytt afstemmingum með mismunandi vísitölum í þessum lögum:

Jedi tækni til að draga úr flækjunetum - klipping

Þess vegna skulum við velja lög sem við getum frjálslega eytt afstemmingum úr:

Jedi tækni til að draga úr flækjunetum - klipping

Nú skulum við byggja upp vinnulotu:

  1. Hleður upp virkjunum
  2. Að reikna út hversu mikið á að skera
  3. Hættu þessu
  4. Að læra 10 tímabil með LR=1e-4
  5. Prófanir

Afhleðsla snúninga er gagnlegt til að áætla hversu mikinn hluta við getum fjarlægt í ákveðnu skrefi. Dæmi um affermingu:

Jedi tækni til að draga úr flækjunetum - klipping

Við sjáum að næstum alls staðar eru 5% snúninga með mjög lágt L1-norm og við getum fjarlægt þau. Í hverju skrefi var þessi losun endurtekin og lagt mat á hvaða lög og hversu mörg mætti ​​skera út.

Allt ferlið var lokið í 4 skrefum (númer hér og alls staðar fyrir RTX 2060 Super):

Skref mAp75 Fjöldi stika, milljón Stærð nets, mb Frá upphafi, % Hlaupatími, frú Umskurðarástand
0 0.9656 60 241 100 180 -
1 0.9622 55 218 91 175 5% af öllu
2 0.9625 50 197 83 168 5% af öllu
3 0.9633 39 155 64 155 15% fyrir lög með 400+ snúningum
4 0.9555 31 124 51 146 10% fyrir lög með 100+ snúningum

Einum jákvæðum áhrifum var bætt við skref 2 - lotustærð 4 passaði inn í minni, sem flýtti mjög fyrir ferli viðbótarþjálfunar.
Í skrefi 4 var ferlið stöðvað vegna þess jafnvel langtíma viðbótarþjálfun hækkaði mAp75 ekki upp í gömul gildi.
Fyrir vikið tókst okkur að flýta ályktunum um 15%, minnkaðu stærðina um 35% og ekki tapa nákvæmlega.

Sjálfvirkni fyrir einfaldari arkitektúr

Fyrir einfaldari netkerfisarkitektúr (án skilyrtrar viðbótar-, samtengingar- og afgangsblokka) er alveg mögulegt að einbeita sér að því að vinna úr öllum snúningslögum og gera sjálfvirkan ferlið við að klippa út snúninga.

Ég útfærði þennan möguleika hér.
Það er einfalt: þú þarft aðeins tapaðgerð, fínstillingu og lotugjafa:

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)

Ef nauðsyn krefur geturðu breytt stillingarbreytum:

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

Að auki er takmörkun byggð á staðalfráviki innleidd. Markmiðið er að takmarka þann hluta sem er fjarlægður, að undanskildum snúningum með þegar „fullnægjandi“ L1 mælikvarða:

Jedi tækni til að draga úr flækjunetum - klipping

Þannig leyfum við þér að fjarlægja aðeins veikburða snúninga úr dreifingum sem eru svipaðar þeirri hægri og hafa ekki áhrif á fjarlæginguna úr dreifingum svipað þeirri vinstri:

Jedi tækni til að draga úr flækjunetum - klipping

Þegar dreifingin nálgast eðlilega er hægt að velja pruning_standart_deviation_part stuðulinn úr:

Jedi tækni til að draga úr flækjunetum - klipping
Ég mæli með forsendu um 2 sigma. Eða þú getur hunsað þennan eiginleika og skilið gildið eftir < 1.0.

Úttakið er graf yfir netstærð, tap og netkeyrslutíma fyrir allt prófið, staðlað í 1.0. Til dæmis, hér var netstærðin minnkuð um næstum 2 sinnum án þess að tapa gæðum (lítið snúningsnet með 100 þúsund lóðum):

Jedi tækni til að draga úr flækjunetum - klipping

Hlaupshraðinn er háður eðlilegum sveiflum og helst nánast óbreyttur. Það er skýring á þessu:

  1. Fjöldi snúninga breytist úr þægilegum (32, 64, 128) í ekki það þægilegasta fyrir skjákort - 27, 51 o.s.frv. Ég gæti haft rangt fyrir mér hér, en líklega hefur það áhrif.
  2. Arkitektúrinn er ekki breiður, heldur samkvæmur. Með því að minnka breiddina höfum við ekki áhrif á dýptina. Þannig minnkum við álagið en breytum ekki hraðanum.

Þess vegna kom batinn fram í lækkun á CUDA álagi á keyrslu um 20-30%, en ekki í lækkun á keyrslutíma.

Niðurstöður

Við skulum íhuga. Við skoðuðum 2 valkosti til að klippa - fyrir YOLOv3 (þegar þú þarft að vinna með höndum þínum) og fyrir net með einfaldari arkitektúr. Það má sjá að í báðum tilfellum er hægt að ná netstærðarminnkun og hraða án þess að missa af nákvæmni. Niðurstöður:

  • Að minnka stærðina
  • Hröðunarhlaup
  • Að draga úr CUDA álagi
  • Þar af leiðandi umhverfisvænni (Við fínstillum framtíðarnotkun tölvuauðlinda. Einhvers staðar er maður ánægður Greta Thunberg)

Viðauki

  • Eftir klippingarskrefið geturðu bætt við magngreiningu (til dæmis með TensorRT)
  • Tensorflow veitir möguleika fyrir lítill_magnitude_pruning. Virkar.
  • geymsla Ég vil þroskast og mun vera fús til að hjálpa

Heimild: www.habr.com

Bæta við athugasemd