\chapter{\acfp{CNN}}
\label{cnn}
    \acp{CNN} enthalten 3 wichtige Bestandteilen:
    \begin{center}
        \includegraphics[width=.7\textwidth]{cnn_building_blocks.png}
    \end{center}
    Diese Bestandteile können beliebig oft hintereinander geschaltet sein.
    Zudem ist an ein komplettes \ac{CNN} zumeist noch ein weiteres Netzwerk für die Ausgabe der Vorhersage angeschlossen:
    \begin{center}
        \includegraphics[width = .7\textwidth]{cnn_complete.png}
    \end{center}

    \section{convolutional stage}
    \label{cnn: convolutional stage}
        In der \say{convolutional stage} werden \say{convolutional layer} (Faltunsschicht) verwendet.
        Diese wenden einen beweglichen Filter (detector) auf die Daten der vorhergegangenen Schicht an.
        Hierbei stellt der detector ein Rezeptives Feld dar (vergleichbar mit dem Auge).\\
        \includegraphics[width = \textwidth]{convolutional_operation.png}\\
        \begin{wrapfigure}{r}{.4\textwidth}
            \includegraphics[width = .4\textwidth]{cnn_inter_layer_connection.png}
        \end{wrapfigure}
        Aufgrund der geringen Größe des rezeptiven Feldes ist jedes Neuron in der nachfolgenden Schicht jeweils nur mit wenigen Neuronen in der unterliegenden Schicht verbunden:\\
        \vspace{30mm}

        \includegraphics[width=\textwidth]{convolutional filter.png}
\pagebreak

        \subsection{Beispiel}
        \label{cnn: example}
            Im folgenden wird das Verfahren des convolutional layers anhand von $3\times 3$ Filtern demononstriert.
            Diese werden auf einem $6\times 6$ Bild verschoben.
            Die Filter sollen jeweils unterschiedliche geometrische Formen erkennen (Filter1: Diagonalen)\\
            \includegraphics[width=.6\textwidth]{cnn_example1.png}\\
            Über den Parameter \say{stride} kann eingestellt werden, um wieviele Elemente der Filter jeweils verschoben wird:\\
            \includegraphics[width = .7\textwidth]{cnn_example_stride1.png}\\
            \includegraphics[width = .7\textwidth]{cnn_example_stride2.png}\\
            Für jeden Filter entsteht durch diese Anwendung ein kleineres Bild, welches aus dem Ausgangsbild errechnet wurde:\\
            \includegraphics[width=.8\textwidth]{cnn_feature_map1.png}\\
            Durch die Anwendung der verschiedenen Filter entsteht hierbei eine mehrdimensionale \say{Feature Map}.
            Diese wird allgemein als \say{Tensor} bezeichnet:\\
            \includegraphics[width=.8\textwidth]{cnn_feature_map2.png}\\
\pagebreak

        \subsection{Convolutional vs. Fully Connected}
        \label{cnn: convolutional vs. fully connected}
            Der Vorteil, den der Ansatz der Faltungsschichten gegenüber dem einsatz von \say{fully connected layers} hat ist,
            dass deutlich weniger Parameter benötigt werden.\\
            \includegraphics[width = .8\textwidth]{convolutional_vs_fully-connected.png}

    \section{non-linear stage}
    \label{cnn: non-linear stage}
        Es ist mathematisch beweisbar, dass für die Abbildung von gleichen Äquivalenzklassen auf eine Referenzklasse eine nicht-linear Funktion benötigt wird.
        Hierbei gibt es mehrere mögliche Funktionen.
        Die bekannteste ist hierbei die \say{Sigmoid}-Funktion.
        Bei \acp{CNN} wird allerdings meistens die \say{ReLU}-Funktion verwendet.\\
        \includegraphics[width = .9\textwidth]{non-linear_functions.png}

    \section{Pooling}
    \label{cnn:pooling}
        Beim \say{Pooling} wird die Menge der Elemente in einer Schicht reduziert.
        Hierbei wird darauf geachtet, dass nur unwichtige Daten \say{verloren gehen}.
        Man spricht auch von \say{Subsampling}.\\
        \includegraphics[width = .8\textwidth]{subsampling.png}

        \subsection{Max Pooling}
        \label{cnn: max pooling}
            Das \say{Max Pooling} ist eine Form des Poolings, bei dem mehrere Elemente einer schicht dadurch zusammengefasst werden,
            dass nur die Element mit dem höchsten Wert erhalten bleiben.\\
            \includegraphics[width = .8\textwidth]{max_pooling.png}

    \section{Regularisierung}
    \label{cnn: regularisierung}
        Um Overfitting zu vermeiden können die Verlustfunktionen (Zusammenfassung KI),
        mithilfe derer die Gewichte über Backpropagation (\ref{knn: backpropagation}) geupdated werden,
        regularisiert werden.\\
        \textbf{Vorsicht:} eine zu starke Regularisierung kann zu einem Underfitting führen,
        wohingegen eine zu schwache Regularisierung das Overfitting nicht verhindert.
        Meist lässt sich die \say{Stärke} der Regularisierung durch eine Parameter ($\lambda$) vorgeben.

        \subsection{Lasso Regularisierung}
        \label{cnn: lasso regularisierung}
            Die Lasso Regularisierung nutzt die $L_1$-Norm:
            $$L_1(\bm{w})=\sum_{w_i\in\bm{w}}|w_i|$$
            Hierdurch ergibt sich für den Wert, mit dem die Gewichte geupdated werden:
            $$V(y,y')+\lambda\cdot L_1(\bm{w}) = V(y,y') + \lambda\cdot\sum_{w_i\in\bm{w}}|w_i|$$
        
        \subsection{Tikhonov Regularisierung}
        \label{cnn: ridge regression}
            Die auch als \say{Ridge Regression} bekannte Regularisierung nutzt die $L_2$-Norm:
            $$L_2(\bm{w})=\sqrt{\sum_{w_i\in\bm{w}}|w_i|^2}$$
            Hierdurch ergibt sich für den Wert, mit dem die Gewichte geupdated werden:
            $$V(y,y')+\lambda\cdot L_2^2(\bm{w}) = V(y,y') + \lambda\cdot\sum_{w_i\in\bm{w}}|w_i|^2$$

        \subsection{Early Stopping}
        \label{cnn: early stopping}
            Das Verfahren des \say{Early Stopping} kann als eine Regularisierung in der Zeit betrachtet werden.
            Hierbei wird nach einer bestimmten Anzahl von Epochen das Lernen beendet.
            Dies kann ebenfalls ein Overfitting verhindern.