\chapter{Theoretische Grundlagen}
\label{sec:grundlagen}

Dieses Kapitel soll die nötigen Grundlagen für die nachfolgenden Kapitel dieser Arbeit vermitteln. Dazu wird erst auf den Begriff Machine Learning und Deep Learning eingegangen. Anschließend werden die theoretischen Grundlagen von künstlichen neuronalen Netzen und Abwandlungen davon wie \gls{CNN}'s und die Objekterkennung durch neuronale Netze behandelt.

\section{Machine Learning}
Der Begriff Machine Learning beschreibt die Fähigkeit von \gls{KI}-Systemen, aus Rohdaten eigenes Wissen zu erwerben, indem Muster extrahiert werden \cite[3]{Goodfellow.2018}. Aus Daten wie beispielsweise Bildmatrizen Muster zu extrahieren wird später noch eine wichtige Rolle für die Umsetzung der Computer Vision einnehmen. Somit ist Machine Learning ein Teilgebiet der \gls{KI} \cite[1\psqq]{Goodfellow.2018}.\\
 Der Begriff Deep Learning beschreibt Machine-Learning-Modelle, die aus vielen verdeckten Schichten aufgebaut sind. Beispiel hierfür ist ein tiefes Feedforward-Netz, auch mehrschichtiges Perzeptron genannt \cite[6\psqq]{Goodfellow.2018}. Im Kapitel \ref{sec:tiefeNetze} wird hier näher auf die Theorie eingegangen, zunächst werden weitere Begrifflichkeiten innerhalb des Machine Learning erläutert.
 
 \subsection{Lernalgorithmen nach Aufgaben}
 In diesem Unterkapitel werden nun häufig vorkommende Aufgaben von Lernalgorithmen vorgestellt, die aus Daten lernen.
 
\subsubsection{Klassifizierung}
Für diese Aufgabe entscheidet der Algorithmus, zu welchen Kategorien die Eingangsdaten gehören. Hierfür wird eine Wahrscheinlichkeitsverteilung über alle Kategorien beziehungsweise Klassen ausgegeben. Die Klasse mit der höchsten Wahrscheinlichkeit zeigt somit das zugehörige Ergebnis an \cite[109]{Goodfellow.2018}. Ein häufig gewähltes Beispiel ist die Klassifizierung von handgeschriebenen Ziffern als Graustufenbilder des MNIST-Datensatz \cite{.332021}. Die Eingabe ist ein Graustufenbild, also ein Bild mit einem Kanal (Channel) mit einer Größe von 28 mal 28 Pixel, das eine handgeschriebene Ziffer von 0 bis 9 darstellt. Die Ausgabe sind 10 Klassen, die die Ziffern von 0 bis 9 repräsentieren. Nun wird eine Wahrscheinlichkeitsverteilung auf alle Klassen angewendet und die Klasse mit der höchsten Wahrscheinlichkeit stellt das Ergebnis der Klassifizierung dar \cite{Tensorflow.8202021}. Die Klassifizierung wird im Laufe dieser Arbeit eine wichtige Rolle für die Umsetzung der Computer Vision darstellen.

\subsubsection{Regression}
Bei der Regression wird aus den Eingangsdaten ein Zahlenwert vorhergesagt. Beispiel hierfür sind Berechnungen von Erwartungswerten wie die Schadenssumme einer versicherten Person oder künftige Kurse von Wertpapieren \cite[110]{Goodfellow.2018}.

\subsubsection{Transkription}
Bei diesem Aufgabengebiet muss der Machine-Learning-Algorithmus unstrukturierte Daten in eine diskrete Textform überführen. Beispiele sind die optische Zeichenerkennung, bei der der Text in einem Bild in eine bearbeitbare Zeichenfolge (ASCII, Unicode) umgewandelt wird. Ein anderes Beispiel ist die Spracherkennung aus Audiowellen \cite[110]{Goodfellow.2018}.

\subsubsection{Maschinelle Übersetzung}
Beispiel hierfür sind die Übersetzung von einer Sprache in eine andere. Meist handelt es sich um natürliche Sprachen wie Deutsch oder Englisch und die Übersetzung zwischen diesen \cite[111]{Goodfellow.2018}.

\subsubsection{Erkennung von Anomalien}
Für diese Aufgabe durchsucht der Lernalgorithmus eine Menge von Ereignissen oder Objekten nach Anomalien. Ein Beispiel hierfür sind die Erkennung von Kreditkartenbetrug anhand von Ungewöhnlichkeiten der Kaufgewohnheiten \cite[112]{Goodfellow.2018}.

\subsection{Lernalgorithmen nach Erfahrung}
Machine-Learning-Algorithmen lassen sich anhand der Art der Erfahrungen während der Lernphase in überwachte und unüberwachte Algorithmen einteilen \cite[115]{Goodfellow.2018}.

\subsubsection{Überwachtes Lernen}
Beim überwachten Lernen arbeitet der Lernalgorithmus mit einem Datensatz, der Merkmale (Features) und Zielwerte (Targets) enthält. Zu jedem Merkmal gehört ein Zielwert. Der Begriff überwachtes Lernen kommt auch von der Tatsache, dass der Zielwert von einem Supervisor oder Lehrer bereitgestellt wird. Somit lernt der Algorithmus das, was er tun soll \cite[115\psq]{Goodfellow.2018}.

\subsubsection{Unüberwachtes Lernen}
Bei diesem Verfahren versucht der Algorithmus nur aus den Merkmalen der Daten zu lernen, um Strukturen und nützliche Eigenschaften sichtbar zu machen. Zielwerte existieren nicht \cite[115\psq]{Goodfellow.2018}.

\subsubsection{Reinforcement Learning}
Algorithmen für das Reinforcement Learning interagieren mit der Umgebung, damit das Lernsystem aus neuen Erfahrungen mittels Feedbackschleife lernt \cite[116\psq]{Goodfellow.2018}. Die Feedbackschleife innerhalb des Algorithmus basiert auf dem Schema eines Agenten, der eine Aktion in der Umgebung ausführt und für diese Aktion eine Belohnung erfährt. Durch diese Schleife wird der Agent immer besser mit der Aktion und Interaktion mit der Umgebung \cite[400\psqq]{Zhou.2021}, (siehe Abbildung \ref{fig:Reinforcement Learning}). Dieses Verfahren wird auch als verstärkendes Lernen bezeichnet \cite[29\psq]{Raschka.2018}.

\begin{figure}[htbp]
	\centering
\tikzstyle{block} = [rectangle, draw, 
    text width=8em, text centered, rounded corners, minimum height=4em]
    
\tikzstyle{line} = [draw, -latex]

\begin{tikzpicture}[node distance = 6em, auto, thick]
    \node [block] (Agent) {Agent};
    \node [block, below of=Agent] (Environment) {Environment};
    
     \path [line] (Agent.0) --++ (4em,0em) |- node [near start]{Action $a$} (Environment.0);
     \path [line] (Environment.190) --++ (-6em,0em) |- node [near start] {State  $x$} (Agent.170);
     \path [line] (Environment.170) --++ (-4.25em,0em) |- node [near start, right] {Reward $r$} (Agent.190);
\end{tikzpicture}
\caption{Prinzipielle Darstellung des Reinforcement Learning \cite[400]{Zhou.2021}}
  \label{fig:Reinforcement Learning}
\end{figure}

\subsection{Generalisierung}
\label{sec:Generalisierung}
Ein wichtiges Ziel des Machine Learning ist die Generalisierung des trainierten Modells. Die Fähigkeit mit neuen und unbeobachteten Eingangsdaten möglichst genauso gute Resultate zu erzielen wie mit den Trainingsdaten \cite[121]{Goodfellow.2018}. Daher wird ein geringer Generalisierungsfehler (Testfehler) angestrebt. Hierfür wird der Generalisierungsfehler mit einer Testdatenmenge ermittelt. Diese Testdaten müssen unabhängig von der Trainingsdatenmenge sein \cite[121\psq]{Goodfellow.2018}, da diese als neue, bisher unbeobachtete Daten vorliegen müssen. Die Leistung eines Machine-Learning-Algorithmus wird durch seine Fähigkeiten ausgedrückt,
\begin{itemize}
\item den Trainingsfehler gering zu halten und
\item die Differenz zwischen Trainingsfehler und Testfehler gering zu halten \cite[123]{Goodfellow.2018}.
\end{itemize}

Diese beiden Punkte erläutern die Begriffe Unteranpassung und Überanpassung. Bei Unteranpassung ist das Modell nicht in der Lage, einen ausreichend kleinen Fehlerwert anhand der Trainingsdaten zu erzielen. Hier spricht man auch davon, dass das Modell an einem großen Bias leidet, somit hohe Tendenzen zu bestimmten Entscheidungen aufweist \cite[93\psq]{Raschka.2018}. Der Bias ist ein Maß für den systematischen Fehler oder der Verzerrung, der nicht der Zufälligkeit geschuldet ist \cite[94]{Raschka.2018} und \cite[142\psqq]{Goodfellow.2018}. Auf der anderen Seite bedeutet Überanpassung, wenn die Differenz zwischen Trainingsfehler und Testfehler zu groß ist \cite[123]{Goodfellow.2018}. Hier hat das Modell die Trainingsdaten \dq auswendig gelernt\dq{} und ist nicht in der Lage, die Testdaten zu verallgemeinern. Bei Überanpassung spricht man auch davon, dass das Modell an großer Varianz leidet \cite[93]{Raschka.2018} und \cite[142\psqq]{Goodfellow.2018}. Die Varianz ist ein Maß für die Konsistenz (Veränderlichkeit) der Modellvorhersage für bestimmte Eingangsdaten. Hiermit kann man beurteilen, ob das Modell auf die Zufälligkeit der Trainingsdaten empfindlich reagiert \cite[94]{Raschka.2018}. Die Überanpassung wird auch als Overfitting und die Unteranpassung als Underfitting bezeichnet. \\
Die Kapazität eines Machine-Learning-Modells bestimmt maßgeblich, ob ein Modell zur Unteranpassung oder Überanpassung neigt. Die Kapazität eines Modells drückt die Fähigkeit aus, sich einer Vielzahl von Funktionen anzupassen \cite[123]{Goodfellow.2018}, also der Anzahl der lernbaren Parameter. Modelle mit einer niedrigen Kapazität neigen eher zur Unteranpassung, sie haben Probleme mit der Anpassung an die Trainingsdaten \cite[93, 504\psq]{Raschka.2018}. Modelle mit einer hohen Kapazität neigen eher zur Überanpassung, da sie mehr Speicherkapazität aufweisen und so Muster eher auswendiglernen \cite[123]{Goodfellow.2018}, (siehe Abbildung \ref{fig:Generalisierungsfehler}). 

\begin{figure}[htbp]
	\centering
\begin{tikzpicture}[thick,font=\sffamily,line cap=round,>=stealth,node
    distance=1em]
 \draw [<->] (0,5) node[below left]{Fehler} |- (7,0) node[below left]{Modellkapazität};
 \draw (0.8,5) to[bend right=50] node[pos=0.7,above right] {Trainingsfehler}(6,0.8);
 \draw (1.2,5) to[out=-80,in=180] (3,3) to[out=0,in=-155]
  node[pos=0.2,below right] {Generalisierungsfehler} (6,4);
 \draw[loosely dotted] (3,0) -- (3,5) node[above] (P) {Optimale Kapazität};
 \path node[base left=of P] (U) {Unteranpassung}
    node[base right=of P] (O) {Überanpassung};
 \draw[->] ([yshift=1ex]U.north east) -- ([yshift=1ex]U.north west);
 \draw[->] ([yshift=1ex]O.north west) -- ([yshift=1ex]O.north east);    
\end{tikzpicture} 
\caption{Prinzipielle Darstellung des Generalisierungsfehlers anhand der Modellkomplexität \cite[127]{Goodfellow.2018}}
  \label{fig:Generalisierungsfehler}
\end{figure}

Die statistische Lerntheorie zeigt, dass die Diskrepanz zwischen Trainingsfehler und Generalisierungsfehler mit der Modellkapazität wächst, aber sinkt, wenn die Anzahl der Trainingsdaten zunimmt \cite[126]{Goodfellow.2018}. \\
Um Unteranpassung zu vermeiden, wird daher die Modellkapazität erhöht, somit die lernbaren Parameter erhöht \cite[93, 504\psq]{Raschka.2018}. \\
Um Überanpassung zu vermeiden, werden unter anderem Strategien angewendet, die die Modellkapazität verringern. Eine dieser Methoden ist die L2-Regularisierung, auch Weight Decay genannt \cite[131]{Goodfellow.2018}. Die  Grundidee ist dabei, zusätzliche Informationen (Bias) als Strafterm einzuführen, um extreme Parameter, also Parameter mit hohen Gewichtungen, zu bestrafen beziehungsweise zu verringern \cite[94]{Raschka.2018}, \cite[131]{Goodfellow.2018}. 


\subsection{Hyperparameter und Validierung}
Hyperparameter sind Einstellparameter, die das Verhalten des Lernalgorithmus steuern. Beispiele für Hyperparameter sind die Modellkapazität und der \gls{symb:Lambda}-Wert für den Weight Decay \cite[133]{Goodfellow.2018}. Die Hyperparameter werden nicht vom Lernalgorithmus selbst angepasst. Würden die Hyperparameter anhand der Trainingsdaten erlernt, würde stets die Modellkapazität zunehmen und würde so zur Überanpassung des Modells führen \cite[133]{Goodfellow.2018}. Daher wird zur Einstellung der Hyperparameter ein weiterer Datensatz herangezogen, der die Validierungsdatenmenge enthält \cite[134]{Goodfellow.2018}. Somit gibt es drei Datensätze im Machine Learning: 
\begin{itemize}
\item den Trainingsdatensatz zum Einstellen der lernbaren Parameter (Gewichte, Bias)
\item den Validierungsdatensatz zum Einstellen der Hyperparameter und somit der Modellkapazität und zum Schätzen des Generalisierungsfehlers
\item den Testdatensatz zum Schätzen des Generalisierungsfehlers des endgültig fertigtrainierten Modells
\end{itemize}
Es darf kein Beispiel aus der Testdatenmenge in der Validierungsdatenmenge enthalten sein und die Validierungsdatenmenge wird immer aus der Trainingsdatenmenge entnommen \cite[134]{Goodfellow.2018}. Eine mögliche Aufteilung der Daten könnte etwa aus 80 Prozent der Trainingsdaten für das Training und 20 Prozent der Trainingsdaten für die Validierung bestehen \cite[134]{Goodfellow.2018}. \\
Neben einer festen Aufteilung in Trainingsdaten und Testdaten gibt es noch die Kreuzvalidierung, wenn die Testdatenmenge klein ist. Eine kleine Testdatenmenge impliziert eine statistische Unsicherheit für den geschätzten durschschnittlichen Testfehler \cite[135]{Goodfellow.2018}. Um dies zu verbessern, teilt die Kreuzvalidierung die Daten in \textit{k} Teilmengen ohne Überschneidung. Der Testfehler wird dann über \textit{k} Versuche mit der \textit{i}-te Teilmenge als Testdatenmenge geschätzt. Dieses Verfahren entspricht der \textit{k}-fachen Kreuzvalidierung \cite[135]{Goodfellow.2018}, (siehe Abbildung \ref{fig:Kreuzvalidierung}).


