The medieval age of artificial intelligence is over: meet a neural network that can write poetry

Nikdy jsem si nemyslel, že by jednou počítače mohly nahradit v člověka v tak kreativních a neexaktních činnostech jako je malba nebo skládání básní. Pomalu ale začínám měnit názor.

Není tomu dlouho, co se i v neodborných časopisech začalo psát o neuronových sítích, které dokáží generovat obrazy, připomínající psychedelické výtvory surrealistických malířů. Jak je to ale s automatickým generováním textů? Několik článků na toto téma vzniklo (např. http://karpathy.github.io/2015/05/21/rnn-effectiveness/), ale žádný zatím nezískal takový ohlas jako generátory obrazů. Pojďme tedy tuto oblast podpořit a ukažme si, jak pomocí umělých neuronových sítí vytvořit automatického básníka.

Rekurentní neuronové sítě

Většina neuronových sítí, které jsou používány k analýze i ke generování obrazu, je dopředných. To znamená, že signál v neuronové síti může proudit pouze jedním směrem a nemůže se vracet nebo se např. točit ve smyčce. Sítě, které toto umožňují se nazývají rekurentní. Takové sítě mnohem blíže připomínají lidský mozek a především mají jednu zásadní vlastnost — a tou je možnost uchování informace. Jinými slovy, rekurentní sítě mají paměť. Díky tomu je vyjadřovací schopnost těchto sítí větší než u dopředných neuronových sítí, a je dokonce dokázáno, že je ekvivalentní Turingovu stroji.

Paměť není nutná vždy, pokud však chceme pracovat se sekvenčními daty jako jsou texty, bez paměti se obejdeme jen stěží. Nevýhodou rekurentních neuronových sítí je však obtížnost trénování. Zatím existuje jen několik málo architektur rekurentních sítí, které dokážeme trénovat efektivně. Jednou z nich je takzvaná Long Short-Term Memory (LSTM), kterou použijeme jako stavební prvek našeho automatického básníka.

Jedna paměťová buňka Long Short-Term Memory je znázorněna na obrázku 1, převzatém z http://www.willamette.edu/~gorr/classes/cs449/lstm.html.

Long Short-Term Memory

Obrázek 1: Long Short-Term Memory.

Její jádro tvoří stavový neuron spolu se zpětnovazební smyčkou, označený jako „cell state“. Díky zpětné vazbě je neuron schopný uchovávat informaci, která byla přivedena na vstup i poté, co je vstup odpojen. Připojení a odpojení vstupu je ovládáno neuronem označeným jako „input gate“. Podobně je aktivace výstupu řízena neuronem označeným jako „output gate“.

Automatický básník

Abychom mohli natrénovat neuronovou síť generující básně, potřebujeme jí ukázat, jak takové básně mají vypadat. K tomu by ideálně posloužil velký korpus básní. Vzhledem k tomu, že jsem žádný velký neměl k dispozici, použil jsem databázi písňových textů ze serveru supermusic.sk. Sice nejde o básně, ale písňové texy mají k poezii blízko. Pomocí jednoduché detekce jazyka byly odstraněny nečeské texy a vznikl tak 10 MB velký textový korpus. Kvůli oddělení jednotlivých písní byly jejich názvy ve formě nadpisů převedeny na kapitálky a samotné texty na malá písmena.

Neuronová síť pro generování básní je sestavena z pěti vrstev. Vstupní vrstva sestává ze 157 neuronů (což je počet různých znaků v korpusu). Následují tři vzájemně úplně propojené vrstvy LSTM, přičemž každou vrstvu tvoří 1024 buněk. Výstup je tvořen 157neuronovou softmax vrstvou, jejíž výstupem je pravděpodobnostní rozdělení přes 157 stavů. Architektura celé sítě je znázorněna na obrázku 2.

Automatický básník

Obrázek 2: Automatický básník.

Síť je trénována tak, aby na základě historie a písmene na aktuální pozici v korpusu predikovala následující písmeno. Díky tomu, že síť pracuje na úrovni písmen a ne slov, jak by se nabízelo, je možné se naučit i formátování, specifické pro zápis písňových textů.

Vzrůstající popularita neuronových sítí s sebou přinesla celou řadu hotových nástrojů a knihoven. Není tak už naštěstí potřeba programovat vše od píky. Pro natrénování výše popsané sítě byla použita implementace Char-rnn využívající framework Torch.

Výsledek není vůbec špatný

Poté, co byla síť natrénovaná na písňovém korpusu, bylo možné ji použít pro generování nových textů. Pro účely testování byla inicializována náhodně, ale je možné ji inicializovat například i vložením názvu básně nebo počátečních veršů. Teoreticky může natrénovaná sít vygenerovat neomezené množství různých textů, nechal jsem tedy vygenerovat několik desítek básní a vybral pár nejlepších. Básně jsou přesně v té podobě, v jaké je vygenerovala síť.

Zde je jedna z nejlepších:

PÍSEŇ PODZIMU

proč se nedorazíš?
telefonát není naděje
pořád doma na týhle planetě
čas pro tebe stále dupe svou

na na na...

já vím, že v duchu prozrazuju snář
poznám že nejsem nic víc

Soudě podle tohoto příkladu dokázala síť bezchybně použít českou slovní zásobu, morfologii i syntax. Nejzajímavější ale je, že i obsahově dává báseň víceméně smysl a není úplně hloupá. Dalo by se namítnou, že mohlo dojít k přetrénování a síť jen opakuje verše, které viděla při trénování. Pokud se však podíváme do korpusu, žádný z použitých veršů se tam nevyskytuje.

Je zřejmé, že je tato neuronová síť schopná pochopit i netriviální sémantické konstrukce. Příkladem může být přirovnání „vzácný jako listí“ v následující básni. Opět se jedná o sousloví, které se v korpusu vůbec nevyskytlo:

VŠE PRÝ JE MŮJ HŘÍCH

já nechci slyšet chtíč
tak vzácný jako listí
slzy v očích mám
a měl bych řvát

kdo mi to vášně ukrývá
netuším, každý je tu sám
jen pár let jsem přísahal
že pro mne má smysl žít.

Obecně se dá říci, že čím kratší báseň je, tím větší smysl dává. Je to samozřejmě dáno tím, že v delších textech je větší prostor pro odbočení od tématu. Občas má síť tendenci vytvořit velmi krátkou báseň. Pokud to udělá, téměř vždy se jedná o něco povedeného a úsměvného. Zde jsou dva příklady:

NEJSI TAMARA

jsi ludmila

NEJHEZČÍ DÁREK

50 kčs, tak mám tě rád

Někdy se stane, že si síť vymyslí nové slovo. Pokud k tomu dojde, často se však jedná o velmi zajímavý novotvar jako v názvu následující básně:

DŽÍNOVÁ POKROPANÍ

tak přestaň, smiř se s tím
moje řeč, můj dech, být svá bez peněz
myslím, že jsi žena co dech ti dá
s tebou už nevím co s tím

když večer temně září
chuť ve mně zůstane
jen v klidu mi tvý kroky jdou
už dávno se směje

zkouším se vrátit
nechci se ptát
hledám skrýš
každou noc

a pak se ztratí
neumím lhát
a nejde to vrátit

A na závěr několik dalších výtvorů různých kvalit:

NEJSI

sníh a mrazivá
vím vím

proč zrovna jedna z tebe chce žít
to není možný ty to víš
a já mám ho rád
jen tak promlouvej

ztrácím sílu žít

PROČ SE MI ZDÁ

já vím, že jsem sám
a tak to mám rád
a tak se mi zdá
že tě nechci bít

já vím, že tě nechci bít

já vím, že jsem jen tvůj

ZÁTONÍ

nikdo nemá kolotoč.
krásné paže hostí,
troubí žlutejch koní
a k večeru opilí.

déšť očima život hledá,
musím odeslat je dál,
protože jsi laciná
přece dobře už není.

člověk náš kruh co pustý sen
chceš-li vedle nosit chlast.
oh, jak miliady třeští?
pak mi řekli: nebudeš, tak se střež

KRÁLOVNA VČEL

nebude to divně znít,
pozor na tvůj strach
nesměj se hned
a hned od lidí

proč pocit mi nedáš,
nechci to hned
chceš mi říkat zatím starý poslání
když to ale nevíš, nevadí

poslední ráj,
hledám nahoru a dolů
že je nevěrná
ať není dál

venku je den
tak proč se bojíme
spát

dobře víme
že je něco v ní
a já už to vím

ooou jé

Pokud vás zajímají další příklady počítačem generovaných básní, můžete si zdarma stáhnout mou básnickou sbírku Poezie umělého světa. Pro vygenerování obsažených básní byl použitý vylepšený algortitmus napsaný v TensorFlow a jako trénovací sada posloužily básně ze serveru Písmák.cz.