Delphi

Úvodem

Úvodem  |  Soubory ke stažení

 

Dnes budeme dále "vařit" v kuchyně umělé inteligence a zbytek bude standerdní - několik internetových Delphi-odkazů a něco pro zasmání.

Neuronové sítě - 2.

Minule jsme si pověděli ve zkratce o principech neuronový síti. Dnes si řekneme blíže o jejich matematickém zabezpečení a navrhneme si dva příklady neuronových sítí. Začněme prvním jednoduchým příkladem a demonstrujme si na tomto příkladu potřebné postupy a příslušnou matematiku. Jedná se o neuronovou síť, realizující logický obvod XOR. V tomto případě použijeme třívrstvou síť - vstupní, skrytá a výstupní vrstva. Ve vstupní vrstvě budou dva neurony, na jejichž vstup se přivádí binární hodnoty 0 nebo 1. Ve skryté střední vrstvě budou opět dva neurony a ve vrstvě výstupní bude jeden neuron, na němž by se měla objevovat výstupní hodnota ve smyslu logické funkce XOR. Struktura sítě bude tedy následující:

xor

Jak jsem se zmínil minule, vstup (zde x1, x2) se přenáší jako vážený součet (zde například y = x1*w1 + x2*w2 - t1) do další úrovně. Parametry t1, t2 a t3 jsou takzvané prahové hodnoty (bias) a obvykle je pro zjednodušení zápisu považován za speciální případ váhy spoje fiktivního neuronu s výstupní hodnotou -1. Dále jsem se minule zmínil o přenosové funkci S, která je použita pro vyhodnocení vstupu do neuronu. Takových funkcí je nekonečně mnoho, ale nejčastěji se v těchto případech používá funkce, které se říká sigmoid. Ta má tvar:

S(x) = 1 / (1 + exp(x))

Častěji se používá ve tvaru

S(x) = 1 / (1 + exp(- k* x))

kde parametr k se nazývá parametr strmosti. Jeho význam tkví v tom, že určuje rychlost změn při učení sítě. Větší hodnoty znamenají rychlejší změny (například namísto 1000 kroků učení se projde jen 200 kroků). Větší hodnoty ale mohou také znamenat i nestabilitu. Pokud si k představíte jako jakousi velikost kroku, kterým kráčíte přes kopečky a dolíky, a nejhlubší dolíček znamená nejlepší řešení (minimální odchylku od nejlepšího řešení), pak si snadno dovedete představit, že při dlouhých krocích můžete to správné údolí překročit a minout. Pokud budete na druhé straně cupitat malými krůčky, bude vám cesta trvat příliš dlouho.

Takže ze vstupní vrstvy se přenese součet vstupních hodnot násobených váhami jednotlivých spojů do neuronů další vrstvy. V neuronech této vrstvy se tato vstupní hodnota vyhodnotí zmíněnou funkcí. Takto získaná hodnota slouží jako vstup do další vrstvy. Zde se postup opakuje až nakonec se určí hodnota v neuronech výstupní vrstvy.

Dále jsem se minule zmínil o dvou fázích práce s neuronovými sítěmi - učící a vyhodnocovací. Výše zmíněný postup je shodný pro obě fáze. Rozdíl mezi fázemi je v interpretaci výsledků.

V učící fázi se definuje dostatečně rozsáhlá množina vzorových příkladů. Postupně se zpracují všechny vzorové příklady - příklad se vloží na vstup neuronové sítě a získají se hodnoty na výstupu. Vzhledem k tomu, že u vzorových příkladů známe správný výsledek, můžeme zjistit velikost rozdílu výstupu neuronu a správné hodnoty. Diference na výstupech jednotlivých neuronů výstupní vrstvy se pro jednotlivé neurony sčítají. Výsledný součet za všechny vzorové příklady pak slouží k opravě vah jednotlivých spojů mezi neurony. Nejprve se opraví hodnoty vah spojů mezi neurony výstupní a skryté vrstvy. Poté se provede oprava předchozí vrstvy spojů a dále postupně až ke spojům mezi vstupní a první vrstvou. Proto se tomuto způsobu učení říká "backpropagation algorithm ". Zpracování testovacích příkladů se opakuje tak dlouho, až je zmíněný součet diferencí menší než nějaká zadaná hranice.

Pro výše uvedenou síť se definuje množina učebních příkladů ve tvaru trojic (x1, x2, y), kde x1 a x2 jsou vstupní hodnoty a y je výstupní hodnotou.

Ve vyhodnocovací fázi již jen pro zadaný vstup určuje naučená síť ten správný výsledek.

Jako druhý příklad definujeme strukturu neuronové sítě pro všeobecně známou (předpokládám) hru tik-tak-to formátu 3 x 3. Hra je sice triviální, ale pro studijní účely snad poslouží a algoritmus se může zobecnit třeba pro klasické piškvorky. V našem případě můžeme (vzhledem k malému rozsahu) postupovat dvěma způsoby (třeba přijdete na další nápady - rád se zde o ně s ostatními čtenáři podělím).

