GAN siete zblízka

Nedávno sme vám priniesli článok o praktických aplikáciách tzv. GAN sietí. Spomenuli sme tam napríklad webstránku, ktorá dokáže s ich použitím generovať fotografie neexistujúcich ľudí, ktoré sú však na nerozoznanie od reality. V tomto článku sa na tieto siete pozrieme trochu do hĺbky. Generative Adversarial Networks (skrátene označované ako GAN), predstavujú nový prístup na generatívne modelovanie syntetických dát s použitím hlbokého strojového učenia. Ich výstupom môže byť napríklad práve takáto tvár človeka, obrázok zvieraťa či akéhokoľvek objektu. Ukážeme si zjednodušený princíp fungovania GAN siete.

Generátor a diskriminátor

GAN sieť má 2 základné stavebné prvky – generátor a diskriminátor. Ich úloha je jednoduchá: generátor generuje nové vzorky, diskriminátor sa snaží uhádnuť, či je táto vzorka reálna (real), alebo vymyslená (fake). Pri trénovaní sa generátor snaží vytvorenými vzorkami oklamať diskriminátor, ktorý sa zas snaží naučiť, ako nebyť oklamaný. Diskriminátor časom svoje odhady zlepšuje a ak ho chce generátor ďalej úspešne klamať, je nútený produkovať čím ďalej tým kvalitnejšie výstupy, až sa dostane do bodu, kedy tieto vymyslené vzorky nie je možné rozoznať od reality.

Skúste na nasledujúcom obrázku určiť, ktorá bankovka je falošná a ktorá skutočná:

GAN siete real fake

zdroj: vľavo Wikimedia, vpravo vlastné

Pevne veríme, že každý z vás správne určil, že bankovka naľavo je pravá a napravo vymyslená. Ale skúste to ešte raz na nasledovnom obrázku.

GAN siete real fake

zdroj: vľavo Wikimedia , vpravo Amazon

Opäť ste určite správne označili, že bankovka naľavo je pravá a napravo vymyslená, avšak už to bolo zrejme o niečo ťažšie ako v prípade prvého obrázku, keďže tu je podobnosť bankoviek násobne vyššia. Možno sa teraz pýtate: Na základe čoho sa generátor postupne naučí vytvárať takéto vierohodné výstupy? A ako sa diskriminátor učí rozoznávať čo je skutočné a čo nie?

Architektúra GAN siete

Aby sme na to odpovedali, musíme sa pozrieť trochu do hĺbky GAN architektúry a povedať niečo o jej trénovaní.

Oba komponenty, generátor aj diskriminátor, sú každý samostatná, navonok nezávislá hlboká neurónová sieť. Pozrime sa na nasledujúci obrázok, kde je celá táto architektúra schematicky znázornená.

GAN schema

Architektúra GAN siete

zdroj: Google Developers upravené

Tak ako každá neurónová sieť, aj generátor potrebuje vstupné dáta. Väčšina neurónových sietí berie ako vstup napríklad reálny obraz, ktorý chceme určitým spôsobom vyhodnotiť. V tomto prípade nám úplne postačí náhodný šum z ľubovoľného rozdelenia pravdepodobnosti. Tento šum sa generátor pokúsi transformovať na zrozumiteľný výstup, ktorý potom použijeme ako negatívny príklad pre diskriminátor. Na druhej strane tu máme dataset reálnych obrázkov, ktoré použijeme ako pozitívne príklady a na nich sa bude generátor učiť vytvárať vlastné „reálne“ výstupy. Takýto mix vzoriek z generátora aj z datasetu je teda ďalej posunutý pre diskriminátor. Ten sa pre potom osobitne pre každý tento výstup pokúsi správne určiť, či je to reálny, alebo vygenerovaný vstup.

Trénovanie

Pozrime sa teraz bližšie na trénovanie. Začneme od tej jednoduchšej časti, ktorou je diskriminátor. Je to prakticky obyčajný klasifikátor, takže tu možno použiť ľubovoľnú architektúru, ktorá vie spraviť klasifikáciu dát. Spravidla sa používajú konvolučné siete. Jedna trénovacia iterácia potom vyzerá nasledovne: Vygenerujeme z náhodných vstupov nejaké vzorky, presne ako sme si popísali v predošlom odstavci a necháme klasifikátor vyhodnotiť ich. Následne určíme chybu klasifikátora, cez spätné šírenie chyby zistíme gradienty a na základe nich upravíme váhy diskriminátora. Sieť sa tu teda učí, ako „nebyť oklamaná“ generátorom.

GAN trenovanie schema

V prípade generátora to bude prakticky skoro to isté. V jednej iterácii opäť vygenerujeme náhodné vstupy, necháme ich vyhodnotiť, určíme chybu s použitím spätného šírenia chyby cez obe siete a vypočítame gradienty. Pomocou nich opäť aktualizujeme váhy, avšak v tomto prípade to bude sieť generátora. V tejto časti sa teda sieť učí, ako vygenerovať taký výstup, aby ho diskriminátor nevedel odlíšiť od reality.

GAN trenovanie schema

Určite ste si všimli, ale pre istotu opäť zdôrazníme, nikdy v jednej iterácii neaktualizujeme váhy oboch komponentov naraz! Ak by sme ich chceli trénovať súčasne, nedokázali by sme dosiahnuť konvergenciu. Bolo by to ako strieľať na terč, ktorý sa vždy hneď po namierenom výstrele náhodne uhne. V jednom cykle vždy trénujeme, buď výhradne generátor, alebo výhradne diskriminátor a tieto cykly po pár epochách striedame. Trénovanie ukončíme v momente, keď už diskriminátor vôbec nevie rozoznať, či je výstup z generátora skutočný, alebo vymyslený, a teda len tipuje 50:50.

Slovo na záver

Možno sa ešte pýtate, ale ako navrhnúť účelovú funkciu pre celú túto architektúru? Odpoveď na túto otázku je oblasťou aktívneho výskumu. Povieme len toľko, že je možné použiť jednu alebo dve účelové funkcie, pričom najčastejšie sa používa buď minimaxová, modifikovaná minimaxová alebo tzv. Wassersteinova chyba. Tie pre jednoduchosť detailne rozoberať nejdeme, pretože o tom by sme mohli osobitne napísať celý ďalší článok. Rovnako by sme mohli napísať celý článok o tom, na aké problémy možno pri práci s GAN sieťami naraziť. Ale o tom nabudúce.

 

Zdroje:

https://developers.google.com/machine-learning/gan/generator

https://machinelearningmastery.com/what-are-generative-adversarial-networks-gans/

 

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *