Nebezpečná umělá inteligence od OpenAI?

Americká nezisková společnost OpenAI před několika dny na svém blogu zveřejnila článek, ve kterém píše o tom, že vyvinula nový jazykový model, který je tak dobrý, že raději nezveřejní ani natrénovaný model, ani zdrojové kódy. Pro řadu médií (včetně některých seriózních českých) takové zprávy fungují jako červený hadr na býka a okamžitě tak začaly vznikat články o tom, že byla vyvinutá průlomová umělá inteligence, která je tak nebezpečná, že se musí držet pod pokličkou. Rád bych uvedl věci na pravou míru.

V první řadě je třeba přiznat, že OpenAI se v článku nedopustila žádného faulu a důvody, kvůli kterým nechtějí zveřejnit zdrojové kódy, znějí rozumně. Je však evidentní, že autoři dobře tušili, jak budou média reagovat a jde tak z jejich strany o promyšlený marketingový tah. O tom svědčí i poslední věta článku, která končí slovy „we’re hiring“.

A s čím tedy vědci z OpenAI přišli? Byl vytvořen zřejmě velmi dobrý jazykový model. Jazykovým modelem se rozumí nástroj, který na základě libovolné posloupnosti slov umí určit pravděpodobnosti možných slov, která by mohla následovat. Pro příklad uveďme posloupnost dvou slov

máma mele

Úkolem jazykového modelu je doplnit následující slovo posloupnosti. To může být teoreticky jakékoliv slovo, ale jistě každý tuší, že některá slova budou pravděpodobnější než jiná. Pravděpodobnosti následujících slov mohou vypadat například následovně:


slovo
pravděpodobnost
maso 0,6
kávu0,1
koření0,1
Emu0,01
Ostatní slova0,19

Pokud díky jazykovému modelu známe pravděpodobnosti následujících slov, můžeme je vyžít pro generování úplně nových textů. Postup je následující:

  1. První slovo zvolíme sami, nebo ho vybere nějakým náhodným způsobem.
  2. Pravděpodobnosti pro následující slovo nám už určuje jazykový model. Slovo tedy vybereme náhodně s ohledem na tyto pravděpodobnosti. Je možné si to představit tak, že vezmeme hrací kostku, která nemá 6 stěn, ale tolik stěn, kolik různých slov máme k dispozici. Na každou stěnu takové kostky vlepíme závaží, jehož hmotnost bude odpovídat pravděpodobnosti daného slova.
  3. Onou hrací kostkou si hodíme a zapíšeme si slovo, které nám padlo. Tím nám vznikne posloupnost o jedno slovo delší. Na jejím základě podle jazykového modelu upravíme pravděpodobnosti pro následující slovo a celý postup opakujeme od bodu 2.

Klíčem k úspěchu a k vytvoření smysluplné posloupnosti slov je tedy kvalitní jazykový model. Na to existují už lety prověřené postupy. Nejprve potřebujeme dostatečně velkou kolekci textových souborů, která slouží jako vzorové texty. V oboru strojového učení se takovému datovému souboru říká trénovací data. Pokud se v těchto trénovacích datech bude po slovech máma mele vyskytovat maso častěji, než jiná slova, budeme chtít, aby jazykový model posloupnosti máma mele maso přiřadil velkou pravděpodobnost.

Na druhou stranu ale nechceme, ale si jazykový model jen zapamatoval časté posloupnosti. Chceme, aby byl schopný zobecňovat i na posloupnosti, které se v trénovacích datech nevyskytly. K tomu slouží algoritmy strojového učení.

Podle článku OpenAI byly pro strojové učení použity „staré známé“ algoritmy (velmi podobné například tomu, který byl sloužit pro generování básní), jen trénovací data a kapacita paměti modelu byla o mnoho řádů větší než dříve. To bylo umožněno díky velmi výkonné výpočetní infrastruktuře, která běžným smrtelníkům mimo špičková AI centra není dostupná.

