Lenny # 2: Autoencoderek és Word beágyazások

Gyors szünetet szeretnék tartani a megerősítő tanulási törekvésemben (erről bővebben hamarosan), hogy egy érdekes, felügyelet nélküli tanulási modellről beszéljek: az autoencoderekről. Az autoencoderek alapgondolata a méretcsökkentés - Van néhány nagydimenziós adatábrázolásom, és egyszerűen ugyanazokat az adatokat szeretném kevesebb számmal ábrázolni. Vegyünk egy arckép példáját. Ha megnézi az egyes képpontokat, akkor hamar rájön, hogy a szomszédos pixelek általában erősen korrelálnak (nagyon hasonló színűek). Nagyon sok felesleges információ folyik ott. Mi lenne, ha el tudnánk venni a redundanciát, és ugyanazt a képet a számok töredékében kifejezhetnénk?

automatikus

Itt jönnek be az autoencoderek.

Automatikus kódolók

Emlékszel, hogyan működnek az ideghálózatok? Az autókódolók egyfajta ideghálózat, amelyet a dimenzió csökkentésére terveztek; más szavakkal, ugyanazt az információt kevesebb számmal képviselve. Az alapfeltevés egyszerű - veszünk egy neurális hálózatot, és kiképezzük, hogy ugyanazokat az információkat köpje ki, amelyeket ad. Ezzel biztosítjuk, hogy az egyes rétegek aktiválásának meg kell történnie, definíció szerint képesnek kell lennie a bemeneti adatok egészének képviseletére (ha később sikeresen helyre kívánják állítani). Ha minden réteg azonos méretű, mint a bemenet, ez triviálissá válik, és az adatokat egyszerűen át lehet másolni rétegről rétegre a kimenetre. De ha elkezdjük megváltoztatni a rétegek méretét, a hálózat eleve megtanulja az adatok megjelenítésének új módját. Ha az egyik rejtett réteg mérete kisebb, mint a bemeneti adatok, nincs más választása, mint találni valamilyen módszert az adatok tömörítésére.

És egy autókódoló pontosan ezt teszi. Ha megnézzük a diagramot, a hálózat azzal kezdi, hogy az adatokat „összenyomja” egy alacsonyabb dimenziós reprezentációvá, majd visszaállítja az eredeti bemenet rekonstrukciójává. Ha a hálózat megfelelően konvergál, akkor z az adatok tömörített változata lesz, amely ugyanazt az információt kódolja. Például, ha a bemeneti kép arc, akkor az adatokat le lehet redukálni az arc bizonyos meghatározó jellemzőire - alak, szín, póz stb. Ezen jellemzők mindegyikének ábrázolása hatékonyabb lehet, mint az egyes pixelek tárolása, és ebben az autókódolók igazán nagyszerűek.

Gyakran hasznos, ha úgy gondolunk a hálózatra, mint „kódolóra” és „dekódolóra”. A hálózat első fele, az enkóder veszi a bemenetet és alakítja át az alsó dimenziós ábrázolássá. Ezután a dekóder felveszi ezt az alsó dimenziós ábrázolást, és visszaalakítja az eredeti képpé (vagy olyan közel hozzá, amennyire csak lehet). A kódoló és a dekóder még mindig együtt van oktatva, de ha megvan a súly, akkor külön is használhatjuk a kettőt - talán a kódolóval generáljuk az értelmesebb ábrázolást néhány adatról, amelyet egy másik ideghálózatba táplálunk, vagy a dekódert hagyja, hogy a hálózat új adatokat generáljon, amelyeket korábban nem mutattunk meg.

Nagyjából ennyi az autokódolók alapkoncepciója, de az emberek néhány módosítást megemlítenek.

A denoising autoencoderek egy olyan technika, amelyet gyakran használnak, hogy segítsen a hálózatnak megtanulni az adatok olyan ábrázolásait, amelyek értelmesebbek az alapul szolgáló adatok változékonysága szempontjából. Ahelyett, hogy egyszerűen oktatna egy hálózatot az adott bemenet visszahívására, véletlenszerű zaj lép fel a bemenetre, mielőtt továbbítaná azt a hálózatra - a hálózattól még mindig várhatóan visszahívja az eredeti (korrupt) bemenetet, aminek arra kell kényszerítenie a hálózatot, hogy hagyja abba a szedést perc részleteket, miközben a nagyobb képre koncentrál. A véletlenszerű zaj lényegében megakadályozza, hogy a hálózat megtanulja a sajátosságokat, biztosítva, hogy a fontos jellemzőkre általánosítson. Ez különösen fontos abban az esetben, amikor a kódolt vektor nagyobb, mint a bemenet - egy hagyományos autoencoder használatával a hálózat egyszerűen megtanulhatja (és gyakran megtanulja) a bemenet másolását a kódolt vektorba az eredeti újrateremtése érdekében. Denoising autoencoderrel az autoencoder ezt már nem tudja megtenni, és valószínűbb, hogy megtanulja a bemenet értelmes ábrázolását.

