Jedi mbinu kwa ajili ya kupunguza mitandao convolutional - kupogoa

Jedi mbinu kwa ajili ya kupunguza mitandao convolutional - kupogoa

Kabla ya wewe tena ni kazi ya kuchunguza vitu. Kipaumbele ni kasi ya operesheni na usahihi unaokubalika. Unachukua usanifu wa YOLOv3 na kuifunza zaidi. Usahihi(mAp75) ni kubwa kuliko 0.95. Lakini kiwango cha kukimbia bado ni cha chini. Crap.

Leo tutakwepa quantization. Na chini ya kukata tutaangalia Kupogoa kwa Mfano β€” kupunguza sehemu zisizohitajika za mtandao ili kuharakisha Makisio bila kupoteza usahihi. Ni wazi wapi, ni kiasi gani na jinsi ya kukata. Wacha tujue jinsi ya kufanya hivyo kwa mikono na wapi unaweza kuibadilisha. Mwishoni kuna hazina kwenye keras.

Utangulizi

Katika sehemu yangu ya awali ya kazi, Macroscop huko Perm, nilipata tabia moja - kufuatilia kila wakati wakati wa utekelezaji wa algorithms. Na kila wakati angalia wakati wa kukimbia wa mtandao kupitia kichujio cha utoshelevu. Kawaida ya hali ya juu katika uzalishaji haipitishi chujio hiki, ambacho kiliniongoza kwa Kupogoa.

Kupogoa ni mada ya zamani ambayo ilijadiliwa ndani mihadhara ya Stanford mwaka 2017. Wazo kuu ni kupunguza ukubwa wa mtandao uliofunzwa bila kupoteza usahihi kwa kuondoa nodes mbalimbali. Inaonekana ni nzuri, lakini mara chache sisikia juu ya matumizi yake. Labda, hakuna utekelezaji wa kutosha, hakuna nakala za lugha ya Kirusi, au kila mtu anaichukulia kama kupogoa ujuzi na kukaa kimya.
Lakini wacha tuitenganishe

Mtazamo wa kibiolojia

Ninaipenda wakati Kujifunza kwa Kina kunapoangalia mawazo yanayotokana na biolojia. Wao, kama mageuzi, wanaweza kuaminiwa (ulijua kuwa ReLU inafanana sana na kazi ya uanzishaji wa neuroni katika ubongo?)

Mchakato wa Kupogoa Mfano pia uko karibu na biolojia. Majibu ya mtandao hapa yanaweza kulinganishwa na plastiki ya ubongo. Kuna mifano michache ya kuvutia katika kitabu. Norman Doidge:

  1. Ubongo wa mwanamke aliyezaliwa na nusu moja tu umejipanga upya kufanya kazi za nusu iliyopotea.
  2. Jamaa huyo alipiga risasi sehemu ya ubongo wake inayohusika na maono. Baada ya muda, sehemu nyingine za ubongo zilichukua kazi hizi. (hatujaribu kurudia)

Vivyo hivyo, unaweza kukata baadhi ya mabadiliko dhaifu kutoka kwa mfano wako. Kama suluhisho la mwisho, vifurushi vilivyobaki vitasaidia kuchukua nafasi ya zile zilizokatwa.

Je, unapenda Mafunzo ya Kuhamisha au unajifunza kutoka mwanzo?

Chaguo namba moja. Unatumia Transfer Learning kwenye Yolov3. Retina, Mask-RCNN au U-Net. Lakini mara nyingi hatuhitaji kutambua madarasa 80 ya vitu kama katika COCO. Katika mazoezi yangu, kila kitu ni mdogo kwa darasa la 1-2. Mtu anaweza kudhani kuwa usanifu wa madarasa 80 hauhitajiki hapa. Hii inaonyesha kwamba usanifu unahitaji kufanywa mdogo. Kwa kuongezea, ningependa kufanya hivyo bila kupoteza uzani uliopo wa mafunzo ya awali.

Chaguo namba mbili. Labda una data nyingi na rasilimali za kompyuta, au unahitaji tu usanifu maalum wa hali ya juu. Haijalishi. Lakini unajifunza mtandao kutoka mwanzo. Utaratibu wa kawaida ni kuangalia muundo wa data, kuchagua usanifu ambao una nguvu KUPITA KIASI, na kusukuma walioacha kujizoeza tena. Niliona watu 0.6 walioacha shule, Karl.

Katika hali zote mbili, mtandao unaweza kupunguzwa. Kuhamasishwa. Sasa hebu tuone ni aina gani ya kupogoa tohara

Algorithm ya jumla

Tuliamua kwamba tunaweza kuondoa vifurushi. Inaonekana rahisi sana:

Jedi mbinu kwa ajili ya kupunguza mitandao convolutional - kupogoa

Kuondoa mabadiliko yoyote ni mkazo kwa mtandao, ambayo kwa kawaida husababisha kuongezeka kwa makosa. Kwa upande mmoja, ongezeko hili la makosa ni kiashiria cha jinsi tunavyoondoa kwa usahihi convolutions (kwa mfano, ongezeko kubwa linaonyesha kwamba tunafanya kitu kibaya). Lakini ongezeko ndogo linakubalika kabisa na mara nyingi huondolewa na mafunzo ya ziada ya mwanga na LR ndogo. Ongeza hatua ya ziada ya mafunzo:

Jedi mbinu kwa ajili ya kupunguza mitandao convolutional - kupogoa

Sasa tunahitaji kufahamu ni lini tunataka kukomesha Kujifunza<->kitanzi chetu cha Kupogoa. Kunaweza kuwa na chaguzi za kigeni hapa tunapohitaji kupunguza mtandao kwa saizi na kasi fulani (kwa mfano, kwa vifaa vya rununu). Hata hivyo, chaguo la kawaida ni kuendelea na mzunguko hadi kosa linapokuwa kubwa zaidi kuliko kukubalika. Ongeza hali:

Jedi mbinu kwa ajili ya kupunguza mitandao convolutional - kupogoa

Kwa hivyo, algorithm inakuwa wazi. Inabakia kujua jinsi ya kuamua convolutions zilizofutwa.

Tafuta vifurushi vilivyofutwa

Tunahitaji kuondoa baadhi ya convolutions. Kukimbilia mbele na "kupiga" mtu yeyote ni wazo mbaya, ingawa itafanya kazi. Lakini kwa kuwa una kichwa, unaweza kufikiria na kujaribu kuchagua convolutions "dhaifu" kwa kuondolewa. Kuna chaguzi kadhaa:

  1. Kipimo kidogo zaidi cha L1 au upogoaji_wa_chini. Wazo la kwamba convolutions na uzito mdogo hutoa mchango mdogo kwa uamuzi wa mwisho
  2. Kipimo kidogo zaidi cha L1 kwa kuzingatia maana na mkengeuko wa kawaida. Tunaongeza na tathmini ya asili ya usambazaji.
  3. Kufunika mizunguko na kuwatenga yale ambayo huathiri vibaya usahihi wa mwisho. Uamuzi sahihi zaidi wa convolutions insignificant, lakini sana muda mwingi na matumizi ya rasilimali.
  4. Wengine

Kila moja ya chaguzi ina haki ya kuishi na sifa zake za utekelezaji. Hapa tunazingatia chaguo na kipimo kidogo cha L1

Mchakato wa mwongozo wa YOLOv3

Usanifu wa asili una vizuizi vya mabaki. Lakini haijalishi ni wazuri kiasi gani kwa mitandao ya kina, watatuzuia kwa kiasi fulani. Ugumu ni kwamba huwezi kufuta upatanisho na faharisi tofauti katika tabaka hizi:

Jedi mbinu kwa ajili ya kupunguza mitandao convolutional - kupogoa

Kwa hivyo, wacha tuchague tabaka ambazo tunaweza kufuta kwa uhuru upatanisho:

Jedi mbinu kwa ajili ya kupunguza mitandao convolutional - kupogoa

Sasa hebu tujenge mzunguko wa kazi:

  1. Inapakia kuwezesha
  2. Kuamua ni kiasi gani cha kukata
  3. Kata nje
  4. Kujifunza enzi 10 na LR=1e-4
  5. Kupima

Kupakua convolutions ni muhimu kukadiria ni sehemu ngapi tunaweza kuondoa katika hatua fulani. Mifano ya kupakua:

Jedi mbinu kwa ajili ya kupunguza mitandao convolutional - kupogoa

Tunaona kwamba karibu kila mahali 5% ya convolutions ina chini sana L1-kawaida na tunaweza kuondoa yao. Katika kila hatua, upakuaji huu ulirudiwa na tathmini ilifanywa ni tabaka zipi na ngapi zinaweza kukatwa.

Mchakato wote ulikamilishwa kwa hatua 4 (nambari hapa na kila mahali kwa RTX 2060 Super):

Hatua ya mAp75 Idadi ya vigezo, milioni Ukubwa wa mtandao, mb Kuanzia mwanzo,% Wakati wa kukimbia, Bi Hali ya tohara
0 0.9656 60 241 100 180 -
1 0.9622 55 218 91 175 5% ya yote
2 0.9625 50 197 83 168 5% ya yote
3 0.9633 39 155 64 155 15% kwa tabaka zilizo na mitetemo 400+
4 0.9555 31 124 51 146 10% kwa tabaka zilizo na mitetemo 100+

