Az IMDB filmszemlék bináris osztályozása

Használja a Kerast az értékelések osztályozásához az érzelmek alapján.

Rakshit Raj

Július 11. · 8 perc olvasás

A bináris osztályozás a minták két kategória egyikébe történő osztályozására utal.

bináris

Ebben a példában egy neurális hálózatot fogunk megtervezni, hogy elvégezzük az IMDB filmszemlék adatállományából az osztályzatok két osztályú vagy bináris osztályozását, annak megállapítására, hogy a vélemények pozitívak vagy negatívak. A Python könyvtárat, a Keras-t fogjuk használni.

Ha alapvető problémát keres, nézze meg az MNIST adatkészlet megoldását. Az ezt követő tartalom elsősorban az MNIST, a „helló világ! a mély tanulás.

Oldja meg az MNIST képosztályozási problémát

A Deep Learning és Keras „hello world!” 10 perc alatt

felédatascience.com

Az IMDB adatkészlet 50 000 erősen polarizált véleménykészlet az Internetes filmadatbázisból. 25000 értékelésre vannak felosztva, egyenként képzésre és tesztelésre. Minden készlet azonos számú (50%) pozitív és negatív véleményt tartalmaz.

Az IMDB adatkészlet Keras csomagolásban van. Áttekintésekből és azok megfelelő címkéiből áll (0 negatív és 1 pozitív kritika esetén). Az áttekintések szavak sorrendje. Előre feldolgozva jönnek egész számok sorozataként, ahol minden egyes szám egy adott szót jelent a szótárban.

Az IMDB adatkészlet közvetlenül a Kerasból tölthető be, és általában körülbelül 80 MB-ot tölt le a gépére.

Töltsük be az előre csomagolt adatokat a Kerasból. A leggyakrabban előforduló szavakból csak 10 000 szerepel.

A rúgásokhoz dekódoljuk az első véleményt.

Nem adhatunk be egész számok listáját a mély neurális hálózatunkba. Tenzorrá kell alakítanunk őket.

Adataink előkészítéséhez egy kóddal kódoljuk a listáinkat, és ezeket 0 és 1 vektorokká alakítjuk. Ez minden szekvenciánkat 10 000 dimenziós vektorba fújná fel, amelyek az összes indexet 1-nek tartalmazzák, és megfelelnek az adott szekvenciában lévő egész számoknak. Ennek a vektornak minden indexében lesz 0 elem, amely nem szerepel az egész szekvenciában.

Egyszerűen fogalmazva, az egyes áttekintéseknek megfelelő 10 000 dimenziós vektor meglesz

  • Minden index, amely egy szónak felel meg
  • Minden index, amelynek értéke 1, egy szó, amely jelen van a felülvizsgálatban, és egész párjával jelöli.
  • Minden 0-t tartalmazó index olyan szó, amely nem szerepel a felülvizsgálatban.

Manuálisan vektorizáljuk adatainkat a maximális érthetőség érdekében. Ez egy tenzor alakzatot eredményez (25000, 10000).

A bemeneti adataink olyan vektorok, amelyeket fel kell térképezni a méretező címkékre (0 és 1). Ez az egyik legegyszerűbb beállítás, és egy teljesen összekapcsolt, sűrű rétegű, relu aktiválású egyszerű köteg nagyon jól teljesít.

Rejtett rétegek

Ebben a hálózatban rejtett rétegeket fogunk kihasználni. Rétegeinket úgy definiáljuk.

Az argumentum, amelyet minden egyes sűrű rétegnek továbbítunk (16), egy réteg rejtett egységeinek száma.

A relu aktiválású sűrű réteg kimenete a tenzorműveletek láncolata után keletkezik. Ezt a műveleti láncot úgy valósítják meg

Ahol W a súlymátrix és b az előfeszítés (tenzor).

16 rejtett egység birtoklása azt jelenti, hogy a W mátrix alakú lesz (input_Dimension, 16). Ebben az esetben, ha a bemeneti vektor mérete 10 000, akkor a Súlymátrix alakja (10000, 16) lesz. Ha ezt a hálózatot ábrázolná grafikonként, 16 neuront látna ebben a rejtett rétegben.

A laikus kifejezéssel élve 16 golyó lesz ebben a rétegben.

