Umělá inteligence
Obsah Soubory
Praxe

Nástroje pro UI

Aktualizováno 7 min čtení 1 319 slov

Nástroje pro UI

Naprostá většina současných projektů v oblasti umělé inteligence a strojového učení se realizuje v jazyce Python. Je to zvláštní volba - Python je jeden z nejpomalejších běžně používaných jazyků a numerické výpočty jsou to poslední, na co byste ho čekali.

Vysvětlení je v tom, že v Pythonu se skoro nic nepočítá. Kombinace jednoduché syntaxe, bohatého ekosystému knihoven a optimalizovaných numerických jader napsaných v C/C++ a CUDA znamená, že Python jen říká, co se má stát, a stane se to jinde. Když napíšeš A @ B, proběhne to v BLAS knihovně napsané v assembleru. Python u toho čeká.

Tahle stránka je referenční - vrátíš se k ní, když budeš potřebovat příkaz nebo název funkce. Předpokládá to znalost Pythonu na úrovni „umím funkci a cyklus". Teorie za jednotlivými metodami je na příznakových metodách, MLP a dalších stránkách.

Mapa nástrojů

Skupina K čemu Knihovny
Základní numerické práce s poli, tabulkami, statistika NumPy, Pandas
Strojové učení klasické algoritmy Scikit-learn
Hluboké učení trénování sítí na GPU PyTorch, TensorFlow
Vizualizace grafy, matice záměn Matplotlib, Seaborn
Správa prostředí izolované instalace balíků Anaconda/Conda

Doporučení: nauč se Scikit-learn a NumPy pořádně, zbytek podle potřeby. Většina úloh z téhle wiki se dá vyřešit deseti řádky ve Scikit-learn a hluboké učení potřebuješ, teprve když jde o obrázky, zvuk nebo text.

Scikit-learn

Nejpoužívanější knihovna pro klasické strojové učení. Obsahuje desítky algoritmů se stejným, velmi jednoduchým programovým rozhraním.

Jednotné API

Každý model (odhadovač, estimator) implementuje trojici metod:

  • .fit(X, y) - natrénuje model na datech X s označeními y,
  • .predict(X) - vrací predikce pro nová data,
  • .score(X, y) - vrací přesnost modelu na daných datech.

Tohle je nejužitečnější věc na celé knihovně. Vyměníš GaussianNB() za KNeighborsClassifier() a nezměníš ani řádek zbytku kódu. Porovnání pěti klasifikátorů je pak cyklus přes seznam, ne pět různých programů - viz příklad níž.

Co v ní je

Algoritmus Třída Stránka
K nejbližších sousedů KNeighborsClassifier příznakové metody
Naivní Bayes GaussianNB, MultinomialNB Bayesova klasifikace
Support Vector Machines SVC, LinearSVC -
Rozhodovací stromy a lesy DecisionTreeClassifier, RandomForestClassifier příznakové metody
Minimální vzdálenost NearestCentroid příznakové metody
Lineární a logistická regrese LinearRegression, LogisticRegression lineární regrese
Shlukování KMeans, DBSCAN shlukování

Velmi silnou stránkou knihovny je jednotná podpora pro předzpracování dat (škálování, PCA, dělení na trénovací a testovací množinu funkcí train_test_split) a pro vyhodnocení (křížová validace, metriky, matice záměn).

NumPy a Pandas

NumPy

Základní knihovna pro numerické výpočty. Jádrem je typ ndarray - n-rozměrné pole uložené souvisle v paměti. Umožňuje rychlé vektorové operace (sčítání, násobení matic, řešení soustav) bez nutnosti psát cykly v Pythonu.

Prakticky všechny ML knihovny přijímají vstupy jako NumPy pole. Výpočty v NumPy probíhají v optimalizovaném C kódu a jsou řádově rychlejší než nativní Python smyčky.

To „souvisle v paměti" je celý důvod. Pythonovský seznam je pole ukazatelů na objekty rozházené po haldě. NumPy pole je jeden blok bajtů, který procesor přečte naráz a zpracuje vektorovými instrukcemi.

# správně - vektorově
vzdalenosti = np.sqrt(((X - stred)**2).sum(axis=1))

# špatně - Python cyklus, řádově pomalejší
vzdalenosti = [math.sqrt(sum((x[i]-stred[i])**2 for i in range(n))) for x in X]

Pandas

Rozšiřuje NumPy o datové struktury inspirované tabulkami:

  • Series - jednorozměrná řada s pojmenovaným indexem,
  • DataFrame - dvourozměrná tabulka s pojmenovanými sloupci.

