diff --git a/docs/document.tex b/docs/document.tex index ff8ce31..e11c5c7 100644 --- a/docs/document.tex +++ b/docs/document.tex @@ -163,7 +163,104 @@ Jednocześnie przyjmuję do wiadomości, że przypisanie sobie, w pracy dyplomow \newpage -\chapter{Reprezentacja muzyki} +\chapter{Wprowadzenie do sieci neuronowych} + + W tym rozdziale przedstawię podstawy działania sieci neuronowych, opiszę działanie autoencoderów oraz modelu Seq2Seq, ponieważ tych modeli użyłem do skonstruowania architektury generującej muzykę. + + \section{Regresja liniowa} + Podstawą wszystkich sieci neuronowych, jest regresja liniowa. W statystyce wykorzystywana aby wyjaśnić liniowe zalezności między zmiennymi. + + Prosty model regresji liniowej dla jednej zmiennej można opisać wzorem. + + \[\hat{y} = ax+b\] + + gdzie, + \begin{itemize} + \item $\hat{y}$ jest to estymacja zmiennej objaśnianej, + \item $x$ jest to zmienna objaśniająca, + \item $a$ jest parametrem modelu, + \item $b$ jest wyrazem wolnym. + \end{itemize} + \medskip + + Zadaniem jest znalezienie takiego parametru $a\in \mathbb{R}$ oraz wyrazu wolnego $b \in \mathbb{R}$, aby dla znanych wartości $x \in \mathbb{R}$ estymacja zmiennej objasnianej $\hat{y} \in \mathbb{R}$ najlepiej opisywała zmienną objasnaną $y \in \mathbb{R}$ + + \medskip + \begin{figure}[!htb] + \centering + \includegraphics[width=\linewidth]{images/linear_reg.png} + \caption{Regresja liniowa jednej zmiennej} + \label{fig:linreg} + \end{figure} + + Wartość zmiennej objaśnianej $y$ można również opisać za pomocą wielu zmiennych objaśniająych. Wtedy dla zmiennych objaśniającej $x_1, x_2, ... , x_n \in \mathbb{R}$ szukamy parametrów $\theta_1, \theta_2, ... ,\theta_n \in \mathbb{R}$. Otrzymany w ten sposób model nazywany jest również hipotezą i oznaczamy go $h(x)$. + + \[h(x) = b + \theta_1x_2 + \theta_2x_2 + ... + \theta_nx_n = b + \sum_{i=1}^{n} \theta_ix_i\] + + \section{Funkcja kosztu oraz metody gradientowe} + + + Celem uczenia modelu jest znalezienie ogólnych parametrów, aby model dla każdej pary $x, y$ zwracał wartości $\hat{y}$ najlepiej opisujące całe zjawisko według pewnego kryterium. W ten sposób jesteśmy wstanie znaleźć przybliżenie funkcji $h(x)$. + + \subsection{Funkcja kosztu} + + W tym celu używa się funcji $J_\theta(h)$, która zwraca wartość błędu między wartościami $h(x)$ oraz $y$ dla wszystkich obserwacji. Taka funckcja nazywana jest funkcją kosztu. + + Dla przykładu regresji liniowej funkcją kosztu może być odchylenie średnio kwadratowe. Wtedy funkcja kosztu przyjmuje postać: + \[ J_\theta(h) = \frac{1}{m}\sum_{i=1}^{m}(y_i-h(x_i))^2 \] + gdzie $m \in \mathbb{N}$ jest liczbą obserwacji. + + Przy zdefiniowanej funkcji kosztu, proces uczenia sprowadza się do znalezienia takich parametrów funckji $h(x)$ aby funkcja kosztu była najmniejsza. Jest to problem optymalizacyjny sprowadzający się do znalezienia globalnego minimum funkcji. + + \subsection{Metoda gradientu prostego} + Jednym z algorytmów stosowanych do rozwiązania powyższego problemu optymalizacji jest metoda gradientu prostego (ang. gradient descent). + + + \begin{figure}[!htb] + \centering + \def\layersep{2.5cm} + \begin{tikzpicture}[shorten >=1pt,->,draw=black!50, node distance=\layersep] + + \tikzstyle{every pin edge}=[<-,shorten <=1pt] + \tikzstyle{neuron}=[circle,fill=black!25,minimum size=17pt,inner sep=0pt] + \tikzstyle{input neuron}=[neuron, fill=black!50]; + \tikzstyle{output neuron}=[neuron, fill=black!50]; + \tikzstyle{hidden neuron}=[neuron, fill=black!50]; + \tikzstyle{annot} = [text width=4em, text centered] + + % Draw the input layer nodes + \foreach \name / \y in {1,...,4} + % This is the same as writing \foreach \name / \y in {1/1,2/2,3/3,4/4} + \node[input neuron, pin=left:Input \#\y] (I-\name) at (0,-\y) {}; + + % Draw the hidden layer nodes + \foreach \name / \y in {1,...,5} + \path[yshift=0.5cm] + node[hidden neuron] (H-\name) at (\layersep,-\y cm) {}; + + % Draw the output layer node + \node[output neuron,pin={[pin edge={->}]right:Output}, right of=H-3] (O) {}; + + % Connect every node in the input layer with every node in the + % hidden layer. + \foreach \source in {1,...,4} + \foreach \dest in {1,...,5} + \path (I-\source) edge (H-\dest); + + % Connect every node in the hidden layer with the output layer + \foreach \source in {1,...,5} + \path (H-\source) edge (O); + + % Annotate the layers + \node[annot,above of=H-1, node distance=1cm] (hl) {Hidden layer}; + \node[annot,left of=hl] {Input layer}; + \node[annot,right of=hl] {Output layer}; + \end{tikzpicture} + \caption{źródlo: Przykład sieci neuronowej} + \label{fig:neuralnet1} + \end{figure} + +\chapter{Reprezentacja danych muzycznych} W tym rozdziale przedstawię podstawowe koncepcje muzyczne, sposoby reprezentacji muzyki oraz omówię podstawy działania protokołu MIDI. @@ -336,100 +433,7 @@ note_on channel=0 note=60 velocity=0 time=0 Ścieżka (ang. Track) grupuje nuty aby podzielić utwór muzyczny na różne intrumenty. Protokół MIDI pozwala aby grać wiele ścieżek dzwiękowych jednocześnie, wtedy mówimy o muzyce polifonicznej lub multiintrumentalnej. -\chapter{Wprowadzenie do sieci neuronowych} - W tym rozdziale opiszę podstawy działania sieci neuronowych. - - \subsection{Regresja liniowa} - Podstawą wszystkich sieci neuronowych, jest regresja liniowa. W statystyce wykorzystywana aby wyjaśnić liniowe zalezności między zmiennymi. - - Prosty model regresji liniowej dla jednej zmiennej można opisać wzorem. - - \[\hat{y} = ax+b\] - - gdzie, - \begin{itemize} - \item $\hat{y}$ jest to estymacja zmiennej objaśnianej, - \item $x$ jest to zmienna objaśniająca, - \item $a$ jest parametrem modelu, - \item $b$ jest wyrazem wolnym. - \end{itemize} - \medskip - - Zadaniem jest znalezienie takiego parametru $a\in \mathbb{R}$ oraz wyrazu wolnego $b \in \mathbb{R}$, aby dla znanych wartości $x \in \mathbb{R}$ estymacja zmiennej objasnianej $\hat{y} \in \mathbb{R}$ najlepiej opisywała zmienną objasnaną $y \in \mathbb{R}$ - - \medskip - \begin{figure}[!htb] - \centering - \includegraphics[width=\linewidth]{images/linear_reg.png} - \caption{Regresja liniowa jednej zmiennej} - \label{fig:linreg} - \end{figure} - - Wartość zmiennej objaśnianej $y$ można również opisać za pomocą wielu zmiennych objaśniająych. Wtedy dla zmiennych objaśniającej $x_1, x_2, ... , x_n \in \mathbb{R}$ szukamy parametrów $\theta_1, \theta_2, ... ,\theta_n \in \mathbb{R}$. Otrzymany w ten sposób model nazywany jest również hipotezą i oznaczamy go $h(x)$. - - \[h(x) = b + \theta_1x_2 + \theta_2x_2 + ... + \theta_nx_n = b + \sum_{i=1}^{n} \theta_ix_i\] - - \subsection{Uczenie modelu} - - \subsubsection{Funkcja kosztu} - Celem uczenia modelu jest znalecienie ogólnych parametrów, aby model dla każdej pary $x, y$ zwracał wartości $\hat{y}$ najlepiej opisujące całe zjawisko według pewnego kryterium. W ten sposób jesteśmy wstanie znaleźć przybliżenie funkcji $h(x)$. - - W tym celu używa się funcji $J_\theta(h)$, która zwraca wrtość błędu między wartościami $h(x)$ oraz $y$ dla wszystkich obserwacji. Taka funckcja nazywana jest funkcją kosztu. - - Dla przykładu regresji liniowej, funkcją kosztu może być odchylenie średnio kwadratowe. Wtedy funkcja kosztu przyjmuje postać: - \[ J_\theta(h) = \frac{1}{m}\sum_{i=1}^{m}(y_i-h(x_i))^2 \] - gdzie $m \in \mathbb{N}$ jest liczbą obserwacji. - - Przy zdefiniowanej funcji kosztu, proces uczenia sprowadza się do znalezienia takich parametrów funcji $h(x)$ aby funkcja kosztu była najmniejsza. Jest to problem optymalizacyjny sprowadzający się do znalezienia globalnego minimum funcji. - - \subsubsection{Metoda gradientu prostego} - Jednym z algorytmów stosowanych do rozwiązania powyższego problemu optymalizacji jest metoda gradientu prostego (ang. gradient descent). - - - \begin{figure}[!htb] - \centering - \def\layersep{2.5cm} - \begin{tikzpicture}[shorten >=1pt,->,draw=black!50, node distance=\layersep] - - \tikzstyle{every pin edge}=[<-,shorten <=1pt] - \tikzstyle{neuron}=[circle,fill=black!25,minimum size=17pt,inner sep=0pt] - \tikzstyle{input neuron}=[neuron, fill=black!50]; - \tikzstyle{output neuron}=[neuron, fill=black!50]; - \tikzstyle{hidden neuron}=[neuron, fill=black!50]; - \tikzstyle{annot} = [text width=4em, text centered] - - % Draw the input layer nodes - \foreach \name / \y in {1,...,4} - % This is the same as writing \foreach \name / \y in {1/1,2/2,3/3,4/4} - \node[input neuron, pin=left:Input \#\y] (I-\name) at (0,-\y) {}; - - % Draw the hidden layer nodes - \foreach \name / \y in {1,...,5} - \path[yshift=0.5cm] - node[hidden neuron] (H-\name) at (\layersep,-\y cm) {}; - - % Draw the output layer node - \node[output neuron,pin={[pin edge={->}]right:Output}, right of=H-3] (O) {}; - - % Connect every node in the input layer with every node in the - % hidden layer. - \foreach \source in {1,...,4} - \foreach \dest in {1,...,5} - \path (I-\source) edge (H-\dest); - - % Connect every node in the hidden layer with the output layer - \foreach \source in {1,...,5} - \path (H-\source) edge (O); - - % Annotate the layers - \node[annot,above of=H-1, node distance=1cm] (hl) {Hidden layer}; - \node[annot,left of=hl] {Input layer}; - \node[annot,right of=hl] {Output layer}; - \end{tikzpicture} - \caption{źródlo: Przykład sieci neuronowej} - \label{fig:neuralnet1} - \end{figure} \chapter{Projekt}