--- tags: HoGent, AI --- # Artificiële Intelligentie [![](https://i.imgur.com/8q8amV5.png)](https://i.imgur.com/8q8amV5.png) ## Rationale Agenten ### Definities van Artificiële Intelligentie / ### Rationale Agenten `Agent`: entiteit die omgeving kan waarnemen adhv sensoren en invloed kan uitoefenen door actoren. - krijgt per tijdseenheid een waarnameing met als gevolg een `waarnemingssequentie` - `waarn.seq.` --- `agentfuntie` --- > acties - heeft `performantiemaat`: - NIET beloond voor acties maar voor gevolgen van de acties - "score" `Rationale agent`: maximaliseert de `performantiemaat`, rekening houdend met `waarn.seq.` en de evt. ingebouwde kennis van de agent. :warning: rationaliteit $\neq$ helderziendheid. ### Eigenschappen van Omgevingen ![](https://i.imgur.com/mBPGIU9.png) - De meest eenvoudige omgevingen: steeds de bovenste eig, - De meest realistische omgevingen vaak de onderste eig. ### Structuur van Agenten 4 types agenten gesorteerd op complexiteit: 1. `Eenvoudig reflex` - GEEN geheugen: alles episodisch bepaald. - kan dus niet rationaal zijn in een partieel observeerbare wereld - IF-THEN - Problemen bij sequentiele en partieel observeerbare omgevingen 1. `Modelgebaseerd reflex` - maakt eerst een **inschatting** van de situatie. - beschikt over een model van hoe de omgeving verandert of zal veranderen door acties - daarna als-dan - heeft geen voordeel over de eenvoudige reflex agent in compleet observeerbare omgeving! 3. `Doelgebaseerd` - Naast een model is ook een beschrijving van het doel belangrijk. 5. `Utiliteitsgebaseerd` - zoals doelgebaseerd maar gebruikt `utiliteitsfunctie` om aan te geven hoe geschikt een toestand is - $\approx$ de performantiemaat --- ## Zoekalgoritmes > samengevat > ![](https://i.imgur.com/o9CWjne.png) ### Inleiding Een `zoekprobleem` heeft volgende elementen: - `toestandsruimte` $S$ - de `initiële toestand` $s_0$ - verzameling acties $A$ - `transitiemodel` $T : (S,A) \rightarrow S : (s,a) \mapsto s'$ - $s'$ is de `opvolger` van $s$. - $T$ vertelt wat het effect is van de actie op de toestand. - er is een `kost` mee geassocieerd: kostfunctie $c(s,a,s')$ - Een `doeltest` die checkt of de `doeltoestand` is bereikt (booleaans) De `toestandsruimtegraaf` (state space graph) kan worden opgesteld met $S$, $T$ en $c$. - De knopen zijn de toestanden $s$ - De knopen zijn GERICHT verbonden $s\rightarrow s'$ (dmv $T$) - De gewichten zijn bepaald door $c$ De oplossing van eeen zoekprobleem: - is de sequentie van acties om de doeltoestand te bereiken De kost van een zoekprobleem: - is de som van de kosten van de acties De `optimale oplossing` ve zoekprobleem: - oplossing met minimale kost ### Algemene Zoekalgoritmen #### Boomgebaseerd Zoeken De `open lijst`: - bevat de leafs van de zoekboom = partiele oplossingen = `plannen` - bevat initieel enkel $s_0$ We expanderen steeds 1 van de plannen door er de mogelijke acties op uit te voeren. Elk plan slaat volgende data op: ``` Plan{ - huidigeToestand : Toestand - laatstGekozenActie : Actie - voorganger : Plan - totaleKost : int } ``` (De totale kost wordt met $g$ genoteerd) - Met deze implementatie moeten we enkel de leafs opslaan en niet heel de boom. - $g$ zou recursief berekend kunnen worden in $O(n)$, maar deze bijhouden is handiger. ![](https://i.imgur.com/vvJuXSZ.png) #### Criteria voor Zoekalgoritmen 1. COMPLEET - vindt altijd een oplossing 3. OPTIMAAL - vindt altijd optimale oplossing 5. TIJDSCOMPLEXITEIT - uitvoeringstijd 7. RUIMTECOMPLEXITEIT - benodigd geheugen maten: - `vertakkingsfactor` $b$ - maximaal aantal opvolgers van een top - diepte van de ondiepste top die ook doeltop is $d$ - = minimale diepte voor een oplossing - maximale lengte van een pad $m$ - = maximale diepte voor een oplossing Aantal toppen in een zoekboom met vertakkingsfactor $b$ en max.depth. $m$ $$ \text{#toppen} = 1+b+b^2 +\ldots + b^m = \sum_{i=0}^mb = \frac{b^{m+1}-1}{b-1} $$ dit is dus van grootteorde $\mathcal{O}(b^m)$ :warning: het grote probleem is dat het algoritme niet onthoudt waar het al is geweest, dit is sub-optimaal en kan leiden tot infinite loops. #### Graafgebaseerd Zoeken Analoog aan boomgebaseerd, maar met `gesloten lijst`. Deze bevat nu geen plannen maar wel effectief de toestanden!! Het algo checkt of een toestant al eerder werd geexpandeerd. Dit fixt de problemen met boomgebaseerd. ![](https://i.imgur.com/FgC7KAm.png) ### Blinde Zoekmethoden #### Breedte Eerst Zoeken - met een FIFO: `queue` - bouwt alle lagen van de zoekboom op - kan stoppen bij meest ondiepe oplossing! - dit is een **COMPLEET** algoritme - geeft oplossing met min aantal acties - Het is **niet optimaal** - want kleinste aantal acties $\neq$ kleinste kost - wel optimaal als alle kosten gelijk! Tijdscomplexiteit: $\mathcal{O}(b^{d+1})$ Ruimtecomplexiteit: idem #### Diepte Eerst Zoeken - met een LIFO: `stack` - niet ideaal want gaat eerst de langste oplossingen af - kan in infinite loop gaan - **niet compleet** - **niet optimaal** tijdscomplexiteit in worst case: $\mathcal{O}(b^m)$ ruimtecomplexiteit: $\mathcal{O}(b\cdot m)$ <-- dit is lineair! :thumbsup: In graafgebaseerd uitvoeren tegen de infinite loops? Dan verliest men het voordeel van de lage ruimtecomplexiteit... #### Iteratief Verdiepen gebruikt **`DIEPTE GELIMITEERD ZOEKEN`** ![](https://i.imgur.com/3q5OWJ0.png) ![](https://i.imgur.com/ktxWujt.png) - lus rond diepte gelimiteerd zoeken - steeds diepte verhogen tot doeloplossing wordt gevonden - combineert **diepte eerst** met een soort breedte-eerst-lagen - algoritme moet steeds opnieuw beginnen - maar dat maakt niet zoveel uit - zie hieronder: Als oplossing op diepte $d$, en we doen iteratief verdiepen, hoeveel werk hebben we dan teveel gedaan? - we hebben moeten diepte gebaseerd zoeken op dieptes 1 tot d-1 zonder resultaat - hoeveel toppen zijn dit? - $1 + (1+b) + (1+b+b^2) + \ldots + (1+b+b^2+\ldots + b^{d-1})...$ Aantal toppen gegenereerd bij enkele iteratie met diepte $i$ $N(i) = 1+b+b^2+\ldots + b^i$ dus: $$ N(i)= \frac{b^{i+1} -1}{b-1} $$ Totale aantal toppen van elke iteratie zonder oplossing $$ \sum_{i=0}^{d-1} N(i) = \ldots \approx \frac{1}{b-1} N(d)\quad \overset{!}{<} N(d) $$ > ![](https://i.imgur.com/2wjux5E.png) #### Uniforme Kost Zoeken = breedte eerst met prioriteits-queue gebaseerd op kost! = *Cheapest First Search* of *Best First Search* $\approx$ Dijkstra, maar dan met een doeltop! kies altijd pad met kleinste **totale** kost om te expanderen. {%youtube dRMvK76xQJI %} Tijd en ruimtecomplexiteit is $\mathcal{O}(b^{1+\lfloor C^* /\varepsilon\rfloor})$ met elke kost $\geq \varepsilon$ en $C^*$ de kost van de optimale oplossing. ### Geïnformeerde Zoekmethoden > $\leftrightarrow$ blinde zoekmethoden #### Heuristieken Indicator van de totale kost naar het doel. $h(s) \in \mathbb{R}^+$ met $s$ een toestand. - Een `toelaatbare` heuristiek overschat NOOIT; dus $$h(s) \leq C^*(s)$$ met $C^*(s)$ optimale kost van $s$ naar doeltoestand. Het is duidelijk dat de heuristiek van de doeltoestand dus nul is. $h(g) = 0$ - Een `consistente` heuristiek heeft deze eig ($h(g) = 0$) EN er geldt dat de heuristiek voor een rechtstreeks pad altijd kleiner is dan voor een "omweg", nl. $$h(s) \leq c(s,a,s') + h(s') $$ Waarbij de "omweg" node $s'$ is en de kost van de omweg $c(s,a,s')$ Hier is duidelijk te zien `consistent` $\Rightarrow$ `toelaatbaar`. Maar niet omgekeerd. Bewijs ook te zien op p.42 vd cursus. :bookmark: #### Gulzig Beste Eerst - Evaluatiefunctie: $f(n)= h(n)$ - Expandeert steeds de node met de *laagste heuristiek*. - Gebruikt geen effectieve kosten. - Is **niet optimaal** en **niet compleet** - $TC$ = $SC$ = in slechtste geval $\mathcal{O}(b^m)$ dus exponentieel :thumbsdown: Geen goed algoritme imo. #### A ∗ Zoekalgoritme - Evaluatiefunctie: $f(n)= h(n) + g(n)$ - Expandeert steeds de node met de *laagste \[heuristiek + voorlopige totale kost*\]. - is **compleet** en **optimaal** bij volgende voorwaarden: 1. boomgebaseerd - minstens toelaatbare heuristiek (zie bewijs p50) :bookmark: - kosten > 0 2. graafgebaseerd - minstens consistente heuristiek :warning: - kosten > 0 - $TC$ = $SC$ = in slechtste geval nog steeds exponentieel, en gebruikt meer geheugen dan greedy BFS. :thumbsdown: ### Ontwerpen van Heuristieken #### Gebruik van Vereenvoudigde Problemen = restricties weghalen, vogelvlucht of manhattan distance gebruiken, ...... #### Patroon Databanken dit kan een ondergrens bieden voor de heuristiek. Meerder patronen combineren en het maximum nemen geeft nog betere ondergrens. --- ## Zoeken met een Tegenstander ### Inleiding we beschouwen omgeving: - competitief multipersoons - compleet observeerbaar - discreet - deterministisch ##### 2p-zero-sum-game Veel zelfde elementen als een zoekprobleem: - toestandsverzameling $S$ - actieverzameling $A$ - transitiemodel $T(s,a)$ met opvolger $s'$ - initiële toestand $s_0$ En ook nog deze: - `EINDTEST`: booleanse test: spel gedaan of niet gedaan - de toestanden waarvoor deze true is zijn `eindtoestanden` - `opbrengstfunctie`$U$. Hierbij geldt dat de som van $U(s)$ voor alle spelers in de eindtoestand $s$ een constante is! (dus eigenlijk constant-sum-game): $U_{Min}(s) + U_{Max}(s) = C$ ### Spelbomen en het Minimax Algoritme "Max" vs "Min". We noemen de opbrengstfunctie voor Max ($U_{Max}$) gewoon $U$ Max wil $U$ voor zichzelf maximaliseren, Min wil deze minimaliseren. De `minimax waarde` is recursief: $$ \text{minimax}(s) = \begin{cases} U(s) & \text{als } s \text{ een eindtoestand}\\ \max_{a\in A} \text{minimax}(s')&\text{als Max aan zet in toestand } s\\ \min_{a\in A} \text{minimax}(s')&\text{als Min aan zet in toestand } s \end{cases} $$ Dit steeds met $s'= T(s,a)$, de opvolger van $s$ via transitiemodel $T$. **Diepte-eerst** algoritme. - $SC = \mathcal{O}(b\cdot m) \rightarrow$ lineair:thumbsup: - diepte eerst, maar dan waarde opgeslagen per diepe vertakking - $TC = \mathcal{O}(b^ m) \rightarrow$ exponentieel :thumbsdown: - want genereert wel alle toppen ![](https://i.imgur.com/wZ02KY7.png) ### Snoeien van Spelbomen {%youtube zp3VMe0Jpf8 %} Snoeien: het niet evalueren van een tak ondat deze de eindoplossing niet beïnvloedt. => de kinderen van die tak snoeien. [andere video](https://www.youtube.com/watch?v=hM2EAvMkhtk) Interesting: - waarom snoeien? Kost dit niet meer tijd dan gewoon minima en maxima berekenen? - antwoord 1: een cijfer berekenen voor een eindtoestand betekent vaak veel berekenwerk ( bvb schaken: alle posities, alle mogelijke manieren van schaak, ...) - er kunnen immens veel eindtoestanden zijn ![](https://i.imgur.com/w3UT4zN.png) ##### Ordening Kan groot effect hebben op efficiëntie van snoeien! Maat voor hoe goed de ordening is: de `effectieve vertakkingsfactor` = $b_e$ - een boom met hetzelfde aantal toppen $N$ en zelfde diepte $m$ kan worden gemaakt, maar dan met constante vertakkingsfactor. dus $N = ( b_e^{m+1} -1 ) / ( b_e -1)$ Een benadering wordt gegeven door: $$ be\approx N^{1/m} = \sqrt[m]{N} $$ ### Praktische Uitwerking Voor schaken, dammen, Go.... veeeel te veel toestanden. - opslaan met minimax waarde in `transpositietabel` is onrealistisch We hebben een `heuristische evaluatiefunctie` nodig! - dieptelimiet voor minimax, wanneer diepte bereikt heuristiek gebruiken - maximale diepte is $d$ $$ \text{h-minimax}(s, d) = \begin{cases} \text{EVAL}(s) & \text{als } s \text{ een eindtoestand of }d=0\\ \max_{a\in A} \text{h-minimax}(s',d -1)&\text{als Max aan zet in toestand } s\\ \min_{a\in A} \text{h-minimax}(s',d-1)&\text{als Min aan zet in toestand } s \end{cases} $$ Dit steeds met $s'= T(s,a)$, de opvolger van $s$ via transitiemodel $T$. De kwaliteit van de heuristische "EVAL" functie is belangrijk. 1. moet de eindtoestanden op zelfde manier ordenen als opbrengstftie $U$ 2. moet snel kunen berekend worden 3. waarde moet sterk gecorreleerd zijn met effectieve winstkansen De eval functie is een lineaire combinatie van spelfeatures. ## Lokaal Zoeken en Genetische Algoritmen ![](https://i.imgur.com/hjTK2KN.png) ### Lokale Zoekmethoden Lokaal zoeken - houdt zich niet bezig met bijhouden van actiesequentie - gebruikt beperkt geheugen - goede oplossingen in grote S-ruimten - wil gewoon de oplossing - meestal `optimalisatieproblemen` - doelfunctie max of minimaliseren (analoog aan LP) #### Hill Climbing - neem steeds de beste opvolger als deze beter is dan jezelf - gulzig algoritme - bekijkt in-the-moment wat het beste is - kan vastlopen - in lokaal maximum zonder globaal maximum te bereiken! - in plateau - we kunnen zijwaartste stappen toelaten met een aantal-beperking - is **niet compleet** - kan worden verbeterd door random herstarten - theoretisch wordt het dan compleet - in praktijk duurt dit te lang ![](https://i.imgur.com/yvXL7Q3.png) #### Simulated Annealing Hill climbing: wandelt enkel naar boven en raakt vast in lokaal max Random walk: zou te lang duren Combinatie: - als oplossing beter is, aanvaard hem (zoals hill climb, `exploit`) - als oplossing niet beter is, aanvaard hem misschien (zoals random walk, `explore`) - gebaseerd op temperatuur ($T\propto 1/t$ met $t$ de verstreken tijd) - gebaseerd op de kwaliteit van de opvolger ($\Delta E$, groot als goeie move, klein als slechte move ) Het al dan niet aanvaarde van een slechtere oplossing, hangt in het algo af van de waarschijnlijkheid: $$p_{\text{aanvaarding}} = e^{\frac{\Delta E}{T}} $$ vereenvoudigd algo (niet volledig, zi p 87 :bookmark:) ```python for dalende T: #of voor stijgende tijd en dan T berekenen if T == 0 return current #stop als temp nul is next = current.getRandomSuccessor() delta_E = h(next) - h(current) #hoe goed is de move? if delta_E > 0: #beter dan wat we hadden current = next #aanvaard else if exp(delta_E / T) > rand(0,1) : #slechter, maar waarsch. beter dan random current = next #aanvaard ``` #### Gradient Descent Toestandsruimte continu, afleidbaar en n-dimensionaal. $$ \vec{x}' = \vec{x} - \alpha \nabla f(\vec x) $$ En dus, als het om 2 variabelen $x_1$ en $x_2$ gaat: $$ (x_1',\, x_2') = \left( \, x_1 - \alpha\frac{\partial f}{\partial x_1}\quad,\quad x_2 - \alpha\frac{\partial f}{\partial x_2}\, \right) $$ Met $\alpha$ de stapgrootte. Bij elke stap zal $x$ dus dichter bij een lokaal minimum geraken, door de sterkste daling te volgen. De stapgrootte is belangrijk: - niet te klein want dan te traag - niet te groot want dan kans op inf. loop ### Genetische Algoritmen ![](https://i.imgur.com/ZFr4G8I.png) - klassieke algo's houden hele open lijst bij - lokale houden enkel huidige toestand bij We zoeken een compromis => vast aantal toestanden bijhouden. Genetische algoritmen: - maximaliseert doelfunctie $h$ - $\leftrightarrow$ lokale: geen notie van opvolgers vereist. - werken iteratief - ![](https://i.imgur.com/R18mrnS.png) - wordt uitgevoerd tot voldoende tijd verstreken of voldoende goeie oplossing #### Populatie en Encodering Zoals eerder gezegd: houdt `populatie` bij van vast aantal individuen. Elk individu `encodeert` een toestand: bij elke toestand een string assosiëren! #### Fitnessfunctie en Selectiemechanisme fitness functie $f$ bepaalt hoe goed een volgende generatie is (hoger is beter). `selectiemechanisme`: de kans op selectie stijgt als fitness hoger is (logisch) implementatievoorbeelden: 1. `roulette wiel selectie` - stuk van "wiel" evenredig aan de fitness - kans is dan $f_i / \sum f$ = `fitness ratio` - probleem: superfit individu heeft té veel kans - algo convergeert te snel - blijft snel steken in "lokale maxima" 2. `ranggebaseerde selectie` - individuen sorteren STIJGENDE fitness en rangnummer geven - de eerste is de slechtste, de laatste de beste - de kans op selectie is dan rangnummer / som van rangnummers - $p= i / \sum j = \frac{2i}{n(n+1)}$ - enkel relatieve fitness doet ertoe, dus uitschieters domineren minder :thumbsup: #### Recombinatie en Mutatie recombinatie: - genetisch materiaal van 2 individuen gebruiken voor 2 nieuwe afstammelingen - #individuen blijft constant! 1. `éénpunts crossover` - op een bepaalde plaats van de string een merge maken - (bv bij 4letter string: eerste 2 van parent 1 en laatste 2 van parent 2) - niet nuttig bij bvb trav.salesm.pr. wantdoor random crossoverpunt niet zeker dat alle steden erin staan 2. `geordende crossover` - 2 random punten kiezen - daartussen ongewijzigd - daarbuiten: - maak lijst van opties die nog niet aan bod komen - in volgerde van ANDERE parent na 2e punt - begin in te vullen na 2e punt - vul verder aan na eerste punt - bvb ||1|2| |--|--|--| | **parents** | `CAGDBEF` | `FBEADCG`| | **crossoverpunten** | `CA\|GD\|BEF` | `FB\|EA\|DCG` | | **kinderen** stap 1 | `xx\|GD\|xxx` | `xx\|EA\|xxx` | |**nog niet gebruikt**|~~`D`~~,**`C`**,~~G~~,**`F`**,**`B`**,**`E`**,**`A`**| **`B`**,~~`E`~~,**`F`**,**`C`**,~~`A`~~,**`G`**,**`D`**| | **kinderen** stap 2 | `xx\|GD\|CFB` | `xx\|EA\|BFC` | | **kinderen** finaal | `EA\|GD\|CFB` | `GD\|EA\|BFC` | --- Daarna kan nog `mutatie` optreden. - dit moet met lage probabiliteit gebeuren - Zorg wel dat de "regels" gerespecteerd blijven (bvb bij tsp: wissel 2 steden om ipv random steden te veranderen.) #### Een Eenvoudige Implementatie vb #### Besluit en Toepassingen Genetische algoritmen: - niet gegarandeerd optimaal - kan wel goeie oplossing bekomen - voorwaarde: goede encodering --- ## Machinaal Leren ### Inleiding / ### Drie Types van Machinaal Lere #### Gesuperviseerd Leren = op basis van een **gelabelde `trainingsdataset`** een `hypothese` functie $h$ opbouwen zodat voor nieuwe invoer het label voorspeld kan worden - label = getal : `regressie` - label = klasse : `classificatie` (kan binair) ![](https://i.imgur.com/AKQ6TdT.png) #### Ongesuperviseerd Leren = structuur ontdekken in **ongelabelde dataset** - clustering - groeperen (maar niet interpreteren) van data - anomaliedetectie - abnormaliteiten vinden - primaire componenten analyse - data "uitdunnen" en reduceren tot belangrijkste components #### Reinforcement Learning $\approx$ Pavlov: belonen voor goeie acties, zo leert algo welk `beleid` leidt tot de grootste beloning (en dus het best is) ### Evaluatie van Hypothesen voor Gesuperviseerd Leren #### Foutmaten ##### regressie - `RMSD` (root mean square deviation $\approx$ gemiddelde kwadratische afwijking) $$RMSD^2 = \frac{1}{m} \sum_{i=1}^m \left( h(x^{(i)}) - y^{(i)}\right)$$ simpeler genoteerd: $\frac{1}{m} \sum_m (h(x)-y)$ ##### classificatie - `foutratio` (=percentage fout gelabelden) $$FR = \frac{1}{m}\cdot \#\{ x^{(i)} \mid h(x^{(i)}) \neq y^{(i)} \}$$ ###### Binaire classificatie: - `precisie` (= correct positief gelabeld / totaal aantal gelabeld positief ) $$P= \frac{\#\text{correct}}{\#\text{correct} + \#\text{vals positief}}$$ - `rappel` = `recall` (= correct positief gelabeld / wat effectief positief is) $$R= \frac{\#\text{correct}}{\#\text{correct} + \#\text{vals negatief}}$$ Beste classificatie heeft $P = R = 1$ Goede verhouding tussen deze maten: **`F-score`** $$F = 2\frac{P\cdot R}{P+R} \qquad(\leq 1) $$ Voor $P$ $R$ en $F$ geldt: hoe groter hoe beter! #### Trainings-, Validatie- en Testdata `Testdata` moet volledig los zijn van trainingsdata! - een hypothese die goed scoort op training maar niet op test = OVERFITTING - een hypothese is niet algemeen genoeg = ONDERFITTING `Occams Razor` is van toepassing: when in doubt, choose the easiest model (mag ook wel niet te eenvoudig zijn voor het probleem...) `Validatie dataset`: aangezien testdata echt los moet blijven van het trainen: - set data die gebruikt wordt om meta-parameters te tunen - foutmaat daalt steeds, tot deze weer stijgt (dan begint overfitting) - het moment van minimale foutmaat bepaalt de meta-parameters! - dit is enkel indicatief voor de parameters - dus dit is NIET de finale foutmaat! Hiervoor hebben we de testdataset!!! --- ## Gesuperviseerd Leren ### Lineaire Regressie #### Probleemstelling Hypothese van de vorm $$h_{w,b}(\vec x) \equiv h(\vec x) = \vec w \cdot \vec x + b$$ Dit is dus uitgeschreven $w_1x_1 + w_2x_2+ \ldots + w_nx_n + b$ of dus $\sum_i(w_ix_i )+b$ De kostfunctie die moet geminimaliseerd worden definieren we adhv de RMS: $$J(w,b) = \frac{1}{2m}\sum_m(h(\vec x) - \vec y)^2 $$ Met $m$ het aantal elementen in de testdataset en de factor 1/2 random maar met een of andere reden. #### Oplossingsmethode De kostfunctie $J$ zal steeds maar 1 lokaal = globaal minimum hebben! We kunnen er dus gradient descent op toepassen! ##### Algoritme voor lineaire regressie 1. kies startwaarden voor $b$ en voor alle $w_i$ 2. Kies goede stapgrootte $\alpha$ 3. $$w_j' = w_j - \alpha\frac{\partial J}{\partial w_j} \qquad \text{en}\qquad b'= b - \alpha\frac{\partial J}{\partial b}$$ met $$\frac{\partial J}{\partial w_j} = \frac{1}{m} \sum_m (h(x) - y) \cdot x_j \qquad \text{en}\qquad \frac{\partial J}{\partial b} = \frac{\alpha}{m} \sum_m (h(x) - y) $$ de onderdelen van $\nabla J(w,b)$ 4. herhaal stap 3 tot $|\Delta w| \leq \varepsilon$ en $|\Delta b| \leq \varepsilon$ (ze veranderen nog nauwelijks) - dus $\alpha\frac{\partial J}{\partial b}$ en $\alpha\frac{\partial J}{\partial w_j}$ zeer klein *--> dit is dus gradient descent op $J$* ##### Efficiënte bepaling van de gradiënt zie cursus p125-127 :bookmark: #### Polynomiale Attributen - om evt polynomisch verband te onderzoeken - cheat the system door gewoon een extra parameter toe te voegen - bvb $x_2 := x_1^2$ - pas daarna lin reg toe en kijk of de kostfunctie lager ligt - profit(?) #### Regularisatie ter Preventie van Overfitting extra term toevoegen om te grote waarden te bestraffen. $$J(w,b) = \frac{1}{2m}\sum_m(h(\vec x) - \vec y)^2 + \color{orange}{\lambda \sum_n w_j^2} $$ met $\lambda$ een meta parameter. Bepaald met de validatiedataset. ### Logistische Regressie => Voor CLASSIFICATIEPROBLEMEN ##### Binaire classificatie Lineaire regressie met grens 1/2 is geen goed idee - te gevoelig voor uitschieters - lin reg kan waarden opleveren anders dan 0 en 1 De `stapfunctie`: $$ H(z) = \begin{cases} 0&z<0\\1 &z\geq 0\end{cases} $$ Deze functie is echter **niet continu** - dus niet gepast voor gradient descent etc. De `sigmoïde` of `logistische functie`: $$g(z) = \frac{1}{1+e^{-z}} $$ met voor de afgeleide geldt, met $g\equiv g(z)$ $$g' = g \cdot (1-g) $$ Als de hypothese de sigmoïde volgt, dan geeft de hypothese steeds de kans terug dat een label correct is. #### De Scheidingslijn kan rechte, ellips, hyperbool, parabool..... zijn. Door het toevoegen van attributen! #### De Kostfunctie De kost moet 0 zijn als juist, en maximaal voor fout. - nadeel hiervan is dat de kost niet continu is - niet goed voor gradient descent We nemen voor de kost een continue functie met als voorwaarden als het label 1 moet zijn: - $J(0) = 0$ - $J(>1/2)$ stijgt zeer snel, want hier echt wel fout geclassificeerd - $J(1) = + \infty$ analoog voor als het label 0 moet zijn. De $\ln(x)$ functie heeft deze karakteristiek. Dus gecombineerd voor $\color{red}{y=0}$ en $\color{green}{y=1}$: $$ J(w,b) = - \frac{1}{m} \sum_m \ y\cdot \color{green}{ \ln(h(x))} \ + \ (1-y)\cdot \color{red}{\ln(1-h(x))} $$ Binaire classificatie gebeurt dus als volgt: 1. minimaliseer $J$ met gradient descent en trainingsdata - bekom zo alle parameters $w_i \in \vec w$ en ook de parameter $b$ 3. voor testdata, bereken de hypothese $h_{w,b}(\vec x)$. - $h \geq \frac{1}{2}$, label dan als 1 - $h < \frac{1}{2}$, label dan als 0 #### Niet-binaire Classificatie ##### 1-vs-allen Zij $k \in \{1,2,\ldots,K\}$ een klasse; het aantal klassen is dus $K$ - stel $K$ hypothesen op: $h^{(1)} ... h^{(k)}$ - per hypothese geldt: - klasse $k$ is positief voor hypothese $h^{(k)}$ - de rest van de klassen is negatief - Kies dan de hypothese $h^{(k)}(x)$ die het meest kans geeft dat een $x$ tot een $k$ , die $k$ wordt het label $y$. $$y = \arg \max_{k\in \scriptsize{\{1,2,\ldots,K\}}} h^{(k)} (x) $$ waarbij de $\arg$ functie ervoor zorgt dat het een $k$ is die wordt toegewezen aan $y$ bij maximale $h^{(k)}(x)$ ##### 1v1 Zij $k \in \{1,2,\ldots,K\}$ een klasse; het aantal klassen is dus $K$ - stel hypothesen $h^{(k,l)}$ op - met $l\in \left]\, k,K\,\right]$ - er zijn dus $\frac{1}{2} K(K-1)$ hypothesen - per hypothese geldt: - klasse $k$ is positief voor hypothese $h^{(k,l)}$ - klasse $l$ is negatief voor hypothese $h^{(k,l)}$ - overloop alle hypothesen, en tel het aantal "stemmen" - als $h^{(k,l)} \geq 1/2$ dan is dit stem voor positief dus $k$ - als $h^{(k,l)} \lt 1/2$ is er stem voor negatief dus $l$ ### Artificiële Neurale Netwerken #### Inleiding ![](https://i.imgur.com/NDbIlRh.png) - voorwaarts gericht = acyclisch! - uitvoer is functie van de invoer - recurrent bevat wel cykels - feedback loops - bereikt een van volgende toestanden - stationair - oscillatie - chaos - uitvoer is functie van invoer **en** vorige invoeren - $\sim$ "kortetermijngeheugen" - moeilijker te trainen dus buiten scope van de cursus. #### Gelaagde Voorwaarts Gerichte Neurale Netwerken ```mermaid flowchart LR subgraph sub [verborgen lagen] B(...) --> C(...) end A(Invoerlaag)--> B C -->D(uitvoerlaag) ``` Meestal evenveel neuronen in de uitvoerlaag als er klassen zijn. $$z_i = w_ix + b_i \quad \text{en} \quad a_1 = g(z_1) $$ met $g$ de implementatie van een `activatiefunctie` (meestal de sigmoide $\frac{1}{1+e^{-z}}$) Door eigenschappen van het matrixproduct (:bookmark: 150-151) kunnen we veralgemenen: $$\vec z = \boldsymbol{W}\cdot \vec x + \vec b \quad \text{en} \quad \vec a = g(\vec z) $$ **`voorwaartse propagatie`** is het laag per laag berekenen van de uiteindelijke uitvoerlaag $L$ $$z^{[l]} = \boldsymbol{W^{[l]}}\cdot \vec a^{[l-1]} + \vec b^{[l]} \quad \text{en} \quad \vec a^{[l]} = g(\vec z^{[l]}) $$ voor $l \in \{1,2 \ldots, L\}$ en $\vec a^{[0]} \equiv \vec x$ #### Vectorisatie De vorige formule kan in een loop over alle voorbeelden worden uitgevoerd, of we maken een matrix $X$ van alle kolommen $\vec x_i$ Uiteindelijk komen we dan bij: $$\boldsymbol{Z}^{[l]} = \boldsymbol{W^{[l]}}\cdot \boldsymbol{A}^{[l-1]} + \vec b^{[l]} \quad \text{en} \quad \boldsymbol{A}^{[l]} = g(\boldsymbol{Z}^{[l]}) $$ voor $l \in \{1,2 \ldots, L\}$ en $\vec A^{[0]} \equiv \boldsymbol{X} = (\vec x^{(1)}, \ldots , \vec x^{(m)})$ :warning: de eerste formule bevat wiskundig een "foute" notatie, aangezien je geen kolomvector kan optellen bij een n-dimensionaal matrixproduct. We gaan er echter van uit dat er `broadcasting` is; i.e. kolomgewijs optellen. #### Trainen van een Neuraal Netwerk Minimaliseren van een kostfunctie. We volgen voorbeeld van logistische regressie. > De labels $y^{(i)}$ zijn gedefinieerd adhv de `one-hot-encoding`: een vector vol nullen die op de $k^{de}$ plaats een 1 heeft als voorbeeld $i$ van de klasse $k$ is. - de **`cross-entropy kostfunctie`** Stel $K$ klassen en $m$ trainingsvoorbeelden. ![](https://i.imgur.com/ZH7YNNQ.png) waarbij $h(^{(i)})_k$ de k-de component is van de $h$ vector voor voorbeeld $x^{(i)}$ We kunnen aanpassingsmatrices en -vectoren opstellen: $$\begin{cases} dz^{[L]} = a^{[L]} - y & L \text{ is de eindlaag}\\ dz^{[l]} = (W^{[l+1]})^T \, dz^{[l+1]} \, \odot \, g'^{[l]} (z^{[l]}) & l \in \{L-1, \ldots, 1\}\\ dW^{[l]} = dz^{[l]}a^{[l-1]} & "\\ db^{[l]} = dz^{[l]}& " \end{cases} $$ met $\odot$ de puntsgewijze vermenigv; en zoals voorheen: $g' = g \cdot (1-g)$ Gradient descent geeft dan: $$\begin{cases} W'^{[l]} = W^{[l]} - \alpha dW^{[l]}\\ b'^{[l]} = b^{[l]} - \alpha db^{[l]} \end{cases} $$ - **`Stochastische gradient descent`** - 1 enkel voorbeeld gebruiken om gewichten te tunen - hoe? 0. initialiseer gewichten op random, kies een $\alpha$, shuffle voorbeelden > for voorbeeld in voorbeelden 1. bereken actievaties $a^{[l]}$ en $z^{[l]}$ met voorwaartse propagatie ($l \in \{1,2,\ldots, L\}$) 2. Bereken aanpassingsmatrices $dW$ en -vectoren $db$ met achterwaartse propagatie ($l \in \{L, L-1, \ldots, 1\}$) 3. Pas de gewichten aan volgens gradient descent: $$ \begin{cases} W'^{[l]} = W^{[l]} - \alpha dW^{[l]}\\ b'^{[l]} = b^{[l]} - \alpha db^{[l]} \end{cases}$$ Stochastische GD voor klein aantal voorbeelden ipv maar 1: `mini-batch gradient descent` (kan door vectorisatie ongeveer even snel) #### Uitbreidingen en Variatie ##### Andere activatiefuncties: - `tangens hyperbolicus` $$ \tanh(x) = \frac{e^z - e^{-z}}{e^z + e^{-z}} $$ - `Rectified linear unit` $$ \text{ReLU}(x) = \max(0,z) $$ - **`Softmax functie`** (vaak gebruikt) $$ \sigma(\vec z)_i = \frac{e^{z_i}}{\sum_{j=1}^L e^{z_j}} $$ ##### Convolutionele lagen = CNN (conv. neur. net.) `convolutie` is operatie die een filter over de invoer plaatst. - geeft nieuw beeld met 1 kanaal - gebruikt bvb bij veel voorkomende patronen --- ## Ongesuperviseerd Leren ### Clustering en het K-Gemiddelden Algoritme **`het K-Gemiddelden Algoritme`** - voor het vinden van clusters - invoer is ongelabelde dataset en aantal clusters te vinden $K$ - cluster voorgesteld adhv `zwaartepunt` - $\mu = \frac{1}{m} \sum_{i=1}^{m} \vec x_i$ aka zoals het "gemiddelde" stappen: 0. random toewijzen van de $K$ zwaartepunten $\mu^{(k)}$ met $k \in \{1, \ldots ,K\}$ > for toestand $i$ in $m$ toestanden 1. toewijzing - bereken $\forall x^{(i)}$ tot welke cluster $k$ het hoort - dus welke afstand tot een zwaartepunt $\mu^{(k)}$ het dichtst is $||x^{(i)}-\mu^{(k)}|| = \sqrt{(\sum_j x^{(i)}_j - \mu^{(k)}_j)^2}$ 2. update zwaartepunt - nieuwe zwaartpunt berekenen door toevoegen van deze blijf de for loop herhalen tot de toegewezen zwaartepunten niet meer veranderen #### Het K-Gemiddelden Algoritme als Optimalisatie - De kostfunctie is $$ J = \frac{1}{m} \sum_{i=1}{m} ||x^{(i)} - \mu^{(c^{(i)})}||^2 $$ als $c^{(i)}$ de index is van de cluster van $x^{(i)}$ - het K-means algo kan vastgeraken in lokaal minimum. Random restart kan helpen. #### Bepalen van het Aantal Clusters Soms is het duidelijk, soms met de elleboogmethode: - kostfunctie opstellen voor oplopende $K$ - knik in J(K) grafiek zoeken -> dit is het beste aantal <!-- MARKMAP # Zoekalgoritmen ## ### Boomgebaseerd ### Graafgebaseerd ## ### Blind #### Diepte-eerst #### Breedte-eerst #### Iteratief verdiepen #### Uniforme kost (= cheapest-first) ### Geïnformeerd #### Gulzig beste-eerst #### A* ## Competitief ### Minimax (evt. snoeien) ### Heuristische minimax ## Lokaal ### Hill climbing ### Gradient descent ### (Random walk) ### Simulated annealing ## Genetisch ### Selectie #### Roulette wheel #### Ranggebaseerd ### Recombinatie #### Eénpunts crossover #### Geordende crossover ### Mutatie # Machine learning ## Gesuperviseerd ### Regressie #### Lineaire regressie #### Lineaire regressie met polynomiale attr. ### Classificatie #### Logistische regressie ##### Binair ##### Niet-binair 1-vs-allen ##### Niet-binair 1v1 #### Neurale netwerken ##### Voorwaarts gericht ###### Stochastische gradient descent ###### Mini-batch gradient descent ##### (Recurrent) ## Ongesuperviseerd ### Clustering #### K-means ### (Anomaliedetectie) ### (Primaire componenten analyse) ## (Reinforcement learning) --> <style> body { counter-reset: h2 } h2 { counter-reset: h3 } h3 { counter-reset: h4 } h4 { counter-reset: h5 } h2:before { counter-increment: h2; content: counter(h2) ". " } h3:before { counter-increment: h3; content: counter(h2) "." counter(h3) ". " } h4:before { counter-increment: h4; content: counter(h2) "." counter(h3) "." counter(h4) ". " } h5:before { counter-increment: h5; content: "> "; } </style>