Téhnik Jedi pikeun ngurangan jaringan convolutional - pruning

Téhnik Jedi pikeun ngurangan jaringan convolutional - pruning

Sateuacan anjeun deui tugas ngadeteksi objék. Prioritasna nyaéta laju operasi kalayan akurasi anu tiasa ditampi. Anjeun nyandak arsitektur YOLOv3 sarta salajengna ngalatih eta. Akurasi (mAp75) langkung ageung tibatan 0.95. Tapi laju ngajalankeun masih low. Crap.

Dinten ieu kami bakal ngalangkungan kuantisasi. Jeung handapeun cut urang bakal kasampak Model Pruning - motong bagian kaleuleuwihan jaringan pikeun nyepetkeun Inferensi tanpa leungitna akurasi. Ieu jelas dimana, sabaraha jeung kumaha motong. Hayu urang terang kumaha ngalakukeun ieu sacara manual sareng dimana anjeun tiasa ngajadikeun otomatis. Dina tungtungna aya Repository on keras.

perkenalan

Di tempat kuring saméméhna gawé, Macroscop di Perm, abdi kaala hiji kabiasaan - mun salawasna ngawas waktu palaksanaan algoritma. Sarta salawasna pariksa runtime jaringan ngaliwatan hiji filter kacukupan. Biasana kaayaan-of-nu-seni dina produksi teu lulus filter ieu, nu ngarah kuring ka Pruning.

Pruning mangrupikeun topik kuno anu dibahas dina Kuliah Stanford dina 2017. Gagasan utama nyaéta ngirangan ukuran jaringan anu dilatih tanpa kaleungitan akurasi ku cara ngaleungitkeun sababaraha titik. Ieu disada tiis, tapi kuring jarang ngadangu ngeunaan pamakéan na. Panginten, teu cekap palaksanaan, teu aya tulisan basa Rusia, atanapi ngan saukur sadayana nganggap éta pruning terang-kumaha sareng tetep jempé.
Tapi hayu urang pisahkeun

A glimpse kana biologi

Abdi resep nalika Deep Learning ningali ideu anu asalna tina biologi. Aranjeunna, sapertos évolusi, tiasa dipercaya (naha anjeun terang yén ReLU mirip pisan sareng fungsi aktivasina neuron dina uteuk?)

Prosés Pruning Modél ogé deukeut jeung biologi. Réspon jaringan di dieu tiasa dibandingkeun sareng plastisitas otak. Aya sababaraha conto anu pikaresepeun dina buku. Norman Doidge:

  1. Otak awéwé anu dilahirkeun ngan ukur hiji satengah parantos diprogram deui pikeun ngalaksanakeun fungsi satengah anu leungit.
  2. Lalaki éta nembak bagian otakna anu tanggung jawab pikeun visi. Kana waktu, bagian séjén otak nyandak alih fungsi ieu. (Kami henteu nyobian ngulang)

Kitu ogé, anjeun tiasa motong kaluar sababaraha convolutions lemah tina model Anjeun. Salaku jalan terakhir, kebat sésana bakal ngabantosan ngagentos anu dipotong.

Naha anjeun resep Transfer Learning atanapi anjeun diajar ti mimiti?

Pilihan nomer hiji. Anjeun nganggo Transfer Learning dina Yolov3. Rétina, Topeng-RCNN atanapi U-Net. Tapi lolobana waktu urang teu kudu ngakuan 80 kelas objék kawas di COCO. Dina prakna mah, sadayana dugi ka kelas 1-2. Urang tiasa nganggap yén arsitéktur pikeun 80 kelas kaleuleuwihan di dieu. Ieu nunjukkeun yén arsitéktur kedah dilakukeun langkung alit. Sumawona, kuring hoyong ngalakukeun ieu tanpa kaleungitan beurat anu tos dilatih.

Pilihan nomer dua. Panginten anjeun gaduh seueur data sareng sumber komputasi, atanapi ngan ukur peryogi arsitéktur super-custom. Henteu masalah. Tapi anjeun diajar jaringan ti scratch. Prosedur anu biasa nyaéta ningali struktur data, pilih arsitéktur anu kaleuleuwihan dina kakuatan, sareng nyorong dropout tina latihan deui. Kuring nempo 0.6 dropouts, Karl.

Dina duanana kasus, jaringan bisa ngurangan. Dimotivasi. Ayeuna hayu urang terang naon jinis pruning sunat

Algoritma umum

