{{TOC float}}

{{Sources| Zpracováno podle zápisků z Úvodu do strojového učení a knihy Tom Mitchell -- Machine Learning. Hodily se mi i zápisky z Metod matematické statistiky. -- User:Tuetschek 18:01, 25 Aug 2010 (CEST)

}}

Úvod

Formálně se strojové učení definuje následovně: Počítač se učí řešit úlohu třídy TT se zkušeností EE a úspěšností měřenou kritériem PP, jestliže se jeho úspěšnost se vzrůstající zkušeností zvyšuje. :Př.: TT = parsing, EE = treebank, PP počet správně určených hran.

Je třeba určit druh znalostí, které se bude počítač učit, a jejich reprezentaci a navrhnout konkrétní algoritmus učení. Typicky se jedná o aproximaci nějaké cílové funkce, která realizuje úkol, jenž chceme počítač naučit (reálná funkce -- regrese, diskrétní -- klasifikace).

Zkušenost může být přímá (zápis pravidel) a nepřímá ("dobré" postupy na základě trénovacích dat). Učení může být supervised (s učitelem, kdy EE = trénovací data), semi-supervised (systém generuje postupy a něco je známkuje) nebo neřízené.

Učení založené na konceptu

Učení se konceptů lze definovat jako získání vymezení nějakého konceptu na základě vzorku pozitivních a negativních trénovacích příkladů (instancí) -- trénovacích dat D=xi,yii=1nD = \langle x_i,y_i\rangle_{i=1}^n, kde X=x1,x2,xnX = x_1, x_2, \dots x_n jsou atributy a y1ynY={0,1}y_1\dots y_n \in Y = \{0,1\} je klasifikace instancí. Snažíme se najít cílovou funkci c:XY,c(xi)=yic:X\to Y, c(x_i) = y_i. Hledáme ji nad prostorem hypotéz (modelem) HH; tj. hledáme hH:h(xi)=c(xi) i1,nh\in H: h(x_i) = c(x_i)\ \forall i\in 1,\dots n.

Učení se konceptů můžeme chápat jako vyhledávání. V množině hypotéz se nachází prostor možností (version space) -- podmnožina hypotéz konzistentních s trénovacími daty (množina cílových funkcí, které klasifikují trénovací data správně) VSH,DVS_{H,D} a v této podmnožině se někde nachází optimální hypotéza. Pomocí strojového učení se jí přibližujeme, od startovací hypotézy se postupně dostaneme do něčeho, co je konzistentní s trénovacími daty, ale ne nutně k optimu.

Hledáme takovou hypotézu, která by odpovídala cílové funkci na všech trénovacích příkladech: hH:xX:h(x)=c(x)h\in H: \forall x\in X: h(x) = c(x). Hypotéza, která je "vhodně dobrou" aproximací cílové funkce nad trénovacími daty, bude i "vhodně dobrou" aproximací nad ostatními daty.

Uspořádání hypotéz

Zvolme si reprezentaci hypotéz jako nn-tici "povolených" hodnot proměnných z trénovacích příkladů, přičemž pro hypotézu může být hodnotou:

  • Specifická hodnota dané proměnné (tj. povolená je jedna hodnota)

  • "??" (tj. na hodnotě této proměnné nezáleží, povolené je všechno)

  • "\emptyset" (tj. nevyhovuje žádná hodnota této proměnné)

Pokud instance xx vyhovuje všemi svými hodnotami proměnných povoleným hodnotám pro hypotézu hh, potom h(x)=1h(x) = 1, tj. hypotéza hh klasifikuje xx jako pozitivní příklad.

Potom nejobecnější hypotéza je taková, která cokoliv klasifikuje jako pozitivní případ, tj. (?,?,?,,?)(?, ?, ?, \dots, ?) a nejspecifičtější hypotéza taková, která vše klasifikuje jako negativní, tj. (,,,)(\emptyset, \emptyset,\dots,\emptyset).

Pro prohledávání prostoru hypotéz máme vodítko: uspořádání podle specifičnosti.

  • Hypotéza hHh\in H je obecnější než hypotéza jHj \in H (hgjh \geq_{g} j), právě když xX:j(x)=1h(x)=1\forall x\in X: j(x) = 1\Rightarrow h(x) = 1 (můžeme říct, že jj je specifičtější než hh). Relace g\geq_{g} je částečné uspořádání nad prostorem HH.

  • Hypotéza hHh\in H je striktně obecnější než jHj \in H (h>gjh >_{g} j), pokud hh je obecnější než jj, ale jj není obecnější než hh.

Ještě definujme hranici obecnosti (general boundary) GG vzhledem k HH a DD jako množinu nejobecnějších hypotéz z HH konzistentních s DD. Proti tomu Hranice specifičnosti (specific boundary) SS vzhledem k HH a DD je množina nejspecifičtějších hypotéz z HH konzistentních s DD.

Algoritmus Find-S

Nalezne nejspecifičtější hypotézu, která ještě vyhovuje trénovacím datům.

  1. Vezmi nejspecifičtější hypotézu hHh\in H

  2. x\forall x pozitivní trénovací příklad a ai\forall a_i atribut reprezentace hh: pokud hodnota aia_i u xx neodpovídá hh, nahraď hodnotu aia_i v hh nejbližší obecnou hodnotou, která odpovídá xx

  3. Po projití všech pozitivních příkladů vrať upravené hh

Find-S vrátí nejspecifičtější hypotézu konzistentní s pozitivními trénovacími příklady. Za předpokladů, že prohledávaný soubor hypotéz obsahuje cílovou funkci cc a trénovací data neobsahují chyby, bude nalezená hypotéza konzistentní i s negativními trénovacími příklady, tj. s celými trénovacími daty.

Je-li víc správných hypotéz, nalezneme takto jen jednu z nich, navíc neodhalíme nekonzistenci trénovacích dat. Nemusí existovat ani jen jedna nejspecifičtější hypotéza.