V čem tedy spočívá nebezpečí takového modelu? V žádném případě se nejedná o nějakou formu samostatně uvažující umělé inteligence. Stále jsou to jen náhodné procesy a statistiky počítané z trénovacích dat. Díky jejich složitosti je však možné generovat texty, které jsou velice podobné textům psaným lidmi. Zneužít je lze například pro strojové generování fake news nebo komentářů v diskuzích. S pomocí těchto přístupů je možné vygenerovat libovolné množství různorodého textu, které nebude stát víc než trochu elektrické energie.

Přitom texty nemusí být jen bezduchým blábolením. Zaměření textů je vždy dáno trénovacími daty. Pokud se pro trénování použijí ideově zabarvené propagandistické texty, výsledek bude k nerozeznání od lidmi psaného obsahu na některých fake news serverech.

Sami autoři článku píší, že replikace jejich výsledků nebude velký problém. Přestože byly zveřejněny pouze zdrojové kódy menšího modelu, použité principy jsou ve vědecké komunitě dobře známy a jeho rozšíření je pro znalého člověka snadné. Jediným zásadním omezením je obrovská výpočetní náročnost. Ta se však týká jen procesu vytváření modelu. Jakmile model někdo vytvoří a zveřejní, jeho použití už je velmi snadné i s využitím řádově menšího výpočetního výkonu. Navíc z Moorova zákona víme, že výpočetní výkon počítačů roste v čase přibližně exponenciálně a nebude tedy trvat dlouho, než si takový generátor bude moci každý z nás natrénovat na svém mobilu.

Ze strany OpenAI tedy o žádný velký průlom nejde. Navíc by bylo naivní si myslet, že už se takovýmito generovanými texty náš mediální prosto dávno neplní. Jen se tím autoři těchto generátorů textů veřejně nechlubí.

Proč a kdy fungují slovní analogie v algoritmech word2vec

Od publikování prvního algoritmu Tomáše Mikolova, převádějícího slova na vektory se zajímavými vlastnostmi (psal jsem o něm zde), uběhlo již několik let. Stále se však lidé snaží více či méně uspokojivě vysvětlit, jak je možné, že "kingsking + queen  = queens". Před časem napsal podobný text na svém blogu Piotr Migdal. Článek je inspirativní, ale obsahuje řadu nepodložených tvrzení a předpokladů. Rád bych zde prezentoval alternativní zdůvodnění vycházející ze stejných myšlenek, které však bude preciznější.

Jedním z hlavním přínosů většiny takzvaných word embedding algoritmů (cbow, skipgram, glove, atd.) je schopnost projektovat lexikální jednotky (nejčastěji slova) do vektorového prostoru, ve kterém morfologické, syntaktické i některé sémantické vlastnosti těchto slov zachovávají lineární závislosti. Znamená to, že když například vektor slova king odečteme od vektoru slova kings, dostaneme vektor, který lze významově chápat jako vektor přechodu od singuláru k plurálu. Pokud tento vektor přičteme k libovolnému substantivu v singuláru, dostaneme se v daném vektorovém prostoru velmi blízko k vektoru stejného slova v plurálu. Tuto vlastnost ilustruje známý obrázek převzatý z původního článku T. Mikolova.

Obrázek 1: Vektorová reprezentace slov. Zdroj: T. Mikolovov et al. : Linguistic Regularities in Continuous Space Word Representations, NAACL 2013.

Tohoto fenoménu lze využít k hledání slovních analogií. Mohli bychom se ptát na slovo W, pro které platí: king se má ke kings jako queenW. V obecnosti bychom chtěli ukázat, že pokud se slovo a má ke slovu A stejně jako slovo b ke slovu B, potom přibližně platí va – vA = vb – vB, kde vx je vektor reprezentující slovo x, získaný některým z algoritmů word2vec (viz Obr. 1).