\begin{figure}[htbp]
	\centering
\begin{tikzpicture}[node distance=0mm,minimum height=1cm,outer sep=3mm,scale=0.5,>=Latex,font=\footnotesize,
  indication/.style={minimum height=0cm,outer sep=0mm},
  oneblock/.style={transform shape,minimum width=1cm,draw},
  fullset/.style={transform shape,minimum width=10cm,draw}]
    % left part of picture
    \node[fullset,anchor=west] at (0,0) (A) {};
    \node[above=of A.north,indication] (ATXT) {TRAINING SET};
    \node[oneblock,minimum width=2cm,anchor=west,right=of A,fill=lightgray,outer sep=0mm] (A1) {};
    \path (ATXT) -| (A1) node[midway] {TEST SET};
    \node[fullset,anchor=west] at (0,-4) (B) {};
    \foreach \x in {0,1,...,9}
    {
        \draw (B.west) +(\x,0) node[oneblock,anchor=west,draw] {};
    }
    \draw[->] (A) -- (B) node[midway,fill=white,indication] {Aufteilung in 10 gleich große Teilmengen (k=10)};

    % right part of picture
    \begin{scope}[xshift=15cm,scale=0.4,local bounding box=rightside box]
    \foreach \x in {0,1}
    {
        \foreach \y in {0,1,...,4}
        {
            \draw (\x*11,0) +(0,-\y*2) node[fullset,anchor=west] {};
            \draw (\x*11,0) +(\x*5+\y,-\y*2) node[oneblock,draw,anchor=west,fill=lightgray] {};
        }
    }
    \coordinate (R) at (rightside box.west);
    \end{scope}

    % connecting arrow
    \draw[->] (B.east) -- +(2.5,0) node[below,align=center,indication] {\\\\Training- und Testläufe\\bei 10 unterschiedlichen\\Teilmengen\\des Datensatzes} |- (R);
  \end{tikzpicture}
  \caption{Prinzipielle Darstellung der k-fach Kreuzvalidierung \cite[135]{Goodfellow.2018} und \cite[207]{Raschka.2018}}
  \label{fig:Kreuzvalidierung}
\end{figure}

\FloatBarrier

\subsection{Maximum-Likelihood-Schätzung}
\label{sec:MaximumLikelihood}
Die Maximum-Likelihood-Schätzung dient der Bestimmung der Kostenfunktion eines Machine-Learning-Algorithmus und somit der Ableitung einer Funktion zu einem guten Schätzer \cite[145]{Goodfellow.2018}. Ziel ist es mit der Maximum-Likelihood-Schätzung die Parameter \gls{ParametrisierteGewichte} für die beste beziehungsweise höchste Vorhersagewahrscheinlichkeit zu bestimmen \cite[145]{Goodfellow.2018}, \cite[85]{Raschka.2018}. Für eine bessere Optimierung wird der Logarithmus der Likelihood (Log-Likelihood) für die arg max-Funktion verwendet \cite[145]{Goodfellow.2018}, \cite[85]{Raschka.2018}. Formel \ref{eq:formelMaximumLikelihoodMLLog} zeigt wie der Maximum-Likelihood-Schätzer zum Schätzwert einer bedingten Wahrscheinlichkeit \ensuremath{P(\boldsymbol{y}\mid\boldsymbol{x};\boldsymbol{\theta})} für ein Machine-Learning-Modell genutzt werden kann, um aus \ensuremath{\boldsymbol{x}} die Zielwerte \ensuremath{\boldsymbol{y}} vorherzusagen \cite[147]{Goodfellow.2018}.

\begin{align}
	\boldsymbol{\theta}_{\mathrm{ML}}\:{=}\: \underset{\boldsymbol{\theta}}{\mathrm{arg \: max}} \: \sum_{i=1}^{m} \mathrm{log} \: P(\boldsymbol{y}^{(i)}\mid\boldsymbol{x}^{(i)};\boldsymbol{\theta})
    \label{eq:formelMaximumLikelihoodMLLog}
\end{align}

Die Maximierung der Log-Likelihood nach Formel \ref{eq:formelMaximumLikelihoodMLLog} bewirkt eine Minimierung der Kostenfunktion eines Machine-Learning-Modells. Zum Beispiel ergibt sich aus Formel \ref{eq:formelMaximumLikelihoodMLLog} für ein Machine-Learning-Modell einer linearen Regression als Kostenfunktion der \gls{MQF} \cite[148]{Goodfellow.2018}. Der \gls{MQF} ist die Kreuzentropie zwischen einer empirischen Verteilung und einer gaußschen Verteilung als Modellverteilung \cite[146]{Goodfellow.2018}. Bei der Klassifikation ergibt sich aus der Maximum Likelihood als Kostenfunktion die Kreuzentropie, die die Unterschiedlichkeit (Divergenz) zweier Wahrscheinlichkeitsverteilungen über dieselben Zufallsvariablen aufzeigt \cite[80]{Goodfellow.2018}, \cite[81\psq]{Goodfellow.2018}. Die Maximum Likelihood versucht die Modellverteilung an die empirische Verteilung, die durch die Trainingsdaten definiert ist, anzugleichen, indem die Divergenz der zwei Wahrscheinlichkeitsverteilungen minimiert wird \cite[146]{Goodfellow.2018}. Somit entspricht die Maximum-Likelihood der Minimierung der Kostenfunktion beziehungsweise Minimierung der Kreuzentropie (negative Log-Likelihood) und es ergibt sich die selbe Stelle des Optimums für die Parameter des Modells \cite[148]{Goodfellow.2018}. \\
Einer der wichtigsten Eigenschaften der Maximum-Likelihood-Schätzung ist, dass bei wachsender Anzahl an Beispielen (Trainingsdaten) sich dieser Ansatz als  bester Schätzer in Bezug auf Konvergenz ergibt. Im Fall einer unendlichen Anzahl an Trainingsbeispielen konvergiert der Maximum-Likelihood-Schätzer eines Parameters zum wahren Parameterwert \cite[148]{Goodfellow.2018}. 


\subsection{Stochastisches Gradientenabstiegsverfahren}
\label{sec:StochastischesGradientenabstiegsverfahren}
Im vorherigen Unterkapitel \ref{sec:MaximumLikelihood} ging es um die Bestimmung der Kostenfunktion (Verlustfunktion) eines Machine-Learning-Algorithmus. Ziel des Lernalgorithmus ist es nun, diese Verlustfunktion mit der Einstellung der Parameter zu minimieren. Da es sich bei Machine-Learning-Modellen meistens um mehrdimensionale Funktionen handelt, kann nur über die iterative Berechnung von Gradienten auf lokale oder globale Minima der Funktion geschlossen werden. Um diese Extremstellen zu erreichen bewegt sich der Lernalgorithmus dem Gradienten abwärts \cite[168]{Goodfellow.2018} in Richtung der Minima. Formel \ref{eq:formelVerlustNegativeLogLikelihoodML} zeigt den Verlust pro Beispiel aus dem Trainingsdatensatz anhand der negativen Log-Likelihood. Formel \ref{eq:formelLKostenfunktion} zeigt die Kostenfunktion (Verlustfunktion).

\begin{align}
	L(\boldsymbol{x},\boldsymbol{y},\boldsymbol{\theta})\:{=}\:-\mathrm{log} \: p(\boldsymbol{y}\mid\boldsymbol{x};\boldsymbol{\theta})
    \label{eq:formelVerlustNegativeLogLikelihoodML}
\end{align}

\begin{align}
	J(\boldsymbol{\theta})\:{=}\:\frac{1}{m}\sum_{i=1}^{m} L(\boldsymbol{x}^{(i)},\boldsymbol{y}^{(i)},\boldsymbol{\theta})
    \label{eq:formelLKostenfunktion}
\end{align}

Der Gradient der Kostenfunktion zeigt Formel \ref{eq:formelGradientML}. Bei Verwendung der Formel \ref{eq:formelGradientML} wird der ganze Trainingsdatensatz als Batch zur Berechnung des Gradientenabstiegs verwendet. Dies führt zu einer unverhältnismäßig langen Berechnung jedes Gradientenschritt \cite[168]{Goodfellow.2018}. 

\begin{align}
	\nabla_{\boldsymbol{\theta}}J(\boldsymbol{\theta})\:{=}\:\frac{1}{m}\sum_{i=1}^{m} \nabla_{\boldsymbol{\theta}} L(\boldsymbol{x}^{(i)},\boldsymbol{y}^{(i)},\boldsymbol{\theta})
    \label{eq:formelGradientML}
\end{align}


Anhand des \gls{SGD} ist der Gradient ein Erwartungswert und kann anhand einer kleinen Teilmenge der Trainingsdaten näherungsweise geschätzt werden. Diese Teilmengen der Trainingsdaten werden als Mini-Batch bezeichnet. Die Mini-batch-Größe \gls{Minibatch} wird relativ klein gewählt für eine schnelle inkrementelle Berechnung des Gradienten \cite[168]{Goodfellow.2018}. Der Schätzwert des Gradienten anhand des Mini-Batch zeigt Formel \ref{eq:formelGradientMiniBatch} \cite[168]{Goodfellow.2018}, \cite[66]{Raschka.2018}.

\begin{align}
	\boldsymbol{g}\:{=}\:\frac{1}{m'} \nabla_{\boldsymbol{\theta}} \sum_{i=1}^{m'} L(\boldsymbol{x}^{(i)},\boldsymbol{y}^{(i)},\boldsymbol{\theta})
    \label{eq:formelGradientMiniBatch}
\end{align}

Das stochastische Gradientenabstiegsverfahren folgt dann dem geschätzten Gradienten \gls{GeschaetzterGradient} abwärts anhand der Formel \ref{eq:formelGradientStochasticDescent} und der Lernrate \gls{Lernrate} \cite[168]{Goodfellow.2018}. Nach jedem Mini-Batch werden die Parameter (Gewichte, Bias) des Machine Learning-Modells angepasst, damit sich die Kostenfunktion dem globalen Minimum annähert.

\begin{align}
	\boldsymbol{\theta} \leftarrow \boldsymbol{\theta} - \varepsilon \boldsymbol{g}
    \label{eq:formelGradientStochasticDescent}
\end{align}

Häufig wird eine adaptive Lernrate bevorzugt, die im Laufe der Zeit sinkt \cite[66]{Raschka.2018}, hier wird noch später tiefer darauf eingegangen. Zudem ist es wichtig, dass die Teilmengen der Trainingsbeispiele in zufälliger Reihenfolge bereitgestellt werden \cite[66]{Raschka.2018}. Das stochastische Gradientenabstiegsverfahren erreicht nicht das globale Minimum, kommt ihm aber sehr nahe, vor allem mit dem Einsatz der adaptiven Lernrate \cite[67]{Raschka.2018}. 



\section{Künstliche tiefe neuronale Netze}
\label{sec:tiefeNetze}
Dieses Kapitel stellt die Umsetzung der Machine-Learning-Algorithmen als tiefe neuronale Netze für die parametrische Funktionsapproximation \cite[184]{Goodfellow.2018} vor. Am Anfang werden die tiefen Feedforward-Netze vorgestellt, im weiteren Verlauf die \gls{CNN}, sowie fortgeschrittene Verfahren der Regularisierung und Optimierung.

\subsection{Tiefe Feedforward-Netze}
Tiefe Feedforward-Netze werden auch als mehrschichtige Perzeptren (\gls{MLP}) bezeichnet \cite[185]{Goodfellow.2018}. Sie dienen dazu, eine Funktion zu approximieren, in dem sie eine Zuordnung \ensuremath{\boldsymbol{y}\:{=}\: f(\boldsymbol{x};\boldsymbol{\theta})} definiert und den Wert der Parameter  
\ensuremath{\boldsymbol{\theta}} für die beste Funktionsapproximation lernt. \ensuremath{\boldsymbol{x}} steht für die Eingaben und \ensuremath{\boldsymbol{y}} für die dazugehörigen Kategorien \cite[185]{Goodfellow.2018}. Der Begriff Feedforward beschreibt, dass in diesen Netzen die Verarbeitungsrichtung der Informationen vom Eingang bis zum Ausgang des Netzes festgelegt ist. Es gibt auch neuronale Netze mit Rückkopplungen. Diese werden als \gls{RNN} bezeichnet und für die Verarbeitung zeitlicher Abfolgen oder der natürlichen Sprache eingesetzt \cite[184]{Goodfellow.2018}, \cite[185]{Goodfellow.2018}. Feedforward-Netze werden als Netze bezeichnet, da sie aus vielen verschiedenen Schichten bestehen. Diese Schichten wiederum bestehen aus mehreren künstlichen Neuronen. Es gibt die Eingabeschicht (Input layer), die verdeckten Schichten (Hidden layer) und die Ausgabeschicht (Output layer) \cite[185-194]{Goodfellow.2018} und \cite[387-392]{Raschka.2018}. In Abbildung \ref{fig:Neuronales Netz} ist ein \gls{MLP} dargestellt. Ein \gls{MLP} kann aus beliebig vielen Schichten bestehen. Besitzt ein Netz mehr als eine verdeckte Schicht, handelt es sich um ein tiefes künstliches neuronales Netz \cite[387]{Raschka.2018}. Ein einzelnes Neuron wird als Perzeptron bezeichnet oder als einschichtiges neuronales Netz \cite[42\psq]{Raschka.2018} und \cite[385\psq]{Raschka.2018} (siehe Abbildung \ref{fig:Neuron}).



