257 lines
11 KiB
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}
|