Cu câteva săptămâni în urmă, am postat un tweet despre „cele mai frecvente greșeli ale rețelei neuronale”, enumerând câteva probleme obișnuite legate de antrenarea plaselor neuronale. Tweet-ul a obținut destul de mult mai mult angajament decât am anticipat (inclusiv un webinar:)). În mod clar, o mulțime de oameni au întâmpinat personal diferența mare dintre „iată cum funcționează un strat convoluțional” și „convnetul nostru obține rezultate de ultimă generație”.

pentru

Așa că m-am gândit că ar putea fi amuzant să-mi scot blogul prăfuit pentru a-mi extinde tweet-ul la forma lungă pe care acest subiect o merită. Cu toate acestea, în loc să intru într-o enumerare a erorilor mai frecvente sau să le scot în evidență, am vrut să sap un pic mai adânc și să vorbesc despre cum se poate evita să comită aceste erori cu totul (sau să le remedieze foarte rapid). Trucul pentru a face acest lucru este să urmezi un anumit proces, care din câte îmi dau seama nu este foarte des documentat. Să începem cu două observații importante care îl motivează.

1) Antrenamentul cu rețele neuronale este o abstracție cu scurgeri

Se presupune că este ușor să începeți cu antrenarea plaselor neuronale. Numeroase biblioteci și cadre se mândresc cu afișarea de fragmente minune de 30 de linii care vă rezolvă problemele de date, dând impresia (falsă) că aceste lucruri sunt plug and play. Este obișnuit să vezi lucruri precum:

Aceste biblioteci și exemple activează partea creierului nostru care este familiarizată cu software-ul standard - un loc în care API-urile și abstractizările curate sunt adesea realizabile. Solicită biblioteca pentru a demonstra:

Asta e tare! Un dezvoltator curajos a preluat sarcina de a înțelege șirurile de întrebări, adresele URL, solicitările GET/POST, conexiunile HTTP și așa mai departe și a ascuns în mare măsură complexitatea din spatele câtorva linii de cod. La asta ne familiarizăm și ne așteptăm. Din păcate, rețelele neuronale nu sunt așa ceva. Acestea nu sunt tehnologie „off-the-raft” în secunda în care vă abateți ușor de la instruirea unui clasificator ImageNet. Am încercat să subliniez acest lucru în postarea mea „Da, ar trebui să înțelegeți backprop”, alegând backpropagation și numind-o „abstractizare scurgeri”, dar situația este, din păcate, mult mai gravă. Backprop + SGD nu face ca rețeaua să funcționeze în mod magic. Norma de lot nu o face să transforme magic mai rapid. RNN-urile nu vă permit magic să „conectați” text. Și doar pentru că îți poți formula problema ca RL nu înseamnă că ar trebui. Dacă insistați să utilizați tehnologia fără a înțelege cum funcționează, este posibil să eșuați. Ceea ce mă aduce la ...

2) Antrenamentul cu rețele neuronale eșuează în tăcere

Când spargeți sau configurați greșit codul, veți obține adesea un fel de excepție. Ați conectat un număr întreg în care ceva se aștepta la un șir. Funcția aștepta doar 3 argumente. Acest import a eșuat. Cheia respectivă nu există. Numărul de elemente din cele două liste nu este egal. În plus, este adesea posibil să creați teste unitare pentru o anumită funcționalitate.

Acesta este doar un început când vine vorba de antrenarea plaselor neuronale. Totul ar putea fi corect din punct de vedere sintactic, dar totul nu este aranjat corect și este foarte greu de spus. „Suprafața posibilă de eroare” este mare, logică (spre deosebire de sintactică) și foarte dificilă pentru testarea unității. De exemplu, poate ați uitat să vă răsturnați etichetele când ați răsturnat imaginea în stânga-dreapta în timpul măririi datelor. Rețeaua dvs. poate funcționa încă (șocant) destul de bine, deoarece rețeaua dvs. poate învăța intern să detecteze imaginile răsturnate și apoi își stabilește predicțiile. Sau poate că modelul dvs. autoregresiv ia din greșeală ceea ce încearcă să prezică ca intrare din cauza unei erori off-by-one. Sau ați încercat să tăiați gradienții, dar în schimb ați tăiat pierderea, făcând ca exemplele anterioare să fie ignorate în timpul antrenamentului. Sau v-ați inițializat greutățile dintr-un punct de control predeterminat, dar nu ați folosit media inițială. Sau pur și simplu ați înșelat setările pentru punctele forte de regularizare, rata de învățare, rata de descompunere a acesteia, dimensiunea modelului etc. Prin urmare, rețeaua dvs. neuronală mal configurată va arunca excepții numai dacă aveți noroc; De cele mai multe ori se va antrena, dar va funcționa în tăcere puțin mai rău.

