\documentclass{article}

\input{../common-preamble}
\input{../bmstu-preamble}

\begin{document}
\pagestyle{empty}
\makeBMSTUHeader

\makeReportTitle{лабораторной}{2}{Прогнозирование на базе нейронных сетей}{Нейронные сети}{а}{Боровик И.Г.}
\newpage
\tableofcontents
\newpage
\section*{Цель работы}
\addcontentsline{toc}{section}{Цель работы}
Познакомиться с процессом решения задач аппроксимации и прогнозирования с помощью многослойных персептронов с использованием программной платформы \code{Neuroph}. \code{Neuroph} – фреймворк для разработки нейронных сетей, реализованный на языке программирования Java. \code{Neuroph} состоит из Java-библиотеки и пользовательского интерфейса для проектирования нейронных сетей \textbf{Neuroph Studio}. \textbf{Neuroph Studio} позволяет проводить эксперименты с рядом стандартных архитектур нейронных сетей, которые также можно в дальнейшем вставить в собственную программу, используя Java-библиотеку.

\section*{Задание}
\addcontentsline{toc}{section}{Задание}
Целью данного задания является создание нейронной сети, способной дать прогноз результата футбольного матча и выдвинуть одну из теорий: победит команда хозяев, победит команда гостей, матч завершится ничьей, основываясь на некоторых исходных данных.

Для обучения нейронной сети использовались результаты английской премьер-лиги сезона 2011/12 года. Данный массив выборок был приложен к методическому пособию. Ввиду большого количества матчей из общего числа было случайно выбрано 106 выборок. Каждая выборка представляет собой 8 входных значений и 3 выходных атрибута.

Входные значения:
\begin{enumerate}
\item Рейтинг вратаря команды хозяев;
\item Рейтинг защиты команды хозяев;
\item Рейтинг полузащиты команды хозяев;
\item Рейтинг атаки команды хозяев;
\item Рейтинг вратаря команды гостей;
\item Рейтинг защиты команды гостей;
\item Рейтинг полузащиты команды гостей;
\item Рейтинг атаки команды гостей.
\end{enumerate}
Выходные атрибуты:
\begin{enumerate}
\item Победила команда хозяев;
\item Ничья;
\item Победила команда гостей.
\end{enumerate}

\section*{Работа и результат}
\addcontentsline{toc}{section}{Работа и результат}
\subsection*{Два нейрона скрытого слоя}
\addcontentsline{toc}{subsection}{Два нейрона среднего слоя}
Для сети, содержащей два нейрона среднего слоя была создана визуализация, представленная на рисунке \hyperref[pic:net2]{\ref{pic:net2}}. График ошибки в каждом случае представлял собой гиперболу, первый график представлен на рисунке \hyperref[pic:net2graphic]{\ref{pic:net2graphic}}, а точные значения количества итераций и итоговой ошибки тренировки в таблице \hyperref[table:net2]{\ref{table:net2}}.

\begin{figure}[H]
  \centering
  \includegraphics[height=5cm]{01-nn-lab2-hid2.png}
  \caption{Визуализация нейронной сети с двумя нейронами среднего слоя}
  \label{pic:net2}
\end{figure}

\begin{figure}[H]
  \centering
  \includegraphics[height=5cm]{01-nn-lab2-hid2-01.png}
  \caption{Диаграмма изменения ошибки нейронной сети с двумя нейронами среднего слоя}
  \label{pic:net2graphic}
\end{figure}