A visszatérő ideghálózatokat (RNN-ek) még nem fedettük le (egyelőre), de minden bizonnyal egyre többet terjesztenek elő - és bizony, alkalmazzák őket auto-kódolókra. Az RNN mögött az az alapfeltevés áll, hogy ahelyett, hogy fix méretű vektort működtetnénk és előállítanánk, elkezdjük a műveletet és szekvenciákat állítunk elő rögzített méretű vektorok. Vegyük a gépi fordítás példáját (itt van egy angol nyelvű mondat, ugyanezt a mondatot adja nekem oroszul). A probléma felvetése egy vanília ideghálózatra megoldhatatlan (lefordíthatnánk a mondatot szóról szóra, de már tudjuk, hogy a nyelvtan nem így működik). Írja be az RNN-eket: egyenként adjuk meg a hálózatnak a beviteli mondatot, és a hálózat varázslatosan köpi ki ugyanazt a mondatot spanyolul, egy-egy szóval. Elég hamar belemerülünk az RNN pontos működésének sajátosságaiba, de az általános koncepció egyelőre elégséges.

A szekvencia-sorozat szekvenciájú kódolók ugyanúgy működnek, mint a hagyományos auto-kódolók, azzal a különbséggel, hogy a kódoló és a dekóder is RNN. Tehát ahelyett, hogy egy vektort kisebb vektorokká konvertálnánk, egy teljes szekvenciát alakítunk át egy vektorgá. Ezután vesszük azt az egy vektort, és ismét kibővítjük szekvenciává. Vegyünk példát egy változó hosszúságú hangklip rögzített hosszúságú ábrázolásának megszerzésére. Az autoencoder felvesz egy audio szegmenst, és egy vektort állít elő az adatok ábrázolására. Ez a kódoló. Ezután felvehetjük azt a vektort, és odaadhatjuk a dekódernek, amely visszaadja az eredeti hangklipet.

Nem foglalkozom mélyebben azzal, hogyan működnek most a variációs autoencoderek (valóban megérdemelnek egy saját posztot - talán ezen a nyáron), de a koncepció még mindig elég fontos, ezért érdemes megemlíteni. Ha kíváncsi vagy (és jól állsz néhány nehéz statisztikával), akkor érdemes elolvasni ezt a cikket.

A variációs autoencoderek lényegében generatív modellt hoznak létre adatainkra. Egy generatív modell megtanul vadonatúj adatokat létrehozni, amelyek nem a képzési készletből származnak, de úgy néznek ki, mintha az lenne. Például az arcok adatkészletével megtanul vadonatújnak tűnő arcokat létrehozni. A variációs autoencoderek nem az egyetlen generatív modell - a generatív kontradiktórius hálózatok egy másik fajta generatív modellek, amelyeket másnap megnézünk. (Bocsásson meg a praktikus-hullámos magyarázatért, de a részletek nehézkesek anélkül, hogy belemennénk a statisztikákba. Nyugodjon meg, elég hamar megadom a variációs autoencodereknek a megérdemelt magyarázatot.)

Szó beágyazások

Most egy másik (de kissé rokon) modelltípusról szeretnék beszélni, amelyet szóbeágyazásnak neveznek. Az autoencoderhez hasonlóan ez a típusú modell megtanulja a vektortér beágyazását egyes adatokhoz. Korábban átugrottam ezt a pontot, ezért hadd szánjak egy percet erre.

Térjünk vissza még egyszer az arcok példájára. Úgy kezdtük, hogy az arcokat pixelértékek sorozataként ábrázoltuk (mondjuk 10 000 pixel/arc) - az egyszerűség kedvéért feltételezzük, hogy a kép szürkeárnyalatos, és mindegyik pixelt egyetlen intenzitásérték képviseli, de tudjuk, hogy ugyanaz az elvek átviszik az RGB-adatokat (és természetesen a nem képi adatokat is). Most tegyünk valamit, ami kissé érdekes, és eleinte talán természetellenes, ezekkel a pixelekkel. Használjuk az egyes pixelértékeket koordinátaként egy 10 000 dimenziós térben. (Sidenote: ha gondja van ennek megjelenítésével, az azért van, mert mi, halandó emberek nem tudunk 3-nál több dimenzióban gondolkodni - csak gondoljunk minderre 2 vagy 3 dimenzióban, de vegyük észre, hogy pontosan ugyanazok az elvek szállnak át sok dimenzió, amennyit csak akar). Tehát van egy 10 000 dimenziós térünk, és a 10 000 pixel értékek ennek a térnek a koordinátái. Adatkészletünk minden képének külön helye van ebben a térben. Ha ezt a lehetetlen vizualizálható vektorteret nézné, akkor észreveszi, hogy a nagyon hasonló pixelértékű képek nagyon közel vannak egymáshoz, míg a nagyon különböző képek nagyon távol vannak egymástól.

