Techneg Jedi ar gyfer lleihau rhwydweithiau convolutional - tocio

Techneg Jedi ar gyfer lleihau rhwydweithiau convolutional - tocio

O'ch blaen chi eto mae'r dasg o ganfod gwrthrychau. Y flaenoriaeth yw cyflymder gweithredu gyda chywirdeb derbyniol. Rydych chi'n cymryd pensaernïaeth YOLOv3 ac yn ei hyfforddi ymhellach. Mae cywirdeb (mAp75) yn fwy na 0.95. Ond mae'r gyfradd redeg yn dal yn isel. Crap.

Heddiw byddwn yn osgoi meintioli. Ac o dan y toriad byddwn yn edrych Tocio Model — tocio rhannau segur o'r rhwydwaith i gyflymu Casgliad heb golli cywirdeb. Mae'n amlwg ble, faint a sut i dorri. Gadewch i ni ddarganfod sut i wneud hyn â llaw a ble y gallwch chi ei awtomeiddio. Ar ddiwedd y mae ystorfa ar keras.

Cyflwyniad

Yn fy man gwaith blaenorol, Macrosgop yn Perm, cefais un arferiad - i fonitro amser gweithredu algorithmau bob amser. A gwiriwch amser rhedeg y rhwydwaith bob amser trwy hidlydd digonolrwydd. Fel arfer o'r radd flaenaf mewn cynhyrchu nid yw'n pasio hidlydd hwn, a arweiniodd fi at Tocio.

Mae tocio yn hen bwnc a drafodwyd yn Stanford yn darlithio yn 2017. Y prif syniad yw lleihau maint y rhwydwaith hyfforddedig heb golli cywirdeb trwy gael gwared ar nodau amrywiol. Mae'n swnio'n cŵl, ond anaml y byddaf yn clywed am ei ddefnydd. Yn ôl pob tebyg, nid oes digon o weithrediadau, nid oes unrhyw erthyglau yn yr iaith Rwsieg, neu yn syml mae pawb yn ei ystyried yn tocio gwybodaeth ac yn aros yn dawel.
Ond gadewch i ni ei gymryd ar wahân

Cipolwg ar fioleg

Dwi wrth fy modd pan mae Deep Learning yn edrych ar syniadau sy'n dod o fioleg. Gellir ymddiried ynddynt, fel esblygiad (oeddech chi'n gwybod bod ReLU yn debyg iawn i swyddogaeth actifadu niwronau yn yr ymennydd?)

Mae'r broses Tocio Model hefyd yn agos at fioleg. Gellir cymharu ymateb y rhwydwaith yma â phlastigrwydd yr ymennydd. Mae cwpl o enghreifftiau diddorol yn y llyfr. Norman Doidge:

  1. Mae ymennydd menyw a aned gyda dim ond un hanner wedi ailraglennu ei hun i gyflawni swyddogaethau'r hanner coll.
  2. Saethodd y dyn y rhan o'i ymennydd sy'n gyfrifol am weledigaeth. Dros amser, cymerodd rhannau eraill o'r ymennydd y swyddogaethau hyn. (nid ydym yn ceisio ailadrodd)

Yn yr un modd, gallwch chi dorri allan rhai o'r convolutions gwan o'ch model. Fel dewis olaf, bydd y bwndeli sy'n weddill yn helpu i ddisodli'r rhai sydd wedi'u torri.

Ydych chi'n caru Dysgu Trosglwyddo neu a ydych chi'n dysgu o'r dechrau?

Opsiwn rhif un. Rydych chi'n defnyddio Transfer Learning ar Yolov3. Retina, Mask-RCNN neu U-Net. Ond y rhan fwyaf o'r amser nid oes angen i ni adnabod 80 dosbarth gwrthrych fel yn COCO. Yn fy ymarfer i, mae popeth wedi'i gyfyngu i raddau 1-2. Gellid tybio bod y bensaernïaeth ar gyfer 80 o ddosbarthiadau yn segur yma. Mae hyn yn awgrymu bod angen gwneud y bensaernïaeth yn llai. Ar ben hynny, hoffwn wneud hyn heb golli'r pwysau sydd eisoes wedi'u hyfforddi ymlaen llaw.

Opsiwn rhif dau. Efallai bod gennych chi lawer o ddata ac adnoddau cyfrifiadurol, neu dim ond angen pensaernïaeth hynod o arfer. Dim ots. Ond rydych chi'n dysgu'r rhwydwaith o'r dechrau. Y drefn arferol yw edrych ar y strwythur data, dewis pensaernïaeth sy'n GORFODOL mewn grym, a gwthio'r rhai sy'n tynnu'n ôl o ailhyfforddi. Gwelais 0.6 yn gadael, Karl.

Yn y ddau achos, gellir lleihau'r rhwydwaith. Wedi'i ysgogi. Nawr gadewch i ni fynd at chyfrif i maes beth yw math o tocio enwaediad

Algorithm cyffredinol

