\chapter{\tr{Optimization and Gradient Descent}{Optimierung und Gradientenabstiegsverfahren}}

Ein sehr h\"aufiges Problem ist, dass die Abh\"angigkeit von
Messwerten von einer Eingangsgr\"o{\ss}e durch ein Modell erkl\"art
werden soll. Das Modell enth\"alt \"ublicherweise einen oder mehrere
Parameter, die den Zusammenhang modifizieren. Wie soll die beste
Parameterisierung des Modells gefunden werden, so dass das Modell die
Daten am besten beschreibt? Dieser Prozess der Parameteranpassung ist
ein Optimierungsproblem, der besser als Kurvenfit bekannt ist
(\enterm{curve fitting}).

\begin{figure}[tp]
  \includegraphics[width=0.32\columnwidth]{lin_regress}\hfill
  \includegraphics[width=0.32\columnwidth]{lin_regress_slope}\hfill
  \includegraphics[width=0.32\columnwidth]{lin_regress_abscissa}
  \titlecaption{.}{F\"ur eine Reihe von Eingangswerten $x$,
    z.B. Stimulusintensit\"aten, wurden die Antworten $y$ eines
    Systems gemessen (links). Der postulierte lineare Zusammenhang hat
    als freie Parameter die Steigung (mitte) und den
    $y$-Achsenabschnitt (rechts).}\label{linregressiondatafig}
\end{figure}

Die Punktewolke in \figref{linregressiondatafig} legt
zum Beispiel nahe einen (verrauschten) linearen Zusammenhang zwischen
der Eingangsgr\"o{\ss}e $x$ (\enterm{input}) und der Systemantwort
$y$ (\enterm{output}) zu postulieren.
Wir nehmen also an, dass die Geradengleichung 
\[y = f_{m,n}(x) = m\cdot x + n \] ein gutes Modell f\"ur das
zugrundeliegende System sein k\"onnte (Abbildung
\ref{linregressiondatafig}).  Die Geradengleichung hat die
beiden Parameter Steigung $m$ und $y$-Achsenabschnitt $n$ und es wird
die Kombination von $m$ und $n$ gesucht, die die Systemantwort am
besten vorhersagt.

In folgenden Kapitel werden wir anhand dieses Beispiels zeigen,
welchen Methoden hinter einem Kurvenfit stecken, wie also die optimale
Kombination aus Steigung und $y$-Achsenabschnitt gefunden werden kann.


\section{Methode der kleinsten quadratischen Abweichung}

Um die optimale Parameterkombination zu finden muss zun\"achst ein
Ma{\ss} f\"ur den Unterschied zwischen den tats\"achlich gemessenen
und den unter Verwendung eines Parametersatzes vorhergesagten Werten
definiert werden. Eine der am h\"aufigsten verwendeten
Fehlersch\"atzungen ist der \emph{mittlere qaudratische Abstand}
(``mean square error'', Abbildung \ref{leastsquareerrorfig})
\[ e = \frac{1}{N}\sum^{N}_{1=1} \left( y_i - y^{est}_i\right)^2 \; ,\]
wobei $e$ der Fehler, $N$ die Anzahl gemessener Datenpunkte $y_i$ die
Messwerte und $y^{est}_i$ die Vorhersagewerte an den enstprechenden
Stellen sind.

