Työskentely hermoverkkojen kanssa: tarkistuslista virheenkorjausta varten

Työskentely hermoverkkojen kanssa: tarkistuslista virheenkorjausta varten

Koneoppimisohjelmistotuotteiden koodi on usein monimutkainen ja varsin hämmentävä. Virheiden havaitseminen ja poistaminen siinä on resursseja vaativa tehtävä. Jopa yksinkertaisin myötäkytkentäiset neuroverkot vaatii vakavaa lähestymistapaa verkkoarkkitehtuuriin, painojen alustamiseen ja verkon optimointiin. Pieni virhe voi johtaa epämiellyttäviin ongelmiin.

Tämä artikkeli käsittelee hermoverkkojen virheenkorjausalgoritmia.

Skillbox suosittelee: Käytännön kurssi Python-kehittäjä tyhjästä.

Muistutamme sinua: kaikille "Habrin" lukijoille - 10 000 ruplan alennus ilmoittautuessaan mille tahansa Skillbox-kurssille "Habr" -tarjouskoodilla.

Algoritmi koostuu viidestä vaiheesta:

  • helppo aloitus;
  • tappioiden vahvistaminen;
  • välitulosten ja yhteyksien tarkistaminen;
  • parametrien diagnostiikka;
  • työn valvonta.

Jos jokin tuntuu kiinnostavammalta kuin muut, voit siirtyä välittömästi näihin osiin.

Helppo aloitus

Neuraaliverkkoa, jolla on monimutkainen arkkitehtuuri, regularisointi ja oppimisnopeuden ajoitus, on vaikeampi korjata kuin tavallista. Olemme tässä hieman hankalia, koska itse kohta liittyy epäsuorasti virheenkorjaukseen, mutta tämä on silti tärkeä suositus.

Yksinkertainen alku on luoda yksinkertaistettu malli ja harjoitella sitä yhden tietojoukon (pisteen) perusteella.

Ensin luomme yksinkertaistetun mallin

Aloitaksesi nopeasti luomme pienen verkon, jossa on yksi piilotettu kerros ja tarkistamme, että kaikki toimii oikein. Sitten monimutkaistamme mallia vähitellen tarkistamalla sen rakenteen jokainen uusi osa (lisäkerros, parametri jne.) ja siirrytään eteenpäin.

Koulutamme mallin yhdelle datajoukolle (pisteelle).

Projektisi nopean mielenterveyden tarkistuksena voit käyttää yhtä tai kahta harjoitustietopistettä varmistaaksesi, että järjestelmä toimii oikein. Neuroverkon tulee osoittaa 100 % tarkkuutta koulutuksessa ja testauksessa. Jos näin ei ole, joko malli on liian pieni tai sinulla on jo vika.

Vaikka kaikki olisi hyvin, valmistele malli yhdelle tai useammalle aikakaudelle ennen kuin jatkat.

Tappion arviointi

Häviöarvio on tärkein tapa tarkentaa mallin suorituskykyä. Sinun on varmistettava, että häviö vastaa ongelmaa ja että häviöfunktiot on mitoitettu oikealla asteikolla. Jos käytät useampaa kuin yhtä häviötyyppiä, varmista, että ne ovat kaikki samassa järjestyksessä ja skaalattu oikein.

On tärkeää olla tarkkaavainen ensimmäisten tappioiden suhteen. Tarkista kuinka lähellä todellinen tulos on odotettua tulosta, jos malli aloitettiin satunnaisella arvauksella. SISÄÄN Andrey Karpathyn työ ehdottaa seuraavaa:: "Varmista, että saat odottamasi tuloksen, kun aloitat pienellä määrällä parametreja. Tietojen häviäminen on parempi tarkistaa välittömästi (regulaation asteen ollessa nolla). Esimerkiksi CIFAR-10:lle, jossa on Softmax-luokitin, odotamme alkuperäisen häviön olevan 2.302, koska odotettu diffuusitodennäköisyys on 0,1 jokaiselle luokalle (koska luokkaa on 10) ja Softmax-häviö on oikean luokan negatiivinen logaritmistodennäköisyys. as − ln (0.1) = 2.302."

Binääriesimerkissä samanlainen laskenta tehdään yksinkertaisesti jokaiselle luokalle. Tässä on esimerkiksi tiedot: 20% nollaa ja 0% 80:tä. Odotettu alkuhäviö on –1 ln (0,2) –0,5 ln (0,8) = 0,5. Jos tulos on suurempi kuin 0,693147, se voi tarkoittaa, että hermoverkkojen painot eivät ole oikein tasapainotettuja tai dataa ei ole normalisoitu.

Välitulosten ja liitäntöjen tarkistus

Hermoverkon virheenkorjaus edellyttää, että ymmärrät verkon sisällä olevien prosessien dynamiikkaa ja yksittäisten välikerrosten roolia niiden yhteydessä. Tässä ovat yleiset virheet, joita saatat kohdata:

  • virheelliset lausekkeet gradle-päivityksille;
  • painopäivityksiä ei käytetä;
  • räjähtävät gradientit.

Jos gradientin arvot ovat nolla, tämä tarkoittaa, että optimoijan oppimisnopeus on liian hidas tai että kohtaat virheellisen lausekkeen gradientin päivittämiseksi.

Lisäksi on tarpeen seurata kunkin kerroksen aktivointitoimintojen arvoja, painoja ja päivityksiä. Esimerkiksi parametrien päivitysten suuruus (painotukset ja poikkeamat) pitäisi olla 1-e3.

On olemassa ilmiö nimeltä "Dying ReLU" tai "kadoutuva gradienttiongelma", kun ReLU-neuronit tulostavat nollan oppittuaan suuren negatiivisen bias-arvon painoilleen. Näitä hermosoluja ei koskaan ammuta uudelleen missään datan kohdassa.

Voit käyttää gradientin tarkistusta tunnistaaksesi nämä virheet arvioimalla gradientin numeerista lähestymistapaa käyttämällä. Jos se on lähellä laskettuja gradientteja, takaisinpropagaatio toteutettiin oikein. Voit luoda gradientin tarkistuksen tutustumalla näihin CS231:n mahtaviin resursseihin täällä и täälläSekä oppitunti Andrew Nga tästä aiheesta.

Faizan Sheikh osoittaa kolme päämenetelmää neuroverkon visualisoimiseksi:

  • Alkuvaiheet ovat yksinkertaisia ​​menetelmiä, jotka näyttävät meille koulutetun mallin yleisen rakenteen. Näitä ovat neuroverkon yksittäisten kerrosten muotojen tai suodattimien tulos ja kunkin kerroksen parametrit.
  • Aktivointiin perustuva. Niissä tulkitsemme yksittäisten hermosolujen tai hermosoluryhmien aktivaatioita ymmärtääksemme niiden toimintoja.
  • Gradienttien perusteella. Näillä menetelmillä on taipumus manipuloida gradientteja, jotka muodostuvat malliharjoittelun eteenpäin ja taaksepäin suorituksista (mukaan lukien näkyvyyskartat ja luokan aktivointikartat).

Yksittäisten kerrosten aktivointien ja kytkentöjen visualisointiin on olemassa useita hyödyllisiä työkaluja, mm. ConX и Tensorboard.

Työskentely hermoverkkojen kanssa: tarkistuslista virheenkorjausta varten

Parametrien diagnostiikka

Neuroverkoilla on paljon parametreja, jotka ovat vuorovaikutuksessa keskenään, mikä vaikeuttaa optimointia. Itse asiassa tämä osio on asiantuntijoiden aktiivisen tutkimuksen kohteena, joten alla olevia ehdotuksia tulee pitää vain neuvoina, lähtökohtina, joista rakentaa.

Paketin koko (erän koko) – Jos haluat, että eräkoko on riittävän suuri saadakseen tarkkoja virhegradienttiarvioita, mutta riittävän pieni stokastiseen gradientin laskeutumiseen (SGD) verkkosi tasaamiseksi. Pienet eräkoot johtavat nopeaan lähentymiseen koulutusprosessin aikaisen melun vuoksi ja sen jälkeen optimointivaikeuksiin. Tämä on kuvattu tarkemmin täällä.