\begin{figure}[htbp]
	\centering
	\begin{tikzpicture}[
init/.style={
  draw,
  circle,
  inner sep=2pt,
  font=\Huge,
  join = by -latex
},
squa/.style={
  draw,
  inner sep=2pt,
  font=\Large,
  join = by -latex
},
start chain=2,node distance=18mm
]
\node[on chain=2] 
  (x2) {$x_2$};
\node[on chain=2,join=by o-latex] 
  {$w_2$};
\node[on chain=2,init] (sigma) 
  {$\displaystyle\Sigma$};
\node[on chain=2,squa,label=above:{\parbox{2cm}{\centering Aktivierungs-funktion}}]   
  {$g$};
\node[on chain=2,label=above:Ausgabe,join=by -latex] 
  {$y$};
\begin{scope}[start chain=1]
\node[on chain=1] at (0,1.5cm) 
  (x1) {$x_1$};
\node[on chain=1,join=by o-latex] 
  (w1) {$w_1$};
\end{scope}
\begin{scope}[start chain=3]
\node[on chain=3] at (0,-1.5cm) 
  (x3) {$x_3$};
\node[on chain=3,join=by o-latex] 
  (w3) {$w_3$};
\end{scope}

\begin{scope}[start chain=4]
\node[on chain=4] at (0,-2.25) (dots) {$\vdots$} -- (dots);
\end{scope}

\begin{scope}[start chain=5]
\node[on chain=5] at (0,-3.0cm) 
  (x4) {$x_n$};
\node[on chain=5,label=below:Weights,join=by o-latex] 
  (w4) {$w_n$};
\end{scope}


\node[label=above:\parbox{2cm}{\centering Bias \\ $b$}] at (sigma|-w1) (b) {};

\draw[-latex] (w1) -- (sigma);
\draw[-latex] (w3) -- (sigma);
\draw[-latex] (w4) -- (sigma);
\draw[o-latex] (b) -- (sigma);