E golyók vagy rejtett egységek mindegyike egy dimenzió a réteg ábrázolási terében. A reprezentációs tér az adatok életképes ábrázolásainak halmaza. Minden rejtett egységből álló rejtett réteg célja, hogy megtanulja az adatok egy meghatározott átalakítását vagy egy tulajdonságot/mintát az adatokból.

A DeepAI.org nagyon informatív módon írja fel a rejtett rétegeket.

A rejtett rétegek egyszerűen megfogalmazva matematikai függvények olyan rétegei, amelyek mindegyike a kívánt eredményre jellemző kimenet létrehozására szolgál.

A rejtett rétegek lehetővé teszik a neurális hálózat működésének lebontását az adatok specifikus transzformációira. Minden rejtett réteg funkció egy meghatározott kimenet előállítására szakosodott. Például az emberi szem és fül azonosítására használt rejtett réteg funkciókat a következő rétegek együttesen használhatják a képek arcainak azonosítására. Míg a szemek azonosítására szolgáló funkciók önmagukban nem elegendők az objektumok önálló felismeréséhez, együttesen működhetnek egy ideghálózaton belül.

Modell építészet

A modellünknél használni fogjuk

  1. Két közbenső réteg, egyenként 16 rejtett egységgel
  2. Harmadik réteg, amely a skaláris hangulat-előrejelzést adja ki
  3. A köztes rétegek a relu aktiválási funkciót fogják használni. A relu vagy a Rectified linear unit függvény nullázza a negatív értékeket.
  4. Sigmoid aktiválás a végső réteghez vagy a kimeneti réteghez. Egy szigmoid függvény tetszőleges értékeket „összenyom” a [0,1] tartományba.

Vannak formális elvek, amelyek a modell építészeti tulajdonságainak kiválasztásában szemléletünket irányítják. Ezekkel az esettanulmány nem foglalkozik.

Ebben a lépésben kiválasztunk egy optimalizálót, egy veszteségfüggvényt és a megfigyelendő mutatókat. Megyünk előre

  • binary_crossentropy loss function, amelyet általában a bináris osztályozáshoz használnak
  • rmsprop optimalizáló és
  • pontosság, mint a teljesítmény mértéke

Az optimalizáló, a veszteségfüggvény és a metrika választásait stringként átadhatjuk a fordítási függvénynek, mert az rmsprop, a bináris_keresztrópia és a pontosság Keras csomagolású.

Használhat egy testreszabott veszteségfüggvényt vagy optimalizálót úgy, hogy egy egyéni osztálypéldányt argumentumként továbbít a veszteség, az optimalizáló vagy a mertics mezőkbe.

Ebben a példában az alapértelmezett választásainkat hajtjuk végre, de az osztálypéldányok átadásával fogjuk megtenni. Pontosan így tennénk, ha testre szabnánk a paramétereket.

Képzési adataink egy részét elkülönítjük a modell pontosságának érvényesítéséhez, miközben a modell edz. Egy validációs készlet lehetővé teszi számunkra, hogy a korábban nem látott adatok alapján figyelemmel kísérjük modellünk előrehaladását, amikor az korszakokon megy keresztül a képzés során.

Az érvényesítési lépések segítenek a modell edzésparamétereinek finomhangolásában, hogy elkerüljük az adatok túlterhelését.

Kezdetben 20 korszakra készítjük modelljeinket 512 minta mini-tételekben. Az érvényesítési készletet átadjuk az illesztési módszernek is.

Az fit metódus meghívása egy History objektumot eredményez. Ez az objektum egy olyan tagtörténetet tartalmaz, amely az edzés folyamatáról minden adatot tárol, beleértve a megfigyelhető vagy megfigyelhető mennyiségek értékeit is, ahogy a korszak halad. Mentjük ezt az objektumot, hogy meghatározzuk a finomhangolást, amelyet jobban alkalmazzunk az edzés lépésében.

A képzés végén elértük az edzés pontosságát 99,85% és az érvényesítési pontosságot 86,57%

Most, hogy betanítottuk hálózatunkat, meg fogjuk figyelni a History metódusban tárolt teljesítménymutatóit.

Az fit metódus meghívása egy History objektumot eredményez. Ennek az objektumnak van egy attribútumelőzménye, amely egy szótár, amely négy bejegyzést tartalmaz: egy megfigyelt metrikánként egyet.

A history_dict a következő értékeket tartalmazza:

  • Edzésvesztés
  • Edzés pontossága
  • Validációs veszteség
  • Validálás pontossága

minden korszak végén.