Ez a kapcsolat a képek között kritikus, és ez teszi hasznosgá az adatok vektoros formában való gondolkodását. De vannak hibák a most használt koordinátarendszerben - például, ha azonos a képe, de egy pixel fölé tolódik, akkor az közel sem lehet az eredeti képhez ebben a vektortérben, mert minden dimenziónak vadonatúj koordinátája lesz . Ha találunk valamilyen koordinátarendszert, amely értelmesebb kapcsolatokat ad számunkra a vektortérünk pontjai között, akkor képeinket egy olyan térbe helyezhetjük, amely még többet mesél a képek közötti kapcsolatokról.

Tehát ez a folyamat, amikor egy pontot egy vektortérbe (a pixel alapúba) veszünk, és egy másik (az autoencoder alapú) vektortérbe helyezünk, egy vektortér beágyazása. Az egyik vektortér pontjait egy másikba ágyazzuk be, ami valami újat mondhat nekünk az adatainkról, amit korábban még nem igazán értettünk.

Az értelmes vektortérbe ágyazás létrehozásának folyamata általában viszonylag egyszerű valamilyen arc esetében. Ha két arc hasonló megjelenésű, akkor egymás mellett kell megjelenniük a vektortérben. A hagyományos autoencoderek ebben nagyon jók. De a kapcsolatok nem mindig annyira nyilvánvalóak - nézzük a szavak példáját. Ha megnézem azokat a betűket, amelyek egy szót alkotnak, akkor szinte lehetetlen, hogy értelmezzem, milyen szavak legyenek egymás közelében. Észrevehetem, hogy a „prezentációnak” és a „jelennek” hasonló betűi vannak, ezért egymás mellett kell lenniük; de másrészt az „előzmény” és a „folytatás” is hasonló betűkkel rendelkezik, mégis nagyon különböző a viszonyuk. Hasonlóképpen, a „jacht” és a „hajó” meglehetősen összefüggenek egymással, de nem sok közös vonásuk van betű szerint. Ennek eredményeként a szavakat általában vektoros formában kódolják a k-k egyikének használatával kódolás (más néven one-hot kódolás). Ha összesen N lehetséges szavunk van, akkor mindegyik vektornak N száma lesz, és az összes kivételével a számok egyike 0 lesz. Mindegyik szónak saját indexe lesz a vektorban, és az adott pozíció értéke 1. Bár ez különbséget tesz a szavak között, nem ad információt arról, hogy a szavak hogyan kapcsolódnak egymáshoz.

Jobb rendszerre van szükségünk. Mi lenne, ha egy forró kódolást használnánk, ha valami olyasmit használhatunk, mint egy autoencoder, hogy szavainkat alacsonyabb dimenziós vektorokká redukáljuk, amely több információt nyújt számunkra egy szó jelentéséről és jellemzőiről? Tervnek hangzik! De, amint azt már megállapítottuk, az automatikus kódolók nem tanulhatnak sok jelentést a szót alkotó betűkből. Új modellt kell felállítanunk, hogy megismerjük a szavak jelentését és közötti kapcsolatokat.

És pontosan ez a szó beágyazása van. Rövidesen megvizsgálunk egy népszerű szóbeágyazási modellt, de először vizsgáljuk meg azokat a lenyűgöző tulajdonságokat, amelyek a szóba ágyazott vektortérben lehetnek. Mint kiderült, és ez nem okozhat akkora meglepetést, a szavaknak sokkal bonyolultabb a kapcsolata, mint az arcképeknek. Vegyük például a „Washington DC” -t. és az „Egyesült Államok”. A kettő nyilvánvalóan összefügg, de a kapcsolat nagyon specifikus. Ez ugyanaz a kapcsolat, mint az „Ottawának” és a „Kanadának”. Mindkét kapcsolat nagyon különbözik a „fiú” és a „lány” viszonyától. Ideális esetben egy szóbeágyazási modell képes lesz külön-külön kifejezni ezeket a kapcsolatokat.

