Lekce 1 - Úvod a motivace do programování neuronových sítí v Pythonu
Vítejte u první lekce e-learning kurzu věnovaném deep learningu, tedy strojovému učení. Naučíte se zde vše od čtení dat až po naprogramování vlastní neuronové sítě v Pythonu. U kurzu počítáme s tím, že znáte alespoň základy Pythonu (stačí syntaxe) a umíte vytvořit třídu.
Motivace
Jelikož vstupujeme do velmi komplexní problematiky, v dnešní lekci si ji podobně uvedeme a řekneme si, co vše tvorba umělé inteligence v Pythonu zahrnuje.
Standardní vs. učící se algoritmy
Standardní algoritmy, které nejsou založené na strojovém učení a práci s daty, excelují na úlohách, které lze snadno definovat. Vezměme si např. úlohu "zpracovat objednávku v internetovém obchodě". Kód takového programu by obsahoval jednoznačné postupy, např. uložení objednávky do databáze, generování údajů do faktury, obsluhu platební brány a další. Zde není moc nad čím přemýšlet, jediný problém snad může být najít v dnešní době schopného programátora
Jak definujeme banán?
Definujme ovšem jiný typ úlohy, např. budeme chtít zjistit, zda je na fotografii banán. Tuto úlohu i část textu jsem si vypůjčil ze zdejšího článku Deep learning na 3 řádky. Pokud chcete realističtější úlohu, můžete si představit, že místo banánu detekujeme zbraň a jedná se o analýzu obrazu z bezpečnostní kamery. Jak ale definujeme banán?
Eh... no... Můžeme začít s tím, že banán je žlutý, má jistý tvar, velikost a texturu. Ani jedna z těchto vlastností není u banánu pokaždé stejná a už vůbec není "banánově exkluzivní" (např. jablko může být také žluté). Náš algoritmus se tak může snadno mýlit a označit za banán např. kus žluté zahradní hadice nebo naopak selhat při analýze zhnědlého nebo natočeného banánu. Myslím, že jsme již narazili, a to jsme ještě ani nezačali. I v rozpoznávání číslic, kterých je jen 10 a jsou oproti objektům všedního světa jednoduché, jsou klasické algoritmy značně nedokonalé.
Možná vás napadlo zeptat se, jak to vlastně dělá člověk, že bezpečně pozná, co je banán, zbraň, přečte SPZ automobilu a dokáže řešit další úlohy, kde standardní programovací postupy selhávají. Asi bychom spolu došli k úvaze, že člověk se to naučí z dat, která během života získá.
Data
Vědci tedy přišli s nápadem napodobit lidské myšlení a softwarově simulovat síť neuronů, podobnou té, kterou máme v hlavě my lidé, jen samozřejmě mnohem jednodušší. Tuto síť pak lze na základě velkého množství dat (v našem příkladu rozumějte dostatečného počtu fotografií různých banánů) vytrénovat tak, aby dokázala s vysokou úspěšností banán rozpoznat.
Takovouto síť musíme samozřejmě naučit rozpoznat i jiné objekty, aby se mohla rozhodnout mezi banánem a alternativním případem. Při použití klasifikátoru založeném na konvolučních neuronových sítích je přesnost a rychlost algoritmu dokonce lepší než u člověka samotného! Klasifikátorem máme na mysli funkčnost, která dokáže rozpoznat daný objekt, a tedy jej klasifikovat. To je ale ovšem stále jen jedna z úloh, které lze strojovým učením řešit.
Kdy použít a nepoužít neuronovou síť
Důležité je si uvědomit, že neuronové sítě používáme na určité typy úloh a jejich výsledek má vždy nějakou pravděpodobnost, i když velmi vysokou. Pokud bychom je použili na úlohy, které lze jednoduše definovat, bylo by to zas na škodu. Nevýhodou neuronek obecně je potřeba velkého množství dat a výpočetního výkonu pro učící fázi.
Data jsou všechno
V dnešní době jsou data silným nástrojem, pokud se s nimi naučíme dobře pracovat, dokážeme prakticky všechno. Pojďme si vyzdvihnout další 2 úspěchy AI (umělé inteligence, anglicky Artifical inteligence), tentokrát na poli her:
- Tým OpenAI dokázal porazit tým profesionálních hráčů ve hře Dota 2 (zápas 5v5)
- Tým DeepMind od Google porazil ve hře Go (desková hra) nejlepšího člověka
"Stroj" porazil člověka, protože hrál tolik her sám proti sobě a pořád se zlepšoval, že by to člověk neodehrál ani za několik životů.
Co vše AI umí?
To ale stále není všechno, ani zdaleka ne! S AI toho lze dělat opravdu hodně a v mnoha oborech je s těmito algoritmy spojeno velké množství peněz a pozice analytiků big data jsou velmi dobře placené, např. ve finančnictví.
Uveďme si zde takový seznam pojmů, stále se jedná o malý nástřel toho, co toto mladé a perspektivní odvětví vše umožňuje:
- Obecné
- Klasifikace
- Predikce
- Práce s jazykem
- Překlad
- Klasifikace komentářů - pozitivní, neutrální, negativní
- Klasifikace událostí ve světě
- Na tomto můžeme vydělat těžké peníze, pokud budeme vědět X dní předem, že nějaké akcie půjdou dolů nebo nahoru
- Generování textu
- Interakce s prostředím (například hry)
- Reinforcement learning
- Neuronová síť se učí podobně jako člověk, podle odměny nebo trestu, příklady úspěchů AI ve hrách Dota 2 nebo deskovce Go jsme si již zmínili výše. Odkaz
- Reinforcement learning
- Práce se zvukem
- Generování hudby a další
- Práce s obrazem
- Klasifikace obrázku
- Detekce více objektů na obrázku (+ lokalizace)
- Style Transfer
- Druh umění, kde se snažíme ponechat obsah obrázku a změnit styl (např. profilovka nakreslená od Picassa). Odkaz
- Deep Dream
- Druh umění, vytvoříme "halucinogenní" obrázek, kde jsou zobrazeny objekty a vlastnosti, které model zná. Odkaz
- Generativní Model
- Rozpoznání osob podle obličeje
- Detekce klíčových bodů na obličeji
- Odezírání ze rtů
- Udělat z low res obrázku high res. Odkaz
- Odstranění šumu
- Dokreslování obrázků / rekonstrukce
Od každého něco si tu určitě ukážeme, ale nejdříve se musíme ke všemu postupně dostat. V tomto kurzu je (a bude) motivace extrémně důležitá, proto se vás budu snažit motivovat a čas od času informovat o dění ve světe AI Mně osobně trvalo více než 7 měsíců, než jsem pochopil principy a zvládl vytvořit něco, čemu jsem opravdu rozuměl.
Co máme před sebou
Máme toho opravdu hodně, je klíčové vybrat si ten správný začátek a nikam nespěchat. Klíčové body, které máme před sebou, jsou:
- Lineární a polynomiální regrese
- K-Nejbližších sousedů (K-Nearest neighbours)
- Rozhodovací stromy (Decision Trees), Les rozhodovacích stromů (Random forest)
- K-Means clustering (Rozdělení dat do K skupin)
- SVM (Support Vector Machine)
- Perceptron
- Multilayer perceptron (Vícevrstvý perceptron)
- Neuronová síť
- Reinforcement learning (učení na základě interakce s prostředím)
- CNN (Convolutional Neural Network - Konvoluční neuronová síť)
- RNN (Recurrent Neural Network - Opakující se neuronová síť)
Je také důležité vědět o novinkách, proto si občas pročtu/zhlédnu něco na následujících webech:
- Medium
- Towards Data Science
- YouTube
- Two Minute Papers - představuje novinky (papers, papír je většinou PDF popisující způsoby, architekturu modelu / neuronové sítě a výsledky práce - něco jako seminární práce na univerzitě)
- Reddit - související subreddity (Machine Learning, Data Science, Computer Vision, Deep Learning, ...)
S čím budeme pracovat
Budeme používat poměrně dost nástrojů, jelikož každá činnost si žádá ten správný. Uveďme si alespoň ty klíčové, které budou po dobu tohoto kurzu náš denní chléb (samozřejmě záleží na činnosti).
- NumPy - knihovna na pro práci s N-dimenzionálními poli - staví na ní většina knihoven z tohoto "oboru"
- Pandas - knihovna pro práci s daty
- Matplotlib - knihovna pro vizualizaci
- Scikit-Learn - knihovna pro strojové učení - obsahuje již implementované algoritmy
- OpenCV - knihovna pro práci s obrazem
- PyTorch / Tensorflow - framework pro deep learning / neuronové sítě
Framework budeme používat již z jednoho prostého důvodu a tím je ulehčení práce, ale tím nejdůležitějším důvodem je optimalizace. Tyto frameworky jsou dělané pro obrovské množství paralelních výpočtu na Tensorech (co je Tensor se dozvíte až to bude potřeba), tudíž jsou psané v nízkém jazyce jako CUDA (výpočetní framework pro GPU od NVIDIA) a C++.
Pracovat s těmito nástroji se budeme učit podle potřeby v našich projektech, po pár lekcích se vám to dostane pod kůži stejně jako když jsem začínal i já sám
Instalace
Osobně rád používám knihovnu/framework PyTorch (na neuronové sítě), ale v produkci se většinou používá framework Tensorflow od Googlu, který lze bez problému používat i na mobilu. Ve frameworcích je rozdíl jak fungují, ale to nás zatím nemusí trápit a vše se dozvíte dále v kurzu. Až nadejde čas, byl bych rád, abyste o frameworku/knihovně, který budeme používat na neuronové sítě, rozhodli vy sami
Nejdříve je potřeba nainstalovat si Python, silně doporučuji distribuci MiniConda / AnaConda, protože nikomu nepřeji instalovat OpenCV ručně. MiniConda je podobná distribuce jako AnaConda, liší se v tom, že AnaConda má předinstalovaných asi 150 knihoven pro práci s daty (což si myslím, že je zbytečné).
Po instalaci Conda distribuce spustíme Anaconda prompt
(Klávesa Win a použijte vyhledávání). Unixákům stačí pouze
otevřít nový terminál. Přes Anaconda prompt
budeme my
Windowsáci spouštět naše skripty.
Pokud to někomu nevyhovuje, může si Python přidat do PATH
a
v příkazové řádce (CMD) použít příkaz conda init cmd.exe
.
V nově otevřeném CMD následně použít conda activate
pro
aktivaci prostředí (poté již stačí pouze tento příkaz při spuštění
CMD).
Dále nainstalujeme knihovny, které budeme brzy potřebovat (zbytek doinstalujeme podle potřeby) a to následujícími příkazy:
pip install numpy
pip install matplotlib
pip install pandas
pip install sklearn
- knihovna Scikit-Learn
Pokud vám příkazy nefungují, např. používáte klasickou
distribuci Pythonu, použijte variantu py -m pip install
.
V další lekci, Neuronové sítě v Pythonu - Prostředí Jupyter, si představíme prostředí Jupyter notebook pro Python, ve kterém budeme naše neuronové sítě programovat.