greutăți

Antrenarea rețelelor neuronale poate fi foarte confuză. Care este o rată de învățare bună? Câte straturi ascunse ar trebui să aibă rețeaua dvs.? Abandonul este de fapt util? De ce gradienții dvs. dispar?

În acest post vom curăța cortina din spatele unora dintre aspectele mai confuze ale rețelelor neuronale și vă vom ajuta să luați decizii inteligente cu privire la arhitectura rețelei dvs. neuronale.

Vom vedea, de asemenea, cum putem folosi Greutățile și prejudecățile în nucleele Kaggle pentru a monitoriza performanța și a alege cea mai bună arhitectură pentru rețeaua noastră neuronală!

Vă recomand cu tărie să bifați acest kernel și să vă jucați cu diferitele blocuri pentru a vă perfecționa intuiția.

Dacă aveți întrebări, nu ezitați să-mi trimiteți un mesaj. Noroc!

1. Structura rețelei neuronale de bază

  • Acesta este numărul de caracteristici pe care rețeaua ta neuronală le folosește pentru a-și face predicțiile.
  • Vectorul de intrare are nevoie de un neuron de intrare pe caracteristică. Pentru datele tabulare, acesta este numărul de funcții relevante din setul de date. Doriți să selectați cu atenție aceste caracteristici și să eliminați orice ar putea conține modele care nu se vor generaliza dincolo de setul de antrenament (și care vor provoca supraadaptarea). Pentru imagini, acestea sunt dimensiunile imaginii dvs. (28 * 28 = 784 în cazul MNIST).

  • Acesta este numărul de predicții pe care doriți să le faceți.
  • Regresie: pentru sarcinile de regresie, aceasta poate fi o valoare (de exemplu, prețul locuinței). Pentru regresia multi-variabilă, este un neuron pe valoarea prezisă (de exemplu, pentru casetele de delimitare, pot fi 4 neuroni - câte unul pentru înălțimea cutiei de limitare, lățime, coordonată x, coordonată y).
  • Clasificare: Pentru clasificarea binară (spam-nu spam), folosim un neuron de ieșire per clasă pozitivă, unde ieșirea reprezintă probabilitatea clasei pozitive. Pentru clasificarea în mai multe clase (de exemplu, în detectarea obiectelor în care o instanță poate fi clasificată ca o mașină, un câine, o casă etc.), avem un neuron de ieșire pe clasă și folosim funcția de activare softmax pe stratul de ieșire pentru a asigura probabilitățile finale se ridică la 1.