Problém nalezení všech konzistentních hypotéz řeší algoritmus Candidate-Elimination.

Algoritmus Candidate-Elimination

Algoritmus pracuje s prostorem možností, určeným hranicí obecnosti a hranicí specifičnosti. To je možné proto, že platí následující věta:

Věta o reprezentaci prostoru možností: VSH,D={hH:sS,gG:(gghgs)}VS_{H,D} = \{h\in H: \exists s\in S, \exists g\in G: (g\geq_g h\geq_g s)\}.

Postup algoritmu:

  1. Do G,SG, S přiřaď množinu nejobecnějších, resp. nejspecifičtějších hypotéz z HH

  2. Postupuj přes trénovací příklady dDd\in D:

  3. Je-li příklad dDd\in D pozitivní:

    1. Odstraň z GG hypotézy nekonzistentní s dd.

    2. Každou s dd nekonzistentní hypotézu z SS odstraň a přidej do SS její minimální zobecnění konzistentní s dd, pro které existuje nějaká obecnější hypotéza v GG. Odstraň pak z SS hypotézy, které jsou obecnější než jiné hypotézy v SS.

  4. Je-li příklad dDd\in D negativní:

    1. Odstraň z SS hypotézy nekonzistentní s dd.

    2. Každou s dd nekonzistentní hypotézu z GG odstraň a přidej do GG její minimální specializaci konzistentní s dd, pro kterou existuje nějaká specifičtější hypotéza v SS. Odstraň pak z GG hypotézy, které jsou specifičtější než jiné hypotézy v GG.

  5. Na konci vrať G,SG, S jako reprezentaci prostoru možností.

Induktivní předpoklad

Různé algoritmy různým způsobem zobecňují údaje získané z trénovacích dat, aby byly schopny klasifikovat i dříve neviděné příklady. Pro zachycení této strategie definujme:

  • Je-li algoritmus LL natrénovaný na datech DcD_c schopný klasifikovat instanci xix_i, je tato klasifikace (ozn. L(xi,Dc)L(x_i,D_c)) induktivně odvoditelná z oné instance a trénovacích dat. Píšeme (Dcxi)L(xi,Dc)(D_c\wedge x_i)\triangleright L(x_i, D_c).{{ref|1}} To ale ještě neznamená, že je z instance a dat dokazatelná -- algoritmus v sobě může obsahovat navíc induktivní předpoklad.

  • Induktivní předpoklad (inductive bias) algoritmu LL je minimální množina tvrzení BB taková, že pro libovolnou cílovou funkci cc definovanou nad instancemi XX a odp. trénovací data DcD_c platí: xiX:(BDcxi)L(xi,Dc)\forall x_i \in X: (B\wedge D_c\wedge x_i)\vdash L(x_i, D_c), tj. klasifikace xix_i algoritmem LL natrénovaným na DcD_c je dokazatelná z instance, trénovacích dat a induktivního předpokladu.

Algoritmus Candidate-Elimination předpokládá, že cílovou funkci lze popsat pomocí naší zvolené reprezentace, tj. nachází se v našem prostoru hypotéz: B={cH}B = \{c\in H\}. Bude-li tento předpoklad splněn, pak najde optimální hypotézu. Je jasné, že tento předpoklad splněn nebude, když např. dvě konkrétní hodnoty nějakého atributu budou určovat pozitivní případy a zbytek negativní. Find-S oproti Candidate-Elimination ještě navíc předpokládá, že všechny příklady jsou negativní, pokud jejich protějšek nepřináší novou znalost.

Kdybychom zvolili reprezentaci hypotéz disjunkcemi všech možných hodnot atributů, tj. nechali induktivní předpoklad prázdný, Candidate-Elimination nebude schopný zobecňovat za hranici trénovacích příkladů (nalezená hypotéza bude čistě disjunkcí všech trénovacích příkladů).

Pro algoritmy učení je tedy třeba uvažovat, jak silné mají indukční předpoklady. Ty jsou někdy velice striktní, jako v případě Candidate-Elimination, někdy znamenají jen preferenci určitého typu hypotéz (např. co nejkratších, podle kritéria Occamovy břitvy).

Rozhodovací stromy

Rozhodovací stromy jsou induktivní algoritmy, vytvořené ke klasifikaci instancí, které popisují pomocí "disjunkce konjunkcí". Můžeme je použít, když instance jsou popsány atributy a hodnotami a cílová funkce je diskrétní. V trénovacích datech můžou být i chyby nebo nevyplněné atributy.

Cílová funkce je tu reprezentována právě rozhodovacím stromem (sekvencí rozhodnutí if-then-else), klasifikace se provádí průchodem stromu od kořene k listům, přičemž se v každém uzlu testuje hodnota jednoho atributu instance a na jejím základě se určí další směr (zvolí se hrana). Každý list určuje klasifikaci instance.

ID3 algoritmus

ID3 je algoritmus, který vytváří rozhodovací stromy na základě trénovacích dat. Postupuje top-down -- konstruuje strom od kořene. V každém uzlu si klade otázku: Který atribut je nejlepší pro tento uzel? a řeší ji statistickým testem na základě maximální entropie. Počet větví vedoucích z uzlu je počet možných hodnot atributu, takže ho známe hned po vytvoření uzlu. Trénovací data jsou při vytváření dělena podle atributů v daném uzlu.

Pracuje rekurzivně:

  1. Vyřeší singulární případy:

    1. Všechna trénovací data jsou pozitivní případy / negativní případy: vytvoří jednouzlové stromy s (+) nebo (-).

    2. Nemáme (už) žádné atributy: vytvoří jednouzlový strom s (nejčastější hodnota cíl. funkce v relevantní části trénovacích dat).

  2. Vybere atribut AA, který nejlépe klasifikuje trénovací data a:

    1. Pro každou jeho možnou hodnotu udělá poduzel, rozdělí trénovací data podle těchto hodnot.

    2. Máme-li pro danou hodnotu atributu trénovací data, volá se rekurzivně (na danou část trénovacích dat a atributy s vynechaným AA).

    3. Pokud nejsou trénovací data, vloží list s (nejčastější hodnota cíl. funkce v celých trénovacích datech).

  3. Vrátí výsledný (pod)strom.

