\section{Conclusions}

Some problems found during the project, an evaluation of the results and what
could be done in the future to improve the system are discussed here.

\subsection{Problems with the Implementation of the Game}

While Go has a simple set of rules, they lead to many borderline cases which
must be specifically addressed. As an example, the \gls{ko} rule obliges to
check the previous board positions after each move so no boards are repeated.

These problems have been solved by designing the tree of moves of a match so
each move stores the full board layout after it has been played. This of course
increases the memory needed to run the application, but has been chosen over the
alternative of having to recreate the board parsing the tree backwards for each
move to check if \gls{ko} is occurring, if a move makes a capture and which stones
have already been captured, etc. It is the old problem of memory versus
processing, which in this case has been answered with memory. Which one would be
the best solution would require a deep analysis out of the scope of the project.

\subsection{Problems with the Monte Carlo Tree Search Algorithm}

The implemented Monte Carlo Tree Search algorithm was not precise by itself when
asked for moves. This could be attributed to various factors:

\begin{itemize}

	\item The way the score is counted makes it difficult to evaluate who is
		winning at the beginning or middle of the game, so the score of a move
		has to be evaluated by running playing simulations. These simulations
		are not precise on analyzing the result since the moves in them are
		played at random.

	\item The configuration used, 5 explorations with 10 simulations each per
		cycle, does not allow for many good moves to be found.

\end{itemize}

To solve these problems, either a good score evaluation engine has to be
implemented, which is another machine learning problem by itself, or the
explorations and simulations of the engine tuned up to values unable to be run
on the development hardware.

\subsection{Problems with Neural Networks}

Some concerns with the design and results of the neural networks are discussed
on this section.

\subsubsection{Finding the correct design}

When approaching neural networks design with just basic understanding of their
inner workings it is easy to get lost in all the different factors that can be
tuned. The number and variant of layers, their number of nodes, their activation
function, the learning rate; they can all be tweaked and doing so in the favour
of the design requires a good knowledge of what is being done.

The basic approach was to design the input and output shapes and then adjust the
network based on that. At first, the desired output was a 9x9 two-dimensional
matrix with the probabilities of playing on each move. A heatmap generated from
a failed solution of this approach can be seen on \fref{fig:oldHM}, where the
network distributed the probability for each row instead of the whole board. The
fitting of shapes of input, internal layers and output has found to be tricky at
first.

\begin{figure}[h]
	\begin{center}
		\includegraphics[width=\textwidth]{img/matches/oldLineByLineHeatmap.png}
		\caption{A heatmap from an old design of the dense neural network.}
		\label{fig:oldHM}
		Note that each row adds up to one, meaning that the engine is selecting
		the best move for each row and not for the whole board.
	\end{center}
\end{figure}

Finally, based on the design of classification networks where each possible
class is mapped to a value in the one-dimensional output vector, it was decided
that the output was not a two-dimensional matrix but a one-dimensional vector.
This also helped address the possibility of passing, treating it as just another
possible move that was previously left out because of not knowing how to fit it
on the matrix of possible moves. This vector is then reshaped to a matrix
representing the board when needed, for example to generate the heatmaps used
for evaluation.

\subsubsection{Mistakes on Networks' Play Patterns}

One notable mistake made by the networks, specially the convolutional network,
was passing too much. Passing is considered just another move, so the networks
have no grasp that they should not pass until there are no more valuable moves
to be made. A new design problem could be to create a specific passing policy.

Another observation is that the engines seem to follow traditional openings and
make reasonable decisions at the start of the game, with some interesting
variations. But as the game progresses their moves make less sense. This could
be because they have seen many examples of starting moves but complications at
the middle and end game are much more diverse and the networks had not been
trained on similar situations. These stages of the game are probably where a
strong Monte Carlo Tree Search algorithm would help the most.

\subsection{Viable Extensions}

There are several ways this project could be improved, but were left out by lack
of resources or time. Some interesting ones are explored on this section.

\subsubsection{Joining Monte Carlo Tree Search and Neural Networks}

The tree search algorithm is better at the end of the game, where the tree to
explore is much more manageable. On the other hand, the neural networks are
better at the beginning, where the positions are more common and patterns are
simpler. The logical next step would be to join both: the network could select
the best moves to be made, and the tree search algorithm could explore them to
select the best and grow its explored tree in meaningful directions.

This is also what was done by AlphaGo. Going by the results obtained in this
project it makes sense they went with that design.

\subsubsection{Train the Engine by Itself}

By training a game engine on human matches, it can at best get as good as the
human players it has learned from.

Top engines learn not from humans but by playing against themselves. This would
be an interesting problem to tackle, if requiring a new approach to the design
of the networks and a lot of training resources.

\subsubsection{Presenting the Engine to the World}

Some Go servers allow for bot players to be registered. This would provide a
source of training against players from all around the world and also an
evaluation over time of the engine strength.