Urang mutuskeun yén urang bisa nyabut bundles. Sigana cukup basajan:

Téhnik Jedi pikeun ngurangan jaringan convolutional - pruning

Nyoplokkeun konvolusi naon waé nyaéta stres pikeun jaringan, anu biasana nyababkeun sababaraha paningkatan kasalahan. Di hiji sisi, kanaékan kasalahan ieu mangrupikeun indikator kumaha leres urang ngaleungitkeun konvolusi (contona, paningkatan anu ageung nunjukkeun yén urang ngalakukeun anu salah). Tapi kanaékan leutik cukup ditarima sarta mindeng ngaleungitkeun ku lampu saterusna latihan tambahan kalayan LR leutik. Tambahkeun léngkah latihan tambahan:

Téhnik Jedi pikeun ngurangan jaringan convolutional - pruning

Ayeuna urang kedah terang iraha urang badé ngeureunkeun Pembelajaran<->Pruning loop. Meureun aya pilihan aheng dieu lamun urang kudu ngurangan jaringan kana ukuran jeung speed nu tangtu (contona, pikeun alat nu bagerak). Nanging, pilihan anu paling umum nyaéta neraskeun siklus dugi kasalahanna langkung luhur tibatan anu ditampi. Tambahkeun kaayaan:

Téhnik Jedi pikeun ngurangan jaringan convolutional - pruning

Janten, algoritma janten jelas. Tetep terang kumaha carana nangtukeun konvolusi anu dihapus.

Milarian buntelan anu dihapus

Urang kudu miceun sababaraha convolutions. Rushing payun na "shooting" saha mangrupakeun ide goréng, sanajan bakal jalan. Tapi saprak anjeun boga sirah, Anjeun bisa mikir jeung nyoba milih convolutions "lemah" pikeun nyoplokkeun. Aya sababaraha pilihan:

  1. Pangleutikna L1-ukuran atawa low_magnitude_pruning. Pamanggih yén convolutions kalawan beurat leutik nyieun saeutik kontribusi kana kaputusan final
  2. Pangleutikna L1-ukuran nyokot kana akun rata-rata jeung simpangan baku. Urang suplement ku hiji assessment tina alam sebaran.
  3. Masking convolutions jeung teu kaasup nu pangsaeutikna mangaruhan akurasi final. Tekad anu langkung akurat ngeunaan konvolusi anu teu penting, tapi nyéépkeun waktos sareng nyéépkeun sumber daya.
  4. nu lain

Tiap pilihan boga hak hirup jeung fitur palaksanaan sorangan. Di dieu urang tempo pilihan jeung pangleutikna L1-ukuran

Prosés manual pikeun YOLOv3

Arsitéktur aslina ngandung blok residual. Tapi euweuh urusan kumaha tiis aranjeunna keur jaringan jero, aranjeunna bakal ngahalangan urang rada. Kasusahna nyaéta anjeun teu tiasa ngahapus rekonsiliasi sareng indéks anu béda dina lapisan ieu:

Téhnik Jedi pikeun ngurangan jaringan convolutional - pruning

Ku alatan éta, hayu urang milih lapisan ti mana urang bisa bebas ngahapus reconciliations:

Téhnik Jedi pikeun ngurangan jaringan convolutional - pruning

Ayeuna hayu urang ngawangun siklus gawé:

  1. Ngunggah aktivasina
  2. Figuring kaluar sabaraha motong
  3. Keureut
  4. Diajar 10 epochs kalawan LR=1e-4
  5. Nguji

Unloading convolutions mangpaat keur estimasi sabaraha bagian urang bisa dipiceun dina hambalan nu tangtu. Conto ngabongkar muatan:

Téhnik Jedi pikeun ngurangan jaringan convolutional - pruning

Urang nempo yén ampir unggal madhab 5% convolutions boga L1-norma pisan low sarta kami bisa nyabut aranjeunna. Dina unggal hambalan, unloading ieu terus-terusan sarta hiji assessment dijieun tina lapisan mana jeung sabaraha bisa motong kaluar.

Sakabeh prosés réngsé dina 4 léngkah (angka di dieu sareng di mana waé pikeun RTX 2060 Super):

lengkah mAp75 Jumlah parameter, juta Ukuran jaringan, mb Ti mimiti,% Waktos ngajalankeun, ms Kaayaan sunatan
0 0.9656 60 241 100 180 -
1 0.9622 55 218 91 175 5% sadaya
2 0.9625 50 197 83 168 5% sadaya
3 0.9633 39 155 64 155 15% pikeun lapisan kalawan 400+ convolutions
4 0.9555 31 124 51 146 10% pikeun lapisan kalawan 100+ convolutions

