\chapter{\tr{Optimization and gradient descent}{Optimierung und Gradientenabstieg}} \selectlanguage{ngerman} 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 als Kurvenfit bekannt ist (\enterm{curve fitting}). \begin{figure}[t] \includegraphics[width=1\textwidth]{lin_regress}\hfill \titlecaption{Beispieldatensatz f\"ur den Geradenfit.}{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(x; m, b) = m\cdot x + b \] 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 $b$ und es wird die Kombination von $m$ und $b$ gesucht, die die Systemantwort am besten vorhersagt. In folgenden Kapitel werden wir anhand dieses Beispiels zeigen, welche Methoden hinter einem Kurvenfit stecken, wie also numerisch die optimale Kombination aus Steigung und $y$-Achsen\-abschnitt gefunden werden kann. \section{Mittlere quadratischen Abweichung} Zuerst m\"u{\ss}en wir pr\"azisieren, was wir unter optimalen Parametern verstehen. Es sollen die Werte der Parameter der Geradengleichung sein, so dass die entsprechende Gerade am besten die Daten beschreibt. Was meinen wir damit? Jeder $y$-Wert der $N$ Datenpaare wird einen Abstand $y_i - y^{est}_i$ zu den durch das Modell vorhergesagten Werten $y^{est}_i$ (\enterm{estimate}) an den entsprechenden $x$-Werten haben. In unserem Beispiel mit der Geradengleichung ist die Modellvorhersage $y^{est}_i=f(x_i;m,b)$ gegeben durch die Geradengleichung (\figref{leastsquareerrorfig}). F\"ur den besten Fit sollten dieser Abst\"ande m\"oglichst klein sein. Wir k\"onnten z.B. fordern, die Summe $\sum_{i=1}^N y_i - y^{est}_i$ m\"oglichst klein zu machen. Das funktioniert aber nicht, da diese Summe auch dann klein wird, wenn die H\"alfte der $y$-Daten weit oberhalb der Geraden und die andere H\"alfte weit darunter liegt, da sich diese positiven und negativen Werte gegenseitig zu Zahlen nahe Null aufsummieren. Besser w\"are es auf jeden Fall, die Summe des Betrags der Abst\"ande $\sum_{i=1}^N |y_i - y^{est}_i|$ zu betrachten. Ein kleiner Wert der Summe kann dann nur erreicht werden, wenn die Abst\"ande der Datenpunkte von der Kurve tats\"achlich klein sind, unabh\"angig ob sie \"uber oder unter der Gerade liegen. Statt der Summe k\"onnen wir genauso gut fordern, dass der \emph{mittlere} Abstand \begin{equation} \label{meanabserror} f_{dist}(\{(x_i, y_i)\}|\{y^{est}_i\}) = \frac{1}{N} \sum_{i=1}^N |y_i - y^{est}_i| \end{equation} der Menge der $N$ Datenpaare $(x_i, y_i)$ gegeben die Modellvorhersagen $y_i^{est}$ klein sein soll. Am h\"aufigsten wird jedoch bei einem Kurvenfit der \determ[mittlerer quadratische Abstand]{mittlere quadratische Abstand} (\enterm{mean squared distance} oder \enterm{mean squared error}) \begin{equation} \label{meansquarederror} f_{mse}(\{(x_i, y_i)\}|\{y^{est}_i\}) = \frac{1}{N} \sum_{i=1}^N (y_i - y^{est}_i)^2 \end{equation} verwendet (\figref{leastsquareerrorfig}). Wie beim Betrag sind die quadratischen Abst\"ande immer positiv, unabh\"angig ob die Datenwerte \"uber oder unter der Kurve liegen. Durch das Quadrat werden zus\"atzlich gro{\ss}e Abst\"ande st\"arker gewichtet. \begin{exercise}{meanSquareError.m}{}\label{mseexercise}% Schreibe eine Funktion \code{meanSquareError()}, die die mittlere quadratische Abweichung zwischen einem Vektor mit den beobachteten Werten $y$ und einem Vektor mit den entsprechenden Vorhersagen $y^{est}$ berechnet. \pagebreak[4] \end{exercise} \section{Zielfunktion} $f_{cost}(\{(x_i, y_i)\}|\{y^{est}_i\})$ ist eine sogenannte \determ{Zielfunktion}, oder \determ{Kostenfunktion} (\enterm{objective function}, \enterm{cost function}), da wir die Modellvorhersage so anpassen wollen, dass der mittlere quadratische Abstand, also die Zielfunktion, minimiert wird. In Kapitel~\ref{maximumlikelihoodchapter} werden wir sehen, dass die Minimierung des mittleren quadratischen Abstands \"aquivalent zur Maximierung der Wahrscheinlichkeit ist, dass die Daten aus der Modellfunktion stammen, unter der Vorraussetzung, dass die Daten um die Modellfunktion normalverteilt streuen. \begin{figure}[t] \includegraphics[width=1\textwidth]{linear_least_squares} \titlecaption{Ermittlung des mittleren quadratischen Abstands.} {Der Abstand (\enterm{error}, orange) zwischen der Vorhersage (rote Gerade) und den Messdaten (blaue Punkte) wird f\"ur jeden gemessenen Datenpunkt ermittelt (links). Anschlie{\ss}end werden die Differenzen zwischen Messwerten und Vorhersage quadriert (\enterm{squared error}) und der Mittelwert berechnet (rechts).} \label{leastsquareerrorfig} \end{figure} Die Kostenfunktion mu{\ss} nicht immer der mittlere quadratische Abstand sein. Je nach Problemstellung kann die Kostenfunktion eine beliebige Funktion sein, die die Parameter eines Modells auf einen Wert abbildet, der in irgendeiner Weise die Qualit\"at des Modells quantifiziert. Ziel ist es dann, diejenigen Parameterwerte zu finden, bei der die Kostenfunktion minimiert wird. %%% Einfaches verbales Beispiel? Wenn wir nun in unsere Gleichung \eqref{meansquarederror} f\"ur die Modellvorhersage $y^{est}$ die Geradengleichung einsetzen, erhalten wir f\"ur die Zielfunktion \begin{eqnarray} f_{cost}(\{(x_i, y_i)\}|m,b) & = & \frac{1}{N} \sum_{i=1}^N (y_i - f(x_i;m,b))^2 \label{msefunc} \\ & = & \frac{1}{N} \sum_{i=1}^N (y_i - m x_i - b)^2 \label{mseline} \end{eqnarray} den mittleren quadratischen Abstand der Datenpaare $(x_i, y_i)$ gegeben die Parameterwerte $m$ und $b$ der Geradengleichung. Ziel des Kurvenfits ist es, die Werte f\"ur $m$ und $b$ so zu optimieren, dass der Fehler \eqnref{mseline} minimal wird (\determ{Methode der kleinsten Quadrate}, \enterm{least square error}). \begin{exercise}{lsqError.m}{} Implementiere die Zielfunktion f\"ur die Optimierung mit der linearen Geradengleichung als Funktion \code{lsqError()}. \begin{itemize} \item Die Funktion \"ubernimmt drei Argumente: Das erste Argument ist ein 2-elementiger Vektor, der die Parameter \varcode{m} und \varcode{b} enth\"alt. Das zweite ist ein Vektor mit den $x$-Werten, an denen gemessen wurde, und das dritte ein Vektor mit den zugeh\"origen $y$-Werten. \item Die Funktion gibt als Ergebniss den Fehler als mittleren quadratischen Abstand \eqnref{mseline} zur\"uck. \item Die Funktion soll die Funktion \code{meanSquareError()} der vorherigen \"Ubung benutzen. \end{itemize} \end{exercise} \section{Fehlerfl\"ache} Die beiden Parameter $m$ und $b$ der Geradengleichung spannen eine F\"ache auf. F\"ur jede Kombination aus $m$ und $b$ k\"onnen wir den Wert der Zielfunktion, hier der mittlere quadratische Abstand \eqnref{meansquarederror}, berechnen. Wir betrachten also die Kostenfunktion $f_{cost}(\{(x_i, y_i)\}|m,b)$ nun als Funktion $f_{cost}(m,b)$, die die beiden Variablen $m$ und $b$ auf einen Fehlerwert abbildet. Es gibt also f\"ur jeden Punkt in der sogenannten \determ{Fehlerfl\"ache} einen Fehlerwert. In diesem Beispiel eines 2-dimensionalen Problems (zwei freie Parameter) kann die Fehlerfl\"ache graphisch durch einen 3-d \enterm{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}). \begin{figure}[t] \includegraphics[width=0.75\columnwidth]{error_surface.pdf} \titlecaption{Fehlerfl\"ache.}{Die beiden freien Parameter unseres Modells $m$ und $b$ spannen die Grundfl\"ache des Plots auf. F\"ur jede Kombination von Steigung $m$ und $y$-Achsenabschnitt $b$ wird die errechnete Vorhersage des Modells mit den Messwerten verglichen und der Fehlerwert geplottet. Die sich ergebende Fehlerfl\"ache hat ein Minimum (roter Punkt) bei den Werten von $m$ und $b$, f\"ur die die Gerade die Daten am besten beschreibt.}\label{errorsurfacefig} \end{figure} \begin{exercise}{errorSurface.m}{}\label{errorsurfaceexercise}% Lade den Datensatz \textit{lin\_regression.mat} in den Workspace (20 Datenpaare in den Vektoren \varcode{x} und \varcode{y}). Schreibe ein Skript \file{errorSurface.m}, dass den Fehler, berechnet als mittleren quadratischen Abstand zwischen den Daten und einer Geraden mit Steigung $m$ und $y$-Achsenabschnitt $b$, in Abh\"angigkeit von $m$ und $b$ als surface plot darstellt (siehe Hilfe f\"ur die \code{surf()} Funktion). \end{exercise} An der Fehlerfl\"ache kann direkt erkannt werden, 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? Die naheliegenste Variante ist, von der Fehlerfl\"ache einfach den Ort des globalen Minimums zu bestimmen. Das ist im Allgemeinen jedoch zu rechenintensiv, da f\"ur jede m\"ogliche Kombination der Parameter der Fehler berechnet werden muss. Die Anzahl der n\"otigen Berechnungen steigt exponentiell mit der Anzahl der Parameter (``Fluch der Dimension''). Auch eine bessere Genauigkeit, mit der das Minimum bestimmt werden soll, erh\"oht die Anzahl der n\"otigen Berechnungen. Wir suchen also ein Verfahren, dass das Minimum der Kostenfunktion mit m\"oglichst wenigen Berechnungen findet. \begin{ibox}[t]{\label{differentialquotientbox}Differenzenquotient und Ableitung} \includegraphics[width=0.33\textwidth]{derivative} \hfill \begin{minipage}[b]{0.63\textwidth} Der Differenzenquotient \begin{equation} \label{difffrac} m = \frac{f(x + \Delta x) - f(x)}{\Delta x} \end{equation} einer Funktion $y = f(x)$ ist die Steigung der Sekante (rot) durch die beiden Punkte $(x,f(x))$ und $(x+\Delta x,f(x+\Delta x))$ mit dem Abstand $\Delta x$. Die Steigung einer Funktion $y=f(x)$ an einer Stelle $x$ (gelb) wird durch die Ableitung $f'(x)$ der Funktion an dieser Stelle berechnet. Die Ableitung ist \"uber den Grenzwert (orange) des Differenzenquotienten f\"ur unendlich kleine Abst\"ande $\Delta x$ definiert: \begin{equation} \label{derivative} f'(x) = \frac{{\rm d} f(x)}{{\rm d}x} = \lim\limits_{\Delta x \to 0} \frac{f(x + \Delta x) - f(x)}{\Delta x} \end{equation} \end{minipage}\vspace{2ex} Numerisch kann der Grenzwert \eqnref{derivative} nicht gebildet werden. Die Ableitung kann nur durch den Differenzenquotienten \eqnref{difffrac} mit gen\"ugend kleinem $\Delta x$ angen\"ahert werden. \end{ibox} \begin{ibox}[t]{\label{partialderivativebox}Partielle Ableitungen und Gradient} Bei Funktionen \[ z = f(x,y) \] die von mehreren Variablen, z.B. $x$ und $y$ abh\"angen, kann die Steigung in Richtung jeder dieser Variablen mit den partiellen Ableitungen \[ \frac{\partial f(x,y)}{\partial x} = \lim\limits_{\Delta x \to 0} \frac{f(x + \Delta x,y) - f(x,y)}{\Delta x} \] und \[ \frac{\partial f(x,y)}{\partial y} = \lim\limits_{\Delta y \to 0} \frac{f(x, y + \Delta y) - f(x,y)}{\Delta y} \] definiert \"uber den jeweiligen Differenzenquotienten (Box~\ref{differentialquotientbox}) berechnet werden. \vspace{1ex} \begin{minipage}[t]{0.44\textwidth} \mbox{}\\[-2ex] \includegraphics[width=1\textwidth]{gradient} \end{minipage} \hfill \begin{minipage}[t]{0.52\textwidth} Z.B. lauten die partiellen Ableitungen von \[ f(x,y) = x^2+y^2 \] \[ \frac{\partial f(x,y)}{\partial x} = 2x \; , \quad \frac{\partial f(x,y)}{\partial y} = 2y \; .\] Der Gradient ist der aus den partiellen Ableitungen gebildete Vektor \[ \nabla f(x,y) = \left( \begin{array}{c} \frac{\partial f(x,y)}{\partial x} \\[1ex] \frac{\partial f(x,y)}{\partial y} \end{array} \right) \] und zeigt in Richtung des st\"arksten Anstiegs der Funktion $f(x,y)$. \end{minipage} \vspace{1ex} Die Abbildung zeigt die Konturlinien einer bivariaten Gau{\ss}glocke $f(x,y) = \exp(-(x^2+y^2)/2)$ und den Gradienten mit seinen partiellen Ableitungen an drei verschiedenen Stellen. \end{ibox} \section{Gradient} Wenn eine Kugel an einem beliebigen Startpunkt auf der Fehlerfl\"ache \figref{errorsurfacefig} losgelassen werden w\"urde, dann w\"urde sie entlang des steilsten Gef\"alles auf schnellsten Wege zum Minimum der Fehlerfl\"ache rollen und dort zum Stehen kommen (wenn sie keine Tr\"agheit besitzen w\"urde). Den Weg der Kugel wollen wir nun als Grundlage unseres Algorithmus zur Bestimmung des Minimums der Kostenfunktion verwenden. Da die Kugel immer entlang des steilsten Gef\"alles rollt, ben\"otigen wir Information \"uber die Richtung des Gef\"alles an der jeweils aktuellen Position. Der \determ{Gradient} (Box~\ref{partialderivativebox}) der Kostenfunktion \[ \nabla f_{cost}(m,b) = \left( \frac{\partial f(m,b)}{\partial m}, \frac{\partial f(m,b)}{\partial b} \right) \] bzgl. der beiden Parameter $m$ und $b$ der Geradengleichung ist ein Vektor, der in Richtung des steilsten Anstiegs der Kostenfunktion $f_{cost}(m,b)$ zeigt. Die L\"ange des Gradienten gibt die St\"arke des Anstiegs an (\figref{gradientquiverfig})). Da wir aber abw\"arts zum Minimum laufen wollen, m\"ussen wir die dem Gradienten entgegengesetzte Richtung einschlagen. Die partiellen Ableitungen m\"ussen nicht analytisch berechnet werden sondern k\"onnen numerisch entsprechend dem Differenzenquotienten (Box~\ref{differentialquotientbox}) mit kleinen Schrittweiten $\Delta m$ und $\Delta b$ angen\"ahert werden. z.B. approximieren wir die partielle Ableitung nach $m$ durch \[\frac{\partial f_{cost}(m,b)}{\partial m} = \lim\limits_{\Delta m \to 0} \frac{f_{cost}(m + \Delta m, b) - f_{cost}(m,b)}{\Delta m} \approx \frac{f_{cost}(m + \Delta m, b) - f_{cost}(m,b)}{\Delta m} \; . \] \begin{figure}[t] \includegraphics[width=0.75\columnwidth]{error_gradient} \titlecaption{Gradient der Fehlerfl\"ache.} {Jeder Pfeil zeigt die Richtung und die Steigung f\"ur verschiedene Parameterkombination aus Steigung und $y$-Achsenabschnitt an. Die Konturlinien im Hintergrund illustrieren die Fehlerfl\"ache. Warme Farben stehen f\"ur gro{\ss}e Fehlerwerte, kalte Farben f\"ur kleine. Jede Konturlinie steht f\"ur eine Linie gleichen Fehlers.}\label{gradientquiverfig} \end{figure} \begin{exercise}{lsqGradient.m}{}\label{gradientexercise}% Implementiere eine Funktion \code{lsqGradient()}, die den Parametersatz $(m, b)$ der Geradengleichung als 2-elementigen Vektor sowie die $x$- und $y$-Werte der Messdaten als Argumente entgegennimmt und den Gradienten an dieser Stelle zur\"uckgibt. \end{exercise} \begin{exercise}{errorGradient.m}{} Benutze die Funktion aus der vorherigen \"Ubung (\ref{gradientexercise}), um f\"ur 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{Gradientenabstieg} Zu guter Letzt muss nur noch der \determ{Gradientenabstieg} implementiert werden. Die daf\"ur ben\"otigten Zutaten haben wir aus den vorangegangenen \"Ubungen bereits vorbereitet. Wir brauchen: 1. Die Fehlerfunktion (\code{meanSquareError()}), 2. die Zielfunktion (\code{lsqError()}) und 3. den Gradienten (\code{lsqGradient()}). Der Algorithmus f\"ur den Abstieg lautet: \begin{enumerate} \item Starte mit einer beliebigen Parameterkombination $p_0 = (m_0, b_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. \varcode{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 \nabla f_{cost}(m_i, b_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}[t] \includegraphics[width=0.6\columnwidth]{gradient_descent} \titlecaption{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} \begin{exercise}{gradientDescent.m}{} Implementiere den Gradientenabstieg f\"ur das Problem der Parameteranpassung der linearen Geradengleichung an die Messdaten in der Datei \file{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} \section{Fazit} Mit dem Gradientenabstieg haben wir eine wichtige Methode zur Bestimmung eines globalen Minimums einer Kostenfunktion kennengelernt. F\"ur den Fall des Kurvenfits mit einer Geradengleichung zeigt der mittlere quadratische Abstand als Kostenfunktion in der Tat ein einziges klar definiertes Minimum. Wie wir im n\"achsten Kapitel sehen werden, kann die Position des Minimums bei Geradengleichungen sogar analytisch bestimmt werden, der Gradientenabstieg w\"are also gar nicht n\"otig \matlabfun{polyfit()}. F\"ur Parameter, die nichtlinear in einer Funktion enthalten sind, wie z.B. die Rate $\lambda$ als Parameter in der Exponentialfunktion $f(x;\lambda) = \exp(\lambda x)$, gibt es keine analytische L\"osung, und das Minimum der Kostenfunktion muss numerisch, z.B. mit dem Gradientenabstiegsverfahren bestimmt werden. Um noch schneller das Minimum zu finden, kann das Verfahren des Gradientenabstiegs auf vielf\"altige Weise verbessert werden. z.B. kann die Schrittweite an die St\"arke des Gradienten angepasst werden. Diese numerischen Tricks sind in bereits vorhandenen Funktionen implementiert. Allgemeine Funktionen sind f\"ur beliebige Kostenfunktionen gemacht \matlabfun{fminsearch()}, w\"ahrend spezielle Funktionen z.B. f\"ur die Minimierung des quadratischen Abstands bei einem Kurvenfit angeboten werden \matlabfun{lsqcurvefit()}. \newpage \begin{important}[Achtung Nebenminima!] Das Finden des globalen Minimums ist leider nur selten so leicht wie bei einem Geradenfit. Oft hat die Kostenfunktion viele Nebenminima, in denen der Gradientenabstieg enden kann, obwohl das gesuchte globale Minimum noch weit entfernt ist. Darum ist es meist sehr wichtig, wirklich gute Startwerte f\"ur die zu bestimmenden Parameter der Kostenfunktion zu haben. Auch sollten nur so wenig wie m\"oglich Parameter gefittet werden, da jeder zus\"atzliche Parameter den Optimierungsprozess schwieriger und rechenaufw\"andiger macht. \end{important} \selectlanguage{english}