Prochází se celý hypothesis space, ale hladovým způsobem bez backtrackingu. Výstupem je 1 rozhodovací strom, tj. jedna hypotéza.

Výběr nejlepšího atributu probíhá na základě informačního zisku. Který atribut má nejvyšší informační zisk (míra očekávaného snížení entropie, vlastně vzájemná informace cílové klasifikace a atributu), ten je vybrán. Platí: G(D,A)=H(D)vvalues(A)(DvDH(Dv))G(D,A) = H(D) - \sum_{v\in\mathrm{values}(A)}(\frac{|D_v|}{|D|}\cdot H(D_v)), kde:

  • G(D,A)G(D,A) je informační zisk pro data DD a atribut AA,

  • H(D)H(D) je entropie dat DD vzhledem k cílové funkci,

  • DvD_v jsou data, která mají hodnotu atributu AA rovnou vv.

ID3 prochází úplný prostor hypotéz tím, že začíná od nejjednodušší a postupně ji zesložiťuje, netestuje ale zdaleka všechny možnosti. Na rozdíl od předchozích algoritmů v každém kroku uvažuje celá trénovací data. Induktivní předpoklad ID3 je (přibližně) preference kratších stromů.

Vylepšení ID3 (zhruba odpovídá algoritmu C4.5)

Jedním z možných problémů je overfitting, tj. přílišné přizpůsobení se trénovacím datům. Řekneme, že hypotéza hHh\in H overfituje trénovací data, pokud existuje hypotéza hHh'\in H taková, že hh má menší chybu než hh' na trénovacích datech, ale na celé distribuci instancí je to naopak.

Vyvarovat se overfittingu lze prořezáváním (pruning) -- nahrazením některých podstromů listem s nejčastější hodnotou cílové funkce na trénovacích datech. Lze provádět buď rovnou zastavením tvorby stromu dřív, než dosáhne ideální klasifikace trénovacích dat, nebo zpětně strom zjednodušit za použití heldout dat pro validaci při trénování (reduced error pruning).

Složitější je strategie rule-post-pruning spočívá v následujícím postupu:

  1. Vytvoření rozhodovacího stromu.

  2. Jeho převedení na pravidla (počet pravidel = počet listů), kdy 1 pravidlo je 1 cesta od listu ke kořeni.

  3. Pro každé pravidlo zahodit ty podmínky, jejichž vyhozením se přesnost pravidla zlepší.

  4. Pravidla setřídit podle přesnosti na trénovacích datech, reálná data klasifikovat použitím pravidel v tomto pořadí.

Proti prořezávání nad stromem nemusíme vyhazovat jen z konce stromu, máme jemnější rozlišení.

Je-li některý atribut AA spojitý (ale cílové ohodnocení stále diskrétní), lze ho převést na diskrétní nalezením jednoho předělu, pro který dostaneme nejvyšší informační zisk.

Má-li atribut více hodnot (např. nějaké datum), informační zisk ho bude preferovat, což často vede k vytvoření stromu hloubky 1, který funguje jen na trénovací data. Musíme pak změnit test výběru atributů, místo zisku informace používáme např. ziskový poměr (gain ratio):

  • Rozštěpení informace (split information): SI(D,A)=vvalues(A)DvDlog2(DvD)SI(D,A) = - \sum_{v\in\mathrm{values}(A)}\frac{|D_v|}{|D|}\log_2(\frac{|D_v|}{|D|})

  • Ziskový poměr: GR(D,A)=G(D,A)SI(D,A)GR(D,A) = \frac{G(D,A)}{SI(D,A)}, kde G(D,A)G(D,A) je informační zisk pro trénovací data DD a atribut AA

Jsou i jiné alternativní způsoby výběru nejlepšího atributu, např. distance-based measure, kdy se vybírá atribut, který dělí data co nejrovnoměrněji podle nějaké metriky (směrodatná odchylka, wen:Gini_coefficient).

Neznáme-li hodnotu některého z atributů, můžeme mu přiřadit nejčastější hodnotu, nebo rozhodování rozdělit podle všech možných hodnot a na konci udělat průměr výsledků vážený podle jejich pravděpodobnosti výskytu.

Pokud jsou některé atributy důležitější než jiné, zavádí se cena atributu (cost of the attribute) a jiné kritérium výběru atributu.

Neuronové sítě

Vznik neuronových sítí je motivován biologicky, funkcí mozku jako spojení mnoha neuronů. Umělé neuronové sítě ale jsou poněkud jednodušší -- jedná se o propojenou množinu jednotek (neuronů), z nichž každá z několika reálných hodnot na vstupu vydá jednu reálnou hodnotu na výsupu. Živé neurony proti tomu vydávají mnohem složitější elektrické signály.

Neuronová síť bývá typicky zapojená jako orientovaný acyklický graf, ale nemusí to být nutné. Tady se ale omezíme jen na takové sítě, protože na ně známe jednoduchý algoritmus trénování -- backpropagation.

Neuronové sítě jsou vhodné pro složitá a potenciálně zašuměná vstupní data, jako např. vstupy z kamer a mikrofonů (rozpoznávání řeči, rozpoznávání obličejů apod.). Jsou ale použitélná i pro data se symbolickou reprezentací, kde dosahují výsledků srovnatelných s rozhodovacími stromy. Cílová funkce může být reálná i diskrétní a může jít i o vektor hodnot. Trénování zpravidla trvá dlouho, ale klasifikace nových instancí je velmi rychlá. Natrénované hodnoty se často nedají dobře interpretovat, ale fungují.

Perceptron