Word2vec je zobecňující pojmenování pro metody převodu slova na jeho vektorovou reprezentaci. Pro účely tohoto textu se zaměřme konkrétně na nejznámější algoritmus Skip-gram s negativním samplováním.

Abychom mohli dané tvrzení dokázat, je třeba se nejdříve vypořádat s vágní definicí vztahu “mít se stejně k”. To většina literatury zanedbává a spokojuje se jen s intuicí. Pro větší přehlednost budeme v následujícím textu tučnou kurzívou označovat lexikální jednotky, kurzívou jejich vlastnosti a tučně zápis lexikální jednotky v korpusu.

Vyjděme z Firthova pohledu na lexikální význam. Jeho známý citát „You shall know a word by the company it keeps“ lze, volně přeloženo, chápat tak, že význam slova je dán slovy, která se s ním často pojí. Podle jeho tvrzení tedy platí, že dvě slova mají podobný význam tehdy, když se v textech často vyskytují ve stejných kontextech. Jedná se o v praxi často využívaný pohled na lexikální sémantiku.

Význam slova a lze ve Firthově pojetí formalizovat jako soubor pravděpodobností SEM(a) = 〈P(w | a): w ∈ L〉, které vyjadřují pravděpodobnost výskytu slova w blízko slova a v jazyce L. Ten nechť je reprezentovaný dostatečné velkým jazykovým korpusem. Blízkost je určena nějakou maximální vzdáleností v textu (měřeno počtem slov, která je oddělují).

Dalším důležitým poznatkem je Fregeho princip kompozicionality, který nám říká, že význam složitějšího lexikálního výrazu je dán významem dílčích jednotek a způsobem jejich kombinace. Tento princip se dá vztáhnout i na význam slov – slovo je nositelem souboru dílčích významů, která dohromady dávají význam celého slova. Například slovo queen lze zjednodušeně chápat jako anglické substantivum označující osobu, která má současně vlastnosti být panovníkem s královským titulem a být ženského pohlaví.

Vycházejíce z předchozích dvou formulací můžeme tedy význam slova queen definovat pomocí pravděpodobností〈P(wi | je panovník ∧ je ženského pohlaví ), v obecnosti jako 〈P(wi | a1, a2, … an).

Nyní již lze zadefinovat slovní analogie: a se má k A stejně jako bB tehdy, když existují vlastnosti a1... an, b1... bn, c a d takové, že

SEM(a) =〈P(wi | a1, a2, … an, c)

SEM(A) =〈P(wi | a1, a2, … an, d)

SEM(b) =〈P(wi | b1, b2, … bm, c)

SEM(B) =〈P(wi | b1, b2, … bm, d).

Pokud budou platit následující statistické nezávislosti výskytů vlastností slov v korpusu

P(a1, a2, … an) ⊥ P(c)

P(a1, a2, … an) ⊥ P(d)

P(b1, b2, … bm) ⊥ P(c)

P(b1, b2, … bm) ⊥ P(d)

Dostaneme pro všechna wi

\dfrac{P(\mathbf{w_i} | \mathbf{a})}{P(\mathbf{w_i} | \mathbf{A})} = \dfrac{P(\mathbf{w_i} | \mathbf{b})}{P(\mathbf{w_i} | \mathbf{B})}

neboť

\dfrac{P(\mathbf{w_i} | \mathbf{a})}{P(\mathbf{w_i} | \mathbf{A})} = \dfrac{P(\mathbf{w_i} | a_1 \dots a_n, c)}{P(\mathbf{w_i} | a_1 \dots a_n, d)} = \dfrac{P(\mathbf{w_i}, a_1 \dots a_n, c)P(a_1 \dots a_n, d)}{P(\mathbf{w_i}, a_1 \dots a_n, d)P(a_1 \dots a_n, c)} =