Használjuk a Matplotlib-et a képzési és validációs veszteségek, valamint az edzés és validálás pontosságának egymás melletti ábrázolásához.

Megfigyeljük, hogy a minimális validációs veszteség és a maximális validációs pontosság körülbelül 3-5 korszakban érhető el. Ezt követően két trendet figyelhetünk meg:

  • az érvényesítési veszteség növekedése és a képzési veszteség csökkenése
  • az érvényesítési pontosság csökkenése és az edzés pontosságának növekedése

Ez azt jelenti, hogy a modell egyre jobban képes osztályozni az edzésadatokat, de következetesen rosszabb előrejelzéseket ad, ha új, korábban nem látott adatokkal találkozik. Ez az Overfitting jellemzője. Az 5. korszak után a modell kezd túlságosan szorosan illeszkedni az edzésadatokhoz.

Az Overfitting megoldása érdekében a korszakok számát 3 és 5 közé csökkentjük. Ezek az eredmények a gépétől függően és a súlyok véletlenszerű kiosztásának jellege miatt változhatnak, amelyek modellenként változhatnak.

Esetünkben 3 korszak után leállítjuk az edzést.

A veszteség történetének és a pontosság variációjának tanulmányozása során kapott eredményeink alapján átképezzük ideghálózatunkat. Ezúttal 3 korszakon keresztül futtatjuk, hogy elkerüljük az edzésadatok túlterhelését.

Végül 99% -os edzési pontosságot és 86% -os validációs pontosságot érünk el. Ez nagyon jó, tekintve, hogy nagyon naiv megközelítést alkalmazunk. Nagyobb fokú pontosság érhető el egy jobb képzési algoritmus használatával.

Képzett modellünkkel jósolunk a tesztadatokra. A kimenet lebegő egész számok tömbje, amelyek jelzik a felülvizsgálat pozitív valószínűségét. Mint látható, bizonyos esetekben a hálózat teljesen biztos abban, hogy az értékelés pozitív. Más esetekben - nem annyira!

Megpróbálhatna valamilyen hibamutatót találni a tévesen osztályozott érzelmek számához egy olyan metrika használatával, mint az átlagos négyzet hiba, mint itt tettem. De hülyeség lenne ezt megtenni! Az eredmény elemzésével nem foglalkozunk itt. Viszont rávilágítok arra, hogy az mse használata miért hiábavaló ebben az esetben.

Modellünk eredménye annak mérése, hogy a modell mennyire érzékeli a felülvizsgálatot pozitívnak. Ahelyett, hogy elmondaná a minta abszolút osztályát, a modell megmondja, mennyire érzékeli az egyik vagy a másik oldalon torzítandó érzelmet. Az MSE túl egyszerű metrika, és nem képes felfogni a megoldás összetettségét.

Nem vizualizáltam ezt az ideghálót. Szeretném, de ez időigényes folyamat. Vizualizáltam azt a neurális hálózatot, amelyet az MNIST probléma megoldásához használtam. Ha szeretné, megnézheti ezt a GitHub projektet az ANN-ek megjelenítéséhez

Prodicode/ann-visualizer

A Keras-szal egy nagyszerű vizualizációs python könyvtár működött. A python Graphviz könyvtárát használja egy prezentálható…

github.com

Így sikeresen osztályoztuk az értékeléseket az IMDB-n. Gondolom, ez megköveteli a Matrix vagy bármi más, amit az IMDB javasol a továbbiakban!

Javaslom, hogy dolgozzon együtt a cikkel. A legtöbb bináris osztályozási problémát hasonló stratégia segítségével oldhatja meg. Ha megoldotta, próbálkozzon a hálózat és rétegeinek kialakításával és paramétereivel. Ez segít jobban megérteni a választott modell architektúra integritását.

Minden cikkemben egyetlen témát tárgyalok részletesebben. Ebben egy kicsit elrejtettünk rejtett rétegeket. Bármelyik téma kimerítő magyarázata soha nem tartozik cikkem körébe; azonban bőven talál gyors segítséget.

Feltételezem, hogy az olvasó jól ismeri az olyan technikákat, mint az optimalizáló, a kategorikus kódolás, a veszteségfüggvény és a mutatók. Ezekről a fogalmakról itt találja meg a gyakorlati megjegyzéseimet.

Nézze meg nyugodtan ennek a cikknek a megvalósítását és további munkáimat a GitHub-on.