Ha van vektortere, akkor két pont között vektorként fejezheti ki a kapcsolatokat. Tehát, ha megteszi a távolságot a „fiú” és a „lány” között, akkor ugyanolyan távolságon (ugyanabba az irányba) utazva el kell jutnia a „férfitól a„ nőig ”, mert kettőjük azonos kapcsolatban áll. De annak az iránynak, amelyet el kell vinnie az „Ottawa” és a „Canada” között, teljesen másnak kell lennie. Ha létre tudunk hozni egy szóbeágyazó teret, amely megragadja ezeket a kapcsolatokat, az azt jelenti, hogy most hihetetlenül hasznos és értelmes módszerünk lesz a szavak ábrázolására. Amint sikerül szavakat eljutnunk egy ilyen térbe, a neurális hálózatok (és természetesen más ML modellek) sokkal hatékonyabban tudnak majd tanulni - míg a neurális hálózatoknak jellemzően önmagukban kellene elsajátítaniuk ezeknek a kapcsolatoknak az egyszerűsített változatát, az a képesség, hogy közvetlenül nekik adják ezeket az ismereteket, azt jelenti, hogy könnyebb elvégezni a természetes nyelvi feldolgozási feladatokat (például gépi fordítás).

Végül beszélhetünk arról, hogyan szerezzük be ezeket a szóbeágyazásokat. Egy különösen lenyűgöző modellről fogok beszélni, a word2vec nevű. Nagyon magas szinten kontextuson keresztül tanulja meg beágyazó szavát. Ennek valójában sok értelme van - amikor meglát egy szót, amelyet nem ismer, megnézi a körülötte lévő szavakat, hogy rájöjjön, mit jelent. Mint kiderült, a word2vec pontosan ugyanazt csinálja.

Általában a word2vec egy skip-gram modellnek nevezhető. A skip-gram modell, a fenti képek, megkísérli felhasználni a vektor reprezentációt, amelyet megtanul, hogy megjósolja azokat a szavakat, amelyek a korpuszban megjelennek egy adott szó körül. Lényegében a szó összefüggéseit használja, mivel számos könyvben és más irodalomban használják értelmes számkészlet levezetésére. Ha két szó „kontextusa” hasonló, akkor hasonló vektor-reprezentációik lesznek - ez már most hasznosabbá teszi ezt az új beágyazást, mint az egyszeres kódolást. De, mint kiderült, a kapcsolatok elmélyülnek.

Ha megnézzük egy ország és fővárosa kapcsolatát, akkor észreveszi, hogy az a vektor, amelyik az egyikről a másikra visz, szinte minden esetben azonos. Ez az egyik kritikus jellemző, amelyet korábban egy szó beágyazására definiáltunk - képviselve a szavak egymással fennálló egyedi kapcsolatait.

Nézzünk meg egy gépi fordításra kiképzett neurális hálózatot, hogy jobb képet kapjunk arról, hogyan segít ez az új szó beágyazása. Az, hogy szavakat adunk egy forró vektoroknak, nem túl hasznos - egyedül kell megtanulnia, hogy a „képernyő” és a „megjelenítés” vektor jelentése azonos, annak ellenére, hogy a két vektor között nincs semmiféle összefüggés. De a divatos új word2vec beágyazás használatával a „képernyő” és a „megjelenítés” közel azonos vektor-reprezentációval kell rendelkeznie - tehát ez az összefüggés nagyon természetes módon jön létre. Valójában, még akkor is, ha a hálózat még soha nem látott olyan képzési mintát, amelyben a „kijelző” szó szerepel, valószínűleg képes tisztán a „képernyőn” látott példák alapján általánosítani, mert a kettő hasonló ábrázolással rendelkezik.

Tehát igen, az autokódolók elég rendesek.

Sokkal többről nem tudtam kitérni az autokódolókról (főleg az előképzés jut eszembe, de ez még egy napra szól), de remélhetőleg elég sokat tanultál ahhoz, hogy megértsd, hol jöhetnek jól, és néhány módon felhasználhatók gyakorlatban. Beszéltünk a beágyazásokról és a word2vec-ről is, egy olyan szó beágyazási modellről, amely értelmes szóvektorokat ad nekünk, hogy hatékonyabbá tegyük a többi modellünket. De a word2vec hasznossága messze túlmutat az NLP-n - csak tavaly a besorolási feladatok pontosságának javítása érdekében egy word2vec alapú rendszert javasoltak a fehérje szekvenciák beágyazási terének létrehozására.

Ezeknek a felügyelet nélküli tanulási modelleknek az alkalmazásai gyakorlatilag végtelenek, és általában a hagyományosabb felügyelt tanulási problémák pontosságának javítását szolgálják. Ennek ellenére várom, hogy mi minden kiderül még az elkövetkező években - a legizgalmasabb előrelépések még várat magára.