Essentials of Deep Learning : Introduction to Long Short Term Memory

Úvod

Problémy predikce posloupnosti jsou známé již dlouhou dobu. Jsou považovány za jeden z nejobtížněji řešitelných problémů v oblasti datové vědy. Zahrnují širokou škálu problémů; od předpovídání tržeb po hledání vzorů v datech akciových trhů, od porozumění filmovým zápletkám po rozpoznání způsobu řeči, od jazykových překladů po předpovídání dalšího slova na klávesnici iPhonu.

S nedávnými průlomovými objevy, k nimž došlo v datové vědě, bylo zjištěno, že téměř pro všechny tyto problémy predikce sekvencí byly jako nejefektivnější řešení vypozorovány sítě s dlouhou krátkodobou pamětí, zvané LSTM.

LSTM mají v mnoha ohledech náskok před konvenčními neuronovými sítěmi s dopředným posuvem a RNN. Důvodem je jejich vlastnost selektivně si pamatovat vzory po dlouhou dobu. Cílem tohoto článku je vysvětlit LSTM a umožnit vám jejich použití v reálných problémech. Pojďme se na něj podívat!

Poznámka: Abyste si mohli projít tento článek, musíte mít základní znalosti o neuronových sítích a o tom, jak funguje Keras (knihovna pro hluboké učení). Pro pochopení těchto pojmů se můžete podívat na uvedené články:

  • Pochopení neuronových sítí od základů
  • Základy hlubokého učení – úvod do rekurentních neuronových sítí
  • Tutoriál: Optimalizace neuronových sítí pomocí Keras (s případovou studií rozpoznávání obrázků)

Obsah

  1. Zpětná vazba: Pohled na rekurentní neuronové sítě (RNN)
  2. Omezení RNN
  3. Zlepšení oproti RNN : Dlouhodobá krátkodobá paměť (LSTM)
  4. Architektura LSTM
    1. Zapomeňte na bránu
    2. Vstupní brána
    3. Výstupní brána
  5. Generování textu pomocí LSTM.

Zpětná vazba: Pohled do rekurentních neuronových sítí (RNN)

Podívejme se na příklad sekvenčních dat, což mohou být data z burzy pro konkrétní akcie. Jednoduchý model strojového učení nebo umělá neuronová síť se může naučit předpovídat ceny akcií na základě řady vlastností: objemu akcií, otevírací hodnoty atd. Cena akcie sice závisí na těchto charakteristikách, ale do značné míry také na hodnotách akcií v předchozích dnech. Ve skutečnosti jsou pro obchodníka tyto hodnoty v předchozích dnech (nebo trend) jedním z hlavních rozhodujících faktorů pro předpovědi.

V konvenčních neuronových sítích typu feed-forward jsou všechny testovací případy považovány za nezávislé. To znamená, že při přizpůsobování modelu pro konkrétní den se nezohledňují ceny akcií v předchozích dnech.

Této závislosti na čase je dosaženo prostřednictvím rekurentních neuronových sítí. Typická RNN vypadá takto:

Na první pohled to může být děsivé, ale po rozložení to vypadá mnohem jednodušeji:

Nyní je pro nás snazší si představit, jak tyto sítě zohledňují vývoj cen akcií, než začnou předpovídat ceny akcií pro dnešní den. Zde je každá předpověď v čase t (h_t) závislá na všech předchozích předpovědích a informacích z nich získaných.

RNN mohou do značné míry vyřešit náš účel zpracování sekvencí, ale ne zcela. Chceme, aby naše počítače byly dostatečně dobré na psaní Shakespearových sonetů. Nyní jsou RNN skvělé, pokud jde o krátké souvislosti, ale abychom byli schopni sestavit příběh a zapamatovat si ho, potřebujeme, aby naše modely dokázaly pochopit a zapamatovat si souvislosti za sekvencemi, stejně jako lidský mozek. To s jednoduchou RNN není možné.

Proč? Podívejme se na to.

Omezení RNN

Rekurentní neuronové sítě fungují dobře, pokud se zabýváme krátkodobými závislostmi. To znamená, když se aplikují na problémy jako:

RNN se ukazují jako poměrně efektivní. Je to proto, že tento problém nemá nic společného s kontextem výroku. RNN si nemusí pamatovat, co bylo řečeno předtím nebo jaký byl jeho význam, stačí jim vědět, že ve většině případů je nebe modré. Předpověď by tedy zněla:

Vanilkové RNN však nedokážou pochopit kontext za vstupem. Něco, co bylo řečeno dávno předtím, si při vytváření předpovědí v současnosti nemohou vybavit. Chápejme to jako příklad:

Zde můžeme pochopit, že jelikož autor pracoval 20 let ve Španělsku, je velmi pravděpodobné, že může mít dobrou znalost španělštiny. Aby však RNN mohla správně předpovídat, musí si tento kontext pamatovat. Relevantní informace mohou být od místa, kde jsou potřeba, odděleny obrovskou náloží irelevantních dat. To je místo, kde rekurentní neuronová síť selhává!“

Důvodem je problém mizejícího gradientu. Abyste tomu porozuměli, budete potřebovat nějaké znalosti o tom, jak se neuronová síť s posuvem vpřed učí. Víme, že u běžné neuronové sítě typu feed-forward je aktualizace vah, která se aplikuje na konkrétní vrstvu, násobkem míry učení, chybového členu z předchozí vrstvy a vstupu do této vrstvy. Chybový člen pro konkrétní vrstvu je tedy někde součinem chyb všech předchozích vrstev. Při práci s aktivačními funkcemi, jako je sigmoidní funkce, se malé hodnoty jejích derivací (vyskytující se v chybové funkci) násobí několikanásobně, jak postupujeme směrem k počátečním vrstvám. V důsledku toho gradient téměř mizí, jak se pohybujeme směrem k počátečním vrstvám, a je obtížné tyto vrstvy trénovat.

Podobný případ pozorujeme u rekurentních neuronových sítí. RNN si pamatují věci jen po malé časové úseky, tj. pokud informaci potřebujeme po malé době, může být reprodukovatelná, ale jakmile se do ní vloží velké množství slov, tato informace se někde ztratí. Tento problém lze vyřešit použitím mírně upravené verze sítí RNN – sítí s dlouhou krátkodobou pamětí.

Zlepšení oproti RNN: LSTM (Long Short-Term Memory) Networks

Když si sestavujeme kalendář na celý den, určujeme si priority schůzek, že? Pokud v případě, že si potřebujeme udělat místo na něco důležitého, víme, kterou schůzku bychom mohli zrušit, aby se případná schůzka mohla uskutečnit.

Ukazuje se, že RNN to nedělá. Aby mohla přidat novou informaci, zcela transformuje stávající informaci použitím funkce. Kvůli tomu se mění celá informace, a to vcelku, tj. nebere se ohled na „důležité“ a „ne tak důležité“ informace.

LSTM naproti tomu provádí malé úpravy informace pomocí násobení a sčítání. U LSTM informace proudí prostřednictvím mechanismu známého jako stavy buněk. Tímto způsobem si LSTM mohou selektivně pamatovat nebo zapomínat. Informace v určitém stavu buňky mají tři různé závislosti.

Vizualizujeme si to na příkladu. Vezměme si příklad předpovídání cen akcií pro konkrétní akcie. Dnešní cena akcie bude záviset na:

  1. Trend, který akcie sledovala v předchozích dnech, třeba klesající nebo rostoucí.
  2. Cena akcie z předchozího dne, protože mnoho obchodníků před nákupem akcie porovnává její cenu z předchozího dne.
  3. Faktory, které mohou ovlivnit cenu akcie pro dnešní den. Může to být nová politika společnosti, která je široce kritizována, nebo pokles zisku společnosti, nebo třeba nečekaná změna ve vrcholovém vedení společnosti.

Tyto závislosti lze zobecnit na libovolný problém jako:

  1. Předchozí stav buňky (tj. informace, která byla přítomna v paměti po předchozím časovém kroku)
  2. Předchozí skrytý stav (tj. to je totéž co výstup předchozí buňky)
  3. Vstup v aktuálním časovém kroku (tj. nová informace, která je v daném okamžiku přiváděna)

Další důležitou vlastností LSTM je jeho analogie s dopravníkovými pásy!

To je pravda!“

Průmyslové podniky je používají k přemísťování výrobků pro různé procesy. LSTM používají tento mechanismus k přesouvání informací.