\begin{table}[H]
  \centering
  \begin{tabular}{||l|c|c|c|c|c|c||}
    \hline
    Попытка & \thead{Количество нейронов \\ скрытого слоя} & \thead{Скорость \\ обучения} & Момент & \thead{Максимальная \\ ошибка} & \thead{Количество \\ итераций} & Итоговая ошибка \\  [0.5ex]
    \hline\hline
    1 & 2 & 0,2 & 0,7 & 0,01 & 5561 & 0.24720360676290098 \\
    \hline
    2 & 2 & 0,3 & 0,7 & 0,01 & 5593 & 0.2465275090858466 \\
    \hline
    3 & 2 & 0,5 & 0,7 & 0,01 & 5611 & 0.24972900771732465 \\
    \hline
    4 & 2 & 0,7 & 0,7 & 0,01 & 5617 & 0.2507264554126911 \\
    \hline
  \end{tabular}
  \caption{Попытки обучения нейронной сети с двумя нейронами среднего слоя}
  \label{table:net2}
\end{table}

Из данных, представленных в таблице \hyperref[table:net2]{\ref{table:net2}} видно, что вне зависимости от скорости обучения, после примерно пяти с половиной тысяч итераций обучения сеть обучается примерно одинаково. 

\subsection*{Разное количество нейронов скрытого слоя}
\addcontentsline{toc}{subsection}{Разное количество нейронов скрытого слоя}
Количество входных и выходных нейронов диктует поставленная задача и набор обучающих выборок. В то же время количество количество нейронов скрытого слоя остаётся неясным. Так, если будет использовано слишком много нейронов скрытого слоя, нейронная сеть будет неспособна моделировать сложные данные, результатом чего станет плохой прогноз. Если будет использовано недостаточное количество нейронов скрытого слоя, обучение сети до нужной точности может продлиться чересчур долго, как мы смогли видеть при двух нейронах скрытого слоя. Таким образом, количество нейронов скрытого слоя необходимо выяснить опытным путем. Отношения количества нейронов среднего слоя, настроек обучения и итоговых значений ошибки показаны в таблице \hyperref[table:netDiff]{\ref{table:netDiff}}. Графики обучения в общем представляли собой гиперболическую кривую, кроме двух случаев, продемонстрированных в приложении \hyperref[appendix:chair]{\ref{appendix:chair}}. График зависимости количества нейронов среднего слоя и лучшего значения ошибки при разных параметрах обучения и $\approx$5600 итераций, показан на рисунке \hyperref[pic:errDiagram]{\ref{pic:errDiagram}}.

\begin{table}[H]
  \centering
  \begin{tabular}{||l|c|c|c|c|c|c||}
    \hline
    Попытка & \thead{Количество нейронов \\ скрытого слоя} & \thead{Скорость \\ обучения} & Момент & \thead{Максимальная \\ ошибка} & \thead{Количество \\ итераций} & Итоговая ошибка \\  [0.5ex]
    \hline\hline
    5  & 4  & 0,001 & 0,05 & 0,01 & 5584 & 0.25931106670036286  \\
    6  & 4  & 0,9   & 0,9  & 0,01 & 5594 & 0.19200605707303842  \\
    7  & 4  & 0,5   & 0,5  & 0,01 & 5605 & 0.18196311771073956  \\
    8  & 6  & 0,2   & 0,7  & 0,01 & 5563 & 0.12125280516407777  \\
    9  & 6  & 0,3   & 0,7  & 0,01 & 5599 & 0.10807535771153445  \\
    10 & 8  & 0,2   & 0,7  & 0,01 & 5587 & 0.09381396680869421  \\
    11 & 8  & 0,3   & 0,7  & 0,01 & 5586 & 0.086759142587247    \\
    12 & 8  & 0,5   & 0,7  & 0,01 & 5583 & 0.06318043759639597  \\
    13 & 12 & 0,2   & 0,7  & 0,01 & 5558 & 0.024105983026779552 \\
    14 & 12 & 0,3   & 0,7  & 0,01 & 5628 & 0.036639338505130305 \\
    15 & 12 & 0,5   & 0,6  & 0,01 & 5568 & 0.015498538429990109 \\
    16 & 20 & 0,2   & 0,7  & 0,01 & 5598 & 0.01722806954097388  \\
    17 & 30 & 0,2   & 0,7  & 0,01 & 5572 & 0.025964472982198655 \\
    18 & 30 & 0,3   & 0,7  & 0,01 & 5574 & 0.020700472107266176 \\
    \hline
  \end{tabular}
  \caption{Попытки обучения нейронной сети с несколькими нейронами среднего слоя}
  \label{table:netDiff}
