|
|
|
|
@@ -201,83 +201,124 @@ 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
|
|
|
|
|
\[ m = \frac{f(x + \Delta x) - f(x)}{\Delta x} \] 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:
|
|
|
|
|
\[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{minipage}
|
|
|
|
|
\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 Kontourlinien 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}
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
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 zum Minimum der Fehlerfl\"ache rollen
|
|
|
|
|
und dort zum Stehen kommen. Um den Weg der Kugel mit einem
|
|
|
|
|
Computerprogramm nachvollziehen zu k\"onnen, ben\"otigen wir
|
|
|
|
|
Information \"uber die Richtung des steilsten Gef\"alles an der
|
|
|
|
|
jeweils aktuellen Position.
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
Der Gradient (Box~\ref{partialderivativebox}) der Kostenfunktion
|
|
|
|
|
\[ \nabla e(m,b) = \left( \begin{array}{c} \frac{\partial
|
|
|
|
|
e(m,b)}{\partial m} \\[1ex] \frac{\partial f(m,b)}{\partial
|
|
|
|
|
b} \end{array} \right) \]
|
|
|
|
|
bzgl. der beiden Parameter $m$ und $b$ der Geradengleichung ist ein
|
|
|
|
|
Vektor, der in Richtung des steilsten Anstiegs der Kostenfunktion
|
|
|
|
|
$e(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.
|
|
|
|
|
|
|
|
|
|
\[\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.
|
|
|
|
|
sondern k\"onnen numerisch entsprechend dem Differenzenquotienten
|
|
|
|
|
(Box~\ref{differentialquotientbox}) mit kleinen Schrittweiten $\Delta
|
|
|
|
|
m$ und $\Delta b$ angen\"ahert werden:
|
|
|
|
|
\[\frac{\partial e(m,b)}{\partial m} = \lim\limits_{\Delta m \to
|
|
|
|
|
0} \frac{e(m + \Delta m, b) - e(m,b)}{\Delta m} \approx \frac{e(m + \Delta m, b) -
|
|
|
|
|
e(m,b)}{\Delta m} \; . \]
|
|
|
|
|
|
|
|
|
|
\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
|
|
|
|
|
\includegraphics[width=0.75\columnwidth]{error_gradient}
|
|
|
|
|
\titlecaption{Der Gradienten der Fehlerfl\"ache.}
|
|
|
|
|
{Jeder Pfeil zeigt die Richtung und die
|
|
|
|
|
Steigung f\"ur verschiedene Parameterkombination aus Steigung und
|
|
|
|
|
y-Achsenabschnitt an. Die Kontourlinien im Hintergrund
|
|
|
|
|
$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.
|
|
|
|
|
\begin{exercise}{lsqGradient.m}{}\label{gradientexercise}%
|
|
|
|
|
Implementiere eine Funktion \code{lsqGradient}, die die $x$- und
|
|
|
|
|
$y$-Werte der Messdaten sowie den Parametersatz $(m, b)$ der
|
|
|
|
|
Geradengleichung als 2-elementigen Vektor als Argumente
|
|
|
|
|
entgegennimmt und den Gradienten an dieser Stelle 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
|
|
|
|
|
Benutzt 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 Gradientenabstieg implementiert
|
|
|
|
|
werden. Die daf\"ur ben\"otigten Zutaten sollten wir aus den
|
|
|
|
|
vorangegangenen \"Ubungen haben. Wir brauchen: 1. Die Fehlerfunktion
|
|
|
|
|
Zu guter Letzt muss nur noch der Gradientenabstieg implementiert
|
|
|
|
|
werden. Die daf\"ur ben\"otigten Zutaten haben wir aus den
|
|
|
|
|
vorangegangenen \"Ubungen bereits vorbereitet. 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)$.
|
|
|
|
|
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
|
|
|
|
|
@@ -287,14 +328,14 @@ f\"ur den Abstieg lautet:
|
|
|
|
|
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)\]
|
|
|
|
|
\[p_{i+1} = p_i - \epsilon \cdot \nabla e(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
|
|
|
|
|
\"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}.
|
|
|
|
|
|
|
|
|
|
@@ -318,3 +359,37 @@ Punkte in Abbildung \ref{gradientdescentfig} gro{\ss}.
|
|
|
|
|
\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}. Bei allen nichtlinearen Funktionen, wie z.B. der
|
|
|
|
|
Exponentialfunktion $f(x;\lambda) = \exp(\lambda x)$ gibt es aber
|
|
|
|
|
keine analytische L\"osung, und das Minimum der Kostenfunktion muss
|
|
|
|
|
numerisch, z.B. mit dem Gradientenabstiegsverfhren bestimmt werden.
|
|
|
|
|
|
|
|
|
|
Um noch schneller das Minimum zu finden, kann der Gradientenabstieg
|
|
|
|
|
auf vielf\"altige Wei{\ss}e verfeinert 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}.
|
|
|
|
|
|
|
|
|
|
\begin{important}
|
|
|
|
|
Das Finden des globalen Minimums ist leider nur selten so leicht wie
|
|
|
|
|
bei einem Geradenfit. Oft gibt es 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.
|
|
|
|
|
\end{important}
|
|
|
|
|
|