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:
Ubongo wa mwanamke aliyezaliwa na nusu moja tu umejipanga upya kufanya kazi za nusu iliyopotea.
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:
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:
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:
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:
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:
Kwa hivyo, wacha tuchague tabaka ambazo tunaweza kufuta kwa uhuru upatanisho:
Sasa hebu tujenge mzunguko wa kazi:
Inapakia kuwezesha
Kuamua ni kiasi gani cha kukata
Kata nje
Kujifunza enzi 10 na LR=1e-4
Kupima
Kupakua convolutions ni muhimu kukadiria ni sehemu ngapi tunaweza kuondoa katika hatua fulani. Mifano ya kupakua:
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":
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:
Wakati usambazaji unakaribia kawaida, mgawo wa pruning_standart_deviation_part unaweza kuchaguliwa kutoka:
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):
Kasi ya kukimbia inategemea mabadiliko ya kawaida na inabaki bila kubadilika. Kuna maelezo kwa hili:
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.
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)