\end{table}

\begin{figure}[H]
  \centering
  \begin{tikzpicture}
    \begin{axis}[
      xlabel=Нейронов,
      ylabel=Ошибка,]
      \addplot coordinates {(4,0.18196311771073956) (6,0.10807535771153445) (8,0.06318043759639597) (12,0.015498538429990109) (20,0.01722806954097388) (30,0.020700472107266176) };
    \end{axis}
  \end{tikzpicture}
  \caption{График зависимости значения ошибки от количества нейронов среднего слоя}
  \label{pic:errDiagram}
\end{figure}

На графике отчётливо видно, что при правильно подобранном количестве нейронов среднего слоя обучение максимально эффективно, но если сделать лишком много нейронов - качество обучения ухудшится (уход кривой вверх после 12ти нейронов). Также интересный эффект в обучении наблюдался для восьми нейронов скрытого слоя, графики, демонстрирующие необычное поведение нейронной сети представлены в приложении \hyperref[appendix:hazard]{\ref{appendix:hazard}}.

\subsection*{Тестирование нейронной сети}
\addcontentsline{toc}{subsection}{Тестирование нейронной сети}
В данном задании обучение нейронной сети производится для того, чтобы показать влияние параметров персептрона и параметров обучения на его скорость и точность. Однако на практике нейронные сети обучаются с конкретной целью. В этой части задания был обучен персептрон с сорока нейронами промежуточного слоя. Результат обучения представлен в таблице \hyperref[table:netForTests]{\ref{table:netForTests}}.

\begin{table}[H]
  \centering
  \begin{tabular}{||l|c|c|c|c|c|c||}
    \hline
    Попытка & \thead{Количество нейронов \\ скрытого слоя} & \thead{Скорость \\ обучения} & Момент & \thead{Максимальная \\ ошибка} & \thead{Количество \\ итераций} & Итоговая ошибка \\  [0.5ex]
    \hline\hline
    19 & 40 & 0,2 & 0,07 & 0,01 & 5644 & 0.030568281883777332 \\
    \hline
  \end{tabular}
  \caption{Параметры обучения нейронной сети для тестирования}
  \label{table:netForTests}
\end{table}

Для обучения был использован тот же набор исходных данных, тестирование производилось на наборе, представленном в таблице \hyperref[table:dataForTests]{\ref{table:dataForTests}}

\begin{table}[H]
  \centering
  \begin{tabular}{||c|c|c|c|c|c|c|c||c|c|c||}
    \hline
    In1 & In2 & In3 & In4 & In5 & In6 & In7 & In8 & Out1 & Out2 & Out3 \\  [0.5ex]
    \hline\hline
    0.6875 & 1.0    & 0.5556 & 0.5311 & 0.625  & 0.7656 & 0.1528 & 1.0    & 1.0 & 0.0 & 0.0 \\
    0.75   & 0.5    & 0.4722 & 0.435  & 0.75   & 0.5625 & 0.8333 & 0.0    & 0.0 & 0.0 & 1.0 \\
    0.6875 & 1.0    & 0.5556 & 0.5311 & 0.5625 & 0.4531 & 0.4398 & 0.4124 & 1.0 & 0.0 & 0.0 \\
    0.4375 & 0.5156 & 0.4352 & 0.4237 & 0.5625 & 0.2813 & 0.4167 & 0.4181 & 0.0 & 0.0 & 1.0 \\
    0.5625 & 0.4063 & 0.4491 & 0.4463 & 0.25   & 0.1719 & 0.0556 & 0.8531 & 1.0 & 0.0 & 0.0 \\
    \hline
  \end{tabular}
  \caption{Параметры обучения нейронной сети для тестирования}
  \label{table:dataForTests}
