Convolutional şəbəkələri azaltmaq üçün Jedi texnikası - budama
Sizdən əvvəl yenidən obyektlərin aşkarlanması vəzifəsidir. Prioritet məqbul dəqiqliklə əməliyyat sürətidir. Siz YOLOv3 arxitekturasını götürürsünüz və onu daha da öyrədirsiniz. Dəqiqlik (mAp75) 0.95-dən böyükdür. Ancaq qaçış nisbəti hələ də aşağıdır. pislik.
Bu gün biz kvantlaşdırmadan yan keçəcəyik. Və kəsik altına baxacağıq Model Budama — Dəqiqliyi itirmədən Nəticəni sürətləndirmək üçün şəbəkənin lazımsız hissələrinin kəsilməsi. Harada, nə qədər və necə kəsiləcəyi aydındır. Bunu əl ilə necə edəcəyinizi və harada avtomatlaşdıra biləcəyinizi anlayaq. Sonda keras üzərində bir anbar var.
Giriş
Əvvəlki iş yerimdə, Permdəki Macroscop-da bir vərdiş əldə etdim - həmişə alqoritmlərin icra müddətinə nəzarət etmək. Həmişə adekvatlıq filtri vasitəsilə şəbəkənin işləmə müddətini yoxlayın. Adətən istehsalda ən müasir olanlar bu filtrdən keçmir, bu da məni budamaya apardı.
Budama müzakirə edilən köhnə bir mövzudur Stanford mühazirələri 2017-ci ildə. Əsas ideya müxtəlif qovşaqları silməklə dəqiqliyini itirmədən öyrədilmiş şəbəkənin ölçüsünü azaltmaqdır. Gözəl səslənir, amma onun istifadəsi haqqında nadir hallarda eşidirəm. Yəqin ki, kifayət qədər icraat yoxdur, rusdilli məqalələr yoxdur və ya sadəcə olaraq hamı bunu nou-hau budaması hesab edir və susur.
Amma gəlin bunu ayıraq
Biologiyaya bir baxış
Dərin Öyrənmə biologiyadan gələn ideyalara baxanda xoşuma gəlir. Onlar, təkamül kimi, etibar edilə bilər (ReLU-ya çox bənzədiyini bilirdinizmi beyində neyronların aktivləşdirilməsi funksiyası?)
Model Budama prosesi də biologiyaya yaxındır. Şəbəkənin buradakı reaksiyasını beynin plastikliyi ilə müqayisə etmək olar. Kitabda bir neçə maraqlı nümunə var. Norman Doidge:
Yalnız bir yarım ilə doğulmuş qadının beyni yarımçıq qalan yarının funksiyalarını yerinə yetirmək üçün özünü yenidən proqramlaşdırıb.
Oğlan beyninin görmə üçün məsul olan hissəsini vurdu. Zamanla beynin digər hissələri bu funksiyaları öz üzərinə götürdü. (təkrar etməyə çalışmırıq)
Eyni şəkildə, modelinizdən bəzi zəif bükülmələri kəsə bilərsiniz. Son çarə olaraq, qalan paketlər kəsilmişləri əvəz etməyə kömək edəcəkdir.
Transfer Öyrənməyi sevirsiniz, yoxsa sıfırdan öyrənirsiniz?
Seçim nömrə bir. Siz Yolov3-də Öyrənmə Transferindən istifadə edirsiniz. Retina, Mask-RCNN və ya U-Net. Lakin çox vaxt COCO-da olduğu kimi 80 obyekt sinifini tanımağa ehtiyacımız yoxdur. Mənim praktikamda hər şey 1-2-ci siniflərlə məhdudlaşır. Burada 80 sinif üçün arxitekturanın lazımsız olduğunu düşünmək olar. Bu, arxitekturanın daha kiçik olması lazım olduğunu göstərir. Üstəlik, əvvəlcədən hazırlanmış çəkiləri itirmədən bunu etmək istərdim.
İkinci seçim. Ola bilsin ki, sizin çoxlu məlumat və hesablama resurslarınız var və ya sadəcə super xüsusi arxitekturaya ehtiyacınız var. Fərqi yoxdur. Ancaq siz şəbəkəni sıfırdan öyrənirsiniz. Adi prosedur məlumat strukturuna baxmaq, Həddindən artıq gücə malik bir arxitektura seçmək və yenidən təlimdən yayınanları itələməkdir. Mən 0.6 məzuniyyət gördüm, Karl.
Hər iki halda şəbəkə azaldıla bilər. Həvəsləndirilmiş. İndi sünnət budamasının nə olduğunu anlayaq
Ümumi alqoritm
Paketləri çıxara biləcəyimizə qərar verdik. Bu olduqca sadə görünür:
Hər hansı bir konvolyasiyanın aradan qaldırılması şəbəkə üçün streslidir və bu, adətən xətanın müəyyən qədər artmasına səbəb olur. Bir tərəfdən, səhvin bu artması, bükülmələri necə düzgün aradan qaldırdığımızın göstəricisidir (məsələn, böyük bir artım səhv bir şey etdiyimizi göstərir). Ancaq kiçik bir artım olduqca məqbuldur və tez-tez kiçik bir LR ilə sonrakı yüngül əlavə təlimlə aradan qaldırılır. Əlavə təlim addımı əlavə edin:
İndi öyrənməliyik<->Budama döngəmizi nə vaxt dayandırmaq istədiyimizi anlamalıyıq. Şəbəkəni müəyyən bir ölçüyə və sürətə (məsələn, mobil cihazlar üçün) azaltmaq lazım olduqda burada ekzotik variantlar ola bilər. Bununla belə, ən çox yayılmış seçim səhv məqbul həddən yuxarı olana qədər dövrü davam etdirməkdir. Şərt əlavə edin:
Beləliklə, alqoritm aydın olur. Silinmiş qıvrımların necə təyin olunacağını anlamaq qalır.
Silinmiş paketləri axtarın
Bəzi qıvrımları aradan qaldırmalıyıq. İrəliyə tələsmək və hər kəsi "atmaq" pis fikirdir, baxmayaraq ki, işləyəcək. Ancaq başınız olduğundan, düşünə və çıxarmaq üçün "zəif" qıvrımları seçməyə cəhd edə bilərsiniz. Bir neçə variant var:
Variantların hər birinin yaşamaq hüququ və öz icra xüsusiyyətləri var. Burada ən kiçik L1 ölçüsü olan variantı nəzərdən keçiririk
YOLOv3 üçün əl prosesi
Orijinal arxitektura qalıq blokları ehtiva edir. Ancaq dərin şəbəkələr üçün nə qədər sərin olsalar da, bizə bir qədər mane olacaqlar. Çətinlik ondadır ki, siz bu təbəqələrdə müxtəlif indekslərlə uzlaşmaları silə bilməzsiniz:
Buna görə də, uzlaşmaları sərbəst silə biləcəyimiz təbəqələri seçək:
İndi bir iş dövrü quraq:
Aktivləşdirmələr yüklənir
Nə qədər kəsiləcəyini hesablamaq
Biçmək
LR=10e-1 ilə 4 dövrü öyrənmək
Test
Bükülmələrin boşaldılması müəyyən bir addımda hansı hissəni çıxara biləcəyimizi təxmin etmək üçün faydalıdır. Boşaltma nümunələri:
Biz görürük ki, demək olar ki, hər yerdə 5% qıvrım çox aşağı L1 normasına malikdir və biz onları aradan qaldıra bilərik. Hər addımda bu boşalma təkrarlanır və hansı təbəqələrin və nə qədərinin kəsilə biləcəyi ilə bağlı qiymətləndirmə aparılırdı.
Bütün proses 4 addımda tamamlandı (RTX 2060 Super üçün burada və hər yerdə nömrələr):
Addım
mAp75
Parametrlərin sayı, milyon
Şəbəkə ölçüsü, mb
Başlanğıcdan, %
İş vaxtı, ms
Sünnət vəziyyəti
0
0.9656
60
241
100
180
-
1
0.9622
55
218
91
175
hamısının 5%-i
2
0.9625
50
197
83
168
hamısının 5%-i
3
0.9633
39
155
64
155
15+ qıvrımlı təbəqələr üçün 400%
4
0.9555
31
124
51
146
10+ qıvrımlı təbəqələr üçün 100%
2-ci addıma bir müsbət təsir əlavə edildi - toplu ölçüsü 4 yaddaşa uyğunlaşdırıldı ki, bu da əlavə təlim prosesini xeyli sürətləndirdi.
4-cü addımda proses dayandırıldı, çünki hətta uzunmüddətli əlavə təlim mAp75-i köhnə dəyərlərə qaldırmadı.
Nəticədə biz nəticə çıxarmağı sürətləndirə bildik 15%, ölçüsünü azaldın 35% və dəqiq itirmə.
Daha sadə arxitekturalar üçün avtomatlaşdırma
Daha sadə şəbəkə arxitekturaları üçün (şərti əlavə, birləşdirici və qalıq bloklar olmadan) bütün konvolyusiya qatlarının işlənməsinə diqqət yetirmək və konvolyutsiyaların kəsilməsi prosesini avtomatlaşdırmaq olduqca mümkündür.
Mən bu variantı həyata keçirdim burada.
Bu sadədir: sizə yalnız itki funksiyası, optimallaşdırıcı və toplu generatorlar lazımdır:
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)
Lazım gələrsə, konfiqurasiya parametrlərini dəyişə bilərsiniz:
{
"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
}
Bundan əlavə, standart sapmaya əsaslanan məhdudiyyət tətbiq olunur. Məqsəd, artıq "kifayət qədər" L1 ölçüləri ilə bükülmələr istisna olmaqla, çıxarılan hissəni məhdudlaşdırmaqdır:
Beləliklə, biz sizə sağa bənzər paylamalardan yalnız zəif bükülmələri silməyə icazə veririk və sola bənzər paylamaların çıxarılmasına təsir göstərmirik:
Mən 2 siqma fərziyyəsini tövsiyə edirəm. Və ya dəyəri < 1.0 tərk edərək, bu xüsusiyyəti nəzərə almaya bilərsiniz.
Çıxış, 1.0-a qədər normallaşdırılan bütün test üçün şəbəkə ölçüsü, itkisi və şəbəkə işləmə müddətinin qrafikidir. Məsələn, burada şəbəkə ölçüsü keyfiyyət itkisi olmadan demək olar ki, 2 dəfə azaldıldı (100k çəkisi olan kiçik konvolyusiya şəbəkəsi):
Qaçış sürəti normal dalğalanmalara məruz qalır və demək olar ki, dəyişməz qalır. Bunun bir izahı var:
Döngələrin sayı rahatdan (32, 64, 128) video kartlar üçün ən uyğun olmayana dəyişir - 27, 51 və s. Burada səhv edə bilərəm, amma çox güman ki, təsiri var.
Memarlıq geniş deyil, ardıcıldır. Genişliyi azaltmaqla biz dərinliyə təsir etmirik. Beləliklə, biz yükü azaldır, lakin sürəti dəyişdirmirik.
Buna görə də, yaxşılaşma qaçış zamanı CUDA yükünün 20-30% azalması ilə ifadə edildi, lakin işləmə müddətinin azalması ilə deyil.
Nəticələri
Gəlin əks etdirək. Biz budama üçün 2 variantı nəzərdən keçirdik - YOLOv3 üçün (əllərinizlə işləməli olduğunuz zaman) və daha sadə arxitekturalı şəbəkələr üçün. Göründüyü kimi, hər iki halda dəqiqliyi itirmədən şəbəkə ölçüsünün kiçilməsi və sürətləndirilməsinə nail olmaq mümkündür. Nəticələr:
Ölçünün azaldılması
Sürətlənmə qaçışı
CUDA yükünün azaldılması
Nəticədə ətraf mühitə uyğunluq (Biz hesablama resurslarının gələcəkdə istifadəsini optimallaşdırırıq. Haradasa insan xoşbəxtdir Greta Thunberg)
əlavə
Budama addımından sonra kvantlama əlavə edə bilərsiniz (məsələn, TensorRT ilə)