172 lines
6.8 KiB
TeX
172 lines
6.8 KiB
TeX
\documentclass[12pt,a4paper,pdftex]{exam}
|
|
|
|
\newcommand{\exercisetopic}{Gradient descent}
|
|
\newcommand{\exercisenum}{9}
|
|
\newcommand{\exercisedate}{December 22th, 2020}
|
|
|
|
\input{../../exercisesheader}
|
|
|
|
\firstpagefooter{Prof. Dr. Jan Benda}{}{jan.benda@uni-tuebingen.de}
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
\begin{document}
|
|
|
|
\input{../../exercisestitle}
|
|
|
|
\begin{questions}
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
\question \qt{Read sections 8.1 -- 8.5 of chapter 8 on ``optimization
|
|
and gradient descent!}\vspace{-3ex}
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
\question \qt{Fitting the time constant of an exponential function}
|
|
Let's assume we record the membrane potential from a photoreceptor
|
|
neuron. We define the resting potential of the neuron to be at
|
|
0\,mV. By means of a brief current injection we increase the
|
|
membrane potential by exactly 1\,mV. We then record how the membrane
|
|
potential decays exponentially down to the resting potential. We are
|
|
interested in the membrane time constant and therefore want to fit
|
|
an exponential function to the recorded time course of the membrane
|
|
potential.
|
|
|
|
\begin{parts}
|
|
\part Implement (and document!) the exponential function
|
|
\begin{equation}
|
|
\label{expfunc}
|
|
x(t) = e^{-t/\tau} \quad , \qquad \tau \in \reZ
|
|
\end{equation}
|
|
with the membrane time constant $\tau$ as a matlab function
|
|
\code{expdecay(t, tau)} that takes as arguments a vector of time
|
|
points and the value of the membrane time constant. The function
|
|
returns \eqnref{expfunc} computed for each time point as a vector.
|
|
\begin{solution}
|
|
\lstinputlisting{expdecay.m}
|
|
\end{solution}
|
|
|
|
\part Let's first generate the data. Set the membrane time
|
|
constant to 10\,ms. Generate a time vector with sample times
|
|
between zero and six times the membrane time constant and a
|
|
sampling interval of 0.05\,ms. Then compute a vector containing
|
|
the corresponding measurements of the membrane potential using the
|
|
\code{expdecay()} function and adding some measurement noise with
|
|
a standard deviation of 0.05\.mV (\code{randn()} function).
|
|
Plot the data.
|
|
\begin{solution}
|
|
\lstinputlisting{expdecaydata.m}
|
|
\end{solution}
|
|
|
|
\part Implement the gradient descent algorithm for finding the
|
|
least squares for the exponential function \eqref{expfunc}. The
|
|
function takes as arguments the measured data, an initial value
|
|
for the estimation of the membrane time constant, the $\epsilon$
|
|
factor, and the threshold for the length of the gradient where to
|
|
terminate the algorithm. The function should return the estimated
|
|
membrane time constant at the minimum of the mean squared error,
|
|
and a vector with the time constants as well as a vector with the
|
|
mean squared errors for each step of the algorithm.
|
|
\begin{solution}
|
|
\lstinputlisting{expdecaydescent.m}
|
|
\end{solution}
|
|
|
|
\part Call the gradient descent function with the generated data.
|
|
Watch the value of the gradient and of tau and adapt $\epsilon$
|
|
and the threshold accordingly (they differ quite dramatically from
|
|
the ones in the script for the cubic fit).
|
|
|
|
\part Generate three plots: (i) the values of the time constant
|
|
for each iteration step, (ii) the mean squared error for each
|
|
iteration step, and (iii) the measured data and the fitted
|
|
exponential function.
|
|
\newsolutionpage
|
|
\begin{solution}
|
|
\lstinputlisting{expdecayplot.m}
|
|
\includegraphics{expdecayplot}
|
|
\end{solution}
|
|
|
|
\end{parts}
|
|
|
|
\continuepage
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
\question \qt{Read sections 8.6 -- 8.8 of chapter 8 on ``optimization
|
|
and gradient descent!}\vspace{-3ex}
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
\question \qt{Fitting an exponential function with two parameters}
|
|
Usually we do not know the exact value of the voltage step. So let's
|
|
make this a paramter, too:
|
|
\begin{equation}
|
|
\label{exp2func}
|
|
x(t) = c e^{-t/\tau} \quad , \qquad c, \tau \in \reZ
|
|
\end{equation}
|
|
|
|
\begin{parts}
|
|
\part Implement the exponential function \eqref{exp2func} as a
|
|
matlab function \code{exp2func(t, p)} that takes as arguments a
|
|
vector of time points and a vector with the two parameter values
|
|
$c$ and $\tau$. The function returns \eqnref{exp2func} computed for
|
|
each time point as a vector.
|
|
\begin{solution}
|
|
\lstinputlisting{exp2func.m}
|
|
\end{solution}
|
|
|
|
\part Plot the error surface, the mean squared error, for a range
|
|
of values for the two parameters $c$ and $\tau$. Try the
|
|
\code{surface()}, the \code{contour()} as well as the
|
|
\code{contourf()} functions to visualize the error surface for the
|
|
data from the previous exercise. You may also want to try to plot
|
|
the logarithm of the mean squared error.
|
|
\begin{solution}
|
|
\lstinputlisting{exp2errorsurface.m}
|
|
\end{solution}
|
|
|
|
\newsolutionpage
|
|
\part Implement the gradient descent algorithm for finding the
|
|
least squares of an arbitrary function. The function takes as
|
|
arguments the measured data, a vector holding the initial values
|
|
of the function parameters, the $\epsilon$ factor, and the
|
|
threshold for the length of the gradient where to terminate the
|
|
algorithm. The function should return the estimated parameter
|
|
values in a vector, and a 2D vector with the parameter values as
|
|
well as a vector with the mean squared errors for each step of the
|
|
algorithm.
|
|
\begin{solution}
|
|
\lstinputlisting{gradientdescent.m}
|
|
\end{solution}
|
|
|
|
\part Call the gradient descent function with the generated data.
|
|
Set $\epsilon=1.0$ and the threshold value initially to 0.001.
|
|
|
|
\part Plot the path of the gradient descent algorithm into the
|
|
error surface.
|
|
|
|
Why appears (potentially) the path of the gradient descent
|
|
algorithm not perpendicular to the contour lines of the error
|
|
surface?
|
|
|
|
\part Plot the data together with the fitted exponential function.
|
|
|
|
\part Then adapt $\epsilon$ and the threshold value to improve the
|
|
convergence of the algortihm to the minimum of the cost function.
|
|
\begin{solution}
|
|
\lstinputlisting{exp2plot.m}
|
|
\includegraphics{exp2plot}
|
|
\end{solution}
|
|
|
|
\part Use the function \code{lsqcurvefit()} provided by matlab to
|
|
find $c$ and $\tau$ for the exponential function describing the
|
|
data. Compare the resulting fit parameters of this function with
|
|
the ones of your gradient descent algorithm. Plot the data
|
|
together with the fitted exponential function.
|
|
\begin{solution}
|
|
\lstinputlisting{exp2fit.m}
|
|
\includegraphics{exp2fit}\\
|
|
Resulting values for $c$ and $\tau$ are similar but not identical.
|
|
\end{solution}
|
|
|
|
\end{parts}
|
|
|
|
\end{questions}
|
|
|
|
\end{document}
|