Perceptron je vlastně jeden druh neuronu často používaného v neuronových sítích. Jde o jednotku, která ze vstupu x1,,xnx_1,\dots,x_n spočítá hodnotu výstupu o(x1,,xn)o(x_1,\dots,x_n). Podle druhu výpočtu rozlišujeme{{ref|2}}:

  • Lineární perceptron, který počítá lineární kombinaci vstupů na základě natrénovaných vah -- w0+w1x1+wnxnw_0 + w_1x_1 + \dots w_nx_n. Můžeme přidat x0=1x_0 = 1 a zapsat jeho výpočet jako o(x)=wxo(\vec{x}) = \vec{w}\cdot \vec{x}.

  • (Základní) prahový perceptron, který počítá funkci o(x)=sgn(wx)o(\vec{x}) = sgn(\vec{w}\cdot\vec{x}) a vrací diskrétní hodnoty 1,1-1,1.

  • Sigmoidovou jednotku, který používá sigmoidovou (logistickou) funkci σ(y)=11+ey\sigma(y) = \frac{1}{1+e^{-y}} a počítá o(x)=σ(wx)o(\vec{x}) = \sigma(\vec{w}\cdot \vec{x}). I když funguje na stejném principu jako dva předchozí a vlastně dává podobné výsledky jako prahový perceptron (její obor hodnot je interval

    ParseError: KaTeX parse error: Undefined control sequence: \[ at position 1: \̲[̲-1,1]

    ), podle jména se mezi perceptrony nepočítá.

Jak je vidět, prostor hypotéz perceptronu je množina všech možných reálných vah (H={wwRn+1}H = \{\vec{w}|\vec{w}\in\mathbb{R}^{n+1}\}).

Uvažujme nyní prahový perceptron. Ten se vlastně dá považovat za reprezentaci "rozhodující nadroviny" v nn-dimenzionálním prostoru instancí (to jsou vlastně body v nn-rozměrném prostoru). Vrací 11 pro body, které leží na jedné straně nadroviny a 1-1 pro ty na druhé straně. To ale znamená, že správně umí klasifikovat jen problémy, kde opravdu pozitivní a negativní příklady jdou oddělit nadrovinou. Takovým problémům (a množině příkladů) se říká lineárně separovatelné.

:Př. Perceptron se umí naučit booleovské funkce AND a OR, ale neumí XOR, protože není lineárně separovatelná.

Následují dvě možnosti, jak perceptron natrénovat. Další alternativou by bylo i lineární programování, ale to funguje jen v lineárně separovatelném případě a navíc se nedá použít jako základ pro složitější sítě.

Perceptron Training Rule

Nejjednodušším způsobem, jak natrénovat váhy (prahového) perceptronu, je použít perceptron training rule -- začneme s náhodnými vahami a iterativně zkoušíme klasifikovat trénovací příklady a jakmile dojde ke špatné klasifikaci, váhy změníme. Formálně v každém kroku provedeme: :wi:=wi+Δwiw_i := w_i + \Delta w_i, kde Δwi=η(to)xi\Delta w_i = \eta(t-o)x_i

Hodnota oo je výstup perceptronu a tt správná klasifikace. Hodnotě η\eta říkáme learning rate -- určuje, jak ostře nové příklady ovlivňují původní hodnoty vah. Většinou je nastavená na nějakou malou hodnotu, můžeme ji i snižovat s počtem iterací.

V případě, že trénovací příklady jsou lineárně separovatelné, takovýto algoritmus po konečném počtu iterací dojde k vektoru vah, se kterým perceptron správně klasifikuje všechny trénovací příklady.

Gradient Descent (Delta Rule)

Jiný způsob je gradient descent (klesání podle gradientu). Uvažujme nyní <u>lineární perceptron</u>, abychom mohli snadno derivovat. Stanovíme si funkci, která hodnotí trénovací chybu hypotézy (tj. vektoru vah) E(w)E(\vec{w}) a iterativně budeme hledat, kterým směrem jde gradient a vydáme se přesně opačným (tj. proti směru největšího růstu funkce). Tak dojdeme pro "hezké funkce" do místa, kde je gradient nulový a tedy je tam (bohužel jen lokální) minimum chybové funkce. Pro lineárně separovatelné trénovací instance bychom se měli dostat k nulové chybě, ale i pro neseparovatelné dostaneme (snad) to nejlepší, co můžeme. Velmi vhodnou funkcí trénovací chyby je: :E(w)=12dD(tdod)2E(\vec{w}) = \frac{1}{2}\sum_{d\in D} (t_d - o_d)^2, kde DD jsou trénovací data a td,odt_d, o_d skutečná hodnota a výstup perceptronu jako v předchozí sekci.

Potom metoda gradient descent postupuje stejně iterativně jako v předchozím případě:

:wi:=wi+Δwiw_i := w_i + \Delta w_i, kde Δwi=ηE(w)\Delta w_i = -\eta \nabla E(\vec{w}) (bereme záporný gradient, takže jdeme opačným směrem) Pokud si upravovací pravidlo rozložíme na jednotlivé složky, můžeme vypočítat:

:Δwi=ηEwi\Delta w_i = -\eta\frac{\partial E}{\partial w_i} a Ewi=wi12dD(tdod)2=12dD2(tdod)wi(tdwxd)=dD(tdod)(xid)\frac{\partial E}{\partial w_i} = \frac{\partial}{\partial w_i} \frac{1}{2} \sum_{d\in D}(t_d-o_d)^2 = \frac{1}{2}\sum_{d\in D}2(t_d-o_d)\frac{\partial}{\partial w_i}(t_d-\vec{w}\cdot\vec{x_d}) = \sum_{d\in D} (t_d-o_d)(-x_{id}) xidx_{id} značí vstup xix_i v trénovacím příkladu DD. Dosazení do původní rovnice dává pravidlo:

:Δwi=ηdD(tdod)xid\Delta w_i = \eta \sum_{d\in D} (t_d-o_d)x_{id}

Pro zrychlení výpočtu a snížení rizika "zamrznutí" v lokálním minimu se používá stochastická aproximace (inkrementální nebo stochastický gradient descent), kdy váhy upravuji ne podle gradientu na celých trénovacích datech, ale jen s přihlédnutím k jednomu trénovacímu příkladu{{ref|3}}: :Δwi=η(to)xi\Delta w_i = \eta (t-o) x_i

Protože prahový perceptron čistě vrací znaménko výstupu lineárního perceptronu, je možné perceptron natrénovat touto metodou jako lineární a pak použít prahy (ale pozor, neminimalizujeme počet špatně klasifikovaných příkladů prahového perceptronu, ale sumu chyby lineárního perceptronu, což nemusí vést ke stejným výsledkům).

Neuronová síť

Perceptrony se dají spojovat do sítí a potom jsou schopny se naučit i lineárně neseparovatelné problémy (to ale neplatí o lineárních perceptronech -- lineární kombinace lineárních kombinací je pořád lineární kombinace). Protože síťovat lineární perceptrony tedy nemá smysl a prahové perceptrony používají funkci, která se nedá dobře derivovat, použijeme <u>sigmoidové jednotky</u>. Derivace sigmoidové funkce je totiž σ(y)=σ(y)(1σ(y))\sigma'(y) = \sigma(y)(1-\sigma(y)). Někdy se používá i varianta sigmoidové funkce s ekye^{-k\cdot y} nebo funkce tanh\tanh.

Takovéto jednotky můžeme tedy zasadit do sítě ve tvaru acyklického grafu. Trénování vah ale pak bude složitější, používá se na to algoritmus backpropagation.

Algoritmus backpropagation

Máme-li pevně dánu množinu jednotek a jejich spojení, která má libovolný počet vstupů a výstupů, můžeme natrénovat váhy každého vstupu pomocí algoritmu backpropagation. Používáme přitom stejných myšlenek jako u gradient descent, když se snažíme minimalizovat chybovou funkci:

:E(w)=12dDkOut(tkdokd)2E(\vec{w}) = \frac{1}{2} \sum_{d\in D} \sum_{k\in\mathrm{Out}} (t_{kd} - o_{kd})^2 -- jde o stejnou funkci jako předtím, jen upravenou pro množinu výstupů Out\mathrm{Out}.

Stejně jako předtím prohlédáváme prostor hypotéz definovaný všemi možnými vektory vah a máme garantovanou konvergenci k lokálnímu minimu chybové funkce. Algoritmus vypadá (ve stochastické aproximaci) následovně (xjix_{ji} je vstup z ii-té jednotky do jj-té a wjiw_{ji} odpovídající váha):

  1. Inicializuje všechny váhy malými náhodnými čísly

  2. Dokud není splněna nějaká podmínka konvergence, opakuje (pro jednotlivé trénovací příklady x,t\langle \vec{x},\vec{t}\rangle, může je procházet i víckrát):

    1. Propaguje vstup dopředu sítí -- vloží x\vec{x} na vstup a spočítá výstup ouo_u z každé jednotky uu v síti

    2. Propaguje chyby a úpravy vektorů vah zpátky:

      1. Pro každou výstupní jednotku kk spočte chybu δk=ok(1ok)(tkok)\delta_k = o_k (1-o_k)(t_k-o_k)

      2. Pro každou vnitřní (skrytou) jednotku hh spočte chybu δh=oh(1oh)jDownstream(h)wjhδj\delta_h = o_h (1-o_h) \sum_{j\in \mathrm{Downstream}(h)} w_{jh}\delta_j

      3. Upraví všechny váhy v síti wji=wji+Δwjiw_{ji} = w_{ji} + \Delta w_{ji}, kde Δwji=ηδjxji\Delta w_{ji} = \eta \delta_j x_{ji}

Downstream(h)\mathrm{Downstream}(h) značí všechny jednotky, jejichž vstupy jsou přímo napojené na výstup jednotky uu. Pokud jednotky nejsou spojené cyklicky, lze najít takové pořadí jednotek, ve kterém lze spočítat hodnotu δh\delta_h pro všechny.

Pro upravovací pravidla vycházíme z gradientové metody, která by pro složitější síť měla ve stochastické variantě být Δwji=ηEdwji\Delta w_{ji} = -\eta\frac{\partial E_d}{\partial w_{ji}} pro naši chybovou funkci definovanou výstupem pro instanci dd.

  • Protože wjiw_{ji} ovlivňuje zbytek sítě jen prostřednictvím uzlu jj, můžeme použít řetízkové pravidlo a Edwji=EdIn(j)In(j)wji=EdIn(j)xji\frac{\partial E_d}{\partial w_{ji}} = \frac{\partial E_d}{\partial \mathrm{In}(j)}\frac{\partial \mathrm{In}(j)}{\partial w_{ji}} = \frac{\partial E_d}{\partial \mathrm{In}(j)} x_{ji}, kde In(j)=iUpstream(j)wjixji\mathrm{In}(j) = \sum_{i\in \mathrm{Upstream}(j)} w_{ji} x_{ji} a Upstream(j)\mathrm{Upstream}(j) jsou všechny jednotky, jejichž výstupy jsou napojené na vstup jj-té jednotky. Definujeme δj=EdIn(j)\delta_j = -\frac{\partial E_d}{\partial \mathrm{In}(j)}.

  • Pro výstupní jednotky z podobné úvahy vyplyne, že EdIn(j)=EdojojIn(j)\frac{\partial E_d}{\partial \mathrm{In}(j)} = \frac{\partial E_d}{\partial o_j}\frac{\partial o_j}{\partial \mathrm{In}(j)} a z toho -- z definice chybové funkce (všechny části její sumy krom jj-tého výstupu budou mít nulové derivace) a z definice sigmoidové funkce (oj=σ(In(j))o_j = \sigma(\mathrm{In}(j))) -- spočteme δj=(tjoj)oj(1oj)\delta_j = (t_j - o_j) o_j (1-o_j) .

  • Podobně i pro skryté jednotky EdIn(j)=kDownstream(j)EdIn(k)In(k)ojojIn(j)\frac{\partial E_d}{\partial \mathrm{In}(j)} = \sum_{k\in\mathrm{Downstream}(j)} \frac{\partial E_d}{\partial \mathrm{In}(k)}\frac{\partial \mathrm{In}(k)}{\partial o_j}\frac{\partial o_j}{\partial \mathrm{In}(j)}, protože skrytá jednotka ovlivňuje chybu jen přes své přímé výstupy; dostáváme rekurentní vzorec. Protože jediný vstup do kk, který se mění v závislosti na jj, je wkjxkjw_{kj} x_{kj}, ale vlastně xkj=ojx_{kj} = o_j, je In(k)oj=wkj\frac{\partial \mathrm{In}(k)}{\partial o_j} = w_{kj}. Poslední člen řetízku spočteme stejně jako pro výstupní jednotky a z toho δj=oj(1oj)kDownstream(j)δkwkj\delta_j = o_j(1-o_j) \sum_{k\in\mathrm{Downstream}(j)} \delta_k w_{kj}.

Vlastnosti neuronových sítí

Induktivní předpoklad algoritmu backpropagation se dá stanovit přesně jen těžko, intuitivně jde ale o cca lineární interpolaci mezi trénovacími příklady jako body nn-rozměrného prostoru.

Garance pouze lokálního minima v praxi až tolik nevadí -- díky tomu, že máme víc vah, je také méně pravděpodobné, že bude lokální minimum ve všech rozměrech vektoru. Inicializujeme-li malými hodnotami vah, bude výstup díky vlastnostem sigmoidové funkce přibližně lineární kombinace, až se zvýšením vah dostaneme výraznou nelinearitu.

Varianta algoritmu ještě přidává moment (α\alpha) a úprava vah částečně závisí na předchozí iteraci, čímž se snaží předejít zamrznutí v lokálním minimu (má pak určitou "setrvačnost"):

:Δwji(n)=ηδjxji+αΔwji(n1)\Delta w_{ji}(n) = \eta \delta_j x_{ji} + \alpha \Delta w_{ji} (n-1) Můžeme zkusit také natrénovat více sítí s lehce odlišnými počátečními vahami a vybrat si tu nejlepší.

Neuronová síť rozdělená do vrstev, v rámci nichž nejsou spoje, je schopná:

  • S dvěma vrstvami přesně simulovat libovolnou boolovskou funkci (až na to, že počet potřebných jednotek může být až exponenciální v počtu vstupů)

  • Spojité funkce lze aproximovat dvěma vrstvami do libovolné přesnosti, když první vrstva jsou sigmoidy a druhá lineární perceptrony.

  • Libovolná funkce je aproximovatelná třema vrstvami -- dvěma sigmoidovými a jednou lineární.

Konvergence a overfitting

Neuronová síť má velkou volnost v nastavování vah, proto může až příliš přesně aproximovat trénovací data, čímž se ztrácí použitelnost na data nová. Podmínku konvergence je třeba volit "rozumně":

  • Samotné čekání, až změny vah budou dostatečně malé, většinou nestačí.

  • Je vhodné např. penalizovat příliš velké váhy (po každé iteraci je trošku snižovat), čímž podporujeme "lineárnější" rozhodovací funkce.

  • Velmi úspěšné je kromě trénování zároveň testovat síť na další datové množině a pamatovat si váhy, které na ní měly nejmenší chybu. Pokud se chyba na této množině výrazně zvýší oproti nejlepší hodnotě, trénování skončí a vezmeme váhy s nejmenší chybou na ladící množině.

  • Předchozí metodu lze provádět i křížovou validací (rozdělím trénovací data na kk množin a použiji v každém kroku k1k-1 z nich na trénování a zbylou na testování)

Učení založené na příkladech

Hlavní myšlenka učení založeného na příkladech (instance-based learning) zní: <u>který trénovací příklad je nejbližší</u> <u>aktuální</u><u> testovací instanci?</u> V paměti vždy uchováváme všechny trénovací příklady, kdykoliv lze přidat další a pro každý testovací příklad v nich hledám ty nejpodobnější. Proto je nutné zavést míru závislosti příkladů. Lze např. použít euklidovskou míru d(x,y)=i=1n(ai(x)ai(y))2d(x,y) = \sqrt{\sum_{i=1}^n (a_i(x) - a_i(y))^2}, ale není to nutné. Cílová funkce může být diskrétní (s def. oborem V={v1,,vn}V = \{v_1,\dots,v_n\}) nebo spojitá.

K-nearest neighbor

K-nearest neighbor nebo k-nn je algoritmus typu instance-based learning. Počítám s uloženými trénovacími daty EE v paměti. Postup pro nějakou testovací instanci xqx_q:

  • Je-li xqEx_q \in E, potom mám přímo hodnocení.

  • Jinak najdu kk nejbližších x1,,xkEx_1,\dots,x_k\in E a:

    • Pro diskrétní cílovou funkci f^(xq)=argmaxvVi=1kδ(v,f(xi))\hat{f}(x_q) = \mathrm{argmax}_{v\in V} \sum_{i=1}^{k} \delta (v, f(x_i)), kde δ=1\delta = 1 pro stejné hodnoty argumentů, a 0 pro různé (tj. přiřadím xqx_q takovou hodnotu, kterou má nejvíce z oněch kk sousedů).

    • Pro spojitou cílovou funkci f^(xq)=i=1kf(xi)k\hat{f}(x_q) = \frac{\sum_{i=1}^k f(x_i)}{k}, tj. udělám průměr hodnocení.

K-nn nikdy nepočítá explicitní obecnou hypotézu, pracuje jen v kontextu. Pro k=1k = 1 de facto odpovídá Voronoi diagramu. Vylepšením může být vážení podle vzdáleností (distance-weighted k-nn), kde:

  • V diskrétním případě f^(xq)=argmaxvVi=1kwiδ(v,f(xi))\hat{f}(x_q) = \mathrm{argmax}_{v\in V} \sum_{i=1}^{k} w_i\cdot\delta (v, f(x_i)), kde navíc wi=1d(xq,xi)2w_i = \frac{1}{d(x_q,x_i)^2}.

  • Ve spojitém případě f^(xq)=i=1kwif(xi)i=1kwi\hat{f}(x_q) = \frac{\sum_{i=1}^{k} w_i f(x_i)}{\sum_{i=1}^{k} w_i}.

Díky vážení můžeme takhle jít dokonce přes celá trénovací data (globální (Shepardova) metoda).

Algoritmus je robustní vzhledem k šumu v trénovacích datech. Problémem je pomalý výpočet vzdáleností ke všem trénovacím datům, pro zrychlení se vytváří indexy, pomocí k-d stromů. Problém je taky, když mám hodně atributů a relevantních jen pár. Pak je metrika vzdáleností zavádějící -- i když se shodují důležité atributy, mohou být od sebe instance v ostatních atributech "daleko". Řešením je váha atributů.

Lokálně vážená lineární regrese

Lokálně vážená lineární regrese (locally weighted linear regression) je konstrukce lokální aproximace cílové funkce na okolí kolem testovacího příkladu. Používá se často ve statistice. Používají se ale i jiné než lineární funkce. Definujeme:

  • Regrese je aproximace reálné funkce.

  • Reziduum je odchylka aproximace od reálné funkce, tj. f^(x)f(x)\hat{f}(x) - f(x).

  • Jádro (kernel function) je funkce KK vzdálenosti dd za účelem získání váhy trénovacích příkladů wi=K(d(xi,xq))w_i = K(d(x_i, x_q)). Často je to gaussovská funkce se střední hodnotou μ\mu a rozptylem σ2\sigma^2.

Aproximace hodnotící funkce se provádí ve tvaru: f^(x)=w0+w1a1(x)++wnan(x)\hat{f}(x) = w_0 + w_1 a_1(x)+\dots + w_n a_n(x) (kde ai(x)a_i(x) je hodnota ii-tého atributu příkladu). Úkolem je pak najít taková wiw_i, která minimalizují chybovou funkci. K tomu slouží metoda gradient descent. Chybová funkce se volí tak, aby byla jen lokální, máme tu tři možnosti (z nichž ta poslední je nejvýhodnější). Nechť NNk(xq)NN_k(x_q) je množina kk nejbližších sousedů xqx_q:

  1. E1(xq)=12xNNk(xq)(f^(x)f(x))2E_1(x_q) = \frac{1}{2}\sum_{x\in NN_k(x_q)} (\hat{f}(x)-f(x))^2

  2. E2(xq)=12xD(f^(x)f(x))2K(d(xq,x))E_2(x_q) = \frac{1}{2}\sum_{x\in D}(\hat{f}(x)-f(x))^2\cdot K(d(x_q,x)) -- nejpřesnější, ale výpočetní složitost závisí na velikosti trénovacích dat D|D|.

  3. E3(xq)=12xNNk(xq)(f^(x)f(x))2K(d(xq,x))E_3(x_q) = \frac{1}{2}\sum_{x\in NN_k(x_q)} (\hat{f}(x)-f(x))^2\cdot K(d(x_q,x)) -- toto je vhodná aproximace druhého přístupu, výpočetní složitost závisí jen na kk.

Vyhodnocování hypotéz

Hypotéza, kterou nám vydá algoritmus učení, nemusí být vhodná. Je proto potřeba umět hypotézy ověřovat a případně porovnávat -- ostatně i některé algoritmy učení (jako rule-post-pruning u rozhodovacích stromů) v sobě porovnávání hypotéz přímo obsahují.

Statistická formalizace pro diskrétní hypotézy

Mějme množinu všech možných datových instancí XX, kterou budeme považovat za náhodnou veličinu s rozdělením D\mathcal{D}. Nad instancemi XX je definovaná cílová funkce ff, kterou aproximujeme hypotézami.

Pro hypotézu hh definujme:

  • Chybu na datech (sample error){{ref|4}} errorS(h)\mathrm{error}_S(h) jako část vzorku dat SS, které hh ohodnotí špatně, tj. errorS(h)=r/n\mathrm{error}_S(h) = r/n pro rr špatně ohodnocených instací z nn celkem.

  • Skutečnou chybu (true error) errorD(h)\mathrm{error}_{\mathcal{D}}(h) jako pravděpodobnost pp, že hh ohodnotí špatně náhodně vybranou instanci z D\mathcal{D}.

Chceme znát skutečnou chybu, ale můžeme ji jen odhadnout za pomoci chyby na datech. Skutečná chyba je vlastně náhodná veličina z wen:Bernoulli_distribution s parameterem pp. Na základě náhodného výběru (<u>nezávislých stejně</u> rozdělených náhodných veličin) o velikosti nn pak tento parametr odhadujeme. Náš odhad, funkce náhodného výběru, je další náhodná veličina. U takového odhadu je třeba dbát na:

  • Vychýlení (bias) -- je třeba, aby střední hodnota našeho odhadu se rovnala střední hodnotě původní náhodné veličiny (tj. abychom měli nulový bias).

  • Rozptyl -- čím menší rozptyl, tím lepší odhad, protože tak dostáváme menší očekávanou odchylku od skutečné hodnoty parametru.

Podmínka nezávislosti je důležitá, jinak nelze provést nevychýlený odhad (tj. netestovat na trénovacích datech, protože nejsou nezávislá!).

Vezmeme-li nn nezávislých pokusů, které s pravděpodobností pp dopadnou špatně, potom počet rr pokusů, které selhaly, je wen:Binomial_distribution náhodná veličina. Odhad pp jako r/nr/n je nevychýlený, protože střední hodnota binomicky rozdělené veličiny je E(r)=npE(r) = np, tj. E(r/n)=pE(r/n) = p. Víme, že Var(r)=np(1p)\mathrm{Var}(r) = np(1-p). Rozptyl odhadu errorS(h)=r/n\mathrm{error}_S(h) = r/n potom je: :Var(errors(h))=Var(r)n2=p(1p)nerrorS(h)(1errorS(h))n\mathrm{Var}(\mathrm{error}_s(h)) = \frac{\mathrm{Var}(r)}{n^2} = \frac{p(1-p)}{n} \approx \frac{\mathrm{error}_S(h)(1-\mathrm{error}_S(h))}{n}

(Oboustranný) interval spolehlivosti (pro danou pravděpodobnost) určuje interval, ve kterém se podle našeho odhadu bude s danou pravděpodobností NN nacházet skutečná hodnota neznámého parametru -- je to interval, ve kterém se na obě strany od našeho odhadu nachází dané procento pravděpodobnostní masy z rozdělení, které má náš odhad. Protože to je pro binomické rozdělení příliš namáhavé určit, pomůžeme si za přepokladu, že náš vzorek je dostatečně velký (n>30n>30), podle wen:Central_limit_theorem aproximací wen:Gaussian%20distribution a platí:

:P(errorD(h)(errorS(h)±zNerrorS(h)(1errorS(h))n))=NP(\mathrm{error}_{\mathcal{D}}(h) \in \left(\mathrm{error}_S(h) \pm z_N \sqrt{\frac{\mathrm{error}_S(h)(1-\mathrm{error}_S(h))}{n}}\right) ) = N, kde zNz_N jsou kvantily normálního rozdělení. Typicky se používá N=0.95N = 0.95. Je možné používat i jednostranné intervaly spolehlivosti, např. pro ověření, jaká je pravděpodobnost, že chyba bude větší než určitá konstanta.

Rozdíl chyby dvou hypotéz

Pro porovnání dvou různých hypotéz (např. při prořezávání rozhodovacích stromů) se vlastně odhaduje rozdíl jejich chyb derrorD(h1)=errorD(h2)d \equiv \mathrm{error}_{\mathcal{D}}(h_1) = \mathrm{error}_{\mathcal{D}}(h_2). To můžeme provést pomocí dvou nezávislých náhodných výběrů S1,S2S_1,S_2 a d^errorS1(h1)=errorS2(h2)\hat{d} \equiv \mathrm{error}_{S_1}(h_1) = \mathrm{error}_{S_2}(h_2). d^\hat{d} je nevychýlený odhad dd.

Pokud uvažujeme dost velké náhodné výběry S1,S2S_1,S_2, můžeme považovat odhady errorS1(h1)\mathrm{error}_{S_1}(h_1) a errorS2(h2)\mathrm{error}_{S_2}(h_2) za přibližně normálně rozdělené náhodné veličiny. Jejich rozdíl pak bude taky normálně rozdělený a roztpyl bude odpovídat součtu rozptylů, což nám dává i intervaly spolehlivosti. V typickém případě S1=S2S_1 = S_2 a pak rozptyl typicky bude menší než tento odhad, ale pořád je možné s ním takto počítat.

Můžeme takto i spočítat, jaká je pravděpodobnost, že jedna z hypotéz dává větší chybu -- je to P(d>0)=P(d^<E(d^)+d^)P(d > 0) = P(\hat{d} <E(\hat{d}) + \hat{d}), což nám dává jednostranný interval a stačí určit jeho masu pravděpodobnosti.

Porovnávání algoritmů

Chceme-li porovnat nejen hypotézy, ale který ze dvou algoritmů učení LA,LBL_A,L_B dosáhne v průměru lepší aproximace nějaké cílové funkce ff, musíme odhadnout průměrný rozdíl výkonu dd přes všechny nn-prvkové trénovací množiny z distribuce D\mathcal{D}. V praxi ale máme jen trénovací data SS a testovací data TT, takže náš odhad bude:

:d^=errorT(LA(S))errorT(LB(S))\hat{d} = \mathrm{error}_{T}(L_A(S)) - \mathrm{error}_T(L_B(S))

Pro zlepšení tohoto odhadu se často používá křížová validace -- rozdělení dat DD do kk disjunktivních množin a provedení kk testů, kdy se pokaždé použije jiná z množin jako testovací data všechny zbylé jako trénovací data. Odhad chyby dˉ\bar{d} je průměr chyb d^i\hat{d}_i přes všech kk množin. Rozptyl tohoto odhadu se stanoví jako wen:Sample%20variance: :sdˉ2=1k(k1)i=1k(d^idˉ)2s^2_{\bar{d}} = \frac{1}{k(k-1)}\sum_{i=1}^k (\hat{d}_i - \bar{d})^2

Interval spolehlivosti tohoto odhadu se pak stanoví jako P(d(dˉ±tN,k1sdˉ))=NP(d \in \left(\bar{d}\pm t_{N,k-1} s_{\bar{d}}\right)) = N, kde tN,k1t_{N,k-1} jsou kvantily tt-rozdělení o k1k-1 stupních volnosti.

Kromě křížové validace je také možné vybírat testovací podmnožinu z dat, která máme k dispozici, úplně náhodně a opakovat testy libovolněkrát, ale testovací množiny už nebudou nezávislé, protože se dřív nebo později stane, že některé prvky vyberu víckrát.

Výpočetní aspekty strojového učení

{{TODO}}


{{note|1|Nebo spíš nepíšeme. Mitchell píše "zakroucené" menšítko, které tu bohužel nelze zobrazit.}}

{{note|2|Správně se asi perceptron (bez přívlastku) říká prahové variantě.}}

{{note|3|Ano, ten vzorec je vlastně stejný jako u předchozího algoritmu. Rozdíl je jen v tom, že tam bylo (to)(t-o) diskrétní a tady je spojité.}}

{{note|4|V předmětu Úvod do strojového učení se pro tohle používá název tréninková chyba, což je dost zavádějící -- SS nemusí být jen trénovací data.}}

{{Statnice I3}}