Fe wnaethom benderfynu y gallem gael gwared ar y bwndeli. Mae'n edrych yn eithaf syml:

Techneg Jedi ar gyfer lleihau rhwydweithiau convolutional - tocio

Mae cael gwared ar unrhyw drosiad yn straen i'r rhwydwaith, sydd fel arfer yn arwain at rywfaint o gynnydd mewn gwallau. Ar y naill law, mae'r cynnydd hwn mewn gwallau yn ddangosydd o ba mor gywir yr ydym yn dileu convolutions (er enghraifft, mae cynnydd mawr yn nodi ein bod yn gwneud rhywbeth o'i le). Ond mae cynnydd bach yn eithaf derbyniol ac yn aml yn cael ei ddileu gan hyfforddiant ychwanegol ysgafn dilynol gyda LR bach. Ychwanegu cam hyfforddi ychwanegol:

Techneg Jedi ar gyfer lleihau rhwydweithiau convolutional - tocio

Nawr mae angen i ni ddarganfod pryd rydyn ni am roi'r gorau i'n dolen Dysgu<->Tocio. Efallai y bydd opsiynau egsotig yma pan fydd angen i ni leihau'r rhwydwaith i faint a chyflymder penodol (er enghraifft, ar gyfer dyfeisiau symudol). Fodd bynnag, yr opsiwn mwyaf cyffredin yw parhau â'r cylch nes bod y gwall yn dod yn uwch na'r hyn sy'n dderbyniol. Ychwanegu amod:

Techneg Jedi ar gyfer lleihau rhwydweithiau convolutional - tocio

Felly, mae'r algorithm yn dod yn glir. Mae'n aros i ddarganfod sut i benderfynu ar y convolutions dileu.

Chwilio am becynnau wedi'u dileu

Mae angen inni gael gwared ar rai convolutions. Mae rhuthro ymlaen a “saethu” unrhyw un yn syniad drwg, er y bydd yn gweithio. Ond gan fod gennych ben, gallwch feddwl a cheisio dewis convolutions “gwan” i'w tynnu. Mae yna sawl opsiwn:

  1. Mesur L1 lleiaf neu docio_maint_isel. Y syniad nad yw convolutions gyda phwysau bach yn gwneud fawr ddim cyfraniad at y penderfyniad terfynol
  2. Mesur L1 lleiaf gan gymryd i ystyriaeth gwyriad cymedrig a safonol. Ategwn ag asesiad o natur y dosbarthiad.
  3. Cuddio convolutions ac eithrio'r rhai sy'n dylanwadu leiaf ar y cywirdeb terfynol. Penderfyniad mwy cywir ar drosglwyddiadau di-nod, ond sy'n cymryd llawer o amser ac yn cymryd llawer o adnoddau.
  4. Eraill

Mae gan bob un o'r opsiynau yr hawl i fywyd a'i nodweddion gweithredu ei hun. Yma rydym yn ystyried yr opsiwn gyda'r mesur L1 lleiaf

Proses â llaw ar gyfer YOLOv3

Mae'r bensaernïaeth wreiddiol yn cynnwys blociau gweddilliol. Ond ni waeth pa mor cŵl ydyn nhw ar gyfer rhwydweithiau dwfn, byddant yn ein rhwystro rhywfaint. Yr anhawster yw na allwch ddileu cysoniadau gyda mynegeion gwahanol yn yr haenau hyn:

Techneg Jedi ar gyfer lleihau rhwydweithiau convolutional - tocio

Felly, gadewch i ni ddewis haenau y gallwn ddileu cysoniadau ohonynt yn rhydd:

Techneg Jedi ar gyfer lleihau rhwydweithiau convolutional - tocio

Nawr, gadewch i ni adeiladu cylch gwaith:

  1. Wrthi'n uwchlwytho gweithrediadau
  2. Darganfod faint i'w dorri
  3. Torrwch ef allan
  4. Dysgu 10 cyfnod gyda LR=1e-4
  5. Profi

Mae dadlwytho convolutions yn ddefnyddiol i amcangyfrif faint o ran y gallwn ei ddileu ar gam penodol. Wrthi'n dadlwytho enghreifftiau:

Techneg Jedi ar gyfer lleihau rhwydweithiau convolutional - tocio

Gwelwn fod gan bron ym mhobman 5% o drosiadau â norm L1 isel iawn a gallwn gael gwared arnynt. Ar bob cam, ailadroddwyd y dadlwytho hwn a gwnaed asesiad o ba haenau a faint y gellid eu torri allan.

Cwblhawyd y broses gyfan mewn 4 cam (rhifau yma ac ym mhobman ar gyfer yr RTX 2060 Super):

Cam mAp75 Nifer y paramedrau, miliwn Maint rhwydwaith, mb O'r cychwyn cyntaf, % Amser rhedeg, ms Cyflwr enwaediad
0 0.9656 60 241 100 180 -
1 0.9622 55 218 91 175 5% o'r cyfan
2 0.9625 50 197 83 168 5% o'r cyfan
3 0.9633 39 155 64 155 15% ar gyfer haenau gyda dros 400 o drosiadau
4 0.9555 31 124 51 146 10% ar gyfer haenau gyda dros 100 o drosiadau

Ychwanegwyd un effaith gadarnhaol at gam 2 - maint swp 4 yn ffitio i'r cof, a gyflymodd y broses o hyfforddiant ychwanegol yn fawr.
Ar gam 4, stopiwyd y broses oherwydd nid oedd hyd yn oed hyfforddiant ychwanegol hirdymor yn codi mAp75 i hen werthoedd.
O ganlyniad, rydym wedi llwyddo i gyflymu'r casgliad erbyn 15%, lleihau maint gan 35% a pheidio colli yn union.

Awtomatiaeth ar gyfer pensaernïaeth symlach

Ar gyfer pensaernïaeth rhwydwaith symlach (heb ychwanegu amodol, blociau cydcaternate a gweddilliol), mae'n eithaf posibl canolbwyntio ar brosesu'r holl haenau convolutional ac awtomeiddio'r broses o dorri allan convolutions.

Gweithredais yr opsiwn hwn yma.
Mae'n syml: dim ond swyddogaeth golled, optimizer a generaduron swp sydd ei angen arnoch chi:

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)

Os oes angen, gallwch newid y paramedrau ffurfweddu:

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

Yn ogystal, gweithredir cyfyngiad yn seiliedig ar y gwyriad safonol. Y nod yw cyfyngu ar y rhan sy'n cael ei dynnu, ac eithrio convolutions gyda mesurau L1 sydd eisoes yn “ddigonol”:

Techneg Jedi ar gyfer lleihau rhwydweithiau convolutional - tocio

Felly, rydyn ni'n caniatáu ichi dynnu convolutions gwan yn unig o ddosraniadau tebyg i'r un cywir a pheidio ag effeithio ar ddileu dosraniadau tebyg i'r un chwith:

Techneg Jedi ar gyfer lleihau rhwydweithiau convolutional - tocio

Pan fydd y dosbarthiad yn nesau'n normal, gellir dewis y cyfernod tocio_standart_deviation_part o:

Techneg Jedi ar gyfer lleihau rhwydweithiau convolutional - tocio
Rwy'n argymell rhagdybiaeth o 2 sigma. Neu gallwch anwybyddu'r nodwedd hon, gan adael y gwerth < 1.0.

Mae'r allbwn yn graff o faint rhwydwaith, colled, ac amser rhedeg rhwydwaith ar gyfer y prawf cyfan, wedi'i normaleiddio i 1.0. Er enghraifft, yma lleihawyd maint y rhwydwaith bron i 2 waith heb golli ansawdd (rhwydwaith troellog bach gyda phwysau 100k):

Techneg Jedi ar gyfer lleihau rhwydweithiau convolutional - tocio

Mae'r cyflymder rhedeg yn amodol ar amrywiadau arferol ac yn parhau i fod bron yn ddigyfnewid. Mae esboniad am hyn:

  1. Mae nifer y convolutions yn newid o gyfleus (32, 64, 128) i ddim y mwyaf cyfleus ar gyfer cardiau fideo - 27, 51, ac ati. Gallwn i fod yn anghywir yma, ond yn fwyaf tebygol mae'n cael effaith.
  2. Nid yw'r bensaernïaeth yn eang, ond yn gyson. Trwy leihau'r lled, nid ydym yn effeithio ar y dyfnder. Felly, rydym yn lleihau'r llwyth, ond nid ydym yn newid y cyflymder.

Felly, mynegwyd y gwelliant mewn gostyngiad o 20-30% yn y llwyth CUDA yn ystod y cyfnod rhedeg, ond nid mewn gostyngiad yn yr amser rhedeg

Canlyniadau

Gadewch i ni fyfyrio. Fe wnaethom ystyried 2 opsiwn ar gyfer tocio - ar gyfer YOLOv3 (pan fydd yn rhaid i chi weithio gyda'ch dwylo) ac ar gyfer rhwydweithiau gyda phensaernïaeth symlach. Gellir gweld ei bod hi'n bosibl lleihau maint rhwydwaith a chyflymu yn y ddau achos heb golli cywirdeb. Canlyniadau:

  • Lleihau maint
  • Rhedeg cyflymu
  • Lleihau Llwyth CUDA
  • O ganlyniad, cyfeillgarwch amgylcheddol (Rydym yn gwneud y gorau y defnydd o adnoddau cyfrifiadurol yn y dyfodol. Rhywle un yn hapus Greta Thunberg)

Atodiad

  • Ar ôl y cam tocio, gallwch ychwanegu meintioli (er enghraifft, gyda TensorRT)
  • Mae tensorflow yn darparu galluoedd ar gyfer isel_maint_tocio. Yn gweithio.
  • ystorfa Rwyf am ddatblygu a byddaf yn falch o helpu

Ffynhonnell: hab.com

Ychwanegu sylw