Straturi ascunse și neuroni pe straturi ascunse

  • Numărul de straturi ascunse depinde în mare măsură de problemă și de arhitectura rețelei dvs. neuronale. În esență, încercați să vă deschideți calea spre arhitectura perfectă a rețelei neuronale - nu prea mare, nu prea mică, chiar corectă.
  • În general, 1-5 straturi ascunse vă vor servi bine pentru majoritatea problemelor. Când lucrați cu imagini sau date vocale, doriți ca rețeaua dvs. să aibă zeci-sute de straturi, care nu toate ar putea fi complet conectate. Pentru aceste cazuri de utilizare, există modele pre-instruite (YOLO, ResNet, VGG) care vă permit să utilizați părți mari din rețelele lor și să vă instruiți modelul în partea de sus a acestor rețele pentru a afla doar caracteristicile de ordin superior. În acest caz, modelul dvs. va avea în continuare doar câteva straturi de antrenat.
  • În general, este suficient să folosiți același număr de neuroni pentru toate straturile ascunse. Pentru unele seturi de date, având un prim strat mare și urmărirea acestuia cu straturi mai mici va duce la performanțe mai bune, deoarece primul strat poate învăța o mulțime de caracteristici de nivel inferior care pot alimenta câteva caracteristici de ordin superior în straturile următoare.

  • De obicei, veți obține mai mult un spor de performanță prin adăugarea mai multor straturi decât adăugarea mai multor neuroni în fiecare strat.
  • Vă recomand să începeți cu 1-5 straturi și 1-100 de neuroni și să adăugați încet mai multe straturi și neuroni până când începeți supraadezarea. Vă puteți urmări pierderea și precizia în tabloul de bord Greutăți și prejudecăți pentru a vedea ce straturi ascunse + combo de neuroni ascunși duce la cea mai bună pierdere.
  • Ceva care trebuie avut în vedere la alegerea unui număr mai mic de straturi/neuroni este că, dacă acest număr este prea mic, rețeaua dvs. nu va putea învăța tiparele care stau la baza datelor dvs. și, prin urmare, nu va fi inutilă. O abordare pentru a contracara acest lucru este să începeți cu un număr mare de straturi ascunse + neuroni ascunși și apoi să utilizați abandonul și oprirea timpurie pentru a lăsa dimensiunea rețelei neuronale în sine pentru dvs. Din nou, vă recomand să încercați câteva combinații și să urmăriți performanța în tabloul de bord Greutăți și prejudecăți pentru a determina dimensiunea de rețea perfectă pentru problema dvs.
  • Andrej Karpathy recomandă, de asemenea, îmbrăcămintea, apoi regularizați abordarea - „obțineți mai întâi un model suficient de mare încât să poată îmbrăca (adică se concentreze pe pierderea antrenamentului) și apoi regularizați-l în mod corespunzător (renunțați la unele pierderi de antrenament pentru a îmbunătăți pierderea din validare).
  • Regresie: eroarea pătrată medie este cea mai frecventă funcție de pierdere pentru optimizare, cu excepția cazului în care există un număr semnificativ de valori anterioare. În acest caz, utilizarea înseamnă eroare absolută sau pierdere Huber.
  • Clasificare: entropia încrucișată vă va servi bine în majoritatea cazurilor.

  • Dimensiunile mari ale loturilor pot fi grozave, deoarece pot valorifica puterea GPU-urilor pentru a procesa mai multe instanțe de antrenament de fiecare dată. OpenAI a găsit o dimensiune mai mare a lotului (de zeci de mii pentru modelarea limbajului B și B de clasificare a imaginilor și de milioane în cazul agenților RL) servește bine pentru scalare și paralelizare.
  • Cu toate acestea, există un caz care trebuie făcut și pentru dimensiuni mai mici ale lotului. Conform acestei lucrări de Masters și Luschi, avantajul obținut din paralelismul crescut de la rularea loturilor mari este compensat de generalizarea sporită a performanței și de amprenta de memorie mai mică realizată de loturile mai mici. Acestea arată că dimensiunile crescute ale loturilor reduc gama acceptabilă a ratelor de învățare care asigură o convergență stabilă. Mâncarea lor este că mai mic este, de fapt, mai bun; și că cea mai bună performanță este obținută de dimensiunile mini-lot între 2 și 32.
  • Dacă nu funcționați la scări masive, vă recomand să începeți cu dimensiuni mai mici ale lotului și să măriți încet dimensiunea și să monitorizați performanța în tabloul de bord Greutăți și prejudecăți pentru a determina cea mai bună potrivire.

Numărul de epoci

  • Ți-aș recomanda să începi cu un număr mare de epoci și să folosești oprirea timpurie (vezi secțiunea 4. Gradări de dispariție + explozie) pentru a opri antrenamentul atunci când performanța încetează.

Scalarea caracteristicilor dvs.

  • O notă rapidă: asigurați-vă că toate caracteristicile dvs. au o scară similară înainte de a le utiliza ca intrări în rețeaua dvs. neuronală. Acest lucru asigură o convergență mai rapidă. Când caracteristicile dvs. au scări diferite (de exemplu, salarii în mii și ani de experiență în zeci), funcția de cost va arăta ca bolul alungit din stânga. Aceasta înseamnă că algoritmul de optimizare va dura mult timp pentru a traversa valea în comparație cu utilizarea caracteristicilor normalizate (în dreapta).

2. Rata de învățare

  • Alegerea ratei de învățare este foarte importantă și doriți să vă asigurați că ați reușit acest lucru! În mod ideal, doriți să modificați din nou rata de învățare atunci când modificați ceilalți hiper-parametri ai rețelei.
  • Pentru a găsi cea mai bună rată de învățare, începeți cu valori foarte scăzute (10 ^ -6) și multiplicați-o încet cu o constantă până când ajunge la o valoare foarte mare (de exemplu, 10). Măsurați performanța modelului (comparativ cu jurnalul ratei de învățare) în tabloul de bord Greutăți și prejudecăți pentru a determina care rată v-a servit bine pentru problema dvs. Puteți apoi să vă recalificați modelul folosind această rată optimă de învățare.
  • Cea mai bună rată de învățare este de obicei jumătate din rata de învățare care determină divergența modelului. Simțiți-vă liber să setați diferite valori pentru learn_rate în codul însoțitor și să vedeți cum afectează modelul de performanță pentru a vă dezvolta intuiția în jurul ratelor de învățare.
  • Aș recomanda, de asemenea, utilizarea metodei de identificare a ratei de învățare propusă de Leslie Smith. Este o modalitate excelentă de a găsi o rată de învățare bună pentru majoritatea optimizatorilor de gradient (majoritatea variantelor de SGD) și funcționează cu majoritatea arhitecturilor de rețea.
  • De asemenea, consultați secțiunea despre programarea ratei de învățare de mai jos.