Může docházet k přidávání, úpravám nebo odebírání informací při jejich průchodu různými vrstvami, stejně jako může být výrobek při pohybu na dopravníkovém pásu tvarován, natírán nebo balen.

Následující schéma vysvětluje úzký vztah LSTM a dopravníkových pásů.

Zdroj

Ačkoli se toto schéma ani zdaleka neblíží skutečné architektuře LSTM, prozatím řeší náš účel.

Právě díky této vlastnosti LSTM, kdy nemanipulují s celou informací, ale spíše ji mírně upravují, jsou schopny selektivně zapomínat a pamatovat si věci. Jak to dělají, se dozvíme v následující části.

Architektura LSTM

Fungování LSTM si můžeme představit tak, že pochopíme fungování týmu zpravodajského kanálu, který se věnuje reportáži o vraždě. Nyní je zpravodajský příběh postaven na faktech, důkazech a výpovědích mnoha lidí. Kdykoli se objeví nová událost, provedete jeden z těchto tří kroků.

Řekněme, že jsme předpokládali, že vražda byla spáchána „otrávením“ oběti, ale pitevní zpráva, která právě přišla, říká, že příčinou smrti byl „úder do hlavy“. Být součástí tohoto zpravodajského týmu, co uděláte? Okamžitě zapomenete na předchozí příčinu smrti a na všechny příběhy, které se kolem této skutečnosti utkaly.

Co když se do případu dostane úplně nový podezřelý. Osoba, která měla k oběti zášť a mohla by být vrahem? Vložíte tuto informaci do svého zpravodajského kanálu, že?“

Nyní všechny tyto roztříštěné informace nelze servírovat v mainstreamových médiích. Takže po určitém časovém intervalu musíte tyto informace shrnout a relevantní věci vypsat svému publiku. Třeba v podobě „Ukázalo se, že XYZ je hlavní podezřelý.“

Nyní se pojďme věnovat podrobnostem architektury sítě LSTM:

Zdroj

Nyní se to zdaleka neblíží zjednodušené verzi, kterou jsme viděli dříve, ale provedu vás jí. Typická síť LSTM se skládá z různých paměťových bloků zvaných buňky
(obdélníky, které vidíme na obrázku). Existují dva stavy, které se přenášejí do další buňky; stav buňky a skrytý stav. Paměťové bloky jsou zodpovědné za zapamatování a manipulace s touto pamětí se provádí pomocí tří hlavních mechanismů, kterým se říká brány. Každým z nich se zabýváme níže.

4.1 Brána zapomínání

Na příkladu problému predikce textu. Předpokládejme, že do LSTM je vložena, následující věta:

Jakmile se objeví první tečka za slovem „osoba“, brána zapomínání si uvědomí, že v další větě může dojít ke změně kontextu. V důsledku toho je podmět věty zapomenut a místo pro podmět je uvolněno. A když začneme mluvit o „Danovi“, je tato pozice subjektu přidělena „Danovi“. Tento proces zapomínání předmětu je vyvolán bránou zapomínání.

Brána zapomínání je zodpovědná za odstranění informace ze stavu buňky. Informace, které již nejsou potřebné pro pochopení věcí LSTM, nebo informace, které jsou méně důležité, jsou odstraněny prostřednictvím násobení filtru. To je nutné pro optimalizaci výkonu sítě LSTM.

Toto hradlo přijímá dva vstupy: h_t-1 a x_t.

h_t-1 je skrytý stav z předchozí buňky nebo výstup předchozí buňky a x_t je vstup v daném časovém kroku. Dané vstupy se vynásobí váhovými maticemi a přidá se zkreslení. Následně se na tuto hodnotu aplikuje sigmoidní funkce. Výstupem sigmoidní funkce je vektor s hodnotami od 0 do 1, který odpovídá každému číslu ve stavu buňky. Sigmoidová funkce je v podstatě zodpovědná za rozhodnutí, které hodnoty ponechat a které vyřadit. Pokud je pro určitou hodnotu ve stavu buňky na výstupu „0“, znamená to, že hradlo forget chce tuto informaci zcela zapomenout. Podobně „1“ znamená, že hradlo forget si chce zapamatovat celou tuto informaci. Tento výstupní vektor sigmoidní funkce se vynásobí stavem buňky.

4.2 Vstupní brána

Podívejme se na další příklad, kdy LSTM analyzuje větu:

Nyní je zde důležitá informace, že „Bob“ umí plavat a že čtyři roky sloužil u námořnictva. To lze doplnit do stavu buňky, nicméně skutečnost, že to vše řekl po telefonu, je méně důležitý fakt a lze ho ignorovat. Tento proces přidání nějaké nové informace lze provést pomocí vstupního hradla.

Tady je jeho struktura:

Vstupní hradlo je zodpovědné za přidání informace do stavu buňky. Toto přidávání informací je v podstatě třístupňový proces, jak je vidět z výše uvedeného schématu.

  1. Reguluje, jaké hodnoty je třeba do stavu buňky přidat, zapojením sigmoidní funkce. Ta je v podstatě velmi podobná hradlu forget a funguje jako filtr pro všechny informace z h_t-1 a x_t.
  2. Vytvoření vektoru obsahujícího všechny možné hodnoty, které lze přidat (jak je vnímáme z h_t-1 a x_t) do stavu buňky. To se provádí pomocí funkce tanh, která vypisuje hodnoty od -1 do +1.
  3. Vynásobení hodnoty regulačního filtru (sigmoidní hradlo) k vytvořenému vektoru (funkce tanh) a následné přidání této užitečné informace ke stavu buňky pomocí operace sčítání.

Po dokončení tohoto tříkrokového procesu zajistíme, že ke stavu buňky budou přidány pouze ty informace, které jsou důležité a nejsou nadbytečné.

4.3 Výstupní brána

Ne všechny informace, které probíhají stavem buňky, jsou vhodné k tomu, aby byly v určitém okamžiku vyvedeny na výstup. Vizualizujeme si to na příkladu:

V této větě může být pro prázdné místo řada možností. Víme však, že aktuální vstup „statečný“, je přídavné jméno, které se používá k popisu podstatného jména. Jakékoli následující slovo má tedy silnou tendenci být podstatným jménem. A tak by Bob mohl být vhodným výstupem.

Tuto práci výběru užitečných informací z aktuálního stavu buňky a jejich zobrazení jako výstupu provádí výstupní brána. Zde je jeho struktura:

Fungování výstupního hradla lze opět rozdělit do tří kroků:

  1. Vytvoření vektoru po aplikaci funkce tanh na stav buňky, čímž se hodnoty škálují do rozsahu -1 až +1.
  2. Vytvoření filtru pomocí hodnot h_t-1 a x_t tak, aby mohl regulovat hodnoty, které je třeba vyvést z výše vytvořeného vektoru. Tento filtr opět využívá sigmoidní funkci.
  3. Vynásobení hodnoty tohoto regulačního filtru s vektorem vytvořeným v kroku 1 a jeho odeslání jako výstup a také do skrytého stavu další buňky.

Filtr ve výše uvedeném příkladu zajistí, že zmenší všechny ostatní hodnoty kromě ‚Bob‘. Filtr tedy musí být sestaven na základě vstupních a skrytých stavových hodnot a musí být aplikován na stavový vektor buňky.

Generování textu pomocí LSTM

Teoretických pojmů a fungování LSTM máme dost. Nyní bychom se snažili vytvořit model, který by dokázal předpovědět nějaký n počet znaků podle původního textu Macbetha. Většina klasických textů již není chráněna autorskými právy a najdete je zde. Aktualizovanou verzi souboru .txt naleznete zde.

Použijeme knihovnu Keras, což je vysokoúrovňové API pro neuronové sítě a funguje nad TensorFlow nebo Theano. Než se tedy ponoříte do tohoto kódu, ujistěte se, že máte Keras nainstalovaný a funkční.

Dobře, tak pojďme vygenerovat nějaký text!“

  • Importujeme závislosti

# Importing dependencies numpy and kerasimport numpyfrom keras.models import Sequentialfrom keras.layers import Densefrom keras.layers import Dropoutfrom keras.layers import LSTMfrom keras.utils import np_utils

Importujeme všechny potřebné závislosti a to je v podstatě samozřejmé.

  • Načítání textového souboru a vytvoření mapování znaků na celá čísla

# load textfilename = "/macbeth.txt"text = (open(filename).read()).lower()# mapping characters with integersunique_chars = sorted(list(set(text)))char_to_int = {}int_to_char = {}for i, c in enumerate (unique_chars): char_to_int.update({c: i}) int_to_char.update({i: c})

Otevře se textový soubor a všechny znaky se převedou na malá písmena. Pro usnadnění následujících kroků bychom každý znak mapovali na příslušné číslo. To se provádí proto, aby se usnadnila výpočetní část LSTM.

  • Příprava datového souboru

# preparing input and output datasetX = Y = for i in range(0, len(text) - 50, 1): sequence = text label =text X.append( for char in sequence]) Y.append(char_to_int)

Data jsou připravena v takovém formátu, že pokud bychom chtěli, aby LSTM předpovídal „O“ ve slově „HELLO“, vložili bychom jako vstup a jako očekávaný výstup. Podobně zde stanovíme délku sekvence, kterou chceme (v příkladu nastavenou na 50), a poté uložíme kódování prvních 49 znaků v X a očekávaný výstup, tj. 50. znak v Y.

  • Reshaping of X

# reshaping, normalizing and one hot encodingX_modified = numpy.reshape(X, (len(X), 50, 1))X_modified = X_modified / float(len(unique_chars))Y_modified = np_utils.to_categorical(Y)

Síť LSTM očekává vstup ve tvaru, kde samples je počet datových bodů, které máme k dispozici, time steps je počet časově závislých kroků, které jsou v jednom datovém bodě, features se týká počtu proměnných, které máme pro odpovídající pravdivou hodnotu v Y. Hodnoty v X_modified pak škálujeme v rozmezí 0 až 1 a jedna hot zakódujeme naše pravdivé hodnoty v Y_modified.

  • Definice modelu LSTM

# defining the LSTM modelmodel = Sequential()model.add(LSTM(300, input_shape=(X_modified.shape, X_modified.shape), return_sequences=True))model.add(Dropout(0.2))model.add(LSTM(300))model.add(Dropout(0.2))model.add(Dense(Y_modified.shape, activation='softmax'))model.compile(loss='categorical_crossentropy', optimizer='adam')

Používá se sekvenční model, což je lineární zásobník vrstev. První vrstva je vrstva LSTM s 300 paměťovými jednotkami a vrací sekvence. To se provádí proto, aby bylo zajištěno, že další vrstva LSTM obdrží sekvence a ne jen náhodně rozptýlená data. Za každou vrstvou LSTM je použita vrstva s výpadkem, aby se zabránilo nadměrnému přizpůsobení modelu. Nakonec máme poslední vrstvu jako plně propojenou vrstvu s aktivací „softmax“ a neurony rovnými počtu jedinečných znaků, protože potřebujeme na výstupu jeden horký zakódovaný výsledek.

  • Přizpůsobení modelu a generování znaků

# fitting the modelmodel.fit(X_modified, Y_modified, epochs=1, batch_size=30)# picking a random seedstart_index = numpy.random.randint(0, len(X)-1)new_string = X# generating charactersfor i in range(50): x = numpy.reshape(new_string, (1, len(new_string), 1)) x = x / float(len(unique_chars)) #predicting pred_index = numpy.argmax(model.predict(x, verbose=0)) char_out = int_to_char seq_in = for value in new_string] print(char_out) new_string.append(pred_index) new_string = new_string

Model se přizpůsobuje v průběhu 100 epoch s velikostí dávky 30. Model se přizpůsobuje v průběhu 100 epoch. Poté stanovíme náhodný seed (pro snadnou reprodukovatelnost) a začneme generovat znaky. Predikce z modelu prozradí kódování předpovězeného znaku, ten je pak dekódován zpět na hodnotu znaku a připojen ke vzoru.

Takto by vypadal výstup sítě

Eventuálně, po dostatečném počtu trénovacích epoch, bude v průběhu času poskytovat lepší a lepší výsledky. Takto byste použili LSTM k řešení úlohy predikce sekvencí.

Koncové poznámky

LSTM jsou velmi slibným řešením problémů souvisejících se sekvencemi a časovými řadami. Jedinou nevýhodou, kterou na nich shledávám, je však obtížnost jejich trénování. Na trénování i jednoduchého modelu je potřeba spousta času a systémových prostředků. Ale to je jen hardwarové omezení! Doufám, že se mi podařilo poskytnout vám základní představu o těchto sítích. Jakékoli problémy nebo otázky související s blogem můžete komentovat níže.

Učte se, zapojte se , hackujte a nechte se zaměstnat!

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.