Ca urmare, (și acest lucru este dificil de subliniat) o abordare „rapidă și furioasă” a instruirii rețelelor neuronale nu funcționează și duce doar la suferință. Acum, suferința este o parte perfect naturală a obținerii unei rețele neuronale să funcționeze bine, dar poate fi atenuată prin a fi minuțioasă, defensivă, paranoică și obsedată de vizualizarea practic a oricărui lucru posibil. Calitățile care din experiența mea se corelează cel mai puternic cu succesul în învățarea profundă sunt răbdarea și atenția la detalii.

Reteta

În lumina celor două fapte de mai sus, am dezvoltat un proces specific pentru mine, pe care îl urmez atunci când aplic o rețea neuronală la o nouă problemă, pe care voi încerca să o descriu. Veți vedea că ia cele două principii de mai sus foarte în serios. În special, se dezvoltă de la simplu la complex și la fiecare pas al modului facem ipoteze concrete despre ceea ce se va întâmpla și apoi fie le validăm cu un experiment, fie investigăm până când găsim o problemă. Ceea ce încercăm să prevenim foarte greu este introducerea multor complexități „neconfirmate” simultan, care este obligată să introducă erori/configurații greșite care vor dura pentru totdeauna să fie găsite (dacă vreodată). Dacă scrierea codului de rețea neuronală a fost ca un antrenament, ar fi bine să folosiți o rată de învățare foarte mică și să ghiciți și apoi să evaluați setul complet de testare după fiecare iterație.

1. Deveniți unul cu datele

Primul pas pentru formarea unei rețele neuronale este să nu atingeți deloc niciun cod de rețea neuronală și, în schimb, începeți să vă inspectați temeinic datele. Acest pas este critic. Îmi place să petrec mult timp (măsurat în unități de ore) scanând mii de exemple, înțelegând distribuția lor și căutând modele. Din fericire, creierul tău este destul de bun la asta. Odată am descoperit că datele conțineau exemple duplicate. Altă dată am găsit imagini/etichete corupte. Caut dezechilibre și prejudecăți de date. De obicei, voi acorda atenție propriului proces de clasificare a datelor, ceea ce sugerează tipurile de arhitecți pe care îi vom explora în cele din urmă. De exemplu - sunt suficiente caracteristici foarte locale sau avem nevoie de context global? Câtă variație există și ce formă ia? Ce variație este falsă și ar putea fi preprocesată? Contează poziția spațială sau vrem să o punem în comun? Cât de mult contează detaliile și cât de mult ne-am putea permite să redimensionăm imaginile? Cât de zgomotoase sunt etichetele?

În plus, deoarece rețeaua neuronală este efectiv o versiune comprimată/compilată a setului de date, veți putea să vă uitați la predicțiile (greșite) ale rețelei și să înțelegeți de unde ar putea proveni. Și dacă rețeaua dvs. vă oferă o predicție care nu pare în concordanță cu ceea ce ați văzut în date, ceva este dezactivat.

Odată ce ați obținut un sens calitativ, este, de asemenea, o idee bună să scrieți un cod simplu pentru a căuta/filtra/sorta după orice vă puteți gândi (de exemplu, tipul etichetei, mărimea adnotărilor, numărul de adnotări etc.) și vizualizarea distribuțiilor acestora. și valorile aberante de-a lungul oricărei axe. Valorile aberante, mai ales, descoperă aproape întotdeauna unele erori în ceea ce privește calitatea datelor sau preprocesarea.

2. Configurați scheletul de antrenament/evaluare end-to-end + obțineți linii de bază stupide

Acum, că ne înțelegem datele, putem ajunge la rețeaua super-elegantă ASPP FPN ResNet și să începem formarea unor modele minunate? Cu siguranță nu. Acesta este drumul spre suferință. Următorul nostru pas este să stabilim un schelet complet de antrenament + evaluare și să câștigăm încredere în corectitudinea acestuia printr-o serie de experimente. În această etapă, cel mai bine este să alegeți un model simplu pe care nu l-ați fi putut înșela cumva - de ex. un clasificator liniar sau un ConvNet foarte mic. Vom dori să-l instruim, să vizualizăm pierderile, orice alte valori (de ex. Acuratețe), să predicăm model și să realizăm o serie de experimente de ablație cu ipoteze explicite pe parcurs.

Sfaturi și trucuri pentru această etapă:

3. Overfit

În această etapă, ar trebui să avem o bună înțelegere a setului de date și să avem un canal complet de instruire + evaluare. Pentru orice model dat putem calcula (reproductibil) o valoare în care avem încredere. Suntem, de asemenea, înarmați cu performanța noastră pentru o linie de bază independentă de intrare, performanța câtorva linii de bază stupide (ar fi mai bine să le depășim) și avem un sentiment dur al performanței unui om (sperăm să ajungem la asta). Etapa este acum pregătită pentru a itera pe un model bun.

