This repository has been archived on 2021-05-17. You can view files and clone it, but cannot push or open issues or pull requests.
scientificComputing/regression/lecture/regression.tex

257 lines
11 KiB
TeX

\chapter{\tr{Optimization and Gradient Descent}{Optimierung und Gradientenabstiegsverfahren}}
Ein sehr \"ubliches Problem ist, dass die Abh\"angigkeit von
Messwerten von einem Input Parameter durch ein Modell erkl\"art werden
soll. Die Frage ist, wie man die beste Parametrisierung des Modells
findet. Den Prozess der Prarmeteranpassung nennt man auch Optimierung
oder English Fitting. Betrachtet man zum Beispiel die Punktewolke in
Abbildung \ref{linregressiondatafig} liegt es nahe einen
(verrauschten) linearen Zusammenhang zwischen Einganggr\"{\ss}e
(Input) und Systemantwort (output) zu postulieren.
\begin{figure}
\includegraphics[width=0.45\columnwidth]{lin_regress.pdf}
\caption{\textbf{Blick auf die Rohdaten.} F\"ur eine Reihe von
Eingangswerten, z.B. Stimulusintensit\"aten wurden die Antworten
eines Systems gemessen.}\label{linregressiondatafig}
\end{figure}
Wir nehmen an, dass die lineare Geradengleichung ein guten Modell
f\"ur das zugrundeliegende System ist.
\[f_{m,n}(x) = m\cdot x + n \]
wobei $x$ die Eingangswerte, $f_{m,n}(x)$ die Systemantwort, $m$ die Steigung
und $n$ der y-Achsenabschnitt darstellen (Abbildung
\ref{linregressionslopeintersectfig}). In dieser Gleichung gibt es nur zwei Parameter
und es wird die Kombination von Steigung ($m$) und y-Achsenabschnitt
($n$) gesucht, die die Systemantwort am besten vorhersagen.
\begin{figure}
\begin{minipage}[t]{0.45\columnwidth}
\includegraphics[width=\textwidth]{figures/lin_regress_slope.pdf}
\end{minipage}
\begin{minipage}[t]{0.45\columnwidth}
\includegraphics[width=\textwidth]{figures/lin_regress_abscissa.pdf}
\end{minipage}
\caption{\textbf{Ver\"anderungen der Parameter und ihre Folgen.} Die
linke Abbildung zeigt den Effekt einer Ver\"anderung der Steigung
w\"ahrend die reche Abbildung die Ver\"anderung des
y-Achsenabschnittes
illustriert. }\label{linregressionslopeintersectfig}
\end{figure}
Wie wird nun die optimale Kombination aus Steigung und y-Achsenabschnitt gefunden?
\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} (im
Englischen auch mean square error genannt, 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}
\includegraphics[width=0.5\columnwidth]{figures/linear_least_squares.pdf}
\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$ spanngen 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 man die
Fehlerfl\"ache graphisch durch einen 3-d ``surface-plot''
darstellen. Wobei auf der x- und y-Achse die beiden Parameter und auf
der z-Achse der Fehlerwert aufgetragen wird (Abbildung
\ref{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 uns nun an bei welcher Parameterkombination
der Fehler minimal, beziehungsweise die Parametertrisierung 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 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 \code{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 verheriger \"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 kann man 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 Wiederhole die folgenden Schritte solange, wie die der Gradient \"uber einer bestimmten
Schwelle ist (Es kann z.B. die L\"ange des Gradienten \code{norm(gradient) > 0.1}
benutzt werden):
\begin{itemize}
\item Berechne den Gradienten an der akutellen Position $p_t$.
\item Gehe einen kleinen Schritt ($\epsilon = 0.01$) in die entgegensetzte Richtung des
Gradienten:
\[p_{t+1} = p_t - \epsilon \cdot \bigtriangledown g(m_t, n_t)\]
\end{itemize}
\end{enumerate}
Abbildung \ref{gradientdescentfig} zeigt den Verlauf des
Gradientenabstiegs. Von einer Startposition aus wird die Position
solange ver\"andert, wie der Gradint 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}