98
4.1.4
Deep learning v jazyku Python – Knihovny Keras, TensorFlow
V této knize se zaměřujeme především na řízené učení, protože je dnes zdaleka dominantní formou hlubokého učení se širokým spektrem průmyslových aplikací. V dalších kapitolách se ale blíže podíváme i na samořízené učení.
Posilované učení (reinforcement learning)
Toto odvětví strojového učení bylo dlouho přehlíženo. Pozornosti se mu dostalo teprve poté, co je úspěšně použila aplikace Google DeepMind, aby se naučila hrát hry pro Atari a později hrát Go na nejvyšší úrovni. Při posilovaném učení získává agent informace o svém prostředí a učí se zvolit akce, které maximalizují nějakou odměnu. Například neuronová síť, která „se dívá“ na obrazovku videohry a provádí herní akce s cílem maximalizovat své skóre, může být natrénována prostřednictvím posíleného učení. V současné době je posilované učení většinou výzkumnou oblastí a za hranicemi her ještě nezaznamenalo významné praktické úspěchy. Časem však očekáváme, že posilované učení se uplatní ve stále širší škále aplikací v reálném světě: řízení automobilů, robotice, řízení zdrojů, vzdělávání atd. Je to nápad, jehož čas přijde nebo brzy přijde.
4.2
Vyhodnocení modelů strojového učení
Ve třech příkladech uvedených v kapitole 3 jsme data rozdělili na trénovací, validační a testovací množinu. Důvod, proč nehodnotit modely na stejných datech, na kterých byly natrénovány, se rychle ukázal: po několika epochách se všechny tři modely začaly přeučovat. To znamená, že jejich výkonnost na dosud nepoužitých datech začala stagnovat nebo se dokonce zhoršovat ve srovnání s jejich výkonností na trénovacích datech, která se s postupujícím trénováním vždy zlepšuje. Při strojovém učení je cílem dosáhnout modelů, které generalizují (tj. dobře fungují na dosud neviděných datech) a hlavní překážkou je přeučení. Můžete jen řídit to, co můžete sledovat, takže je velmi důležité, abyste mohli spolehlivě měřit generalizační výkon vašeho modelu. Následující části se zabývají strategiemi pro zmírnění přeučení a maximalizaci zobecnění. V této části se zaměříme na to, jak můžeme generalizaci měřit: jak modely strojového učení vyhodnotit.
4.2.1
Trénovací, validační a testovací množiny
Hodnocení modelu se rozdělením dostupných dat do tří množin (trénovací, validační a testovací) vždy snižuje. Trénujete na trénovacích datech a ověřujete svůj model na validačních datech. Jakmile je váš model připraven, vyzkoušíte jej na testovacích datech. Můžete se zeptat, proč nemáte jen dvě množiny: trénovací množinu a testovací množinu? Trénovali byste na trénovacích datech a vyhodnotili na testovacích datech. To by bylo mnohem jednodušší! Důvodem je to, že vývoj modelu vždy zahrnuje ladění jeho konfigurace: např. volbou počtu vrstev nebo velikosti vrstev (označují se jako hyperparametry modelu (hyperparameters of the model), abychom je odlišili od parametrů (parameters), což jsou váhy sítě). Toto ladění provedete tak, že jako signál zpětné vazby použijete výkonnost modelu na validačních datech. 01G_Hluboké učení v jazyku Python_ZLOM.doc; verze 1.02.8060 – 2019-05-03
Strana 98 z 328 Ukázka elektronické knihy, UID: KOS272862
Kapitola 4
Základy strojového učení
99
Glosář klasifikace a regrese Klasifikace a regrese zahrnují mnoho specializovaných pojmů. S některými z nich jste se setkali v dřívějších příkladech a s dalšími se setkáte v následujících kapitolách. Mají přesné definice specifické pro strojové učení a měli byste se s nimi seznámit:
● Příklad (sample) nebo vstup (input)
Jeden datový bod, který přichází do vašeho modelu.
● Predikce (prediction) nebo výstup (output) Co vychází z vašeho modelu.
● Cíl (target)
Skutečná (správná) hodnota. Co by měl váš model v ideálním případě predikovat, podle externího zdroje dat.
● Chyba predikce (prediction error) nebo ztrátová hodnota (loss value) Míra odchylky mezi predikcí vašeho modelu a cílovou hodnotou.
● Třídy (classes)
Množina možných tříd, z nichž si můžete při klasifikačním problému vybrat. Například při klasifikaci koček a psů jsou dvěma třídami „pes“ a „kočka“.
● Označení třídy (label)
Označení třídy v klasifikačním problému. Je-li např. obrázek č. 1234 označen jako obsahující třídu „pes“, pak „pes“ je označení třídy obrázku č. 1234. ● Základní pravda (ground-truth) nebo anotace (annotations) Všechny cíle pro danou datovou množinu, typicky shromažďované lidmi.
● Binární klasifikace (binary classification)
Klasifikační úloha, kdy by měl být každý vstupní příklad zařazen do jedné ze dvou exkluzivních kategorií.
● Klasifikace do více tříd (multiclass classification)
Klasifikační úloha, kdy by každý vstupní příklad měl být zařazen do jedné z více než dvou tříd: například klasifikovat ručně psané číslice.
● Klasifikace s více označeními tříd (multilabel classification)
Klasifikační úloha, při které lze každý vstupní vzorek zařadit do více tříd. Například daný obrázek může obsahovat jak kočku, tak i psa a měl by být označen jak označením „kočka“, tak označením „pes“. Počet označení obrázku je obvykle variabilní.
● Skalární regrese (scalar regression)
Úloha, kde je cíl spojitá skalární hodnota. Dobrým příkladem je predikce cen nemovitostí: různé cílové ceny tvoří spojitý prostor.
● Vektorová regrese (vector regression)
Úloha, ve které je cíl soustavou spojitých hodnot: například spojitý vektor. Vektorovou regresi provádíte při regresi více hodnot – např. souřadnice ohraničujícího rámečku v obraze.
● Minidávka (mini-batch) nebo dávka (batch)
Malá množina příkladů (typicky mezi 8 a 128), které jsou současně zpracovávány modelem. Počet příkladů je často mocninou 2, což usnadňuje přidělování paměti na GPU. Při trénování se používá mini-dávka pro výpočet jedné aktualizace sestupu gradientu aplikované na váhy modelu.
01G_Hluboké učení v jazyku Python_ZLOM.doc; verze 1.02.8060 – 2019-05-03
Strana 99 z 328 Ukázka elektronické knihy, UID: KOS272862
100
Deep learning v jazyku Python – Knihovny Keras, TensorFlow
Toto ladění je v podstatě forma učení: hledání dobré konfigurace v nějakém prostoru parametrů. Výsledkem je, že ladění konfigurace modelu na základě jeho výkonu na validační množině může vést rychle k přeučení vůči validační množině (overfitting to the validation set), a to i přesto, že váš model na ní není nikdy přímo natrénován. Ústředním tématem tohoto jevu je pojem úniku informací (information leaks). Pokaždé, když vyladíte hyperparametr svého modelu na základě výkonnosti modelu na validační množině, některé informace o validačních datech uniknou do modelu. Uděláte-li to pouze jednou u jednoho parametru, uniká velmi málo bitů a vaše validační množina zůstane spolehlivá pro vyhodnocení modelu. Ale opakujete-li to mnohokrát (spustíte experiment, vyhodnotíte jej na validační množině a následně upravíte svůj model), pak do modelu dostáváte stále větší množství informací o validační množině. Na konci dne skončíte s modelem, který funguje správně na validačních datech, protože to je to, co jste optimalizovali. Zajímáte-li se však o výkonnost na zcela nových datech, nikoliv na validačních datech, potřebujete pro vyhodnocení použít úplně jinou, nikdy předtím nepoužitou množinu dat: testovací datovou množinu. Váš model by neměl mít přístup k žádným informacím o testovací množině, a to ani nepřímo. Bude-li cokoliv v modelu naladěno na základě výkonu na testovací množině, pak bude vaše míra generalizace chybná. Rozdělení dat do trénovací, validační a testovací množiny se může zdát jednoduché, ale je-li k dispozici málo dat, můžete se dostat od problémů. Existuje několik pokročilých způsobů, jak to v takovéto situaci udělat. Přezkoumáme tři klasické hodnotící recepty: jednoduchou validaci na odebraných datech (mohli bychom ji nazvat validace s odložením), k-násobnou validaci a opakovanou k-násobnou validaci s promícháním. Jednoduchá validace na odebraných datech Česky bychom ji mohli nazvat jako jednoduchou validaci s odložením (validační množiny). Oddělte některé části vašich dat jako testovací množinu. Trénujte na zbývajících datech a vyhodnoťte na testovací množině. Jak jste viděli v předchozích částech, aby nedošlo k úniku informací, neměli byste ladit váš model na základě testovací množiny, a proto byste měli rezervovat také validační množinu. Schematicky je tato technika znázorněna na obrázku 4.1. Následující výpis ukazuje jednoduchou implementaci.
Obrázek 4.1: Jednoduchá validace na odebraných datech
Výpis 4.1:
Jednoduchá validace na odebraných datech
1 num_validation_samples = 10000 2 3 np.random.shuffle(data) # Promíchání dat je většinou vhodné 4 01G_Hluboké učení v jazyku Python_ZLOM.doc; verze 1.02.8060 – 2019-05-03 Ukázka elektronické knihy
Strana 100 z 328