Abordarea pe care îmi place să o găsesc pentru a găsi un model bun are două etape: obțineți mai întâi un model suficient de mare încât să poată îmbrăca (adică să se concentreze pe pierderea antrenamentului) și apoi să îl regularizați în mod corespunzător (renunțați la o anumită pierdere de antrenament pentru a îmbunătăți pierderea de validare). Motivul pentru care îmi plac aceste două etape este că, dacă nu reușim să atingem o rată de eroare scăzută cu niciun model care ar putea indica din nou unele probleme, erori sau configurări greșite.

Câteva sfaturi și trucuri pentru această etapă:

4. Regularizează

În mod ideal, suntem acum într-un loc în care avem un model mare care se potrivește cel puțin cu setul de antrenament. Acum este timpul să îl regularizați și să obțineți o anumită precizie de validare renunțând la o parte din acuratețea antrenamentului. Câteva sfaturi și trucuri:

    obțineți mai multe date. În primul rând, cea mai bună și preferată modalitate de a regulariza un model în orice cadru practic este de a adăuga mai multe date reale de antrenament. Este o greșeală foarte obișnuită să petreci o mulțime de cicluri de inginerie încercând să scoți suc dintr-un mic set de date atunci când poți colecta mai multe date. Din câte știu, adăugarea mai multor date este aproape singura modalitate garantată de a îmbunătăți monoton performanțele unei rețele neuronale bine configurate aproape la nesfârșit. Cealaltă ar fi ansambluri (dacă vă puteți permite), dar asta depășește după

În cele din urmă, pentru a câștiga încredere suplimentară că rețeaua dvs. este un clasificator rezonabil, îmi place să vizualizez greutățile din primul strat ale rețelei și să vă asigur că veți obține margini frumoase care au sens. Dacă filtrele din primul strat arată ca zgomotul, atunci ceva ar putea fi dezactivat. În mod similar, activările din interiorul rețelei pot afișa uneori artefacte ciudate și indică probleme.

5. Acordați

Acum ar trebui să fiți „în buclă” cu setul de date explorând un spațiu larg de model pentru arhitecți care obțin pierderi de validare reduse. Câteva sfaturi și trucuri pentru acest pas:

  • căutare aleatorie peste grilă. Pentru reglarea simultană a mai multor hiperparametri, poate suna tentant să folosiți căutarea în rețea pentru a asigura acoperirea tuturor setărilor, dar rețineți că este mai bine să folosiți în schimb căutarea aleatorie. Intuitiv, acest lucru se datorează faptului că rețelele neuronale sunt adesea mult mai sensibile la unii parametri decât la alții. În limită, dacă este un parametru A contează, dar se schimbă b nu are niciun efect, atunci preferați să testați A mai complet decât în ​​câteva puncte fixe de mai multe ori.
  • optimizarea hiper-parametrii. Există un număr mare de cutii de instrumente de optimizare bayesiene hiper-parametri în jur și câțiva dintre prietenii mei au raportat, de asemenea, succes cu ei, dar experiența mea personală este că abordarea de ultimă oră a explorării unui spațiu frumos și larg de modele și hiperparametri este să folosești un stagiar:). Glumeam.

6. Stoarceți sucul

Odată ce găsiți cele mai bune tipuri de arhitecți și hiper-parametri, puteți utiliza încă câteva trucuri pentru a scoate din sistem ultimele bucăți de suc:

  • ansambluri. Ansamblurile model sunt o modalitate destul de mult garantată de a câștiga 2% din acuratețea oricărui lucru. Dacă nu vă puteți permite calculul la momentul testului, uitați-vă la distilarea ansamblului dvs. într-o rețea folosind cunoștințe întunecate.
  • lasă-l antrenament. Am văzut deseori oameni tentați să oprească modelul de formare atunci când pierderea validării pare să se reducă. Din experiența mea, rețelele continuă să se antreneze mult timp neintuitiv. Odată, am părăsit accidental un model de antrenament în timpul pauzelor de iarnă și când m-am întors în ianuarie, era SOTA („stadiul tehnicii”).

Concluzie

Odată ce ați ajuns aici, veți avea toate ingredientele pentru succes: aveți o înțelegere profundă a tehnologiei, a setului de date și a problemei, ați configurat întreaga infrastructură de instruire/evaluare și ați obținut o încredere ridicată în acuratețea sa și ați explorat modele din ce în ce mai complexe, obținând îmbunătățiri de performanță în moduri în care ați prezis fiecare pas al drumului. Acum sunteți gata să citiți multe lucrări, să încercați un număr mare de experimente și să obțineți rezultatele SOTA. Noroc!