Mélyreható tanulási gyakorlatok (1) - Súlyos inicializálás

Alapok, súly-inicializálási bukások és legjobb gyakorlatok

https://pixabay.com/photo-1600668/

Motiváció

A mély tanulás kezdőjeként felismertem az egyik dolog, hogy nincs sok online dokumentáció, amely minden mély tanulási trükköt lefedne egy helyen. Számos apró bevált gyakorlat létezik, kezdve az egyszerű trükkökkel, például a súlyok inicializálásáig, a szabályosítástól az kissé összetett technikáig, például a ciklikus tanulási sebességig, amelyek megkönnyítik és hatékonyabbá teszik az idegi hálókat. Ez inspirálta, hogy írjak ezt a blogsorozatot, ahol annyi árnyalattal foglalkozom, amennyire csak tudom, hogy a mélyebb tanulás megvalósítása egyszerűbbé váljon az Ön számára.

A blog írása közben a feltételezés az, hogy alapvető ötleted van arról, hogy az ideghálózatokat hogyan képzik. A súlyok, torzítások, rejtett rétegek, aktiválások és aktiválási funkciók megértése tisztábbá teszi a tartalmat. Ajánlom ezt a kurzust, ha szeretnénk megalapozni a mély tanulás alapjait.

Megjegyzés: Ha ideghálózat rétegeire hivatkozom, ez egy egyszerű ideghálózat rétegeire utal, azaz a teljesen összekapcsolt rétegekre. Természetesen néhány módszer, amiről beszélek, a konvolúciós és a visszatérő ideghálózatokra is vonatkozik. Ebben a blogban a súlymérési mátrixok inicializálásával és azok mérséklésével kapcsolatos kérdésekről fogok beszélni. Előtte térjen át néhány alapvető elemre és jelölésre, amelyeket a továbblépéskor használunk.

Alapok és jelölések

Vegyünk egy L rétegű neurális hálózatot, amely L-1 rejtett rétegeket és 1 kimeneti réteget tartalmaz. Az l réteg paramétereit (súlyát és torzítását) az alábbiak szerint mutatjuk be

A súlyok és torzítások mellett az edzés során a következő közbenső változókat kell kiszámítani

A neurális hálózat képzése 4 lépésből áll:

  1. Inicializálja a súlyokat és a torzításokat.
  2. Előre terjedés: Az X bemenet felhasználásával W súlyokat és b torzításokat használunk minden rétegre, amelyet Z és A kiszámítunk. Az utolsó rétegben kiszámoljuk az f (A ^ (L-1)) értéket, amely lehet szigmoid, softmax vagy lineáris függvény A ^ (L-1) és ez adja az y_hat jóslatot.
  3. Számítsuk ki a veszteségfüggvényt: Ez a tényleges y címke és az előre jelzett y_hat függvény. Rámutat arra, hogy milyen messze vannak a jóslataink a tényleges céltól. Célunk, hogy minimalizáljuk ezt a veszteségfüggvényt.
  4. Visszatekintés: Ebben a lépésben kiszámoljuk az f (y, y_hat) veszteségfüggvény gradienseit A, W és b viszonylatában, nevezetesen dA, dW és db. Ezekkel a színátmenetekkel frissítjük a paraméterek értékeit az utolsó rétegtől az elsőig.
  5. Ismételje meg a 2–4. Lépést n iterációval / korszakig, amíg úgy érezzük, hogy minimalizáltuk a veszteség funkciót anélkül, hogy a vonat adatait túlteljesítenénk (erről bővebben később!)

Itt egy rövid áttekintés a 2., 3. és 4. lépésről, ha egy hálózat 2 rétegű, azaz egy rejtett rétegű. (Vegye figyelembe, hogy az egyszerűség kedvéért itt nem adtam hozzá az elfogultsági feltételeket):

ElőrehaladásVisszatekintés

Inicializáló súlyok W

A hálózat kiépítése során az egyik kiindulási pont a súlymátrix helyes inicializálása. Vegyünk két olyan forgatókönyvet, amely problémákat okozhat a modell képzése közben:

1. Minden súly inicializálása 0-ra

Csak tedd oda - ez teszi modelljét egyenértékűvé a lineáris modellel. Ha az összes súlyt 0-ra állítja, akkor a deriváció a veszteségfüggvény szempontjából megegyezik minden w-ban w ^ l-ben, tehát az összes súly azonos értékű a következő iterációban. Ez a rejtett egységeket szimmetrikussá teszi és folytatja az összes futtatott n iterációval. Így a súly nullára állítása nem teszi jobbá a hálózatot, mint egy lineáris modell. Fontos megjegyezni, hogy a torzítás 0-ra állítása nem okoz problémát, mivel a nullán kívüli súlyok gondoskodnak a szimmetria megtöréséről, és még ha az eltérés 0 is, minden neuron értékei továbbra is különböznek.

2. A súlyok inicializálása véletlenszerűen

A súlyok véletlenszerű inicializálása a szokásos normál eloszlás (np.random.randn (méret_l, méret_l-1) Pythonban) követése közben (mély) hálózattal való munka során 2 kérdést okozhat - eltűnő színátmenetek vagy felrobbanó színátmenetek.

a) Eltűnő színátmenetek - Mély hálózatok esetén bármely aktivációs funkcióhoz az abs (dW) egyre kisebb lesz, amikor minden réteggel visszafelé haladunk a hátsó terjedés során. A korábbi rétegek ilyen esetben a leglassabban edzhetnek.

A súly frissítése csekély, és lassabb konvergenciát eredményez. Ez lassítja a veszteség funkció optimalizálását. A legrosszabb esetben ez teljesen megakadályozhatja az ideghálózat továbbképzését.

Pontosabban, szigmoid (z) és tanh (z) esetén, ha a súlyok nagyok, akkor a gradiens eltűnő mértékben kicsi lesz, ezáltal megakadályozva, hogy a súlyok megváltoztassák értéküket. Ennek oka az, hogy az abszolút érték (dW) kissé növekszik, vagy esetleg kisebb lesz, és kisebb lesz minden iterációnál. A RELU (z) esetén a eltűnési gradiensek általában nem jelent problémát, mivel a gradiens 0 negatív (és nulla) bemenetek esetén és 1 pozitív bemenetek esetén.

b) Robbanó színátmenetek - Ez pontosan ellentétes a eltűnő színátmenetekkel. Fontolja meg, hogy van-e negatív és nagy tömege van, és kicsi az A aktiválása (amint a szigmoid (z) esetében fordulhat elő). Ha ezeket a súlyokat megszorozzuk a rétegek mentén, nagy változást okoznak a költségekben. Így a színátmenetek is nagyok lesznek. Ez azt jelenti, hogy a W-ban a W - ⍺ * dW-os változások hatalmas lépésekben haladnak, a lefelé irányuló nyomaték növekszik.

Ennek eredményeként ingadozhat a minimumok körül, vagy akár újra és újra túllépheti az optimált, és a modell soha nem fog tanulni!

A felrobbanó színátmenetek másik hatása az, hogy a gradiensek hatalmas értékei túlcsordulást okozhatnak, ami helytelen számításokhoz vagy a NaN-ok bevezetéséhez vezethet. Ez azt is eredményezheti, hogy a NaN érték veszteséget vesz fel.

Legjobb gyakorlatok

1. A RELU / szivárgó RELU használata aktivációs funkcióként, mivel viszonylag erőteljesen reagál a megszűnő / felrobbant gradiens problémára (különösen a nem túl mély hálózatok esetében). A szivárgó RELU-k esetében soha nincs 0 gradiens. Így soha nem halnak meg, és az edzés folytatódik.

2. A mély hálózatok esetében heurisztikát használhatunk a súlyok inicializálására a nemlineáris aktiválási függvénytől függően. Itt ahelyett, hogy a normál normál eloszlásból rajzolnánk, a normál eloszlástól k / n szórású W-t rajzolunk, ahol k az aktiválási funkciótól függ. Noha ezek a heurisztikák nem oldják meg teljesen a felrobbanó / eltűnő gradiensek kérdését, nagymértékben segítik enyhíteni azt. A leggyakoribbak a következők:

a) RELU (z) esetén - W véletlenszerűen generált értékeit megszorozzuk:

b) Tanh (z) esetében - a heurisztikát Xavier inicializációnak nevezzük. Hasonló az előzőhöz, azzal a különbséggel, hogy k értéke 2 helyett 1.

A TensorFlow esetében W = tf.get_variable ('W', [tompítva], inicializáló), ahol Initizer = tf.contrib.layers.xavier_initializer ()

c) Egy másik gyakran használt heurisztika a következő:

Ezek jó kiindulási pontot jelentenek az inicializáláshoz és enyhítik a felrobbanó vagy eltűnő gradiensek esélyét. Nem súlyosítják meg sem az 1-et, sem a túlságosan kevesebbet a súlyt. Tehát a gradiensek nem tűnnek el, vagy nem robbannak fel túl gyorsan. Segítik a lassú konvergencia elkerülését, biztosítva azt is, hogy ne rezgjünk tovább a minimumoktól. A fentieknek más változatai is léteznek, amelyek fő célja ismét a paraméterek szórásának minimalizálása.

3. Színátmenetek kivágása - Ez egy másik módja a felrobbanó gradiens problémának. Beállítunk egy küszöbértéket, és ha a gradiens választott funkciója meghaladja ezt a küszöböt, akkor egy másik értékre állítjuk. Például, normalizálja a színátmeneteket, amikor az L2 norma meghalad egy bizonyos küszöböt - W = W * küszöb / l2_norm (W), ha l2_norm (W)> küszöb

Fontos megjegyezni, hogy a W különféle inicializálásairól beszéltünk, de nem a b torzításokról. Ennek oka az, hogy a torzításhoz kapcsolódó gradiensek csak az adott réteg lineáris aktiválásától függenek, nem pedig a mélyebb rétegek gradienseitől. Így a torzítási feltételek gradiensei nem csökkennek vagy robbannak fel. Mint korábban említettük, biztonságosan inicializálhatók 0-ra.

Következtetés

Ebben a blogban a súlyos inicializálási hibákat és néhány enyhítési technikát tárgyaltunk. Ha hiányozna bármilyen más hasznos betekintésem a témához kapcsolódóan, örömmel tanulnám tőled! A következő blogban a túlteljesítés és a színátmenet ellenőrzésének csökkentésére szolgáló módszerekről fogok beszélni - trükk, hogy a hibakeresést egyszerűbbé tegyük!

Irodalom

  1. https://www.coursera.org/learn/deep-neural-network/lecture/RwqYe/weight-initialization-for-deep-networks
  2. Neurális hálózatok: edzés hátsó szaporodással - Jeremy Jordan
  3. Gyengéd bevezetés a színátmenetek felrobbantásáról a neurális hálózatokban, Jason Brownlee
  4. Eltűnő gradiens probléma
  5. https://www.quora.com/Why-is-it-a-problem-to-have-exploding-gradients-in-a-neural-net-especially-in-an-RNN

Rólam: Az USF MS Data Science szakán és a számítógépes tudományban diplomát szerzett, 2 éves tapasztalattal rendelkezik a prediktív és ajánlási algoritmusok felépítésében, valamint üzleti betekintés készítésében a pénzügyi és lakossági ügyfelek számára. Nagyon izgatott vagyok a lehetőségeiről, hogy gépi tanulásomat és mélyreható ismereteimet alkalmazhassam a valós problémákra.
Nézze meg a többi blogomat itt!
LinkedIn: https://www.linkedin.com/in/neerja-doshi/