Oppimisaste - liian alhainen johtaa hitaaseen lähentymiseen tai riskiin juuttua paikallisiin minimiin. Samaan aikaan korkea oppimisnopeus aiheuttaa optimointieroja, koska vaarana on hypätä tappiofunktion syvän mutta kapean osan läpi. Kokeile nopeuden ajoitusta vähentääksesi sitä, kun harjoitat hermoverkkoa. Ajan tasalla CS231n:n kanssa tälle ongelmalle on omistettu suuri osa.

Gradienttileikkaus  — parametrien gradientien trimmaus takaisin leviämisen aikana enimmäisarvolla tai marginaalinormilla. Hyödyllinen räjähtävien gradienttien vianmäärityksessä, joita saatat kohdata kohdassa XNUMX.

Erän normalisointi - käytetään normalisoimaan kunkin kerroksen syöttödataa, mikä mahdollistaa sisäisen kovariaattisiirtymän ongelman ratkaisemisen. Jos käytät Dropoutia ja Batch Normaa yhdessä, tutustu tähän artikkeliin.

Stokastinen gradienttilasku (SGD) — On olemassa useita SGD-lajikkeita, jotka käyttävät vauhtia, mukautuvaa oppimisnopeutta ja Nesterov-menetelmää. Millään niistä ei kuitenkaan ole selvää etua sekä oppimisen tehokkuuden että yleistyksen kannalta (yksityiskohdat täältä).

Laillistaminen - on ratkaisevan tärkeä yleistettävän mallin rakentamisessa, koska se lisää sakkoa mallin monimutkaisuudesta tai äärimmäisistä parametriarvoista. Tämä on tapa vähentää mallin varianssia lisäämättä merkittävästi sen harhaa. Lisää tarkemmat tiedot - täältä.

Jos haluat arvioida kaiken itse, sinun on poistettava säännöstely käytöstä ja tarkistettava tietojen häviämisen gradientti itse.

Jättäytyä pois on toinen tapa virtaviivaistaa verkkoa ruuhkien estämiseksi. Harjoittelun aikana pudotus tapahtuu vain ylläpitämällä hermosolun aktiivisuutta tietyllä todennäköisyydellä p (hyperparametri) tai asettamalla se nollaan päinvastoin. Tämän seurauksena verkon on käytettävä erilaista parametrien osajoukkoa jokaiselle opetuserälle, mikä vähentää muutoksia tietyissä parametreissa, joista tulee hallitsevia.

Tärkeää: Jos käytät sekä dropout- että eränormalisointia, ole varovainen näiden toimintojen järjestyksen suhteen tai jopa käyttäessäsi niitä yhdessä. Tästä kaikesta keskustellaan ja täydennetään edelleen aktiivisesti. Tässä on kaksi tärkeää keskustelua tästä aiheesta Stackoverflowssa и arkisto.

Työnohjaus

Kyse on työnkulkujen ja kokeilujen dokumentoinnista. Jos et dokumentoi mitään, saatat unohtaa esimerkiksi, mitä oppimisnopeutta tai luokkapainoja käytetään. Ohjauksen ansiosta voit helposti tarkastella ja toistaa aiempia kokeita. Näin voit vähentää päällekkäisten kokeiden määrää.

Manuaalinen dokumentointi voi kuitenkin muodostua vaikeaksi tehtäväksi suuren työmäärän tapauksessa. Tässä ovat työkalut, kuten Comet.ml, jotka auttavat sinua kirjaamaan automaattisesti tietojoukkoja, koodimuutoksia, koehistoriaa ja tuotantomalleja, mukaan lukien tärkeimmät tiedot mallistasi (hyperparametrit, mallin suorituskykymittarit ja ympäristötiedot).

Neuraaliverkko voi olla erittäin herkkä pienille muutoksille, ja tämä johtaa mallin suorituskyvyn laskuun. Työsi seuranta ja dokumentointi on ensimmäinen askel, jonka voit ottaa ympäristön ja mallinnuksen standardoimiseksi.

Työskentely hermoverkkojen kanssa: tarkistuslista virheenkorjausta varten

Toivon, että tämä viesti voi olla lähtökohta hermoverkkosi virheenkorjauksen aloittamiselle.

Skillbox suosittelee:

Lähde: will.com

Lisää kommentti