Hodí se pro načítání dat z CSV a Excelu, filtrování, agregaci, slučování tabulek a statistický průzkum dat. Úzce spolupracuje se Scikit-learn - DataFrame se dá předat přímo do metody .fit().

Matplotlib a Seaborn

Matplotlib je nejstarší a dodnes nejpoužívanější knihovna pro vykreslování 2D grafů. Modul pyplot poskytuje rozhraní podobné prostředí MATLABu.

Funkce Význam
plt.plot(x, y) liniový graf
plt.imshow(A) zobrazení matice nebo obrázku
plt.hist(data) histogram
plt.scatter(x, y) bodový graf
plt.show() zobrazení figury

Seaborn je nadstavba nad Matplotlibem zaměřená na statistické vizualizace - distribuční grafy, regresní diagramy, tepelné mapy korelací. Automaticky používá estetičtější výchozí styly.

Pro klasifikační úlohy se často kreslí matice záměn pomocí třídy ConfusionMatrixDisplay ze Scikit-learn. Metoda ConfusionMatrixDisplay.from_predictions(y_true, y_pred) vykreslí matici přímo, bez nutnosti ručního výpočtu.

Knihovny pro hluboké učení

PyTorch

Meta/Facebook AI, 2016. Dnes nejpoužívanější framework v akademické sféře i ve výzkumu. Výpočetní graf se buduje dynamicky (define-by-run), což je přirozené pro pythonovský styl programování a zjednodušuje ladění - můžeš do modelu vložit print nebo breakpoint a funguje to, protože se graf staví za běhu.

  • tenzory (torch.Tensor) s podporou automatického derivování (autograd),
  • vrstvy a modely (torch.nn),
  • optimalizátory (torch.optim: SGD, Adam, RMSprop),
  • běh na GPU pomocí CUDA (.to("cuda")).

Ten autograd je to, co ti ušetří ruční psaní backpropagation. Zapíšeš dopředný průchod a knihovna si derivace odvodí sama.

TensorFlow a Keras

Google, 2015. Druhý hlavní framework. Původně používal statický výpočetní graf, od verze 2.x podporuje i dynamický (eager) režim. Obsahuje vysokoúrovňové rozhraní Keras, v němž se modely staví velmi deklarativně:

from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense

model = Sequential([
    Dense(128, activation='relu', input_shape=(784,)),
    Dense(64, activation='relu'),
    Dense(10, activation='softmax'),
])
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.fit(X_train, y_train, epochs=10, batch_size=32)

Přečti si těch pár řádků optikou MLP. 784 je vstup, tedy obrázek 28×28 zploštělý do vektoru. Dvě skryté vrstvy s ReLU. Výstup deset neuronů se softmaxem, tedy pravděpodobnostní rozdělení přes deset číslic. Optimalizátor Adam, ztráta křížová entropie. Celá teorie z několika stránek se vejde do sedmi řádků - a proto je důležité té teorii rozumět, protože jinak nebudeš mít co ladit, až to nebude fungovat.

Hugging Face Transformers

Knihovna Transformers poskytuje stovky předtrénovaných modelů (BERT, GPT, T5) pro zpracování přirozeného jazyka, obrazu i zvuku. S několika řádky kódu lze model stáhnout a použít:

from transformers import pipeline

clf = pipeline("sentiment-analysis")
print(clf("I really enjoyed this movie."))
# [{'label': 'POSITIVE', 'score': 0.9998}]

Tohle je dnes výchozí postup u textových úloh. Netrénuj LSTM od nuly, vezmi předtrénovaný model a dotrénuj jeho poslední vrstvu. Stejná úvaha jako transfer learning u CNN.

Anaconda a správa prostředí

Anaconda je distribuce jazyka Python zaměřená na vědecké výpočty. Obsahuje správce balíků Conda, který řeší závislosti mezi knihovnami včetně ne-pythonovských - CUDA, MKL. Minimální varianta se jmenuje Miniconda.

To je hlavní rozdíl proti pip. Pip umí jen Python balíky. Conda umí i nainstalovat správnou verzi CUDA k tvé grafické kartě, a to je přesně to místo, kde instalace hlubokého učení obvykle padne.

Postup instalace

  1. Stáhnout instalátor z anaconda.com pro příslušný operační systém.
  2. Spustit instalaci - Windows klikací průvodce, Linux a macOS bash Anaconda-*.sh.
  3. Ověřit instalaci příkazem conda --version.

