Convolutional şəbəkələri azaltmaq üçün Jedi texnikası - budama

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:

  1. 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.
  2. 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:

Convolutional şəbəkələri azaltmaq üçün Jedi texnikası - budama

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:

Convolutional şəbəkələri azaltmaq üçün Jedi texnikası - budama

İ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:

Convolutional şəbəkələri azaltmaq üçün Jedi texnikası - budama

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:

  1. Ən kiçik L1-ölçü və ya aşağı_miqyaslı_budama. Kiçik çəkilərlə bükülmələrin son qərara az töhfə verməsi fikri
  2. Ən kiçik L1-orta və standart kənarlaşma nəzərə alınmaqla ölçü. Biz paylanmanın təbiətinin qiymətləndirilməsi ilə əlavə edirik.
  3. Bükülmələri maskalamaq və son dəqiqliyə ən az təsir edənləri istisna etmək. Əhəmiyyətsiz qıvrımların daha dəqiq müəyyən edilməsi, lakin çox vaxt aparan və resurs tələb edən.
  4. P "SЂSѓRіReRμ

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:

Convolutional şəbəkələri azaltmaq üçün Jedi texnikası - budama

Buna görə də, uzlaşmaları sərbəst silə biləcəyimiz təbəqələri seçək:

Convolutional şəbəkələri azaltmaq üçün Jedi texnikası - budama

İndi bir iş dövrü quraq:

  1. Aktivləşdirmələr yüklənir
  2. Nə qədər kəsiləcəyini hesablamaq
  3. Biçmək
  4. LR=10e-1 ilə 4 dövrü öyrənmək
  5. 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:

Convolutional şəbəkələri azaltmaq üçün Jedi texnikası - budama

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:

Convolutional şəbəkələri azaltmaq üçün Jedi texnikası - budama

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:

Convolutional şəbəkələri azaltmaq üçün Jedi texnikası - budama

Paylanma normala yaxınlaşdıqda, budama_standart_sapma_hissəsi əmsalı aşağıdakılardan seçilə bilər:

Convolutional şəbəkələri azaltmaq üçün Jedi texnikası - budama
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):

Convolutional şəbəkələri azaltmaq üçün Jedi texnikası - budama

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:

  1. 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.
  2. 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ə)
  • Tensorflow üçün imkanlar təmin edir aşağı_miqyaslı_budama. işləyir.
  • anbar Mən inkişaf etmək istəyirəm və kömək etməkdən məmnunam

Mənbə: www.habr.com

Добавить комментарий