\end{table}

Результаты тестирования приведены в таблице \hyperref[table:testResults]{\ref{table:testResults}}. 
\begin{table}[H]
  \small
  \begin{tabular}{||c||c|c|c|c|c|c|c|c||c|c|c||c|c|c||}
    \hline
    № & \multicolumn{8}{c||}{Входные значения} & \multicolumn{3}{c||}{Выходные значения} & \multicolumn{3}{c||}{Ожидаемые}\\ [0.5ex]
    \hline
     &  In1 & In2 & In3 & In4 & In5 & In6 & In7 & In8 & O1 & O2 & O3 & EO1 & EO2 & EO3 \\  
    \hline\hline
    1 & 0,6875 & 1      & 0,5556 & 0,5311 & 0,625  & 0,7656 & 0,1528 & 1      & 0,9997 & 0,0927 & 0      & 1 & 0 & 0 \\
    2 & 0,75   & 0,5    & 0,4722 & 0,435  & 0,75   & 0,5625 & 0,8333 & 0      & 0,028  & 0,0012 & 0,8979 & 0 & 0 & 1 \\
    3 & 0,6875 & 1      & 0,5556 & 0,5311 & 0,5625 & 0,4531 & 0,4398 & 0,4124 & 0,944  & 0,0061 & 0,0372 & 1 & 0 & 0 \\
    4 & 0,4375 & 0,5156 & 0,4352 & 0,4237 & 0,5625 & 0,2813 & 0,4167 & 0,4181 & 0,072  & 0,0202 & 0,8967 & 0 & 0 & 1 \\
    5 & 0,5625 & 0,4063 & 0,4491 & 0,4463 & 0,25   & 0,1719 & 0,0556 & 0,8531 & 0,9999 & 0,0015 & 0,0001 & 1 & 0 & 0 \\
    \hline
  \end{tabular}
  \caption{Таблица входных, выходных и ожидаемых тестовых значений}
  \label{table:testResults}
\end{table}
Результаты тестирования показали значение средней квадратичной ошибки сети \textbf{0.0027093099154115057} и представлены в виде снимка экрана в приложении \hyperref[appendix:final]{\ref{appendix:final}}. 

При детальном рассмотрении данных можно сделать вывод о том, что после обучения сеть с достаточной степенью достоверности предсказывает результат, формируя для ожидаемой единицы очень близкое к единице выходное значение, а для ожидаемого нуля - очень близкое к нулю выходное значение.

\newpage
\appendix
\section*{Приложения}
\addcontentsline{toc}{section}{Приложения}
\renewcommand{\thesubsection}{\Alph{subsection}}
\subsection{Результаты обучения (4 нейрона)}
\label{appendix:chair}

\begin{figure}[H]
  \centering
  \includegraphics[width=15cm]{01-nn-lab2-hid4-01-test.png}
  \caption{Искривление графика обучения сети с четырьмя нейронами скрытого слоя}
\end{figure}

\subsection{Результаты обучения (8 нейронов)}
\label{appendix:hazard}

\begin{figure}[H]
  \centering
  \includegraphics[width=15cm]{01-nn-lab2-hid8-01-interesting.png}
  \caption{Искривление значения ошибки сети с восемью нейронами скрытого слоя}

  \includegraphics[width=15cm]{01-nn-lab2-hid8-01-interesting2.png}
  \caption{Искривление значения ошибки сети с восемью нейронами скрытого слоя}
\end{figure}

\subsection{Результаты финального тестирования (40 нейронов)}
\label{appendix:final}
\begin{figure}[H]
  \centering
  \includegraphics[width=15cm]{01-nn-lab2-hid40-test.png}
  \caption{Снимок экрана с результатами тестирования нейронной сети}
\end{figure}

\end{document}