Hiji pangaruh positif ditambahkeun kana hambalan 2 - ukuran bets 4 pas kana mémori, nu greatly gancangan prosés latihan tambahan.
Dina hambalan 4, prosésna dieureunkeun sabab malah latihan tambahan jangka panjang teu ngangkat mAp75 kana nilai heubeul.
Hasilna, urang junun nyepetkeun inferensi ku 15%, ngurangan ukuranana ku 35% jeung teu leungit kahayang.

Automation pikeun arsitéktur basajan

Pikeun arsitéktur jaringan basajan (tanpa tambahan kondisional, concaternate jeung blok residual), éta rada mungkin fokus kana ngolah sagala lapisan convolutional tur ngajadikeun otomatis prosés motong kaluar convolutions.

Kuring dilaksanakeun pilihan ieu di dieu.
Éta saderhana: anjeun ngan ukur peryogi fungsi leungitna, pangoptimal sareng generator bets:

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)

Upami diperlukeun, anjeun tiasa ngarobih parameter konfigurasi:

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

Salaku tambahan, watesan dumasar kana simpangan baku dilaksanakeun. Tujuanana nyaéta pikeun ngawatesan bagian anu dipiceun, henteu kalebet konvolusi kalayan ukuran L1 anu parantos "cukup":

Téhnik Jedi pikeun ngurangan jaringan convolutional - pruning

Ku kituna, kami ngidinan Anjeun pikeun miceun ngan convolutions lemah tina sebaran sarupa jeung katuhu jeung teu mangaruhan panyabutan tina sebaran sarupa jeung kénca:

Téhnik Jedi pikeun ngurangan jaringan convolutional - pruning

Nalika sebaran ngadeukeutan normal, koefisien pruning_standart_deviation_part bisa dipilih tina:

Téhnik Jedi pikeun ngurangan jaringan convolutional - pruning
Abdi nyarankeun asumsi 2 sigma. Atawa anjeun bisa malire fitur ieu, ninggalkeun nilai <1.0.

Kaluaran nyaéta grafik ukuran jaringan, leungitna, sareng waktos jalanna jaringan pikeun sakabéh tés, dinormalisasi kana 1.0. Contona, di dieu ukuran jaringan diréduksi ampir 2 kali tanpa kaleungitan kualitas (jaringan convolutional leutik kalayan beurat 100k):

Téhnik Jedi pikeun ngurangan jaringan convolutional - pruning

Laju ngajalankeun tunduk kana fluctuations normal sarta tetep ampir unchanged. Aya katerangan pikeun ieu:

  1. Jumlah convolutions robah tina merenah (32, 64, 128) mun teu paling merenah pikeun kartu vidéo - 27, 51, jsb. Kuring bisa jadi salah di dieu, tapi paling dipikaresep eta boga pangaruh.
  2. Arsitéktur henteu lega, tapi konsisten. Ku ngurangan lebar, urang teu mangaruhan jero. Ku kituna, urang ngurangan beban, tapi teu ngarobah laju.

Ku alatan éta, perbaikan dinyatakeun dina pangurangan beban CUDA salami ngajalankeun ku 20-30%, tapi henteu dina réduksi dina waktos jalan.

hasil

Hayu urang ngeunteung. Kami nganggap 2 pilihan pikeun pruning - pikeun YOLOv3 (nalika anjeun kedah damel sareng panangan anjeun) sareng jaringan kalayan arsitéktur anu langkung saderhana. Ieu bisa ditempo yén dina dua kasus kasebut nyaéta dimungkinkeun pikeun ngahontal réduksi ukuran jaringan sarta speedup tanpa leungitna akurasi. Hasil:

  • Ngurangan ukuranana
  • Laju gancangan
  • Ngurangan Beban CUDA
  • Hasilna, ramah lingkungan (Urang ngaoptimalkeun pamakéan masa depan sumberdaya komputasi. Hiji tempat senang Greta Thunberg)

lampiran

  • Saatos léngkah pruning, anjeun tiasa nambihan kuantisasi (contona, nganggo TensorRT)
  • Tensorflow nyadiakeun kamampuhan pikeun low_magnitude_pruning. Gawéna.
  • gudang Abdi hoyong ngembangkeun sareng bakal bungah ngabantosan

sumber: www.habr.com

Tambahkeun komentar