Athari moja nzuri iliongezwa kwa hatua ya 2 - ukubwa wa kundi la 4 unafaa kwenye kumbukumbu, ambayo iliharakisha sana mchakato wa mafunzo ya ziada.
Katika hatua ya 4, mchakato ulisimamishwa kwa sababu hata mafunzo ya ziada ya muda mrefu hayakupandisha mAp75 kwa maadili ya zamani.
Kama matokeo, tuliweza kuharakisha uelekezaji kwa 15%, punguza ukubwa kwa 35% na si kupoteza hasa.

Automation kwa usanifu rahisi

Kwa usanifu rahisi wa mtandao (bila kuongeza masharti, concaternate na vizuizi vya mabaki), inawezekana kabisa kuzingatia usindikaji wa tabaka zote za ubadilishaji na kuelekeza mchakato wa kukata convolutions.

Nilitekeleza chaguo hili hapa.
Ni rahisi: unahitaji tu kazi ya upotezaji, kiboreshaji na jenereta za kundi:

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)

Ikiwa ni lazima, unaweza kubadilisha vigezo vya usanidi:

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

Zaidi ya hayo, kizuizi kulingana na kupotoka kwa kawaida kinatekelezwa. Kusudi ni kuweka kikomo sehemu inayoondolewa, ukiondoa miingiliano iliyo na hatua za L1 tayari "za kutosha":

Jedi mbinu kwa ajili ya kupunguza mitandao convolutional - kupogoa

Kwa hivyo, tunakuruhusu uondoe tu mienendo dhaifu kutoka kwa usambazaji sawa na ile ya kulia na usiathiri uondoaji kutoka kwa usambazaji sawa na ule wa kushoto:

Jedi mbinu kwa ajili ya kupunguza mitandao convolutional - kupogoa

Wakati usambazaji unakaribia kawaida, mgawo wa pruning_standart_deviation_part unaweza kuchaguliwa kutoka:

Jedi mbinu kwa ajili ya kupunguza mitandao convolutional - kupogoa
Ninapendekeza dhana ya 2 sigma. Au unaweza kupuuza kipengele hiki, ukiacha thamani <1.0.

Toleo ni grafu ya saizi ya mtandao, upotezaji na muda wa utekelezaji wa mtandao kwa jaribio zima, lililorekebishwa hadi 1.0. Kwa mfano, hapa saizi ya mtandao ilipunguzwa kwa karibu mara 2 bila upotezaji wa ubora (mtandao mdogo wa ubadilishaji na uzani wa 100k):

Jedi mbinu kwa ajili ya kupunguza mitandao convolutional - kupogoa

Kasi ya kukimbia inategemea mabadiliko ya kawaida na inabaki bila kubadilika. Kuna maelezo kwa hili:

  1. Idadi ya mabadiliko hubadilika kutoka kwa urahisi (32, 64, 128) hadi sio rahisi zaidi kwa kadi za video - 27, 51, nk. Ninaweza kuwa na makosa hapa, lakini kuna uwezekano mkubwa kuwa ina athari.
  2. Usanifu sio pana, lakini thabiti. Kwa kupunguza upana, hatuathiri kina. Kwa hivyo, tunapunguza mzigo, lakini usibadilishe kasi.

Kwa hiyo, uboreshaji ulionyeshwa katika kupunguzwa kwa mzigo wa CUDA wakati wa kukimbia kwa 20-30%, lakini si kwa kupunguzwa kwa muda wa kukimbia.

Matokeo ya

Hebu tutafakari. Tulizingatia chaguo 2 za kupogoa - kwa YOLOv3 (wakati unapaswa kufanya kazi kwa mikono yako) na kwa mitandao yenye usanifu rahisi zaidi. Inaweza kuonekana kuwa katika hali zote mbili inawezekana kufikia kupunguza ukubwa wa mtandao na kuongeza kasi bila kupoteza usahihi. Matokeo:

  • Kupunguza ukubwa
  • Kuongeza kasi kukimbia
  • Kupunguza Mzigo wa CUDA
  • Kama matokeo, urafiki wa mazingira (Tunaboresha matumizi ya baadaye ya rasilimali za kompyuta. Mahali fulani mtu ana furaha Greta Thunberg)

Kiambatisho

  • Baada ya hatua ya kupogoa, unaweza kuongeza quantization (kwa mfano, na TensorRT)
  • Tensorflow hutoa uwezo kwa upogoaji_wa_chini. Inafanya kazi.
  • hazina Ninataka kukuza na nitafurahi kusaidia

Chanzo: mapenzi.com

Kuongeza maoni