trochę o sieciach i trochę o muzyce i midi

This commit is contained in:
CezaryPukownik 2020-04-19 16:01:04 +02:00
parent e86288a1bb
commit 89ff281ba5

View File

@ -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}