První možností je definovat síť pro trojici sousedních polí v řadě a po "naučení" sítě vyhodnotit vždy všechny řady (svislé, vodorovné a diagonální), sčítat vyhodnocené váhy polí a provést tah na pole s nejvyšší hodnotou. Druhou možností je definovat rozsáhlejší síť - pro celé hrací pole 3 x 3 - a tato síť by pak určovala podle zadané situace přímo pole, na které provést tah.

Tvar sítě pro první variantu:

Na schematu je znázorněno jen několik základních propojení, ale ve skutečnosti předpokládáme, že všechny neurony sousedních vrstev jsou navzájem propojeny. Při vyhodnocování budeme zadávat v případě kolečka na vstup neuronu a (resp. d nebo g) hodnotu 1 a do b a c (resp. e a f nebo h a i) hodnotu 0. V případě křížku obdobně nastavíme na hodnotu 1 vstup do neuronu b (e, h) a v případě prázdného pole do neuronu c (f, i).

Síť budeme učit tak, že budeme zadávat sérii dvanácti znaků 0/1, kde prvních 9 značí vstup v pořadí a až i a poslední tři značí požadované hodnoty na výstupu (ve smyslu shora dolů).

Po naučení sítě, při vlastní hře, by se postupovalo tak, že by se probraly všechny trojice na hracím poli (vodorovně, svisle a úhlopříčně). Obsah každé trojice by se zadal na vstup a výstupní hodnoty pro každé pole by se součtovaly. Pole, které bude mít po vyhodnocení všech trojic nejvyšší součet, bude polem, na něž by se měl provést tah.

Ve druhé variantě budeme postupovat obdobně, jen jako vstup nebudou jednotlivé trojice, ale bude jím celé hrací pole. Systém kódování bude stejný jako v předchozí variantě, ale síť bude obsahovat ve vstupní i skryté vrstvě 27 (=3 x 9) neuronů a ve výstupní vrstvě 9 neuronů.

Pokud bude takovýto postup úspěšný, můžeme zkusit využít stejný princip i na skutečnou klasickou hru piškvorky s tím, že jako vzorové pole můžeme použít vždy část hracího pole o rozměru třeba 7 x 7 a postupovat obdobným způsobem jako v první variantě. Principielně můžeme definovat několik základních učících úloh a poté, co by byl program schopen sám hrát, může se sám učit a definovat si další učící příklady vždy poté co nad ním někdo zvítězí například tak, že vezmeme poslední tři nebo čtyři tahy a všechny fragmenty 7 x 7 hracího pole, které obsahují políčko na kteeré byl proveden tah, se připojí k učební množině situací. A síť se "přeučí" s touto novou množinou příkladů.

Příště se podíváme na výsledky a připojíme i program. Pokud budete mít sami chuť vyjádřit nějaké připomínky nebo pokud si chcete zkusit naprogramovat výše zmíněný příklad nebo podobné téma, rád vám dám na tomto místě prostor.

Odkazy

   Dnešní první odkaz vede na stránky s blogem jednoho z vedoucích vývojových pracovníků firmy Borland Danny Thorpeho. Myslím, že jeho úvahy (nejen o Delphi) jsou zajímavé. Jsou zde odkazy na stránky s blogy dalších tří (Allen Bauer, Steve Trefethen a Anders Ohlsson) pracovníků Borlandu a samozřejmě síť dalších zajímavých odkazů.

   Bold for Delphi a firma BoldSoft je již dlouho známý pojem pro programátory v Delphi. Na zajímavé informace o tomto produktu se můžete podívat na stránky firmy BoldSoft, kde je i podrobný manuál ve formátu pdf.

   Poslední dnešní odkaz se netýká přímo Delphi, ale zabývá se především programováním v prostředí .NET obecně, ale i zde najdete určitě mnoho užitečných informací.

Závěrem

No řekněte, není to milá a starostlivá manželka?



Chybová hláška: The Web site you seek cannot be located but endless others exist



Belzebub Gates

Skutečné jméno Billa Gatese je William Henry Gates III. Nyní je znám jako Bill Gates (III), kde "III" znamená pořadí. Pokud konvertujeme písmena jeho aktuálního jména do ASCII-kódu a přičteme jeho "III", obdržíte následující:

B 66
I 73
L 76
L 76
G 71
A 65
T 84
E 69
S 83
+ 3
----
+666 
Někdo se může ptát, "Jak mohl Bill Gates získat takovou moc?" Je to jen náhoda? Nebo jen začátek konečného a totálního zotročení lidí? Než se rozhodnete, uvažte následující:

M S - D O S 6.21
77+83+45+68+79+83+32+54+46+50+49 = 666 

W I N D O W S 95
87+73+78+68+79+87+83+57+53+1 = 666 
Náhoda? Co myslíte...

Určitá specifická využití datových nosičů prostě ženy nemají šanci objevit:

 

Jiří Ventluka