\begin{frame}{Čo je neurónová sieť?} \begin{itemize} \item Matematický model inšpirovaný ľudským mozgom \item Skladá sa z neurónov usporiadaných do vrstiev \item Vstupná vrstva $\rightarrow$ skryté vrstvy $\rightarrow$ výstupná vrstva \item Každé spojenie má váhu $w$ --- sieť sa učí úpravou týchto váh \end{itemize} \end{frame} \input{1.tex} \begin{frame}{Ako sa sieť učí?} \begin{enumerate} \item \textbf{Forward pass} --- dáta prechádzajú sieťou, dostaneme predikciu \item \textbf{Loss} --- zmeriame, ako veľmi sa sieť mýli \item \textbf{Backpropagation} --- spočítame gradienty (derivácie chyby podľa váh) \item \textbf{SGD update} --- upravíme váhy v smere najväčšieho poklesu chyby: \end{enumerate} \vspace{0.5em} \begin{equation} w \leftarrow w - \eta \cdot \frac{\partial L}{\partial w} \end{equation} \begin{center} kde $\eta$ je \textit{learning rate} \end{center} \end{frame} \begin{frame}{Aktivačné funkcie} Bez aktivačných funkcií by bola celá sieť len lineárna transformácia. \vspace{0.5em} \textbf{ReLU} --- najpoužívanejšia funkcia: \begin{equation} \texttt{ReLU}(x) = \max(0, x) \end{equation} \textbf{Softmax} --- na výstupe pre klasifikáciu: \begin{equation} \texttt{softmax}(x_i) = \frac{e^{x_i}}{\sum_j e^{x_j}} \end{equation} Výstupom je pravdepodobnostné rozdelenie cez triedy. \end{frame} { \usebackgroundtemplate{ \vbox to \paperheight{ \vfill \hbox to \paperwidth{ \hfill \includegraphics[height=0.35\paperheight]{obrazky/burn_logo.png} } \vspace{1.8cm} } } \begin{frame}{Burn framework} \begin{itemize} \item Deep learning framework napísaný v Ruste \item Cieľ: byť pre Rust tým, čím je PyTorch pre Python \item Kľúčové vlastnosti: \begin{itemize} \item Backend-agnostický dizajn \item Typová bezpečnosť v compile-time \item Automatická diferenciácia (autodiff) \item Podpora pre CPU, CUDA, WebGPU, \dots \end{itemize} \end{itemize} \end{frame} } \begin{frame}{Burn --- Backend systém} Burn oddeľuje logiku modelu od hardvéru: \vspace{0.5em} \begin{center} \texttt{Tensor} --- \texttt{B} je generický backend \end{center} \vspace{0.5em} \begin{itemize} \item \texttt{NdArray} --- Rust, CPU, žiadne závislosti \item \texttt{Wgpu} --- GPU cez WebGPU (cross-platform) \item \texttt{LibTorch} --- wrapper nad C++ LibTorch (CUDA) \item \texttt{Candle} --- Hugging Face backend \end{itemize} \vspace{0.5em} Ten istý kód beží na CPU aj GPU --- stačí zmeniť typ. \end{frame} \begin{frame}[fragile]{Backend sa mení jedným riadkom} \begin{lstlisting}[language=Rust, style=colouredRust] // CPU, Rust, žiadne závislosti type B = NdArray; // GPU cez WebGPU, cross-platform type B = Wgpu; // NVIDIA GPU cez LibTorch type B = LibTorch; \end{lstlisting} \vspace{0.5em} Zvyšok kódu sa nemení --- model, tréning, inferencia, všetko zostáva rovnaké. \end{frame} \begin{frame}{Ako Burn pristupuje k tenzorom} Tenzor v Burn nesie informáciu o type počas kompilácie: \vspace{0.5em} \begin{itemize} \item \texttt{Tensor} --- vektor \item \texttt{Tensor} --- matica \item \texttt{Tensor} --- 3D tenzor (napr. batch obrázkov) \end{itemize} \vspace{0.5em} Ak sa pokúsite násobiť maticu s vektorom nesprávnych rozmerov, kompilátor to zastaví ešte pred spustením. \end{frame} \begin{frame}[fragile]{Ako vyzerá model v Burn-e} \begin{lstlisting}[language=Rust, style=colouredRust] #[derive(Module)] pub struct MnistModel { linear1: Linear, linear2: Linear, activation: Relu, } \end{lstlisting} \vspace{0.5em} Derive makro \texttt{Module} automaticky vygeneruje: \begin{itemize} \item Zber všetkých parametrov na tréning \item Serializáciu a deserializáciu modelu \item Presun medzi zariadeniami (CPU $\leftrightarrow$ GPU) \end{itemize} \end{frame} \begin{frame}[fragile]{Forward pass} \begin{lstlisting}[language=Rust, style=colouredRust] fn forward(&self, x: Tensor) -> Tensor { let x = self.linear1.forward(x); let x = self.activation.forward(x); self.linear2.forward(x) } \end{lstlisting} \end{frame} \begin{frame}{Ako funguje autodiff v Burn-e} Burn zabalí ľubovoľný backend do autodiff vrstvy: \vspace{0.5em} \begin{enumerate} \item Počas forward passu sa buduje výpočtový graf \item Každá operácia si pamätá, odkiaľ prišli dáta \item \texttt{loss.backward()} prejde graf nazad. \item Výsledok: gradient pre každý parameter \end{enumerate} \vspace{0.5em} Typ rozlišuje fázy --- \texttt{Autodiff} na tréning a \texttt{Wgpu} na inferenciu. \end{frame}