\draw[decorate,decoration={brace,mirror}] (x1.north west) -- node[left=10pt] {Eingaben} (x4.south west);
\end{tikzpicture}
	\caption{Prinzipielle Darstellung eines k\"unstlichen Neuron \cite[105]{Zhou.2021}}
  \label{fig:Neuron}
\end{figure}


\tikzset{%
  every neuron/.style={
    circle,
    draw,
    minimum size=1cm
  },
  neuron missing/.style={
    draw=none, 
    scale=4,
    text height=0.333cm,
    execute at begin node=\color{black}$\vdots$
  },
  every dotH/.style={
    draw=none, 
    scale=4,
    execute at begin node=\color{black}$\ldots$
  },
}

\begin{figure}[htbp]
\centering
\begin{tikzpicture}[x=1.5cm, y=1.5cm, >=stealth]

\foreach \m/\l [count=\y] in {1,2,3,missing,4}
  \node [every neuron/.try, neuron \m/.try] (input-\m) at (0,2.5-\y) {};

\foreach \m [count=\y] in {1,missing,2}
  \node [every neuron/.try, neuron \m/.try ] (hidden-\m) at (2,2-\y*1.25) {};
  
\foreach \m [count=\y] in {1,2,3}
  \node [every dotH/.try, dotH \m/.try ] (hidden2-\m) at (4,2-\y*1.25) {};
  
\node [every dotH/.try, dotH 1/.try ] (hidden3-1) at (4,1.9) {};

\foreach \m [count=\y] in {1,missing,2}
  \node [every neuron/.try, neuron \m/.try ] (output-\m) at (6,1.5-\y) {};

\foreach \l [count=\i] in {1,2,3,n}
  \draw [<-] (input-\i) -- ++(-1,0)
    node [above, midway] {$x_\l$};

\foreach \l [count=\i] in {1,n}
  \node [above] at (hidden-\i.north) {$h_\l$};

\foreach \l [count=\i] in {1,n}
  \draw [->] (output-\i) -- ++(1,0)
    node [above, midway] {$y_\l$};

\foreach \i in {1,...,4}
  \foreach \j in {1,...,2}
    \draw [->] (input-\i) -- (hidden-\j) node[midway,sloped,above] {$w^1_{i,j}$};
    
\foreach \i in {1,...,2}
  \foreach \j in {1,...,3}
    \draw [->] (hidden-\i) -- (hidden2-\j) node[midway,sloped,above] {$w^2_{i,j}$};

\foreach \i in {1,...,3}
  \foreach \j in {1,...,2}
    \draw [->] (hidden2-\i) -- (output-\j) node[midway,sloped,above] {$w^l_{i,j}$};

\foreach \l [count=\x from 0] in {Eingabe-\\ schicht \\ \ensuremath{1}-te Schicht, Verdeckte-\\ schicht \\ \ensuremath{2}-te Schicht, Verdeckte-\\ schichten, Ausgabe-\\ schicht \\ \ensuremath{l}-te Schicht}
  \node [align=center, above] at (\x*2,2) {\l };
  \node[circle, draw] (b1) at (1,2) {b};
  \draw[->]  (b1) -- (hidden-1);
  \draw[->]  (b1) -- (hidden-2);
  
  \node[circle, draw] (b2) at (3,2) {b};
  \draw[->]  (b2) -- (hidden2-1);
  \draw[->]  (b2) -- (hidden2-2);
  \draw[->]  (b2) -- (hidden2-3);

  \node[circle, draw] (b3) at (5,2) {b};
  \draw[->]  (b3) -- (output-1);
  \draw[->]  (b3) -- (output-2);

\end{tikzpicture}
\caption{Prinzipielle Darstellung eines \gls{MLP} \cite[191]{Goodfellow.2018}, \cite[387-389]{Raschka.2018}}
  \label{fig:Neuronales Netz}
\end{figure}

Wie in Abbildung \ref{fig:Neuron} und \ref{fig:Neuronales Netz} dargestellt ist, werden die Eingaben mit sogenannten Gewichtungen multipliziert und die einzelnen Werte mit einem Bias summiert. Die Summe dient dann als Eingabe für die Aktivierungsfunktion, die letztlich darüber entscheidet, ob und wie ein Neuron seine Ausgabe ausgibt, beziehungsweise wie die Informationen weitergegeben werden. Der Bias wird auch Verzerrung oder Nullgewichtung genannt und hat die Größe des negativen Schwellwert der Aktivierungsfunktion \cite[43]{Raschka.2018}, \cite[105]{Zhou.2021}. Formel \ref{eq:formelNeuron} zeigt die mathematische Formel des Perzeptron \cite[43]{Raschka.2018}, \cite[105]{Zhou.2021}, \cite[192]{Goodfellow.2018}. \gls{Aktivierungsfunktion} steht hier für die Aktivierungsfunktion, \gls{Biassymbol} für den Bias. 

\begin{align}
	y\:{=}\:g\bigl(\sum_{i=1}^{n} \boldsymbol{x}_i \boldsymbol{w}_i + b\bigl) \: {=}\: g(\boldsymbol{w}^\top \boldsymbol{x} + b)
    \label{eq:formelNeuron}
\end{align}

Um ein komplettes Feedforward-Netz mathematisch darzustellen braucht es mehrere Formeln \cite[391\psq]{Raschka.2018}. Zur Illustration wird ein dreischichtiges \gls{MLP} mit \ensuremath{l{=}3} im Folgenden verwendet. \gls{GesamtLayer} steht für die Gesamtanzahl der Schichten des Netzes.

\begin{align}
	\boldsymbol{a}^{(l-1)}\:{=}\:g\bigl(\boldsymbol{W}^{\top(l-2)}\boldsymbol{x}+\boldsymbol{b}^{(l-2)}\bigl)
    \label{eq:formelMLPInput}
\end{align}

\begin{align}
	\boldsymbol{a}^{(l)}\:{=}\:g\bigl(\boldsymbol{W}^{\top(l-1)}\boldsymbol{a}^{(l-1)}+\boldsymbol{b}^{(l-1)}\bigl)
    \label{eq:formelMLPHidden}
\end{align}

\begin{align}
	\boldsymbol{y}\:{=}\:g\bigl(\boldsymbol{W}^{\top(l)}\boldsymbol{a}^{(l)}+\boldsymbol{b}^{(l)}\bigl)
    \label{eq:formelMLPOutput}
\end{align}

In Formel \ref{eq:formelMLPInput} steht \ensuremath{\boldsymbol{x}} für den Eingangsvektor und \ensuremath{\boldsymbol{b}^{(l-2)}} für den Biasvektor der ersten Schicht (Eingangsschicht). \ensuremath{\boldsymbol{W}^{\top(l-2)}} ist die erste Gewichtsmatrix zur Verknüpfung der ersten Schicht (Eingangsschicht) zur zweiten Schicht (erste verdeckte Schicht), bei der die Spalten die Anzahl der Einheiten (Neuronen plus Bias) in der verdeckten Schicht angibt \cite[392]{Raschka.2018}. Grundsätzlich werden die Gewichtsmatrizen als \ensuremath{\boldsymbol{W}^{(l)}_{i, j}} dargestellt \cite[388]{Raschka.2018}. \ensuremath{l} bezeichnet bei dieser Notation die aktuelle Schicht im Netz. \gls{GesamtLayer} steht in dieser Arbeit für die Gesamtzahl der vorhandenen Schichten, inklusive Eingangs- und Ausgangsschicht. Da hier \ensuremath{l=3} gewählt wurde fängt die erste Gewichtsmatrix bei \ensuremath{l-2} an und erhöht sich dann um jeweils +1 bis zur Gesamtzahl der Schichten. \gls{Aktivierungsfunktion} steht für die Aktivierungsfunktion und wird elementweise angewendet \cite[192]{Goodfellow.2018}. Formel \ref{eq:formelMLPInput} berechnet aus der Eingabe mit den Gewichtungen und Bias der ersten Schicht, die Aktivierungen für die zweite Schicht \cite[391]{Raschka.2018}. \\
In Formel \ref{eq:formelMLPHidden} werden dann die Aktivierungen für die Ausgabeschicht berechnet und Formel \ref{eq:formelMLPOutput} berechnet dann die Ausgabe \ensuremath{\boldsymbol{y}} \cite[392]{Raschka.2018}.

\subsection{Aktivierungsfunktionen}
In modernen neuronalen Netzen wird als Aktivierungsfunktion die \gls{ReLU} verwendet \cite[192]{Goodfellow.2018}. Wie in Abbildung \ref{fig:ReLU} und Formel \ref{eq:formelReLU} zu sehen ist, ist die \gls{ReLU}-Funktion eine stückweise lineare Funktion mit zwei linearen Abschnitten und sorgt so für eine nichtlineare Transformation. Im Gegensatz dazu helfen die linearen Abschnitte der Funktion für eine gute Differenzierbarkeit für das Gradientenabstiegsverfahren \cite[192]{Goodfellow.2018}. Die eine Hälfte des Definitionsbereichs ergibt Null. Die andere Hälfte des Definitionsbereichs, sofern aktiv, ergibt bei der 1. Ableitung die Steigung 1 \cite[213]{Goodfellow.2018}.

\begin{align}
	{y}\:{=}\:g(x) \: {=}\:\mathrm{max}(0, x)
    \label{eq:formelReLU}
\end{align}

\begin{figure}[htbp]
\centering
\begin{tikzpicture}
\begin{axis}[
    axis lines=middle,
    xmax=6,
    xmin=-6,
    ymin=-0.05,
    ymax=5.05,
    xlabel={$x$},
    ylabel={$y$}]
\addplot [domain=-5.5:5.5, samples=100, thick, blue] {max(0, x)};
\end{axis}
\end{tikzpicture}
\caption{Plot der \gls{ReLU}-Funktion \cite[192]{Goodfellow.2018}}
  \label{fig:ReLU}
\end{figure}

Eine weitere häufig vorkommende Aktivierungsfunktion ist die Sigmoidfunktion, auch logistische Sigmoidfunktion genannt \cite[391]{Raschka.2018}, \cite[215]{Goodfellow.2018}, \cite[74]{Goodfellow.2018}. Diese zeichnet sich durch eine durchgehende Differenzierbarkeit aus. Ein Nachteil ist aber die Sättigung im Großteil des Definitionsbereichs, also in den Bereichen, bei dem die 1. Ableitung gegen Null geht und sich damit als großes Problem für das Lernen auf Gradientenbasis erweist \cite[215]{Goodfellow.2018}. Abbildung \ref{fig:Sigmoid} und Formel \ref{eq:formelSigmoid} zeigen die Sigmoidfunktion \cite[390\psq]{Raschka.2018}, \cite[74]{Goodfellow.2018}. Sigmoidfunktionen werden bei binären Klassifikationen als Ausgabeeinheit, \gls{RNN}'s und vielen probabilistischen Modellen eingesetzt \cite[215\psq]{Goodfellow.2018}. Der Grund hierfür ist, dass die Ausgabe der Sigmoidfunktion eine Bernoulli-Verteilung ist und daher ihr Wertebereich im Intervall [0, 1] liegt \cite[74]{Goodfellow.2018}.


\begin{align}
	{y}\:{=}\:g(x) \: {=}\:\frac{1}{1+e^{(-x)}}
    \label{eq:formelSigmoid}
\end{align}


\begin{figure}[htbp]
\centering
\begin{tikzpicture}
\begin{axis}[
    axis lines=middle,
    xmax=10,
    xmin=-10,
    ymin=-0.05,
    ymax=1.05,
    xlabel={$x$},
    ylabel={$y$}
]
\addplot [domain=-9.5:9.5, samples=100,
          thick, blue] {1/(1+exp(-x)};
\end{axis}
\end{tikzpicture}
\caption{Plot der Sigmoid-Funktion \cite[391]{Raschka.2018}}
  \label{fig:Sigmoid}
\end{figure}

Eine weitere wichtige Aktivierungsfunktion für die Ausgabeeinheiten ist die softmax-Funktion. Diese Funktion bietet eine Wahrscheinlichkeitsverteilung über \ensuremath{n} möglichen Werten. Daher werden softmax-Funktionen meist als Ausgabe eines Klassifikators benutzt, um eine Wahrscheinlichkeitsverteilung über \ensuremath{n} Ausgabeneuronen, die die \ensuremath{n} verschiedenen Klassen repräsentieren, darzustellen \cite[203]{Goodfellow.2018}. Dies wird auch als Multinoulli-Verteilung bezeichnet \cite[203]{Goodfellow.2018}. Seltener werden softmax-Funktionen im Modell selbst verwendet \cite[203]{Goodfellow.2018}. Die softmax-Funktion ist stetig und differenzierbar \cite[206]{Goodfellow.2018}. Die Formel \ref{eq:formelSoftmax} zeigt die softmax-Funktion wobei \ensuremath{z_i \:{=}\: \mathrm{log} \:\overset{\sim}{P}(y=i \:\vert \:\boldsymbol{x})} ist \cite[204]{Goodfellow.2018}. 


\begin{align}
	\mathrm{softmax}(\boldsymbol{z})_i\:{=}\:\frac{e^{(z_i)}}{\sum_je^{(z_j)}}
    \label{eq:formelSoftmax}
\end{align}


Es existieren noch viele weitere Aktivierungsfunktionen wie die einfache Sprungfunktion, die auch Heaviside-Funktion genannt wird \cite[43]{Raschka.2018}, die Tangens hyperbolicus-Funktion \cite[215]{Goodfellow.2018} sowie verschiedene Versionen der \gls{ReLU} wie die Softplus-Funktion \cite[217]{Goodfellow.2018} und die ReLU6-Funktion \cite{Sandler}, siehe Abbildung \ref{fig:ReLU6}.

\begin{figure}[htbp]
\centering
\begin{tikzpicture}
\begin{axis}[
    axis lines=middle,
    xmax=10,
    xmin=-6,
    ymin=-0.05,
    ymax=6.05,
    xlabel={$x$},
    ylabel={$y$}]
\addplot [domain=-5.5:6, samples=100, thick, blue] {max(0, x)};
\addplot [domain=6:10, samples=100, thick, blue] {6};
\end{axis}
\end{tikzpicture}
\caption{Plot der \gls{ReLU}6-Funktion \cite{Sandler}}
  \label{fig:ReLU6}
\end{figure}

\FloatBarrier

\subsection{Backpropagation}
Der Backpropagation-Algorithmus dient der Berechnung des Gradienten der Kostenfunktion von der Kostenseite rückwärts durch das neuronale Netz \cite[225]{Goodfellow.2018}. Der Gradient ist für das stochastische Gradientenabstiegsverfahren während des Trainings notwendig \cite[225]{Goodfellow.2018} (siehe Formel \ref{eq:formelGradientMiniBatch} und \ref{eq:formelGradientStochasticDescent}). Um den Gradienten der Kostenfunktion bezüglich der Parameter (Gewichte und Bias) zu berechnen, werden die partiellen Ableitungen nach der Kettenregel gebildet. Sowie eine rekursive Anwendung der Kettenregel, um die Backpropagation zu erreichen \cite[228\psqq]{Goodfellow.2018}. Eine tiefere Betrachtung der Backpropagation würde den Rahmen dieser Arbeit sprengen. Für Interessierte wird auf die Literaturquelle \cite[225-248]{Goodfellow.2018} und \cite[415-418]{Raschka.2018} verwiesen.


\subsection{Regularisierung}
Ein Machine-Learning-Modell muss häufig regularisiert werden, damit eine Überanpassung (Overfitting) vermieden wird. Dazu wird die Modellkapazität angepasst. Die Regularisierung dient der Abstimmung zwischen Verzerrung und Varianz und kann diese regeln. Im Folgenden werden einige Regularisierungsmethoden vorgestellt. 

\subsubsection{Parameter-Norm-Strafterme L2- und L1-Regularisierung}
Parameter-Norm-Strafterme dienen dazu, die Kapazität des Modells anhand der Verringerung großer Gewichte einzuschränken. Ein Parameter-Norm-Strafterm \gls{ParameterNormStrafterm} bestraft nur die Gewichte der einzelnen Schichten, die Verzerrungen (Bias) werden nicht regularisiert \cite[255]{Goodfellow.2018}.
Eine häufige Regularisierung ist die L2-Regularisierung, auch Weight Decay genannt, die die quadrierte Summe der Gewichtungen bildet. Formel \ref{eq:formelL2Regularisierung} zeigt den Regularisierungsterm \cite[256]{Goodfellow.2018}.


\begin{align}
	\Omega(\boldsymbol{\theta})\:{=}\:\frac{1}{2}\parallel \boldsymbol{w} \parallel_2^2 \:{=}\: \frac{1}{2} \boldsymbol{w}^\top \boldsymbol{w}
    \label{eq:formelL2Regularisierung}
\end{align}

Für die Gesamtzielfunktion wird der Regularisierungsterm, multipliziert mit dem Regularisierungsparameter \gls{symb:Lambda}, zur Kostenfunktion hinzuaddiert, siehe Formel \ref{eq:formelL2RegularisierungGesamtzielfunktion}, \cite[256]{Goodfellow.2018}. Der entsprechende Gradient anhand der Gewichte dazu wird in Formel \ref{eq:formelL2RegularisierungGesamtzielfunktionGradient} gezeigt, \cite[256]{Goodfellow.2018}.


\begin{align}
	\overset{\sim}{J}(\boldsymbol{w}, \boldsymbol{b}; \boldsymbol{X}, \boldsymbol{y})\:{=}\:\frac{\lambda}{2} \boldsymbol{w}^\top \boldsymbol{w} + J(\boldsymbol{w}, \boldsymbol{b}; \boldsymbol{X}, \boldsymbol{y})
    \label{eq:formelL2RegularisierungGesamtzielfunktion}
\end{align}

\begin{align}
	\nabla_{\boldsymbol{w}}\overset{\sim}{J}(\boldsymbol{w}, \boldsymbol{b}; \boldsymbol{X}, \boldsymbol{y})\:{=}\:\ \lambda \boldsymbol{w} + \nabla_{\boldsymbol{w}}J(\boldsymbol{w}, \boldsymbol{b}; \boldsymbol{X}, \boldsymbol{y})
    \label{eq:formelL2RegularisierungGesamtzielfunktionGradient}
\end{align}

Für einen einzelnen Gradientenschritt im Gradientenabstiegsverfahren wird Formel \ref{eq:formelL2RegularisierungGesamtzielfunktionGradientenschritt} verwendet \cite[257]{Goodfellow.2018}. Der Gewichtsvektor wird hier bei jedem Schritt multiplikativ um einen konstanten Faktor verringert \cite[257]{Goodfellow.2018}.

\begin{align}
\boldsymbol{w} \leftarrow \boldsymbol{w} - \varepsilon (\lambda \boldsymbol{w} + \nabla_{\boldsymbol{w}}J(\boldsymbol{w}, \boldsymbol{b}; \boldsymbol{X}, \boldsymbol{y}))
    \label{eq:formelL2RegularisierungGesamtzielfunktionGradientenschritt}
\end{align}


Eine Abwandlung der L2-Regularisierung ist die L1-Regularisierung, siehe Formel \ref{eq:formelL1Regularisierung}, \cite[260]{Goodfellow.2018}. Die dazugehörige Anwendung an die Kostenfunktion wird in Formel \ref{eq:formelL1RegularisierungGesamtzielfunktion}, der Gradient in Formel \ref{eq:formelL1RegularisierungGesamtzielfunktionGradient} dargestellt, \cite[260]{Goodfellow.2018}. Wobei \ensuremath{\mathrm{sign}(\boldsymbol{w})} das elementweise angewandte Vorzeichen von \gls{Gewichtsvektor} ist \cite[260]{Goodfellow.2018}. Im Vergleich zur L2-Regularisierung ist die Regularisierung bei der L1-Regularisierung nicht mehr linear, sondern eine Konstante mit einem Vorzeichen \cite[260]{Goodfellow.2018}. 

\begin{align}
	\Omega(\boldsymbol{\theta})\:{=}\:\parallel \boldsymbol{w} \parallel_1 \:{=}\: \sum_i \mid w_i \mid
    \label{eq:formelL1Regularisierung}
\end{align}


\begin{align}
	\overset{\sim}{J}(\boldsymbol{w}, \boldsymbol{b}; \boldsymbol{X}, \boldsymbol{y})\:{=}\:\lambda \parallel \boldsymbol{w} \parallel_1 + J(\boldsymbol{w}, \boldsymbol{b}; \boldsymbol{X}, \boldsymbol{y})
    \label{eq:formelL1RegularisierungGesamtzielfunktion}
\end{align}

\begin{align}
	\nabla_{\boldsymbol{w}}\overset{\sim}{J}(\boldsymbol{w}, \boldsymbol{b}; \boldsymbol{X}, \boldsymbol{y})\:{=}\:\ \lambda \mathrm{sign}(\boldsymbol{w}) + \nabla_{\boldsymbol{w}}J(\boldsymbol{w}, \boldsymbol{b}; \boldsymbol{X}, \boldsymbol{y})
    \label{eq:formelL1RegularisierungGesamtzielfunktionGradient}
\end{align}

Die L1-Regularisierung führt zu einer Lösung, die dünnbesetzter ist. Dies bedeutet, dass einige Parameter einen optimalen Wert von Null haben \cite[262]{Goodfellow.2018}. Hier können dann bestimmte Gewichtungen Null werden, wodurch die L1-Regularisierung als Merkmalsauswahl fungieren kann \cite[262]{Goodfellow.2018}, \cite[339]{Raschka.2018}. 

\subsubsection{Erweitern des Datensatzes / Data Augmentation}
Für eine bessere Generalisierung eines Machine-Learning-Modell ist eine weitere Lösung die Erweiterung des Trainingsdatensatzes \cite[266]{Goodfellow.2018}. Vor allem bei der Bildklassifizierung und der Objekterkennung kann der Datensatz durch Transformation / Augmentation der Bilder erweitert werden. Techniken hierfür sind das Verschieben von Bildern um einige Pixel, Rotieren, Skalieren und Spiegelungen \cite[267]{Goodfellow.2018}. Auch das Einbringen von Rauschen ist eine Art der Datenanreicherung \cite[267]{Goodfellow.2018}. 

\subsubsection{Früher Abbruch}
Beim Trainieren eines Machine-Learning-Modells mit einer ausreichenden Kapazität für eine Überanpassung nimmt der Trainingsdatenfehler mit der Zeit stetig ab, während der Validierungsdatenfehler irgendwann wieder ansteigt. Ab diesem Punkt fängt das Modell an zur Überanpassung zu neigen. Hier besteht die Methodik darin, das Training ab diesem Punkt abzubrechen, um ein Modell mit der bestmöglichen Generalisierungsfähigkeit zu erhalten \cite[273]{Goodfellow.2018}. Dieses Verfahren wird auch als früher Abbruch bezeichnet \cite[275]{Goodfellow.2018}. 

\subsubsection{Dropout}
Beim Dropout-Verfahren wird während des Trainings eine bestimmte Anzahl von Neuronen in den Eingabe- und verdeckten Schichten zufällig entfernt. Dies geschieht, indem ihre Ausgabewerte mit Null multipliziert werden \cite[288]{Goodfellow.2018}, \cite[505\psq]{Raschka.2018}. Wie viele Neuronen im Netz während des Trainings deaktiviert werden, lässt sich über die Dropout-Wahrscheinlichkeit \gls{Dropoutwahrscheinlichkeit} vorgeben \cite[505\psq]{Raschka.2018}. Eine Eingabeeinheit wird üblicherweise mit einer Dropout-Wahrscheinlichkeit von 0,2 und eine verdeckte Einheit mit einer Dropout-Wahrscheinlichkeit von 0,5 eingestellt, \cite[288]{Goodfellow.2018}. Das Dropout-Verfahren verringert die Kapazität des Modells während der Trainingsphase und zwingt das Netz eine redundante Repräsentierung der Daten zu erlernen. Somit lernt das Modell allgemeinere und robustere Muster in den Daten und verringert die Überanpassung des Netzes \cite[506]{Raschka.2018}. Bei der Vorhersage (Inferenz) sind alle Neuronen aktiviert und tragen zur Voraktivierung der nächsten Schicht bei \cite[506]{Raschka.2018}, \cite[290]{Goodfellow.2018}. 




\subsection{Optimierung beim Trainieren neuronaler Netze}
Die Optimierung hat das Ziel, die Parameter eines neuronalen Netzes zu finden, die die Kostenfunktion \gls{KostenfunktionTheta} deutlich minimieren \cite[305]{Goodfellow.2018}. Eine Schwierigkeit die Kostenfunktion zu minimieren besteht darin, dass neuronale Netze viele lokale Minima aufweisen und diese dann zum Problem werden, wenn sie gegenüber dem globalen Minimum einen hohen Aufwand aufweisen \cite[317\psq]{Goodfellow.2018}. Ein weiteres Problem sind Bereiche von Klippen und explodierenden Gradienten, da es bei einer Gradientenaktualisierung zu extremen Parameterverschiebungen kommt \cite[322\psq]{Goodfellow.2018}. Mit der als Gradienten-Clipping bezeichnenden Heuristik kann die Schrittweite in diesen Fällen verringert werden. Klippen in der Kostenfunktion sind bei \gls{RNN}'s am verbreitesten \cite[322\psq]{Goodfellow.2018}. Probleme ergeben sich auch bei Sattelpunkten, Plateaus und anderen flachen Bereichen. Hier kann der Gradient nahe Null gehen und der Gradientenabstieg sich verlangsamen \cite[318\psqq]{Goodfellow.2018}. Als nächstes werden einige Optimierungsalgorithmen für den Gradientenabstieg vorgestellt. 

\subsubsection{Stochastisches Gradientenabstiegsverfahren}
Anknüpfend an Kapitel \ref{sec:StochastischesGradientenabstiegsverfahren} ist ein wichtiger Punkt hierbei die Lernrate \gls{Lernrate}, die nach und nach verringert werden muss. Grund hierfür ist, dass der Gradientenschätzer für das \gls{SGD} eine Rauschquelle durch das zufällige Ziehen von Trainingsbeispielen beim Mini-Batch, die auch bei Erreichen des Minimums nicht verschwindet, einbringt \cite[328\psq]{Goodfellow.2018}. Daher wird eine adaptive Lernrate verwendet \cite[342\psq]{Goodfellow.2018}, \cite[66\psq]{Raschka.2018}.

\subsubsection{Momentum}
Manchmal erfolgt das Lernen mit dem Gradientenabstiegsverfahren zäh. Die Momentum-Methode beschleunigt das Lernen, indem der Algorithmus einen exponentiell verringernden gleitenden Mittelwert der bisherigen Gradienten als weitere Bewegungsrichtung des \gls{SGD} berechnet \cite[330\psq]{Goodfellow.2018}. Dies hilft vor allem bei starker Krümmung, kleinen, aber stetigen Gradienten und rauschbehafteten Gradienten \cite[330]{Goodfellow.2018}. Der Momentum-Algorithmus führt hierzu eine Variable \gls{Ausgangsgeschwindigkeit} ein, die dabei Geschwindigkeit und Richtung, mit der die Parameter den Parameterraum durchqueren, repräsentiert \cite[330]{Goodfellow.2018}. Zudem bestimmt der Hyperparameter \gls{MomentumParameter}, wie schnell die Beiträge der bisherigen Gradienten exponentiell abnehmen. Die Formeln \ref{eq:formelMomentum} und \ref{eq:formelGradientStochasticDescentMomentum} zeigen den Update-Prozess \cite[331\psq]{Goodfellow.2018}.


\begin{align}
\boldsymbol{v} \leftarrow \alpha \boldsymbol{v} - \varepsilon \boldsymbol{g}
    \label{eq:formelMomentum}
\end{align}

\begin{align}
	\boldsymbol{\theta} \leftarrow \boldsymbol{\theta} + \boldsymbol{v}
    \label{eq:formelGradientStochasticDescentMomentum}
\end{align}

Je größer der \gls{MomentumParameter} relativ zu \gls{Lernrate} gewählt wird, desto mehr bisherige Gradienten beeinflussen die aktuelle Richtung des \gls{SGD} \cite[331\psq]{Goodfellow.2018}. In der Praxis werden häufig für \gls{MomentumParameter} [0,5; 0,9; 0,99] gewählt. Wie die Lernrate \gls{Lernrate} wird auch der Momentum-Parameter \gls{MomentumParameter} adaptiv während des Trainings eingestellt - zunächst klein und wird erhöht \cite[332]{Goodfellow.2018}. Die Anpassung von \gls{MomentumParameter} ist weniger wichtig als die Verringerung der Lernrate \gls{Lernrate} im Laufe des Trainings \cite[332]{Goodfellow.2018}.

\subsubsection{Adaptive Lernraten}
Die Lernrate ist eine der am schwierigsten einzustellenden Hyperparameter, weil sie die Modellleistung stark beeinflusst \cite[342\psq]{Goodfellow.2018}. Es wurde schon darauf eingegangen, dass die Lernrate während des Trainings verringert werden muss und auch nicht zu hoch eingestellt sein darf \cite[342\psq]{Goodfellow.2018}, \cite[66\psq]{Raschka.2018}, um nicht über ein Minimum hinauszuschießen \cite[63]{Raschka.2018}. Für diese Methoden gibt es verschiedene Algorithmen wie beispielsweise Adam. Der Adam-Algorithmus passt die Lernrate \gls{Lernrate} an das Momentum an \cite[346\psq]{Goodfellow.2018}. Es gibt noch weitere Algorithmen wie AdaGrad, RMSProp und AdaDelta \cite[342-347]{Goodfellow.2018}. Die Object Detection API \cite{GitHub.1062021} von Tensorflow benutzt als adaptive Lernrate eine Warm Up-Phase, in der die Lernrate linear ansteigt und nach dieser Phase in einem Cosine Decay, also einer Kosinuskurve, abfällt. Abbildung \ref{fig:CosineDecay} zeigt die Methodik.


\begin{figure}[htbp]
  \centering  
  \includegraphics[scale=0.4]{img/CosineDecay.pdf}
  \caption{Lernrate mit Warm Up und Cosine Decay}
  \label{fig:CosineDecay}
\end{figure}


\subsubsection{Anpassung der Merkmale mit Standardisierung und Normierung}
\label{StandardisierungNormierung}
Das Training mit dem Gradientenabstiegsverfahren zeigt ein erheblich besseres Verhalten, wenn die Trainingsdaten / Merkmale von gleicher Größenordnung sind \cite[138]{Raschka.2018}. Dafür werden die Merkmale standardisiert oder normiert.  Bei der Normierung nach Formel \ref{eq:Normierung} werden die Daten auf das Intervall [0, 1] abgebildet. Bei der Standardisierung nach Formel \ref{eq:Standardisierung} werden die Daten auf dem Mittelwert 0 zentriert und eine Standardabweichung von 1 gewählt. Somit ergibt sich eine Normalverteilung der Merkmale \cite[138\psq]{Raschka.2018}. \gls{KleinsterWertX} steht für den kleinsten Wert, \gls{GrößterWertX} für den größten Wert der Merkmalsspalte. \gls{MittelwertX} gibt den Mittelwert und \gls{StandardabweichungX} die Standardabweichung einer Merkmalsspalte an.


\begin{align}
	x^{(i)}_{norm} \:{=}\: \frac{x^{(i)}-x_{min}}{x_{max}-x_{min}}
    \label{eq:Normierung}
\end{align}


\begin{align}
	x^{(i)}_{std} \:{=}\: \frac{x^{(i)}-\mu_{x}}{\sigma_{x}}
    \label{eq:Standardisierung}
\end{align}


Die Standardisierung ist für das \gls{SGD} praktischer als die Normierung. Die Standardisierung sorgt dafür, dass das neuronale Netz weniger empfindlich auf Ausreißer, also ungewöhnliche Werte reagiert \cite[139]{Raschka.2018}. 

\subsubsection{Batch-Normalisierung}
Die Batch-Normalisierung ist ein Verfahren der adaptiven Reparametrisierung, das die Probleme bei einer parallelen Aktualisierung der Parameter in allen Schichten des neuronalen Netzes verhindern soll \cite[354\psq]{Goodfellow.2018}. Der Backpropagation-Algorithmus berechnet den Gradienten der Kostenfunktion in Abhängigkeit aller Parameter des gesamten Netzes. Anschließend beginnt der \gls{SGD} mit dem Update der Parameter. Dies führt dazu, dass das Update Effekte zweiter und dritter Ordnung bis hin zu Effekten \gls{GesamtLayer}-ter Ordnung enthält \cite[355]{Goodfellow.2018}. Somit sind die Effekte eines Updates auf die Parameter einer Schicht sehr stark von allen anderen Schichten abhängig. Der Effekt ist umso stärker, je mehr Schichten das neuronale Netz aufweist \cite[355]{Goodfellow.2018}. Die Batch-Normalisierung normalisiert mit beliebigen Mittelwerten \gls{Mittelwert} und beliebigen Standardabweichungen \gls{Standardabweichung} den transformierten Wert \ensuremath{\boldsymbol{W}^\top \boldsymbol{x}} in den verdeckten Schichten \cite[358]{Goodfellow.2018}. Der Biasterm \gls{BiasV} wird hier weggelassen, da er redundant wird, wenn beliebige Mittelwerte und Standardabweichungen für die Normalisierung verwendet werden \cite[358]{Goodfellow.2018}. Beliebig bedeutet hier Mittelwerte ungleich 0 und Standardabweichungen ungleich 1. Der transformierte Wert leitet sich ab von der Form \ensuremath{g(\boldsymbol{W}^\top \boldsymbol{x} + \boldsymbol{b})}, die in den meisten Schichten neuronaler Netze vorkommen \cite[358]{Goodfellow.2018}.


\subsection{Konvolutionale Neuronale Netze}
Konvolutionale Neuronale Netze (Convolutional Neural Networks, \gls{CNN}) sind eine spezielle Form neuronaler Netze, die zur Verarbeitung von Daten mit rasterähnlichen Strukturen eingesetzt werden. Rasterähnliche Strukturen sind beispielsweise diskrete Zeitreihendaten als 1-D-Raster und vor allem Bilddaten als 2-D-Raster aus Pixeln. Die Bezeichnung Convolutional leitet sich von der mathematischen Faltung ab, da hier in mindestens einer Schicht Faltungen beziehungsweise Filterungen von Merkmalen anstelle von allgemeinen vollständig verknüpften Schichten mit Matrizenmultiplikation eingesetzt werden \cite[369]{Goodfellow.2018}. \\
Unterschiede zwischen konvolutionale Schichten und vollständig verknüpften Schichten sind:

\begin{itemize}
\item Gezielte Verknüfungen / Spärliche Konnektivität \cite[490]{Raschka.2018}, \cite[375]{Goodfellow.2018}
\item Gemeinsame Parameter (Parameter Sharing) \cite[282]{Goodfellow.2018}, \cite[490]{Raschka.2018}
\end{itemize}

Abbildung \ref{fig:CNNLeNet5} zeigt ein \gls{CNN} nach der LeNet-5-Struktur \cite{Zhou.182017}. In der Abbildung \ref{fig:CNNLeNet5} wird zudem sichtbar, dass es zwei Schritte in dem Netz gibt, die sich von einem vollständig verknüpften neuronalen Netz unterscheiden. Diese Schritte sind die Convolution mit einem Kernel und das Max-Pooling. \gls{CNN}'s bestehen üblicherweise aus vielen Convolution- und Pooling-Schichten und können mit vollständig verknüpften Schichten oder Feature Maps enden. Die finale Auswertung einer Klassifikation anhand von Feature Maps oder vollständig verknüpften Schichten erfolgt dann mit einer softmax-Funktion \cite[384]{Goodfellow.2018}, \cite[507]{Raschka.2018}, wobei die ersten Convolution- und Pooling-Schichten des \gls{CNN} die Low-Level-Merkmale herausfiltern \cite[490]{Raschka.2018}. Der Übergang einer Feature Map zu einer vollständig verknüpften Schicht wird Flatten genannt. Hier wird aus einer Matrix ein Vektor umgeformt \cite[507]{HenriqueF.DeArruda.2019}. 

\begin{figure}[htbp]
  \centering  
  \includegraphics[scale=0.48]{img/CNN_LeNet5.pdf}
  \caption{Darstellung eines CNN nach der LeNet-5-Struktur \cite{Zhou.182017}}
  \label{fig:CNNLeNet5}
\end{figure}

Auf die einzelnen Schritte eines \gls{CNN} wird nun tiefer eingegangen. 

\subsubsection{Faltungsoperation mittels Kernel / Convolution}
Die Faltungsoperation (Convolution) wird mit der Eingabe und einem Kernel gebildet und entspricht einer diskreten Faltung, bei dem Produkte aufsummiert werden, ohne ein Integral ausrechnen zu müssen. Die Ausgabe davon wird als Merkmalskarte (Feature Map) bezeichnet \cite[371]{Goodfellow.2018}. Häufig werden \gls{CNN} für die Bildklassifikation und Objektdetektion verwendet. Daher sind die Eingabedaten mehrdimensionale Arrays, da ein Bild überlicherweise als RGB-Pixelraster vorliegt. Ein RGB-Bild besteht aus drei Kanälen, einen Kanal für die roten, einen für die grünen und einen weiteren für die blauen Pixel. Hier ergeben sich dann drei Arrays, die als mehrdimensionales Array oder auch Tensor bezeichnet werden \cite[371]{Goodfellow.2018}, \cite[401]{Goodfellow.2018}. Die Faltung wird dann mit einem zweidimensionalen Kernel jeweils einzeln auf die drei Arrays angewendet \cite[371]{Goodfellow.2018}. Formel \ref{eq:ZweidimensionaleFaltung1} zeigt die zweidimensionale Faltung \cite[371]{Goodfellow.2018}. Da die Faltung kommutativ ist, lässt sich der Kernel relativ zur Eingabe drehen (Kernel Flipping). Dadurch nimmt der Index der Eingabe zu, während der Index des Kernels abnimmt. Dies ist auch der einzige Grund für die Drehung des Kernels \cite[372]{Goodfellow.2018}. Formel \ref{eq:ZweidimensionaleFaltungKernelFlipping} zeigt die zweidimensionale Faltung mit gedrehtem Kernel. Alternativ gibt es noch den Einsatz der Kreuzkorrelation, die mit Ausnahme der Kerneldrehung der Faltung entspricht \cite[372]{Goodfellow.2018}, \cite[493]{Raschka.2018}. Formel \ref{eq:ZweidimensionaleFaltungKreuzkorrelation} zeigt die Faltung mittels Kreuzkorrelation \cite[372]{Goodfellow.2018}. \gls{Bildeingabe} steht für die Bildeingabematrix, \gls{Kernel} steht für die Kernelmatrix und \ensuremath{m} / \ensuremath{n} für die Anzahl der Zeilen und Spalten einer Matrix nach \gls{Matrixdimension} einer Matrix.

 

\begin{align}
	\boldsymbol{G}(i,j) \:{=}\: (\boldsymbol{I} \ast \boldsymbol{K})(i,j) \:{=}\: \sum_m \sum_n \boldsymbol{I}(m,n) \boldsymbol{K}(i-m,j-n)
    \label{eq:ZweidimensionaleFaltung1}
\end{align}

\begin{align}
	\boldsymbol{G}(i,j) \:{=}\: (\boldsymbol{K} \ast \boldsymbol{I})(i,j) \:{=}\: \sum_m \sum_n \boldsymbol{I}(i-m,j-n) \boldsymbol{K}(m,n)
    \label{eq:ZweidimensionaleFaltungKernelFlipping}
\end{align}


\begin{align}
	\boldsymbol{G}(i,j) \:{=}\: (\boldsymbol{I} \ast \boldsymbol{K})(i,j) \:{=}\: \sum_m \sum_n \boldsymbol{I}(i+m,j+n) \boldsymbol{K}(m,n)
    \label{eq:ZweidimensionaleFaltungKreuzkorrelation}
\end{align}

In der Implementierung der Faltung spielt es keine große Rolle, ob der Kernel gedreht ist oder nicht. Der Lernalgorithmus erlernt die passenden Werte des Kernels an den passenden Orten der Kernelmatrix \cite[372]{Goodfellow.2018}. Die Abbildung \ref{fig:Convolution} zeigt die Faltung (Convolution) ohne Kerneldrehung mit Valid-Padding (kein Padding) und einer Schrittweite von 1 des Kernels. Der Kernel kann auch eine größere Schrittweite haben. \\
Wie in der Abbildung \ref{fig:Convolution} auch zu erkennen ist, verringert sich die Dimension der Ergebnismatrix der Faltung mit Valid-Padding (kein Padding). Für gewöhnlich wird das Same-Padding verwendet, wenn die Größe der Ausgabematrix mit der Größe der Eingabematrix übereinstimmen soll. Hierfür werden an den Rändern der Matrix  Nullen angehängt in Abhängigkeit der Größe des Kernels \cite[494]{Raschka.2018}. Neben Same-Padding und Valid-Padding gibt es noch das Full-Padding, das jedoch nur selten zum Einsatz kommt. Grund hierfür ist die Dimensionsvergrößerung der Ergebnismatrix \cite[494]{Raschka.2018}.


\begin{figure}[htbp]
  \centering  
  \convoutionpicture 14
  \convoutionpicture 41
  \convoutionpicture 55
  \caption{Darstellung der Convolution mit Valid-Padding und Schrittweite 1 \cite[373]{Goodfellow.2018}}
  \label{fig:Convolution}
\end{figure}
 

Die Faltung entspricht normalerweise einer Multiplikation einer sehr dünnbesetzten Matrix, da hier die meisten Einträge der Matrix Null betragen. Grund dafür ist, dass der Kernel meistens sehr viel kleiner ist als die Eingabematrix \cite[373]{Goodfellow.2018}. Zudem sind viele Matrizeneinträge in den Haupt- und Nebendiagonalen gleich (Parameter Sharing, Toeplitz-Matrix, doppelt zyklische Blockmatrix), wenn die Faltung als Matrizenmultiplikation dargestellt wird \cite[372\psq]{Goodfellow.2018}. Diese spärliche Konnektivität, das Parameter Sharing und  äquivariante Repräsentationen (Äquivarianz: Änderung der Eingabe führt zu einer gleichartigen Änderung der Ausgabe) führen dazu, dass konvolutionale neuronale Netze deutlich weniger Parameter aufweisen als neuronale Netze mit vollständig verknüpften Schichten. Dadurch ist auch die Berechnung durch das Netz deutlich schneller \cite[492\psq]{Raschka.2018}, \cite[374-379]{Goodfellow.2018}. 

\subsubsection{Pooling / Max-Pooling}
Ein \gls{CNN} führt in der Convolution-Schicht mehrere Faltungen gleichzeitig aus, um eine Reihe linearer Aktivierungen zu erzeugen. Im darauffolgenden Schritt wird auf jede lineare Aktivierung eine nichtlineare Aktivierungsfunktion angewandt \cite[379]{Goodfellow.2018}. Meistens ist dies die schon vorgestellte \gls{ReLU}-Funktion. Die Aktivierung über die Aktivierungsfunktion wird manchmal als Erkennungsphase bezeichnet \cite[379]{Goodfellow.2018}. Die nächste Phase die darauf folgt ist das Pooling, um die Ausgabe der Convolution-Schicht weiter zu modifizieren \cite[379]{Goodfellow.2018}. Das Pooling ersetzt die Ausgabe der Convolution-Schicht an einer bestimmten Stelle durch eine zusammengefasste statistische Größe der nahe gelegenen Werte der Ausgabematrix. Eine sehr häufig eingesetzte Pooling-Funktion ist das Max-Pooling, siehe Abbildung \ref{fig:MaxPooling}. Das Max-Pooling listet den maximalen Wert in einer Matrix auf \cite[379]{Goodfellow.2018}, \cite[500]{Raschka.2018}. Das Mean-Pooling oder Average-Pooling ermittelt den durchschnittlichen Wert in einer Matrix \cite[379]{Goodfellow.2018}, \cite[500]{Raschka.2018}. 

\begin{figure}[htbp]
  \centering  
  \definecolor{c1}{HTML}{9ACFC6}
\definecolor{c2}{HTML}{DABBD6}
\definecolor{c3}{HTML}{CBDCB9}
\definecolor{c4}{HTML}{9AC3E1}
\definecolor{c5}{HTML}{DEBBA5}
\definecolor{c6}{HTML}{C4DDE5}
\newcommand*{\xMin}{0}%
\newcommand*{\xMax}{6}%
\newcommand*{\yMin}{0}%
\newcommand*{\yMax}{4}%

\newcommand*{\xMinR}{9.5}%
\newcommand*{\xMaxR}{12.5}%
\newcommand*{\yMinR}{1}%
\newcommand*{\yMaxR}{3}%

\begin{tikzpicture}
    \fill [c1] (0, 0) rectangle (2, 2);
    \fill [c2]   (2, 0) rectangle (4, 2);
    \fill [c3]  (4, 0) rectangle (6, 2);
    \fill [c4] (0, 2) rectangle (2, 4);
    \fill [c5]   (2, 2) rectangle (4, 4);
    \fill [c6]   (4, 2) rectangle (6, 4);

    \fill [c1]  (9.5, 1) rectangle (10.5, 2);
    \fill [c2]   (10.5, 1) rectangle (11.5, 2);
    \fill [c3]  (11.5, 1) rectangle (12.5, 2);
    \fill [c4]  (9.5, 2) rectangle (10.5, 3);
    \fill [c5]   (10.5, 2) rectangle (11.5, 3);
    \fill [c6]   (11.5, 2) rectangle (12.5, 3);

    \foreach \i in {\xMin,...,\xMax} {
        \draw [very thin,gray] (\i,\yMin) -- (\i,\yMax)  node [below] at (\i,\yMin) {};
    }
    \foreach \i in {\yMin,...,\yMax} {
        \draw [very thin,gray] (\xMin,\i) -- (\xMax,\i) node [left] at (\xMin,\i) {};
    }

    \foreach \i in {\xMin,2,...,\xMax} {
        \draw [thick,gray] (\i,\yMin) -- (\i,\yMax)  node [below] at (\i,\yMin) {};
    }
    \foreach \i in {\yMin,2,...,\yMax} {
        \draw [thick,gray] (\xMin,\i) -- (\xMax,\i) node [left] at (\xMin,\i) {};
    }
    \node at (0.5, 0.5) {7};
    \node at (1.5, 0.5) {9};
    \node at (2.5, 0.5) {3};
    \node at (3.5, 0.5) {5};
    \node at (4.5, 0.5) {9};
    \node at (5.5, 0.5) {4};
    %
    \node at (0.5, 1.5) {0};
    \node at (1.5, 1.5) {7};
    \node at (2.5, 1.5) {0};
    \node at (3.5, 1.5) {0};
    \node at (4.5, 1.5) {9};
    \node at (5.5, 1.5) {0};
    %
    \node at (0.5, 2.5) {5};
    \node at (1.5, 2.5) {0};
    \node at (2.5, 2.5) {9};
    \node at (3.5, 2.5) {3};
    \node at (4.5, 2.5) {7};
    \node at (5.5, 2.5) {5};
    %
    \node at (0.5, 3.5) {9};
    \node at (1.5, 3.5) {2};
    \node at (2.5, 3.5) {9};
    \node at (3.5, 3.5) {6};
    \node at (4.5, 3.5) {4};
    \node at (5.5, 3.5) {3};

    \draw[draw=black,line width=12pt,-{Latex[length=9mm]}] (6.5, 2)  -- (9,2);
    \node[font=\footnotesize\bfseries] at (7.7, 2.5) {$\mathbf{2\times 2}$ max pooling};

    \foreach \i in {\xMinR,...,\xMaxR} {
        \draw [thick,gray] (\i,\yMinR) -- (\i,\yMaxR)  node [below] at (\i,\yMinR) {};
    }
    \foreach \i in {\yMinR,...,\yMaxR} {
        \draw [thick,gray] (\xMinR,\i) -- (\xMaxR,\i) node [left] at (\xMinR,\i) {};
    }

    \node at (10, 1.5) {9};
    \node at (11, 1.5) {5};
    \node at (12, 1.5) {9};
    \node at (10, 2.5) {9};
    \node at (11, 2.5) {9};
    \node at (12, 2.5) {7};

    \draw [decorate,decoration={brace,amplitude=4pt},xshift=-2pt,yshift=0pt]
(0,2) -- (0,4) node [black,midway,xshift=-0.3cm] {\footnotesize $2$};

    \draw [decorate,decoration={brace,amplitude=4pt},xshift=0pt,yshift=2pt]
(0,4) -- (2,4) node [black,midway,yshift=+0.3cm] {\footnotesize $2$};
\end{tikzpicture}
  \caption{Darstellung des Max-Pooling \cite[500]{Raschka.2018}}
  \label{fig:MaxPooling}
\end{figure}

Das Pooling hilft dabei, die Repräsentationen annähernd invariant gegenüber kleinen Verschiebungen der Eingabe zu machen. Dies führt dazu, dass geringfügige Verschiebungen der Eingabe die Werte der meisten zusammengefassten Ausgaben nicht verändern \cite[379\psq]{Goodfellow.2018}, \cite[500]{Raschka.2018}. Das Pooling steigert die statistische Effizienz des Netzes, reduziert die Anzahl der Merkmale und ermöglicht somit schnellere Berechnungen \cite[380]{Goodfellow.2018}, \cite[501]{Raschka.2018}.


\section{Objekterkennung mittels neuronaler Netze}
Für die Navigation des Roboters wird als Aufgabe für die Zielerkennung die Objektdetektion verwendet. Bei der Objektdetektion wird nicht nur eine Klassifizierung durchgeführt, sondern auch die Lokalisation der Klassifizierung anhand einer rechteckigen Bounding Box (Begrenzungsrahmen) aufgezeigt \cite{Liu.2015}. Nachfolgend wird auf die verwendeten Parameter und Netzarchitekturen für Klassifikation und Detektion eingegangen, die alle auf \gls{CNN}'s basieren. Abschließend wird noch die verwendtete Evaluierungmethode der Objektdetektion erläutert. 


\subsection{Parameter zur Objektidentifikation}
Zur Objektidentifikation werden folgende Parameter verwendet \cite{Liu.2015}:
\begin{itemize}
\item x-Koordinate des Zentrums der Bounding Box
\item y-Koordinate des Zentrums der Bounding Box
\item Breite der Bounding Box
\item Höhe der Bounding Box
\item Name der Klasse
\item Confidence (Vorhersage-Wahrscheinlichkeit) der erkannten Klasse durch das Netz
\end{itemize}


\subsection{Netzarchitekturen}
Es existieren eine Vielzahl von Netzarchitekturen für die Objektdetektion. Im Folgenden wird der \gls{SSD} tiefer betrachtet, da dieser Detektor für die Zielerkennung des Roboters zum Einsatz kam. Neben dem \gls{SSD} gibt es noch weitere Architekturen wie YOLO \cite{Redmon.2015}, R-CNN \cite{Girshick.2013} und Faster R-CNN \cite{Ren.2015}.

\subsubsection{Single Shot MultiBox Detector}
Die Architektur des \gls{SSD} besteht aus einem Basisnetzwerk, auch Backbone-Netz genannt, das einer abgekürzten \gls{CNN}-Architektur ohne Klassifizierungsschichten entspricht, und zusätzlichen Convolution-Schichten mit abschließender \gls{NMS}. Das Backbone-Netz dient hier zur Merkmalsextraktion und die zusätzlichen Schichten zur Generierung der Bounding Boxen mit dazugehöriger Klassifizierung \cite{Liu.2015}.

\begin{figure}[htbp]
  \centering  
  \includegraphics[scale=0.4]{img/ArchitekturSSD.png}
  \caption{Architektur des \gls{SSD} mit VGG-16 als Basisnetz \cite{Liu.2015}}
  \label{fig:SSD}
\end{figure}


Abbildung \ref{fig:SSD} zeigt die Architektur mit einem VGG-16-Netz als Basisnetz (Backbone-Netz). Die Schichten für eine Klassifizierung werden abgeschnitten und stattdessen 6 Convolution-Schichten an das Basisnetz gehängt. Diese zusätzlichen Faltungsschichten generieren dann die Bounding Boxen für die detektierten Klassen \cite{Liu.2015}. 

\begin{figure}[htbp]
  \centering  
  \includegraphics[scale=0.3]{img/DefaultBoxenSSD.png}
  \caption{Ground Truth Boxen und Standardboxen des \gls{SSD} in den 8x8 und 4x4 Feature Maps \cite{Liu.2015}}
  \label{fig:SSDDefaultBoxen}
\end{figure}


Abbildung \ref{fig:SSDDefaultBoxen} zeigt die Standardboxen, die in jeder Feature Map bei extrahierten Merkmalen enthalten sind. Es kommen immer 4 oder 6 Standardboxen in unterschiedlichen Seitenverhältnissen vor \cite{Liu.2015}. Während des Trainings wird die Standardbox regressiert, die die beste Übereinstimmung mit der gelabelten Ground Truth Box aufweist. Danach wird über den Lernalgorithmus beziehungsweise über die Localization-Loss-Funktion, die Übereinstimmung zwischen vorhergesagter Bounding Box und Ground Truth Bounding Box über Berechnung der Offsets zu den x-, y-Koordinaten des Zentrums und der Breite und Höhe der Standardboxen über die \gls{IoU} weiter angenähert \cite{Liu.2015}. Neben der Regression durch die Localization-Loss-Funktion, wird auch die Confidence (Vorhersage-Wahrscheinlichkeit) für jede Klasse über den Lernalgorithmus beziehungsweise der Classification-Loss-Funktion mitbestimmt. Die Lernalgorithmen- / Loss-Funktionen sind die Kostenfunktionen, die über das Gradientenabstiegsverfahren minimiert werden. Der Localization Loss basiert auf den Smooth L1 Loss. Der Confidence Loss basiert wiederum auf einen Softmax Loss \cite{Liu.2015}. Die \gls{NMS} verhindert zum Schluss die Mehrfachdetektion (Duplikate von Detektionen) eines Objekts an gleicher Stelle \cite{Hosang.2017}. Wie in Abbildung \ref{fig:SSD} noch zu sehen ist, werden die Feature Maps immer weiter verkleinert, um eine gute Skalierbarkeit der Größe der vorhergesagten Bounding Boxen zu gewährleisten \cite{Liu.2015}. Einer der größten Unterschiede zwischen \gls{SSD} und YOLO \cite{Redmon.2015} besteht darin, dass YOLO das Eingabebild schon am Anfang in sogenannte Grids aufteilt, die wiederum Bounding Boxen nach Confidence-Wert enthalten \cite{Redmon.2015}. Jedoch haben sowohl der \gls{SSD} als auch YOLO gemeinsam, dass sie nur ein Bild für die Objektdetektion brauchen, auch wenn das Bild mehrere Objekte enthält \cite{Liu.2015}, \cite{Redmon.2015}. 


\subsubsection{Mobilenet V1 / V2 als Basisnetz zum \gls{SSD}}
Für die Objektdetektion mittels \gls{SSD} kann als Basisnetz das MobileNet verwendet werden \cite{Howard.2017}. Ein großer Vorteil des MobileNet ist die besondere Architektur der Depthwise Separable Convolution Schichten. Diese Schichten teilen die normale Convolution in eine Depthwise Convolution und eine Pointwise Convolution und reduzieren somit drastisch den Berechnungsaufwand und die Größe des Netzes \cite{Howard.2017}. Die Depthwise Convolution übernimmt hier den Schritt der Filterung der Eingabebild-Matrizen (3 Kanäle bei RGB) mit einem Kernel und die Pointwise Convolution die Zusammenführung dieser Filterungen mit den Filterungen aus \ensuremath{1 \times 1} Kernels für die Anzahl der Feature Maps, die für die weitere Schicht benötigt werden \cite{Howard.2017}. Formel \ref{eq:ordinaryConvolution} zeigt die gewöhnliche Convolution mit Same-Padding und Schrittweite (Stride) 1 \cite{Howard.2017}:

\begin{align}
	\boldsymbol{G}_{k,l,n} \:{=}\: \sum_{i,j,m} \boldsymbol{K}_{i,j,m,n} \cdot \boldsymbol{F}_{k+i-1,l+j-1,m}
    \label{eq:ordinaryConvolution}
\end{align}
 
 Formel \ref{eq:ordinaryComputationalCost} zeigt die dazugehörige Computational Cost (Berechnungsaufwand) \cite{Howard.2017}:
 
 \begin{align}
	D_K \cdot D_K \cdot M \cdot N \cdot D_F \cdot D_F
    \label{eq:ordinaryComputationalCost}
\end{align}
 
  Die Bildeingabe \gls{Bildeingabe} / Feature Map \gls{FeatureMap} hat die Dimension \gls{FeatureMapDimension}, der Kernel \gls{Kernel} die Dimension \gls{KernelDimension}, \gls{AnzahlChannels} steht für die Anzahl der Kanäle (Channels) der Feature Map und \gls{AnzahlFilter} steht für die Anzahl der Kernel und entspricht der Anzahl der Kanäle der erzeugten Feature Map \gls{NewFeatureMap} nach der Convolution \cite{Howard.2017}. \\
  Die Depthwise Convolution wendet nun eine Kernelmatrix mit einem Filter (Kanal) pro Kanal der Feature Map an, siehe Formel \ref{eq:DepthwiseConvolution}, \cite{Howard.2017}:
  
  \begin{align}
	\hat{\boldsymbol{G}}_{k,l,m} \:{=}\: \sum_{i,j} \hat{\boldsymbol{K}}_{i,j,m} \cdot \boldsymbol{F}_{k+i-1,l+j-1,m}
    \label{eq:DepthwiseConvolution}
\end{align} 

Formel \ref{eq:DepthwiseComputationalCost} zeigt die Computational Cost der Depthwise Convolution an:

\begin{align}
	D_K \cdot D_K \cdot M \cdot D_F \cdot D_F
    \label{eq:DepthwiseComputationalCost}
\end{align}

Nach der Depthwise Convolution erzeugt die Pointwise Convolution mittels \ensuremath{1 \times 1} Faltung und Anzahl der Filter die erforderliche Anzahl an Kanälen für die neue Feature Map \cite{Howard.2017}. Die erste Depthwise Separable Convolution findet nach einer normalen Convolution statt und wird dann im MobileNet mehrmals hintereinander angewendet \cite{Howard.2017}. Formel \ref{eq:DepthwiseSeparabelComputationalCost} zeigt die gesamte Computational Cost für die Depthwise Separable Convolution \cite{Howard.2017}:

\begin{align}
	D_K \cdot D_K \cdot M \cdot D_F \cdot D_F + M \cdot N \cdot D_F \cdot D_F
    \label{eq:DepthwiseSeparabelComputationalCost}
\end{align}


Das Verhältnis in Formel \ref{eq:ComputationalCostQuotient} zeigt die drastische Reduzierung der Computational Cost vom Faktor 8 bis 9 bei einer Kernelgröße von \ensuremath{3 \times 3} mittels Depthwise Separable Convolution \cite{Howard.2017}:

\begin{align}
    \frac{D_K \cdot D_K \cdot M \cdot D_F \cdot D_F + M \cdot N \cdot D_F \cdot D_F}{D_K \cdot D_K \cdot M \cdot N \cdot D_F \cdot D_F} \:{=}\: \frac{1}{N} + \frac{1}{D^2_K}
    \label{eq:ComputationalCostQuotient}
\end{align}

Sowohl die Depthwise Convolution als auch die Pointwise Convolution werden mit einer Batch-Normalisierung und einer \gls{ReLU}-Aktivierung abgeschlossen \cite{Howard.2017}. \\
Zusätzlich führt die MobileNet-Architektur zwei Hyperparameter (Wertebereich [0,1]) ein, um eine noch schlankere Netzarchitektur zu erhalten \cite{Howard.2017}:
\begin{itemize}
\item Width Multiplier: ein Vorfaktor für \gls{AnzahlChannels} und \gls{AnzahlFilter}, um die Anzahl der Kanäle zu begrenzen
\item Resolution Multiplier: ein Vorfaktor für \gls{FeatureMapDimension}, um die Auflösung der Feature Maps zu verkleinern
\end{itemize}

Neben dem Basis-MobileNet existiert auch der Nachfolger, das MobileNetV2 \cite{Sandler}. Diese Architektur führt die Depthwise Separable Convolution weiter zu Inverted Residuals and Linear Bottlenecks, auch Bottleneck Depth-Separable Convolution with residuals genannt \cite{Sandler}. Zum Vergleich zeigt Abbildung \ref{fig:MobilenetV1} den Depthwise Separable Convolution Block.


\begin{figure}[htbp]
  \centering  
  \begin{tikzpicture}[thick,
    Block/.style= {
        draw, scale=0.85, 
        minimum size=0.1cm}]
 
% Block
\node [Block,fill=cyan!20] (a) {Input};
 
% Block
\node [Block,fill=cyan!20,] (b) [right= of a] {Dwise 3x3, stride=s, ReLU6};
 
%  Block
\node [Block,fill=cyan!20] (c) [right =of b] {conv 1x1, ReLU6};
 
% Arrows
\draw[->] (a) -- (b);
\draw[->] (b) -- (c);

% Labels
\node[below=0.8cm, scale=0.7] at (b){Depthwise Convolution};
\node[below=0.8cm, scale=0.7] at (c){Pointwise Convolution};
 
\end{tikzpicture}
  \caption{Depthwise Separable Convolution Block \cite{Sandler}}
  \label{fig:MobilenetV1}
\end{figure}

Abbildung \ref{fig:MobilenetV2} zeigt den Bottleneck Depth-Separable Convolution with residuals Block. Diese Architektur verfolgt den Ansatz, die Anzahl der Kanäle der Feature Map am Ende des Blocks zu begrenzen, ohne großen Informationsverlust dabei zu verursachen. Hierzu wird als Erstes der Input mittels Pointwise Convolution und einem Expansion-Faktor \gls{Expansionfaktor} in eine höhrere Dimensionalität, daher eine Feature Map mit mehr Kanälen umgeformt. Somit kommt es mit der \gls{ReLU}-Aktivierungsfunktion zu keinem Informationsverlust. Danach findet eine Depthwise Convolution statt. Die Pointwise Convolution nach der Depthwise Convolution reduziert die Dimensionalität, reduziert daher die Anzahl der Kanäle. Damit es nun zu keinem Informationsverlust kommt, wird nun \textbf{keine nichtlineare Aktivierungsfunktion} verwendet wie die \gls{ReLU}6-Funktion, sondern eine \textbf{lineare Aktivierung} gewählt \cite{Sandler}. Anschließend wird bei einer Schrittweite (Stride) von 1 und bei gleicher Anzahl der Kanäle des Inputs und Outputs der Input mit dem Output addiert, ansonsten nicht, siehe Abbildung \ref{fig:MobilenetV2}, \cite{Sandler}. \gls{Width} steht für die Breite, \gls{Height} für die Höhe, \gls{AnzahlKanaele} für die Anzahl der Kanäle der Feature Map. \gls{Stride} steht für die Schrittweite (Stride) der Convolution. \\
 Sowohl Input als auch Output weisen wenige Kanäle auf. Zusätzlich sind beide Punkte bei gleicher Dimensionalität miteinander verbunden. Daher sind die Feature Maps mit den geringsten Kanälen miteinander verbunden. Deswegen wird der Begriff Inverted Residuals und Bottleneck verwendet \cite{Sandler}. Der Begriff Linear leitet sich dementsprechend von dem Verzicht auf nichtlineare Aktivierungsfunktionen ab, da diese einen Informationsverlust bei kleiner Dimensionalität verursachen \cite{Sandler}. Im MobileNetV2 werden anstatt der normalen  \gls{ReLU}-Funktion, die \gls{ReLU}6-Funktion verwendet, um die Werte aus der Aktivierung auf den maximalen Wert von 6 zu begrenzen \cite{Sandler}.

\begin{figure}[htbp]
  \centering  
  \begin{tikzpicture}[thick,
    Block/.style= {
        draw, scale=0.85, 
        minimum size=0.3cm}]
 
% Block
\node [Block,fill=cyan!20] (a) {Input};
 
% Block
\node [Block,fill=cyan!20,] (b) [right= of a] {Conv 1x1, ReLU6};
 
%  Block
\node [Block,fill=cyan!20] (c) [right =of b] {Dwise 3x3, ReLU6};

%  Block
\node [Block,fill=cyan!20] (d) [right =of c] {conv 1x1, Linear};

%  Block
\node [Block,fill=cyan!20] (e) [right =of d] {+};
 
% Arrows
\draw[->] (a) -- (b) coordinate[midway] (start);
\draw[->] (b) -- (c);
\draw[->] (c) -- (d);
\draw[->] (d) -- (e);
\coordinate (x) at ([yshift=-1cm]e.south);
\coordinate (y) at (start |- x);
\draw (start) -- (y) (x) edge[->] (e.south) (x) edge[-] (y);

% Labels
\node[below=0.8cm, scale=0.75] at (a){Stride=1 Block};
\node[above=0.8cm] at (a){\ensuremath{h \times w \times d}};
\node[below=0.8cm, scale=0.75] at (b){Pointwise Convolution};
\node[above=0.8cm] at (b){\ensuremath{h \times w \times (td)}};
\node[below=0.8cm, scale=0.75] at (c){Depthwise Convolution};
\node[above=0.8cm] at (c){\ensuremath{h \times w \times (td)}};
\node[below=0.8cm, scale=0.75] at (d){Pointwise Convolution};
\node[above=0.8cm] at (d){\ensuremath{h \times w\times d'}};
 
\end{tikzpicture}\hspace{1cm}


\begin{tikzpicture}[thick,
    Block/.style= {
        draw, scale=0.85, 
        minimum size=0.3cm}]
 
% Block
\node [Block,fill=cyan!20] (a) {Input};
 
% Block
\node [Block,fill=cyan!20,] (b) [right= of a] {Conv 1x1, ReLU6};
 
%  Block
\node [Block,fill=cyan!20] (c) [right =of b] {Dwise 3x3, stride=2, ReLU6};

%  Block
\node [Block,fill=cyan!20] (d) [right =of c] {conv 1x1, Linear};

 
% Arrows
\draw[->] (a) -- (b);
\draw[->] (b) -- (c);
\draw[->] (c) -- (d);

% Labels
\node[below=0.8cm, scale=0.75] at (a){Stride=s Block};
\node[above=0.8cm] at (a){\ensuremath{h \times w \times d}};
\node[below=0.8cm, scale=0.75] at (b){Pointwise Convolution};
\node[above=0.8cm] at (b){\ensuremath{h \times w \times (td)}};
\node[below=0.8cm, scale=0.75] at (c){Depthwise Convolution};
\node[above=0.8cm, scale=1.2] at (c){\ensuremath{\frac{h}{s} \times \frac{w}{s} \times (td)}};
\node[below=0.8cm, scale=0.7] at (d){Pointwise Convolution};
\node[above=0.8cm, scale=1.2] at (d){\ensuremath{\frac{h}{s} \times \frac{w}{s}\times d'}};
 
\end{tikzpicture}
  \caption{Bottleneck Depth-Separable Convolution with residuals Block \cite{Sandler}}
  \label{fig:MobilenetV2}
\end{figure}


\subsubsection{\gls{SSD}Lite}
Mit der Verwendung der Depthwise Separable Convolution statt der gewöhnlichen Convolution lässt sich auch die Parameteranzahl und somit die Modellgröße und Inferenzzeit des \gls{SSD} drastisch verringern \cite{Sandler}. Diese Version des \gls{SSD} wird dann als \gls{SSD}Lite bezeichnet \cite{Sandler}.

\subsubsection{ResNet-50 als Basisnetz zum \gls{SSD}}
Neben den MobileNets lassen sich eine Vielzahl von Netzarchitekturen als Basisnetz für den \gls{SSD} einsetzen. Eine sehr bekannte Netzarchitektur ist das ResNet \cite{He.2015}. Abbildung \ref{fig:ResNet} zeigt die Architektur des Residual Blocks \cite{He.2015}. Hierbei wird der Input als Referenz auf den Ausgang vor der \gls{ReLU}-Aktivierungsfunktion zusammengeführt, vorausgesetzt es handelt sich um die gleiche Dimensionalität \cite{He.2015}. Diese Methode verbessert das Training des Netzes und dessen Vorhersagegenauigkeit (Accuracy) \cite{He.2015}. Die Bezeichnung ResNet-50 bezieht sich auf die Anzahl der Schichten des ResNet \cite{He.2015}.

\begin{figure}[htbp]
  \centering  
  \begin{tikzpicture}[thick,
    Block/.style= {
        draw, scale=0.85, 
        minimum size=0.3cm}]
 
% Block
\node [Block,fill=cyan!20] (a) {Input};
 
% Block
\node [Block,fill=cyan!20,] (b) [right= of a] {Conv 3x3, ReLU};
 
%  Block
\node [Block,fill=cyan!20] (c) [right =of b] {Conv 3x3};

%  Block
\node [Block,fill=cyan!20] (d) [right =of c] {+};

 
% Arrows
\draw[->] (a) -- (b) coordinate[midway] (start);
\draw[->] (b) -- (c);
\draw[->] (c) -- (d);
\draw[->] (d) -- (0:10);
\coordinate (x) at ([yshift=-1cm]d.south);
\coordinate (y) at (start |- x);
\draw (start) -- (y) (x) edge[->] (d.south) (x) edge[-] (y);

\node[below=0.3cm, scale=0.75] at (0:10){ReLU};
 
\end{tikzpicture}\hspace{1cm}
  \caption{Convolution mit Residual Block \cite{He.2015}}
  \label{fig:ResNet}
\end{figure}

\subsubsection{Feature Pyramid Network}
Die Architekturen lassen sich weiter verbessern mit Methoden, die die Auflösung der Feature Maps in den einzelnen Schichten skalieren. Das \gls{FPN} skaliert die Auflösung der Feature Maps mit niedriger Auflösung nach oben für eine bessere Merkmalsextraktion \cite{Lin.1292016}. Abbildung \ref{fig:FPN} zeigt die Methode mit Bottom-up Pathway des Basisnetz und Top-down Pathway für die Hochskalierung \cite{Lin.1292016}. Vor allem werden die High-Level Merkmale, die in niedriger Auflösung, also in den hinteren Schichten eines \gls{CNN}, in kleinen Feature Maps vorliegen, in der Auflösung hochskaliert. Dies verbessert erheblich die Genauigkeit von Objektdetektoren wie dem \gls{SSD}. Für die Hochskalierung der aktuellen Feature Map wird die Feature Map der vorhergehenden Schicht herangezogen, siehe Abbildung \ref{fig:FPN}, \cite{Lin.1292016}.


\begin{figure}[htbp]
  \centering  
  \includegraphics[scale=0.5]{img/FeaturePyramidNetwork.png}
  \caption{Prinzipdarsellung des Feature Pyramid Network links mit Bottom-up und rechts mit Top-down Pathway \cite{Lin.1292016}}
  \label{fig:FPN}
\end{figure}

\FloatBarrier


\subsection{Evaluierung der Objekterkennung}
Für die Evaluierung der Objekterkennung werden mehrere Metriken verwendet. Nachfolgend werden die wichtigsten Metriken vorgestellt.

\subsubsection{Konfusionsmatrix}
Die Konfusionsmatrix teilt jeden Datenpunkt aus einem Vorhersagemodell in vier Kategorien ein, siehe auch Tabelle \ref{tab:Konfusionmatrix}, \cite[156]{Grus.2020}:
\begin{itemize}
\item Richtig positiv (\gls{TP}): Objekt wurde erkannt
\item Falsch positiv (\gls{FP}): Es wurde ein Objekt erkannt, das nicht da ist
\item Falsch negativ (\gls{FN}): Objekt wurde nicht erkannt, obwohl es vorhanden ist
\item Richtig negativ (\gls{TN}): Es wurde kein Objekt erkannt
\end{itemize}



\begin{table}[htbp]
\centering
\noindent
\renewcommand\arraystretch{1.5}
\setlength\tabcolsep{0pt}
\begin{tabular}{c >{\bfseries}r @{\hspace{0.7em}}c @{\hspace{0.4em}}c @{\hspace{0.7em}}l}
  \multirow{10}{*}{\parbox{1.1cm}{\bfseries\raggedleft Realität}} & 
    & \multicolumn{2}{c}{\bfseries Vorhersage} & \\
  & & \bfseries p & \bfseries n & \\
  & p$'$ & \MyBox{True}{Positive} & \MyBox{False}{Negative} & P$'$ \\[2.4em]
  & n$'$ & \MyBox{False}{Positive} & \MyBox{True}{Negative} & N$'$ \\
  & & P & N &
\end{tabular}
\caption{Darstellung der Konfusionmatrix}
\label{tab:Konfusionmatrix}
\end{table}

Aus diesen vier Kategorien lassen sich nun verschiedene Statistiken zur Vorhersagegüte bestimmen, die nun in den nächsten Abschnitten vorgestellt werden \cite[156]{Grus.2020}.

\FloatBarrier

\subsubsection{Accuracy}
Die Accuracy (Treffergenauigkeit) wird als Quotient aus den korrekten Vorhersagen und allen Vorhersagen berechnet, siehe Formel \ref{eq:Accuracy}, \cite[156\psq]{Grus.2020}.

\begin{align}
    Accuracy \:{=}\: \frac{TP + TN}{TP + FP + FN + TN}
    \label{eq:Accuracy}
\end{align}


\subsubsection{Precision und Recall}
\label{PrecisionRecall}
Für die Evaluierung der Objektdetektion wird eine Kombination aus Genauigkeit (Precision) und Sensitivität (Recall) herangezogen. Formel \ref{eq:Precision} zeigt die Berechnung der Precision, die die Genauigkeit misst, wie präzise positive Vorhersagen waren \cite[157]{Grus.2020}. Formel \ref{eq:Recall} zeigt die Berechnung des Recall, der den Anteil der identifizierten Positiven misst \cite[157]{Grus.2020}.

\begin{align}
    Precision \:{=}\: \frac{TP}{TP + FP}
    \label{eq:Precision}
\end{align}

\begin{align}
    Recall \:{=}\: \frac{TP}{TP + FN}
    \label{eq:Recall}
\end{align}

Oft muss ein Kompromiss zwischen Genauigkeit und Sensitivität gefunden werden. Ein Modell, das eine hohe Sensitivität aufweist, wird beim kleinsten Anzeichen eine positive Vorhersage liefern. Dies wird zu mehr falsch Positiven (\gls{FP}) führen. Im Gegenzug wird ein Modell, das eine hohe Genauigkeit aufweist, nur positive Vorhersagen liefern, wenn es sich absolut sicher ist. Dies führt zu mehr falsch Negativen (\gls{FN}) \cite[157]{Grus.2020}.

\subsubsection{Intersection over Union}
Die \gls{IoU} gibt die Genauigkeit der Überlappung zwischen vorhergesagter Bounding Box und Ground Truth Bounding Box an und entscheidet darüber, ob eine Detektion eines Objekts als \gls{TP}, \gls{FP}, \gls{FN} oder \gls{TN} eingeteilt wird \cite[314]{Everingham.2010}. Formel \ref{eq:IoU} und Abbildung \ref{fig:IoU} zeigen die Definition und Berechnung der \gls{IoU} \cite{Rezatofighi.2252019}, \cite[5]{Arulprakash.2021}, \cite[314]{Everingham.2010}.

\begin{align}
    IoU \:{=}\: \frac{\vert A  \cap B \vert}{\vert A  \cup B \vert}
    \label{eq:IoU}
\end{align}

\begin{figure}[htbp]
  \centering  
  \def\firstcircle{(0,0) circle (1cm)}
\def\secondcircle{(0:1.5cm) circle (1cm)}

\colorlet{circle edge}{blue!50}
\colorlet{circle area}{blue!20}

    \tikzset{
 filled/.style = {fill=circle area, draw=circle edge, thick},
outline/.style = {draw=circle edge, thick},
      F/.style = {draw, inner sep=7mm, fit=(current bounding box),
                  node contents={}}
            }
  \subfloat[Area of union
              \label{fig:ven-1a}]{      
\begin{tikzpicture}
    \draw[filled] \firstcircle node {$A$}
                  \secondcircle node {$B$};
    \node (a) [F];                 
    \node[below left] at (a.north east) {$A \cup B$};
\end{tikzpicture}
                                    }% end of subfloat
\hfil
    \subfloat[Area of intersection
              \label{fig:ven-1b}]{
\begin{tikzpicture}
    \begin{scope}
        \clip \firstcircle;
        \fill[filled] \secondcircle;
    \end{scope}
    \draw[outline] \firstcircle node {$A$};
    \draw[outline] \secondcircle node {$B$};
    \node (a) [F];
    \node[below left] at (a.north east) {$A \cap B$};
\end{tikzpicture}
                                    }% end of subfloat          

  \caption{Darstellung der Area of union / intersection \cite[5]{Arulprakash.2021}}
  \label{fig:IoU}
\end{figure}

Meistens wird ein \gls{IoU}-Schwellwert von 0,5 für eine erfolgreiche Detektion, also ein \gls{TP} festgelegt \cite[314]{Everingham.2010}, \cite[104]{Everingham.2015}, wenn die resultierende \gls{IoU} über den Schwellwert von 0,5 liegt, wird die Detektion als korrekt eingestuft \cite[314]{Everingham.2010}, \cite[104]{Everingham.2015}.

\subsubsection{Mean Average Precision / Average Precision / Average Recall}
Die folgenden Erklärungen beziehen sich auf die PascalVOC- und COCO-Metrik \cite{Everingham.2010}, \cite{Everingham.2015}, \cite{cocoEval.8252021}. Die Precision- und Recall-Werte aus Kapitel \ref{PrecisionRecall} lassen sich in einer Precision-Recall-Kurve darstellen. Die \gls{AP} ist der Wert der Fläche unter dieser Kurve und lässt sich allgemein als Integralrechnung darstellen, siehe Formel \ref{eq:APGeneral}, \cite[104]{Everingham.2015}, \cite[12]{EveringhamDevelopmentKit.2012}. Für Formel \ref{eq:APGeneral} muss berücksichtigt werden, dass in der Praxis diskrete Werte von Precision und Recall vorkommen und man sicher gehen muss, dass die Kurve monoton abfällt. Deshalb wird für jeden Recall-Wert geprüft, ob bei einen der nachfolgenden Recall-Werte die Precision größer wird. Falls das zutrifft, wird der maximale Precision-Wert für den nächsten Recall-Wert für die Flächenberechnung verwendet, siehe Formel \ref{eq:PrecisionInterpol} und \ref{eq:APSum}, \cite[12]{EveringhamDevelopmentKit.2012}, \cite[104]{Everingham.2015}. 

\begin{align}
    AP \:{=}\: \int\limits_{0}^{1} Precision(Recall)  \cdot \mathrm{d} Recall 
    \label{eq:APGeneral}
\end{align}

\begin{align}
    Precision_{interp}(Recall) \:{=}\: \max_{Recall'\geq Recall} Precision(Recall')
    \label{eq:PrecisionInterpol}
\end{align}

\begin{align}
    AP \:{=}\: \sum_{i} (Recall_i - Recall_{i-1}) \cdot Precision_{interp}(Recall_i)
    \label{eq:APSum}
\end{align}
 
Die \gls{AP}'s über mehrere Objektklassen lassen sich zur \gls{mAP} zusammenrechnen \cite{cocoEval.8252021}. Wobei die COCO-Metrik nicht zwischen \gls{AP} und \gls{mAP} unterscheidet \cite{cocoEval.8252021}. Hier beinhaltet die \gls{AP} die berechneten Werte der Fläche unter der Precision-Recall-Kurve über alle Objektklassen hinweg und zusätzlich noch bei verschiedenen \gls{IoU}-Schwellwerten von 0,5 bis 0,95 über eine Schrittweite von 0,05 \cite{cocoEval.8252021}. Neben der Precision-Recall-Kurve gibt es auch eine Recall-\gls{IoU}-Kurve. Hier ist der Recall von der \gls{IoU} abhängig und es lässt sich über alle Objektklassen hinweg ein \gls{AR} definieren \cite{cocoEval.8252021}. Für die Evaluierung der trainierten Netze in dieser Arbeit wurde die COCO-Metrik \cite{cocoEval.8252021} verwendet.

\section{Depth Estimation mittels neuronaler Netze}
\label{DepthEstimation}
Neben der Klassifikation und Objektdetektion können \gls{CNN}'s auch als Depth Estimation eingesetzt werden. Hierbei extrahiert das trainierte \gls{CNN} Tiefeninformation aus RGB-Bildern. Interessant sind diese Netze für eine Hindernisvermeidung (Obstacle avoidance), weshalb zwei Netze zur Depth Estimation auch für die vorliegende Masterarbeit eingesetzt wurden. Im Folgenden werden diese näher vorgestellt.

\subsection{MiDaS}
MiDaS \cite{GitHub.1062021b} ist ein ResNet-basiertes \gls{CNN} aus der Arbeit \cite{Xian_2018_CVPR}, \cite{Ranftl.2019}, \cite{Ranftl.3242021}. Dieses extrahiert immer kleinere Feature Maps, die dann wieder mit der Information der jeweils vorherigen Feature Map für eine Tiefenkarte (Disparity Map / Depth Map) hochskaliert werden, siehe Abbildung \ref{fig:DepthEstimationCNNXian}, \cite{Xian_2018_CVPR}.


\begin{figure}[htbp]
  \centering  
  \includegraphics[scale=0.4]{img/DepthEstimationXian.png}
  \caption{Basisarchitektur des MiDaS \cite{Xian_2018_CVPR}}
  \label{fig:DepthEstimationCNNXian}
\end{figure}

Dieses Prinzip der Merkmalsextraktion und des anschließenden Hochskalierens dieser Merkmalskarten (Feature Maps) in \gls{CNN}'s wird auch als Encoder-Decoder-Netzwerk bezeichnet, siehe Abbildung \ref{fig:EncoderDecoder}, \cite{EncoderDecoder7803544}.

\begin{figure}[htbp]
  \centering  
  \includegraphics[scale=0.4]{img/Encoder_Decoder.png}
  \caption{Encoder und Decoder in einem CNN \cite{EncoderDecoder7803544}}
  \label{fig:EncoderDecoder}
\end{figure}


Das MiDaS-Netz wurde mit einer Vielzahl an Datensätzen trainiert, unter anderem mit Trainingsdaten basierend auf 3D-Filmen \cite{Ranftl.2019}. Die Daten bestehen aus RGB-Bildern und den gelabelten Gegenstücken als Tiefenbilder, basierend aus Stereokameras, RGB-D-Kameras, Time-Of-Flight-Sensoren, Laser, \gls{SfM} und synthetischen Daten und enthalten sowohl Indoor- als auch Outdoor-Szenen \cite{Ranftl.2019}. Abbildung \ref{fig:DepthEstimationResults} zeigt einige Resulte des Netzes.


\begin{figure}[htbp]
  \centering  
  \includegraphics[scale=0.3]{img/DepthResultsMiDaS.png}
  \caption{Resultate des MiDaS \cite{Ranftl.2019}}
  \label{fig:DepthEstimationResults}
\end{figure}

\FloatBarrier 

\subsection{PyDnet}
PyDnet \cite{GitHub.1062021c} ist ein ähnliches Netz wie das MiDaS. Es basiert auch auf einem \gls{CNN}, das immer kleinere Feature Maps extrahiert und dann wieder für eine Tiefenkarte hochskaliert \cite{Poggi.2018}, siehe Abbildung \ref{fig:PyDnet}. Das Netz wurde auch mit einer Vielzahl an Datensätzen trainiert, die aus RGB-Bildern und dazugehörigen Tiefenbilder als gelabelten Daten bestehen \cite{Aleotti.2020}.

\begin{figure}[htbp]
  \centering  
  \includegraphics[scale=0.35]{img/PyDNet.png}
  \caption{Architektur des PyDNet \cite{Poggi.2018}}
  \label{fig:PyDnet}
\end{figure}





