From c71c008945f67f3bbb8a647ce855ac801f15b1db Mon Sep 17 00:00:00 2001 From: mhjensen Date: Fri, 12 Oct 2018 04:55:15 +0200 Subject: [PATCH] updating splines --- doc/pub/NeuralNet/ipynb/NeuralNet.ipynb | 124 ++---- doc/pub/Splines/html/._Splines-bs000.html | 173 ++++---- doc/pub/Splines/html/._Splines-bs001.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs002.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs003.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs004.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs005.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs006.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs007.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs008.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs009.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs010.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs011.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs012.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs013.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs014.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs015.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs016.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs017.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs018.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs019.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs020.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs021.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs022.html | 171 ++++---- doc/pub/Splines/html/._Splines-bs023.html | 209 +++++---- doc/pub/Splines/html/._Splines-bs024.html | 217 +++++----- doc/pub/Splines/html/._Splines-bs025.html | 259 ++++++----- doc/pub/Splines/html/._Splines-bs026.html | 237 ++++++---- doc/pub/Splines/html/._Splines-bs027.html | 203 +++++---- doc/pub/Splines/html/._Splines-bs028.html | 203 +++++---- doc/pub/Splines/html/._Splines-bs029.html | 195 +++++---- doc/pub/Splines/html/._Splines-bs030.html | 186 ++++---- doc/pub/Splines/html/._Splines-bs031.html | 212 +++++---- doc/pub/Splines/html/._Splines-bs032.html | 237 +++++----- doc/pub/Splines/html/._Splines-bs033.html | 206 +++++---- doc/pub/Splines/html/._Splines-bs034.html | 234 +++++----- doc/pub/Splines/html/._Splines-bs035.html | 243 ++++++----- doc/pub/Splines/html/._Splines-bs036.html | 231 ++++++---- doc/pub/Splines/html/._Splines-bs037.html | 222 +++++----- doc/pub/Splines/html/._Splines-bs038.html | 221 ++++++---- doc/pub/Splines/html/._Splines-bs039.html | 201 +++++---- doc/pub/Splines/html/._Splines-bs040.html | 192 +++++---- doc/pub/Splines/html/._Splines-bs041.html | 214 +++++----- doc/pub/Splines/html/._Splines-bs042.html | 225 +++++----- doc/pub/Splines/html/._Splines-bs043.html | 207 +++++---- doc/pub/Splines/html/._Splines-bs044.html | 211 ++++----- doc/pub/Splines/html/._Splines-bs045.html | 212 +++++---- doc/pub/Splines/html/._Splines-bs046.html | 192 +++++---- doc/pub/Splines/html/._Splines-bs047.html | 193 +++++---- doc/pub/Splines/html/._Splines-bs048.html | 199 +++++---- doc/pub/Splines/html/._Splines-bs049.html | 198 +++++---- doc/pub/Splines/html/._Splines-bs050.html | 206 ++++----- doc/pub/Splines/html/._Splines-bs051.html | 208 +++++---- doc/pub/Splines/html/._Splines-bs052.html | 224 +++++----- doc/pub/Splines/html/._Splines-bs053.html | 373 ++++++++++++++++ doc/pub/Splines/html/._Splines-bs054.html | 404 ++++++++++++++++++ doc/pub/Splines/html/._Splines-bs055.html | 330 ++++++++++++++ doc/pub/Splines/html/._Splines-bs056.html | 356 +++++++++++++++ doc/pub/Splines/html/._Splines-bs057.html | 344 +++++++++++++++ doc/pub/Splines/html/._Splines-bs058.html | 353 +++++++++++++++ doc/pub/Splines/html/._Splines-bs059.html | 358 ++++++++++++++++ doc/pub/Splines/html/._Splines-bs060.html | 362 ++++++++++++++++ doc/pub/Splines/html/._Splines-bs061.html | 356 +++++++++++++++ doc/pub/Splines/html/._Splines-bs062.html | 355 +++++++++++++++ doc/pub/Splines/html/._Splines-bs063.html | 364 ++++++++++++++++ doc/pub/Splines/html/._Splines-bs064.html | 363 ++++++++++++++++ doc/pub/Splines/html/._Splines-bs065.html | 358 ++++++++++++++++ doc/pub/Splines/html/._Splines-bs066.html | 334 +++++++++++++++ doc/pub/Splines/html/._Splines-bs067.html | 343 +++++++++++++++ doc/pub/Splines/html/._Splines-bs068.html | 341 +++++++++++++++ doc/pub/Splines/html/._Splines-bs069.html | 348 +++++++++++++++ doc/pub/Splines/html/._Splines-bs070.html | 342 +++++++++++++++ doc/pub/Splines/html/._Splines-bs071.html | 334 +++++++++++++++ doc/pub/Splines/html/._Splines-bs072.html | 343 +++++++++++++++ doc/pub/Splines/html/._Splines-bs073.html | 326 ++++++++++++++ doc/pub/Splines/html/Splines-bs.html | 173 ++++---- doc/pub/Splines/html/Splines-reveal.html | 286 +++++++++++-- doc/pub/Splines/html/Splines-solarized.html | 348 +++++++++++---- doc/pub/Splines/html/Splines.html | 348 +++++++++++---- doc/pub/Splines/ipynb/Splines.ipynb | 364 +++++++++++++++- .../Splines/ipynb/ipynb-Splines-src.tar.gz | Bin 209 -> 209 bytes doc/pub/Splines/pdf/Splines-minted.pdf | Bin 419239 -> 452393 bytes doc/src/Splines/Splines.do.txt | 159 +++++++ 83 files changed, 14530 insertions(+), 4991 deletions(-) create mode 100644 doc/pub/Splines/html/._Splines-bs053.html create mode 100644 doc/pub/Splines/html/._Splines-bs054.html create mode 100644 doc/pub/Splines/html/._Splines-bs055.html create mode 100644 doc/pub/Splines/html/._Splines-bs056.html create mode 100644 doc/pub/Splines/html/._Splines-bs057.html create mode 100644 doc/pub/Splines/html/._Splines-bs058.html create mode 100644 doc/pub/Splines/html/._Splines-bs059.html create mode 100644 doc/pub/Splines/html/._Splines-bs060.html create mode 100644 doc/pub/Splines/html/._Splines-bs061.html create mode 100644 doc/pub/Splines/html/._Splines-bs062.html create mode 100644 doc/pub/Splines/html/._Splines-bs063.html create mode 100644 doc/pub/Splines/html/._Splines-bs064.html create mode 100644 doc/pub/Splines/html/._Splines-bs065.html create mode 100644 doc/pub/Splines/html/._Splines-bs066.html create mode 100644 doc/pub/Splines/html/._Splines-bs067.html create mode 100644 doc/pub/Splines/html/._Splines-bs068.html create mode 100644 doc/pub/Splines/html/._Splines-bs069.html create mode 100644 doc/pub/Splines/html/._Splines-bs070.html create mode 100644 doc/pub/Splines/html/._Splines-bs071.html create mode 100644 doc/pub/Splines/html/._Splines-bs072.html create mode 100644 doc/pub/Splines/html/._Splines-bs073.html diff --git a/doc/pub/NeuralNet/ipynb/NeuralNet.ipynb b/doc/pub/NeuralNet/ipynb/NeuralNet.ipynb index 0c42fc8c4..d97039c78 100644 --- a/doc/pub/NeuralNet/ipynb/NeuralNet.ipynb +++ b/doc/pub/NeuralNet/ipynb/NeuralNet.ipynb @@ -597,9 +597,7 @@ { "cell_type": "code", "execution_count": 1, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", @@ -1520,9 +1518,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# import necessary packages\n", @@ -1589,9 +1585,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n", @@ -1713,9 +1707,7 @@ { "cell_type": "code", "execution_count": 4, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# building our neural network\n", @@ -1792,9 +1784,7 @@ { "cell_type": "code", "execution_count": 5, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# setup the feed-forward pass, subscript h = hidden layer\n", @@ -1957,9 +1947,7 @@ { "cell_type": "code", "execution_count": 6, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# to categorical turns our integer vector into a onehot representation\n", @@ -2061,9 +2049,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "class NeuralNetwork:\n", @@ -2186,9 +2172,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "epochs = 100\n", @@ -2222,9 +2206,7 @@ { "cell_type": "code", "execution_count": 9, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "eta_vals = np.logspace(-5, 1, 7)\n", @@ -2259,9 +2241,7 @@ { "cell_type": "code", "execution_count": 10, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# visual representation of grid search\n", @@ -2321,9 +2301,7 @@ { "cell_type": "code", "execution_count": 11, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "from sklearn.neural_network import MLPClassifier\n", @@ -2354,9 +2332,7 @@ { "cell_type": "code", "execution_count": 12, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# optional\n", @@ -2439,9 +2415,7 @@ { "cell_type": "code", "execution_count": 13, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "pip3 install tensorflow" @@ -2457,9 +2431,7 @@ { "cell_type": "code", "execution_count": 14, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "conda install tensorflow" @@ -2475,9 +2447,7 @@ { "cell_type": "code", "execution_count": 15, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# import necessary packages\n", @@ -2527,9 +2497,7 @@ { "cell_type": "code", "execution_count": 16, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "from keras.utils import to_categorical\n", @@ -2559,9 +2527,7 @@ { "cell_type": "code", "execution_count": 17, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "import tensorflow as tf\n", @@ -2707,9 +2673,7 @@ { "cell_type": "code", "execution_count": 18, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "epochs = 100\n", @@ -2724,9 +2688,7 @@ { "cell_type": "code", "execution_count": 19, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "DNN_tf = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)\n", @@ -2749,9 +2711,7 @@ { "cell_type": "code", "execution_count": 20, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# optional\n", @@ -2790,9 +2750,7 @@ { "cell_type": "code", "execution_count": 21, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# optional\n", @@ -2816,9 +2774,7 @@ { "cell_type": "code", "execution_count": 22, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "conda install keras" @@ -2834,9 +2790,7 @@ { "cell_type": "code", "execution_count": 23, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "pip3 install keras" @@ -2852,9 +2806,7 @@ { "cell_type": "code", "execution_count": 24, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "from keras.models import Sequential\n", @@ -2877,9 +2829,7 @@ { "cell_type": "code", "execution_count": 25, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "DNN_keras = np.zeros((len(eta_vals), len(lmbd_vals)), dtype=object)\n", @@ -2902,9 +2852,7 @@ { "cell_type": "code", "execution_count": 26, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [ "# optional\n", @@ -2941,7 +2889,25 @@ ] } ], - "metadata": {}, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.0" + } + }, "nbformat": 4, "nbformat_minor": 2 } diff --git a/doc/pub/Splines/html/._Splines-bs000.html b/doc/pub/Splines/html/._Splines-bs000.html index bece1e921..8625c257e 100644 --- a/doc/pub/Splines/html/._Splines-bs000.html +++ b/doc/pub/Splines/html/._Splines-bs000.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -272,7 +293,7 @@ MathJax.Hub.Config({
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

    -

    Oct 6, 2018

    +

    Oct 12, 2018


    @@ -296,7 +317,7 @@ MathJax.Hub.Config({

  • 9
  • 10
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs001.html b/doc/pub/Splines/html/._Splines-bs001.html index 5dcab7015..de70d2fa8 100644 --- a/doc/pub/Splines/html/._Splines-bs001.html +++ b/doc/pub/Splines/html/._Splines-bs001.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -282,7 +303,7 @@ some approximative/numerical method to compute the minimum.
  • 10
  • 11
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs002.html b/doc/pub/Splines/html/._Splines-bs002.html index d04d8f945..530190f6f 100644 --- a/doc/pub/Splines/html/._Splines-bs002.html +++ b/doc/pub/Splines/html/._Splines-bs002.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -290,7 +311,7 @@ where \( \hat{\beta} \) are the weights we wish to extract from data, in our cas
  • 11
  • 12
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs003.html b/doc/pub/Splines/html/._Splines-bs003.html index b39e9900e..e3fa4abba 100644 --- a/doc/pub/Splines/html/._Splines-bs003.html +++ b/doc/pub/Splines/html/._Splines-bs003.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -295,7 +316,7 @@ This defines what is called the Hessian matrix.
  • 12
  • 13
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs004.html b/doc/pub/Splines/html/._Splines-bs004.html index e63ef43ad..ded6d78cf 100644 --- a/doc/pub/Splines/html/._Splines-bs004.html +++ b/doc/pub/Splines/html/._Splines-bs004.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -296,7 +317,7 @@ If we can compute these matrices, in particular the Hessian, the above is often
  • 13
  • 14
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs005.html b/doc/pub/Splines/html/._Splines-bs005.html index aaec6aa73..96b97c1d8 100644 --- a/doc/pub/Splines/html/._Splines-bs005.html +++ b/doc/pub/Splines/html/._Splines-bs005.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -288,7 +309,7 @@ normally discourage the use of this method.
  • 14
  • 15
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs006.html b/doc/pub/Splines/html/._Splines-bs006.html index 1edaf8466..73992aa61 100644 --- a/doc/pub/Splines/html/._Splines-bs006.html +++ b/doc/pub/Splines/html/._Splines-bs006.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -308,7 +329,7 @@ $$
  • 15
  • 16
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs007.html b/doc/pub/Splines/html/._Splines-bs007.html index 65a1cd9a2..83c300073 100644 --- a/doc/pub/Splines/html/._Splines-bs007.html +++ b/doc/pub/Splines/html/._Splines-bs007.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -291,7 +312,7 @@ vanishes, then Newton-Raphson may fail totally
  • 16
  • 17
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs008.html b/doc/pub/Splines/html/._Splines-bs008.html index e4b0d0150..0382bcc0c 100644 --- a/doc/pub/Splines/html/._Splines-bs008.html +++ b/doc/pub/Splines/html/._Splines-bs008.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -329,7 +350,7 @@ more than two non-linear equations. In our case, the Jacobian matrix is given by
  • 17
  • 18
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs009.html b/doc/pub/Splines/html/._Splines-bs009.html index 95b7b9fde..891834392 100644 --- a/doc/pub/Splines/html/._Splines-bs009.html +++ b/doc/pub/Splines/html/._Splines-bs009.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -299,7 +320,7 @@ we are always moving towards smaller function values, i.e a minimum.
  • 18
  • 19
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs010.html b/doc/pub/Splines/html/._Splines-bs010.html index 930254831..e27d4cb66 100644 --- a/doc/pub/Splines/html/._Splines-bs010.html +++ b/doc/pub/Splines/html/._Splines-bs010.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -295,7 +316,7 @@ the learning rate within the context of Machine Learning.
  • 19
  • 20
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs011.html b/doc/pub/Splines/html/._Splines-bs011.html index a2d29ef4d..e7d36fffb 100644 --- a/doc/pub/Splines/html/._Splines-bs011.html +++ b/doc/pub/Splines/html/._Splines-bs011.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -302,7 +323,7 @@ Note that the gradient is a function of \( \mathbf{x} =
  • 20
  • 21
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs012.html b/doc/pub/Splines/html/._Splines-bs012.html index de3759975..a45c5522f 100644 --- a/doc/pub/Splines/html/._Splines-bs012.html +++ b/doc/pub/Splines/html/._Splines-bs012.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -295,7 +316,7 @@ randomness. One such method is that of Stochastic Gradient Descent
  • 21
  • 22
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs013.html b/doc/pub/Splines/html/._Splines-bs013.html index 288107e02..187387ea6 100644 --- a/doc/pub/Splines/html/._Splines-bs013.html +++ b/doc/pub/Splines/html/._Splines-bs013.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -296,7 +317,7 @@ regular polygons (triangles, rectangles, pentagons, etc...).
  • 22
  • 23
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs014.html b/doc/pub/Splines/html/._Splines-bs014.html index 5e10bd7e7..141407dc8 100644 --- a/doc/pub/Splines/html/._Splines-bs014.html +++ b/doc/pub/Splines/html/._Splines-bs014.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -284,7 +305,7 @@ MathJax.Hub.Config({
  • 23
  • 24
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs015.html b/doc/pub/Splines/html/._Splines-bs015.html index 91adb73aa..ad49b99ec 100644 --- a/doc/pub/Splines/html/._Splines-bs015.html +++ b/doc/pub/Splines/html/._Splines-bs015.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -320,7 +341,7 @@ This condition is particularly useful since it gives us an procedure for determi
  • 24
  • 25
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs016.html b/doc/pub/Splines/html/._Splines-bs016.html index 707c47a6c..1e6629e86 100644 --- a/doc/pub/Splines/html/._Splines-bs016.html +++ b/doc/pub/Splines/html/._Splines-bs016.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -307,7 +328,7 @@ This result means that if we know that the cost/loss function is convex and we a
  • 25
  • 26
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs017.html b/doc/pub/Splines/html/._Splines-bs017.html index efe5d542e..370c62d6e 100644 --- a/doc/pub/Splines/html/._Splines-bs017.html +++ b/doc/pub/Splines/html/._Splines-bs017.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -303,7 +324,7 @@ Using the definition of convexity, try to show that a function satisfying the pr
  • 26
  • 27
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs018.html b/doc/pub/Splines/html/._Splines-bs018.html index d6f43e6d8..b785e0140 100644 --- a/doc/pub/Splines/html/._Splines-bs018.html +++ b/doc/pub/Splines/html/._Splines-bs018.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -312,7 +333,7 @@ When we have found the exact solution, \( \hat{r}=0 \).
  • 27
  • 28
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs019.html b/doc/pub/Splines/html/._Splines-bs019.html index 2664f2e41..3f75c1a00 100644 --- a/doc/pub/Splines/html/._Splines-bs019.html +++ b/doc/pub/Splines/html/._Splines-bs019.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -293,7 +314,7 @@ symmetric. This defines also the Hessian and we want it to be positive definit
  • 28
  • 29
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs020.html b/doc/pub/Splines/html/._Splines-bs020.html index d51c26820..94926845c 100644 --- a/doc/pub/Splines/html/._Splines-bs020.html +++ b/doc/pub/Splines/html/._Splines-bs020.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -299,7 +320,7 @@ instead.
  • 29
  • 30
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs021.html b/doc/pub/Splines/html/._Splines-bs021.html index d41a12c70..01a05f1bd 100644 --- a/doc/pub/Splines/html/._Splines-bs021.html +++ b/doc/pub/Splines/html/._Splines-bs021.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -307,7 +328,7 @@ and
  • 30
  • 31
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs022.html b/doc/pub/Splines/html/._Splines-bs022.html index da6752d42..92d7b66f4 100644 --- a/doc/pub/Splines/html/._Splines-bs022.html +++ b/doc/pub/Splines/html/._Splines-bs022.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -320,7 +341,7 @@ $$
  • 31
  • 32
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs023.html b/doc/pub/Splines/html/._Splines-bs023.html index 3d49a5bef..37f424a2f 100644 --- a/doc/pub/Splines/html/._Splines-bs023.html +++ b/doc/pub/Splines/html/._Splines-bs023.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,43 +274,7 @@ MathJax.Hub.Config({ -

    Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come

    -
    -
    -

    -

    - - -

    #include <cmath>
    -#include <iostream>
    -#include <fstream>
    -#include <iomanip>
    -#include "vectormatrixclass.h"
    -using namespace  std;
    -//   Main function begins here
    -int main(int  argc, char * argv[]){
    -  int dim = 2;
    -  Vector x(dim),xsd(dim), b(dim),x0(dim);
    -  Matrix A(dim,dim);
    -
    -  // Set our initial guess
    -  x0(0) = x0(1) = 0;
    -  // Set the matrix
    -  A(0,0) =  3;    A(1,0) =  2;   A(0,1) =  2;   A(1,1) =  6;
    -  b(0) = 2; b(1) = -8;
    -  cout << "The Matrix A that we are using: " << endl;
    -  A.Print();
    -  cout << endl;
    -  xsd = SteepestDescent(A,b,x0);
    -  cout << "The approximate solution using Steepest Descent is: " << endl;
    -  xsd.Print();
    -  cout << endl;
    -}
    -
    -

    -

    -
    - +

    Code examples for steepest descent

    @@ -317,7 +302,7 @@ MathJax.Hub.Config({

  • 32
  • 33
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs024.html b/doc/pub/Splines/html/._Splines-bs024.html index 62b53c6d0..e98f55f27 100644 --- a/doc/pub/Splines/html/._Splines-bs024.html +++ b/doc/pub/Splines/html/._Splines-bs024.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,33 +274,37 @@ MathJax.Hub.Config({ -

    The routine for the steepest descent method

    +

    Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come

    -

    Vector SteepestDescent(Matrix A, Vector b, Vector x0){
    -  int IterMax, i;
    -  int dim = x0.Dimension();
    -  const double tolerance = 1.0e-14;
    -  Vector x(dim),f(dim),z(dim);
    -  double c,alpha,d;
    -  IterMax = 30;
    -  x = x0;
    -  r = A*x-b;
    -  i = 0;
    -  while (i <= IterMax){
    -    z = A*r;
    -    c = dot(r,r);
    -    alpha = c/dot(r,z);
    -    x = x - alpha*r;
    -    r =  A*x-b;
    -    if(sqrt(dot(r,r)) < tolerance) break;
    -    i++;
    -  }
    -  return x;
    +
    #include <cmath>
    +#include <iostream>
    +#include <fstream>
    +#include <iomanip>
    +#include "vectormatrixclass.h"
    +using namespace  std;
    +//   Main function begins here
    +int main(int  argc, char * argv[]){
    +  int dim = 2;
    +  Vector x(dim),xsd(dim), b(dim),x0(dim);
    +  Matrix A(dim,dim);
    +
    +  // Set our initial guess
    +  x0(0) = x0(1) = 0;
    +  // Set the matrix
    +  A(0,0) =  3;    A(1,0) =  2;   A(0,1) =  2;   A(1,1) =  6;
    +  b(0) = 2; b(1) = -8;
    +  cout << "The Matrix A that we are using: " << endl;
    +  A.Print();
    +  cout << endl;
    +  xsd = SteepestDescent(A,b,x0);
    +  cout << "The approximate solution using Steepest Descent is: " << endl;
    +  xsd.Print();
    +  cout << endl;
     }
     

    @@ -313,7 +338,7 @@ MathJax.Hub.Config({

  • 33
  • 34
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs025.html b/doc/pub/Splines/html/._Splines-bs025.html index 9face255c..24f29b77e 100644 --- a/doc/pub/Splines/html/._Splines-bs025.html +++ b/doc/pub/Splines/html/._Splines-bs025.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,72 +274,40 @@ MathJax.Hub.Config({ -

    Steepest descent example

    - +

    The routine for the steepest descent method

    +
    +
    +

    - -

    import numpy as np
    -import numpy.linalg as la
    -
    -import scipy.optimize as sopt
    -
    -import matplotlib.pyplot as pt
    -from mpl_toolkits.mplot3d import axes3d
    -
    -def f(x):
    -    return 0.5*x[0]**2 + 2.5*x[1]**2
    -
    -def df(x):
    -    return np.array([x[0], 5*x[1]])
    -
    -fig = pt.figure()
    -ax = fig.gca(projection="3d")
    -
    -xmesh, ymesh = np.mgrid[-2:2:50j,-2:2:50j]
    -fmesh = f(np.array([xmesh, ymesh]))
    -ax.plot_surface(xmesh, ymesh, fmesh)
    +
    +
    Vector SteepestDescent(Matrix A, Vector b, Vector x0){
    +  int IterMax, i;
    +  int dim = x0.Dimension();
    +  const double tolerance = 1.0e-14;
    +  Vector x(dim),f(dim),z(dim);
    +  double c,alpha,d;
    +  IterMax = 30;
    +  x = x0;
    +  r = A*x-b;
    +  i = 0;
    +  while (i <= IterMax){
    +    z = A*r;
    +    c = dot(r,r);
    +    alpha = c/dot(r,z);
    +    x = x - alpha*r;
    +    r =  A*x-b;
    +    if(sqrt(dot(r,r)) < tolerance) break;
    +    i++;
    +  }
    +  return x;
    +}
     

    -And then as countor plot -

    +

    +
    - -
    pt.axis("equal")
    -pt.contour(xmesh, ymesh, fmesh)
    -guesses = [np.array([2, 2./5])]
    -
    -

    -Find guesses -

    - -

    x = guesses[-1]
    -s = -df(x)
    -
    -

    -Run it! -

    - - -

    def f1d(alpha):
    -    return f(x + alpha*s)
    -
    -alpha_opt = sopt.golden(f1d)
    -next_guess = x + alpha_opt * s
    -guesses.append(next_guess)
    -print(next_guess)
    -
    -

    -What happened? -

    - - -

    pt.axis("equal")
    -pt.contour(xmesh, ymesh, fmesh, 50)
    -it_array = np.array(guesses)
    -pt.plot(it_array.T[0], it_array.T[1], "x-")
    -

    @@ -345,7 +334,7 @@ pt.plot(it_array34

  • 35
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs026.html b/doc/pub/Splines/html/._Splines-bs026.html index 94a0a1fc8..160569e29 100644 --- a/doc/pub/Splines/html/._Splines-bs026.html +++ b/doc/pub/Splines/html/._Splines-bs026.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,8 +274,72 @@ MathJax.Hub.Config({ -

    Conjugate gradient

    +

    Steepest descent example

    +

    + + +

    import numpy as np
    +import numpy.linalg as la
    +
    +import scipy.optimize as sopt
    +
    +import matplotlib.pyplot as pt
    +from mpl_toolkits.mplot3d import axes3d
    +
    +def f(x):
    +    return 0.5*x[0]**2 + 2.5*x[1]**2
    +
    +def df(x):
    +    return np.array([x[0], 5*x[1]])
    +
    +fig = pt.figure()
    +ax = fig.gca(projection="3d")
    +
    +xmesh, ymesh = np.mgrid[-2:2:50j,-2:2:50j]
    +fmesh = f(np.array([xmesh, ymesh]))
    +ax.plot_surface(xmesh, ymesh, fmesh)
    +
    +

    +And then as countor plot +

    + + +

    pt.axis("equal")
    +pt.contour(xmesh, ymesh, fmesh)
    +guesses = [np.array([2, 2./5])]
    +
    +

    +Find guesses +

    + + +

    x = guesses[-1]
    +s = -df(x)
    +
    +

    +Run it! +

    + + +

    def f1d(alpha):
    +    return f(x + alpha*s)
    +
    +alpha_opt = sopt.golden(f1d)
    +next_guess = x + alpha_opt * s
    +guesses.append(next_guess)
    +print(next_guess)
    +
    +

    +What happened? +

    + + +

    pt.axis("equal")
    +pt.contour(xmesh, ymesh, fmesh, 50)
    +it_array = np.array(guesses)
    +pt.plot(it_array.T[0], it_array.T[1], "x-")
    +

    @@ -281,7 +366,7 @@ MathJax.Hub.Config({

  • 35
  • 36
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs027.html b/doc/pub/Splines/html/._Splines-bs027.html index b5ed4f3ab..5bbe32891 100644 --- a/doc/pub/Splines/html/._Splines-bs027.html +++ b/doc/pub/Splines/html/._Splines-bs027.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -251,37 +272,9 @@ MathJax.Hub.Config({

     

     

     

    - + -

    Revisiting our first homework

    - -

    -We will use linear regression as a case study for the gradient descent -methods. Linear regression is a great test case for the gradient -descent methods discussed in the lectures since it has several -desirable properties such as: - -

      -
    1. An analytical solution (recall homework set 1).
    2. -
    3. The gradient can be computed analytically.
    4. -
    5. The cost function is convex which guarantees that gradient descent converges for small enough learning rates
    6. -
    - -We revisit the example from homework set 1 where we had -$$ -y_i = 5x_i^2 + 0.1\xi_i, \ i=1,\cdots,100 -$$ - -with \( x_i \in [0,1] \) chosen randomly with a uniform distribution. Additionally \( \xi_i \) represents stochastic noise chosen according to a normal distribution \( \cal {N}(0,1) \). -The linear regression model is given by -$$ -h_\beta(x) = \hat{y} = \beta_0 + \beta_1 x, -$$ - -such that -$$ -\hat{y}_i = \beta_0 + \beta_1 x_i. -$$ +

    Conjugate gradient

    @@ -309,7 +302,7 @@ $$

  • 36
  • 37
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs028.html b/doc/pub/Splines/html/._Splines-bs028.html index 9a3ebf016..187c6b180 100644 --- a/doc/pub/Splines/html/._Splines-bs028.html +++ b/doc/pub/Splines/html/._Splines-bs028.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,27 +274,35 @@ MathJax.Hub.Config({ -

    Gradient descent example

    +

    Revisiting our first homework

    -Let \( \mathbf{y} = (y_1,\cdots,y_n)^T \), \( \mathbf{\hat{y}} = (\hat{y}_1,\cdots,\hat{y}_n)^T \) and \( \beta = (\beta_0, \beta_1)^T \) +We will use linear regression as a case study for the gradient descent +methods. Linear regression is a great test case for the gradient +descent methods discussed in the lectures since it has several +desirable properties such as: -

    -It is convenient to write \( \mathbf{\hat{y}} = X\beta \) where \( X \in \mathbb{R}^{100 \times 2} \) is the design matrix given by +

      +
    1. An analytical solution (recall homework set 1).
    2. +
    3. The gradient can be computed analytically.
    4. +
    5. The cost function is convex which guarantees that gradient descent converges for small enough learning rates
    6. +
    + +We revisit the example from homework set 1 where we had $$ -X \equiv \begin{bmatrix} -1 & x_1 \\ -\vdots & \vdots \\ -1 & x_{100} & \\ -\end{bmatrix}. +y_i = 5x_i^2 + 0.1\xi_i, \ i=1,\cdots,100 $$ -The loss function is given by +with \( x_i \in [0,1] \) chosen randomly with a uniform distribution. Additionally \( \xi_i \) represents stochastic noise chosen according to a normal distribution \( \cal {N}(0,1) \). +The linear regression model is given by $$ -C(\beta) = ||X\beta-\mathbf{y}||^2 = ||X\beta||^2 - 2 \mathbf{y}^T X\beta + ||\mathbf{y}||^2 = \sum_{i=1}^{100} (\beta_0 + \beta_1 x_i)^2 - 2 y_i (\beta_0 + \beta_1 x_i) + y_i^2 +h_\beta(x) = \hat{y} = \beta_0 + \beta_1 x, $$ -and we want to find \( \beta \) such that \( C(\beta) \) is minimized. +such that +$$ +\hat{y}_i = \beta_0 + \beta_1 x_i. +$$

    @@ -301,7 +330,7 @@ and we want to find \( \beta \) such that \( C(\beta) \) is minimized.

  • 37
  • 38
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs029.html b/doc/pub/Splines/html/._Splines-bs029.html index 669f6e55b..b661bba59 100644 --- a/doc/pub/Splines/html/._Splines-bs029.html +++ b/doc/pub/Splines/html/._Splines-bs029.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -251,19 +272,29 @@ MathJax.Hub.Config({

     

     

     

    - + -

    The derivative of the cost/loss function

    +

    Gradient descent example

    -Computing \( \partial C(\beta) / \partial \beta_0 \) and \( \partial C(\beta) / \partial \beta_1 \) we can show that the gradient can be written as +Let \( \mathbf{y} = (y_1,\cdots,y_n)^T \), \( \mathbf{\hat{y}} = (\hat{y}_1,\cdots,\hat{y}_n)^T \) and \( \beta = (\beta_0, \beta_1)^T \) + +

    +It is convenient to write \( \mathbf{\hat{y}} = X\beta \) where \( X \in \mathbb{R}^{100 \times 2} \) is the design matrix given by $$ -\nabla_{\beta} C(\beta) = (\partial C(\beta) / \partial \beta_0, \partial C(\beta) / \partial \beta_1)^T = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\beta_0+\beta_1x_i-y_i\right) \\ -\sum_{i=1}^{100}\left( x_i (\beta_0+\beta_1x_i)-y_ix_i\right) \\ -\end{bmatrix} = 2X^T(X\beta - \mathbf{y}), +X \equiv \begin{bmatrix} +1 & x_1 \\ +\vdots & \vdots \\ +1 & x_{100} & \\ +\end{bmatrix}. $$ -where \( X \) is the design matrix defined above. +The loss function is given by +$$ +C(\beta) = ||X\beta-\mathbf{y}||^2 = ||X\beta||^2 - 2 \mathbf{y}^T X\beta + ||\mathbf{y}||^2 = \sum_{i=1}^{100} (\beta_0 + \beta_1 x_i)^2 - 2 y_i (\beta_0 + \beta_1 x_i) + y_i^2 +$$ + +and we want to find \( \beta \) such that \( C(\beta) \) is minimized.

    @@ -291,7 +322,7 @@ where \( X \) is the design matrix defined above.

  • 38
  • 39
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs030.html b/doc/pub/Splines/html/._Splines-bs030.html index 9c1875db6..55dc20273 100644 --- a/doc/pub/Splines/html/._Splines-bs030.html +++ b/doc/pub/Splines/html/._Splines-bs030.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,16 +274,17 @@ MathJax.Hub.Config({ -

    The Hessian matrix

    -The Hessian matrix of \( C(\beta) \) is given by +

    The derivative of the cost/loss function

    + +

    +Computing \( \partial C(\beta) / \partial \beta_0 \) and \( \partial C(\beta) / \partial \beta_1 \) we can show that the gradient can be written as $$ -\hat{H} \equiv \begin{bmatrix} -\frac{\partial^2 C(\beta)}{\partial \beta_0^2} & \frac{\partial^2 C(\beta)}{\partial \beta_0 \partial \beta_1} \\ -\frac{\partial^2 C(\beta)}{\partial \beta_0 \partial \beta_1} & \frac{\partial^2 C(\beta)}{\partial \beta_1^2} & \\ -\end{bmatrix} = 2X^T X. +\nabla_{\beta} C(\beta) = (\partial C(\beta) / \partial \beta_0, \partial C(\beta) / \partial \beta_1)^T = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\beta_0+\beta_1x_i-y_i\right) \\ +\sum_{i=1}^{100}\left( x_i (\beta_0+\beta_1x_i)-y_ix_i\right) \\ +\end{bmatrix} = 2X^T(X\beta - \mathbf{y}), $$ -This result implies that \( C(\beta) \) is a convex function since the matrix \( X^T X \) always is positive semi-definite. +where \( X \) is the design matrix defined above.

    @@ -290,7 +312,7 @@ This result implies that \( C(\beta) \) is a convex function since the matrix \(

  • 39
  • 40
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs031.html b/doc/pub/Splines/html/._Splines-bs031.html index 7478f48c2..fa83fe7da 100644 --- a/doc/pub/Splines/html/._Splines-bs031.html +++ b/doc/pub/Splines/html/._Splines-bs031.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,44 +274,17 @@ MathJax.Hub.Config({ -

    Simple program

    - -

    -We can now write a program that minimizes \( C(\beta) \) using the gradient descent method with a constant learning rate \( \gamma \) according to +

    The Hessian matrix

    +The Hessian matrix of \( C(\beta) \) is given by $$ -\beta_{k+1} = \beta_k - \gamma \nabla_\beta C(\beta_k), \ k=0,1,\cdots +\hat{H} \equiv \begin{bmatrix} +\frac{\partial^2 C(\beta)}{\partial \beta_0^2} & \frac{\partial^2 C(\beta)}{\partial \beta_0 \partial \beta_1} \\ +\frac{\partial^2 C(\beta)}{\partial \beta_0 \partial \beta_1} & \frac{\partial^2 C(\beta)}{\partial \beta_1^2} & \\ +\end{bmatrix} = 2X^T X. $$ -

    -We can use the expression we computed for the gradient and let use a -\( \beta_0 \) be chosen randomly and let \( \gamma = 0.001 \). Stop iterating -when \( ||\nabla_\beta C(\beta_k) || \leq \epsilon = 10^{-8} \). +This result implies that \( C(\beta) \) is a convex function since the matrix \( X^T X \) always is positive semi-definite. -

    -And finally we can compare our solution for \( \beta \) with the analytic result given by -\( \beta= (X^TX)^{-1} X^T \mathbf{y} \). -

    - - -

    import numpy as np
    -
    -"""
    -The following setup is just a suggestion, feel free to write it the way you like.
    -"""
    -
    -#Setup problem described in the exercise
    -N  = 100 #Nr of datapoints
    -M  = 2 #Nr of features
    -x  = np.random.rand(N) #Uniformly generated x-values in [0,1]
    -y  = 5*x**2 + 0.1*np.random.randn(N)
    -X  = np.c_[np.ones(N),x] #Construct design matrix
    -
    -#Compute beta according to normal equations to compare with GD solution
    -Xt_X_inv = np.linalg.inv(np.dot(X.T,X))
    -Xt_y     = np.dot(X.transpose(),y)
    -beta_NE = np.dot(Xt_X_inv,Xt_y)
    -print(beta_NE)
    -

    @@ -317,7 +311,7 @@ beta_NE = np.40

  • 41
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs032.html b/doc/pub/Splines/html/._Splines-bs032.html index bf241c7bb..df9278bbe 100644 --- a/doc/pub/Splines/html/._Splines-bs032.html +++ b/doc/pub/Splines/html/._Splines-bs032.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,51 +274,43 @@ MathJax.Hub.Config({ -

    Gradient Descent Example

    +

    Simple program

    -Another simple example is here +We can now write a program that minimizes \( C(\beta) \) using the gradient descent method with a constant learning rate \( \gamma \) according to +$$ +\beta_{k+1} = \beta_k - \gamma \nabla_\beta C(\beta_k), \ k=0,1,\cdots +$$ + +

    +We can use the expression we computed for the gradient and let use a +\( \beta_0 \) be chosen randomly and let \( \gamma = 0.001 \). Stop iterating +when \( ||\nabla_\beta C(\beta_k) || \leq \epsilon = 10^{-8} \). + +

    +And finally we can compare our solution for \( \beta \) with the analytic result given by +\( \beta= (X^TX)^{-1} X^T \mathbf{y} \).

    -

    # Importing various packages
    -from random import random, seed
    -import numpy as np
    -import matplotlib.pyplot as plt
    -from mpl_toolkits.mplot3d import Axes3D
    -from matplotlib import cm
    -from matplotlib.ticker import LinearLocator, FormatStrFormatter
    -import sys
    +
    import numpy as np
     
    -x = 2*np.random.rand(100,1)
    -y = 4+3*x+np.random.randn(100,1)
    +"""
    +The following setup is just a suggestion, feel free to write it the way you like.
    +"""
     
    -xb = np.c_[np.ones((100,1)), x]
    -beta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y)
    -print(beta_linreg)
    -beta = np.random.randn(2,1)
    +#Setup problem described in the exercise
    +N  = 100 #Nr of datapoints
    +M  = 2 #Nr of features
    +x  = np.random.rand(N) #Uniformly generated x-values in [0,1]
    +y  = 5*x**2 + 0.1*np.random.randn(N)
    +X  = np.c_[np.ones(N),x] #Construct design matrix
     
    -eta = 0.1
    -Niterations = 1000
    -m = 100
    -
    -for iter in range(Niterations):
    -    gradients = 2.0/m*xb.T.dot(xb.dot(beta)-y)
    -    beta -= eta*gradients
    -
    -print(beta)
    -xnew = np.array([[0],[2]])
    -xbnew = np.c_[np.ones((2,1)), xnew]
    -ypredict = xbnew.dot(beta)
    -ypredict2 = xbnew.dot(beta_linreg)
    -plt.plot(xnew, ypredict, "r-")
    -plt.plot(xnew, ypredict2, "b-")
    -plt.plot(x, y ,'ro')
    -plt.axis([0,2.0,0, 15.0])
    -plt.xlabel(r'$x$')
    -plt.ylabel(r'$y$')
    -plt.title(r'Gradient descent example')
    -plt.show()
    +#Compute beta according to normal equations to compare with GD solution
    +Xt_X_inv = np.linalg.inv(np.dot(X.T,X))
    +Xt_y     = np.dot(X.transpose(),y)
    +beta_NE = np.dot(Xt_X_inv,Xt_y)
    +print(beta_NE)
     

    @@ -325,7 +338,7 @@ plt.show()

  • 41
  • 42
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs033.html b/doc/pub/Splines/html/._Splines-bs033.html index 73cfcff08..b344e4069 100644 --- a/doc/pub/Splines/html/._Splines-bs033.html +++ b/doc/pub/Splines/html/._Splines-bs033.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,8 +274,10 @@ MathJax.Hub.Config({ -

    And a corresponding example using scikit-learn

    +

    Gradient Descent Example

    +

    +Another simple example is here

    @@ -262,7 +285,10 @@ MathJax.Hub.Config({ from random import random, seed import numpy as np import matplotlib.pyplot as plt -from sklearn.linear_model import SGDRegressor +from mpl_toolkits.mplot3d import Axes3D +from matplotlib import cm +from matplotlib.ticker import LinearLocator, FormatStrFormatter +import sys x = 2*np.random.rand(100,1) y = 4+3*x+np.random.randn(100,1) @@ -270,9 +296,29 @@ y = 4+3* xb = np.c_[np.ones((100,1)), x] beta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y) print(beta_linreg) -sgdreg = SGDRegressor(n_iter = 50, penalty=None, eta0=0.1) -sgdreg.fit(x,y.ravel()) -print(sgdreg.intercept_, sgdreg.coef_) +beta = np.random.randn(2,1) + +eta = 0.1 +Niterations = 1000 +m = 100 + +for iter in range(Niterations): + gradients = 2.0/m*xb.T.dot(xb.dot(beta)-y) + beta -= eta*gradients + +print(beta) +xnew = np.array([[0],[2]]) +xbnew = np.c_[np.ones((2,1)), xnew] +ypredict = xbnew.dot(beta) +ypredict2 = xbnew.dot(beta_linreg) +plt.plot(xnew, ypredict, "r-") +plt.plot(xnew, ypredict2, "b-") +plt.plot(x, y ,'ro') +plt.axis([0,2.0,0, 15.0]) +plt.xlabel(r'$x$') +plt.ylabel(r'$y$') +plt.title(r'Gradient descent example') +plt.show()

    @@ -300,7 +346,7 @@ sgdreg.fit(x,y.

  • 42
  • 43
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs034.html b/doc/pub/Splines/html/._Splines-bs034.html index 8181deb1a..46f8f5b7e 100644 --- a/doc/pub/Splines/html/._Splines-bs034.html +++ b/doc/pub/Splines/html/._Splines-bs034.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -251,61 +272,28 @@ MathJax.Hub.Config({

     

     

     

    - + -

    Gradient descent and Ridge

    - -

    -We have also discussed Ridge regression where the loss function contains a regularized given by the \( L_2 \) norm of \( \beta \), -$$ -C_{\text{ridge}}(\beta) = ||X\beta -\mathbf{y}||^2 + \lambda ||\beta||^2, \ \lambda \geq 0. -$$ - -

    -In order to minimize \( C_{\text{ridge}}(\beta) \) using GD we only have adjust the gradient as follows -$$ -\nabla_\beta C_{\text{ridge}}(\beta) = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\beta_0+\beta_1x_i-y_i\right) \\ -\sum_{i=1}^{100}\left( x_i (\beta_0+\beta_1x_i)-y_ix_i\right) \\ -\end{bmatrix} + 2\lambda\begin{bmatrix} \beta_0 \\ \beta_1\end{bmatrix} = 2 (X^T(X\beta - \mathbf{y})+\lambda \beta). -$$ - -

    -We can now extend our program to minimize \( C_{\text{ridge}}(\beta) \) using gradient descent and compare with the analytical solution given by -$$ -\beta_{\text{ridge}} = \left(X^T X + \lambda I_{2 \times 2} \right)^{-1} X^T \mathbf{y}, -$$ - -for \( \lambda = {0,1,10,50,100} \) (\( \lambda = 0 \) corresponds to ordinary least squares). -We can then compute \( ||\beta_{\text{ridge}}|| \) for each \( \lambda \). +

    And a corresponding example using scikit-learn

    -

    import numpy as np
    +
    # Importing various packages
    +from random import random, seed
    +import numpy as np
    +import matplotlib.pyplot as plt
    +from sklearn.linear_model import SGDRegressor
     
    -"""
    -The following setup is just a suggestion, feel free to write it the way you like.
    -"""
    +x = 2*np.random.rand(100,1)
    +y = 4+3*x+np.random.randn(100,1)
     
    -#Setup problem described in the exercise
    -N  = 100 #Nr of datapoints
    -M  = 2   #Nr of features
    -x  = np.random.rand(N)
    -y  = 5*x**2 + 0.1*np.random.randn(N)
    -
    -
    -#Compute analytic beta for Ridge regression 
    -X    = np.c_[np.ones(N),x]
    -XT_X = np.dot(X.T,X)
    -
    -l  = 0.1 #Ridge parameter lambda
    -Id = np.eye(XT_X.shape[0])
    -
    -Z = np.linalg.inv(XT_X+l*Id)
    -beta_ridge = np.dot(Z,np.dot(X.T,y))
    -
    -print(beta_ridge)
    -print(np.linalg.norm(beta_ridge)) #||beta||
    +xb = np.c_[np.ones((100,1)), x]
    +beta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y)
    +print(beta_linreg)
    +sgdreg = SGDRegressor(n_iter = 50, penalty=None, eta0=0.1)
    +sgdreg.fit(x,y.ravel())
    +print(sgdreg.intercept_, sgdreg.coef_)
     

    @@ -333,7 +321,7 @@ beta_ridge = np

  • 43
  • 44
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs035.html b/doc/pub/Splines/html/._Splines-bs035.html index 54b3a6010..cdf78c4d5 100644 --- a/doc/pub/Splines/html/._Splines-bs035.html +++ b/doc/pub/Splines/html/._Splines-bs035.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -251,59 +272,61 @@ MathJax.Hub.Config({

     

     

     

    - + -

    Automatic differentiation

    -Python has tools for so-called automatic differentiation. -Consider the following example +

    Gradient descent and Ridge

    + +

    +We have also discussed Ridge regression where the loss function contains a regularized given by the \( L_2 \) norm of \( \beta \), $$ -f(x) = \sin\left(2\pi x + x^2\right) +C_{\text{ridge}}(\beta) = ||X\beta -\mathbf{y}||^2 + \lambda ||\beta||^2, \ \lambda \geq 0. $$ -which has the following derivative +

    +In order to minimize \( C_{\text{ridge}}(\beta) \) using GD we only have adjust the gradient as follows $$ -f'(x) = \cos\left(2\pi x + x^2\right)\left(2\pi + 2x\right) +\nabla_\beta C_{\text{ridge}}(\beta) = 2\begin{bmatrix} \sum_{i=1}^{100} \left(\beta_0+\beta_1x_i-y_i\right) \\ +\sum_{i=1}^{100}\left( x_i (\beta_0+\beta_1x_i)-y_ix_i\right) \\ +\end{bmatrix} + 2\lambda\begin{bmatrix} \beta_0 \\ \beta_1\end{bmatrix} = 2 (X^T(X\beta - \mathbf{y})+\lambda \beta). $$ -Using autograd we have +

    +We can now extend our program to minimize \( C_{\text{ridge}}(\beta) \) using gradient descent and compare with the analytical solution given by +$$ +\beta_{\text{ridge}} = \left(X^T X + \lambda I_{2 \times 2} \right)^{-1} X^T \mathbf{y}, +$$ + +for \( \lambda = {0,1,10,50,100} \) (\( \lambda = 0 \) corresponds to ordinary least squares). +We can then compute \( ||\beta_{\text{ridge}}|| \) for each \( \lambda \).

    -

    import autograd.numpy as np
    +
    import numpy as np
     
    -# To do elementwise differentiation:
    -from autograd import elementwise_grad as egrad 
    +"""
    +The following setup is just a suggestion, feel free to write it the way you like.
    +"""
     
    -# To plot:
    -import matplotlib.pyplot as plt 
    +#Setup problem described in the exercise
    +N  = 100 #Nr of datapoints
    +M  = 2   #Nr of features
    +x  = np.random.rand(N)
    +y  = 5*x**2 + 0.1*np.random.randn(N)
     
     
    -def f(x):
    -    return np.sin(2*np.pi*x + x**2)
    +#Compute analytic beta for Ridge regression 
    +X    = np.c_[np.ones(N),x]
    +XT_X = np.dot(X.T,X)
     
    -def f_grad_analytic(x):
    -    return np.cos(2*np.pi*x + x**2)*(2*np.pi + 2*x)
    +l  = 0.1 #Ridge parameter lambda
    +Id = np.eye(XT_X.shape[0])
     
    -# Do the comparison:
    -x = np.linspace(0,1,1000)
    +Z = np.linalg.inv(XT_X+l*Id)
    +beta_ridge = np.dot(Z,np.dot(X.T,y))
     
    -f_grad = egrad(f)
    -
    -computed = f_grad(x)
    -analytic = f_grad_analytic(x)
    -
    -plt.title('Derivative computed from Autograd compared with the analytical derivative')
    -plt.plot(x,computed,label='autograd')
    -plt.plot(x,analytic,label='analytic')
    -
    -plt.xlabel('x')
    -plt.ylabel('y')
    -plt.legend()
    -
    -plt.show()
    -
    -print("The max absolute difference is: %g"%(np.max(np.abs(computed - analytic))))
    +print(beta_ridge)
    +print(np.linalg.norm(beta_ridge)) #||beta||
     

    @@ -331,7 +354,7 @@ plt.show()

  • 44
  • 45
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs036.html b/doc/pub/Splines/html/._Splines-bs036.html index 7bc4f9ea6..856e3eefb 100644 --- a/doc/pub/Splines/html/._Splines-bs036.html +++ b/doc/pub/Splines/html/._Splines-bs036.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -251,37 +272,59 @@ MathJax.Hub.Config({

     

     

     

    - + -

    Using autograd

    +

    Automatic differentiation

    +Python has tools for so-called automatic differentiation. +Consider the following example +$$ +f(x) = \sin\left(2\pi x + x^2\right) +$$ -

    -Here we -experiment with what kind of functions Autograd is capable -of finding the gradient of. The following Python functions are just -meant to illustrate what Autograd can do, but please feel free to -experiment with other, possibly more complicated, functions as well. +which has the following derivative +$$ +f'(x) = \cos\left(2\pi x + x^2\right)\left(2\pi + 2x\right) +$$ + +Using autograd we have

    import autograd.numpy as np
    -from autograd import grad
     
    -def f1(x):
    -    return x**3 + 1
    +# To do elementwise differentiation:
    +from autograd import elementwise_grad as egrad 
     
    -f1_grad = grad(f1)
    +# To plot:
    +import matplotlib.pyplot as plt 
     
    -# Remember to send in float as argument to the computed gradient from Autograd!
    -a = 1.0
     
    -# See the evaluated gradient at a using autograd:
    -print("The gradient of f1 evaluated at a = %g using autograd is: %g"%(a,f1_grad(a)))
    +def f(x):
    +    return np.sin(2*np.pi*x + x**2)
     
    -# Compare with the analytical derivative, that is f1'(x) = 3*x**2 
    -grad_analytical = 3*a**2
    -print("The gradient of f1 evaluated at a = %g by finding the analytic expression is: %g"%(a,grad_analytical))
    +def f_grad_analytic(x):
    +    return np.cos(2*np.pi*x + x**2)*(2*np.pi + 2*x)
    +
    +# Do the comparison:
    +x = np.linspace(0,1,1000)
    +
    +f_grad = egrad(f)
    +
    +computed = f_grad(x)
    +analytic = f_grad_analytic(x)
    +
    +plt.title('Derivative computed from Autograd compared with the analytical derivative')
    +plt.plot(x,computed,label='autograd')
    +plt.plot(x,analytic,label='analytic')
    +
    +plt.xlabel('x')
    +plt.ylabel('y')
    +plt.legend()
    +
    +plt.show()
    +
    +print("The max absolute difference is: %g"%(np.max(np.abs(computed - analytic))))
     

    @@ -309,7 +352,7 @@ grad_analytical = 45

  • 46
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs037.html b/doc/pub/Splines/html/._Splines-bs037.html index f52b5b3ae..d50116e74 100644 --- a/doc/pub/Splines/html/._Splines-bs037.html +++ b/doc/pub/Splines/html/._Splines-bs037.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -251,55 +272,38 @@ MathJax.Hub.Config({

     

     

     

    - + -

    Autograd with more complicated functions

    +

    Using autograd

    -To differentiate with respect to two (or more) arguments of a Python -function, Autograd need to know at which variable the function if -being differentiated with respect to. +Here we +experiment with what kind of functions Autograd is capable +of finding the gradient of. The following Python functions are just +meant to illustrate what Autograd can do, but please feel free to +experiment with other, possibly more complicated, functions as well.

    import autograd.numpy as np
     from autograd import grad
    -def f2(x1,x2):
    -    return 3*x1**3 + x2*(x1 - 5) + 1
     
    -# By sending the argument 0, Autograd will compute the derivative w.r.t the first variable, in this case x1
    -f2_grad_x1 = grad(f2,0)
    +def f1(x):
    +    return x**3 + 1
     
    -# ... and differentiate w.r.t x2 by sending 1 as an additional arugment to grad
    -f2_grad_x2 = grad(f2,1)
    +f1_grad = grad(f1)
     
    -x1 = 1.0
    -x2 = 3.0 
    +# Remember to send in float as argument to the computed gradient from Autograd!
    +a = 1.0
     
    -print("Evaluating at x1 = %g, x2 = %g"%(x1,x2))
    -print("-"*30)
    +# See the evaluated gradient at a using autograd:
    +print("The gradient of f1 evaluated at a = %g using autograd is: %g"%(a,f1_grad(a)))
     
    -# Compare with the analytical derivatives:
    -
    -# Derivative of f2 w.r.t x1 is: 9*x1**2 + x2:
    -f2_grad_x1_analytical = 9*x1**2 + x2
    -
    -# Derivative of f2 w.r.t x2 is: x1 - 5:
    -f2_grad_x2_analytical = x1 - 5
    -
    -# See the evaluated derivations:
    -print("The derivative of f2 w.r.t x1: %g"%( f2_grad_x1(x1,x2) ))
    -print("The analytical derivative of f2 w.r.t x1: %g"%( f2_grad_x1(x1,x2) ))
    -
    -print()
    -
    -print("The derivative of f2 w.r.t x2: %g"%( f2_grad_x2(x1,x2) ))
    -print("The analytical derivative of f2 w.r.t x2: %g"%( f2_grad_x2(x1,x2) ))
    +# Compare with the analytical derivative, that is f1'(x) = 3*x**2 
    +grad_analytical = 3*a**2
    +print("The gradient of f1 evaluated at a = %g by finding the analytic expression is: %g"%(a,grad_analytical))
     
    -

    -Note that the grad function will not produce the true gradient of the function. The true gradient of a function with two or more variables will produce a vector, where each element is the function differentiated w.r.t a variable. -

    @@ -326,7 +330,7 @@ Note that the grad function will not produce the true gradient of the function.

  • 46
  • 47
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs038.html b/doc/pub/Splines/html/._Splines-bs038.html index f52485bfa..18a066195 100644 --- a/doc/pub/Splines/html/._Splines-bs038.html +++ b/doc/pub/Splines/html/._Splines-bs038.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,36 +274,52 @@ MathJax.Hub.Config({ -

    More complicated functions using the elements of their arguments directly

    +

    Autograd with more complicated functions

    + +

    +To differentiate with respect to two (or more) arguments of a Python +function, Autograd need to know at which variable the function if +being differentiated with respect to.

    import autograd.numpy as np
     from autograd import grad
    -def f3(x): # Assumes x is an array of length 5 or higher
    -    return 2*x[0] + 3*x[1] + 5*x[2] + 7*x[3] + 11*x[4]**2
    +def f2(x1,x2):
    +    return 3*x1**3 + x2*(x1 - 5) + 1
     
    -f3_grad = grad(f3)
    +# By sending the argument 0, Autograd will compute the derivative w.r.t the first variable, in this case x1
    +f2_grad_x1 = grad(f2,0)
     
    -x = np.linspace(0,4,5)
    +# ... and differentiate w.r.t x2 by sending 1 as an additional arugment to grad
    +f2_grad_x2 = grad(f2,1)
     
    -# Print the computed gradient:
    -print("The computed gradient of f3 is: ", f3_grad(x))
    +x1 = 1.0
    +x2 = 3.0 
     
    -# The analytical gradient is: (2, 3, 5, 7, 22*x[4])
    -f3_grad_analytical = np.array([2, 3, 5, 7, 22*x[4]])
    +print("Evaluating at x1 = %g, x2 = %g"%(x1,x2))
    +print("-"*30)
     
    -# Print the analytical gradient:
    -print("The analytical gradient of f3 is: ", f3_grad_analytical)
    +# Compare with the analytical derivatives:
    +
    +# Derivative of f2 w.r.t x1 is: 9*x1**2 + x2:
    +f2_grad_x1_analytical = 9*x1**2 + x2
    +
    +# Derivative of f2 w.r.t x2 is: x1 - 5:
    +f2_grad_x2_analytical = x1 - 5
    +
    +# See the evaluated derivations:
    +print("The derivative of f2 w.r.t x1: %g"%( f2_grad_x1(x1,x2) ))
    +print("The analytical derivative of f2 w.r.t x1: %g"%( f2_grad_x1(x1,x2) ))
    +
    +print()
    +
    +print("The derivative of f2 w.r.t x2: %g"%( f2_grad_x2(x1,x2) ))
    +print("The analytical derivative of f2 w.r.t x2: %g"%( f2_grad_x2(x1,x2) ))
     

    -Note that in this case, when sending an array as input argument, the -output from Autograd is another array. This is the true gradient of -the function, as opposed to the function in the previous example. By -using arrays to represent the variables, the output from Autograd -might be easier to work with, as the output is closer to what one -could expect form a gradient-evaluting function. +Note that the grad function will not produce the true gradient of the function. The true gradient of a function with two or more variables will produce a vector, where each element is the function differentiated w.r.t a variable.

    @@ -310,7 +347,7 @@ could expect form a gradient-evaluting function.

  • 47
  • 48
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs039.html b/doc/pub/Splines/html/._Splines-bs039.html index 321d77c2f..88baefbf2 100644 --- a/doc/pub/Splines/html/._Splines-bs039.html +++ b/doc/pub/Splines/html/._Splines-bs039.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -251,31 +272,39 @@ MathJax.Hub.Config({

     

     

     

    - + -

    Functions using mathematical functions from Numpy

    +

    More complicated functions using the elements of their arguments directly

    import autograd.numpy as np
     from autograd import grad
    -def f4(x):
    -    return np.sqrt(1+x**2) + np.exp(x) + np.sin(2*np.pi*x)
    +def f3(x): # Assumes x is an array of length 5 or higher
    +    return 2*x[0] + 3*x[1] + 5*x[2] + 7*x[3] + 11*x[4]**2
     
    -f4_grad = grad(f4)
    +f3_grad = grad(f3)
     
    -x = 2.7
    +x = np.linspace(0,4,5)
     
    -# Print the computed derivative:
    -print("The computed derivative of f4 at x = %g is: %g"%(x,f4_grad(x)))
    +# Print the computed gradient:
    +print("The computed gradient of f3 is: ", f3_grad(x))
     
    -# The analytical derivative is: x/sqrt(1 + x**2) + exp(x) + cos(2*pi*x)*2*pi
    -f4_grad_analytical = x/np.sqrt(1 + x**2) + np.exp(x) + np.cos(2*np.pi*x)*2*np.pi
    +# The analytical gradient is: (2, 3, 5, 7, 22*x[4])
    +f3_grad_analytical = np.array([2, 3, 5, 7, 22*x[4]])
     
     # Print the analytical gradient:
    -print("The analytical gradient of f4 at x = %g is: %g"%(x,f4_grad_analytical))
    +print("The analytical gradient of f3 is: ", f3_grad_analytical)
     
    +

    +Note that in this case, when sending an array as input argument, the +output from Autograd is another array. This is the true gradient of +the function, as opposed to the function in the previous example. By +using arrays to represent the variables, the output from Autograd +might be easier to work with, as the output is closer to what one +could expect form a gradient-evaluting function. +

    @@ -302,7 +331,7 @@ f4_grad_analytical = x48

  • 49
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs040.html b/doc/pub/Splines/html/._Splines-bs040.html index bcd088d66..9e5c23aae 100644 --- a/doc/pub/Splines/html/._Splines-bs040.html +++ b/doc/pub/Splines/html/._Splines-bs040.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -251,27 +272,30 @@ MathJax.Hub.Config({

     

     

     

    - + -

    More autograd

    +

    Functions using mathematical functions from Numpy

    import autograd.numpy as np
     from autograd import grad
    -def f5(x):
    -    if x >= 0:
    -        return x**2
    -    else:
    -        return -3*x + 1
    +def f4(x):
    +    return np.sqrt(1+x**2) + np.exp(x) + np.sin(2*np.pi*x)
     
    -f5_grad = grad(f5)
    +f4_grad = grad(f4)
     
     x = 2.7
     
     # Print the computed derivative:
    -print("The computed derivative of f5 at x = %g is: %g"%(x,f5_grad(x)))
    +print("The computed derivative of f4 at x = %g is: %g"%(x,f4_grad(x)))
    +
    +# The analytical derivative is: x/sqrt(1 + x**2) + exp(x) + cos(2*pi*x)*2*pi
    +f4_grad_analytical = x/np.sqrt(1 + x**2) + np.exp(x) + np.cos(2*np.pi*x)*2*np.pi
    +
    +# Print the analytical gradient:
    +print("The analytical gradient of f4 at x = %g is: %g"%(x,f4_grad_analytical))
     

    @@ -299,7 +323,7 @@ x = 2.7

  • 49
  • 50
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs041.html b/doc/pub/Splines/html/._Splines-bs041.html index 5d8280745..480fa658d 100644 --- a/doc/pub/Splines/html/._Splines-bs041.html +++ b/doc/pub/Splines/html/._Splines-bs041.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,48 +274,25 @@ MathJax.Hub.Config({ -

    And with loops

    +

    More autograd

    import autograd.numpy as np
     from autograd import grad
    -def f6_for(x):
    -    val = 0
    -    for i in range(10):
    -        val = val + x**i
    -    return val
    +def f5(x):
    +    if x >= 0:
    +        return x**2
    +    else:
    +        return -3*x + 1
     
    -def f6_while(x):
    -    val = 0
    -    i = 0
    -    while i < 10:
    -        val = val + x**i
    -        i = i + 1
    -    return val
    +f5_grad = grad(f5)
     
    -f6_for_grad = grad(f6_for)
    -f6_while_grad = grad(f6_while)
    +x = 2.7
     
    -x = 0.5
    -
    -# Print the computed derivaties of f6_for and f6_while
    -print("The computed derivative of f6_for at x = %g is: %g"%(x,f6_for_grad(x)))
    -print("The computed derivative of f6_while at x = %g is: %g"%(x,f6_while_grad(x)))
    -
    -

    - - -

    import autograd.numpy as np
    -from autograd import grad
    -# Both of the functions are implementation of the sum: sum(x**i) for i = 0, ..., 9
    -# The analytical derivative is: sum(i*x**(i-1)) 
    -f6_grad_analytical = 0
    -for i in range(10):
    -    f6_grad_analytical += i*x**(i-1)
    -
    -print("The analytical derivative of f6 at x = %g is: %g"%(x,f6_grad_analytical))
    +# Print the computed derivative:
    +print("The computed derivative of f5 at x = %g is: %g"%(x,f5_grad(x)))
     

    @@ -322,7 +320,7 @@ f6_grad_analytical = 50

  • 51
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs042.html b/doc/pub/Splines/html/._Splines-bs042.html index 6cb15cdf2..c5804b20c 100644 --- a/doc/pub/Splines/html/._Splines-bs042.html +++ b/doc/pub/Splines/html/._Splines-bs042.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,41 +274,49 @@ MathJax.Hub.Config({ -

    Using recursion

    +

    And with loops

    +

    import autograd.numpy as np
     from autograd import grad
    +def f6_for(x):
    +    val = 0
    +    for i in range(10):
    +        val = val + x**i
    +    return val
     
    -def f7(n): # Assume that n is an integer
    -    if n == 1 or n == 0:
    -        return 1
    -    else:
    -        return n*f7(n-1)
    +def f6_while(x):
    +    val = 0
    +    i = 0
    +    while i < 10:
    +        val = val + x**i
    +        i = i + 1
    +    return val
     
    -f7_grad = grad(f7)
    +f6_for_grad = grad(f6_for)
    +f6_while_grad = grad(f6_while)
     
    -n = 2.0
    +x = 0.5
     
    -print("The computed derivative of f7 at n = %d is: %g"%(n,f7_grad(n)))
    -
    -# The function f7 is an implementation of the factorial of n.
    -# By using the product rule, one can find that the derivative is:
    -
    -f7_grad_analytical = 0
    -for i in range(int(n)-1):
    -    tmp = 1
    -    for k in range(int(n)-1):
    -        if k != i:
    -            tmp *= (n - k)
    -    f7_grad_analytical += tmp
    -
    -print("The analytical derivative of f7 at n = %d is: %g"%(n,f7_grad_analytical))
    +# Print the computed derivaties of f6_for and f6_while
    +print("The computed derivative of f6_for at x = %g is: %g"%(x,f6_for_grad(x)))
    +print("The computed derivative of f6_while at x = %g is: %g"%(x,f6_while_grad(x)))
     

    -Note that if n is equal to zero or one, Autograd will give an error message. This message appears when the output is independent on input. + +

    import autograd.numpy as np
    +from autograd import grad
    +# Both of the functions are implementation of the sum: sum(x**i) for i = 0, ..., 9
    +# The analytical derivative is: sum(i*x**(i-1)) 
    +f6_grad_analytical = 0
    +for i in range(10):
    +    f6_grad_analytical += i*x**(i-1)
    +
    +print("The analytical derivative of f6 at x = %g is: %g"%(x,f6_grad_analytical))
    +

    @@ -314,7 +343,7 @@ Note that if n is equal to zero or one, Autograd will give an error message. Thi

  • 51
  • 52
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs043.html b/doc/pub/Splines/html/._Splines-bs043.html index 3a8efd0d2..313fedcef 100644 --- a/doc/pub/Splines/html/._Splines-bs043.html +++ b/doc/pub/Splines/html/._Splines-bs043.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,28 +274,40 @@ MathJax.Hub.Config({ -

    Unsupported functions

    -Autograd supports many features. However, there are some functions that is not supported (yet) by Autograd. - -

    -Assigning a value to the variable being differentiated with respect to +

    Using recursion

    import autograd.numpy as np
     from autograd import grad
    -def f8(x): # Assume x is an array
    -    x[2] = 3
    -    return x*2
     
    -f8_grad = grad(f8)
    +def f7(n): # Assume that n is an integer
    +    if n == 1 or n == 0:
    +        return 1
    +    else:
    +        return n*f7(n-1)
     
    -x = 8.4
    +f7_grad = grad(f7)
     
    -print("The derivative of f8 is:",f8_grad(x))
    +n = 2.0
    +
    +print("The computed derivative of f7 at n = %d is: %g"%(n,f7_grad(n)))
    +
    +# The function f7 is an implementation of the factorial of n.
    +# By using the product rule, one can find that the derivative is:
    +
    +f7_grad_analytical = 0
    +for i in range(int(n)-1):
    +    tmp = 1
    +    for k in range(int(n)-1):
    +        if k != i:
    +            tmp *= (n - k)
    +    f7_grad_analytical += tmp
    +
    +print("The analytical derivative of f7 at n = %d is: %g"%(n,f7_grad_analytical))
     

    -Here, Autograd tells us that an 'ArrayBox' does not support item assignment. The item assignment is done when the program tries to assign x[2] to the value 3. However, Autograd has implemented the computation of the derivative such that this assignment is not possible. +Note that if n is equal to zero or one, Autograd will give an error message. This message appears when the output is independent on input.

    @@ -302,7 +335,7 @@ Here, Autograd tells us that an 'ArrayBox' does not support item assignment. The

  • 52
  • 53
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs044.html b/doc/pub/Splines/html/._Splines-bs044.html index bcf453fb9..c46b0ffb0 100644 --- a/doc/pub/Splines/html/._Splines-bs044.html +++ b/doc/pub/Splines/html/._Splines-bs044.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,45 +274,29 @@ MathJax.Hub.Config({ -

    The syntax a.dot(b) when finding the dot product

    +

    Unsupported functions

    +Autograd supports many features. However, there are some functions that is not supported (yet) by Autograd. + +

    +Assigning a value to the variable being differentiated with respect to

    import autograd.numpy as np
     from autograd import grad
    -def f9(a): # Assume a is an array with 2 elements
    -    b = np.array([1.0,2.0])
    -    return a.dot(b)
    +def f8(x): # Assume x is an array
    +    x[2] = 3
    +    return x*2
     
    -f9_grad = grad(f9)
    +f8_grad = grad(f8)
     
    -x = np.array([1.0,0.0])
    +x = 8.4
     
    -print("The derivative of f9 is:",f9_grad(x))
    +print("The derivative of f8 is:",f8_grad(x))
     

    -Here we are told that the 'dot' function does not belong to Autograd's -version of a Numpy array. To overcome this, an alternative syntax -which also computed the dot product can be used: +Here, Autograd tells us that an 'ArrayBox' does not support item assignment. The item assignment is done when the program tries to assign x[2] to the value 3. However, Autograd has implemented the computation of the derivative such that this assignment is not possible. -

    - - -

    import autograd.numpy as np
    -from autograd import grad
    -def f9_alternative(x): # Assume a is an array with 2 elements
    -    b = np.array([1.0,2.0])
    -    return np.dot(x,b) # The same as x_1*b_1 + x_2*b_2
    -
    -f9_alternative_grad = grad(f9_alternative)
    -
    -x = np.array([3.0,0.0])
    -
    -print("The gradient of f9 is:",f9_alternative_grad(x))
    -
    -# The analytical gradient of the dot product of vectors x and b with two elements (x_1,x_2) and (b_1, b_2) respectively
    -# w.r.t x is (b_1, b_2).
    -

    @@ -318,7 +323,7 @@ x = np.a

  • 53
  • 54
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs045.html b/doc/pub/Splines/html/._Splines-bs045.html index ed13b7ea9..2cf7e23ba 100644 --- a/doc/pub/Splines/html/._Splines-bs045.html +++ b/doc/pub/Splines/html/._Splines-bs045.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,15 +274,44 @@ MathJax.Hub.Config({ -

    Recommended to avoid

    -The documentation recommends to avoid inplace operations such as +

    The syntax a.dot(b) when finding the dot product

    -

    a += b
    -a -= b
    -a*= b
    -a /=b
    +
    import autograd.numpy as np
    +from autograd import grad
    +def f9(a): # Assume a is an array with 2 elements
    +    b = np.array([1.0,2.0])
    +    return a.dot(b)
    +
    +f9_grad = grad(f9)
    +
    +x = np.array([1.0,0.0])
    +
    +print("The derivative of f9 is:",f9_grad(x))
    +
    +

    +Here we are told that the 'dot' function does not belong to Autograd's +version of a Numpy array. To overcome this, an alternative syntax +which also computed the dot product can be used: + +

    + + +

    import autograd.numpy as np
    +from autograd import grad
    +def f9_alternative(x): # Assume a is an array with 2 elements
    +    b = np.array([1.0,2.0])
    +    return np.dot(x,b) # The same as x_1*b_1 + x_2*b_2
    +
    +f9_alternative_grad = grad(f9_alternative)
    +
    +x = np.array([3.0,0.0])
    +
    +print("The gradient of f9 is:",f9_alternative_grad(x))
    +
    +# The analytical gradient of the dot product of vectors x and b with two elements (x_1,x_2) and (b_1, b_2) respectively
    +# w.r.t x is (b_1, b_2).
     

    @@ -289,7 +339,7 @@ a /=b

  • 54
  • 55
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs046.html b/doc/pub/Splines/html/._Splines-bs046.html index ff588e0ad..5f8401b94 100644 --- a/doc/pub/Splines/html/._Splines-bs046.html +++ b/doc/pub/Splines/html/._Splines-bs046.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,21 +274,16 @@ MathJax.Hub.Config({ -

    Stochastic Gradient Descent

    - +

    Recommended to avoid

    +The documentation recommends to avoid inplace operations such as

    -Stochastic gradient descent (SGD) and variants thereof address some of -the shortcomings of the Gradient descent method discussed above. - -

    -The underlying idea of SGD comes from the observation that the cost -function, which we want to minimize, can almost always be written as a -sum over \( n \) data points \( \{\mathbf{x}_i\}_{i=1}^n \), -$$ -C(\mathbf{\beta}) = \sum_{i=1}^n c_i(\mathbf{x}_i, -\mathbf{\beta}). -$$ + +

    a += b
    +a -= b
    +a*= b
    +a /=b
    +

    @@ -294,7 +310,7 @@ $$

  • 55
  • 56
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs047.html b/doc/pub/Splines/html/._Splines-bs047.html index 2708ba343..521d90c18 100644 --- a/doc/pub/Splines/html/._Splines-bs047.html +++ b/doc/pub/Splines/html/._Splines-bs047.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,22 +274,20 @@ MathJax.Hub.Config({ -

    Computation of gradients

    +

    Stochastic Gradient Descent

    -This in turn means that the gradient can be -computed as a sum over \( i \)-gradients -$$ -\nabla_\beta C(\mathbf{\beta}) = \sum_i^n \nabla_\beta c_i(\mathbf{x}_i, -\mathbf{\beta}). -$$ +Stochastic gradient descent (SGD) and variants thereof address some of +the shortcomings of the Gradient descent method discussed above.

    -Stochasticity/randomness is introduced by only taking the -gradient on a subset of the data called minibatches. If there are \( n \) -data points and the size of each minibatch is \( M \), there will be \( n/M \) -minibatches. We denote these minibatches by \( B_k \) where -\( k=1,\cdots,n/M \). +The underlying idea of SGD comes from the observation that the cost +function, which we want to minimize, can almost always be written as a +sum over \( n \) data points \( \{\mathbf{x}_i\}_{i=1}^n \), +$$ +C(\mathbf{\beta}) = \sum_{i=1}^n c_i(\mathbf{x}_i, +\mathbf{\beta}). +$$

    @@ -296,7 +315,7 @@ minibatches. We denote these minibatches by \( B_k \) where

  • 56
  • 57
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs048.html b/doc/pub/Splines/html/._Splines-bs048.html index d602f4e3f..0a3e119ca 100644 --- a/doc/pub/Splines/html/._Splines-bs048.html +++ b/doc/pub/Splines/html/._Splines-bs048.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,27 +274,23 @@ MathJax.Hub.Config({ -

    SGD example

    -As an example, suppose we have \( 10 \) data points \( (\mathbf{x}_1,\cdots, \mathbf{x}_{10}) \) -and we choose to have \( M=5 \) minibathces, -then each minibatch contains two data points. In particular we have -\( B_1 = (\mathbf{x}_1,\mathbf{x}_2), \cdots, B_5 = -(\mathbf{x}_9,\mathbf{x}_{10}) \). Note that if you choose \( M=1 \) you -have only a single batch with all data points and on the other extreme, -you may choose \( M=n \) resulting in a minibatch for each datapoint, i.e -\( B_k = \mathbf{x}_k \). +

    Computation of gradients

    -The idea is now to approximate the gradient by replacing the sum over -all data points with a sum over the data points in one the minibatches -picked at random in each gradient descent step +This in turn means that the gradient can be +computed as a sum over \( i \)-gradients $$ -\nabla_{\beta} -C(\mathbf{\beta}) = \sum_{i=1}^n \nabla_\beta c_i(\mathbf{x}_i, -\mathbf{\beta}) \rightarrow \sum_{i \in B_k}^n \nabla_\beta -c_i(\mathbf{x}_i, \mathbf{\beta}). +\nabla_\beta C(\mathbf{\beta}) = \sum_i^n \nabla_\beta c_i(\mathbf{x}_i, +\mathbf{\beta}). $$ +

    +Stochasticity/randomness is introduced by only taking the +gradient on a subset of the data called minibatches. If there are \( n \) +data points and the size of each minibatch is \( M \), there will be \( n/M \) +minibatches. We denote these minibatches by \( B_k \) where +\( k=1,\cdots,n/M \). +

    @@ -300,7 +317,7 @@ $$

  • 57
  • 58
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs049.html b/doc/pub/Splines/html/._Splines-bs049.html index 8c110af9a..e36f6dd19 100644 --- a/doc/pub/Splines/html/._Splines-bs049.html +++ b/doc/pub/Splines/html/._Splines-bs049.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,22 +274,27 @@ MathJax.Hub.Config({ -

    The gradient step

    +

    SGD example

    +As an example, suppose we have \( 10 \) data points \( (\mathbf{x}_1,\cdots, \mathbf{x}_{10}) \) +and we choose to have \( M=5 \) minibathces, +then each minibatch contains two data points. In particular we have +\( B_1 = (\mathbf{x}_1,\mathbf{x}_2), \cdots, B_5 = +(\mathbf{x}_9,\mathbf{x}_{10}) \). Note that if you choose \( M=1 \) you +have only a single batch with all data points and on the other extreme, +you may choose \( M=n \) resulting in a minibatch for each datapoint, i.e +\( B_k = \mathbf{x}_k \).

    -Thus a gradient descent step now looks like +The idea is now to approximate the gradient by replacing the sum over +all data points with a sum over the data points in one the minibatches +picked at random in each gradient descent step $$ -\beta_{j+1} = \beta_j - \gamma_j \sum_{i \in B_k}^n \nabla_\beta c_i(\mathbf{x}_i, -\mathbf{\beta}) +\nabla_{\beta} +C(\mathbf{\beta}) = \sum_{i=1}^n \nabla_\beta c_i(\mathbf{x}_i, +\mathbf{\beta}) \rightarrow \sum_{i \in B_k}^n \nabla_\beta +c_i(\mathbf{x}_i, \mathbf{\beta}). $$ -

    -where \( k \) is picked at random with equal -probability from \( [1,n/M] \). An iteration over the number of -minibathces (n/M) is commonly referred to as an epoch. Thus it is -typical to choose a number of epochs and for each epoch iterate over -the number of minibatches, as exemplified in the code below. -

    @@ -295,7 +321,7 @@ the number of minibatches, as exemplified in the code below.

  • 58
  • 59
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs050.html b/doc/pub/Splines/html/._Splines-bs050.html index a0ba39efb..11f05ecf4 100644 --- a/doc/pub/Splines/html/._Splines-bs050.html +++ b/doc/pub/Splines/html/._Splines-bs050.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,34 +274,21 @@ MathJax.Hub.Config({ -

    Simple example code

    +

    The gradient step

    +Thus a gradient descent step now looks like +$$ +\beta_{j+1} = \beta_j - \gamma_j \sum_{i \in B_k}^n \nabla_\beta c_i(\mathbf{x}_i, +\mathbf{\beta}) +$$ - -

    import numpy as np 
    -
    -n = 100 #100 datapoints 
    -M = 5   #size of each minibatch
    -m = int(n/M) #number of minibatches
    -n_epochs = 10 #number of epochs
    -
    -j = 0
    -for epoch in range(1,n_epochs+1):
    -    for i in range(m):
    -        k = np.random.randint(m) #Pick the k-th minibatch at random
    -        #Compute the gradient using the data in minibatch Bk
    -        #Compute new suggestion for 
    -        j += 1
    -

    -Taking the gradient only on a subset of the data has two important -benefits. First, it introduces randomness which decreases the chance -that our opmization scheme gets stuck in a local minima. Second, if -the size of the minibatches are small relative to the number of -datapoints (\( M < n \)), the computation of the gradient is much -cheaper since we sum over the datapoints in the \( k-th \) minibatch and not -all \( n \) datapoints. +where \( k \) is picked at random with equal +probability from \( [1,n/M] \). An iteration over the number of +minibathces (n/M) is commonly referred to as an epoch. Thus it is +typical to choose a number of epochs and for each epoch iterate over +the number of minibatches, as exemplified in the code below.

    @@ -308,7 +316,7 @@ all \( n \) datapoints.

  • 59
  • 60
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs051.html b/doc/pub/Splines/html/._Splines-bs051.html index c27ba6568..96d798de5 100644 --- a/doc/pub/Splines/html/._Splines-bs051.html +++ b/doc/pub/Splines/html/._Splines-bs051.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,19 +274,34 @@ MathJax.Hub.Config({ -

    When do we stop?

    +

    Simple example code

    -A natural question is when do we stop the search for a new minimum? -One possibility is to compute the full gradient after a given number -of epochs and check if the norm of the gradient is smaller than some -threshold and stop if true. However, the condition that the gradient -is zero is valid also for local minima, so this would only tell us -that we are close to a local/global minimum. However, we could also -evaluate the cost function at this point, store the result and -continue the search. If the test kicks in at a later stage we can -compare the values of the cost function and keep the \( \beta \) that -gave the lowest value. + + +

    import numpy as np 
    +
    +n = 100 #100 datapoints 
    +M = 5   #size of each minibatch
    +m = int(n/M) #number of minibatches
    +n_epochs = 10 #number of epochs
    +
    +j = 0
    +for epoch in range(1,n_epochs+1):
    +    for i in range(m):
    +        k = np.random.randint(m) #Pick the k-th minibatch at random
    +        #Compute the gradient using the data in minibatch Bk
    +        #Compute new suggestion for 
    +        j += 1
    +
    +

    +Taking the gradient only on a subset of the data has two important +benefits. First, it introduces randomness which decreases the chance +that our opmization scheme gets stuck in a local minima. Second, if +the size of the minibatches are small relative to the number of +datapoints (\( M < n \)), the computation of the gradient is much +cheaper since we sum over the datapoints in the \( k-th \) minibatch and not +all \( n \) datapoints.

    @@ -293,7 +329,7 @@ gave the lowest value.

  • 60
  • 61
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs052.html b/doc/pub/Splines/html/._Splines-bs052.html index 2b2dac843..09d531cc1 100644 --- a/doc/pub/Splines/html/._Splines-bs052.html +++ b/doc/pub/Splines/html/._Splines-bs052.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -253,51 +274,20 @@ MathJax.Hub.Config({ -

    Slightly different approach

    +

    When do we stop?

    -Another approach is to let the step length \( \gamma_j \) depend on the -number of epochs in such a way that it becomes very small after a -reasonable time such that we do not move at all. +A natural question is when do we stop the search for a new minimum? +One possibility is to compute the full gradient after a given number +of epochs and check if the norm of the gradient is smaller than some +threshold and stop if true. However, the condition that the gradient +is zero is valid also for local minima, so this would only tell us +that we are close to a local/global minimum. However, we could also +evaluate the cost function at this point, store the result and +continue the search. If the test kicks in at a later stage we can +compare the values of the cost function and keep the \( \beta \) that +gave the lowest value. -

    -As an example, let \( e = 0,1,2,3,\cdots \) denote the current epoch and let \( t_0, t_1 > 0 \) be two fixed numbers. Furthermore, let \( t = e \cdot m + i \) where \( m \) is the number of minibatches and \( i=0,\cdots,m-1 \). Then the function $$\gamma_j(t; t_0, t_1) = \frac{t_0}{t+t_1} $$ goes to zero as the number of epochs gets large. I.e. we start with a step length \( \gamma_j (0; t_0, t_1) = t_0/t_1 \) which decays in time \( t \). - -

    -In this way we can fix the number of epochs, compute \( \beta \) and -evaluate the cost function at the end. Repeating the computation will -give a different result since the scheme is random by design. Then we -pick the final \( \beta \) that gives the lowest value of the cost -function. - -

    - - -

    import numpy as np 
    -
    -def step_length(t,t0,t1):
    -    return t0/(t+t1)
    -
    -n = 100 #100 datapoints 
    -M = 5   #size of each minibatch
    -m = int(n/M) #number of minibatches
    -n_epochs = 500 #number of epochs
    -t0 = 1.0
    -t1 = 10
    -
    -gamma_j = t0/t1
    -j = 0
    -for epoch in range(1,n_epochs+1):
    -    for i in range(m):
    -        k = np.random.randint(m) #Pick the k-th minibatch at random
    -        #Compute the gradient using the data in minibatch Bk
    -        #Compute new suggestion for beta
    -        t = epoch*m+i
    -        gamma_j = step_length(t,t0,t1)
    -        j += 1
    -
    -print("gamma_j after %d epochs: %g" % (n_epochs,gamma_j))
    -

    @@ -324,7 +314,7 @@ j = 0

  • 61
  • 62
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/._Splines-bs053.html b/doc/pub/Splines/html/._Splines-bs053.html new file mode 100644 index 000000000..2e823b435 --- /dev/null +++ b/doc/pub/Splines/html/._Splines-bs053.html @@ -0,0 +1,373 @@ + + + + + + + +Data Analysis and Machine Learning Lectures: Optimization and Gradient Methods + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +

     

     

     

    + + + + +

    Slightly different approach

    + +

    +Another approach is to let the step length \( \gamma_j \) depend on the +number of epochs in such a way that it becomes very small after a +reasonable time such that we do not move at all. + +

    +As an example, let \( e = 0,1,2,3,\cdots \) denote the current epoch and let \( t_0, t_1 > 0 \) be two fixed numbers. Furthermore, let \( t = e \cdot m + i \) where \( m \) is the number of minibatches and \( i=0,\cdots,m-1 \). Then the function $$\gamma_j(t; t_0, t_1) = \frac{t_0}{t+t_1} $$ goes to zero as the number of epochs gets large. I.e. we start with a step length \( \gamma_j (0; t_0, t_1) = t_0/t_1 \) which decays in time \( t \). + +

    +In this way we can fix the number of epochs, compute \( \beta \) and +evaluate the cost function at the end. Repeating the computation will +give a different result since the scheme is random by design. Then we +pick the final \( \beta \) that gives the lowest value of the cost +function. + +

    + + +

    import numpy as np 
    +
    +def step_length(t,t0,t1):
    +    return t0/(t+t1)
    +
    +n = 100 #100 datapoints 
    +M = 5   #size of each minibatch
    +m = int(n/M) #number of minibatches
    +n_epochs = 500 #number of epochs
    +t0 = 1.0
    +t1 = 10
    +
    +gamma_j = t0/t1
    +j = 0
    +for epoch in range(1,n_epochs+1):
    +    for i in range(m):
    +        k = np.random.randint(m) #Pick the k-th minibatch at random
    +        #Compute the gradient using the data in minibatch Bk
    +        #Compute new suggestion for beta
    +        t = epoch*m+i
    +        gamma_j = step_length(t,t0,t1)
    +        j += 1
    +
    +print("gamma_j after %d epochs: %g" % (n_epochs,gamma_j))
    +
    +

    +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/Splines/html/._Splines-bs054.html b/doc/pub/Splines/html/._Splines-bs054.html new file mode 100644 index 000000000..4c457fa0c --- /dev/null +++ b/doc/pub/Splines/html/._Splines-bs054.html @@ -0,0 +1,404 @@ + + + + + + + +Data Analysis and Machine Learning Lectures: Optimization and Gradient Methods + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +

     

     

     

    + + + + +

    Program for stochastic gradient

    + +

    + + +

    # Importing various packages
    +from math import exp, sqrt
    +from random import random, seed
    +import numpy as np
    +import matplotlib.pyplot as plt
    +from sklearn.linear_model import SGDRegressor
    +
    +x = 2*np.random.rand(100,1)
    +y = 4+3*x+np.random.randn(100,1)
    +
    +xb = np.c_[np.ones((100,1)), x]
    +theta_linreg = np.linalg.inv(xb.T.dot(xb)).dot(xb.T).dot(y)
    +print("Own inversion")
    +print(theta_linreg)
    +sgdreg = SGDRegressor(n_iter = 50, penalty=None, eta0=0.1)
    +sgdreg.fit(x,y.ravel())
    +print("sgdreg from scikit")
    +print(sgdreg.intercept_, sgdreg.coef_)
    +
    +
    +theta = np.random.randn(2,1)
    +
    +eta = 0.1
    +Niterations = 1000
    +m = 100
    +
    +for iter in range(Niterations):
    +    gradients = 2.0/m*xb.T.dot(xb.dot(theta)-y)
    +    theta -= eta*gradients
    +print("theta frm own gd")
    +print(theta)
    +
    +xnew = np.array([[0],[2]])
    +xbnew = np.c_[np.ones((2,1)), xnew]
    +ypredict = xbnew.dot(theta)
    +ypredict2 = xbnew.dot(theta_linreg)
    +
    +
    +n_epochs = 50
    +t0, t1 = 5, 50
    +m = 100
    +def learning_schedule(t):
    +    return t0/(t+t1)
    +
    +theta = np.random.randn(2,1)
    +
    +for epoch in range(n_epochs):
    +    for i in range(m):
    +        random_index = np.random.randint(m)
    +        xi = xb[random_index:random_index+1]
    +        yi = y[random_index:random_index+1]
    +        gradients = 2 * xi.T.dot(xi.dot(theta)-yi)
    +        eta = learning_schedule(epoch*m+i)
    +        theta = theta - eta*gradients
    +print("theta from own sdg")
    +print(theta)
    +
    +
    +
    +
    +
    +
    +plt.plot(xnew, ypredict, "r-")
    +plt.plot(xnew, ypredict2, "b-")
    +plt.plot(x, y ,'ro')
    +plt.axis([0,2.0,0, 15.0])
    +plt.xlabel(r'$x$')
    +plt.ylabel(r'$y$')
    +plt.title(r'Random numbers ')
    +plt.show()
    +
    +

    +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/Splines/html/._Splines-bs055.html b/doc/pub/Splines/html/._Splines-bs055.html new file mode 100644 index 000000000..c8946b9ed --- /dev/null +++ b/doc/pub/Splines/html/._Splines-bs055.html @@ -0,0 +1,330 @@ + + + + + + + +Data Analysis and Machine Learning Lectures: Optimization and Gradient Methods + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +

     

     

     

    + + + + +

    Momentum based methods

    + +

    +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/Splines/html/._Splines-bs056.html b/doc/pub/Splines/html/._Splines-bs056.html new file mode 100644 index 000000000..cd578c56b --- /dev/null +++ b/doc/pub/Splines/html/._Splines-bs056.html @@ -0,0 +1,356 @@ + + + + + + + +Data Analysis and Machine Learning Lectures: Optimization and Gradient Methods + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +

     

     

     

    + + + + +

    Conjugate gradient method

    +
    +
    +

    +In the CG method we define so-called conjugate directions and two vectors +\( \hat{s} \) and \( \hat{t} \) +are said to be +conjugate if +$$ +\begin{equation*} +\hat{s}^T\hat{A}\hat{t}= 0. +\end{equation*} +$$ + +The philosophy of the CG method is to perform searches in various conjugate directions +of our vectors \( \hat{x}_i \) obeying the above criterion, namely +$$ +\begin{equation*} +\hat{x}_i^T\hat{A}\hat{x}_j= 0. +\end{equation*} +$$ + +Two vectors are conjugate if they are orthogonal with respect to +this inner product. Being conjugate is a symmetric relation: if \( \hat{s} \) is conjugate to \( \hat{t} \), then \( \hat{t} \) is conjugate to \( \hat{s} \). +

    +
    + + +

    +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/Splines/html/._Splines-bs057.html b/doc/pub/Splines/html/._Splines-bs057.html new file mode 100644 index 000000000..47f3d52bb --- /dev/null +++ b/doc/pub/Splines/html/._Splines-bs057.html @@ -0,0 +1,344 @@ + + + + + + + +Data Analysis and Machine Learning Lectures: Optimization and Gradient Methods + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +

     

     

     

    + + + + +

    Conjugate gradient method

    +
    +
    +

    +An example is given by the eigenvectors of the matrix +$$ +\begin{equation*} +\hat{v}_i^T\hat{A}\hat{v}_j= \lambda\hat{v}_i^T\hat{v}_j, +\end{equation*} +$$ + +which is zero unless \( i=j \). +

    +
    + + +

    +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/Splines/html/._Splines-bs058.html b/doc/pub/Splines/html/._Splines-bs058.html new file mode 100644 index 000000000..1a439944e --- /dev/null +++ b/doc/pub/Splines/html/._Splines-bs058.html @@ -0,0 +1,353 @@ + + + + + + + +Data Analysis and Machine Learning Lectures: Optimization and Gradient Methods + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +

     

     

     

    + + + + +

    Conjugate gradient method

    +
    +
    +

    +Assume now that we have a symmetric positive-definite matrix \( \hat{A} \) of size +\( n\times n \). At each iteration \( i+1 \) we obtain the conjugate direction of a vector +$$ +\begin{equation*} +\hat{x}_{i+1}=\hat{x}_{i}+\alpha_i\hat{p}_{i}. +\end{equation*} +$$ + +We assume that \( \hat{p}_{i} \) is a sequence of \( n \) mutually conjugate directions. +Then the \( \hat{p}_{i} \) form a basis of \( R^n \) and we can expand the solution +$ \hat{A}\hat{x} = \hat{b}$ in this basis, namely + +$$ +\begin{equation*} + \hat{x} = \sum^{n}_{i=1} \alpha_i \hat{p}_i. +\end{equation*} +$$ +

    +
    + + +

    +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/Splines/html/._Splines-bs059.html b/doc/pub/Splines/html/._Splines-bs059.html new file mode 100644 index 000000000..c38a4263b --- /dev/null +++ b/doc/pub/Splines/html/._Splines-bs059.html @@ -0,0 +1,358 @@ + + + + + + + +Data Analysis and Machine Learning Lectures: Optimization and Gradient Methods + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +

     

     

     

    + + + + +

    Conjugate gradient method

    +
    +
    +

    +The coefficients are given by +$$ +\begin{equation*} + \mathbf{A}\mathbf{x} = \sum^{n}_{i=1} \alpha_i \mathbf{A} \mathbf{p}_i = \mathbf{b}. +\end{equation*} +$$ + +Multiplying with \( \hat{p}_k^T \) from the left gives + +$$ +\begin{equation*} + \hat{p}_k^T \hat{A}\hat{x} = \sum^{n}_{i=1} \alpha_i\hat{p}_k^T \hat{A}\hat{p}_i= \hat{p}_k^T \hat{b}, +\end{equation*} +$$ + +and we can define the coefficients \( \alpha_k \) as + +$$ +\begin{equation*} + \alpha_k = \frac{\hat{p}_k^T \hat{b}}{\hat{p}_k^T \hat{A} \hat{p}_k} +\end{equation*} +$$ +

    +
    + + +

    +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/Splines/html/._Splines-bs060.html b/doc/pub/Splines/html/._Splines-bs060.html new file mode 100644 index 000000000..496f0b81a --- /dev/null +++ b/doc/pub/Splines/html/._Splines-bs060.html @@ -0,0 +1,362 @@ + + + + + + + +Data Analysis and Machine Learning Lectures: Optimization and Gradient Methods + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

     

     

     

    + + + + +

    Conjugate gradient method and iterations

    +
    +
    +

    + +

    +If we choose the conjugate vectors \( \hat{p}_k \) carefully, +then we may not need all of them to obtain a good approximation to the solution +\( \hat{x} \). +We want to regard the conjugate gradient method as an iterative method. +This will us to solve systems where \( n \) is so large that the direct +method would take too much time. + +

    +We denote the initial guess for \( \hat{x} \) as \( \hat{x}_0 \). +We can assume without loss of generality that +$$ +\begin{equation*} +\hat{x}_0=0, +\end{equation*} +$$ + +or consider the system +$$ +\begin{equation*} +\hat{A}\hat{z} = \hat{b}-\hat{A}\hat{x}_0, +\end{equation*} +$$ + +instead. +

    +
    + + +

    +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/Splines/html/._Splines-bs061.html b/doc/pub/Splines/html/._Splines-bs061.html new file mode 100644 index 000000000..8d2b160e1 --- /dev/null +++ b/doc/pub/Splines/html/._Splines-bs061.html @@ -0,0 +1,356 @@ + + + + + + + +Data Analysis and Machine Learning Lectures: Optimization and Gradient Methods + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

     

     

     

    + + + + +

    Conjugate gradient method

    +
    +
    +

    +One can show that the solution \( \hat{x} \) is also the unique minimizer of the quadratic form +$$ +\begin{equation*} + f(\hat{x}) = \frac{1}{2}\hat{x}^T\hat{A}\hat{x} - \hat{x}^T \hat{x} , \quad \hat{x}\in\mathbf{R}^n. +\end{equation*} +$$ + +This suggests taking the first basis vector \( \hat{p}_1 \) +to be the gradient of \( f \) at \( \hat{x}=\hat{x}_0 \), +which equals +$$ +\begin{equation*} +\hat{A}\hat{x}_0-\hat{b}, +\end{equation*} +$$ + +and +\( \hat{x}_0=0 \) it is equal \( -\hat{b} \). +The other vectors in the basis will be conjugate to the gradient, +hence the name conjugate gradient method. +

    +
    + + +

    +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/Splines/html/._Splines-bs062.html b/doc/pub/Splines/html/._Splines-bs062.html new file mode 100644 index 000000000..676d1c3fd --- /dev/null +++ b/doc/pub/Splines/html/._Splines-bs062.html @@ -0,0 +1,355 @@ + + + + + + + +Data Analysis and Machine Learning Lectures: Optimization and Gradient Methods + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

     

     

     

    + + + + +

    Conjugate gradient method

    +
    +
    +

    +Let \( \hat{r}_k \) be the residual at the \( k \)-th step: +$$ +\begin{equation*} +\hat{r}_k=\hat{b}-\hat{A}\hat{x}_k. +\end{equation*} +$$ + +Note that \( \hat{r}_k \) is the negative gradient of \( f \) at +\( \hat{x}=\hat{x}_k \), +so the gradient descent method would be to move in the direction \( \hat{r}_k \). +Here, we insist that the directions \( \hat{p}_k \) are conjugate to each other, +so we take the direction closest to the gradient \( \hat{r}_k \) +under the conjugacy constraint. +This gives the following expression +$$ +\begin{equation*} +\hat{p}_{k+1}=\hat{r}_k-\frac{\hat{p}_k^T \hat{A}\hat{r}_k}{\hat{p}_k^T\hat{A}\hat{p}_k} \hat{p}_k. +\end{equation*} +$$ +

    +
    + + +

    +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/Splines/html/._Splines-bs063.html b/doc/pub/Splines/html/._Splines-bs063.html new file mode 100644 index 000000000..1f8578536 --- /dev/null +++ b/doc/pub/Splines/html/._Splines-bs063.html @@ -0,0 +1,364 @@ + + + + + + + +Data Analysis and Machine Learning Lectures: Optimization and Gradient Methods + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

     

     

     

    + + + + +

    Conjugate gradient method

    +
    +
    +

    +We can also compute the residual iteratively as +$$ +\begin{equation*} +\hat{r}_{k+1}=\hat{b}-\hat{A}\hat{x}_{k+1}, + \end{equation*} +$$ + +which equals +$$ +\begin{equation*} +\hat{b}-\hat{A}(\hat{x}_k+\alpha_k\hat{p}_k), + \end{equation*} +$$ + +or +$$ +\begin{equation*} +(\hat{b}-\hat{A}\hat{x}_k)-\alpha_k\hat{A}\hat{p}_k, + \end{equation*} +$$ + +which gives + +$$ +\begin{equation*} +\hat{r}_{k+1}=\hat{r}_k-\hat{A}\hat{p}_{k}, + \end{equation*} +$$ +

    +
    + + +

    +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/Splines/html/._Splines-bs064.html b/doc/pub/Splines/html/._Splines-bs064.html new file mode 100644 index 000000000..f3a1f5d45 --- /dev/null +++ b/doc/pub/Splines/html/._Splines-bs064.html @@ -0,0 +1,363 @@ + + + + + + + +Data Analysis and Machine Learning Lectures: Optimization and Gradient Methods + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

     

     

     

    + + + + +

    Simple implementation of the Conjugate gradient algorithm

    +
    +
    +

    +

    + + +

      Vector ConjugateGradient(Matrix A, Vector b, Vector x0){
    +  int dim = x0.Dimension();
    +  const double tolerance = 1.0e-14;
    +  Vector x(dim),r(dim),v(dim),z(dim);
    +  double c,t,d;
    +
    +  x = x0;
    +  r = b - A*x;
    +  v = r;
    +  c = dot(r,r);
    +  int i = 0; IterMax = dim;
    +  while(i <= IterMax){
    +    z = A*v;
    +    t = c/dot(v,z);
    +    x = x + t*v;
    +    r = r - t*z;
    +    d = dot(r,r);
    +    if(sqrt(d) < tolerance)
    +      break;
    +    v = r + (d/c)*v;
    +    c = d;  i++;
    +  }
    +  return x;
    +} 
    +
    +

    +

    +
    + + +

    +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/Splines/html/._Splines-bs065.html b/doc/pub/Splines/html/._Splines-bs065.html new file mode 100644 index 000000000..1b27db650 --- /dev/null +++ b/doc/pub/Splines/html/._Splines-bs065.html @@ -0,0 +1,358 @@ + + + + + + + +Data Analysis and Machine Learning Lectures: Optimization and Gradient Methods + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

     

     

     

    + + + + +

    Broyden–Fletcher–Goldfarb–Shanno algorithm

    +
    +
    +

    +The optimization problem is to minimize \( f(\mathbf {x} ) \) where \( \mathbf {x} \) is a vector in \( R^{n} \), and \( f \) is a differentiable scalar function. There are no constraints on the values that \( \mathbf {x} \) can take. + +

    +The algorithm begins at an initial estimate for the optimal value \( \mathbf {x}_{0} \) and proceeds iteratively to get a better estimate at each stage. + +

    +The search direction \( p_k \) at stage \( k \) is given by the solution of the analogue of the Newton equation +$$ +B_{k}\mathbf {p} _{k}=-\nabla f(\mathbf {x}_{k}), +$$ + +

    +where \( B_{k} \) is an approximation to the Hessian matrix, which is +updated iteratively at each stage, and \( \nabla f(\mathbf {x} _{k}) \) +is the gradient of the function +evaluated at \( x_k \). +A line search in the direction \( p_k \) is then used to +find the next point \( x_{k+1} \) by minimising +$$ +f(\mathbf {x}_{k}+\alpha \mathbf {p}_{k}), +$$ + +over the scalar \( \alpha > 0 \). + +

    +

    +
    + + +

    +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/Splines/html/._Splines-bs066.html b/doc/pub/Splines/html/._Splines-bs066.html new file mode 100644 index 000000000..354eeef9b --- /dev/null +++ b/doc/pub/Splines/html/._Splines-bs066.html @@ -0,0 +1,334 @@ + + + + + + + +Data Analysis and Machine Learning Lectures: Optimization and Gradient Methods + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

     

     

     

    + + + + +

    Using gradient descent methods, limitations

    + + + +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/Splines/html/._Splines-bs067.html b/doc/pub/Splines/html/._Splines-bs067.html new file mode 100644 index 000000000..2d12196b9 --- /dev/null +++ b/doc/pub/Splines/html/._Splines-bs067.html @@ -0,0 +1,343 @@ + + + + + + + +Data Analysis and Machine Learning Lectures: Optimization and Gradient Methods + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

     

     

     

    + + + + +

    Momentum based GD

    + +

    +The stochastic gradient descent (SGD) is almost always used with a momentum or inertia term that serves as a memory of the direction we are moving in parameter space. This is typically +implemented as follows +$$ +\begin{align} +\mathbf{v}_{t}&=\gamma \mathbf{v}_{t-1}+\eta_{t}\nabla_\theta E(\boldsymbol{\theta}_t) \nonumber \\ +\boldsymbol{\theta}_{t+1}&= \boldsymbol{\theta}_t -\mathbf{v}_{t}, +\tag{2} +\end{align} +$$ + +where we have introduced a momentum parameter \( \gamma \), with \( 0\le\gamma\le 1 \), and for brevity we dropped the explicit notation to indicate the gradient is to be taken over a different mini-batch at each step. We call this algorithm gradient descent with momentum (GDM). From these equations, it is clear that \( \mathbf{v}_t \) is a running average of recently encountered gradients and \( (1-\gamma)^{-1} \) sets the characteristic time scale for the memory used in the averaging procedure. Consistent with this, when \( \gamma=0 \), this just reduces down to ordinary SGD as discussed earlier. An equivalent way of writing the updates is +$$ +\Delta \boldsymbol{\theta}_{t+1} = \gamma \Delta \boldsymbol{\theta}_t -\ \eta_{t}\nabla_\theta E(\boldsymbol{\theta}_t), +$$ + +where we have defined \( \Delta \boldsymbol{\theta}_{t}= \boldsymbol{\theta}_t-\boldsymbol{\theta}_{t-1} \). + +

    +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/Splines/html/._Splines-bs068.html b/doc/pub/Splines/html/._Splines-bs068.html new file mode 100644 index 000000000..9e3d20a8f --- /dev/null +++ b/doc/pub/Splines/html/._Splines-bs068.html @@ -0,0 +1,341 @@ + + + + + + + +Data Analysis and Machine Learning Lectures: Optimization and Gradient Methods + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

     

     

     

    + + + + +

    More on momentum based approaches

    + +

    +Let us try to get more intuition from these equations. It is helpful to consider a simple physical analogy with a particle of mass \( m \) moving in a viscous medium with drag coefficient \( \mu \) and potential +\( E(\mathbf{w}) \). If we denote the particle's position by \( \mathbf{w} \), then its motion is described by +$$ +m {d^2 \mathbf{w} \over dt^2} + \mu {d \mathbf{w} \over dt }= -\nabla_w E(\mathbf{w}). +$$ + +We can discretize this equation in the usual way to get +$$ +m { \mathbf{w}_{t+\Delta t}-2 \mathbf{w}_{t} +\mathbf{w}_{t-\Delta t} \over (\Delta t)^2}+\mu {\mathbf{w}_{t+\Delta t}- \mathbf{w}_{t} \over \Delta t} = -\nabla_w E(\mathbf{w}). +$$ + +Rearranging this equation, we can rewrite this as +$$ +\Delta \mathbf{w}_{t +\Delta t}= - { (\Delta t)^2 \over m +\mu \Delta t} \nabla_w E(\mathbf{w})+ {m \over m +\mu \Delta t} \Delta \mathbf{w}_t. +$$ + +

    +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/Splines/html/._Splines-bs069.html b/doc/pub/Splines/html/._Splines-bs069.html new file mode 100644 index 000000000..215e75fa6 --- /dev/null +++ b/doc/pub/Splines/html/._Splines-bs069.html @@ -0,0 +1,348 @@ + + + + + + + +Data Analysis and Machine Learning Lectures: Optimization and Gradient Methods + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

     

     

     

    + + + + +

    Momentum parameter

    +Notice that this equation is identical to previous one if we identify the position of the particle, \( \mathbf{w} \), with the parameters \( \boldsymbol{\theta} \). This allows +us to identify the momentum parameter and learning rate with the mass of the particle and the viscous drag as: +$$ +\gamma= {m \over m +\mu \Delta t }, \qquad \eta = {(\Delta t)^2 \over m +\mu \Delta t}. +$$ + +Thus, as the name suggests, the momentum parameter is proportional to the mass of the particle and effectively provides inertia. Furthermore, in the large viscosity/small learning rate limit, our memory time scales as \( (1-\gamma)^{-1} \approx m/(\mu \Delta t) \). + +

    +Why is momentum useful? SGD momentum helps the gradient descent algorithm gain speed in directions with persistent but small gradients even in the presence of stochasticity, while suppressing oscillations in high-curvature directions. This becomes especially important in situations where the landscape is shallow and flat in some directions and narrow and steep in others. It has been argued that first-order methods (with appropriate initial conditions) can perform comparable to more expensive second order methods, especially in the context of complex deep learning models. + +

    +These beneficial properties of momentum can sometimes become even more pronounced by using a slight modification of the classical momentum algorithm called Nesterov Accelerated Gradient (NAG). + +

    +In the NAG algorithm, rather than calculating the gradient at the current parameters, \( \nabla_\theta E(\boldsymbol{\theta}_t) \), one calculates the gradient at the expected value of the parameters given our current momentum, \( \nabla_\theta E(\boldsymbol{\theta}_t +\gamma \mathbf{v}_{t-1}) \). This yields the NAG update rule +$$ +\begin{align} +\mathbf{v}_{t}&=\gamma \mathbf{v}_{t-1}+\eta_{t}\nabla_\theta E(\boldsymbol{\theta}_t +\gamma \mathbf{v}_{t-1}) \nonumber \\ +\boldsymbol{\theta}_{t+1}&= \boldsymbol{\theta}_t -\mathbf{v}_{t}. +\tag{3} +\end{align} +$$ + +One of the major advantages of NAG is that it allows for the use of a larger learning rate than GDM for the same choice of \( \gamma \). + +

    +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/Splines/html/._Splines-bs070.html b/doc/pub/Splines/html/._Splines-bs070.html new file mode 100644 index 000000000..4307ed9ba --- /dev/null +++ b/doc/pub/Splines/html/._Splines-bs070.html @@ -0,0 +1,342 @@ + + + + + + + +Data Analysis and Machine Learning Lectures: Optimization and Gradient Methods + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

     

     

     

    + + + + +

    Second moment of the gradient

    + +

    +In stochastic gradient descent, with and without momentum, we still +have to specify a schedule for tuning the learning rates \( \eta_t \) +as a function of time. As discussed in the context of Newton's +method, this presents a number of dilemmas. The learning rate is +limited by the steepest direction which can change depending on the +current position in the landscape. To circumvent this problem, ideally +our algorithm would keep track of curvature and take large steps in +shallow, flat directions and small steps in steep, narrow directions. +Second-order methods accomplish this by calculating or approximating +the Hessian and normalizing the learning rate by the +curvature. However, this is very computationally expensive for +extremely large models. Ideally, we would like to be able to +adaptively change the step size to match the landscape without paying +the steep computational price of calculating or approximating +Hessians. + +

    +Recently, a number of methods have been introduced that accomplish this by tracking not only the gradient, but also the second moment of the gradient. These methods include AdaGrad, AdaDelta, RMS-Prop, and ADAM. + +

    +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/Splines/html/._Splines-bs071.html b/doc/pub/Splines/html/._Splines-bs071.html new file mode 100644 index 000000000..8dcf652ed --- /dev/null +++ b/doc/pub/Splines/html/._Splines-bs071.html @@ -0,0 +1,334 @@ + + + + + + + +Data Analysis and Machine Learning Lectures: Optimization and Gradient Methods + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

     

     

     

    + + + + +

    RMS prop

    + +

    +In RMS prop, in addition to keeping a running average of the first moment of the gradient, we also keep track of the second moment denoted by \( \mathbf{s}_t=\mathbb{E}[\mathbf{g}_t^2] \). The update rule for RMS prop is given by +$$ +\begin{align} +\mathbf{g}_t &= \nabla_\theta E(\boldsymbol{\theta}) +\tag{4}\\ +\mathbf{s}_t &=\beta \mathbf{s}_{t-1} +(1-\beta)\mathbf{g}_t^2 \nonumber \\ +\boldsymbol{\theta}_{t+1}&=&\boldsymbol{\theta}_t - \eta_t { \mathbf{g}_t \over \sqrt{\mathbf{s}_t +\epsilon}}, \nonumber +\end{align} +$$ + +where \( \beta \) controls the averaging time of the second moment and is typically taken to be about \( \beta=0.9 \), \( \eta_t \) is a learning rate typically chosen to be \( 10^{-3} \), and \( \epsilon\sim 10^{-8} \) is a small regularization constant to prevent divergences. Multiplication and division by vectors is understood as an element-wise operation. It is clear from this formula that the learning rate is reduced in directions where the norm of the gradient is consistently large. This greatly speeds up the convergence by allowing us to use a larger learning rate for flat directions. + +

    +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/Splines/html/._Splines-bs072.html b/doc/pub/Splines/html/._Splines-bs072.html new file mode 100644 index 000000000..7921ef55f --- /dev/null +++ b/doc/pub/Splines/html/._Splines-bs072.html @@ -0,0 +1,343 @@ + + + + + + + +Data Analysis and Machine Learning Lectures: Optimization and Gradient Methods + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

     

     

     

    + + + + +

    ADAM optimizer

    + +

    +A related algorithm is the ADAM optimizer. In ADAM, we keep a running average of both the first and second moment of the gradient and use this information to adaptively change the learning rate for different parameters. In addition to keeping a running average of the first and second moments of the gradient (i.e. \( \mathbf{m}_t=\mathbb{E}[\mathbf{g}_t] \) and \( \mathbf{s}_t=\mathbb{E}[\mathbf{g}^2_t] \), respectively), ADAM performs an additional bias correction to account for the fact that we are estimating the first two moments of the gradient using a running average (denoted by the hats in the update rule below). The update rule for ADAM is given by (where multiplication and division are once again understood to be element-wise operations below) +$$ +\begin{align} +\mathbf{g}_t &= \nabla_\theta E(\boldsymbol{\theta}) +\tag{5}\\ +\mathbf{m}_t &= \beta_1 \mathbf{m}_{t-1} + (1-\beta_1) \mathbf{g}_t \nonumber \\ +\mathbf{s}_t &=\beta_2 \mathbf{s}_{t-1} +(1-\beta_2)\mathbf{g}_t^2 \nonumber \\ +\hat{\mathbf{m}}_t&={\mathbf{m}_t \over 1-\beta_1^t} \nonumber \\ +\hat{\mathbf{s}}_t &={\mathbf{s}_t \over1-\beta_2^t} \nonumber \\ +\boldsymbol{\theta}_{t+1}&=\boldsymbol{\theta}_t - \eta_t { \hat{\mathbf{m}}_t \over \sqrt{\hat{\mathbf{s}}_t} +\epsilon}, \nonumber \\ +\tag{6} +\end{align} +$$ + +where \( \beta_1 \) and \( \beta_2 \) set the memory lifetime of the first and second moment and are typically taken to be \( 0.9 \) and \( 0.99 \) respectively, and \( \eta \) and \( \epsilon \) are identical to RMSprop. + +

    +Like in RMSprop, the effective step size of a parameter depends on the magnitude of its gradient squared. To understand this better, let us rewrite this expression in terms of the variance \( \boldsymbol{\sigma}_t^2 = \hat{\mathbf{s}}_t - (\hat{\mathbf{m}}_t)^2 \). Consider a single parameter \( \theta_t \). The update rule for this parameter is given by +$$ +\Delta \theta_{t+1}= -\eta_t { \hat{m}_t \over \sqrt{\sigma_t^2 + m_t^2 }+\epsilon}. +$$ + +

    +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/Splines/html/._Splines-bs073.html b/doc/pub/Splines/html/._Splines-bs073.html new file mode 100644 index 000000000..bfcdafb90 --- /dev/null +++ b/doc/pub/Splines/html/._Splines-bs073.html @@ -0,0 +1,326 @@ + + + + + + + +Data Analysis and Machine Learning Lectures: Optimization and Gradient Methods + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

     

     

     

    + + + + +

    Practical tips

    + + + +Geron's text, see chapter 11, has several interesting discussions. + +

    + +

    + + +
    + + + + + + + +
    + +
    + + + + + + diff --git a/doc/pub/Splines/html/Splines-bs.html b/doc/pub/Splines/html/Splines-bs.html index bece1e921..8625c257e 100644 --- a/doc/pub/Splines/html/Splines-bs.html +++ b/doc/pub/Splines/html/Splines-bs.html @@ -69,74 +69,86 @@ Automatically generated HTML file from DocOnce source ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -196,48 +208,57 @@ MathJax.Hub.Config({
  • Steepest descent method
  • Steepest descent method
  • Final expressions
  • -
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • -
  • The routine for the steepest descent method
  • -
  • Steepest descent example
  • -
  • Conjugate gradient
  • -
  • Revisiting our first homework
  • -
  • Gradient descent example
  • -
  • The derivative of the cost/loss function
  • -
  • The Hessian matrix
  • -
  • Simple program
  • -
  • Gradient Descent Example
  • -
  • And a corresponding example using scikit-learn
  • -
  • Gradient descent and Ridge
  • -
  • Automatic differentiation
  • -
  • Using autograd
  • -
  • Autograd with more complicated functions
  • -
  • More complicated functions using the elements of their arguments directly
  • -
  • Functions using mathematical functions from Numpy
  • -
  • More autograd
  • -
  • And with loops
  • -
  • Using recursion
  • -
  • Unsupported functions
  • -
  • The syntax a.dot(b) when finding the dot product
  • -
  • Recommended to avoid
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Program for stochastic gradient
  • -
  • Momentum based methods
  • -
  • Conjugate gradient method
  • +
  • Code examples for steepest descent
  • +
  • Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come
  • +
  • The routine for the steepest descent method
  • +
  • Steepest descent example
  • +
  • Conjugate gradient
  • +
  • Revisiting our first homework
  • +
  • Gradient descent example
  • +
  • The derivative of the cost/loss function
  • +
  • The Hessian matrix
  • +
  • Simple program
  • +
  • Gradient Descent Example
  • +
  • And a corresponding example using scikit-learn
  • +
  • Gradient descent and Ridge
  • +
  • Automatic differentiation
  • +
  • Using autograd
  • +
  • Autograd with more complicated functions
  • +
  • More complicated functions using the elements of their arguments directly
  • +
  • Functions using mathematical functions from Numpy
  • +
  • More autograd
  • +
  • And with loops
  • +
  • Using recursion
  • +
  • Unsupported functions
  • +
  • The syntax a.dot(b) when finding the dot product
  • +
  • Recommended to avoid
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Program for stochastic gradient
  • +
  • Momentum based methods
  • Conjugate gradient method
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Conjugate gradient method and iterations
  • -
  • Conjugate gradient method
  • +
  • Conjugate gradient method
  • +
  • Conjugate gradient method and iterations
  • Conjugate gradient method
  • Conjugate gradient method
  • -
  • Simple implementation of the Conjugate gradient algorithm
  • -
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Conjugate gradient method
  • +
  • Simple implementation of the Conjugate gradient algorithm
  • +
  • Broyden–Fletcher–Goldfarb–Shanno algorithm
  • +
  • Using gradient descent methods, limitations
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • ADAM optimizer
  • +
  • Practical tips
  • @@ -272,7 +293,7 @@ MathJax.Hub.Config({
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

    -

    Oct 6, 2018

    +

    Oct 12, 2018


    @@ -296,7 +317,7 @@ MathJax.Hub.Config({

  • 9
  • 10
  • ...
  • -
  • 65
  • +
  • 74
  • »
  • diff --git a/doc/pub/Splines/html/Splines-reveal.html b/doc/pub/Splines/html/Splines-reveal.html index 70d6a8a17..1f3dae32c 100644 --- a/doc/pub/Splines/html/Splines-reveal.html +++ b/doc/pub/Splines/html/Splines-reveal.html @@ -148,7 +148,7 @@ MathJax.Hub.Config({
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

     
    -

    Oct 6, 2018

    +

    Oct 12, 2018


    @@ -793,7 +793,12 @@ $$

    -

    Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come

    +

    Code examples for steepest descent

    +
    + + +
    +

    Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come

    @@ -831,7 +836,7 @@ $$

    -

    The routine for the steepest descent method

    +

    The routine for the steepest descent method

    @@ -865,7 +870,7 @@ $$

    -

    Steepest descent example

    +

    Steepest descent example

    @@ -935,12 +940,12 @@ pt.plot(it_array.T[0], it_array.T[ -

    Conjugate gradient

    +

    Conjugate gradient

    -

    Revisiting our first homework

    +

    Revisiting our first homework

    We will use linear regression as a case study for the gradient descent @@ -980,7 +985,7 @@ $$

    -

    Gradient descent example

    +

    Gradient descent example

    Let \( \mathbf{y} = (y_1,\cdots,y_n)^T \), \( \mathbf{\hat{y}} = (\hat{y}_1,\cdots,\hat{y}_n)^T \) and \( \beta = (\beta_0, \beta_1)^T \) @@ -1009,7 +1014,7 @@ and we want to find \( \beta \) such that \( C(\beta) \) is minimized.

    -

    The derivative of the cost/loss function

    +

    The derivative of the cost/loss function

    Computing \( \partial C(\beta) / \partial \beta_0 \) and \( \partial C(\beta) / \partial \beta_1 \) we can show that the gradient can be written as @@ -1026,7 +1031,7 @@ where \( X \) is the design matrix defined above.

    -

    The Hessian matrix

    +

    The Hessian matrix

    The Hessian matrix of \( C(\beta) \) is given by

     
    $$ @@ -1042,7 +1047,7 @@ This result implies that \( C(\beta) \) is a convex function since the matrix \(

    -

    Simple program

    +

    Simple program

    We can now write a program that minimizes \( C(\beta) \) using the gradient descent method with a constant learning rate \( \gamma \) according to @@ -1086,7 +1091,7 @@ beta_NE = np.dot(Xt_X_inv,Xt_y)

    -

    Gradient Descent Example

    +

    Gradient Descent Example

    Another simple example is here @@ -1136,7 +1141,7 @@ plt.show()

    -

    And a corresponding example using scikit-learn

    +

    And a corresponding example using scikit-learn

    @@ -1161,7 +1166,7 @@ sgdreg.fit(x,y.ravel())

    -

    Gradient descent and Ridge

    +

    Gradient descent and Ridge

    We have also discussed Ridge regression where the loss function contains a regularized given by the \( L_2 \) norm of \( \beta \), @@ -1225,7 +1230,7 @@ beta_ridge = np.dot(Z,np.dot(X.T,y))

    -

    Automatic differentiation

    +

    Automatic differentiation

    Python has tools for so-called automatic differentiation. Consider the following example

     
    @@ -1285,7 +1290,7 @@ plt.show()

    -

    Using autograd

    +

    Using autograd

    Here we @@ -1319,7 +1324,7 @@ grad_analytical = 3*a**Autograd with more complicated functions +

    Autograd with more complicated functions

    To differentiate with respect to two (or more) arguments of a Python @@ -1369,7 +1374,7 @@ Note that the grad function will not produce the true gradient of the function.

    -

    More complicated functions using the elements of their arguments directly

    +

    More complicated functions using the elements of their arguments directly

    @@ -1403,7 +1408,7 @@ could expect form a gradient-evaluting function.

    -

    Functions using mathematical functions from Numpy

    +

    Functions using mathematical functions from Numpy

    @@ -1430,7 +1435,7 @@ f4_grad_analytical = x/np.sqrt(1 + x** -

    More autograd

    +

    More autograd

    @@ -1454,7 +1459,7 @@ x = 2.7

    -

    And with loops

    +

    And with loops

    @@ -1501,7 +1506,7 @@ f6_grad_analytical = 0

    -

    Using recursion

    +

    Using recursion

    @@ -1539,7 +1544,7 @@ Note that if n is equal to zero or one, Autograd will give an error message. Thi

    -

    Unsupported functions

    +

    Unsupported functions

    Autograd supports many features. However, there are some functions that is not supported (yet) by Autograd.

    @@ -1565,7 +1570,7 @@ Here, Autograd tells us that an 'ArrayBox' does not support item assignment. The

    -

    The syntax a.dot(b) when finding the dot product

    +

    The syntax a.dot(b) when finding the dot product

    @@ -1608,7 +1613,7 @@ x = np.array([3.0,Recommended to avoid +

    Recommended to avoid

    The documentation recommends to avoid inplace operations such as

    @@ -1622,7 +1627,7 @@ a /=b

    -

    Stochastic Gradient Descent

    +

    Stochastic Gradient Descent

    Stochastic gradient descent (SGD) and variants thereof address some of @@ -1642,7 +1647,7 @@ $$

    -

    Computation of gradients

    +

    Computation of gradients

    This in turn means that the gradient can be @@ -1664,7 +1669,7 @@ minibatches. We denote these minibatches by \( B_k \) where

    -

    SGD example

    +

    SGD example

    As an example, suppose we have \( 10 \) data points \( (\mathbf{x}_1,\cdots, \mathbf{x}_{10}) \) and we choose to have \( M=5 \) minibathces, then each minibatch contains two data points. In particular we have @@ -1690,7 +1695,7 @@ $$
    -

    The gradient step

    +

    The gradient step

    Thus a gradient descent step now looks like @@ -1711,7 +1716,7 @@ the number of minibatches, as exemplified in the code below.

    -

    Simple example code

    +

    Simple example code

    @@ -1743,7 +1748,7 @@ all \( n \) datapoints.

    -

    When do we stop?

    +

    When do we stop?

    A natural question is when do we stop the search for a new minimum? @@ -1760,7 +1765,7 @@ gave the lowest value.

    -

    Slightly different approach

    +

    Slightly different approach

    Another approach is to let the step length \( \gamma_j \) depend on the @@ -1811,7 +1816,7 @@ j = 0

    -

    Program for stochastic gradient

    +

    Program for stochastic gradient

    @@ -1891,12 +1896,12 @@ plt.show()

    -

    Momentum based methods

    +

    Momentum based methods

    -

    Conjugate gradient method

    +

    Conjugate gradient method

    @@ -1929,7 +1934,7 @@ this inner product. Being conjugate is a symmetric relation: if \( \hat{s} \) is

    -

    Conjugate gradient method

    +

    Conjugate gradient method

    @@ -1948,7 +1953,7 @@ which is zero unless \( i=j \).

    -

    Conjugate gradient method

    +

    Conjugate gradient method

    @@ -1978,7 +1983,7 @@ $$

    -

    Conjugate gradient method

    +

    Conjugate gradient method

    @@ -2015,7 +2020,7 @@ $$

    -

    Conjugate gradient method and iterations

    +

    Conjugate gradient method and iterations

    @@ -2052,7 +2057,7 @@ instead.

    -

    Conjugate gradient method

    +

    Conjugate gradient method

    @@ -2085,7 +2090,7 @@ hence the name conjugate gradient method.

    -

    Conjugate gradient method

    +

    Conjugate gradient method

    @@ -2117,7 +2122,7 @@ $$

    -

    Conjugate gradient method

    +

    Conjugate gradient method

    @@ -2162,7 +2167,7 @@ $$

    -

    Simple implementation of the Conjugate gradient algorithm

    +

    Simple implementation of the Conjugate gradient algorithm

    @@ -2199,7 +2204,7 @@ $$

    -

    Broyden–Fletcher–Goldfarb–Shanno algorithm

    +

    Broyden–Fletcher–Goldfarb–Shanno algorithm

    @@ -2236,6 +2241,201 @@ over the scalar \( \alpha > 0 \).

    +
    +

    Using gradient descent methods, limitations

    + +
      +

    • Gradient descent (GD) finds local minima of our function. Since the GD algorithm is deterministic, if it converges, it will converge to a local minimum of our energy function. Because in ML we are often dealing with extremely rugged landscapes with many local minima, this can lead to poor performance.
    • +

    • GD is sensitive to initial conditions. One consequence of the local nature of GD is that initial conditions matter. Depending on where one starts, one will end up at a different local minima. Therefore, it is very important to think about how one initializes the training process. This is true for GD as well as more complicated variants of GD.
    • +

    • Gradients are computationally expensive to calculate for large datasets. In many cases in statistics and ML, the energy function is a sum of terms, with one term for each data point. For example, in linear regression, \( E \propto \sum_{i=1}^n (y_i - \mathbf{w}^T\cdot\mathbf{x}_i)^2 \); for logistic regression, the square error is replaced by the cross entropy. To calculate the gradient we have to sum over all \( n \) data points. Doing this at every GD step becomes extremely computationally expensive. An ingenious solution to this, is to calculate the gradients using small subsets of the data called "mini batches". This has the added benefit of introducing stochasticity into our algorithm.
    • +

    • GD is very sensitive to choices of learning rates. GD is extremely sensitive to the choice of learning rates. If the learning rate is very small, the training process take an extremely long time. For larger learning rates, GD can diverge and give poor results. Furthermore, depending on what the local landscape looks like, we have to modify the learning rates to ensure convergence. Ideally, we would adaptively choose the learning rates to match the landscape.
    • +

    • GD treats all directions in parameter space uniformly. Another major drawback of GD is that unlike Newton's method, the learning rate for GD is the same in all directions in parameter space. For this reason, the maximum learning rate is set by the behavior of the steepest direction and this can significantly slow down training. Ideally, we would like to take large steps in flat directions and small steps in steep directions. Since we are exploring rugged landscapes where curvatures change, this requires us to keep track of not only the gradient but second derivatives. The ideal scenario would be to calculate the Hessian but this proves to be too computationally expensive.
    • +

    • GD can take exponential time to escape saddle points, even with random initialization. As we mentioned, GD is extremely sensitive to initial condition since it determines the particular local minimum GD would eventually reach. However, even with a good initialization scheme, through the introduction of randomness, GD can still take exponential time to escape saddle points.
    • +
    +
    + + +
    +

    Momentum based GD

    + +

    +The stochastic gradient descent (SGD) is almost always used with a momentum or inertia term that serves as a memory of the direction we are moving in parameter space. This is typically +implemented as follows +

     
    +$$ +\begin{align} +\mathbf{v}_{t}&=\gamma \mathbf{v}_{t-1}+\eta_{t}\nabla_\theta E(\boldsymbol{\theta}_t) \nonumber \\ +\boldsymbol{\theta}_{t+1}&= \boldsymbol{\theta}_t -\mathbf{v}_{t}, +\tag{2} +\end{align} +$$ +

     
    + +where we have introduced a momentum parameter \( \gamma \), with \( 0\le\gamma\le 1 \), and for brevity we dropped the explicit notation to indicate the gradient is to be taken over a different mini-batch at each step. We call this algorithm gradient descent with momentum (GDM). From these equations, it is clear that \( \mathbf{v}_t \) is a running average of recently encountered gradients and \( (1-\gamma)^{-1} \) sets the characteristic time scale for the memory used in the averaging procedure. Consistent with this, when \( \gamma=0 \), this just reduces down to ordinary SGD as discussed earlier. An equivalent way of writing the updates is +

     
    +$$ +\Delta \boldsymbol{\theta}_{t+1} = \gamma \Delta \boldsymbol{\theta}_t -\ \eta_{t}\nabla_\theta E(\boldsymbol{\theta}_t), +$$ +

     
    + +where we have defined \( \Delta \boldsymbol{\theta}_{t}= \boldsymbol{\theta}_t-\boldsymbol{\theta}_{t-1} \). +

    + + +
    +

    More on momentum based approaches

    + +

    +Let us try to get more intuition from these equations. It is helpful to consider a simple physical analogy with a particle of mass \( m \) moving in a viscous medium with drag coefficient \( \mu \) and potential +\( E(\mathbf{w}) \). If we denote the particle's position by \( \mathbf{w} \), then its motion is described by +

     
    +$$ +m {d^2 \mathbf{w} \over dt^2} + \mu {d \mathbf{w} \over dt }= -\nabla_w E(\mathbf{w}). +$$ +

     
    + +We can discretize this equation in the usual way to get +

     
    +$$ +m { \mathbf{w}_{t+\Delta t}-2 \mathbf{w}_{t} +\mathbf{w}_{t-\Delta t} \over (\Delta t)^2}+\mu {\mathbf{w}_{t+\Delta t}- \mathbf{w}_{t} \over \Delta t} = -\nabla_w E(\mathbf{w}). +$$ +

     
    + +Rearranging this equation, we can rewrite this as +

     
    +$$ +\Delta \mathbf{w}_{t +\Delta t}= - { (\Delta t)^2 \over m +\mu \Delta t} \nabla_w E(\mathbf{w})+ {m \over m +\mu \Delta t} \Delta \mathbf{w}_t. +$$ +

     
    +

    + + +
    +

    Momentum parameter

    +Notice that this equation is identical to previous one if we identify the position of the particle, \( \mathbf{w} \), with the parameters \( \boldsymbol{\theta} \). This allows +us to identify the momentum parameter and learning rate with the mass of the particle and the viscous drag as: +

     
    +$$ +\gamma= {m \over m +\mu \Delta t }, \qquad \eta = {(\Delta t)^2 \over m +\mu \Delta t}. +$$ +

     
    + +Thus, as the name suggests, the momentum parameter is proportional to the mass of the particle and effectively provides inertia. Furthermore, in the large viscosity/small learning rate limit, our memory time scales as \( (1-\gamma)^{-1} \approx m/(\mu \Delta t) \). + +

    +Why is momentum useful? SGD momentum helps the gradient descent algorithm gain speed in directions with persistent but small gradients even in the presence of stochasticity, while suppressing oscillations in high-curvature directions. This becomes especially important in situations where the landscape is shallow and flat in some directions and narrow and steep in others. It has been argued that first-order methods (with appropriate initial conditions) can perform comparable to more expensive second order methods, especially in the context of complex deep learning models. + +

    +These beneficial properties of momentum can sometimes become even more pronounced by using a slight modification of the classical momentum algorithm called Nesterov Accelerated Gradient (NAG). + +

    +In the NAG algorithm, rather than calculating the gradient at the current parameters, \( \nabla_\theta E(\boldsymbol{\theta}_t) \), one calculates the gradient at the expected value of the parameters given our current momentum, \( \nabla_\theta E(\boldsymbol{\theta}_t +\gamma \mathbf{v}_{t-1}) \). This yields the NAG update rule +

     
    +$$ +\begin{align} +\mathbf{v}_{t}&=\gamma \mathbf{v}_{t-1}+\eta_{t}\nabla_\theta E(\boldsymbol{\theta}_t +\gamma \mathbf{v}_{t-1}) \nonumber \\ +\boldsymbol{\theta}_{t+1}&= \boldsymbol{\theta}_t -\mathbf{v}_{t}. +\tag{3} +\end{align} +$$ +

     
    + +One of the major advantages of NAG is that it allows for the use of a larger learning rate than GDM for the same choice of \( \gamma \). +

    + + +
    +

    Second moment of the gradient

    + +

    +In stochastic gradient descent, with and without momentum, we still +have to specify a schedule for tuning the learning rates \( \eta_t \) +as a function of time. As discussed in the context of Newton's +method, this presents a number of dilemmas. The learning rate is +limited by the steepest direction which can change depending on the +current position in the landscape. To circumvent this problem, ideally +our algorithm would keep track of curvature and take large steps in +shallow, flat directions and small steps in steep, narrow directions. +Second-order methods accomplish this by calculating or approximating +the Hessian and normalizing the learning rate by the +curvature. However, this is very computationally expensive for +extremely large models. Ideally, we would like to be able to +adaptively change the step size to match the landscape without paying +the steep computational price of calculating or approximating +Hessians. + +

    +Recently, a number of methods have been introduced that accomplish this by tracking not only the gradient, but also the second moment of the gradient. These methods include AdaGrad, AdaDelta, RMS-Prop, and ADAM. +

    + + +
    +

    RMS prop

    + +

    +In RMS prop, in addition to keeping a running average of the first moment of the gradient, we also keep track of the second moment denoted by \( \mathbf{s}_t=\mathbb{E}[\mathbf{g}_t^2] \). The update rule for RMS prop is given by +

     
    +$$ +\begin{align} +\mathbf{g}_t &= \nabla_\theta E(\boldsymbol{\theta}) +\tag{4}\\ +\mathbf{s}_t &=\beta \mathbf{s}_{t-1} +(1-\beta)\mathbf{g}_t^2 \nonumber \\ +\boldsymbol{\theta}_{t+1}&=&\boldsymbol{\theta}_t - \eta_t { \mathbf{g}_t \over \sqrt{\mathbf{s}_t +\epsilon}}, \nonumber +\end{align} +$$ +

     
    + +where \( \beta \) controls the averaging time of the second moment and is typically taken to be about \( \beta=0.9 \), \( \eta_t \) is a learning rate typically chosen to be \( 10^{-3} \), and \( \epsilon\sim 10^{-8} \) is a small regularization constant to prevent divergences. Multiplication and division by vectors is understood as an element-wise operation. It is clear from this formula that the learning rate is reduced in directions where the norm of the gradient is consistently large. This greatly speeds up the convergence by allowing us to use a larger learning rate for flat directions. +

    + + +
    +

    ADAM optimizer

    + +

    +A related algorithm is the ADAM optimizer. In ADAM, we keep a running average of both the first and second moment of the gradient and use this information to adaptively change the learning rate for different parameters. In addition to keeping a running average of the first and second moments of the gradient (i.e. \( \mathbf{m}_t=\mathbb{E}[\mathbf{g}_t] \) and \( \mathbf{s}_t=\mathbb{E}[\mathbf{g}^2_t] \), respectively), ADAM performs an additional bias correction to account for the fact that we are estimating the first two moments of the gradient using a running average (denoted by the hats in the update rule below). The update rule for ADAM is given by (where multiplication and division are once again understood to be element-wise operations below) +

     
    +$$ +\begin{align} +\mathbf{g}_t &= \nabla_\theta E(\boldsymbol{\theta}) +\tag{5}\\ +\mathbf{m}_t &= \beta_1 \mathbf{m}_{t-1} + (1-\beta_1) \mathbf{g}_t \nonumber \\ +\mathbf{s}_t &=\beta_2 \mathbf{s}_{t-1} +(1-\beta_2)\mathbf{g}_t^2 \nonumber \\ +\hat{\mathbf{m}}_t&={\mathbf{m}_t \over 1-\beta_1^t} \nonumber \\ +\hat{\mathbf{s}}_t &={\mathbf{s}_t \over1-\beta_2^t} \nonumber \\ +\boldsymbol{\theta}_{t+1}&=\boldsymbol{\theta}_t - \eta_t { \hat{\mathbf{m}}_t \over \sqrt{\hat{\mathbf{s}}_t} +\epsilon}, \nonumber \\ +\tag{6} +\end{align} +$$ +

     
    + +where \( \beta_1 \) and \( \beta_2 \) set the memory lifetime of the first and second moment and are typically taken to be \( 0.9 \) and \( 0.99 \) respectively, and \( \eta \) and \( \epsilon \) are identical to RMSprop. + +

    +Like in RMSprop, the effective step size of a parameter depends on the magnitude of its gradient squared. To understand this better, let us rewrite this expression in terms of the variance \( \boldsymbol{\sigma}_t^2 = \hat{\mathbf{s}}_t - (\hat{\mathbf{m}}_t)^2 \). Consider a single parameter \( \theta_t \). The update rule for this parameter is given by +

     
    +$$ +\Delta \theta_{t+1}= -\eta_t { \hat{m}_t \over \sqrt{\sigma_t^2 + m_t^2 }+\epsilon}. +$$ +

     
    +

    + + +
    +

    Practical tips

    + +
      +

    • Randomize the data when making mini-batches. It is always important to randomly shuffle the data when forming mini-batches. Otherwise, the gradient descent method can fit spurious correlations resulting from the order in which data is presented.
    • +

    • Transform your inputs. Learning becomes difficult when our landscape has a mixture of steep and flat directions. One simple trick for minimizing these situations is to standardize the data by subtracting the mean and normalizing the variance of input variables. Whenever possible, also decorrelate the inputs. To understand why this is helpful, consider the case of linear regression. It is easy to show that for the squared error cost function, the Hessian of the energy matrix is just the correlation matrix between the inputs. Thus, by standardizing the inputs, we are ensuring that the landscape looks homogeneous in all directions in parameter space. Since most deep networks can be viewed as linear transformations followed by a non-linearity at each layer, we expect this intuition to hold beyond the linear case.
    • +

    • Monitor the out-of-sample performance. Always monitor the performance of your model on a validation set (a small portion of the training data that is held out of the training process to serve as a proxy for the test set. If the validation error starts increasing, then the model is beginning to overfit. Terminate the learning process. This early stopping significantly improves performance in many settings.
    • +

    • Adaptive optimization methods don't always have good generalization. Recent studies have shown that adaptive methods such as ADAM, RMSPorp, and AdaGrad tend to have poor generalization compared to SGD or SGD with momentum, particularly in the high-dimensional limit (i.e. the number of parameters exceeds the number of data points). Although it is not clear at this stage why these methods perform so well in training deep neural networks, simpler procedures like properly-tuned SGD may work as well or better in these applications.
    • +
    +

    + +Geron's text, see chapter 11, has several interesting discussions. +

    + +
    diff --git a/doc/pub/Splines/html/Splines-solarized.html b/doc/pub/Splines/html/Splines-solarized.html index aaddf1a72..6a165bc46 100644 --- a/doc/pub/Splines/html/Splines-solarized.html +++ b/doc/pub/Splines/html/Splines-solarized.html @@ -89,74 +89,86 @@ div { text-align: justify; text-justify: inter-word; } ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -198,7 +210,7 @@ MathJax.Hub.Config({
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

    -

    Oct 6, 2018

    +

    Oct 12, 2018












    @@ -782,7 +794,12 @@ $$











    -

    Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come

    +

    Code examples for steepest descent

    + +

    +









    + +

    Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come

    @@ -822,7 +839,7 @@ $$











    -

    The routine for the steepest descent method

    +

    The routine for the steepest descent method

    @@ -858,7 +875,7 @@ $$











    -

    Steepest descent example

    +

    Steepest descent example

    @@ -927,12 +944,12 @@ pt.plot(it_array.T[0], it_array.T[









    -

    Conjugate gradient

    +

    Conjugate gradient

    -

    Revisiting our first homework

    +

    Revisiting our first homework

    We will use linear regression as a case study for the gradient descent @@ -965,7 +982,7 @@ $$

    -

    Gradient descent example

    +

    Gradient descent example

    Let \( \mathbf{y} = (y_1,\cdots,y_n)^T \), \( \mathbf{\hat{y}} = (\hat{y}_1,\cdots,\hat{y}_n)^T \) and \( \beta = (\beta_0, \beta_1)^T \) @@ -990,7 +1007,7 @@ and we want to find \( \beta \) such that \( C(\beta) \) is minimized.











    -

    The derivative of the cost/loss function

    +

    The derivative of the cost/loss function

    Computing \( \partial C(\beta) / \partial \beta_0 \) and \( \partial C(\beta) / \partial \beta_1 \) we can show that the gradient can be written as @@ -1005,7 +1022,7 @@ where \( X \) is the design matrix defined above.











    -

    The Hessian matrix

    +

    The Hessian matrix

    The Hessian matrix of \( C(\beta) \) is given by $$ \hat{H} \equiv \begin{bmatrix} @@ -1019,7 +1036,7 @@ This result implies that \( C(\beta) \) is a convex function since the matrix \(











    -

    Simple program

    +

    Simple program

    We can now write a program that minimizes \( C(\beta) \) using the gradient descent method with a constant learning rate \( \gamma \) according to @@ -1060,7 +1077,7 @@ beta_NE = np.dot(Xt_X_inv,Xt_y)











    -

    Gradient Descent Example

    +

    Gradient Descent Example

    Another simple example is here @@ -1109,7 +1126,7 @@ plt.show()











    -

    And a corresponding example using scikit-learn

    +

    And a corresponding example using scikit-learn

    @@ -1133,7 +1150,7 @@ sgdreg.fit(x,y.ravel())

    -

    Gradient descent and Ridge

    +

    Gradient descent and Ridge

    We have also discussed Ridge regression where the loss function contains a regularized given by the \( L_2 \) norm of \( \beta \), @@ -1190,7 +1207,7 @@ beta_ridge = np.dot(Z,np.dot(X.T,y))











    -

    Automatic differentiation

    +

    Automatic differentiation

    Python has tools for so-called automatic differentiation. Consider the following example $$ @@ -1245,7 +1262,7 @@ plt.show()

    -

    Using autograd

    +

    Using autograd

    Here we @@ -1278,7 +1295,7 @@ grad_analytical = 3*a**Autograd with more complicated functions +

    Autograd with more complicated functions

    To differentiate with respect to two (or more) arguments of a Python @@ -1328,7 +1345,7 @@ Note that the grad function will not produce the true gradient of the function.











    -

    More complicated functions using the elements of their arguments directly

    +

    More complicated functions using the elements of their arguments directly

    @@ -1362,7 +1379,7 @@ could expect form a gradient-evaluting function.

    -

    Functions using mathematical functions from Numpy

    +

    Functions using mathematical functions from Numpy

    @@ -1388,7 +1405,7 @@ f4_grad_analytical = x/np.sqrt(1 + x**









    -

    More autograd

    +

    More autograd

    @@ -1411,7 +1428,7 @@ x = 2.7











    -

    And with loops

    +

    And with loops

    @@ -1457,7 +1474,7 @@ f6_grad_analytical = 0











    -

    Using recursion

    +

    Using recursion

    @@ -1495,7 +1512,7 @@ Note that if n is equal to zero or one, Autograd will give an error message. Thi











    -

    Unsupported functions

    +

    Unsupported functions

    Autograd supports many features. However, there are some functions that is not supported (yet) by Autograd.

    @@ -1521,7 +1538,7 @@ Here, Autograd tells us that an 'ArrayBox' does not support item assignment. The











    -

    The syntax a.dot(b) when finding the dot product

    +

    The syntax a.dot(b) when finding the dot product

    @@ -1563,7 +1580,7 @@ x = np.array([3.0,Recommended to avoid +

    Recommended to avoid

    The documentation recommends to avoid inplace operations such as

    @@ -1576,7 +1593,7 @@ a /=b











    -

    Stochastic Gradient Descent

    +

    Stochastic Gradient Descent

    Stochastic gradient descent (SGD) and variants thereof address some of @@ -1594,7 +1611,7 @@ $$











    -

    Computation of gradients

    +

    Computation of gradients

    This in turn means that the gradient can be @@ -1614,7 +1631,7 @@ minibatches. We denote these minibatches by \( B_k \) where











    -

    SGD example

    +

    SGD example

    As an example, suppose we have \( 10 \) data points \( (\mathbf{x}_1,\cdots, \mathbf{x}_{10}) \) and we choose to have \( M=5 \) minibathces, then each minibatch contains two data points. In particular we have @@ -1638,7 +1655,7 @@ $$











    -

    The gradient step

    +

    The gradient step

    Thus a gradient descent step now looks like @@ -1657,7 +1674,7 @@ the number of minibatches, as exemplified in the code below.











    -

    Simple example code

    +

    Simple example code

    @@ -1689,7 +1706,7 @@ all \( n \) datapoints.











    -

    When do we stop?

    +

    When do we stop?

    A natural question is when do we stop the search for a new minimum? @@ -1706,7 +1723,7 @@ gave the lowest value.











    -

    Slightly different approach

    +

    Slightly different approach

    Another approach is to let the step length \( \gamma_j \) depend on the @@ -1754,7 +1771,7 @@ j = 0











    -

    Program for stochastic gradient

    +

    Program for stochastic gradient

    @@ -1833,12 +1850,12 @@ plt.show()











    -

    Momentum based methods

    +

    Momentum based methods











    -

    Conjugate gradient method

    +

    Conjugate gradient method

    @@ -1868,7 +1885,7 @@ this inner product. Being conjugate is a symmetric relation: if \( \hat{s} \) is











    -

    Conjugate gradient method

    +

    Conjugate gradient method

    @@ -1886,7 +1903,7 @@ which is zero unless \( i=j \).











    -

    Conjugate gradient method

    +

    Conjugate gradient method

    @@ -1913,7 +1930,7 @@ $$











    -

    Conjugate gradient method

    +

    Conjugate gradient method

    @@ -1945,7 +1962,7 @@ $$











    -

    Conjugate gradient method and iterations

    +

    Conjugate gradient method and iterations

    @@ -1981,7 +1998,7 @@ instead.











    -

    Conjugate gradient method

    +

    Conjugate gradient method

    @@ -2011,7 +2028,7 @@ hence the name conjugate gradient method.











    -

    Conjugate gradient method

    +

    Conjugate gradient method

    @@ -2040,7 +2057,7 @@ $$











    -

    Conjugate gradient method

    +

    Conjugate gradient method

    @@ -2078,7 +2095,7 @@ $$











    -

    Simple implementation of the Conjugate gradient algorithm

    +

    Simple implementation of the Conjugate gradient algorithm

    @@ -2117,7 +2134,7 @@ $$











    -

    Broyden–Fletcher–Goldfarb–Shanno algorithm

    +

    Broyden–Fletcher–Goldfarb–Shanno algorithm

    @@ -2150,6 +2167,177 @@ over the scalar \( \alpha > 0 \).

    +









    + +

    Using gradient descent methods, limitations

    + +
      +
    • Gradient descent (GD) finds local minima of our function. Since the GD algorithm is deterministic, if it converges, it will converge to a local minimum of our energy function. Because in ML we are often dealing with extremely rugged landscapes with many local minima, this can lead to poor performance.
    • +
    • GD is sensitive to initial conditions. One consequence of the local nature of GD is that initial conditions matter. Depending on where one starts, one will end up at a different local minima. Therefore, it is very important to think about how one initializes the training process. This is true for GD as well as more complicated variants of GD.
    • +
    • Gradients are computationally expensive to calculate for large datasets. In many cases in statistics and ML, the energy function is a sum of terms, with one term for each data point. For example, in linear regression, \( E \propto \sum_{i=1}^n (y_i - \mathbf{w}^T\cdot\mathbf{x}_i)^2 \); for logistic regression, the square error is replaced by the cross entropy. To calculate the gradient we have to sum over all \( n \) data points. Doing this at every GD step becomes extremely computationally expensive. An ingenious solution to this, is to calculate the gradients using small subsets of the data called "mini batches". This has the added benefit of introducing stochasticity into our algorithm.
    • +
    • GD is very sensitive to choices of learning rates. GD is extremely sensitive to the choice of learning rates. If the learning rate is very small, the training process take an extremely long time. For larger learning rates, GD can diverge and give poor results. Furthermore, depending on what the local landscape looks like, we have to modify the learning rates to ensure convergence. Ideally, we would adaptively choose the learning rates to match the landscape.
    • +
    • GD treats all directions in parameter space uniformly. Another major drawback of GD is that unlike Newton's method, the learning rate for GD is the same in all directions in parameter space. For this reason, the maximum learning rate is set by the behavior of the steepest direction and this can significantly slow down training. Ideally, we would like to take large steps in flat directions and small steps in steep directions. Since we are exploring rugged landscapes where curvatures change, this requires us to keep track of not only the gradient but second derivatives. The ideal scenario would be to calculate the Hessian but this proves to be too computationally expensive.
    • +
    • GD can take exponential time to escape saddle points, even with random initialization. As we mentioned, GD is extremely sensitive to initial condition since it determines the particular local minimum GD would eventually reach. However, even with a good initialization scheme, through the introduction of randomness, GD can still take exponential time to escape saddle points.
    • +
    + +









    + +

    Momentum based GD

    + +

    +The stochastic gradient descent (SGD) is almost always used with a momentum or inertia term that serves as a memory of the direction we are moving in parameter space. This is typically +implemented as follows +$$ +\begin{align} +\mathbf{v}_{t}&=\gamma \mathbf{v}_{t-1}+\eta_{t}\nabla_\theta E(\boldsymbol{\theta}_t) \nonumber \\ +\boldsymbol{\theta}_{t+1}&= \boldsymbol{\theta}_t -\mathbf{v}_{t}, +\label{_auto1} +\end{align} +$$ + +where we have introduced a momentum parameter \( \gamma \), with \( 0\le\gamma\le 1 \), and for brevity we dropped the explicit notation to indicate the gradient is to be taken over a different mini-batch at each step. We call this algorithm gradient descent with momentum (GDM). From these equations, it is clear that \( \mathbf{v}_t \) is a running average of recently encountered gradients and \( (1-\gamma)^{-1} \) sets the characteristic time scale for the memory used in the averaging procedure. Consistent with this, when \( \gamma=0 \), this just reduces down to ordinary SGD as discussed earlier. An equivalent way of writing the updates is +$$ +\Delta \boldsymbol{\theta}_{t+1} = \gamma \Delta \boldsymbol{\theta}_t -\ \eta_{t}\nabla_\theta E(\boldsymbol{\theta}_t), +$$ + +where we have defined \( \Delta \boldsymbol{\theta}_{t}= \boldsymbol{\theta}_t-\boldsymbol{\theta}_{t-1} \). + +

    +









    + +

    More on momentum based approaches

    + +

    +Let us try to get more intuition from these equations. It is helpful to consider a simple physical analogy with a particle of mass \( m \) moving in a viscous medium with drag coefficient \( \mu \) and potential +\( E(\mathbf{w}) \). If we denote the particle's position by \( \mathbf{w} \), then its motion is described by +$$ +m {d^2 \mathbf{w} \over dt^2} + \mu {d \mathbf{w} \over dt }= -\nabla_w E(\mathbf{w}). +$$ + +We can discretize this equation in the usual way to get +$$ +m { \mathbf{w}_{t+\Delta t}-2 \mathbf{w}_{t} +\mathbf{w}_{t-\Delta t} \over (\Delta t)^2}+\mu {\mathbf{w}_{t+\Delta t}- \mathbf{w}_{t} \over \Delta t} = -\nabla_w E(\mathbf{w}). +$$ + +Rearranging this equation, we can rewrite this as +$$ +\Delta \mathbf{w}_{t +\Delta t}= - { (\Delta t)^2 \over m +\mu \Delta t} \nabla_w E(\mathbf{w})+ {m \over m +\mu \Delta t} \Delta \mathbf{w}_t. +$$ + +

    +









    + +

    Momentum parameter

    +Notice that this equation is identical to previous one if we identify the position of the particle, \( \mathbf{w} \), with the parameters \( \boldsymbol{\theta} \). This allows +us to identify the momentum parameter and learning rate with the mass of the particle and the viscous drag as: +$$ +\gamma= {m \over m +\mu \Delta t }, \qquad \eta = {(\Delta t)^2 \over m +\mu \Delta t}. +$$ + +Thus, as the name suggests, the momentum parameter is proportional to the mass of the particle and effectively provides inertia. Furthermore, in the large viscosity/small learning rate limit, our memory time scales as \( (1-\gamma)^{-1} \approx m/(\mu \Delta t) \). + +

    +Why is momentum useful? SGD momentum helps the gradient descent algorithm gain speed in directions with persistent but small gradients even in the presence of stochasticity, while suppressing oscillations in high-curvature directions. This becomes especially important in situations where the landscape is shallow and flat in some directions and narrow and steep in others. It has been argued that first-order methods (with appropriate initial conditions) can perform comparable to more expensive second order methods, especially in the context of complex deep learning models. + +

    +These beneficial properties of momentum can sometimes become even more pronounced by using a slight modification of the classical momentum algorithm called Nesterov Accelerated Gradient (NAG). + +

    +In the NAG algorithm, rather than calculating the gradient at the current parameters, \( \nabla_\theta E(\boldsymbol{\theta}_t) \), one calculates the gradient at the expected value of the parameters given our current momentum, \( \nabla_\theta E(\boldsymbol{\theta}_t +\gamma \mathbf{v}_{t-1}) \). This yields the NAG update rule +$$ +\begin{align} +\mathbf{v}_{t}&=\gamma \mathbf{v}_{t-1}+\eta_{t}\nabla_\theta E(\boldsymbol{\theta}_t +\gamma \mathbf{v}_{t-1}) \nonumber \\ +\boldsymbol{\theta}_{t+1}&= \boldsymbol{\theta}_t -\mathbf{v}_{t}. +\label{_auto2} +\end{align} +$$ + +One of the major advantages of NAG is that it allows for the use of a larger learning rate than GDM for the same choice of \( \gamma \). + +

    +









    + +

    Second moment of the gradient

    + +

    +In stochastic gradient descent, with and without momentum, we still +have to specify a schedule for tuning the learning rates \( \eta_t \) +as a function of time. As discussed in the context of Newton's +method, this presents a number of dilemmas. The learning rate is +limited by the steepest direction which can change depending on the +current position in the landscape. To circumvent this problem, ideally +our algorithm would keep track of curvature and take large steps in +shallow, flat directions and small steps in steep, narrow directions. +Second-order methods accomplish this by calculating or approximating +the Hessian and normalizing the learning rate by the +curvature. However, this is very computationally expensive for +extremely large models. Ideally, we would like to be able to +adaptively change the step size to match the landscape without paying +the steep computational price of calculating or approximating +Hessians. + +

    +Recently, a number of methods have been introduced that accomplish this by tracking not only the gradient, but also the second moment of the gradient. These methods include AdaGrad, AdaDelta, RMS-Prop, and ADAM. + +

    +









    + +

    RMS prop

    + +

    +In RMS prop, in addition to keeping a running average of the first moment of the gradient, we also keep track of the second moment denoted by \( \mathbf{s}_t=\mathbb{E}[\mathbf{g}_t^2] \). The update rule for RMS prop is given by +$$ +\begin{align} +\mathbf{g}_t &= \nabla_\theta E(\boldsymbol{\theta}) +\label{_auto3}\\ +\mathbf{s}_t &=\beta \mathbf{s}_{t-1} +(1-\beta)\mathbf{g}_t^2 \nonumber \\ +\boldsymbol{\theta}_{t+1}&=&\boldsymbol{\theta}_t - \eta_t { \mathbf{g}_t \over \sqrt{\mathbf{s}_t +\epsilon}}, \nonumber +\end{align} +$$ + +where \( \beta \) controls the averaging time of the second moment and is typically taken to be about \( \beta=0.9 \), \( \eta_t \) is a learning rate typically chosen to be \( 10^{-3} \), and \( \epsilon\sim 10^{-8} \) is a small regularization constant to prevent divergences. Multiplication and division by vectors is understood as an element-wise operation. It is clear from this formula that the learning rate is reduced in directions where the norm of the gradient is consistently large. This greatly speeds up the convergence by allowing us to use a larger learning rate for flat directions. + +

    +









    + +

    ADAM optimizer

    + +

    +A related algorithm is the ADAM optimizer. In ADAM, we keep a running average of both the first and second moment of the gradient and use this information to adaptively change the learning rate for different parameters. In addition to keeping a running average of the first and second moments of the gradient (i.e. \( \mathbf{m}_t=\mathbb{E}[\mathbf{g}_t] \) and \( \mathbf{s}_t=\mathbb{E}[\mathbf{g}^2_t] \), respectively), ADAM performs an additional bias correction to account for the fact that we are estimating the first two moments of the gradient using a running average (denoted by the hats in the update rule below). The update rule for ADAM is given by (where multiplication and division are once again understood to be element-wise operations below) +$$ +\begin{align} +\mathbf{g}_t &= \nabla_\theta E(\boldsymbol{\theta}) +\label{_auto4}\\ +\mathbf{m}_t &= \beta_1 \mathbf{m}_{t-1} + (1-\beta_1) \mathbf{g}_t \nonumber \\ +\mathbf{s}_t &=\beta_2 \mathbf{s}_{t-1} +(1-\beta_2)\mathbf{g}_t^2 \nonumber \\ +\hat{\mathbf{m}}_t&={\mathbf{m}_t \over 1-\beta_1^t} \nonumber \\ +\hat{\mathbf{s}}_t &={\mathbf{s}_t \over1-\beta_2^t} \nonumber \\ +\boldsymbol{\theta}_{t+1}&=\boldsymbol{\theta}_t - \eta_t { \hat{\mathbf{m}}_t \over \sqrt{\hat{\mathbf{s}}_t} +\epsilon}, \nonumber \\ +\label{_auto5} +\end{align} +$$ + +where \( \beta_1 \) and \( \beta_2 \) set the memory lifetime of the first and second moment and are typically taken to be \( 0.9 \) and \( 0.99 \) respectively, and \( \eta \) and \( \epsilon \) are identical to RMSprop. + +

    +Like in RMSprop, the effective step size of a parameter depends on the magnitude of its gradient squared. To understand this better, let us rewrite this expression in terms of the variance \( \boldsymbol{\sigma}_t^2 = \hat{\mathbf{s}}_t - (\hat{\mathbf{m}}_t)^2 \). Consider a single parameter \( \theta_t \). The update rule for this parameter is given by +$$ +\Delta \theta_{t+1}= -\eta_t { \hat{m}_t \over \sqrt{\sigma_t^2 + m_t^2 }+\epsilon}. +$$ + +

    +









    + +

    Practical tips

    + +
      +
    • Randomize the data when making mini-batches. It is always important to randomly shuffle the data when forming mini-batches. Otherwise, the gradient descent method can fit spurious correlations resulting from the order in which data is presented.
    • +
    • Transform your inputs. Learning becomes difficult when our landscape has a mixture of steep and flat directions. One simple trick for minimizing these situations is to standardize the data by subtracting the mean and normalizing the variance of input variables. Whenever possible, also decorrelate the inputs. To understand why this is helpful, consider the case of linear regression. It is easy to show that for the squared error cost function, the Hessian of the energy matrix is just the correlation matrix between the inputs. Thus, by standardizing the inputs, we are ensuring that the landscape looks homogeneous in all directions in parameter space. Since most deep networks can be viewed as linear transformations followed by a non-linearity at each layer, we expect this intuition to hold beyond the linear case.
    • +
    • Monitor the out-of-sample performance. Always monitor the performance of your model on a validation set (a small portion of the training data that is held out of the training process to serve as a proxy for the test set. If the validation error starts increasing, then the model is beginning to overfit. Terminate the learning process. This early stopping significantly improves performance in many settings.
    • +
    • Adaptive optimization methods don't always have good generalization. Recent studies have shown that adaptive methods such as ADAM, RMSPorp, and AdaGrad tend to have poor generalization compared to SGD or SGD with momentum, particularly in the high-dimensional limit (i.e. the number of parameters exceeds the number of data points). Although it is not clear at this stage why these methods perform so well in training deep neural networks, simpler procedures like properly-tuned SGD may work as well or better in these applications.
    • +
    + +Geron's text, see chapter 11, has several interesting discussions. diff --git a/doc/pub/Splines/html/Splines.html b/doc/pub/Splines/html/Splines.html index 31883185d..6f8548d8b 100644 --- a/doc/pub/Splines/html/Splines.html +++ b/doc/pub/Splines/html/Splines.html @@ -94,74 +94,86 @@ div { text-align: justify; text-justify: inter-word; } ('Steepest descent method', 2, None, '___sec19'), ('Steepest descent method', 2, None, '___sec20'), ('Final expressions', 2, None, '___sec21'), + ('Code examples for steepest descent', 2, None, '___sec22'), ('Simple codes for steepest descent and conjugate gradient ' 'using a $2\\times 2$ matrix, in c++, Python code to come', 2, None, - '___sec22'), + '___sec23'), ('The routine for the steepest descent method', 2, None, - '___sec23'), - ('Steepest descent example', 2, None, '___sec24'), - ('Conjugate gradient', 2, None, '___sec25'), - ('Revisiting our first homework', 2, None, '___sec26'), - ('Gradient descent example', 2, None, '___sec27'), - ('The derivative of the cost/loss function', 2, None, '___sec28'), - ('The Hessian matrix', 2, None, '___sec29'), - ('Simple program', 2, None, '___sec30'), - ('Gradient Descent Example', 2, None, '___sec31'), + '___sec24'), + ('Steepest descent example', 2, None, '___sec25'), + ('Conjugate gradient', 2, None, '___sec26'), + ('Revisiting our first homework', 2, None, '___sec27'), + ('Gradient descent example', 2, None, '___sec28'), + ('The derivative of the cost/loss function', 2, None, '___sec29'), + ('The Hessian matrix', 2, None, '___sec30'), + ('Simple program', 2, None, '___sec31'), + ('Gradient Descent Example', 2, None, '___sec32'), ('And a corresponding example using _scikit-learn_', 2, None, - '___sec32'), - ('Gradient descent and Ridge', 2, None, '___sec33'), - ('Automatic differentiation', 2, None, '___sec34'), - ('Using autograd', 2, None, '___sec35'), - ('Autograd with more complicated functions', 2, None, '___sec36'), + '___sec33'), + ('Gradient descent and Ridge', 2, None, '___sec34'), + ('Automatic differentiation', 2, None, '___sec35'), + ('Using autograd', 2, None, '___sec36'), + ('Autograd with more complicated functions', 2, None, '___sec37'), ('More complicated functions using the elements of their ' 'arguments directly', 2, None, - '___sec37'), + '___sec38'), ('Functions using mathematical functions from Numpy', 2, None, - '___sec38'), - ('More autograd', 2, None, '___sec39'), - ('And with loops', 2, None, '___sec40'), - ('Using recursion', 2, None, '___sec41'), - ('Unsupported functions', 2, None, '___sec42'), + '___sec39'), + ('More autograd', 2, None, '___sec40'), + ('And with loops', 2, None, '___sec41'), + ('Using recursion', 2, None, '___sec42'), + ('Unsupported functions', 2, None, '___sec43'), ('The syntax a.dot(b) when finding the dot product', 2, None, - '___sec43'), - ('Recommended to avoid', 2, None, '___sec44'), - ('Stochastic Gradient Descent', 2, None, '___sec45'), - ('Computation of gradients', 2, None, '___sec46'), - ('SGD example', 2, None, '___sec47'), - ('The gradient step', 2, None, '___sec48'), - ('Simple example code', 2, None, '___sec49'), - ('When do we stop?', 2, None, '___sec50'), - ('Slightly different approach', 2, None, '___sec51'), - ('Program for stochastic gradient', 2, None, '___sec52'), - ('Momentum based methods', 2, None, '___sec53'), - ('Conjugate gradient method', 2, None, '___sec54'), + '___sec44'), + ('Recommended to avoid', 2, None, '___sec45'), + ('Stochastic Gradient Descent', 2, None, '___sec46'), + ('Computation of gradients', 2, None, '___sec47'), + ('SGD example', 2, None, '___sec48'), + ('The gradient step', 2, None, '___sec49'), + ('Simple example code', 2, None, '___sec50'), + ('When do we stop?', 2, None, '___sec51'), + ('Slightly different approach', 2, None, '___sec52'), + ('Program for stochastic gradient', 2, None, '___sec53'), + ('Momentum based methods', 2, None, '___sec54'), ('Conjugate gradient method', 2, None, '___sec55'), ('Conjugate gradient method', 2, None, '___sec56'), ('Conjugate gradient method', 2, None, '___sec57'), - ('Conjugate gradient method and iterations', 2, None, '___sec58'), - ('Conjugate gradient method', 2, None, '___sec59'), + ('Conjugate gradient method', 2, None, '___sec58'), + ('Conjugate gradient method and iterations', 2, None, '___sec59'), ('Conjugate gradient method', 2, None, '___sec60'), ('Conjugate gradient method', 2, None, '___sec61'), + ('Conjugate gradient method', 2, None, '___sec62'), ('Simple implementation of the Conjugate gradient algorithm', 2, None, - '___sec62'), + '___sec63'), ('Broyden–Fletcher–Goldfarb–Shanno algorithm', 2, None, - '___sec63')]} + '___sec64'), + ('Using gradient descent methods, limitations', + 2, + None, + '___sec65'), + ('Momentum based GD', 2, None, '___sec66'), + ('More on momentum based approaches', 2, None, '___sec67'), + ('Momentum parameter', 2, None, '___sec68'), + ('Second moment of the gradient', 2, None, '___sec69'), + ('RMS prop', 2, None, '___sec70'), + ('ADAM optimizer', 2, None, '___sec71'), + ('Practical tips', 2, None, '___sec72')]} end of tocinfo --> @@ -203,7 +215,7 @@ MathJax.Hub.Config({
    [2] Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University

    -

    Oct 6, 2018

    +

    Oct 12, 2018












    @@ -787,7 +799,12 @@ $$











    -

    Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come

    +

    Code examples for steepest descent

    + +

    +









    + +

    Simple codes for steepest descent and conjugate gradient using a \( 2\times 2 \) matrix, in c++, Python code to come

    @@ -827,7 +844,7 @@ $$











    -

    The routine for the steepest descent method

    +

    The routine for the steepest descent method

    @@ -863,7 +880,7 @@ $$











    -

    Steepest descent example

    +

    Steepest descent example

    @@ -932,12 +949,12 @@ pt.plot(it_array









    -

    Conjugate gradient

    +

    Conjugate gradient

    -

    Revisiting our first homework

    +

    Revisiting our first homework

    We will use linear regression as a case study for the gradient descent @@ -970,7 +987,7 @@ $$

    -

    Gradient descent example

    +

    Gradient descent example

    Let \( \mathbf{y} = (y_1,\cdots,y_n)^T \), \( \mathbf{\hat{y}} = (\hat{y}_1,\cdots,\hat{y}_n)^T \) and \( \beta = (\beta_0, \beta_1)^T \) @@ -995,7 +1012,7 @@ and we want to find \( \beta \) such that \( C(\beta) \) is minimized.











    -

    The derivative of the cost/loss function

    +

    The derivative of the cost/loss function

    Computing \( \partial C(\beta) / \partial \beta_0 \) and \( \partial C(\beta) / \partial \beta_1 \) we can show that the gradient can be written as @@ -1010,7 +1027,7 @@ where \( X \) is the design matrix defined above.











    -

    The Hessian matrix

    +

    The Hessian matrix

    The Hessian matrix of \( C(\beta) \) is given by $$ \hat{H} \equiv \begin{bmatrix} @@ -1024,7 +1041,7 @@ This result implies that \( C(\beta) \) is a convex function since the matrix \(











    -

    Simple program

    +

    Simple program

    We can now write a program that minimizes \( C(\beta) \) using the gradient descent method with a constant learning rate \( \gamma \) according to @@ -1065,7 +1082,7 @@ beta_NE = np.









    -

    Gradient Descent Example

    +

    Gradient Descent Example

    Another simple example is here @@ -1114,7 +1131,7 @@ plt.show()











    -

    And a corresponding example using scikit-learn

    +

    And a corresponding example using scikit-learn

    @@ -1138,7 +1155,7 @@ sgdreg.fit(x,y.

    -

    Gradient descent and Ridge

    +

    Gradient descent and Ridge

    We have also discussed Ridge regression where the loss function contains a regularized given by the \( L_2 \) norm of \( \beta \), @@ -1195,7 +1212,7 @@ beta_ridge = np











    -

    Automatic differentiation

    +

    Automatic differentiation

    Python has tools for so-called automatic differentiation. Consider the following example $$ @@ -1250,7 +1267,7 @@ plt.show()

    -

    Using autograd

    +

    Using autograd

    Here we @@ -1283,7 +1300,7 @@ grad_analytical = Autograd with more complicated functions +

    Autograd with more complicated functions

    To differentiate with respect to two (or more) arguments of a Python @@ -1333,7 +1350,7 @@ Note that the grad function will not produce the true gradient of the function.











    -

    More complicated functions using the elements of their arguments directly

    +

    More complicated functions using the elements of their arguments directly

    @@ -1367,7 +1384,7 @@ could expect form a gradient-evaluting function.

    -

    Functions using mathematical functions from Numpy

    +

    Functions using mathematical functions from Numpy

    @@ -1393,7 +1410,7 @@ f4_grad_analytical = xMore autograd +

    More autograd

    @@ -1416,7 +1433,7 @@ x = 2.7











    -

    And with loops

    +

    And with loops

    @@ -1462,7 +1479,7 @@ f6_grad_analytical = Using recursion +

    Using recursion

    @@ -1500,7 +1517,7 @@ Note that if n is equal to zero or one, Autograd will give an error message. Thi











    -

    Unsupported functions

    +

    Unsupported functions

    Autograd supports many features. However, there are some functions that is not supported (yet) by Autograd.

    @@ -1526,7 +1543,7 @@ Here, Autograd tells us that an 'ArrayBox' does not support item assignment. The











    -

    The syntax a.dot(b) when finding the dot product

    +

    The syntax a.dot(b) when finding the dot product

    @@ -1568,7 +1585,7 @@ x = np.a











    -

    Recommended to avoid

    +

    Recommended to avoid

    The documentation recommends to avoid inplace operations such as

    @@ -1581,7 +1598,7 @@ a /=b











    -

    Stochastic Gradient Descent

    +

    Stochastic Gradient Descent

    Stochastic gradient descent (SGD) and variants thereof address some of @@ -1599,7 +1616,7 @@ $$











    -

    Computation of gradients

    +

    Computation of gradients

    This in turn means that the gradient can be @@ -1619,7 +1636,7 @@ minibatches. We denote these minibatches by \( B_k \) where











    -

    SGD example

    +

    SGD example

    As an example, suppose we have \( 10 \) data points \( (\mathbf{x}_1,\cdots, \mathbf{x}_{10}) \) and we choose to have \( M=5 \) minibathces, then each minibatch contains two data points. In particular we have @@ -1643,7 +1660,7 @@ $$











    -

    The gradient step

    +

    The gradient step

    Thus a gradient descent step now looks like @@ -1662,7 +1679,7 @@ the number of minibatches, as exemplified in the code below.











    -

    Simple example code

    +

    Simple example code

    @@ -1694,7 +1711,7 @@ all \( n \) datapoints.











    -

    When do we stop?

    +

    When do we stop?

    A natural question is when do we stop the search for a new minimum? @@ -1711,7 +1728,7 @@ gave the lowest value.











    -

    Slightly different approach

    +

    Slightly different approach

    Another approach is to let the step length \( \gamma_j \) depend on the @@ -1759,7 +1776,7 @@ j = 0











    -

    Program for stochastic gradient

    +

    Program for stochastic gradient

    @@ -1838,12 +1855,12 @@ plt.show()











    -

    Momentum based methods

    +

    Momentum based methods











    -

    Conjugate gradient method

    +

    Conjugate gradient method

    @@ -1873,7 +1890,7 @@ this inner product. Being conjugate is a symmetric relation: if \( \hat{s} \) is











    -

    Conjugate gradient method

    +

    Conjugate gradient method

    @@ -1891,7 +1908,7 @@ which is zero unless \( i=j \).











    -

    Conjugate gradient method

    +

    Conjugate gradient method

    @@ -1918,7 +1935,7 @@ $$











    -

    Conjugate gradient method

    +

    Conjugate gradient method

    @@ -1950,7 +1967,7 @@ $$











    -

    Conjugate gradient method and iterations

    +

    Conjugate gradient method and iterations

    @@ -1986,7 +2003,7 @@ instead.











    -

    Conjugate gradient method

    +

    Conjugate gradient method

    @@ -2016,7 +2033,7 @@ hence the name conjugate gradient method.











    -

    Conjugate gradient method

    +

    Conjugate gradient method

    @@ -2045,7 +2062,7 @@ $$











    -

    Conjugate gradient method

    +

    Conjugate gradient method

    @@ -2083,7 +2100,7 @@ $$











    -

    Simple implementation of the Conjugate gradient algorithm

    +

    Simple implementation of the Conjugate gradient algorithm

    @@ -2122,7 +2139,7 @@ $$











    -

    Broyden–Fletcher–Goldfarb–Shanno algorithm

    +

    Broyden–Fletcher–Goldfarb–Shanno algorithm

    @@ -2155,6 +2172,177 @@ over the scalar \( \alpha > 0 \).

    +









    + +

    Using gradient descent methods, limitations

    + +
      +
    • Gradient descent (GD) finds local minima of our function. Since the GD algorithm is deterministic, if it converges, it will converge to a local minimum of our energy function. Because in ML we are often dealing with extremely rugged landscapes with many local minima, this can lead to poor performance.
    • +
    • GD is sensitive to initial conditions. One consequence of the local nature of GD is that initial conditions matter. Depending on where one starts, one will end up at a different local minima. Therefore, it is very important to think about how one initializes the training process. This is true for GD as well as more complicated variants of GD.
    • +
    • Gradients are computationally expensive to calculate for large datasets. In many cases in statistics and ML, the energy function is a sum of terms, with one term for each data point. For example, in linear regression, \( E \propto \sum_{i=1}^n (y_i - \mathbf{w}^T\cdot\mathbf{x}_i)^2 \); for logistic regression, the square error is replaced by the cross entropy. To calculate the gradient we have to sum over all \( n \) data points. Doing this at every GD step becomes extremely computationally expensive. An ingenious solution to this, is to calculate the gradients using small subsets of the data called "mini batches". This has the added benefit of introducing stochasticity into our algorithm.
    • +
    • GD is very sensitive to choices of learning rates. GD is extremely sensitive to the choice of learning rates. If the learning rate is very small, the training process take an extremely long time. For larger learning rates, GD can diverge and give poor results. Furthermore, depending on what the local landscape looks like, we have to modify the learning rates to ensure convergence. Ideally, we would adaptively choose the learning rates to match the landscape.
    • +
    • GD treats all directions in parameter space uniformly. Another major drawback of GD is that unlike Newton's method, the learning rate for GD is the same in all directions in parameter space. For this reason, the maximum learning rate is set by the behavior of the steepest direction and this can significantly slow down training. Ideally, we would like to take large steps in flat directions and small steps in steep directions. Since we are exploring rugged landscapes where curvatures change, this requires us to keep track of not only the gradient but second derivatives. The ideal scenario would be to calculate the Hessian but this proves to be too computationally expensive.
    • +
    • GD can take exponential time to escape saddle points, even with random initialization. As we mentioned, GD is extremely sensitive to initial condition since it determines the particular local minimum GD would eventually reach. However, even with a good initialization scheme, through the introduction of randomness, GD can still take exponential time to escape saddle points.
    • +
    + +









    + +

    Momentum based GD

    + +

    +The stochastic gradient descent (SGD) is almost always used with a momentum or inertia term that serves as a memory of the direction we are moving in parameter space. This is typically +implemented as follows +$$ +\begin{align} +\mathbf{v}_{t}&=\gamma \mathbf{v}_{t-1}+\eta_{t}\nabla_\theta E(\boldsymbol{\theta}_t) \nonumber \\ +\boldsymbol{\theta}_{t+1}&= \boldsymbol{\theta}_t -\mathbf{v}_{t}, +\label{_auto1} +\end{align} +$$ + +where we have introduced a momentum parameter \( \gamma \), with \( 0\le\gamma\le 1 \), and for brevity we dropped the explicit notation to indicate the gradient is to be taken over a different mini-batch at each step. We call this algorithm gradient descent with momentum (GDM). From these equations, it is clear that \( \mathbf{v}_t \) is a running average of recently encountered gradients and \( (1-\gamma)^{-1} \) sets the characteristic time scale for the memory used in the averaging procedure. Consistent with this, when \( \gamma=0 \), this just reduces down to ordinary SGD as discussed earlier. An equivalent way of writing the updates is +$$ +\Delta \boldsymbol{\theta}_{t+1} = \gamma \Delta \boldsymbol{\theta}_t -\ \eta_{t}\nabla_\theta E(\boldsymbol{\theta}_t), +$$ + +where we have defined \( \Delta \boldsymbol{\theta}_{t}= \boldsymbol{\theta}_t-\boldsymbol{\theta}_{t-1} \). + +

    +









    + +

    More on momentum based approaches

    + +

    +Let us try to get more intuition from these equations. It is helpful to consider a simple physical analogy with a particle of mass \( m \) moving in a viscous medium with drag coefficient \( \mu \) and potential +\( E(\mathbf{w}) \). If we denote the particle's position by \( \mathbf{w} \), then its motion is described by +$$ +m {d^2 \mathbf{w} \over dt^2} + \mu {d \mathbf{w} \over dt }= -\nabla_w E(\mathbf{w}). +$$ + +We can discretize this equation in the usual way to get +$$ +m { \mathbf{w}_{t+\Delta t}-2 \mathbf{w}_{t} +\mathbf{w}_{t-\Delta t} \over (\Delta t)^2}+\mu {\mathbf{w}_{t+\Delta t}- \mathbf{w}_{t} \over \Delta t} = -\nabla_w E(\mathbf{w}). +$$ + +Rearranging this equation, we can rewrite this as +$$ +\Delta \mathbf{w}_{t +\Delta t}= - { (\Delta t)^2 \over m +\mu \Delta t} \nabla_w E(\mathbf{w})+ {m \over m +\mu \Delta t} \Delta \mathbf{w}_t. +$$ + +

    +









    + +

    Momentum parameter

    +Notice that this equation is identical to previous one if we identify the position of the particle, \( \mathbf{w} \), with the parameters \( \boldsymbol{\theta} \). This allows +us to identify the momentum parameter and learning rate with the mass of the particle and the viscous drag as: +$$ +\gamma= {m \over m +\mu \Delta t }, \qquad \eta = {(\Delta t)^2 \over m +\mu \Delta t}. +$$ + +Thus, as the name suggests, the momentum parameter is proportional to the mass of the particle and effectively provides inertia. Furthermore, in the large viscosity/small learning rate limit, our memory time scales as \( (1-\gamma)^{-1} \approx m/(\mu \Delta t) \). + +

    +Why is momentum useful? SGD momentum helps the gradient descent algorithm gain speed in directions with persistent but small gradients even in the presence of stochasticity, while suppressing oscillations in high-curvature directions. This becomes especially important in situations where the landscape is shallow and flat in some directions and narrow and steep in others. It has been argued that first-order methods (with appropriate initial conditions) can perform comparable to more expensive second order methods, especially in the context of complex deep learning models. + +

    +These beneficial properties of momentum can sometimes become even more pronounced by using a slight modification of the classical momentum algorithm called Nesterov Accelerated Gradient (NAG). + +

    +In the NAG algorithm, rather than calculating the gradient at the current parameters, \( \nabla_\theta E(\boldsymbol{\theta}_t) \), one calculates the gradient at the expected value of the parameters given our current momentum, \( \nabla_\theta E(\boldsymbol{\theta}_t +\gamma \mathbf{v}_{t-1}) \). This yields the NAG update rule +$$ +\begin{align} +\mathbf{v}_{t}&=\gamma \mathbf{v}_{t-1}+\eta_{t}\nabla_\theta E(\boldsymbol{\theta}_t +\gamma \mathbf{v}_{t-1}) \nonumber \\ +\boldsymbol{\theta}_{t+1}&= \boldsymbol{\theta}_t -\mathbf{v}_{t}. +\label{_auto2} +\end{align} +$$ + +One of the major advantages of NAG is that it allows for the use of a larger learning rate than GDM for the same choice of \( \gamma \). + +

    +









    + +

    Second moment of the gradient

    + +

    +In stochastic gradient descent, with and without momentum, we still +have to specify a schedule for tuning the learning rates \( \eta_t \) +as a function of time. As discussed in the context of Newton's +method, this presents a number of dilemmas. The learning rate is +limited by the steepest direction which can change depending on the +current position in the landscape. To circumvent this problem, ideally +our algorithm would keep track of curvature and take large steps in +shallow, flat directions and small steps in steep, narrow directions. +Second-order methods accomplish this by calculating or approximating +the Hessian and normalizing the learning rate by the +curvature. However, this is very computationally expensive for +extremely large models. Ideally, we would like to be able to +adaptively change the step size to match the landscape without paying +the steep computational price of calculating or approximating +Hessians. + +

    +Recently, a number of methods have been introduced that accomplish this by tracking not only the gradient, but also the second moment of the gradient. These methods include AdaGrad, AdaDelta, RMS-Prop, and ADAM. + +

    +









    + +

    RMS prop

    + +

    +In RMS prop, in addition to keeping a running average of the first moment of the gradient, we also keep track of the second moment denoted by \( \mathbf{s}_t=\mathbb{E}[\mathbf{g}_t^2] \). The update rule for RMS prop is given by +$$ +\begin{align} +\mathbf{g}_t &= \nabla_\theta E(\boldsymbol{\theta}) +\label{_auto3}\\ +\mathbf{s}_t &=\beta \mathbf{s}_{t-1} +(1-\beta)\mathbf{g}_t^2 \nonumber \\ +\boldsymbol{\theta}_{t+1}&=&\boldsymbol{\theta}_t - \eta_t { \mathbf{g}_t \over \sqrt{\mathbf{s}_t +\epsilon}}, \nonumber +\end{align} +$$ + +where \( \beta \) controls the averaging time of the second moment and is typically taken to be about \( \beta=0.9 \), \( \eta_t \) is a learning rate typically chosen to be \( 10^{-3} \), and \( \epsilon\sim 10^{-8} \) is a small regularization constant to prevent divergences. Multiplication and division by vectors is understood as an element-wise operation. It is clear from this formula that the learning rate is reduced in directions where the norm of the gradient is consistently large. This greatly speeds up the convergence by allowing us to use a larger learning rate for flat directions. + +

    +









    + +

    ADAM optimizer

    + +

    +A related algorithm is the ADAM optimizer. In ADAM, we keep a running average of both the first and second moment of the gradient and use this information to adaptively change the learning rate for different parameters. In addition to keeping a running average of the first and second moments of the gradient (i.e. \( \mathbf{m}_t=\mathbb{E}[\mathbf{g}_t] \) and \( \mathbf{s}_t=\mathbb{E}[\mathbf{g}^2_t] \), respectively), ADAM performs an additional bias correction to account for the fact that we are estimating the first two moments of the gradient using a running average (denoted by the hats in the update rule below). The update rule for ADAM is given by (where multiplication and division are once again understood to be element-wise operations below) +$$ +\begin{align} +\mathbf{g}_t &= \nabla_\theta E(\boldsymbol{\theta}) +\label{_auto4}\\ +\mathbf{m}_t &= \beta_1 \mathbf{m}_{t-1} + (1-\beta_1) \mathbf{g}_t \nonumber \\ +\mathbf{s}_t &=\beta_2 \mathbf{s}_{t-1} +(1-\beta_2)\mathbf{g}_t^2 \nonumber \\ +\hat{\mathbf{m}}_t&={\mathbf{m}_t \over 1-\beta_1^t} \nonumber \\ +\hat{\mathbf{s}}_t &={\mathbf{s}_t \over1-\beta_2^t} \nonumber \\ +\boldsymbol{\theta}_{t+1}&=\boldsymbol{\theta}_t - \eta_t { \hat{\mathbf{m}}_t \over \sqrt{\hat{\mathbf{s}}_t} +\epsilon}, \nonumber \\ +\label{_auto5} +\end{align} +$$ + +where \( \beta_1 \) and \( \beta_2 \) set the memory lifetime of the first and second moment and are typically taken to be \( 0.9 \) and \( 0.99 \) respectively, and \( \eta \) and \( \epsilon \) are identical to RMSprop. + +

    +Like in RMSprop, the effective step size of a parameter depends on the magnitude of its gradient squared. To understand this better, let us rewrite this expression in terms of the variance \( \boldsymbol{\sigma}_t^2 = \hat{\mathbf{s}}_t - (\hat{\mathbf{m}}_t)^2 \). Consider a single parameter \( \theta_t \). The update rule for this parameter is given by +$$ +\Delta \theta_{t+1}= -\eta_t { \hat{m}_t \over \sqrt{\sigma_t^2 + m_t^2 }+\epsilon}. +$$ + +

    +









    + +

    Practical tips

    + +
      +
    • Randomize the data when making mini-batches. It is always important to randomly shuffle the data when forming mini-batches. Otherwise, the gradient descent method can fit spurious correlations resulting from the order in which data is presented.
    • +
    • Transform your inputs. Learning becomes difficult when our landscape has a mixture of steep and flat directions. One simple trick for minimizing these situations is to standardize the data by subtracting the mean and normalizing the variance of input variables. Whenever possible, also decorrelate the inputs. To understand why this is helpful, consider the case of linear regression. It is easy to show that for the squared error cost function, the Hessian of the energy matrix is just the correlation matrix between the inputs. Thus, by standardizing the inputs, we are ensuring that the landscape looks homogeneous in all directions in parameter space. Since most deep networks can be viewed as linear transformations followed by a non-linearity at each layer, we expect this intuition to hold beyond the linear case.
    • +
    • Monitor the out-of-sample performance. Always monitor the performance of your model on a validation set (a small portion of the training data that is held out of the training process to serve as a proxy for the test set. If the validation error starts increasing, then the model is beginning to overfit. Terminate the learning process. This early stopping significantly improves performance in many settings.
    • +
    • Adaptive optimization methods don't always have good generalization. Recent studies have shown that adaptive methods such as ADAM, RMSPorp, and AdaGrad tend to have poor generalization compared to SGD or SGD with momentum, particularly in the high-dimensional limit (i.e. the number of parameters exceeds the number of data points). Although it is not clear at this stage why these methods perform so well in training deep neural networks, simpler procedures like properly-tuned SGD may work as well or better in these applications.
    • +
    + +Geron's text, see chapter 11, has several interesting discussions. diff --git a/doc/pub/Splines/ipynb/Splines.ipynb b/doc/pub/Splines/ipynb/Splines.ipynb index 48e3c51fa..a4aeb3112 100644 --- a/doc/pub/Splines/ipynb/Splines.ipynb +++ b/doc/pub/Splines/ipynb/Splines.ipynb @@ -10,7 +10,7 @@ " \n", "**Morten Hjorth-Jensen**, Department of Physics, University of Oslo and Department of Physics and Astronomy and National Superconducting Cyclotron Laboratory, Michigan State University\n", "\n", - "Date: **Oct 6, 2018**\n", + "Date: **Oct 12, 2018**\n", "\n", "Copyright 1999-2018, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license\n", "\n", @@ -766,6 +766,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "## Code examples for steepest descent\n", + "\n", "## Simple codes for steepest descent and conjugate gradient using a $2\\times 2$ matrix, in c++, Python code to come" ] }, @@ -2595,7 +2597,365 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "over the scalar $\\alpha > 0$." + "over the scalar $\\alpha > 0$.\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "## Using gradient descent methods, limitations\n", + "\n", + "* **Gradient descent (GD) finds local minima of our function**. Since the GD algorithm is deterministic, if it converges, it will converge to a local minimum of our energy function. Because in ML we are often dealing with extremely rugged landscapes with many local minima, this can lead to poor performance.\n", + "\n", + "* **GD is sensitive to initial conditions**. One consequence of the local nature of GD is that initial conditions matter. Depending on where one starts, one will end up at a different local minima. Therefore, it is very important to think about how one initializes the training process. This is true for GD as well as more complicated variants of GD.\n", + "\n", + "* **Gradients are computationally expensive to calculate for large datasets**. In many cases in statistics and ML, the energy function is a sum of terms, with one term for each data point. For example, in linear regression, $E \\propto \\sum_{i=1}^n (y_i - \\mathbf{w}^T\\cdot\\mathbf{x}_i)^2$; for logistic regression, the square error is replaced by the cross entropy. To calculate the gradient we have to sum over *all* $n$ data points. Doing this at every GD step becomes extremely computationally expensive. An ingenious solution to this, is to calculate the gradients using small subsets of the data called \"mini batches\". This has the added benefit of introducing stochasticity into our algorithm.\n", + "\n", + "* **GD is very sensitive to choices of learning rates**. GD is extremely sensitive to the choice of learning rates. If the learning rate is very small, the training process take an extremely long time. For larger learning rates, GD can diverge and give poor results. Furthermore, depending on what the local landscape looks like, we have to modify the learning rates to ensure convergence. Ideally, we would *adaptively* choose the learning rates to match the landscape.\n", + "\n", + "* **GD treats all directions in parameter space uniformly.** Another major drawback of GD is that unlike Newton's method, the learning rate for GD is the same in all directions in parameter space. For this reason, the maximum learning rate is set by the behavior of the steepest direction and this can significantly slow down training. Ideally, we would like to take large steps in flat directions and small steps in steep directions. Since we are exploring rugged landscapes where curvatures change, this requires us to keep track of not only the gradient but second derivatives. The ideal scenario would be to calculate the Hessian but this proves to be too computationally expensive. \n", + "\n", + "* GD can take exponential time to escape saddle points, even with random initialization. As we mentioned, GD is extremely sensitive to initial condition since it determines the particular local minimum GD would eventually reach. However, even with a good initialization scheme, through the introduction of randomness, GD can still take exponential time to escape saddle points.\n", + "\n", + "## Momentum based GD\n", + "\n", + "The stochastic gradient descent (SGD) is almost always used with a *momentum* or inertia term that serves as a memory of the direction we are moving in parameter space. This is typically \n", + "implemented as follows" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\mathbf{v}_{t}=\\gamma \\mathbf{v}_{t-1}+\\eta_{t}\\nabla_\\theta E(\\boldsymbol{\\theta}_t) \\nonumber\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation} \n", + "\\boldsymbol{\\theta}_{t+1}= \\boldsymbol{\\theta}_t -\\mathbf{v}_{t},\n", + "\\label{_auto1} \\tag{2}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "where we have introduced a momentum parameter $\\gamma$, with $0\\le\\gamma\\le 1$, and for brevity we dropped the explicit notation to indicate the gradient is to be taken over a different mini-batch at each step. We call this algorithm gradient descent with momentum (GDM). From these equations, it is clear that $\\mathbf{v}_t$ is a running average of recently encountered gradients and $(1-\\gamma)^{-1}$ sets the characteristic time scale for the memory used in the averaging procedure. Consistent with this, when $\\gamma=0$, this just reduces down to ordinary SGD as discussed earlier. An equivalent way of writing the updates is" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\Delta \\boldsymbol{\\theta}_{t+1} = \\gamma \\Delta \\boldsymbol{\\theta}_t -\\ \\eta_{t}\\nabla_\\theta E(\\boldsymbol{\\theta}_t),\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "where we have defined $\\Delta \\boldsymbol{\\theta}_{t}= \\boldsymbol{\\theta}_t-\\boldsymbol{\\theta}_{t-1}$.\n", + "\n", + "## More on momentum based approaches\n", + "\n", + "Let us try to get more intuition from these equations. It is helpful to consider a simple physical analogy with a particle of mass $m$ moving in a viscous medium with drag coefficient $\\mu$ and potential \n", + "$E(\\mathbf{w})$. If we denote the particle's position by $\\mathbf{w}$, then its motion is described by" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "m {d^2 \\mathbf{w} \\over dt^2} + \\mu {d \\mathbf{w} \\over dt }= -\\nabla_w E(\\mathbf{w}).\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can discretize this equation in the usual way to get" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "m { \\mathbf{w}_{t+\\Delta t}-2 \\mathbf{w}_{t} +\\mathbf{w}_{t-\\Delta t} \\over (\\Delta t)^2}+\\mu {\\mathbf{w}_{t+\\Delta t}- \\mathbf{w}_{t} \\over \\Delta t} = -\\nabla_w E(\\mathbf{w}).\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Rearranging this equation, we can rewrite this as" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\Delta \\mathbf{w}_{t +\\Delta t}= - { (\\Delta t)^2 \\over m +\\mu \\Delta t} \\nabla_w E(\\mathbf{w})+ {m \\over m +\\mu \\Delta t} \\Delta \\mathbf{w}_t.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Momentum parameter\n", + "Notice that this equation is identical to previous one if we identify the position of the particle, $\\mathbf{w}$, with the parameters $\\boldsymbol{\\theta}$. This allows\n", + "us to identify the momentum parameter and learning rate with the mass of the particle and the viscous drag as:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\gamma= {m \\over m +\\mu \\Delta t }, \\qquad \\eta = {(\\Delta t)^2 \\over m +\\mu \\Delta t}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Thus, as the name suggests, the momentum parameter is proportional to the mass of the particle and effectively provides inertia. Furthermore, in the large viscosity/small learning rate limit, our memory time scales as $(1-\\gamma)^{-1} \\approx m/(\\mu \\Delta t)$.\n", + "\n", + "Why is momentum useful? SGD momentum helps the gradient descent algorithm gain speed in directions with persistent but small gradients even in the presence of stochasticity, while suppressing oscillations in high-curvature directions. This becomes especially important in situations where the landscape is shallow and flat in some directions and narrow and steep in others. It has been argued that first-order methods (with appropriate initial conditions) can perform comparable to more expensive second order methods, especially in the context of complex deep learning models. \n", + "\n", + "These beneficial properties of momentum can sometimes become even more pronounced by using a slight modification of the classical momentum algorithm called Nesterov Accelerated Gradient (NAG). \n", + "\n", + "In the NAG algorithm, rather than calculating the gradient at the current parameters, $\\nabla_\\theta E(\\boldsymbol{\\theta}_t)$, one calculates the gradient at the expected value of the parameters given our current momentum, $\\nabla_\\theta E(\\boldsymbol{\\theta}_t +\\gamma \\mathbf{v}_{t-1})$. This yields the NAG update rule" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\mathbf{v}_{t}=\\gamma \\mathbf{v}_{t-1}+\\eta_{t}\\nabla_\\theta E(\\boldsymbol{\\theta}_t +\\gamma \\mathbf{v}_{t-1}) \\nonumber\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation} \n", + "\\boldsymbol{\\theta}_{t+1}= \\boldsymbol{\\theta}_t -\\mathbf{v}_{t}.\n", + "\\label{_auto2} \\tag{3}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "One of the major advantages of NAG is that it allows for the use of a larger learning rate than GDM for the same choice of $\\gamma$.\n", + "\n", + "\n", + "## Second moment of the gradient\n", + "\n", + "\n", + "In stochastic gradient descent, with and without momentum, we still\n", + "have to specify a schedule for tuning the learning rates $\\eta_t$\n", + "as a function of time. As discussed in the context of Newton's\n", + "method, this presents a number of dilemmas. The learning rate is\n", + "limited by the steepest direction which can change depending on the\n", + "current position in the landscape. To circumvent this problem, ideally\n", + "our algorithm would keep track of curvature and take large steps in\n", + "shallow, flat directions and small steps in steep, narrow directions.\n", + "Second-order methods accomplish this by calculating or approximating\n", + "the Hessian and normalizing the learning rate by the\n", + "curvature. However, this is very computationally expensive for\n", + "extremely large models. Ideally, we would like to be able to\n", + "adaptively change the step size to match the landscape without paying\n", + "the steep computational price of calculating or approximating\n", + "Hessians.\n", + "\n", + "Recently, a number of methods have been introduced that accomplish this by tracking not only the gradient, but also the second moment of the gradient. These methods include AdaGrad, AdaDelta, RMS-Prop, and ADAM.\n", + "\n", + "## RMS prop\n", + "\n", + "In RMS prop, in addition to keeping a running average of the first moment of the gradient, we also keep track of the second moment denoted by $\\mathbf{s}_t=\\mathbb{E}[\\mathbf{g}_t^2]$. The update rule for RMS prop is given by" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation}\n", + "\\mathbf{g}_t = \\nabla_\\theta E(\\boldsymbol{\\theta}) \n", + "\\label{_auto3} \\tag{4}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\mathbf{s}_t =\\beta \\mathbf{s}_{t-1} +(1-\\beta)\\mathbf{g}_t^2 \\nonumber\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\boldsymbol{\\theta}_{t+1}=\\boldsymbol{\\theta}_t - \\eta_t { \\mathbf{g}_t \\over \\sqrt{\\mathbf{s}_t +\\epsilon}}, \\nonumber\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "where $\\beta$ controls the averaging time of the second moment and is typically taken to be about $\\beta=0.9$, $\\eta_t$ is a learning rate typically chosen to be $10^{-3}$, and $\\epsilon\\sim 10^{-8} $ is a small regularization constant to prevent divergences. Multiplication and division by vectors is understood as an element-wise operation. It is clear from this formula that the learning rate is reduced in directions where the norm of the gradient is consistently large. This greatly speeds up the convergence by allowing us to use a larger learning rate for flat directions.\n", + "\n", + "\n", + "## ADAM optimizer\n", + "\n", + "A related algorithm is the ADAM optimizer. In ADAM, we keep a running average of both the first and second moment of the gradient and use this information to adaptively change the learning rate for different parameters. In addition to keeping a running average of the first and second moments of the gradient (i.e. $\\mathbf{m}_t=\\mathbb{E}[\\mathbf{g}_t]$ and $\\mathbf{s}_t=\\mathbb{E}[\\mathbf{g}^2_t]$, respectively), ADAM performs an additional bias correction to account for the fact that we are estimating the first two moments of the gradient using a running average (denoted by the hats in the update rule below). The update rule for ADAM is given by (where multiplication and division are once again understood to be element-wise operations below)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation}\n", + "\\mathbf{g}_t = \\nabla_\\theta E(\\boldsymbol{\\theta}) \n", + "\\label{_auto4} \\tag{5}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\mathbf{m}_t = \\beta_1 \\mathbf{m}_{t-1} + (1-\\beta_1) \\mathbf{g}_t \\nonumber\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\mathbf{s}_t =\\beta_2 \\mathbf{s}_{t-1} +(1-\\beta_2)\\mathbf{g}_t^2 \\nonumber\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\hat{\\mathbf{m}}_t={\\mathbf{m}_t \\over 1-\\beta_1^t} \\nonumber\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\hat{\\mathbf{s}}_t ={\\mathbf{s}_t \\over1-\\beta_2^t} \\nonumber\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\boldsymbol{\\theta}_{t+1}=\\boldsymbol{\\theta}_t - \\eta_t { \\hat{\\mathbf{m}}_t \\over \\sqrt{\\hat{\\mathbf{s}}_t} +\\epsilon}, \\nonumber\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "
    \n", + "\n", + "$$\n", + "\\begin{equation} \n", + "\\label{_auto5} \\tag{6}\n", + "\\end{equation}\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "where $\\beta_1$ and $\\beta_2$ set the memory lifetime of the first and second moment and are typically taken to be $0.9$ and $0.99$ respectively, and $\\eta$ and $\\epsilon$ are identical to RMSprop.\n", + "\n", + "Like in RMSprop, the effective step size of a parameter depends on the magnitude of its gradient squared. To understand this better, let us rewrite this expression in terms of the variance $\\boldsymbol{\\sigma}_t^2 = \\hat{\\mathbf{s}}_t - (\\hat{\\mathbf{m}}_t)^2$. Consider a single parameter $\\theta_t$. The update rule for this parameter is given by" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "$$\n", + "\\Delta \\theta_{t+1}= -\\eta_t { \\hat{m}_t \\over \\sqrt{\\sigma_t^2 + m_t^2 }+\\epsilon}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Practical tips\n", + "\n", + "* **Randomize the data when making mini-batches**. It is always important to randomly shuffle the data when forming mini-batches. Otherwise, the gradient descent method can fit spurious correlations resulting from the order in which data is presented.\n", + "\n", + "* **Transform your inputs**. Learning becomes difficult when our landscape has a mixture of steep and flat directions. One simple trick for minimizing these situations is to standardize the data by subtracting the mean and normalizing the variance of input variables. Whenever possible, also decorrelate the inputs. To understand why this is helpful, consider the case of linear regression. It is easy to show that for the squared error cost function, the Hessian of the energy matrix is just the correlation matrix between the inputs. Thus, by standardizing the inputs, we are ensuring that the landscape looks homogeneous in all directions in parameter space. Since most deep networks can be viewed as linear transformations followed by a non-linearity at each layer, we expect this intuition to hold beyond the linear case.\n", + "\n", + "* **Monitor the out-of-sample performance.** Always monitor the performance of your model on a validation set (a small portion of the training data that is held out of the training process to serve as a proxy for the test set. If the validation error starts increasing, then the model is beginning to overfit. Terminate the learning process. This *early stopping* significantly improves performance in many settings.\n", + "\n", + "* **Adaptive optimization methods don't always have good generalization.** Recent studies have shown that adaptive methods such as ADAM, RMSPorp, and AdaGrad tend to have poor generalization compared to SGD or SGD with momentum, particularly in the high-dimensional limit (i.e. the number of parameters exceeds the number of data points). Although it is not clear at this stage why these methods perform so well in training deep neural networks, simpler procedures like properly-tuned SGD may work as well or better in these applications.\n", + "\n", + "Geron's text, see chapter 11, has several interesting discussions." ] } ], diff --git a/doc/pub/Splines/ipynb/ipynb-Splines-src.tar.gz b/doc/pub/Splines/ipynb/ipynb-Splines-src.tar.gz index 7b7bb3026191d00a5cfb5e773ca79c930459c5d9..dc764628049f484c14704f9c8914017088b42e34 100644 GIT binary patch literal 209 zcmb2|=3scnb0C_5`R#efyh8>8t%=v>B>4$gs_b~}wc!O5r=xy?$YqHYvN_5VZ<{l& zjNNJ-68d-l*~=&VuboNzxhF!myXNfV_CT+fyQUe=|MF*AR@wagQ$gO5p;d1}w~Cqa z6q^cu-7$4vOpsYTUc`D^}fGr#ifxBS1I^OffRblY| JV9;P-004Z)V?h7_ literal 209 zcmb2|=3v++yfd1C`R#e%E+#{Pw#4i67WrLR^0)JKW1(R;W1zmkOAFchNoJi1_v@ls z3zu38&isC}MspQM=;xQmpMT$SV)>nFsijlodY{Y@w%xZxD&}?frYk{w?a8(;;-b1= zajmUdG;jN*vxcd{yF*{~em(hXck$gDRevAMf35jxdVW&mZk71WX4emP^WR+ObmP>b zo0j>(4`*Flzl6(dZne(JoXpg1YfNGYRZ5NKGgqV%D-{{ J1A_(w0|5D+XD$E$ diff --git a/doc/pub/Splines/pdf/Splines-minted.pdf b/doc/pub/Splines/pdf/Splines-minted.pdf index 4e31571bda3fd14878e2be526be06132d370c4bd..3c43ab626195f0c6ec83c0531aab36c46a411784 100644 GIT binary patch delta 176350 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 z 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ℑ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 z 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 delta 143149 zcmV)UK(N25&Ksx88IUCbFq2^vDUnY+1$cmSKlqW5UIA>8?-+mf{<_WAWwE9Gd$*mC zoF!@4F7?~JFZxXbdJ(TXBKk~K=qaO&WeIeHnoFsfPIR=?8B@Z9O`5hZh`m+uKR;ry zS$BlbXAg! zOM^*r6a9ZXJVl%@MEscJ9D*R&bx7~Lx zL;cQ^+(Y89%0FmLS1dy5f$i-`4>3|AO>Cr6#khY}UW=b*6c>!kVU3o^13g{iTx}e0 zc)mtKlWDvzs#Cme%98A0pPR5i9pRnL@cxAxeu__qC_~;KtP%P&E6F9xV1q+e;S{=*gpPcS2odQJA$ortUGh zRVII!&CGO}55PweS3bHS4GBxJMe;r&yr|B~)NlG`#_q_gEZfJIU(O>>L05xLd<*H-#T^jL3H zwU7n|$Uy`uAvWQbX&(&@@`^*M#eJejUxi=|G}_|nO$`Pi#&>}r3J z7BGp@?#ytbD+-ARPeEU{>i|PU&>Hhzk7`GSDQtq;b;5%#X~a~#C)B4D$P;yGvMj_s z=~HeAH53QJxq>z04Of&D^$x+ML-8d$Wjy|7T_BU3<|ZV@=)KuN*J|x&Jp2lu^Q#J< z!ocMmo?TPjjkdUM+EeDy1gWONJ;8rEMx(Jvr^|Bcc=~eXG_lg1LWb{?o+R>ewL#vE zj{-x{;E)k4o*r6F8YYuq|83*S4$zIqpj}r2+bN1|@AyOcf%ShBAL?c^ zoNM*%t`7$-aFll;-d$LEK5P!ca@WgQ8?fW|#a#(J?UMuzV6$sOQ`y{<9bDl@-xoLN zAG>|SxFVo74>k{jRw8>i`ZOp0H_pU1uz{i0Ww+W58`FpI9I*%0guSvOUsyoO9a`44 zAB4)5c>(>7*M7!zS#DtyNGN|L@~$gfPevXlKzbe;NObEw)n1{8nLbp*yao^*r*r5a z%QL{7G6?$ni0to8E#JgGqV$M zk|?E*R7W6Pf+P?llM8Q#uUx5@PyiSd-CmFfIL(9qBhHcBHHQ2%mdVr>DmW)lec4xe3j)&Hx7tP45bQ$!I%Zq>iUhHuR=ZL`+HnT`h z9j)q%pMT}i8XpNL(Cz5GBdsHg1h*9QRrJHfzr$7Sgk{)EWWaJJ8`NA%DPcGFIOjU# zW+wF0ZKD^%;}Dnn6rUsWp>IyT6CH3U}%EfP}?d;owZl z|4W18a4m0(gPThaEz6q?J^M#|W`{28zU(&BYpUW?-{!;r2-j^>dqTR?ei3lq6cwsb z6E%$sBbl=4mmcyHJyVuW4qfVIX8>=;R4Tvpn4d8G?3jONlYePmzO@2EWhocVU(}l? zNZ)0WF{6XeR(@Zk+K3W1K?6(wZthPGVFKZJOSHN&+XpAk>ugE?=D3>#{rImV-Y5S$ zy4xm+Mzbp56@uLc9SZdjYxf6C>({(_bvq}0A1TPvuI9=MHK52@)z2* z7Y1yXy$<)HOwLs#?pMTCBr0BY3C_+~rgT}1Uqw7Ma9sDxEH2YrJ>8K>nicYXN@&v@ zURVjp7z-2{Ww!>EmD8+j(;vGaU4IqjdRs*(0D&ED(j60|f6h`QQx__=bq8!?;BK;M z6L1rZzB;0lc+~&R0k9cC@rtJrZRpD3d#j6JsZp+X!1F4W-!~K`tjsWfzWu~hhW_b| z+(M9HXD4;t*Y>GSw_}pd)$8|5sgVEJSv_i_-EMnsrVqocoXsb1vjLWH~CVDlV)j| zMl<;^S(2i7)LeQhl)`nemJjI@IzAU?nadFXX{xDmD)I~Obb;@Sv@whsmv|6Y-ydrgs zeNl@ds%}Ih_Jh1X?yJNGY(*tmGHWZ=F2P62Dq8L*TlL&0We=bLNvSLNA$t|MAg66AqE(UX)P~@}ardw5GxVlL4NeQM3-Qt;C#amnH5ohuL zJ7=*%;2^!>|JF7zv``2FR!3U44}u_&D}~Pa_>VGVX{H{;G*t`-tG}zUsx8N=oTQCa zIblx9X)e|zYN)Aqe(Lr05us|dq(=4+1==0Ce{B$;Wfs+^)w{a87Mcu%{{8T_9lABc zzm|kvMJt6YJwKo^ueG%Pi}dB|CJnqx=Oimw@M>|gX&l%3~Q3SN>g?`DsW z<~#&YxE{@w`HavgtHycHaOgAFCl+#c%q|qVx}kT@F7E3O56vmXA!9yeiYI6j+bkWS zfAz3y6wMaXXp|^v)W3C}Dkh#y-55SvFI6YLn-juL@-@m*-W{}w zmA?F-rT2#bW%V!9bdP)Mvs@lxoyERrHKz)L_4y=IA=Whf@CqD1a#EeKBN0Xr7&9BrDE_9xgLIegGizvV9o9umjbnEa5%z$~yEruxq9poj|3|a+SE=gbi^rsA|MxvA z%+u2yr4iSvqq*d_fy_xsxujW#I%lOIIX1wI$yTRUXX7(>2tD2(F)lpG2R(X^m5iMJ)%#Sl?!&nD8ve$^~3wQp^fprwS131HMl%Lgrz9 z;HVe|g>03_yllMkz-K(idsvBo#XT%FiIs<;mXh)r*GQFz`DB9%;sy-%u-;?wfO!$V z!BI-tslf0G#ssXB6C8sJhHyXOiVpz}T5Btq<}4l>;l9Joh|dgs6jvfXd$^9+Lg7JX3l!L+)m)TTNLX@1sAKT;={+KW+AykfxO5!?B4;J41b?j&mV;ms zM>e6dpx3h(>JUL*&PJ&Hl1xkwuoCPd_(|?yokSjkfI$@Ev0%pc)(SCRBmo5(!xch` z0bdF)5Ta)#=n`2=3|1_Ec*j}+&S3z4ypcN~NLUo6L&5{CXfca&p~jFsR(6CzmUSXn z5`BT*D6zFJsR))Z0AUO>t%#SQ5et`M6mdduF^P&XGbZs1v5J{OwYR70169A6zL~1} zxjGC;pVzA1KUo~9$B*%KRloUk)~Nc`=zUYw&!&?_Gg-`45?ob(zi#H!^VztWBd3-( zer%3UMo*^~>d;6cS`i5yRhT}*JjitkyIT3?c|ZU1E9@p6L0L3jBUdNqr>95TkZy?# zA!-XT6hPTo?I7g>DCMkO=o+Bl`RR0aa5fq@%3aQRHCim1*+kLh$L}r{FAf%?MWgKU zMpf@4SV{uCFNMf|UPYFqSggjv)@lrP`D*N?aID5s!LG*8o{cL!6q8qDB)+*CJ1G)Z zV=zst^^p~HxjtN~U(KfDgJz));m7lRRljL27V0`My_C}i=M;vKPO+HvF7%4_XthO+ zDZz3GI>LYwEP1P$(|r-&A+JSPhsc%)+C;X6A}^ZNeJ7QFdxb%Dz7xT2gJ3t1U{_AC z+kxOdEF01ZFVGS!1*5a`4?=K3c6P|?tpo#!WWP=%yJ18!7ZcfquBxs~DZ^3(IcpXA zj^wlnk=~&%``X#mA#F=(-b&!L5C)Rw-8yOB4kOJ|F=<`s?b+9dxS1^%G)MLK^~?GhJ|JF4V!;@ev&lLj1bCh{(sjqA8QTKvoKSrQcX0l8 zfi>$NP9`7fCwqI#C)7{Ii<9Z3KB#|s{ZjtF`hBr~IQzD)=Zn$g9iFP26Fan_63*e|=b= zGF&WzVn?8TPbbueb?AgLmzhAgeuH6`Vnxg(xUlO-{D@USpfPo9^cj{>P6W^?0twf1WR;|Ic6NqYura zv(Z^Io7ZQflgVi_pFbK;Cx4v32a%87&ql{5@Jyc_zw2g1EPo@#9o|U2SWlV*m0?ZN zwg~B+Y$I|Jmb2F`aS_%mziqTSnnv|nevxi&Cg60he=qFwUkCZNd`tEvmV zT~&QpAEG8sMOgMIh=$6rxcV}vvy4}7F2YiFI$%HeC3RJ>lf7xT25Kp9XekfWQZCn0 z-a$*fSk#if9cv%fq0dT`%CH_i8Q+6%1p<1GiU9crH zP)k(4DOA={x_$R?E|s4M6QpQw{ND}vRE%OotMN-%^9qX zys3?{-=OTJ8y#BG4&q2Xuii}9Y88TsoaWEV_gWF}M7~@4+bnDoMvGkemD}E&ac+^! zo%=ZJ;s%?}4`tJp|ERczU7bWbO@SVw2A9RR(@VG0v$vP-ret9nZu^aLD51O~S-RN_ zC6srl-Q0Ja6f4v-YUE1_3j(v9HAn0Wy;z2@|u5x<(2DI60HCuN1T9#C!??HnU^T z@&uF7#1yk>)F}u7Gn28e6tkz?k_waYPCv7F=i&#G@lF#1H!v`lQQrnBf2CE+Zrd;r zyyq);q>y;S_X7nAG(gj$XWyD0R9kk0+Oi?Zsr&a`ijr*xbb_KM>M^^T-I-l6vL=jt zxnbk^Fu%EfBE&F;mKJIrB)<0MA;%n7)^%R82wm#nBjn!CSy$A`O*6 zPNFmL&c9Y2Pbo$}f1<)~%mxy4%BK;z#%VCvvG-;pA)^hTP1DqX*42!D3e{M;shcWZ zbyeA(4QOfI#B=Nfy1Z_y#n6ZA#RxAzJClBKpDl)Q`A@}2hJ8YhB&nmK1Idx@p+i;T zvt2x&m{iU3RWVI<929pnjIg6SELV8?mQV^;jQ0FLgu;Ahf0P1s9>?39n~|Ob9KsoA zpbU@5pFyHwb11q+(wx@Yx~rRYj=7S!976&QUhC_VukrOn<;s{#a8^y2cjj7OpKA-8 z8*%}<&F~(s&V0Dc@Ihzu39`@9kw(8uM}fy*$pz@VSQ18|`csEK&k93NK7$ZfA68ATu#Am(eo< zDSz!-O^+P65xvi^;4kPUi{F6YgQLi&0EX;C5au1UaCTn`1$=sM~`hJP&YF;Kx@C>WtYim=Qa)+FjRXhrvHQB{LMfK{U2qgD}0@nmtF?n&~0}5ytynkRQ z2*YY)=Exq*C9(!`N@Y!Pu?lM-utHnn8%z-VK``CeUhKC8DHWaXAf%#MC zDg<&mhrs%?=Md4Oz#;IGg9Jzx6n_e9qRWx$kJ;r^I|^vZ7zeBsDiS`hcsw|hNC!(~ zgYX6-3Bp^d2f^66b2zNCL}*S@g!g6EWLG_x2IoeBy($V2CUC48;co&Lua)!1s$f-^ z6i(i9mxI6$TH#!vg6<(h;P1WA+R#PtL0ARb`U)xPy+PoTLKla(qOJs%B7YW2&ymQ! z7$Zna`S9q`;pWHxyt#EZ-@o|j_Hgs3*RSqwU)}xcXglwo9&VoA{`&g2w=Zvh)h(!1 zf4TkV&o91x{kwbSQBh#(+U5BHBHp4ew~X?A^Noss?4AYP*-zcgU;p-ZG|N)qj@9P{ z>V5UwFTXs$pEoLRsbS%s*?+|hH7@kOnb~1wzr23?!kH;^^Znb` zFMqhbbI&mF<0tOs$J^iU+_sj>HpuDB23fAPL5}-vaLQ|H&C-@CX@4JcOkwGDCo@2D z3Gzt|HYxwyE+;mdta-HZwFWEU++h7$gB8EuV5hvp22iWKV}l2)b(g>2w_&bUYdKSE zN&D1V{h3;AAa8&{axjWUyvG0GF9Mrm^tBnD|MBTI~H z8Og@#GLd=WT1H~H@*sx_^*(+Bj=)_q+_COtMvCZT-p8E0EbYP;y2#8!SiX=yTx6Eq zG3UL^kz44Kde|OMnmpzt#N2Z#xtx$*>tS+sAtEBzdYJ6L5P669{ZM+D`5q{}$eev# zcx$fBJ`ew$1tG@$J8VetG-!yKkRU)U#B)i@q$?v6KV$ z(Re@BO3q7mE!2frE{hC4qvS{u$mh#v6dCyb03-1&WjeUWb@Uflq_ zB1%?UynhF^njVo0D94f4+EXe^g3K)0{qgrj|NhYWADaC?(s*ipDMTqTv}%epEdaAz z!||!O)&elA0{e=qz@@^ke!w7pTureM|9V>ZEie$HIuS5+Q1<+t+rVxt;}s*3>}?v^;0>I(s<8(2!Ay^9%USnfUuc!V-Kqx{j|35BeK4C zAaz{(ZMMPgEPTONBab}+ti27jcXOoFXy9Js2hIEwNb{n#vSLWC~c}rn>^>cF6w-N zR)0gmMGbZ=rC8}9Tl?sxwN+=nDyP#H+L6rk-!2+^JC~>B-15cp9vXrI6yW`l!B_6*qF# zoXM!#%xG2oFq+ks2AyQil$M_Vf=_hn@qei5+eYVJW3Qgk<~g@>8bl{L9!*_xP@n?; zN})#HPn#jx4m$XU>}?D~F&kHP8G`K&Q@bj5R0V^)_r7`U&=axRM3~h3C{8V4g+l~S zz(zrORxBmRSUJZ)EkA&o9HUJNQGcQtF{O=i1rOtp&|^x~D5bE0$OZiDap)-zPJdo= z6um})J|z?T3R`=n>l@FItP(~U(GI=3r?=@SV_c<-YbO;Y^=%RJg3LO`bD}C0JS;es zqc8@}JVV)5Up(kgQsYvLXXZDag!3^x1Q<*j*HIYY)tSwut(?6-EA62OGhVxVT(=!U zm0Ye}$2-%Q|ACJrN*I4Ws0=YX_6y)bv>-*q99i2hE6f#8VP~!?;)-IFn*n&!%j; zr6uPgD!FKD(7@2tIGBIYEK#dT&Uwv16=nSx@=8}_jZ>3DxV>F(*(ZBmVY31wFET+t&U>^ zbvMAHW5d%Hq{QmnL*_<1I~F6 z`^o|5xPZ|y`>zdf27g^sPyTuZJrbST%BG};P?KY{cD-SkXwrk$sHse;s%>h_0rd^h zSKEr-L^N-Ko_w(e-Bv++697cFsH}3V-#lX092fnDbmLQsbX|`|Q&mynvl>R(jHx^) zN~-*!y5=KVBF@H;rq-ce)?or^yti#yM^04mwVSj6}1z1@rBgZkZ;9F83 z=8q2{w`=BGMwxilMoNR3iejK52lFE)_el?tic`v8_(=+9*sA|g!F-Ef`$czHp}9iT zO#r$vI&gb!m&{^hv7ZoLFWXOHoor&JAB)#S^ zz=c$=sfEI6HZ0LwNrvR4hGt0PDX!FPj=Y^G)d_jWVSgb?seM~%wXWY`TGFeLxV1fm z4w)0>NLfv1l^)imC@cy*yRU6lA;OXf>%$(hB{?Lb29e2axpx z(hzSv$*vW$KXy}Ex@`01EYpcT=G7d(Oxd@sPyUq)z@_PIOW|}oY95rA0t^4tgT@y0% zg0Jb;{lCX~f?AV7)Dr?WHkZLT0TUB4FgP~~FHB`_XLM*XATl&KF*uh|^aB+HHZU_V zlTqgT@u^_eB{n==H8k0 z{`;+7-KU?ePwm=OXH}o3Bvn>p6fw0k21?q2oEce}Soi?)3aWOtMj%!eMo~K(Qve$i z3kwGVC8d}n(8$@+4kT{m4CDiFJ6iyhOq|~xe;omAEG)bTlmICp2a(O*E>&dHh4*vRQ!4Fs86f`GK|E@F1}9*&mg7S4ZSuro6LiS)-?lnEef zWMXaS=45RNFantZWSJD00E%{Q??OuejU5PJ474z^F$36{0n~xo01Y(>RW*Q=s*;AX ze;O^*dtfyedwV;_|Hnm4OnKaGGXEI^fEC~hbab-(llFhOQN1$*{7voM)y&b(_OAp08VhG4n zH#avXa~CIPCOb!SCVQK|_^Df1Isx45e;lm=?^j2l4e+nRxPVOG%js+Z{8xZKQv#5; zGy#H~fPb7M?f#{-eJ|y^)4SaHKg8Y(;ru72&A-e6PC(#)rLiz_`pZ{dSy>)nYh(#> z27-)0ChvyMM$Rry0K>mz?{A6}{9EPtpEUobE^7BaGJP8_e;*^a z|D7=-kc*S&KWg*e!#1%4IaxY6JN+vn5MX9$1N_6@>Cc>5g8q^zh$zZPN~ozb%D*=r zh*81ry*eN!XLskntpCIl5tru!@UU|LCF0A_ZM2!AG$ixa>s@<;S9#0_8;`w!w~0WeGc zjo1Lp(tjfk0JH4h=-p4@KZxhuQuS}d4q#UM58{2dH2NFy0GN&ce@46jW|RLQR+jhl zrvHGf0A}Dn;Cm9Yf57)F=Kp~2^ep}ZIo=0p;bCt91pUL}U1s?Y$OT}w`UiX`X7dmD z&dm02$okIgAE8*^nc4jVzB9A`JNJ8Fd!VDG-9LuH`p(YrAMl-u(?8(5hx0$+d&OM- z0pFRq{temQskr|Gf4)=k_zV7bD=GikL;u<$SpM#<|95lw3#&Oh+F1j&EKT2Utp6}k zFmiUZbk}2fU*D|n^7q%jzZv{j0?NO)rhj;girTq*F>>&50T|hMIRUI(EZpw{U}yLF zFJF^??el-_E$@rq-}uia3jhM$fhGvc3w9>_!B%N4q2<03e??Oj(3HGPXH__Y+Oi2y z%b8Q1gm~ilJ7hqi;()LISyaV#^3r?;z9|8qQfg(d%rZZg_q*}OuXGLD(7_Jnp4fX3*F7;k6KV+`BG8~Rl$nSMq4S^>0M z$sB7dmZJ@ZfBO;|K^NiDR2R7O+ap$7v{ApvGTp3UVJOb1ER20$51KB0TA}*qrkaH# zQ<&)5J|aR}H5w3-hI>Hm9d_0dWVH+lN2235QDi1E=fQ|6;c>Q*FIn;rbOtu7jYSr| zFk&->nl9eO=BIPSLEm7aK5G%KtHpYG(NGJV@^l-2e+a}qoYMFVsaQ3}yLyB8l2_zd z7ncSAUkFyjq{F$Ei*n?c|MjQ^pI7`z3>T>abPpl2T?Xi5qbmU#{TPWphBb@u>@~tN z#fd5r8#EIY?I|Yw=o)wrD2_^ICihnsOx>z51VY!qucdp)LS}QCnDc2dhcXJ ze-83t#Q5E(ebnrsp!CPd9@}gK0F!%2t)(w<%VbHjJb9vpc}hlK=E?#KL?CrIrxsS} zYqWLM$HT#C?0={2zEl&cfI;bZJGL?fmhRXx_fu)^Z77oq^mY!H$mN;4gqTp-Ck=as zRzI^F3N?Ol9k&0DD5KqlOBM)-*Z$&V)(W^YI$ zIezc%M|(5t8LKL>i5?a<&t>8)3B~bD_zhoL1iV;|C$`o1Yi~$0&5n#z_q2VkIo~3) z=T3$M=vFadVOTfgvQBjkTxgmPMXM)_&R#cXAGXyXjR`PlA{h+PbmT)h_y(e4f9_Wz za@XQrG)GZbHOS#mtmxXJ+k)Y=!spYpRRv$;rD3R;p>i$7K%71n^(?}J{>LiHn0qyu zw38-%{K6BYz+V^14qp$7_9H?E<-7$7NH!zTT7}oYt zYTKGpyn^Yw?Bi66@{i+&iK-*oe^2~p!ZkH0>&4}+YOV;xR{Nb+3Ag)hw@bu~Bzl4q zT&-pwz%`BmTc50^_>iJoXosq#Wcx4i;0UgIz=T*bU?pxMq#Zm8k4Y30J~(q(1|98~ zBEib55?yMNHISw{2JJZ7_Ji$e?b@a>2t?^r(cGY15n5pIEj4CHY|W%yDlB>eIjZG_3lcf zRK4K+oT8E?1)Xxg1~^NGW8=3;yI-RPacS?2P*DluQGv0*!nhwm7$*B0d;X_Odrc&S z#;h0eNI0E#EvSqi6(V^WcC|%f#TVOPtY4-x_GL16V3~p)&ZQrKf4`rPLEoIbAF}2G zfO`f*4$YLGNymviJOjLhU>8UGVKutHIC)&npkGy)N^7yHfT7U1E6nXiA0F@33Hw>u zZ={LSkAy}{L3B5l^6K7Tj)btq%p*$t4)vy@RooRe-fc{r8D~{B`&3$`i363o4e{+M z>{p;i_8rQ#M5Albe+(k}G2HSHzCny&*2c5hM@aov9*ZxQwu?@VEMj170%twtgzM;D ze7RNloDZqeZYN~R`*W0btQ@V^MFC^j?fD|-{)1h8OntZR)=dPuq)1q+`h>$tejz-N zQPGMX7E`nOAtqZl-)VTgEFPb|><1}ZdSU~fb((dgdq4^Pe`F-<2xBGgiQ(9@__Yq4 zslo$Fv8McL+)PSg84P?QfY`YP_v{RI5K70Dr8=KLfRwvKnzSK@js zqA+Cn6wPcx?Z35*g~xsGm5HC_b`CAwnNi*TQTa$VyZQ`bkQ#fjtYpJi_98jJh87pu zs0E$V4sLOQe>6Qi3pCYxARFUM@ny2C;5B>?%|d8aNsUsl1f#Es4A2A$4nY6Myd9_5 zXV6vLXqzo9aB~$L%GkKpcqrfAE?GKek~zqJM)7G9*u}uk->B+{|D`&e`s?j#`QYnB z^y4*+S@n;Qr_uQJ2cj%c^WsXtBZe9VG$xo)sW$O~e|rg3=~vaLJo*@a0g(VET{R@c zu|tN%>%m^ZZ7iz~B94w%!oe_o1v zOu<#|?{P%*{aN{|j~%*x3C<;$wT&!Cmz zl%(L#e+_SpqSxHyt4sx;D3HlN`ySL)>&4Ijt-{PAgt^woW*#jcSG>Gi^B=JmHhLA!d5*`@VASaeH~RE*Vo0 z0WVwfN!8c1?J2Bfw5>XI68X%q5k-U$NjGOjf3M0Nya!%pudsdg(@b111xcU}3|wg& z3f$<8EQ?v@%?{H1aJgSgvUmcaoPrGlazt2Iu>hfHRID*A`36T>ukPzuSZIut{%3#e zI{mL>bQJ3!s@9*DR5x&%3a((ujq*!WS-(X!MH66r{#;`4TJtDN6^+Ug>Q>Tq`}}D^ zf2*-VKbdK&*J#WaQbnNlnewOUyp?K)F)}SSAA#x*APZj;IW*zxkeL9r4o45WIpMs1 zP@HTRr(#2TYb0mCNi%1oQ2}6FzVd!AO5r+-E*r)uvvjQU;}QnKft8h2xbZ034=UEM zo(0u4E=^+Ua(2DWf*_fi%k-`n%Bb&2f30leTU`U9<DAO2ETvtjMz8OgH%qr zHQ9!+f}v&-p**mLQ|g9`5OeXCKqMJwUCREqMCdYl@Zu}YYL1=&d0;^#!V?30`)8g? zYO2V#)M&TK3gr*vwWFjvZiF$zvM@hH9~zl(%?>dtz*&9>3Ti=9i1RA8g!|yTfAw7y zKWZ_~6i_NRERY=2i{>JcvJZ-NwsJr#t3ND87;qL)qnX0Ws`l|bFW7?kh#_o-WMonq z?h_e72&*4FLLresHns(de1sB5HKTzk5)k2DQf&RrTvraX`^SQ7FvJ{jI1G^8Yn#yI z^kt!_q^z-)?qqL|B%jPiFj}?)e_-7^=PxDa{Gn0XoD>s(F$OHc)py~{MQcA}t%Pkj zRP)vJWaOqVV^(rO_w^sS(K$ts!|z;@1sDJ56C2hZ%EiSEh<-sQVZ&m6#zAforPB_^ zCXlC9P1%I8X}KX{V(?`drGyPi6bK7cesH8xR3+9|@4Li{58R>FLQ$9df9{@a5_Yg@ z?w#h@M0IL&7YgUIP0vB9^;;0GP_#iso?_g2rW6{K6%h_JD`>({rYp1Rdp=Ta%@9m~ zWnD`GjyCz8cEOtE253@t&hEy-PfwP7XKtNXVLUV}54Wgl(jSZN=SJNz4}zALxM;pj zixe8vv(Fg0`?(E=9IwkUe`VeUw(OKjNqq{1E`drUm0H;Y-@_mTPm))#EAyHb;+t+@owU5Q@=1>@UBNmqbXg0i%aluA@vN0Do$HYf!Y>wHEUrf5GfM3|;ep#Hj~7 zwQ?V1>fNc;0b?&eB{36b@6ld|pe%D0ci%_OlYh_vX0bd_7m|C`g$pnziJLAl(5u1~$RN7N2&K<%w`t-l2 z4VtXUtqDmpL~{$le-#LjyDfUGd_X?<4WEF3*}!ACsK4th0%!wZ3F}Us)B7ql>_BRw z;ayBPlh^Ch;M+*_KqfII+80F{e7<7nOrk{crPT(kyI0`9kv|~f#bsDdC}3V}H{mOb ztbr#)KtTGVmQT)tn!NW4jvcV^0a&VPU4fpfV$)g$UB4U2fBBQrj>O1+#O$#T#7m)w zX8Nu#1nZowcfblWwxaj*jm93U z_eBW>^;iD1ez6$=(ESN18eGDh2OU5mH6YgBJc(CTl)@p|Yh)J*&2jtdY9h$u=CC)H z^n(uEM;V!wC_@ldSZRGz7(o!}Ye4oI6)E!JFk<*%e+t{IH9K_^2YHOfoW3*~vXl{& zNq&X~Y36L+XYY8!K${d9UH(~fSAK5AIs#9B@L)$i;7>`AqcZayd3a#9@58yjL)&F{ zT=6CAi+yk6gqu0mD9nPrV&n7TmWsF(cMkX3Fy>r>GmPQeJ=t&El6EHKPrLg4xSi}~ znIdoae*kFb(-yA%PHQeH74;wEl=oQutS6kRe%e{BPl*1rs z}vJa<#d#SSwF=Bl@`3?sf#es=1ktu7faQrEC z4ueZ^C*m1)dQ`tp!QZUz{9N%5yOPI^*lp8sP5gmq@ z`u1==KiJ$MIp^(cPWmFU8u7DOuaWf&)_HQ$!lQeMP5EX(O1{YP4eG|cR~g;bl_j92 z)CAb_YwzG`v5mE7>S|X3XAmCN%7rU`r2$L!eTphV0NL$%H?p60Z(}2NGV_zxkOTrK ze_zOO?U zkF+)xgpCTngFTY#Omad|v&3IvnYruXs4Dzouy4zh)U1_EerbA8y}9uTQ&dP46Y0fS z9}hGlp=gG~!?wdR!a?VTdC4jpy3>+=V>sqWz-FvuFPqaI21i4ye<99*nzYClerUhE1Hn?fC`=wO6?Sq?f2m&^I44zT z6q|+HM$aZdyetN&X?b~IF-yw*MNce~R*HoX^`Z@tF3z`+72Ovl_gSQI56ihxf$negMV9w;^*l{Q)Nb|m?ZaA-J zdDwk5f+*@+X*+4avE=nM$gwoSDQ~~(l$GjT!NSQQJG^8#o5&~Biz70lw9$|^=^Czs z7qJ+uHG89up|#`jXi?IA^W}pL^t4g_tV++9N5VnHJR*F=(qg;;f9-EDdh&Z&Q|Lr; z5zx9`?_s>IC=3xyGoy`zD@rE)DUH7dEhb8|9a^*~u>jIO(g`?_hWk)!m`EX{E3GqA z>?qw{L1!z*0x#ElEuH^e#}615h;04aYop_XibArbGMUI60C9$1nCu3LY5s9W>SA{z zkX_7*XMTIU3Gy*9e+M1kms#|dOVIX;zA!h`k6l+btw8Zsf0LoA;aAB@*Qm#vPnM-Y z4WoNFG!;R)4R}(0%0>~F&a|VDv*I31n-`mzeJkc=j-2ia9{Zf#!ekqL$oWqhFVbqP zfk;>etAWO8>t8guK1$CJ#FVMePbB(g7N#Wf*rFe71IRR%e`A=U5wC_vtPxVPL8ICa zW91q_IC9xJH1;1!9*}z&Q=!x>)e^8HMDL1*l z8D}vcsI4 zu2hf*uVpv!!B_W=N!*b~k1s)qnV1`#&LSMssa#{3Orsn&Pa{pULxz+>3*s>${x|?Z z1_MI^p_Tmb3P{ooCoJ1Ys?tL1FrFna6zJ`>PI<+w{3`3xU<-RBKlwU zFgQZge|>6TC~2QuFsHCB*dN&Q&r|zsC7P%u4Mwrd7MR7k&aC9<=J!?POQTx6Y>}&@ z`!l|bl2zRyWQQcKbj{Yx*Z#grJm>Mt6sAb@olThMWWwn9bt!~WC@zOBMt*eP#Ft*f z+H3bj6G_mnbkf#C+^&_f`!G%CIJQ9DU=p94f3c^r`EDzvl}5Dy)x-n zF!UCA$A;_z!P>0)9DhkUPDbp`3sJ*30G5^*z+3AtgyP!=oF14x`ZgdJCoQ z@sS5BeCB)#Y8#K7PXFT|=MFVmc!n-#3Hp*zKCG#vyInuNaoqqkK+C^d!`D#wqd+1S zud=h(Z4oh`oSMV8mkls{QNdjb=tg@Z#V3L+Lplq<19wJ_(6bm6gsC_)Yj`~8NS88x z&VONi5y2Jz16LxsUO#%u$%mVW~z!D~-_t95j(7UPPLUo`L&t35<&aL!@( z$=|#HMHFDyS^a_@epgR0G1_Wck!GEDF zLsQBkcO9s+hy4U1s^W0SD4YH6w^J&7kimyFjm5;H$QZT0qMw`{HXUp|#<;|O(1t@y zm`-vh;#~xu+;j{`eAyaH*j~UI`CWiuh8)iM?H1LxQ9T10lC@!@r-)D)O~{0e7Dbf- zyI*fHs;?zXI1ZM%D8ZBiT1*$dkAKqpxfs#eud#A<8L9MVNuDz4c|_7tXJ z&-kdsF$YTmtk1y0XV<@-cQ#Os=Dveqv<#y@EMokD6v~}OjyIi09-M_@8K^?HBnoqO z=5uRn%dRT`%!Dmakvd{;0c^?Y^6Jj18Z%Q?mr#>Tnj0_Xu@5#)&euwRNq->w&HDXzV0HdaAWg}L#^2~Zzf-|k)3VD4%a{Jq%tA|fW}nI#DF+e;t^)T=Wy5p|?bwastN7<1>Z-zySL;JEv456#s^+KVY?8=h zpS?A8E08shE7)wbI&l%=1#>plgj(klcOu1Ew+9eZKaR@Oj0f#}zm>`J}d50 z+}w3J4mD!Oex*Bb;(r<297D8G`+Uo^;}sqX1NmW{1#4cA%^@iu$)?VEr5%#6$9Z5D zUXQUEE$S>=ax~@jW>fN<+vHdRx$6MuqnN&27%!ppY+OP3cCMh=>gZ)JWPhr4Akg3lSVJ8NSQ|A% zW*I3k$@!5ShsS{lqd;U6e06F&ZC|q8vIGV?4Zz?b=a($iU-;B@jmw2l@$8Ksy|lW; zCvfN(6OP{|UMG*Y8OfbZhR^EA8XEdDSKKca?^8|APV?0#H#72k?)<6PZL$@FphlY% z)=r6oS!43bG=J&@xDWeDY3DhXBKlUsp|)rw4B1r#{Um?DA!wuL^vNUuZ{Ih!R& zID#3euC(6?Yqf8^rCC@VQ}Fq{7vysb_BLbCVzuq9bbnedUJN}$x69c5h9TKv(-tz< zvL++EQZeLvkp$1X2LXi-%2Kg%rf$Btlaoq@uY}={teE#(Ex9`ILlWTNV)rjW^z#vgj>| zBowLyow@oHi2&GLt@$}G(z0$57ZzLof+ur^%0 zw(>48eR8E-+Yl~-ecCOb0}9sWfYf$P&j$0ye#C<9BSUl{bx-_0fQ7cK%Q)(_@?RkL zh<`^nmGhV{k-5MbNdx!SXZr)T9u5WFV40PM24M!ikx?Kt#K)+l$sM+X!K>LtCeEha znu0Z$!&}7-Xp|#cT@2wJk}r>xf;O#UT$*2f2@!DH;X6omSgSFq%PO=|!1I3S^>pnqtc)OGW8N4DCLYPzfanr%aX2Rb1tXqQbX zeKd_-S1;(!jx2~M+w1aRyKfa8C`1jPM{4f=jPbmBAWdv8CXF_uU~Ho>*ZEK>UoUCo zl5MU{@hCs7GLBCh%{UCG`|;S1ll8O*%pFGn<>xx@1a>mVc?VUte_**5EW4O1YDvsPRQEDrTuU*)I+#XMCb~ zp`KGmc8o&HW8w*$eD-I1M~!)(8TDj$$>fAmngT+G7o!@C7gHO6@SIzCXx_o zG5v%eBj%7`{aw<%#4quH4yFBw=4sunr~hn?M3b>r)3_?t03ng8a&5&T55Q~~^ubFi zXtiLdO}%H%HbtvVz|nphbG^(*vL#z)KowbhfyY>Q*+3QNpcdG|6o_0{tFiPl`%4$} z)#Ik@=0OCLGDI%p+mYs1Tz`kIfu@>b+PoQ4_z!kHj^|N{$HK`_}P) ze=V#31@)<0mUF9n{pWsjWk|URRC=?Px<;255T4cpi|wq>;ATYxP-ERHD(l)5AG}h$ zpW$4i@L=k-qvEvO3s5}h5RL&;qWlp%#jm|-KZJbK^2IAG*KGdChkrsZYcxFJGp_f? z_OG(3{mY%|0u*9dUmsNo$1%rm2S1f%!Dt_DW)t$u(x~gnz!T&6=kL+%S?;{S9>ghs zr|D#FKTM&%7=}u{qzLaFv>s`tj1PsgwQZf-8}*CgIC$eB53B5a3^wqfK5?b|jL|XR zk)x2oP(rxn=y-bDOMjbz$&=f1XW#yL^`*d<7oy;Zy+c3*j(#Q~MwW8zlA}Ia&v@xri?`1%|QPuZ<+r2giKSU;F$5`Sy%snl@Y^5~C6lCd4d8oett`9q1g}_a-%+I|eYw=V?T6C?Mw&;uSq)3ji2R?fG zNx#R_Onc+ zn%8ZECG>_xpbd|nWR=nS#iB*LVj+b6ZrQbodS1-x4ua&EOt7>1S;lTP=`W@MDhCDS z$MkSS`n~N^V0;n-iJ#YG?)6b7O6Faz<@~&P{C{)$T$d{}TPmV`)&@kj)?u!b2Xx;u z+(Aut-Iv6DSNQwa#9u@R7r+l;L*MoxA=1(&%GGItW#{&kMLiQ&pAC&38rv}7=5Drk z#!R=5VmI>0Jy%#}dv}y5CpvPT+IgKKFBwe4rL?`XvNX3@{rI{p@PCq(AMtyK5L5{@ z=YPukjgQOiJQt@?;9wBlT%44y9`lTc7YnFg!yDMdY8j`Km8w`M(SCy#-9=V)O2wof zDUu8vhGr;kS=OXikl9$dKvr7Ydx*V4SPM3tbymOLp@PCG^L5`Gur5Z@uNNx~xXnrzTfdfTd`f1(3 zl}>VziiL43Mx{slzMSIc;OPJ<9TaFe``v4#cFp7IB4o~?q_%1*B7r-|-(Ou-00uVq zvnmxj9y0*ImCCAjN^fq&$p^EOHLgmbpgC)_lQyED{N5y-X9T;4fOCPXeA}d2Gk?g# z?v$CfqqbX=SBP?v^s+QzVovya4i&QJuT{A&s4!LJ-yk}hI)|YV7=v| z?G$EmvatF;f9XHE8{cgR1Ds<{6Mqw{Fp%zdP1_5{pttFLUGGXQ`{LYMu?{;Y@o<-2 z+=k4N9!*4W$gm%9#AGo*vney5Z^yAg&S`9zdO|htm0V79Sec{FJJzSSHWrW1mcx># zS@ZRr6Ek~o{hrG{(EqR#GXLqxv~2Ko3BS9(GEzIPGaEEQ5~M9SUspTWuz$|e#uW{z zU!lQZ{0pk(CBhZU#!I95g6%=?I*=G$2vv91aa@TOCD;f9_pA(&-Z~(pgci~Q^CZup z=Xud|`#|!!=;K4x!1|3<#eD``;H8WP-RLD65z>H!aP78m-W8se25Oai&Nu6tf+?B^ z!U!NCdWLAEj1%VXh9cD@vsV-MnBnq2j8UVyN{t`-vShMy0g5zU#<{qS><=0Ln-RLb7@U2`7WtByVFMmV0+pkD#WUPvL zG?Uy^D$+)w$%*zKWnvpqyXBUbGC~+DUb77JkSsKSn7^@KuF1u`bDhc11$GljS^d-Z*Nw~KweHDr%GCDMM05dorKH1~+Fsosv<8)tlk zjUSwcu6~)+=%juG<3Ca!o-*QecE*mmwqm$ z^2bkY+aMYkb_MLMgm{J^i_OW*{7aJ3-Q8ccTuXK-avVe1@OKR*FWQhk*-G-VaYOSA$p1}BF#p71}3 z=iW=|9*j@}KN2PfIZ@T_SJ#t?8fX!9Kg(F;UZi2N7X2=2Z-eWmdTLE+^8PZE>#xzv zayVVLOW_NFxpnYT6SwVZZO5*wO!!|8m~>l&>m0xA$b5`!B1q4C1-rlsHC zHQL$lXn#({;zB&|8&RubhySsp8jK=NlK7>q2~IeN>B%&b9rC6Mp9u;$`|Ec&6BI@9 zkwl?pv2TF;s;=EFA$yYuTYjx53M3e?3tcU$eVm<6*l_ZMsWcaa@8z$`u$j(s8@1cSxtODUMP`2oS>f2w0liBA1 zUw_h3W%S9EGaGEc@#`o~%M4fzo4x+?eF4)q?CTdo+sT7`Cc1&##g$jj!itAR4D`nb zId3Akr(G!bi)$HdcjaEs_QqhzfsD#>ld3e5NR8!0FifUp@sv)y#14ySrK_m(V<<$f zN&{a+P8RDKJf!J#%*aUDAnFZzt#v2^Lx0r>c^zy+U;f3l5``E(f4n7ER{) zOF+qB4r(IB3RXEP`WFq|Q<5jL4)buIFA^`c&0N*1lrc%Wc!~6zOwKBKPy*gdPfRw> zIpOZv%4iO4Ut>75EthSye*AvIirNM_xnh|tbd;GcMmn6LQ_Kzy4?Ie^*iZeB-(iLq>aG`W?mFt=Gz zrGO6xMXPc~U!QkrPoXLWDkjKab6a8fbhCsM4T5gSIX&tQc3|ruA7U&p^W;>abz-_I zUfy&aP9+stOh=@pwV5#0QT)q)ihpFD)KgG|9p#=2|0K|*@GC`#C_J}n)35nZPqYsu zbH)AP(BCg8usVmtR~+Q@tYgQR;l)3{#4Tbg7&4AbP;#vd*1?d{4&LLwx-GrpM3Gqz zhPmoiWhX;6M%tAIWBqb#9`wyj=gE!r5zeqM=A&}Ef`4UulU!85GP8*^(SOAA4VB_j zJTmUGv1`?iq(RJ+nT%2&49*F#p z1mK1Nj^STE4vd*>2=}p?rC;*Tk)o5wkznIMPgZScH2jf3fPCOsneqn!Y@fw{pe}SM$b)0@C^&enWB> z;J7t~PRN?aR_kcAor~z+cp4I!L{BxL$vojfQHWphyZ4Dg-<-AZXy0gv-)jKNmnXG( zXr)Xtpqu5}fx~!enotaPUoINA7iVQWyY=tA&*(#Vc|?8sZz0t71%G@x$>FDh@R717 z*ApN5bjbDw0v!@#%8{^9$QAhX*-Fm<=!tJj-NV5*m^AyL7?B9rLqLJAdN-<-J)dH8 zq9>Wp#rQj=+9sh_d7=@_!&)O{%uCpSZuQfd5Tdx=B|lE$r`yJC9p0FJ;ytI!Sva`L zO}7u=?Kt@U{bSg#UVi~jsIH#ECROAGG$nU-T%H)#hLx$Pk^GhF-i6KfC!NuQUF}Jf z$1Hs|AB2zSda_r`o08l6jUY0fkPcsxD4MSCk$giJkgUsv3TUri=RGlA$4`;-p!@56 zt-atm=J+!yZp*t)KH8?n*Eu{MT4fUh+@iB`Ve`w|YBx(ku795oS|1L9WS^P2S}%Rd z2^2SD;46@X?#{cnoe6AV`uxVwELHtN{S^vbmWCcePAJ9$=qU}(da}zIbsut327a!O z!6#!PDnD(Fb|#rAFNcGog*@85+@FJslsQsNk0uJvW2p9iH|tx9#CR%9++sPE?xV?W zB_*m`r5Wy@oqyypPatNHgm4l+aYb2V-lfGPrlOtl>j{P8W;f$3(#J*@RICT0W(c-c z7Q~IhbHjh$lXlenf;^Ahn>2EeMD-~!QXEs_L|^f2Fh;kscTu&k?!kJ)aIsgxn>2u} zY1RTPzIhb*9nFhlL?;K@z}>cAgS=K?ZM94OvsNDE-GANpy5(m=&fKqps^p?B?C!fa z0uAJA6+&L%AiTQaCap4PJ%KU#ae{>MvmGl><&C|n0+w~xQV+mt9sAyi4P2q;Hv!%L zlFyq8cGuA#Kx50lj{GgH*75>OOnM=~)!=H*9krGQTY07FO(6!O*B=*=Gi%^= zx}mZ}SAXigTE2A?@wTq)q>bm!mE;{39HC2KeJAkK^m4~)@`dlOr{UQQ^qsJ!R+spp z=$^QoD&9cZYl%A^ZNezdLs2B0`eU=ji~I#?5WtEkcp)O+O5Uh!^Xbl&Q$3K~t+fOU zjjP-a?(X)MA)>YdruT03!;%oRx$~GGSx|#aoqvl|D%ceqr_;iRFTm5rovKj`@5jh~V|ig_1KoLMx}hPmimF&sN=b}dD8Eikq;!6;u*YJ(vl_XvX> zzkgZd?MTzu6S;}Ez2*8{qtIG|3mb)M{mg*SU@xxy{H;h8_>64?W-i%u>RG!A^a-_s zmtbSvc8a@_lQW}Ws7|_|Z7wiGPJOkR5r{IG-0(afHJW%D$#H8Tq&v$;?KF`|DZ{8_ zLT3`Rs{BoCM=N-=k%{S=O48pg4vFzwqJOos0zv~#-KF9t{0qXsD1N2F+jZvNOhOzp zVd>a`>>FVKdIq#CA^lI@T=!6X`X%-&`E~zY@qz=t?&!J@YmQ%Uuw$$D>cE%zGbkGP0q&_we;rZPZBEXk>fI}%aEeBb5qQfp@L zPhe#;77Bm*?v)bh6PG!mFE!Oizv<@(_Hsps?>xaB-LQi_3?Ayu#8uL&*-Z7KEU^+i z{$!%>*+p&|6Z!jf7c!g&o_hZZ6@Peu#?PX$hE=#2C-+Xsp^&) z<*tH1MfcX6Nc!m=wSfi$LQQY=p1w}6s3asqWvy0Tcz0b2rsff=cRl)|FY-^uK33Ju zuymJBTI=p8dO^(BKv9_}Zc>9P-!78YpK-jq;SBASw{$Jp>JD-SO;2c@b&TO*_ zq39W=(h0l{Aw9RrivU?!18ZKXaq)(eM)xVJ%2x0CFl~iZ=bCq;Hu4I|MSj zdRh64$KYuN)rl9?)o8LljkOBW0cHrn#BvdO*eN>_P=oFF3MV-Q1J=aTzkbLbK!fKQ z%q4*9ujGCoqUluNVt-M=G-W%Nk6=o}=$RPhzju^se#pE~zLhw#+C@D;3Hm7nvwV3S zyg1c_gB+niqJd8xqYPv4@$iKreMzoL!88%RHFysmh?2eeVzQjN^GP2C^%bIHOVTiP zgX&p*_GJ$-W`X=;Nv1GBdA%RNk@G}VIJUDINone@8WR8>U4Ks|-X}ATGc7HM^Hio1 zdbpRQ_whzdHRfgsRz$~8J)quUi<}XX70!oDV>l}^?!If!N-){Sf7fikIuOBzKZw2STn;z}k8j%yONc>*5# z(DvHfq}hvuUw^E4re3a}pNhAw6=k-=a|tUmVgz@3+si7G^Zo6q2D&cM7q#ntsY=?~ zZm`?Rea;I?kxb_$vkC)W6y)S*JkFSwId#EltIt4GrnSTKaU8X!^X*fS!29R~*ROk4 zqNw8AE%*~ae2LgavH+kZjrc|@l_F6j7DCzKOMBrh)PGiaa-~_T?x>{U1?GhW&GpSo zWNmrs4O;2UhOpueFN2L?uc%1gdW6!>)t56?MHF#!ZHuEPv7gr;)m@>=F?@wAC5sV- z^_ml<7yV!tAB1h(#7pXf&{teNb;YnH31xlifI;bFYCE|ja zA^M@y(SIw$M1YmPriC|t-~&nPihtJe9mbhf$N9&aemOa`Pu0W`zXI+_tt#rw$v+EJ z>MMDP$nw_xDu#K&cYmrFQRh;rj{n7I*EV$GH(|x&iS5|vu~YYWpOmNG6kR>7z*>5U z*cQ0K0HLDdi+DXR+VX=YQ@tjB@x>4C8<{n6xqo5D@(Lx}iOcb@#H8mqycVw)Q;*IApCkB~u-H7ZH z(P`uhSb8C3g8I!Naqk{w9NY3UMSgsU{?((lEObp0A(Q+TyI>AVt=+2W^}abO1he+O zc7Hm>Y>7%}gZA`pXCJ1pP-d4pA&}sZ728^KM?-#1BW2g74CsWnjnNz-K*zPUZt|a@ z<)?bo&bF9uPpw65DheesFWzWAOejGHNj!b-w{Yk*D;=siI5_YrPPmxIE2B9cq-OQI z4+xH&E{Qyv)$N?gWX5-?A=POUke+CxpQ+&kTpk*Fw8fBl$~4cReBR?#N>ntvUz*@^vEJivR?a8dU~=+f z&Q)jA)ze8k^r|rq4GLUw&`FdQbvQ7*H$u8e^@Q~h;NO&tmhc#l*yL6I`9F_)Wq*Ey zCCZBx_ME8!6HmgjH>^DzZ~CfZ#)x=R|N>pKgt4(`D0JL5nB5Ow`h1rnFIY22ARf;DBTaFujKHp4R~Mc{a@*dN7z zT8QYu5%xNq3EghWNKhuCbV@K;s@`vJH(^?=QI~W6 zOd6k1UQf#-6i&-c2$YfB*&D=yl0E8h}B^W;s>e}OLgcz?{yg9B$d zg~lxVBf>AryCg_G6#Rfzjlls`p+;{9uOk6mDxlRksm5l}akQhIX5dxws)dIV{PHJb zW;Im0EH!~Dmm~&DHke|P>|$IQ8qmg_2V!g5n(F(R-^C$1Y>P=C(uQefSac!-$vQ#&%ld1WCVf4JHO=%Oot{g%HcbU@FJ zr2Q$?lV8udm7Xnq71!TJ>&ajlKoQJ%4;Wdlf0c*Z)yq9#`DcP_E!tp{NW$X9X{VurRVIZMH?x=G)%p-hOs-Pp`7vAf-D)Z@{T{Hh%aOoD1Sb(ZhV3?Zw0e+ae@2Yyr8x+EgK?{s26AOg*_uLCmgs`_WF}! zuCYS`MT@8Quw33-O9&SIJWP&0nAN9fjOIBF)XL{7kZdDDmYPPwa$qd*TAbh}ra0&Y zr^EU>uf&*MXY+I5N0mTxX<`Dma9n;IzA{g|Uv6_e;Q$Xi-G8MlQt#59vC*8H&N5>n zYng+G>vNr=6{lMvw!plw{da^1#_wapHeg=yl1Ap!mG=6)u)0L|%2nfz(uuIk--(xu zU1KXh7lj)dELnWNGYO+7M@hs=uBUxK$(J|nvaHIL*~wOUm?>$1?y_>?S$78p81dtj z2*Cc_JJCC%`+qW1=YiN1YtDGKoT#ctFu_{+EDQJjjB6D2b)3y}{IO-~gGf=lc5m)spwo+4Vp8VFafIM@|UYBKrG4B0n{GNaRInKs$D7iGyIrW3J4=aC2@V6|~ z)|_=l5@0|PAMlbLNBWyr=|r#=*Xfz{bn}tC30>_K3V(tQ$cZN^lk+X%LCDIdq0Rbw zHWOoH|2!%zp_4h%d{S!wa$cG!hW-^RTX4&kuq8-vPsM8y_$#Z>joG=U<}2y%8{g?= zh)pmJ`zI+_)Zv`KMw`6XoP@+WKCQS;I;0H9=A(wB{w9;}T*J;L+sm`gxLN;S8|Tno z34kck_)3L1^+qP}nNrxTVwr$%T+vwP~=Do%2<|ov$>N}@coHz3%dF1(n$4_V6 z{Ct!uHl0zDCS#(~QaZ=jegqRoV?S()=}ij^a{&*Y1+@TrLi2O$NQk#aW2J(3<=d!Q z0@IF9meP>g2nW6~(+QS^P$seE!r;}yvB^?+Ab)1=8wkoL0e~`~B9fx5nC>;E`dFH8 zJlNx?%3A!!C@_`7l8w2)Dv`-d<|4Y`=5|F?GYVvuOq(!l`j5Nb$vCMdmxD>A91)x(hJaP#A+paSG!c zQN50P%P|%v!vm{#xy0;aUy_fRey@od0K`*2(~g?>kf#BMM#F?PelI+?yFd{ zO{fO1qb0u}-H*h|t;6d?L48DtL2nqMOJhE{L1ZOn(sW&_oqw=^ z=+WFuznK6+P%;FWf|NGj*cF@9uoI^9C$Z1_mpx&H>}!}Hc3^DNQ+2z9@3YQedaBje zg`khv61i#8Hf8s}!&o^J8mkAVc#2>}MST-K+e{*#KKzuve$Yddp74;|I2^>mlbGT&Ek>o#+5?S>|E_5RF9F<{$MUywkRqu%Pe#mV~&2!<~c?pDDZhb%* zw|>Mcz*ob^vmLw~=rwm&M}MB+r`e{_+UAqiYSJJ0A-7UFGRiq3ZPRn-n7x`PaHhFR zUZd&|aY93uXlFnx+AaLU23Svc>z32FLNASF)&S)6R_7b!K$gcs@ozV%aE^XZ zsSM~t_v*-}#fqJ9PE#q0oLOT@p7WDjXC7~SGv~g**R!I$h5cp!L4VB7Kb^6dK@)G^ z4p^Jgf;Ej9-k9^N`6M1K8Gm>BZ-hM&d(*8?Ju|1fIVf|uLir+>k zQ_VN5=xzH|$nYcV*AVrUUdZyu!teqXhY9D@k(MxSrZtlF`9dKXpusV)s7nD+v$`Yh z(XdT?eSz-NBz~R}^nYS&aj4VKxU*!YR0^89JRd0K41&1AyJ#jNB8R2sV}<_Ky<1rr zc3KMOXbuc><0?0Sd9Z1zyF*vv!63CwiG(Og#Xje^>opc0;02e*XPitS-U>-!;euEp zg6((HmylF>wzV&s%CR)pzN(xazw5txG3DEc;V+D}Y114D)PHW}Xlne>ScahoqD=$3 zr5gsq{-@#GH{*L+H5y1*HSIJJe1%_gZ`rO*9EbBSV^HXrS~IYu&>TUJobS0ZBX(6y zXddEoluhqJx>95CS%K!r=YA2nvY zD_vKBA8cT!@ttGogd>}?-5pJ6!5v8SVtNIkcb2GFq=voQkzIBuV-LR37un_VE3(;V z9K>|`y6ah!EUC@@YE-)OrXiTg0}`UQ2)vzMkru^2w|~vByLyQ2DULF-*s(;^tOEW| zXaJ29P0WM;JG3WS;|9x#Di>ekgsDxrq;f7_QiO4N%VM4U8Ux;~I_eZ=lI&>e1ohS% zXi8})xO5gU*8kjc^eTSu*D(v`F{7j~+JRZyV12(hBoP;*{fi^zmwyks9`w!B@+EBo zjtCegQGWr{1cVW9=r{M_=PecUwv_sUfEDvUmso-;(z+bslQRbPhv_Cw4jlf_v zYWJUzlQLb}6#rMdGXrMP+y^goK9Z=;3$uz&%!AygLWka!Fyhlr

    *0(S9O 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

    vt?9Cx0y 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

    -2W7HcyOG2wzh{hqN=o}IJCGlQ(A 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 0$. !eblock + +!split +===== Using gradient descent methods, limitations ===== + +* _Gradient descent (GD) finds local minima of our function_. Since the GD algorithm is deterministic, if it converges, it will converge to a local minimum of our energy function. Because in ML we are often dealing with extremely rugged landscapes with many local minima, this can lead to poor performance. + +* _GD is sensitive to initial conditions_. One consequence of the local nature of GD is that initial conditions matter. Depending on where one starts, one will end up at a different local minima. Therefore, it is very important to think about how one initializes the training process. This is true for GD as well as more complicated variants of GD. + +* _Gradients are computationally expensive to calculate for large datasets_. In many cases in statistics and ML, the energy function is a sum of terms, with one term for each data point. For example, in linear regression, $E \propto \sum_{i=1}^n (y_i - \mathbf{w}^T\cdot\mathbf{x}_i)^2$; for logistic regression, the square error is replaced by the cross entropy. To calculate the gradient we have to sum over *all* $n$ data points. Doing this at every GD step becomes extremely computationally expensive. An ingenious solution to this, is to calculate the gradients using small subsets of the data called ``mini batches''. This has the added benefit of introducing stochasticity into our algorithm. + +* _GD is very sensitive to choices of learning rates_. GD is extremely sensitive to the choice of learning rates. If the learning rate is very small, the training process take an extremely long time. For larger learning rates, GD can diverge and give poor results. Furthermore, depending on what the local landscape looks like, we have to modify the learning rates to ensure convergence. Ideally, we would *adaptively* choose the learning rates to match the landscape. + +* _GD treats all directions in parameter space uniformly._ Another major drawback of GD is that unlike Newton's method, the learning rate for GD is the same in all directions in parameter space. For this reason, the maximum learning rate is set by the behavior of the steepest direction and this can significantly slow down training. Ideally, we would like to take large steps in flat directions and small steps in steep directions. Since we are exploring rugged landscapes where curvatures change, this requires us to keep track of not only the gradient but second derivatives. The ideal scenario would be to calculate the Hessian but this proves to be too computationally expensive. + +* GD can take exponential time to escape saddle points, even with random initialization. As we mentioned, GD is extremely sensitive to initial condition since it determines the particular local minimum GD would eventually reach. However, even with a good initialization scheme, through the introduction of randomness, GD can still take exponential time to escape saddle points. + + +!split +===== Momentum based GD ===== + +The stochastic gradient descent (SGD) is almost always used with a *momentum* or inertia term that serves as a memory of the direction we are moving in parameter space. This is typically +implemented as follows +!bt +\begin{align} +\mathbf{v}_{t}&=\gamma \mathbf{v}_{t-1}+\eta_{t}\nabla_\theta E(\boldsymbol{\theta}_t) \nonumber \\ +\boldsymbol{\theta}_{t+1}&= \boldsymbol{\theta}_t -\mathbf{v}_{t}, +\end{align} +!et +where we have introduced a momentum parameter $\gamma$, with $0\le\gamma\le 1$, and for brevity we dropped the explicit notation to indicate the gradient is to be taken over a different mini-batch at each step. We call this algorithm gradient descent with momentum (GDM). From these equations, it is clear that $\mathbf{v}_t$ is a running average of recently encountered gradients and $(1-\gamma)^{-1}$ sets the characteristic time scale for the memory used in the averaging procedure. Consistent with this, when $\gamma=0$, this just reduces down to ordinary SGD as discussed earlier. An equivalent way of writing the updates is +!bt +\[ +\Delta \boldsymbol{\theta}_{t+1} = \gamma \Delta \boldsymbol{\theta}_t -\ \eta_{t}\nabla_\theta E(\boldsymbol{\theta}_t), +\] +!et +where we have defined $\Delta \boldsymbol{\theta}_{t}= \boldsymbol{\theta}_t-\boldsymbol{\theta}_{t-1}$. + +!split +===== More on momentum based approaches ===== + +Let us try to get more intuition from these equations. It is helpful to consider a simple physical analogy with a particle of mass $m$ moving in a viscous medium with drag coefficient $\mu$ and potential +$E(\mathbf{w})$. If we denote the particle's position by $\mathbf{w}$, then its motion is described by +!bt +\[ +m {d^2 \mathbf{w} \over dt^2} + \mu {d \mathbf{w} \over dt }= -\nabla_w E(\mathbf{w}). +\] +!et +We can discretize this equation in the usual way to get +!bt +\[ +m { \mathbf{w}_{t+\Delta t}-2 \mathbf{w}_{t} +\mathbf{w}_{t-\Delta t} \over (\Delta t)^2}+\mu {\mathbf{w}_{t+\Delta t}- \mathbf{w}_{t} \over \Delta t} = -\nabla_w E(\mathbf{w}). +\] +!et +Rearranging this equation, we can rewrite this as +!bt +\[ +\Delta \mathbf{w}_{t +\Delta t}= - { (\Delta t)^2 \over m +\mu \Delta t} \nabla_w E(\mathbf{w})+ {m \over m +\mu \Delta t} \Delta \mathbf{w}_t. +\] +!et + +!split +===== Momentum parameter ===== +Notice that this equation is identical to previous one if we identify the position of the particle, $\mathbf{w}$, with the parameters $\boldsymbol{\theta}$. This allows +us to identify the momentum parameter and learning rate with the mass of the particle and the viscous drag as: +!bt +\[ +\gamma= {m \over m +\mu \Delta t }, \qquad \eta = {(\Delta t)^2 \over m +\mu \Delta t}. +\] +!et +Thus, as the name suggests, the momentum parameter is proportional to the mass of the particle and effectively provides inertia. Furthermore, in the large viscosity/small learning rate limit, our memory time scales as $(1-\gamma)^{-1} \approx m/(\mu \Delta t)$. + +Why is momentum useful? SGD momentum helps the gradient descent algorithm gain speed in directions with persistent but small gradients even in the presence of stochasticity, while suppressing oscillations in high-curvature directions. This becomes especially important in situations where the landscape is shallow and flat in some directions and narrow and steep in others. It has been argued that first-order methods (with appropriate initial conditions) can perform comparable to more expensive second order methods, especially in the context of complex deep learning models. + +These beneficial properties of momentum can sometimes become even more pronounced by using a slight modification of the classical momentum algorithm called Nesterov Accelerated Gradient (NAG). + +In the NAG algorithm, rather than calculating the gradient at the current parameters, $\nabla_\theta E(\boldsymbol{\theta}_t)$, one calculates the gradient at the expected value of the parameters given our current momentum, $\nabla_\theta E(\boldsymbol{\theta}_t +\gamma \mathbf{v}_{t-1})$. This yields the NAG update rule +!bt +\begin{align} +\mathbf{v}_{t}&=\gamma \mathbf{v}_{t-1}+\eta_{t}\nabla_\theta E(\boldsymbol{\theta}_t +\gamma \mathbf{v}_{t-1}) \nonumber \\ +\boldsymbol{\theta}_{t+1}&= \boldsymbol{\theta}_t -\mathbf{v}_{t}. +\end{align} +!et +One of the major advantages of NAG is that it allows for the use of a larger learning rate than GDM for the same choice of $\gamma$. + + +!split +===== Second moment of the gradient ===== + + +In stochastic gradient descent, with and without momentum, we still +have to specify a schedule for tuning the learning rates $\eta_t$ +as a function of time. As discussed in the context of Newton's +method, this presents a number of dilemmas. The learning rate is +limited by the steepest direction which can change depending on the +current position in the landscape. To circumvent this problem, ideally +our algorithm would keep track of curvature and take large steps in +shallow, flat directions and small steps in steep, narrow directions. +Second-order methods accomplish this by calculating or approximating +the Hessian and normalizing the learning rate by the +curvature. However, this is very computationally expensive for +extremely large models. Ideally, we would like to be able to +adaptively change the step size to match the landscape without paying +the steep computational price of calculating or approximating +Hessians. + +Recently, a number of methods have been introduced that accomplish this by tracking not only the gradient, but also the second moment of the gradient. These methods include AdaGrad, AdaDelta, RMS-Prop, and ADAM. + +!split +===== RMS prop ===== + +In RMS prop, in addition to keeping a running average of the first moment of the gradient, we also keep track of the second moment denoted by $\mathbf{s}_t=\mathbb{E}[\mathbf{g}_t^2]$. The update rule for RMS prop is given by +!bt +\begin{align} +\mathbf{g}_t &= \nabla_\theta E(\boldsymbol{\theta}) \\ +\mathbf{s}_t &=\beta \mathbf{s}_{t-1} +(1-\beta)\mathbf{g}_t^2 \nonumber \\ +\boldsymbol{\theta}_{t+1}&=&\boldsymbol{\theta}_t - \eta_t { \mathbf{g}_t \over \sqrt{\mathbf{s}_t +\epsilon}}, \nonumber +\end{align} +!et +where $\beta$ controls the averaging time of the second moment and is typically taken to be about $\beta=0.9$, $\eta_t$ is a learning rate typically chosen to be $10^{-3}$, and $\epsilon\sim 10^{-8} $ is a small regularization constant to prevent divergences. Multiplication and division by vectors is understood as an element-wise operation. It is clear from this formula that the learning rate is reduced in directions where the norm of the gradient is consistently large. This greatly speeds up the convergence by allowing us to use a larger learning rate for flat directions. + + +!split +===== ADAM optimizer ===== + +A related algorithm is the ADAM optimizer. In ADAM, we keep a running average of both the first and second moment of the gradient and use this information to adaptively change the learning rate for different parameters. In addition to keeping a running average of the first and second moments of the gradient (i.e. $\mathbf{m}_t=\mathbb{E}[\mathbf{g}_t]$ and $\mathbf{s}_t=\mathbb{E}[\mathbf{g}^2_t]$, respectively), ADAM performs an additional bias correction to account for the fact that we are estimating the first two moments of the gradient using a running average (denoted by the hats in the update rule below). The update rule for ADAM is given by (where multiplication and division are once again understood to be element-wise operations below) +!bt +\begin{align} +\mathbf{g}_t &= \nabla_\theta E(\boldsymbol{\theta}) \\ +\mathbf{m}_t &= \beta_1 \mathbf{m}_{t-1} + (1-\beta_1) \mathbf{g}_t \nonumber \\ +\mathbf{s}_t &=\beta_2 \mathbf{s}_{t-1} +(1-\beta_2)\mathbf{g}_t^2 \nonumber \\ +\hat{\mathbf{m}}_t&={\mathbf{m}_t \over 1-\beta_1^t} \nonumber \\ +\hat{\mathbf{s}}_t &={\mathbf{s}_t \over1-\beta_2^t} \nonumber \\ +\boldsymbol{\theta}_{t+1}&=\boldsymbol{\theta}_t - \eta_t { \hat{\mathbf{m}}_t \over \sqrt{\hat{\mathbf{s}}_t} +\epsilon}, \nonumber \\ +\end{align} +!et +where $\beta_1$ and $\beta_2$ set the memory lifetime of the first and second moment and are typically taken to be $0.9$ and $0.99$ respectively, and $\eta$ and $\epsilon$ are identical to RMSprop. + +Like in RMSprop, the effective step size of a parameter depends on the magnitude of its gradient squared. To understand this better, let us rewrite this expression in terms of the variance $\boldsymbol{\sigma}_t^2 = \hat{\mathbf{s}}_t - (\hat{\mathbf{m}}_t)^2$. Consider a single parameter $\theta_t$. The update rule for this parameter is given by +!bt +\[ +\Delta \theta_{t+1}= -\eta_t { \hat{m}_t \over \sqrt{\sigma_t^2 + m_t^2 }+\epsilon}. +\] +!et + + + + +!split +===== Practical tips ===== + +* _Randomize the data when making mini-batches_. It is always important to randomly shuffle the data when forming mini-batches. Otherwise, the gradient descent method can fit spurious correlations resulting from the order in which data is presented. + +* _Transform your inputs_. Learning becomes difficult when our landscape has a mixture of steep and flat directions. One simple trick for minimizing these situations is to standardize the data by subtracting the mean and normalizing the variance of input variables. Whenever possible, also decorrelate the inputs. To understand why this is helpful, consider the case of linear regression. It is easy to show that for the squared error cost function, the Hessian of the energy matrix is just the correlation matrix between the inputs. Thus, by standardizing the inputs, we are ensuring that the landscape looks homogeneous in all directions in parameter space. Since most deep networks can be viewed as linear transformations followed by a non-linearity at each layer, we expect this intuition to hold beyond the linear case. + +* _Monitor the out-of-sample performance._ Always monitor the performance of your model on a validation set (a small portion of the training data that is held out of the training process to serve as a proxy for the test set. If the validation error starts increasing, then the model is beginning to overfit. Terminate the learning process. This *early stopping* significantly improves performance in many settings. + +* _Adaptive optimization methods don't always have good generalization._ Recent studies have shown that adaptive methods such as ADAM, RMSPorp, and AdaGrad tend to have poor generalization compared to SGD or SGD with momentum, particularly in the high-dimensional limit (i.e. the number of parameters exceeds the number of data points). Although it is not clear at this stage why these methods perform so well in training deep neural networks, simpler procedures like properly-tuned SGD may work as well or better in these applications. + +Geron's text, see chapter 11, has several interesting discussions. +