=\dfrac{P(a_1 \dots a_n, c | \mathbf{w_i})P(\mathbf{w_i})P(a_1 \dots a_n)P(d)}{P(a_1 \dots a_n, d | \mathbf{w_i})P(\mathbf{w_i})P(a_1 \dots a_n)P(c)} = \dfrac{P(a_1 \dots a_n | \mathbf{w_i})P( c | \mathbf{w_i})P(d)}{P(a_1 \dots a_n | \mathbf{w_i})P( d | \mathbf{w_i})P(c)} =

= \dfrac{P( c | \mathbf{w_i})P(d)}{P( d | \mathbf{w_i})P(c)} = \dfrac{P(\mathbf{w_i}|P(b_1 \dots b_m, c)}{P(\mathbf{w_i}|P(b_1 \dots b_m, d)} = \dfrac{P(\mathbf{w_i} | \mathbf{b})}{P(\mathbf{w_i} | \mathbf{B})}.

Nyní již lze analogie snadno zdůvodnit

\dfrac{P(\mathbf{w_i} | \mathbf{a})}{P(\mathbf{w_i} | \mathbf{A})} = \dfrac{P(\mathbf{w_i} | \mathbf{b})}{P(\mathbf{w_i} | \mathbf{B})}

\mbox{log} \Bigg( \dfrac{P(\mathbf{w_i} | \mathbf{a})}{P(\mathbf{w_i})} \cdot \dfrac{P(\mathbf{w_i})}{P(\mathbf{w_i} | \mathbf{A})} \Bigg) = \mbox{log} \Bigg( \dfrac{P(\mathbf{w_i} | \mathbf{b})}{P(\mathbf{w_i})} \cdot \dfrac{P(\mathbf{w_i})}{P(\mathbf{w_i} | \mathbf{B})} \Bigg)

\mbox{log} \dfrac{P(\mathbf{w_i} | \mathbf{a})}{P(\mathbf{w_i})}-\mbox{log} \dfrac{P(\mathbf{w_i} | \mathbf{A})}{P(\mathbf{w_i})}=\mbox{log} \dfrac{P(\mathbf{w_i} | \mathbf{b})}{P(\mathbf{w_i})}-\mbox{log} \dfrac{P(\mathbf{w_i} | \mathbf{B})}{P(\mathbf{w_i})}

Přičemž z definice pointwise mutual information platí

\mbox{PMI}(\mathbf{w_i},\mathbf{a}) -\mbox{PMI}(\mathbf{w_i},\mathbf{A}) =\mbox{PMI}(\mathbf{w_i},\mathbf{b}) -\mbox{PMI}(\mathbf{w_i},\mathbf{B}).

Teď využijeme výsledek práce Levy  & Yoav Goldberg, 2014, kde bylo ukázáno, že algoritmus Skip-gram s negativním samplováním aproximuje rozklad matice slov a kontextů, kde jednotlivé buňky matice odpovídají (až na konstatní posuv) pointwise mutual information. Autoři Arora & kol., 2015 sice ukazují, že aproximace se blíží skutečnosti jen u vektorů vysoké dimenze a navrhují vlastní důkaz, pro potřeby tohoto článku nám však tvrzení stačí:

\mbox{PMI}(\mathbf{w},\mathbf{a}) \approx v_\mathbf{w} \cdot v_\mathbf{a}.

Odsud již dostaneme kýženou lineární závislost vektorů, odpovídající slovním analogiím:

v_\mathbf{a} - v_\mathbf{A} = v_\mathbf{b} - v_\mathbf{B}.

Problémem důkazu je předpoklad nezávislosti výskytu jevů v korpusu, který samozřejmě ve většině případů neplatí. To je něco, čím se žádný ze mně známých důkazů analogií v algoritmech word2vec kvůli vágní nebo chybějící definici významu slov nezabýval. Je možné, že existuje silnější důkaz, který předpoklad nezávislosti jevů nepotřebuje. Druhou možností je, že slovní analogie fungují přesně jen v případě statisticky nezávislých jevů. Ani pro jedno však nemám zdůvodnění, a proto nechávám otázku otevřenou pro případné zájemce z řad čtenářů.

Pro tuto chvíli však nechme stranou exaktní důkazy a podívejme na několik příkladů analogií napočítaných algoritmem skip-gram na korpusu českého internetu.

+ slovo- slovo+ slovonejbližší slovo výsledkukosinová podobnost
královnakrálřidičřidička0.785
Řidička0.682
cyklistka0.625
rybářkarybářošetřovatelošetřovatelka0.692
Ošetřovatelka0.619
canisterapeutka0.605
královnakozelřidičřidička0.609
čtyřiadvacetiletá0.532
dvaadvacetiletá0.511
rybářkakozelošetřovatelkrotitelka0.574
ošetřovatelka0.547
pasačka0.541

V tabulce jsou vždy uvedena tři slova, která slouží jako dotaz a ke každému dotazu 3 nejbližší slova nalezená v prostoru spolu s kosinovou podobností. U prvního příkladu, kde je dotazem v(královna) – v(král) + v(řidič) vidíme, že analogie krásně fungují a dvě nejbližší nalezená slova jsou řidička a Řidička. Ve druhém příkladu byla záměrně použita slova, pro která předpoklad nezávislosti výrazněji neplatí. Vlastnost být rybářem a být muž, spolu jistě pozitivně korelují. Podobně jako vlastnosti být ošetřovatel a být žena. Přestože kosinová podobnost nejbližšího kandidáta je nižší než v předchozím případě, stále je výsledkem správná odpověď ošetřovatelka. Třetí příklad je extrémnější. Dotazem je zde v(královna) – v(kozel) + v(řidič) a výsledkem stále řidička, i když už s výrazně nižší kosinovou podobností. Tento výsledek je trochu zarážející a neodpovídá naší intuici. Zdá se, že vlastnost být mužem a být ženou je natolik dominantní, že převáží všechny ostatní. Teprve poslední příklad, který kombinuje extrémy předchozích ukázek, dopadne jinak. Na dotaz v(rybářka) – v(kozel) + v(ošetřovatel) najdeme jako nejbližší slovo krotitelka.

Těchto pár příkladů samozřejmě vůbec nic nedokazuje. Je z nich však vidět, že hledání analogií pomocí word2vec přístupů je velmi odolné vůči šumu. Může tedy dobře fungovat i v případě, že by byl pro přesný důkaz požadavek nezávislosti jevů nutný. Navíc nepřesností, které do procesu hledání analogií vstupují, je mnoho (velikost a zaměření korpusu, velikost reprezentujících vektorů, apod.) a je jen otázkou, jak velkou chybu jednotlivě způsobují. Velká odolnost vůči nim je podle mého názoru zajištěna velkou řídkostí vektorového prostoru, ve kterém analogie hledáme. Pro dotaz v(královna) – v(kozel) + v(řidič) najdeme jako odpověď slovo řidička jednoduše proto, že se v blízkosti žádné jiné slovo nenachází.

Středověk umělé inteligence skončil, seznamte se s neuronovými sítěmi, které umí psát básně

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.

word2vec – jednoduchá aritmetika se slovy

Když psal Tomáš Mikolov svoji disertační práci, jistě netušil, jaký rozruch její důsledky v celosvětové NLP komunitě vyvolají. Práce se zabývala jazykovými modely postavenými na neuronových sítích. Jazykové modely, které se běžně využívají při strojovém zpracování řeči nebo automatickém překladu, jsou matematické modely, umožňující predikovat slova následující po nějaké posloupnosti slov tak, aby vzniklý text co nejlépe zapadal do daného jazyka. Pokud tedy např. máme posloupnost slov „Šel do lesa na“, je v češtině mnohem pravděpodobnější, že bude následovat „houby“ nebo „dřevo“ než „mikroskop“ nebo „vítr“. Neuronová síť tedy řeší relativně jednoduchou úlohu strojového učení s učitelem, kde jako trénovací data slouží velký korpus textů. Mikolov si však všiml, že synaptické váhy neuronové sítě mezi vstupem a skrytou vrstvou sítě představují vektorovou reprezentaci slov v n-rozměrném prostoru, mající velmi zajímavé vlastnosti.

Prvním důležitým rysem je, že slova, která jsou si významově podobná, leží v daném prostoru blízko sebe a naopak slova nepodobná mají od sebe daleko. Mnohem zajímavější je ale vlastnost, kterou Mikolov nazývá „linguistic regularity“. Rozumí se tím zejména to, že velkou část sémantických i morfologických vlastností slov je možné reprezentovat unikátním vektorem. Pokud tento vektor přičteme k vektoru libovolného slova, posuneme se k těsné blízkosti vektoru slova, které se od původního liší právě touto vlastností (pokud takové slovo existuje). Jednoduchá ilustrace ve dvourozměrném prostoru je znázorněna na obrázku 1 vlevo.

word2vec

Obrázek 1: Vektorová reprezentace slov. Zdroj: T. Mikolovov et al. : Linguistic Regularities in Continuous Space Word Representations, NAACL 2013.

Modré šipky zde představují vektory, reprezentující vlastnost změny pohlaví z mužského na ženské. Z obrázku je vidět, že se vždy jedná o vektor stejného směru a velikosti. Lze ho tedy jednoduše spočítat odečtením vektorové reprezentace libovolné dvojice slov, reprezentujících objekty lišící se pouze pohlavím. Označme vektorovou reprezentaci slova s jako vec(s). Vektor změny mužského pohlaví na ženské potom získáme například jako vec("woman") – vec("man") nebo vec("queen") – vec("king"). Vektor změny ženského pohlaví na mužské bude mít stejnou velikost jen opačný směr.

Takovéto vektorové operace se samozřejmě dají kombinovat, viz obrázek 1 vpravo. Ten se dá interpretovat jako odpověď na dotaz „King“ se má ke „kings“ jako se má „queen“ k? Správnou odpovědí je samozřejmě „queens“. Získáme ji tak, že zahledáme slovo, jehož vektorová reprezentace má nejblíže vektoru vec(„kings“) – vec(„king“) + vec(„queen“). Vhodnou metrikou vzdálenosti vektorů je například kosinová vzdálenost. Pokud máme dostatečně velký a reprezentativní trénovací korpus, můžeme se ptát i na relativně složité dotazy, jako Kdo je prezidentem Mexika? Příkladem vektorových operací, které by vedly k výsledku může být vec(Obama“) – vec(USA“) + vec(Mexico“).

Zpracování velkých korpusů pomocí původního algoritmu však bylo výpočetně příliš náročné. Proto vznikly dva zjednodušené modely, pomocí kterých je možné vygenerovat slovní vektory podobných vlastností mnohem efektivněji – CBOW a Skip-gram. CBOW model je jednoduchá dopředná neuronová síť, která predikuje slovo v korpusu na základě sousedních slov. Model Skip-gram naopak predikuje okolní slova ze slova, které leží mezi nimi. Odkazy na různé implementace těchto dvou modelů lze najít na domovské stránce projektu word2vec: https://code.google.com/p/word2vec/.

Po velkém úspěchu těchto modelů vznikla řada dalších přístupů, jejichž cílem bylo také nalezení vektorové reprezentace slov podobných vlastností. Nejvýraznějším z nich je zřejmě stanfordský model GloVe. Žádný z těchto modelů však kvalitativně výrazně word2vec nepřevyšuje, takže nemá smysl se jimi v tomto článku zabývat.

Zájemci si můžou vyzkoušet on-line word2vec model napočítaný nad anglickou wikipedií například na adrese http://deeplearner.fz-qqq.net.