3. Momentul

  • Coborârea în gradient face pași mici și consistenți către minimele locale și când gradienții sunt mici, poate dura mult timp pentru a converge. Momentul, pe de altă parte, ia în considerare gradienții anteriori și accelerează convergența prin împingerea mai rapidă a văilor și evitarea minimelor locale.
  • În general, doriți ca valoarea impulsului dvs. să fie foarte aproape de una. 0.9 este un loc bun pentru a începe pentru seturi de date mai mici și doriți să vă apropiați progresiv de unul (0.999) cu cât setul dvs. de date devine mai mare. (Setarea nesterov = True permite impulsului să ia în considerare gradientul funcției de cost cu câțiva pași înaintea punctului curent, ceea ce îl face puțin mai precis și mai rapid.)

4. Degradare + Gradiente explozive

  • La fel ca oamenii, nu toate straturile de rețea neuronală învață cu aceeași viteză. Deci, atunci când algoritmul backprop propagă gradientul de eroare de la stratul de ieșire la primele straturi, gradienții devin din ce în ce mai mici până când sunt aproape neglijabili când ajung la primele straturi. Aceasta înseamnă că greutățile primelor straturi nu sunt actualizate semnificativ la fiecare pas.
  • Aceasta este problema degradării gradienților. (O problemă similară a exploziei gradienților apare atunci când gradienții pentru anumite straturi cresc progresiv, ducând la actualizări masive ale greutății pentru unele straturi, spre deosebire de altele.)
  • Există câteva modalități de a contracara gradienții care dispar. Să le aruncăm o privire acum!

Metoda de inițializare a greutății

  • Metoda corectă de inițializare a greutății poate accelera considerabil timpul până la convergență. Alegerea metodei de inițializare depinde de funcția de activare. Câteva lucruri de încercat:
  • Când utilizați ReLU sau RELU cu scurgeri, utilizați inițializarea He
  • Când utilizați SELU sau ELU, utilizați inițializarea LeCun
  • Când utilizați softmax, logistic sau tanh, utilizați inițializarea Glorot
  • Majoritatea metodelor de inițializare vin în arome de distribuție uniforme și normale.

  • BatchNorm învață pur și simplu mijloacele și scalele optime ale intrărilor fiecărui strat. Face acest lucru prin centrarea zero și normalizarea vectorilor de intrare, apoi scalarea și deplasarea lor. De asemenea, acționează ca un regulator, ceea ce înseamnă că nu avem nevoie de abandon sau de reglare L2.
  • Utilizarea BatchNorm ne permite să folosim rate de învățare mai ridicate (care duc la o convergență mai rapidă) și să conducă la îmbunătățiri uriașe în majoritatea rețelelor neuronale prin reducerea problemei gradienților care dispar. Singurul dezavantaj este că crește ușor timpii de antrenament din cauza calculelor suplimentare necesare la fiecare strat.

  • O modalitate excelentă de a reduce gradienții de la explozie, mai ales atunci când instruiți RNN-uri, este de a le clipi pur și simplu atunci când depășesc o anumită valoare. Aș recomanda să încercați clipnorm în loc de clipvalue, care vă permite să păstrați direcția vectorului de gradient consecventă. Clipnorm conține orice gradienți care norma l2 este mai mare decât un anumit prag.
  • Încercați câteva valori diferite de prag pentru a găsi una care funcționează cel mai bine pentru dvs.

  • Oprirea timpurie vă permite să vă trăiți antrenând un model cu mai multe straturi ascunse, neuroni ascunși și pentru mai multe epoci decât aveți nevoie și doar oprirea antrenamentului atunci când performanța încetează să se îmbunătățească consecutiv pentru n epoci. De asemenea, salvează cel mai performant model pentru dvs. Puteți activa oprirea timpurie configurând un apel invers atunci când vă potriviți modelul și setând save_best_only = True.