Tahák

conda create --name ui python=3.11        # vytvoření nového prostředí
conda activate ui                          # přepnutí do prostředí
conda deactivate                           # ukončení prostředí

conda install numpy pandas                 # instalace balíků
conda install -c conda-forge scikit-learn  # instalace z jiného kanálu

conda list                                 # výpis nainstalovaných balíků
conda env list                             # výpis všech prostředí
conda remove --name ui --all              # smazání prostředí

Vždycky si založ prostředí pro projekt. Instalace do základního prostředí skončí konfliktem verzí, typicky ve chvíli, kdy budeš potřebovat starší TensorFlow pro cizí kód.

Google Colab

Alternativou bez vlastní instalace je Google Colab - webový notebook s GPU/TPU zdarma, předinstalovanými knihovnami a integrací na Google Drive. Vhodný zejména pro rychlé zkoušení a experimenty s hlubokým učením.

Pro první projekt s neuronovou sítí je to nejrychlejší cesta. Bez GPU trvá trénink CNN na notebooku hodiny, v Colabu minuty. Omezení: session se po pár hodinách nečinnosti ukončí a data z ní zmizí, takže si výsledky průběžně ukládej na Drive.

Příklad: klasifikace datové sady Digits

Praktická ukázka typického workflow. Dataset Digits obsahuje ručně psané číslice jako šedotónové obrázky 8×8 v deseti třídách a je součástí Scikit-learn.

Načtení a vizualizace

from sklearn import datasets
import matplotlib.pyplot as plt

digits = datasets.load_digits()
print(digits.data.shape)   # (1797, 64)

# zobrazeni prvnich 8 cislic
fig, axes = plt.subplots(1, 8, figsize=(10, 2))
for ax, img, lbl in zip(axes, digits.images, digits.target):
    ax.imshow(img, cmap='gray')
    ax.set_title(lbl); ax.axis('off')
plt.show()

To (1797, 64) je celý datový model: 1797 vzorků, každý jako vektor 64 čísel, tedy 8×8 pixelů zploštělých do řádku. Prostorová struktura se tím ztratí - a přesně tuhle informaci CNN na rozdíl od klasických metod využívá.

Trénování tří klasifikátorů

from sklearn.model_selection import train_test_split
from sklearn.neighbors import NearestCentroid, KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, ConfusionMatrixDisplay

X_train, X_test, y_train, y_test = train_test_split(
    digits.data, digits.target, test_size=0.3, random_state=42)

modely = {
    "NearestCentroid":     NearestCentroid(),
    "KNN (k=3)":           KNeighborsClassifier(n_neighbors=3),
    "Gaussian Naive Bayes": GaussianNB(),
}

for jmeno, model in modely.items():
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    acc = accuracy_score(y_test, y_pred)
    print(f"{jmeno:22s} accuracy = {acc:.3f}")
    ConfusionMatrixDisplay.from_predictions(y_test, y_pred)
    plt.title(jmeno); plt.show()

Typické výsledky dosahují přesnosti kolem 90-98 %, přičemž KNN obvykle převyšuje jednoduchý NearestCentroid. Matice záměn pomáhá identifikovat, které číslice si model nejčastěji plete - typicky 8 versus 3.

Tři věci na tom kódu stojí za zvýraznění:

random_state=42 dělá rozdělení reprodukovatelné. Bez něj dostaneš pokaždé jinou přesnost a nebudeš vědět, jestli je rozdíl mezi modely skutečný, nebo jen šum.

Cyklus přes slovník modelů funguje jen díky jednotnému API. Tohle je ta úspora, o které byla řeč nahoře.

Matice záměn se kreslí ke každému modelu, ne jen přesnost. Samotné číslo neřekne, která číslice nefunguje.

Časté chyby

„Přesnost 98 %, hotovo." U nevyvážených dat to nic neznamená. Podívej se na matici záměn a na precision s recall.

„Netrénoval jsem, jen jsem vybral příznaky na celých datech." Testovací data už model ovlivnila a přesnost je nadhodnocená. Výběr příznaků patří dovnitř křížové validace.

„Nemusím škálovat, je to jen k-NN." Právě u k-NN a k-means na škálování všechno stojí. Viz normalizace.

„Nainstaluju to pipem do systémového Pythonu." Skončíš konfliktem verzí. Založ si conda prostředí.

„Neuronová síť bude lepší než rozhodovací strom." Na tabulkových datech obvykle není. Zkus obojí a změř to.

Kam dál