\begin{figure}[tp]
  \includegraphics[width=0.5\columnwidth]{linear_least_squares}
  \caption{\textbf{Ermittlung des Mittleren quadratischen Abstands.}
    Der Abstand zwischen der Vorhersage und dem Modell wird f\"ur
    jeden gemessenen Datenpunkt ermittelt. Die Differenz zwischen
    Messwert und Vorhersage wird quadriert, was zum einen das
    Vorzeichen einer Abweichung entfernt und zum anderen gro{\ss}e
    Abweichungen \"uberproportional st\"arker bestraft als
    kleine. Quelle:
    \url{http://en.wikipedia.org/wiki/Linear_least_squares_(mathematics)}} \label{leastsquareerrorfig}
\end{figure}
      
\begin{exercise}{meanSquareError.m}{}\label{mseexercise}
  Schreibt eine Funktion, die die mittlere quardatische Abweichung
  zwischen den beobachteten Werten $y$ und der Vorhersage $y_{est}$
  berechnet.
\end{exercise}

\section{Zielfunktion --- Objective function}

Schliesst man in die Fehlerfunktion von oben (\"Ubung
\ref{mseexercise}) die Vorhersage des Modells mit ein spricht man von
der Zielfunktion oder Englisch ``objective function'':

\[e(m,n) = \frac{1}{N}\sum^{N}_{1=1} \left( y_i - f_{m,
    n}(x_i)\right )^2\] 

Das Ziel der Parameteranpassung ist es, den Fehler zu minimieren, die
Passung zu optimieren.

\begin{exercise}{lsqError.m}{}
  Implementiere die Zielfunktion (\code{lsqError}) f\"ur die
  Optimierung mit der linearen Geradengleichung.
  \begin{itemize}
  \item Die Funktion \"ubernimmt drei Argumente: das erste ist ein
    2-elementiger Vektor, der die Parameter \code{m} und \code{n}
    enth\"alt. Der zweite sind die x-Werte, an denen gemessen wurde
    und der dritte die zugeh\"origen y-Werte.
  \item Die Funktion gibt den Fehler zur\"uck.
  \end{itemize}
\end{exercise}
 

\section{Fehlerfl\"ache}

Die beiden Parameter $m$ und $n$ spannen eine F\"ache auf. F\"ur jede
Kombination aus $m$ und $n$ erhalten wir Vorhersagewerte, die von den
gemessenen Werten abweichen werden. Es gibt also f\"ur jeden Punkt in
der sogenannten \emph{Fehlerfl\"ache} einen Fehler. In diesem Beispiel
eines 2-dimensionalen Problems (zwei freie Parameter) kann die
Fehlerfl\"ache graphisch durch einen 3-d ``surface-plot'' dargestellt
werden. Dabei werden auf der $x$- und der $y$-Achse die beiden
Parameter und auf der $z$-Achse der Fehlerwert aufgetragen
(\figref{errorsurfacefig}).

\clearpage
\begin{figure}
  \includegraphics[width=0.75\columnwidth]{figures/error_surface.pdf}
  \caption{\textbf{Fehlerfl\"ache.} Die beiden freien Parameter
    unseres Modells spannen die Grundfl\"ache des Plots auf. F\"ur
    jede Kombination von Steigung und y-Achsenabschnitt wird die
    errechnete Vorhersage des Modells mit den Messwerten verglichen
    und der Fehlerwert geplottet.}\label{errorsurfacefig}
\end{figure}

Die Fehlerfl\"ache zeigt an, bei welcher Parameterkombination
der Fehler minimal, beziehungsweise die Parameterisierung optimal an
die Daten angepasst ist. Wie kann die Fehlerfunktion und die durch sie
definierte Fehlerfl\"ache nun benutzt werden, um den
Optimierungsprozess zu leiten? 

\begin{exercise}{errorSurface.m}{}\label{errorsurfaceexercise}
  Ladet den Datensatz \textit{lin\_regression.mat} in den
  Workspace. und schreibt ein Skript \code{errorSurface.m} dass den
  Fehler in Abh\"angigkeit von \code{m} und \code{n} als surface plot
  darstellt (siehe Hilfe f\"ur die \code{surf} Funktion).
\end{exercise}


\section{Gradient}

Man kann sich den Optimierungsprozess veranschaulichen wenn man sich
vorstellt, dass eine Parameterkombination einen Punkt auf der
Fehlerfl\"ache definiert. Wenn von diesem Punkt aus eine Kugel
losgelassen w\"urde, dann w\"urde sie, dem steilsten Gef\"alle
folgend, zum Minimum der Fehlerfl\"ache rollen und dort zum Stehen
kommen. Um dem Computer zu sagen, in welche Richtung die Position
ver\"andert werden soll muss also die Steigung an der aktellen
Position berechnet werden.

Die Steigung einer Funktion an einer Stelle ist die Ableitung der
Funktion an dieser Stelle, die durch den Differenzquotienten f\"ur
unendlich kleine Schritte $h$ bestimmt wird.
\[f'(x) = \lim\limits_{h \rightarrow 0} \frac{f(x + h) - f(x)}{h} \]
Bei unserem Fittingproblem h\"angt die Fehlerfunktion von zwei
Parametern ab und wir bestimmen die Steigung partiell f\"ur jeden
Parameter einzeln. Die partielle Ableitung nach $m$ sieht so aus:
\[\frac{\partial g(m,n)}{\partial m} = \lim\limits_{h \rightarrow 0} \frac{g(m + h, n) - g(m,n)}{h}\]
Da wir die Ver\"anderung des Fehlers in Abh\"angigkeit der beiden
Parameter bewerten, ist der Gradient an der Stelle $(m,n)$ ein
zweielementigen Vektor, der aus den partiellen Ableitungen nach $m$ und
nach $n$ besteht. Die Richtung des Gradienten zeigt die Richtung der
gr\"o{\ss}ten Steigung an, seine L\"ange repr\"asentiert die St\"arke
des Gef\"alles.

\[\bigtriangledown g(m,n) = \left( \frac{\partial g(m,n)}{\partial m}, \frac{\partial g(m,n)}{\partial n}\right)\]
Die partiellen Ableitungen m\"ussen nicht analytisch berechnet werden
sondern wir n\"ahern sie numerisch durch einen sehr kleinen Schritt
an.
\[\frac{\partial g(m,n)}{\partial m} = \lim\limits_{h \rightarrow
  0} \frac{g(m + h, n) - g(m,n)}{h} \approx \frac{g(m + h, n) -
  g(m,n)}{h}\]

Die graphische Dargestellung der Gradienten (Abbildung
\ref{gradientquiverfig}) zeigt, dass diese in die Richtung der
gr\"o{\ss}ten Steigung zeigen. Um zum Minimum der Fehlerfunktion zu
gelangen sollte man also die entgegengesetzte Richtung einschlagen.

\begin{figure}
  \includegraphics[width=0.75\columnwidth]{figures/error_gradient}
  \caption{\textbf{Darstellung der Gradienten f\"ur jede
      Parameterkombination.} Jeder Pfeil zeigt die Richtung und die
    Steigung f\"ur verschiedene Parameterkombination aus Steigung und
    y-Achsenabschnitt an. Die Kontourlinien im Hintergrund
    illustrieren die Fehlerfl\"ache. Warme Farben stehen f\"ur
    gro{\ss}e Fehlerwerte, kalte Farben f\"ur kleine. Jede
    Kontourlinie steht f\"ur eine Linie gleichen
    Fehlers.}\label{gradientquiverfig}
\end{figure}

\begin{exercise}{lsqGradient.m}{}\label{gradientexercise}
  Implementiert eine Funktion \code{lsqGradient}, die den aktuellen
  Parametersatz als 2-elementigen Vektor, die x-Werte und die y-Werte
  als Argumente entgegennimmt und den Gradienten zur\"uckgibt.
\end{exercise}

\begin{exercise}{errorGradient.m}{}
  Benutzt die Funktion aus vorheriger \"Ubung (\ref{gradientexercise}),
  um f\"ur die jede Parameterkombination aus der Fehlerfl\"ache
  (\"Ubung \ref{errorsurfaceexercise}) auch den Gradienten zu
  berechnen und darzustellen. Vektoren im Raum k\"onnen mithilfe der
  Funktion \code{quiver} geplottet werden.
\end{exercise}

\section{Der Gradientenabstieg}

Zu guter Letzt muss ``nur'' noch der Gradientenabstieg implementiert
werden. Die daf\"ur ben\"otigten Zutaten sollten wir aus den
vorangegangenen \"Ubungen haben. Wir brauchen: 1. Die Fehlerfunktion
(\code{meanSquareError.m}), 2. die Zielfunktion (\code{lsqError.m})
und 3. den Gradienten (\code{lsqGradient.m}).  Der Algorithmus
f\"ur den Abstieg lautet:
\begin{enumerate}
\item Starte mit einer beliebigen Parameterkombination $p_0 = (m_0,
  n_0)$.
\item \label{computegradient} Berechne den Gradienten an der akutellen Position $p_i$.
\item Wenn die L\"ange des Gradienten einen bestimmten Wert
  unterschreitet, haben wir das Minum gefunden und k\"onnen die Suche
  abbrechen.  Wir suchen ja das Minimum, bei dem der Gradient gleich
  Null ist. Da aus numerischen Gr\"unden der Gradient nie exakt Null
  werden wird, k\"onnen wir nur fordern, dass er hinreichend klein
  wird (z.B. \code{norm(gradient) < 0.1}).
\item \label{gradientstep} Gehe einen kleinen Schritt ($\epsilon =
  0.01$) in die entgegensetzte Richtung des Gradienten:
  \[p_{i+1} = p_i - \epsilon \cdot \bigtriangledown g(m_i, n_i)\]
\item Wiederhole die Schritte \ref{computegradient} -- \ref{gradientstep}.
\end{enumerate}

Abbildung \ref{gradientdescentfig} zeigt den Verlauf des
Gradientenabstiegs. Von einer Startposition aus wird die Position
solange ver\"andert, wie der Gradient eine bestimmte Gr\"o{\ss}e
\"uberschreitet. An den Stellen, an denen der Gradient sehr stark ist
ist auch die Ver\"anderung der Position gro{\ss} und der Abstand der
Punkte in Abbildung \ref{gradientdescentfig} gro{\ss}.

\begin{figure}[hb]
  \includegraphics[width=0.6\columnwidth]{figures/gradient_descent}
  \caption{\textbf{Gradientenabstieg.} Es wird von einer beliebigen
    Position aus gestartet und der Gradient berechnet und die Position
    ver\"andert. Jeder Punkt zeigt die Position nach jedem
    Optimierungsschritt an.} \label{gradientdescentfig}
\end{figure}

\clearpage
\begin{exercise}{gradientDescent.m}{}
  Implementiere den Gradientenabstieg f\"ur das Problem der
  Parameteranpassung der linearen Geradengleichung an die Messdaten in
  der Datei \code{lin\_regression.mat}.
  \begin{enumerate}
  \item Merke Dir f\"ur jeden Schritt den Fehler zwischen
    Modellvorhersage und Daten.
  \item Erstelle eine Plot, der die Entwicklung des Fehlers als
    Funktion der Optimierungsschritte zeigt.
  \item Erstelle einen Plot, der den besten Fit in die Daten plottet.
  \end{enumerate}
\end{exercise}