5. abandon

  • Abandonul este o tehnică fantastică de regularizare care vă oferă un spor masiv de performanță (

2% pentru modele de ultimă generație) pentru cât de simplă este de fapt tehnica. Abandonul este de a opri aleatoriu un procent de neuroni la fiecare strat, la fiecare pas de antrenament. Acest lucru face rețeaua mai robustă, deoarece nu se poate baza pe un anumit set de neuroni de intrare pentru a face predicții. Cunoștințele sunt distribuite între întreaga rețea. Aproximativ 2 ^ n (unde n este numărul de neuroni din arhitectură) rețelele neuronale ușor unice sunt generate în timpul procesului de antrenament și sunt asamblate împreună pentru a face predicții.

  • O rată bună a abandonului este între 0,1 și 0,5; 0,3 pentru RNN și 0,5 pentru CNN. Folosiți rate mai mari pentru straturi mai mari. Creșterea ratei abandonului scade supraadaptarea și scăderea ratei este utilă pentru a combate subadaptarea.
  • Doriți să experimentați diferite rate ale valorilor abandonului, în straturile anterioare ale rețelei și să verificați tabloul de bord Greutăți și prejudecăți pentru a alege cel mai performant. Cu siguranță nu doriți să utilizați abandonul în straturile de ieșire.
  • Citiți această lucrare înainte de a utiliza Dropout împreună cu BatchNorm.
  • În acest kernel am folosit AlphaDropout, o aromă a renunțării la vanilie care funcționează bine cu funcțiile de activare SELU prin păstrarea abaterilor medii și standard ale intrării.
  • 6. Optimizatori

    • Gradient Descent nu este singurul joc de optimizare din oraș! Există câteva dintre care să alegeți. Această postare face o treabă bună de a descrie unii dintre optimizatorii din care puteți alege.

    • Sfatul meu general este să folosiți Descendența gradientului stochastic dacă vă pasă profund de calitatea convergenței și dacă timpul nu este esențial.
    • Dacă vă pasă de timpul până la convergență și un punct apropiat de convergența optimă va fi suficient, experimentați cu optimizatorii Adam, Nadam, RMSProp și Adamax. Tabloul dvs. de bord Greutăți și prejudecăți vă va îndruma către optimizatorul care funcționează cel mai bine pentru dvs.!
    • Adam/Nadam sunt de obicei puncte de plecare bune și tind să fie destul de iertătoare pentru o învățare proastă târzie și a altor hiperparametri non-optimi.
    • Potrivit lui Andrej Karpathy, „un SGD bine reglat îl va depăși aproape întotdeauna pe Adam” în cazul ConvNets.
    • În acest kernel, am obținut cele mai bune performanțe de la Nadam, care este doar optimizatorul dvs. obișnuit de Adam cu trucul Nester și, astfel, converge mai repede decât Adam.

    7. Programarea ratei de învățare

    Tastați legenda imaginii aici (opțional)

    8. Mai sunt câteva lucruri

    • Încercați EfficientNets pentru a vă dimensiona rețeaua într-un mod optim.
    • Citiți această lucrare pentru o prezentare generală a unor rate suplimentare de învățare, a dimensiunilor lotului, a impulsului și a tehnicilor de descompunere a greutății.
    • Și aceasta pe media de greutate stochastică (SWA). Aceasta arată că o generalizare mai bună poate fi realizată prin medierea mai multor puncte de-a lungul traiectoriei SGD, cu o rată de învățare ciclică sau constantă.
    • Citiți ghidul excelent al lui Andrej Karpathy pentru a obține cel mai mult suc din rețelele dvs. neuronale.

    Rezultate

    Am explorat o mulțime de fațete diferite ale rețelelor neuronale în acest post!

    Ne-am uitat la modul de configurare a unei rețele neuronale de bază (inclusiv alegerea numărului de straturi ascunse, neuroni ascunși, dimensiuni de lot etc.)

    Am aflat despre rolul impulsului și al ratelor de învățare în influențarea performanței modelului.

    Și, în cele din urmă, am explorat problema gradienților care dispar și cum să o abordăm folosind funcții de activare nesaturate, BatchNorm, tehnici mai bune de inițializare a greutății și oprirea timpurie.

    Puteți compara acuratețea și performanțele de pierdere pentru diferitele tehnici pe care le-am încercat într-o singură diagramă, vizitând tabloul de bord Greutăți și prejudecăți.

    Rețelele neuronale sunt fiare puternice care vă oferă o mulțime de pârghii de modificat pentru a obține cea mai bună performanță pentru problemele pe care încercați să le rezolvați! Dimensiunea simplă a personalizărilor pe care le oferă poate fi copleșitoare chiar și pentru practicienii experimentați. Instrumentele precum Greutățile și prejudecățile sunt cei mai buni prieteni ai dvs. în navigarea în țara hiper-parametrilor, încercând diferite experimente și alegând cele mai puternice modele.

    Sper că acest ghid va servi drept un bun punct de plecare în aventurile voastre. Noroc!

    Vă recomand cu tărie să bifați acest kernel și să vă jucați cu diferitele blocuri pentru a vă perfecționa intuiția. Și iată un demo care vă va ajuta să folosiți W + B pentru a alege arhitectura perfectă a rețelei neuronale.