From bbdc10814d23018249ad554f4949f5878334d67f Mon Sep 17 00:00:00 2001 From: Morten Hjorth-Jensen Date: Sun, 7 Sep 2025 13:50:43 +0200 Subject: [PATCH] update --- doc/pub/week37/html/._week37-bs000.html | 99 +++-- doc/pub/week37/html/._week37-bs001.html | 99 +++-- doc/pub/week37/html/._week37-bs002.html | 101 +++-- doc/pub/week37/html/._week37-bs003.html | 99 +++-- doc/pub/week37/html/._week37-bs004.html | 99 +++-- doc/pub/week37/html/._week37-bs005.html | 99 +++-- doc/pub/week37/html/._week37-bs006.html | 99 +++-- doc/pub/week37/html/._week37-bs007.html | 99 +++-- doc/pub/week37/html/._week37-bs008.html | 99 +++-- doc/pub/week37/html/._week37-bs009.html | 99 +++-- doc/pub/week37/html/._week37-bs010.html | 99 +++-- doc/pub/week37/html/._week37-bs011.html | 99 +++-- doc/pub/week37/html/._week37-bs012.html | 99 +++-- doc/pub/week37/html/._week37-bs013.html | 99 +++-- doc/pub/week37/html/._week37-bs014.html | 99 +++-- doc/pub/week37/html/._week37-bs015.html | 99 +++-- doc/pub/week37/html/._week37-bs016.html | 107 +++-- doc/pub/week37/html/._week37-bs017.html | 99 +++-- doc/pub/week37/html/._week37-bs018.html | 130 +++--- doc/pub/week37/html/._week37-bs019.html | 119 ++--- doc/pub/week37/html/._week37-bs020.html | 129 +++--- doc/pub/week37/html/._week37-bs021.html | 138 +++--- doc/pub/week37/html/._week37-bs022.html | 124 +++--- doc/pub/week37/html/._week37-bs023.html | 155 +++---- doc/pub/week37/html/._week37-bs024.html | 132 +++--- doc/pub/week37/html/._week37-bs025.html | 121 ++--- doc/pub/week37/html/._week37-bs026.html | 132 +++--- doc/pub/week37/html/._week37-bs027.html | 201 +++------ doc/pub/week37/html/._week37-bs028.html | 114 +++-- doc/pub/week37/html/._week37-bs029.html | 177 +++++--- doc/pub/week37/html/._week37-bs030.html | 201 ++++++--- doc/pub/week37/html/._week37-bs031.html | 153 +++---- doc/pub/week37/html/._week37-bs032.html | 148 ++++--- doc/pub/week37/html/._week37-bs033.html | 139 +++--- doc/pub/week37/html/._week37-bs034.html | 183 ++++---- doc/pub/week37/html/._week37-bs035.html | 124 ++++-- doc/pub/week37/html/._week37-bs036.html | 133 ++++-- doc/pub/week37/html/._week37-bs037.html | 214 +++++---- doc/pub/week37/html/._week37-bs038.html | 191 ++++---- doc/pub/week37/html/._week37-bs039.html | 168 +++---- doc/pub/week37/html/._week37-bs040.html | 143 +++--- doc/pub/week37/html/._week37-bs041.html | 155 +++---- doc/pub/week37/html/._week37-bs042.html | 163 ++++--- doc/pub/week37/html/._week37-bs043.html | 160 ++++--- doc/pub/week37/html/._week37-bs044.html | 128 +++--- doc/pub/week37/html/._week37-bs045.html | 188 +++++--- doc/pub/week37/html/._week37-bs046.html | 421 ++++++++---------- doc/pub/week37/html/._week37-bs047.html | 398 ++++++----------- doc/pub/week37/html/week37-bs.html | 99 +++-- doc/pub/week37/html/week37-reveal.html | 155 ++++--- doc/pub/week37/html/week37-solarized.html | 182 ++++---- doc/pub/week37/html/week37.html | 182 ++++---- doc/pub/week37/ipynb/ipynb-week37-src.tar.gz | Bin 192 -> 492464 bytes doc/pub/week37/ipynb/week37.ipynb | 439 +++++++++++-------- doc/src/week37/week37.do.txt | 143 +++--- 55 files changed, 4427 insertions(+), 3647 deletions(-) diff --git a/doc/pub/week37/html/._week37-bs000.html b/doc/pub/week37/html/._week37-bs000.html index 541ecc814..cfe72140a 100644 --- a/doc/pub/week37/html/._week37-bs000.html +++ b/doc/pub/week37/html/._week37-bs000.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -300,7 +319,7 @@ MathJax.Hub.Config({
  • 9
  • 10
  • ...
  • -
  • 46
  • +
  • 48
  • »
  • diff --git a/doc/pub/week37/html/._week37-bs001.html b/doc/pub/week37/html/._week37-bs001.html index 3edf27444..8ce33a94c 100644 --- a/doc/pub/week37/html/._week37-bs001.html +++ b/doc/pub/week37/html/._week37-bs001.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -291,7 +310,7 @@ MathJax.Hub.Config({
  • 10
  • 11
  • ...
  • -
  • 46
  • +
  • 48
  • »
  • diff --git a/doc/pub/week37/html/._week37-bs002.html b/doc/pub/week37/html/._week37-bs002.html index f673291cf..56c23018e 100644 --- a/doc/pub/week37/html/._week37-bs002.html +++ b/doc/pub/week37/html/._week37-bs002.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -263,7 +282,7 @@ MathJax.Hub.Config({
      -
    1. Recommended: Goodfellow et al, Deep Learning, introduction to gradient descent, see sections 4.3-4.5 at https://www.deeplearningbook.org/contents/numerical.html and chapter 8.3-8.5 at URL::https://www.deeplearningbook.org/contents/optimization.html"
    2. +
    3. Recommended: Goodfellow et al, Deep Learning, introduction to gradient descent, see sections 4.3-4.5 at https://www.deeplearningbook.org/contents/numerical.html and chapter 8.3-8.5 at https://www.deeplearningbook.org/contents/optimization.html
    4. Rashcka et al, pages 37-44 and pages 278-283 with focus on linear regression.
    5. Video on gradient descent at https://www.youtube.com/watch?v=sDv4f4s2SB8
    6. Video on Stochastic gradient descent at https://www.youtube.com/watch?v=vMh0zPT0tLI
    7. @@ -289,7 +308,7 @@ MathJax.Hub.Config({
    8. 11
    9. 12
    10. ...
    11. -
    12. 46
    13. +
    14. 48
    15. »
    16. diff --git a/doc/pub/week37/html/._week37-bs003.html b/doc/pub/week37/html/._week37-bs003.html index ccb14f2ac..fca95acdf 100644 --- a/doc/pub/week37/html/._week37-bs003.html +++ b/doc/pub/week37/html/._week37-bs003.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    17. Program example for gradient descent with Ridge Regression
    18. Using gradient descent methods, limitations
    19. Improving gradient descent with momentum
    20. -
    21. Same code but now with momentum gradient descent
    22. -
    23. Overview video on Stochastic Gradient Descent
    24. +
    25. Same code but now with momentum gradient descent
    26. +
    27. Overview video on Stochastic Gradient Descent (SGD)
    28. Batches and mini-batches
    29. -
    30. Stochastic Gradient Descent (SGD)
    31. -
    32. Stochastic Gradient Descent
    33. -
    34. Computation of gradients
    35. -
    36. SGD example
    37. -
    38. The gradient step
    39. -
    40. Simple example code
    41. -
    42. When do we stop?
    43. -
    44. Slightly different approach
    45. -
    46. Time decay rate
    47. -
    48. Code with a Number of Minibatches which varies
    49. -
    50. Replace or not
    51. -
    52. Momentum based GD
    53. -
    54. More on momentum based approaches
    55. -
    56. Momentum parameter
    57. -
    58. Second moment of the gradient
    59. -
    60. RMS prop
    61. -
    62. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    63. -
    64. Algorithms and codes for Adagrad, RMSprop and Adam
    65. -
    66. Practical tips
    67. -
    68. Sneaking in automatic differentiation using Autograd
    69. -
    70. Same code but now with momentum gradient descent
    71. -
    72. But none of these can compete with Newton's method
    73. -
    74. Including Stochastic Gradient Descent with Autograd
    75. -
    76. Same code but now with momentum gradient descent
    77. -
    78. Similar (second order function now) problem but now with AdaGrad
    79. -
    80. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    81. -
    82. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    83. -
    84. Material for the lab sessions
    85. +
    86. Pros and cons
    87. +
    88. Convergence rates
    89. +
    90. Accuracy
    91. +
    92. Stochastic Gradient Descent (SGD)
    93. +
    94. Stochastic Gradient Descent
    95. +
    96. Computation of gradients
    97. +
    98. SGD example
    99. +
    100. The gradient step
    101. +
    102. Simple example code
    103. +
    104. When do we stop?
    105. +
    106. Slightly different approach
    107. +
    108. Time decay rate
    109. +
    110. Code with a Number of Minibatches which varies
    111. +
    112. Replace or not
    113. +
    114. Momentum based GD
    115. +
    116. More on momentum based approaches
    117. +
    118. Momentum parameter
    119. +
    120. Second moment of the gradient
    121. +
    122. RMS prop
    123. +
    124. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    125. +
    126. Algorithms and codes for Adagrad, RMSprop and Adam
    127. +
    128. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    129. +
    130. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    131. +
    132. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    133. +
    134. Practical tips
    135. +
    136. Sneaking in auotmatic differentiation using Autograd
    137. +
    138. Same code but now with momentum gradient descent
    139. +
    140. Including Stochastic Gradient Descent with Autograd
    141. +
    142. Same code but now with momentum gradient descent
    143. +
    144. Similar (second order function now) problem but now with AdaGrad
    145. +
    146. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    147. +
    148. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    149. +
    150. Material for the lab sessions
    151. @@ -278,7 +297,7 @@ MathJax.Hub.Config({
    152. 12
    153. 13
    154. ...
    155. -
    156. 46
    157. +
    158. 48
    159. »
    160. diff --git a/doc/pub/week37/html/._week37-bs004.html b/doc/pub/week37/html/._week37-bs004.html index 5136d1a63..db8020187 100644 --- a/doc/pub/week37/html/._week37-bs004.html +++ b/doc/pub/week37/html/._week37-bs004.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    161. Program example for gradient descent with Ridge Regression
    162. Using gradient descent methods, limitations
    163. Improving gradient descent with momentum
    164. -
    165. Same code but now with momentum gradient descent
    166. -
    167. Overview video on Stochastic Gradient Descent
    168. +
    169. Same code but now with momentum gradient descent
    170. +
    171. Overview video on Stochastic Gradient Descent (SGD)
    172. Batches and mini-batches
    173. -
    174. Stochastic Gradient Descent (SGD)
    175. -
    176. Stochastic Gradient Descent
    177. -
    178. Computation of gradients
    179. -
    180. SGD example
    181. -
    182. The gradient step
    183. -
    184. Simple example code
    185. -
    186. When do we stop?
    187. -
    188. Slightly different approach
    189. -
    190. Time decay rate
    191. -
    192. Code with a Number of Minibatches which varies
    193. -
    194. Replace or not
    195. -
    196. Momentum based GD
    197. -
    198. More on momentum based approaches
    199. -
    200. Momentum parameter
    201. -
    202. Second moment of the gradient
    203. -
    204. RMS prop
    205. -
    206. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    207. -
    208. Algorithms and codes for Adagrad, RMSprop and Adam
    209. -
    210. Practical tips
    211. -
    212. Sneaking in automatic differentiation using Autograd
    213. -
    214. Same code but now with momentum gradient descent
    215. -
    216. But none of these can compete with Newton's method
    217. -
    218. Including Stochastic Gradient Descent with Autograd
    219. -
    220. Same code but now with momentum gradient descent
    221. -
    222. Similar (second order function now) problem but now with AdaGrad
    223. -
    224. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    225. -
    226. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    227. -
    228. Material for the lab sessions
    229. +
    230. Pros and cons
    231. +
    232. Convergence rates
    233. +
    234. Accuracy
    235. +
    236. Stochastic Gradient Descent (SGD)
    237. +
    238. Stochastic Gradient Descent
    239. +
    240. Computation of gradients
    241. +
    242. SGD example
    243. +
    244. The gradient step
    245. +
    246. Simple example code
    247. +
    248. When do we stop?
    249. +
    250. Slightly different approach
    251. +
    252. Time decay rate
    253. +
    254. Code with a Number of Minibatches which varies
    255. +
    256. Replace or not
    257. +
    258. Momentum based GD
    259. +
    260. More on momentum based approaches
    261. +
    262. Momentum parameter
    263. +
    264. Second moment of the gradient
    265. +
    266. RMS prop
    267. +
    268. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    269. +
    270. Algorithms and codes for Adagrad, RMSprop and Adam
    271. +
    272. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    273. +
    274. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    275. +
    276. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    277. +
    278. Practical tips
    279. +
    280. Sneaking in auotmatic differentiation using Autograd
    281. +
    282. Same code but now with momentum gradient descent
    283. +
    284. Including Stochastic Gradient Descent with Autograd
    285. +
    286. Same code but now with momentum gradient descent
    287. +
    288. Similar (second order function now) problem but now with AdaGrad
    289. +
    290. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    291. +
    292. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    293. +
    294. Material for the lab sessions
    295. @@ -329,7 +348,7 @@ $$
    296. 13
    297. 14
    298. ...
    299. -
    300. 46
    301. +
    302. 48
    303. »
    304. diff --git a/doc/pub/week37/html/._week37-bs005.html b/doc/pub/week37/html/._week37-bs005.html index a2b3478ab..beec70c4e 100644 --- a/doc/pub/week37/html/._week37-bs005.html +++ b/doc/pub/week37/html/._week37-bs005.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    305. Program example for gradient descent with Ridge Regression
    306. Using gradient descent methods, limitations
    307. Improving gradient descent with momentum
    308. -
    309. Same code but now with momentum gradient descent
    310. -
    311. Overview video on Stochastic Gradient Descent
    312. +
    313. Same code but now with momentum gradient descent
    314. +
    315. Overview video on Stochastic Gradient Descent (SGD)
    316. Batches and mini-batches
    317. -
    318. Stochastic Gradient Descent (SGD)
    319. -
    320. Stochastic Gradient Descent
    321. -
    322. Computation of gradients
    323. -
    324. SGD example
    325. -
    326. The gradient step
    327. -
    328. Simple example code
    329. -
    330. When do we stop?
    331. -
    332. Slightly different approach
    333. -
    334. Time decay rate
    335. -
    336. Code with a Number of Minibatches which varies
    337. -
    338. Replace or not
    339. -
    340. Momentum based GD
    341. -
    342. More on momentum based approaches
    343. -
    344. Momentum parameter
    345. -
    346. Second moment of the gradient
    347. -
    348. RMS prop
    349. -
    350. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    351. -
    352. Algorithms and codes for Adagrad, RMSprop and Adam
    353. -
    354. Practical tips
    355. -
    356. Sneaking in automatic differentiation using Autograd
    357. -
    358. Same code but now with momentum gradient descent
    359. -
    360. But none of these can compete with Newton's method
    361. -
    362. Including Stochastic Gradient Descent with Autograd
    363. -
    364. Same code but now with momentum gradient descent
    365. -
    366. Similar (second order function now) problem but now with AdaGrad
    367. -
    368. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    369. -
    370. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    371. -
    372. Material for the lab sessions
    373. +
    374. Pros and cons
    375. +
    376. Convergence rates
    377. +
    378. Accuracy
    379. +
    380. Stochastic Gradient Descent (SGD)
    381. +
    382. Stochastic Gradient Descent
    383. +
    384. Computation of gradients
    385. +
    386. SGD example
    387. +
    388. The gradient step
    389. +
    390. Simple example code
    391. +
    392. When do we stop?
    393. +
    394. Slightly different approach
    395. +
    396. Time decay rate
    397. +
    398. Code with a Number of Minibatches which varies
    399. +
    400. Replace or not
    401. +
    402. Momentum based GD
    403. +
    404. More on momentum based approaches
    405. +
    406. Momentum parameter
    407. +
    408. Second moment of the gradient
    409. +
    410. RMS prop
    411. +
    412. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    413. +
    414. Algorithms and codes for Adagrad, RMSprop and Adam
    415. +
    416. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    417. +
    418. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    419. +
    420. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    421. +
    422. Practical tips
    423. +
    424. Sneaking in auotmatic differentiation using Autograd
    425. +
    426. Same code but now with momentum gradient descent
    427. +
    428. Including Stochastic Gradient Descent with Autograd
    429. +
    430. Same code but now with momentum gradient descent
    431. +
    432. Similar (second order function now) problem but now with AdaGrad
    433. +
    434. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    435. +
    436. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    437. +
    438. Material for the lab sessions
    439. @@ -298,7 +317,7 @@ $$
    440. 14
    441. 15
    442. ...
    443. -
    444. 46
    445. +
    446. 48
    447. »
    448. diff --git a/doc/pub/week37/html/._week37-bs006.html b/doc/pub/week37/html/._week37-bs006.html index f42693ebf..e8de7baf5 100644 --- a/doc/pub/week37/html/._week37-bs006.html +++ b/doc/pub/week37/html/._week37-bs006.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    449. Program example for gradient descent with Ridge Regression
    450. Using gradient descent methods, limitations
    451. Improving gradient descent with momentum
    452. -
    453. Same code but now with momentum gradient descent
    454. -
    455. Overview video on Stochastic Gradient Descent
    456. +
    457. Same code but now with momentum gradient descent
    458. +
    459. Overview video on Stochastic Gradient Descent (SGD)
    460. Batches and mini-batches
    461. -
    462. Stochastic Gradient Descent (SGD)
    463. -
    464. Stochastic Gradient Descent
    465. -
    466. Computation of gradients
    467. -
    468. SGD example
    469. -
    470. The gradient step
    471. -
    472. Simple example code
    473. -
    474. When do we stop?
    475. -
    476. Slightly different approach
    477. -
    478. Time decay rate
    479. -
    480. Code with a Number of Minibatches which varies
    481. -
    482. Replace or not
    483. -
    484. Momentum based GD
    485. -
    486. More on momentum based approaches
    487. -
    488. Momentum parameter
    489. -
    490. Second moment of the gradient
    491. -
    492. RMS prop
    493. -
    494. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    495. -
    496. Algorithms and codes for Adagrad, RMSprop and Adam
    497. -
    498. Practical tips
    499. -
    500. Sneaking in automatic differentiation using Autograd
    501. -
    502. Same code but now with momentum gradient descent
    503. -
    504. But none of these can compete with Newton's method
    505. -
    506. Including Stochastic Gradient Descent with Autograd
    507. -
    508. Same code but now with momentum gradient descent
    509. -
    510. Similar (second order function now) problem but now with AdaGrad
    511. -
    512. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    513. -
    514. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    515. -
    516. Material for the lab sessions
    517. +
    518. Pros and cons
    519. +
    520. Convergence rates
    521. +
    522. Accuracy
    523. +
    524. Stochastic Gradient Descent (SGD)
    525. +
    526. Stochastic Gradient Descent
    527. +
    528. Computation of gradients
    529. +
    530. SGD example
    531. +
    532. The gradient step
    533. +
    534. Simple example code
    535. +
    536. When do we stop?
    537. +
    538. Slightly different approach
    539. +
    540. Time decay rate
    541. +
    542. Code with a Number of Minibatches which varies
    543. +
    544. Replace or not
    545. +
    546. Momentum based GD
    547. +
    548. More on momentum based approaches
    549. +
    550. Momentum parameter
    551. +
    552. Second moment of the gradient
    553. +
    554. RMS prop
    555. +
    556. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    557. +
    558. Algorithms and codes for Adagrad, RMSprop and Adam
    559. +
    560. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    561. +
    562. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    563. +
    564. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    565. +
    566. Practical tips
    567. +
    568. Sneaking in auotmatic differentiation using Autograd
    569. +
    570. Same code but now with momentum gradient descent
    571. +
    572. Including Stochastic Gradient Descent with Autograd
    573. +
    574. Same code but now with momentum gradient descent
    575. +
    576. Similar (second order function now) problem but now with AdaGrad
    577. +
    578. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    579. +
    580. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    581. +
    582. Material for the lab sessions
    583. @@ -290,7 +309,7 @@ $$
    584. 15
    585. 16
    586. ...
    587. -
    588. 46
    589. +
    590. 48
    591. »
    592. diff --git a/doc/pub/week37/html/._week37-bs007.html b/doc/pub/week37/html/._week37-bs007.html index 71994bda6..b6b3a1230 100644 --- a/doc/pub/week37/html/._week37-bs007.html +++ b/doc/pub/week37/html/._week37-bs007.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    593. Program example for gradient descent with Ridge Regression
    594. Using gradient descent methods, limitations
    595. Improving gradient descent with momentum
    596. -
    597. Same code but now with momentum gradient descent
    598. -
    599. Overview video on Stochastic Gradient Descent
    600. +
    601. Same code but now with momentum gradient descent
    602. +
    603. Overview video on Stochastic Gradient Descent (SGD)
    604. Batches and mini-batches
    605. -
    606. Stochastic Gradient Descent (SGD)
    607. -
    608. Stochastic Gradient Descent
    609. -
    610. Computation of gradients
    611. -
    612. SGD example
    613. -
    614. The gradient step
    615. -
    616. Simple example code
    617. -
    618. When do we stop?
    619. -
    620. Slightly different approach
    621. -
    622. Time decay rate
    623. -
    624. Code with a Number of Minibatches which varies
    625. -
    626. Replace or not
    627. -
    628. Momentum based GD
    629. -
    630. More on momentum based approaches
    631. -
    632. Momentum parameter
    633. -
    634. Second moment of the gradient
    635. -
    636. RMS prop
    637. -
    638. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    639. -
    640. Algorithms and codes for Adagrad, RMSprop and Adam
    641. -
    642. Practical tips
    643. -
    644. Sneaking in automatic differentiation using Autograd
    645. -
    646. Same code but now with momentum gradient descent
    647. -
    648. But none of these can compete with Newton's method
    649. -
    650. Including Stochastic Gradient Descent with Autograd
    651. -
    652. Same code but now with momentum gradient descent
    653. -
    654. Similar (second order function now) problem but now with AdaGrad
    655. -
    656. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    657. -
    658. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    659. -
    660. Material for the lab sessions
    661. +
    662. Pros and cons
    663. +
    664. Convergence rates
    665. +
    666. Accuracy
    667. +
    668. Stochastic Gradient Descent (SGD)
    669. +
    670. Stochastic Gradient Descent
    671. +
    672. Computation of gradients
    673. +
    674. SGD example
    675. +
    676. The gradient step
    677. +
    678. Simple example code
    679. +
    680. When do we stop?
    681. +
    682. Slightly different approach
    683. +
    684. Time decay rate
    685. +
    686. Code with a Number of Minibatches which varies
    687. +
    688. Replace or not
    689. +
    690. Momentum based GD
    691. +
    692. More on momentum based approaches
    693. +
    694. Momentum parameter
    695. +
    696. Second moment of the gradient
    697. +
    698. RMS prop
    699. +
    700. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    701. +
    702. Algorithms and codes for Adagrad, RMSprop and Adam
    703. +
    704. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    705. +
    706. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    707. +
    708. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    709. +
    710. Practical tips
    711. +
    712. Sneaking in auotmatic differentiation using Autograd
    713. +
    714. Same code but now with momentum gradient descent
    715. +
    716. Including Stochastic Gradient Descent with Autograd
    717. +
    718. Same code but now with momentum gradient descent
    719. +
    720. Similar (second order function now) problem but now with AdaGrad
    721. +
    722. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    723. +
    724. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    725. +
    726. Material for the lab sessions
    727. @@ -291,7 +310,7 @@ $$
    728. 16
    729. 17
    730. ...
    731. -
    732. 46
    733. +
    734. 48
    735. »
    736. diff --git a/doc/pub/week37/html/._week37-bs008.html b/doc/pub/week37/html/._week37-bs008.html index 4cc405564..67e684b22 100644 --- a/doc/pub/week37/html/._week37-bs008.html +++ b/doc/pub/week37/html/._week37-bs008.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    737. Program example for gradient descent with Ridge Regression
    738. Using gradient descent methods, limitations
    739. Improving gradient descent with momentum
    740. -
    741. Same code but now with momentum gradient descent
    742. -
    743. Overview video on Stochastic Gradient Descent
    744. +
    745. Same code but now with momentum gradient descent
    746. +
    747. Overview video on Stochastic Gradient Descent (SGD)
    748. Batches and mini-batches
    749. -
    750. Stochastic Gradient Descent (SGD)
    751. -
    752. Stochastic Gradient Descent
    753. -
    754. Computation of gradients
    755. -
    756. SGD example
    757. -
    758. The gradient step
    759. -
    760. Simple example code
    761. -
    762. When do we stop?
    763. -
    764. Slightly different approach
    765. -
    766. Time decay rate
    767. -
    768. Code with a Number of Minibatches which varies
    769. -
    770. Replace or not
    771. -
    772. Momentum based GD
    773. -
    774. More on momentum based approaches
    775. -
    776. Momentum parameter
    777. -
    778. Second moment of the gradient
    779. -
    780. RMS prop
    781. -
    782. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    783. -
    784. Algorithms and codes for Adagrad, RMSprop and Adam
    785. -
    786. Practical tips
    787. -
    788. Sneaking in automatic differentiation using Autograd
    789. -
    790. Same code but now with momentum gradient descent
    791. -
    792. But none of these can compete with Newton's method
    793. -
    794. Including Stochastic Gradient Descent with Autograd
    795. -
    796. Same code but now with momentum gradient descent
    797. -
    798. Similar (second order function now) problem but now with AdaGrad
    799. -
    800. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    801. -
    802. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    803. -
    804. Material for the lab sessions
    805. +
    806. Pros and cons
    807. +
    808. Convergence rates
    809. +
    810. Accuracy
    811. +
    812. Stochastic Gradient Descent (SGD)
    813. +
    814. Stochastic Gradient Descent
    815. +
    816. Computation of gradients
    817. +
    818. SGD example
    819. +
    820. The gradient step
    821. +
    822. Simple example code
    823. +
    824. When do we stop?
    825. +
    826. Slightly different approach
    827. +
    828. Time decay rate
    829. +
    830. Code with a Number of Minibatches which varies
    831. +
    832. Replace or not
    833. +
    834. Momentum based GD
    835. +
    836. More on momentum based approaches
    837. +
    838. Momentum parameter
    839. +
    840. Second moment of the gradient
    841. +
    842. RMS prop
    843. +
    844. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    845. +
    846. Algorithms and codes for Adagrad, RMSprop and Adam
    847. +
    848. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    849. +
    850. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    851. +
    852. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    853. +
    854. Practical tips
    855. +
    856. Sneaking in auotmatic differentiation using Autograd
    857. +
    858. Same code but now with momentum gradient descent
    859. +
    860. Including Stochastic Gradient Descent with Autograd
    861. +
    862. Same code but now with momentum gradient descent
    863. +
    864. Similar (second order function now) problem but now with AdaGrad
    865. +
    866. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    867. +
    868. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    869. +
    870. Material for the lab sessions
    871. @@ -297,7 +316,7 @@ when \( ||\nabla_\theta C(\theta_k) || \leq \epsilon = 10^{-8} \). Note that
    872. 17
    873. 18
    874. ...
    875. -
    876. 46
    877. +
    878. 48
    879. »
    880. diff --git a/doc/pub/week37/html/._week37-bs009.html b/doc/pub/week37/html/._week37-bs009.html index df9f8f43e..65ab5bed9 100644 --- a/doc/pub/week37/html/._week37-bs009.html +++ b/doc/pub/week37/html/._week37-bs009.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    881. Program example for gradient descent with Ridge Regression
    882. Using gradient descent methods, limitations
    883. Improving gradient descent with momentum
    884. -
    885. Same code but now with momentum gradient descent
    886. -
    887. Overview video on Stochastic Gradient Descent
    888. +
    889. Same code but now with momentum gradient descent
    890. +
    891. Overview video on Stochastic Gradient Descent (SGD)
    892. Batches and mini-batches
    893. -
    894. Stochastic Gradient Descent (SGD)
    895. -
    896. Stochastic Gradient Descent
    897. -
    898. Computation of gradients
    899. -
    900. SGD example
    901. -
    902. The gradient step
    903. -
    904. Simple example code
    905. -
    906. When do we stop?
    907. -
    908. Slightly different approach
    909. -
    910. Time decay rate
    911. -
    912. Code with a Number of Minibatches which varies
    913. -
    914. Replace or not
    915. -
    916. Momentum based GD
    917. -
    918. More on momentum based approaches
    919. -
    920. Momentum parameter
    921. -
    922. Second moment of the gradient
    923. -
    924. RMS prop
    925. -
    926. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    927. -
    928. Algorithms and codes for Adagrad, RMSprop and Adam
    929. -
    930. Practical tips
    931. -
    932. Sneaking in automatic differentiation using Autograd
    933. -
    934. Same code but now with momentum gradient descent
    935. -
    936. But none of these can compete with Newton's method
    937. -
    938. Including Stochastic Gradient Descent with Autograd
    939. -
    940. Same code but now with momentum gradient descent
    941. -
    942. Similar (second order function now) problem but now with AdaGrad
    943. -
    944. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    945. -
    946. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    947. -
    948. Material for the lab sessions
    949. +
    950. Pros and cons
    951. +
    952. Convergence rates
    953. +
    954. Accuracy
    955. +
    956. Stochastic Gradient Descent (SGD)
    957. +
    958. Stochastic Gradient Descent
    959. +
    960. Computation of gradients
    961. +
    962. SGD example
    963. +
    964. The gradient step
    965. +
    966. Simple example code
    967. +
    968. When do we stop?
    969. +
    970. Slightly different approach
    971. +
    972. Time decay rate
    973. +
    974. Code with a Number of Minibatches which varies
    975. +
    976. Replace or not
    977. +
    978. Momentum based GD
    979. +
    980. More on momentum based approaches
    981. +
    982. Momentum parameter
    983. +
    984. Second moment of the gradient
    985. +
    986. RMS prop
    987. +
    988. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    989. +
    990. Algorithms and codes for Adagrad, RMSprop and Adam
    991. +
    992. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    993. +
    994. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    995. +
    996. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    997. +
    998. Practical tips
    999. +
    1000. Sneaking in auotmatic differentiation using Autograd
    1001. +
    1002. Same code but now with momentum gradient descent
    1003. +
    1004. Including Stochastic Gradient Descent with Autograd
    1005. +
    1006. Same code but now with momentum gradient descent
    1007. +
    1008. Similar (second order function now) problem but now with AdaGrad
    1009. +
    1010. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    1011. +
    1012. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    1013. +
    1014. Material for the lab sessions
    1015. @@ -353,7 +372,7 @@ plt.show()
    1016. 18
    1017. 19
    1018. ...
    1019. -
    1020. 46
    1021. +
    1022. 48
    1023. »
    1024. diff --git a/doc/pub/week37/html/._week37-bs010.html b/doc/pub/week37/html/._week37-bs010.html index 075aea3b0..26ec2439a 100644 --- a/doc/pub/week37/html/._week37-bs010.html +++ b/doc/pub/week37/html/._week37-bs010.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    1025. Program example for gradient descent with Ridge Regression
    1026. Using gradient descent methods, limitations
    1027. Improving gradient descent with momentum
    1028. -
    1029. Same code but now with momentum gradient descent
    1030. -
    1031. Overview video on Stochastic Gradient Descent
    1032. +
    1033. Same code but now with momentum gradient descent
    1034. +
    1035. Overview video on Stochastic Gradient Descent (SGD)
    1036. Batches and mini-batches
    1037. -
    1038. Stochastic Gradient Descent (SGD)
    1039. -
    1040. Stochastic Gradient Descent
    1041. -
    1042. Computation of gradients
    1043. -
    1044. SGD example
    1045. -
    1046. The gradient step
    1047. -
    1048. Simple example code
    1049. -
    1050. When do we stop?
    1051. -
    1052. Slightly different approach
    1053. -
    1054. Time decay rate
    1055. -
    1056. Code with a Number of Minibatches which varies
    1057. -
    1058. Replace or not
    1059. -
    1060. Momentum based GD
    1061. -
    1062. More on momentum based approaches
    1063. -
    1064. Momentum parameter
    1065. -
    1066. Second moment of the gradient
    1067. -
    1068. RMS prop
    1069. -
    1070. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    1071. -
    1072. Algorithms and codes for Adagrad, RMSprop and Adam
    1073. -
    1074. Practical tips
    1075. -
    1076. Sneaking in automatic differentiation using Autograd
    1077. -
    1078. Same code but now with momentum gradient descent
    1079. -
    1080. But none of these can compete with Newton's method
    1081. -
    1082. Including Stochastic Gradient Descent with Autograd
    1083. -
    1084. Same code but now with momentum gradient descent
    1085. -
    1086. Similar (second order function now) problem but now with AdaGrad
    1087. -
    1088. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    1089. -
    1090. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    1091. -
    1092. Material for the lab sessions
    1093. +
    1094. Pros and cons
    1095. +
    1096. Convergence rates
    1097. +
    1098. Accuracy
    1099. +
    1100. Stochastic Gradient Descent (SGD)
    1101. +
    1102. Stochastic Gradient Descent
    1103. +
    1104. Computation of gradients
    1105. +
    1106. SGD example
    1107. +
    1108. The gradient step
    1109. +
    1110. Simple example code
    1111. +
    1112. When do we stop?
    1113. +
    1114. Slightly different approach
    1115. +
    1116. Time decay rate
    1117. +
    1118. Code with a Number of Minibatches which varies
    1119. +
    1120. Replace or not
    1121. +
    1122. Momentum based GD
    1123. +
    1124. More on momentum based approaches
    1125. +
    1126. Momentum parameter
    1127. +
    1128. Second moment of the gradient
    1129. +
    1130. RMS prop
    1131. +
    1132. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    1133. +
    1134. Algorithms and codes for Adagrad, RMSprop and Adam
    1135. +
    1136. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    1137. +
    1138. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    1139. +
    1140. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    1141. +
    1142. Practical tips
    1143. +
    1144. Sneaking in auotmatic differentiation using Autograd
    1145. +
    1146. Same code but now with momentum gradient descent
    1147. +
    1148. Including Stochastic Gradient Descent with Autograd
    1149. +
    1150. Same code but now with momentum gradient descent
    1151. +
    1152. Similar (second order function now) problem but now with AdaGrad
    1153. +
    1154. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    1155. +
    1156. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    1157. +
    1158. Material for the lab sessions
    1159. @@ -303,7 +322,7 @@ $$
    1160. 19
    1161. 20
    1162. ...
    1163. -
    1164. 46
    1165. +
    1166. 48
    1167. »
    1168. diff --git a/doc/pub/week37/html/._week37-bs011.html b/doc/pub/week37/html/._week37-bs011.html index 87f9fdafa..fb806a5f7 100644 --- a/doc/pub/week37/html/._week37-bs011.html +++ b/doc/pub/week37/html/._week37-bs011.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    1169. Program example for gradient descent with Ridge Regression
    1170. Using gradient descent methods, limitations
    1171. Improving gradient descent with momentum
    1172. -
    1173. Same code but now with momentum gradient descent
    1174. -
    1175. Overview video on Stochastic Gradient Descent
    1176. +
    1177. Same code but now with momentum gradient descent
    1178. +
    1179. Overview video on Stochastic Gradient Descent (SGD)
    1180. Batches and mini-batches
    1181. -
    1182. Stochastic Gradient Descent (SGD)
    1183. -
    1184. Stochastic Gradient Descent
    1185. -
    1186. Computation of gradients
    1187. -
    1188. SGD example
    1189. -
    1190. The gradient step
    1191. -
    1192. Simple example code
    1193. -
    1194. When do we stop?
    1195. -
    1196. Slightly different approach
    1197. -
    1198. Time decay rate
    1199. -
    1200. Code with a Number of Minibatches which varies
    1201. -
    1202. Replace or not
    1203. -
    1204. Momentum based GD
    1205. -
    1206. More on momentum based approaches
    1207. -
    1208. Momentum parameter
    1209. -
    1210. Second moment of the gradient
    1211. -
    1212. RMS prop
    1213. -
    1214. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    1215. -
    1216. Algorithms and codes for Adagrad, RMSprop and Adam
    1217. -
    1218. Practical tips
    1219. -
    1220. Sneaking in automatic differentiation using Autograd
    1221. -
    1222. Same code but now with momentum gradient descent
    1223. -
    1224. But none of these can compete with Newton's method
    1225. -
    1226. Including Stochastic Gradient Descent with Autograd
    1227. -
    1228. Same code but now with momentum gradient descent
    1229. -
    1230. Similar (second order function now) problem but now with AdaGrad
    1231. -
    1232. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    1233. -
    1234. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    1235. -
    1236. Material for the lab sessions
    1237. +
    1238. Pros and cons
    1239. +
    1240. Convergence rates
    1241. +
    1242. Accuracy
    1243. +
    1244. Stochastic Gradient Descent (SGD)
    1245. +
    1246. Stochastic Gradient Descent
    1247. +
    1248. Computation of gradients
    1249. +
    1250. SGD example
    1251. +
    1252. The gradient step
    1253. +
    1254. Simple example code
    1255. +
    1256. When do we stop?
    1257. +
    1258. Slightly different approach
    1259. +
    1260. Time decay rate
    1261. +
    1262. Code with a Number of Minibatches which varies
    1263. +
    1264. Replace or not
    1265. +
    1266. Momentum based GD
    1267. +
    1268. More on momentum based approaches
    1269. +
    1270. Momentum parameter
    1271. +
    1272. Second moment of the gradient
    1273. +
    1274. RMS prop
    1275. +
    1276. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    1277. +
    1278. Algorithms and codes for Adagrad, RMSprop and Adam
    1279. +
    1280. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    1281. +
    1282. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    1283. +
    1284. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    1285. +
    1286. Practical tips
    1287. +
    1288. Sneaking in auotmatic differentiation using Autograd
    1289. +
    1290. Same code but now with momentum gradient descent
    1291. +
    1292. Including Stochastic Gradient Descent with Autograd
    1293. +
    1294. Same code but now with momentum gradient descent
    1295. +
    1296. Similar (second order function now) problem but now with AdaGrad
    1297. +
    1298. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    1299. +
    1300. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    1301. +
    1302. Material for the lab sessions
    1303. @@ -299,7 +318,7 @@ minimum of this function.
    1304. 20
    1305. 21
    1306. ...
    1307. -
    1308. 46
    1309. +
    1310. 48
    1311. »
    1312. diff --git a/doc/pub/week37/html/._week37-bs012.html b/doc/pub/week37/html/._week37-bs012.html index 90213a2d2..7a5311501 100644 --- a/doc/pub/week37/html/._week37-bs012.html +++ b/doc/pub/week37/html/._week37-bs012.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    1313. Program example for gradient descent with Ridge Regression
    1314. Using gradient descent methods, limitations
    1315. Improving gradient descent with momentum
    1316. -
    1317. Same code but now with momentum gradient descent
    1318. -
    1319. Overview video on Stochastic Gradient Descent
    1320. +
    1321. Same code but now with momentum gradient descent
    1322. +
    1323. Overview video on Stochastic Gradient Descent (SGD)
    1324. Batches and mini-batches
    1325. -
    1326. Stochastic Gradient Descent (SGD)
    1327. -
    1328. Stochastic Gradient Descent
    1329. -
    1330. Computation of gradients
    1331. -
    1332. SGD example
    1333. -
    1334. The gradient step
    1335. -
    1336. Simple example code
    1337. -
    1338. When do we stop?
    1339. -
    1340. Slightly different approach
    1341. -
    1342. Time decay rate
    1343. -
    1344. Code with a Number of Minibatches which varies
    1345. -
    1346. Replace or not
    1347. -
    1348. Momentum based GD
    1349. -
    1350. More on momentum based approaches
    1351. -
    1352. Momentum parameter
    1353. -
    1354. Second moment of the gradient
    1355. -
    1356. RMS prop
    1357. -
    1358. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    1359. -
    1360. Algorithms and codes for Adagrad, RMSprop and Adam
    1361. -
    1362. Practical tips
    1363. -
    1364. Sneaking in automatic differentiation using Autograd
    1365. -
    1366. Same code but now with momentum gradient descent
    1367. -
    1368. But none of these can compete with Newton's method
    1369. -
    1370. Including Stochastic Gradient Descent with Autograd
    1371. -
    1372. Same code but now with momentum gradient descent
    1373. -
    1374. Similar (second order function now) problem but now with AdaGrad
    1375. -
    1376. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    1377. -
    1378. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    1379. -
    1380. Material for the lab sessions
    1381. +
    1382. Pros and cons
    1383. +
    1384. Convergence rates
    1385. +
    1386. Accuracy
    1387. +
    1388. Stochastic Gradient Descent (SGD)
    1389. +
    1390. Stochastic Gradient Descent
    1391. +
    1392. Computation of gradients
    1393. +
    1394. SGD example
    1395. +
    1396. The gradient step
    1397. +
    1398. Simple example code
    1399. +
    1400. When do we stop?
    1401. +
    1402. Slightly different approach
    1403. +
    1404. Time decay rate
    1405. +
    1406. Code with a Number of Minibatches which varies
    1407. +
    1408. Replace or not
    1409. +
    1410. Momentum based GD
    1411. +
    1412. More on momentum based approaches
    1413. +
    1414. Momentum parameter
    1415. +
    1416. Second moment of the gradient
    1417. +
    1418. RMS prop
    1419. +
    1420. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    1421. +
    1422. Algorithms and codes for Adagrad, RMSprop and Adam
    1423. +
    1424. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    1425. +
    1426. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    1427. +
    1428. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    1429. +
    1430. Practical tips
    1431. +
    1432. Sneaking in auotmatic differentiation using Autograd
    1433. +
    1434. Same code but now with momentum gradient descent
    1435. +
    1436. Including Stochastic Gradient Descent with Autograd
    1437. +
    1438. Same code but now with momentum gradient descent
    1439. +
    1440. Similar (second order function now) problem but now with AdaGrad
    1441. +
    1442. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    1443. +
    1444. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    1445. +
    1446. Material for the lab sessions
    1447. @@ -357,7 +376,7 @@ plt.show()
    1448. 21
    1449. 22
    1450. ...
    1451. -
    1452. 46
    1453. +
    1454. 48
    1455. »
    1456. diff --git a/doc/pub/week37/html/._week37-bs013.html b/doc/pub/week37/html/._week37-bs013.html index 0a3af037d..e4ea98d20 100644 --- a/doc/pub/week37/html/._week37-bs013.html +++ b/doc/pub/week37/html/._week37-bs013.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    1457. Program example for gradient descent with Ridge Regression
    1458. Using gradient descent methods, limitations
    1459. Improving gradient descent with momentum
    1460. -
    1461. Same code but now with momentum gradient descent
    1462. -
    1463. Overview video on Stochastic Gradient Descent
    1464. +
    1465. Same code but now with momentum gradient descent
    1466. +
    1467. Overview video on Stochastic Gradient Descent (SGD)
    1468. Batches and mini-batches
    1469. -
    1470. Stochastic Gradient Descent (SGD)
    1471. -
    1472. Stochastic Gradient Descent
    1473. -
    1474. Computation of gradients
    1475. -
    1476. SGD example
    1477. -
    1478. The gradient step
    1479. -
    1480. Simple example code
    1481. -
    1482. When do we stop?
    1483. -
    1484. Slightly different approach
    1485. -
    1486. Time decay rate
    1487. -
    1488. Code with a Number of Minibatches which varies
    1489. -
    1490. Replace or not
    1491. -
    1492. Momentum based GD
    1493. -
    1494. More on momentum based approaches
    1495. -
    1496. Momentum parameter
    1497. -
    1498. Second moment of the gradient
    1499. -
    1500. RMS prop
    1501. -
    1502. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    1503. -
    1504. Algorithms and codes for Adagrad, RMSprop and Adam
    1505. -
    1506. Practical tips
    1507. -
    1508. Sneaking in automatic differentiation using Autograd
    1509. -
    1510. Same code but now with momentum gradient descent
    1511. -
    1512. But none of these can compete with Newton's method
    1513. -
    1514. Including Stochastic Gradient Descent with Autograd
    1515. -
    1516. Same code but now with momentum gradient descent
    1517. -
    1518. Similar (second order function now) problem but now with AdaGrad
    1519. -
    1520. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    1521. -
    1522. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    1523. -
    1524. Material for the lab sessions
    1525. +
    1526. Pros and cons
    1527. +
    1528. Convergence rates
    1529. +
    1530. Accuracy
    1531. +
    1532. Stochastic Gradient Descent (SGD)
    1533. +
    1534. Stochastic Gradient Descent
    1535. +
    1536. Computation of gradients
    1537. +
    1538. SGD example
    1539. +
    1540. The gradient step
    1541. +
    1542. Simple example code
    1543. +
    1544. When do we stop?
    1545. +
    1546. Slightly different approach
    1547. +
    1548. Time decay rate
    1549. +
    1550. Code with a Number of Minibatches which varies
    1551. +
    1552. Replace or not
    1553. +
    1554. Momentum based GD
    1555. +
    1556. More on momentum based approaches
    1557. +
    1558. Momentum parameter
    1559. +
    1560. Second moment of the gradient
    1561. +
    1562. RMS prop
    1563. +
    1564. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    1565. +
    1566. Algorithms and codes for Adagrad, RMSprop and Adam
    1567. +
    1568. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    1569. +
    1570. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    1571. +
    1572. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    1573. +
    1574. Practical tips
    1575. +
    1576. Sneaking in auotmatic differentiation using Autograd
    1577. +
    1578. Same code but now with momentum gradient descent
    1579. +
    1580. Including Stochastic Gradient Descent with Autograd
    1581. +
    1582. Same code but now with momentum gradient descent
    1583. +
    1584. Similar (second order function now) problem but now with AdaGrad
    1585. +
    1586. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    1587. +
    1588. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    1589. +
    1590. Material for the lab sessions
    1591. @@ -293,7 +312,7 @@ MathJax.Hub.Config({
    1592. 22
    1593. 23
    1594. ...
    1595. -
    1596. 46
    1597. +
    1598. 48
    1599. »
    1600. diff --git a/doc/pub/week37/html/._week37-bs014.html b/doc/pub/week37/html/._week37-bs014.html index 2d1cd02f8..19d9ba2cd 100644 --- a/doc/pub/week37/html/._week37-bs014.html +++ b/doc/pub/week37/html/._week37-bs014.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    1601. Program example for gradient descent with Ridge Regression
    1602. Using gradient descent methods, limitations
    1603. Improving gradient descent with momentum
    1604. -
    1605. Same code but now with momentum gradient descent
    1606. -
    1607. Overview video on Stochastic Gradient Descent
    1608. +
    1609. Same code but now with momentum gradient descent
    1610. +
    1611. Overview video on Stochastic Gradient Descent (SGD)
    1612. Batches and mini-batches
    1613. -
    1614. Stochastic Gradient Descent (SGD)
    1615. -
    1616. Stochastic Gradient Descent
    1617. -
    1618. Computation of gradients
    1619. -
    1620. SGD example
    1621. -
    1622. The gradient step
    1623. -
    1624. Simple example code
    1625. -
    1626. When do we stop?
    1627. -
    1628. Slightly different approach
    1629. -
    1630. Time decay rate
    1631. -
    1632. Code with a Number of Minibatches which varies
    1633. -
    1634. Replace or not
    1635. -
    1636. Momentum based GD
    1637. -
    1638. More on momentum based approaches
    1639. -
    1640. Momentum parameter
    1641. -
    1642. Second moment of the gradient
    1643. -
    1644. RMS prop
    1645. -
    1646. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    1647. -
    1648. Algorithms and codes for Adagrad, RMSprop and Adam
    1649. -
    1650. Practical tips
    1651. -
    1652. Sneaking in automatic differentiation using Autograd
    1653. -
    1654. Same code but now with momentum gradient descent
    1655. -
    1656. But none of these can compete with Newton's method
    1657. -
    1658. Including Stochastic Gradient Descent with Autograd
    1659. -
    1660. Same code but now with momentum gradient descent
    1661. -
    1662. Similar (second order function now) problem but now with AdaGrad
    1663. -
    1664. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    1665. -
    1666. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    1667. -
    1668. Material for the lab sessions
    1669. +
    1670. Pros and cons
    1671. +
    1672. Convergence rates
    1673. +
    1674. Accuracy
    1675. +
    1676. Stochastic Gradient Descent (SGD)
    1677. +
    1678. Stochastic Gradient Descent
    1679. +
    1680. Computation of gradients
    1681. +
    1682. SGD example
    1683. +
    1684. The gradient step
    1685. +
    1686. Simple example code
    1687. +
    1688. When do we stop?
    1689. +
    1690. Slightly different approach
    1691. +
    1692. Time decay rate
    1693. +
    1694. Code with a Number of Minibatches which varies
    1695. +
    1696. Replace or not
    1697. +
    1698. Momentum based GD
    1699. +
    1700. More on momentum based approaches
    1701. +
    1702. Momentum parameter
    1703. +
    1704. Second moment of the gradient
    1705. +
    1706. RMS prop
    1707. +
    1708. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    1709. +
    1710. Algorithms and codes for Adagrad, RMSprop and Adam
    1711. +
    1712. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    1713. +
    1714. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    1715. +
    1716. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    1717. +
    1718. Practical tips
    1719. +
    1720. Sneaking in auotmatic differentiation using Autograd
    1721. +
    1722. Same code but now with momentum gradient descent
    1723. +
    1724. Including Stochastic Gradient Descent with Autograd
    1725. +
    1726. Same code but now with momentum gradient descent
    1727. +
    1728. Similar (second order function now) problem but now with AdaGrad
    1729. +
    1730. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    1731. +
    1732. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    1733. +
    1734. Material for the lab sessions
    1735. @@ -365,7 +384,7 @@ pyplot.show()
    1736. 23
    1737. 24
    1738. ...
    1739. -
    1740. 46
    1741. +
    1742. 48
    1743. »
    1744. diff --git a/doc/pub/week37/html/._week37-bs015.html b/doc/pub/week37/html/._week37-bs015.html index 39be69329..9df5139ad 100644 --- a/doc/pub/week37/html/._week37-bs015.html +++ b/doc/pub/week37/html/._week37-bs015.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    1745. Program example for gradient descent with Ridge Regression
    1746. Using gradient descent methods, limitations
    1747. Improving gradient descent with momentum
    1748. -
    1749. Same code but now with momentum gradient descent
    1750. -
    1751. Overview video on Stochastic Gradient Descent
    1752. +
    1753. Same code but now with momentum gradient descent
    1754. +
    1755. Overview video on Stochastic Gradient Descent (SGD)
    1756. Batches and mini-batches
    1757. -
    1758. Stochastic Gradient Descent (SGD)
    1759. -
    1760. Stochastic Gradient Descent
    1761. -
    1762. Computation of gradients
    1763. -
    1764. SGD example
    1765. -
    1766. The gradient step
    1767. -
    1768. Simple example code
    1769. -
    1770. When do we stop?
    1771. -
    1772. Slightly different approach
    1773. -
    1774. Time decay rate
    1775. -
    1776. Code with a Number of Minibatches which varies
    1777. -
    1778. Replace or not
    1779. -
    1780. Momentum based GD
    1781. -
    1782. More on momentum based approaches
    1783. -
    1784. Momentum parameter
    1785. -
    1786. Second moment of the gradient
    1787. -
    1788. RMS prop
    1789. -
    1790. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    1791. -
    1792. Algorithms and codes for Adagrad, RMSprop and Adam
    1793. -
    1794. Practical tips
    1795. -
    1796. Sneaking in automatic differentiation using Autograd
    1797. -
    1798. Same code but now with momentum gradient descent
    1799. -
    1800. But none of these can compete with Newton's method
    1801. -
    1802. Including Stochastic Gradient Descent with Autograd
    1803. -
    1804. Same code but now with momentum gradient descent
    1805. -
    1806. Similar (second order function now) problem but now with AdaGrad
    1807. -
    1808. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    1809. -
    1810. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    1811. -
    1812. Material for the lab sessions
    1813. +
    1814. Pros and cons
    1815. +
    1816. Convergence rates
    1817. +
    1818. Accuracy
    1819. +
    1820. Stochastic Gradient Descent (SGD)
    1821. +
    1822. Stochastic Gradient Descent
    1823. +
    1824. Computation of gradients
    1825. +
    1826. SGD example
    1827. +
    1828. The gradient step
    1829. +
    1830. Simple example code
    1831. +
    1832. When do we stop?
    1833. +
    1834. Slightly different approach
    1835. +
    1836. Time decay rate
    1837. +
    1838. Code with a Number of Minibatches which varies
    1839. +
    1840. Replace or not
    1841. +
    1842. Momentum based GD
    1843. +
    1844. More on momentum based approaches
    1845. +
    1846. Momentum parameter
    1847. +
    1848. Second moment of the gradient
    1849. +
    1850. RMS prop
    1851. +
    1852. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    1853. +
    1854. Algorithms and codes for Adagrad, RMSprop and Adam
    1855. +
    1856. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    1857. +
    1858. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    1859. +
    1860. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    1861. +
    1862. Practical tips
    1863. +
    1864. Sneaking in auotmatic differentiation using Autograd
    1865. +
    1866. Same code but now with momentum gradient descent
    1867. +
    1868. Including Stochastic Gradient Descent with Autograd
    1869. +
    1870. Same code but now with momentum gradient descent
    1871. +
    1872. Similar (second order function now) problem but now with AdaGrad
    1873. +
    1874. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    1875. +
    1876. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    1877. +
    1878. Material for the lab sessions
    1879. @@ -371,7 +390,7 @@ pyplot.show()
    1880. 24
    1881. 25
    1882. ...
    1883. -
    1884. 46
    1885. +
    1886. 48
    1887. »
    1888. diff --git a/doc/pub/week37/html/._week37-bs016.html b/doc/pub/week37/html/._week37-bs016.html index 1b3515b56..13617ec8b 100644 --- a/doc/pub/week37/html/._week37-bs016.html +++ b/doc/pub/week37/html/._week37-bs016.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    1889. Program example for gradient descent with Ridge Regression
    1890. Using gradient descent methods, limitations
    1891. Improving gradient descent with momentum
    1892. -
    1893. Same code but now with momentum gradient descent
    1894. -
    1895. Overview video on Stochastic Gradient Descent
    1896. +
    1897. Same code but now with momentum gradient descent
    1898. +
    1899. Overview video on Stochastic Gradient Descent (SGD)
    1900. Batches and mini-batches
    1901. -
    1902. Stochastic Gradient Descent (SGD)
    1903. -
    1904. Stochastic Gradient Descent
    1905. -
    1906. Computation of gradients
    1907. -
    1908. SGD example
    1909. -
    1910. The gradient step
    1911. -
    1912. Simple example code
    1913. -
    1914. When do we stop?
    1915. -
    1916. Slightly different approach
    1917. -
    1918. Time decay rate
    1919. -
    1920. Code with a Number of Minibatches which varies
    1921. -
    1922. Replace or not
    1923. -
    1924. Momentum based GD
    1925. -
    1926. More on momentum based approaches
    1927. -
    1928. Momentum parameter
    1929. -
    1930. Second moment of the gradient
    1931. -
    1932. RMS prop
    1933. -
    1934. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    1935. -
    1936. Algorithms and codes for Adagrad, RMSprop and Adam
    1937. -
    1938. Practical tips
    1939. -
    1940. Sneaking in automatic differentiation using Autograd
    1941. -
    1942. Same code but now with momentum gradient descent
    1943. -
    1944. But none of these can compete with Newton's method
    1945. -
    1946. Including Stochastic Gradient Descent with Autograd
    1947. -
    1948. Same code but now with momentum gradient descent
    1949. -
    1950. Similar (second order function now) problem but now with AdaGrad
    1951. -
    1952. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    1953. -
    1954. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    1955. -
    1956. Material for the lab sessions
    1957. +
    1958. Pros and cons
    1959. +
    1960. Convergence rates
    1961. +
    1962. Accuracy
    1963. +
    1964. Stochastic Gradient Descent (SGD)
    1965. +
    1966. Stochastic Gradient Descent
    1967. +
    1968. Computation of gradients
    1969. +
    1970. SGD example
    1971. +
    1972. The gradient step
    1973. +
    1974. Simple example code
    1975. +
    1976. When do we stop?
    1977. +
    1978. Slightly different approach
    1979. +
    1980. Time decay rate
    1981. +
    1982. Code with a Number of Minibatches which varies
    1983. +
    1984. Replace or not
    1985. +
    1986. Momentum based GD
    1987. +
    1988. More on momentum based approaches
    1989. +
    1990. Momentum parameter
    1991. +
    1992. Second moment of the gradient
    1993. +
    1994. RMS prop
    1995. +
    1996. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    1997. +
    1998. Algorithms and codes for Adagrad, RMSprop and Adam
    1999. +
    2000. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2001. +
    2002. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2003. +
    2004. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2005. +
    2006. Practical tips
    2007. +
    2008. Sneaking in auotmatic differentiation using Autograd
    2009. +
    2010. Same code but now with momentum gradient descent
    2011. +
    2012. Including Stochastic Gradient Descent with Autograd
    2013. +
    2014. Same code but now with momentum gradient descent
    2015. +
    2016. Similar (second order function now) problem but now with AdaGrad
    2017. +
    2018. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    2019. +
    2020. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    2021. +
    2022. Material for the lab sessions
    2023. @@ -258,10 +277,16 @@ MathJax.Hub.Config({

       

       

       

      -

      Overview video on Stochastic Gradient Descent

      +

      Overview video on Stochastic Gradient Descent (SGD)

      What is Stochastic Gradient Descent +

      There are several reasons for using stochastic gradient descent. Some of these are:

      +
        +
      1. Efficiency: Updates weights more frequently using a single or a small batch of samples, which speeds up convergence.
      2. +
      3. Hopefully avoid Local Minima
      4. +
      5. Memory Usage: Requires less memory compared to computing gradients for the entire dataset.
      6. +

        @@ -287,7 +312,7 @@ MathJax.Hub.Config({
      • 25
      • 26
      • ...
      • -
      • 46
      • +
      • 48
      • »
      diff --git a/doc/pub/week37/html/._week37-bs017.html b/doc/pub/week37/html/._week37-bs017.html index e1882aad3..8dde5e1e5 100644 --- a/doc/pub/week37/html/._week37-bs017.html +++ b/doc/pub/week37/html/._week37-bs017.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    2024. Program example for gradient descent with Ridge Regression
    2025. Using gradient descent methods, limitations
    2026. Improving gradient descent with momentum
    2027. -
    2028. Same code but now with momentum gradient descent
    2029. -
    2030. Overview video on Stochastic Gradient Descent
    2031. +
    2032. Same code but now with momentum gradient descent
    2033. +
    2034. Overview video on Stochastic Gradient Descent (SGD)
    2035. Batches and mini-batches
    2036. -
    2037. Stochastic Gradient Descent (SGD)
    2038. -
    2039. Stochastic Gradient Descent
    2040. -
    2041. Computation of gradients
    2042. -
    2043. SGD example
    2044. -
    2045. The gradient step
    2046. -
    2047. Simple example code
    2048. -
    2049. When do we stop?
    2050. -
    2051. Slightly different approach
    2052. -
    2053. Time decay rate
    2054. -
    2055. Code with a Number of Minibatches which varies
    2056. -
    2057. Replace or not
    2058. -
    2059. Momentum based GD
    2060. -
    2061. More on momentum based approaches
    2062. -
    2063. Momentum parameter
    2064. -
    2065. Second moment of the gradient
    2066. -
    2067. RMS prop
    2068. -
    2069. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    2070. -
    2071. Algorithms and codes for Adagrad, RMSprop and Adam
    2072. -
    2073. Practical tips
    2074. -
    2075. Sneaking in automatic differentiation using Autograd
    2076. -
    2077. Same code but now with momentum gradient descent
    2078. -
    2079. But none of these can compete with Newton's method
    2080. -
    2081. Including Stochastic Gradient Descent with Autograd
    2082. -
    2083. Same code but now with momentum gradient descent
    2084. -
    2085. Similar (second order function now) problem but now with AdaGrad
    2086. -
    2087. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    2088. -
    2089. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    2090. -
    2091. Material for the lab sessions
    2092. +
    2093. Pros and cons
    2094. +
    2095. Convergence rates
    2096. +
    2097. Accuracy
    2098. +
    2099. Stochastic Gradient Descent (SGD)
    2100. +
    2101. Stochastic Gradient Descent
    2102. +
    2103. Computation of gradients
    2104. +
    2105. SGD example
    2106. +
    2107. The gradient step
    2108. +
    2109. Simple example code
    2110. +
    2111. When do we stop?
    2112. +
    2113. Slightly different approach
    2114. +
    2115. Time decay rate
    2116. +
    2117. Code with a Number of Minibatches which varies
    2118. +
    2119. Replace or not
    2120. +
    2121. Momentum based GD
    2122. +
    2123. More on momentum based approaches
    2124. +
    2125. Momentum parameter
    2126. +
    2127. Second moment of the gradient
    2128. +
    2129. RMS prop
    2130. +
    2131. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    2132. +
    2133. Algorithms and codes for Adagrad, RMSprop and Adam
    2134. +
    2135. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2136. +
    2137. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2138. +
    2139. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2140. +
    2141. Practical tips
    2142. +
    2143. Sneaking in auotmatic differentiation using Autograd
    2144. +
    2145. Same code but now with momentum gradient descent
    2146. +
    2147. Including Stochastic Gradient Descent with Autograd
    2148. +
    2149. Same code but now with momentum gradient descent
    2150. +
    2151. Similar (second order function now) problem but now with AdaGrad
    2152. +
    2153. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    2154. +
    2155. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    2156. +
    2157. Material for the lab sessions
    2158. @@ -297,7 +316,7 @@ perform a parameter update.
    2159. 26
    2160. 27
    2161. ...
    2162. -
    2163. 46
    2164. +
    2165. 48
    2166. »
    2167. diff --git a/doc/pub/week37/html/._week37-bs018.html b/doc/pub/week37/html/._week37-bs018.html index a4b654a0b..86155fa0d 100644 --- a/doc/pub/week37/html/._week37-bs018.html +++ b/doc/pub/week37/html/._week37-bs018.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    2168. Program example for gradient descent with Ridge Regression
    2169. Using gradient descent methods, limitations
    2170. Improving gradient descent with momentum
    2171. -
    2172. Same code but now with momentum gradient descent
    2173. -
    2174. Overview video on Stochastic Gradient Descent
    2175. +
    2176. Same code but now with momentum gradient descent
    2177. +
    2178. Overview video on Stochastic Gradient Descent (SGD)
    2179. Batches and mini-batches
    2180. -
    2181. Stochastic Gradient Descent (SGD)
    2182. -
    2183. Stochastic Gradient Descent
    2184. -
    2185. Computation of gradients
    2186. -
    2187. SGD example
    2188. -
    2189. The gradient step
    2190. -
    2191. Simple example code
    2192. -
    2193. When do we stop?
    2194. -
    2195. Slightly different approach
    2196. -
    2197. Time decay rate
    2198. -
    2199. Code with a Number of Minibatches which varies
    2200. -
    2201. Replace or not
    2202. -
    2203. Momentum based GD
    2204. -
    2205. More on momentum based approaches
    2206. -
    2207. Momentum parameter
    2208. -
    2209. Second moment of the gradient
    2210. -
    2211. RMS prop
    2212. -
    2213. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    2214. -
    2215. Algorithms and codes for Adagrad, RMSprop and Adam
    2216. -
    2217. Practical tips
    2218. -
    2219. Sneaking in automatic differentiation using Autograd
    2220. -
    2221. Same code but now with momentum gradient descent
    2222. -
    2223. But none of these can compete with Newton's method
    2224. -
    2225. Including Stochastic Gradient Descent with Autograd
    2226. -
    2227. Same code but now with momentum gradient descent
    2228. -
    2229. Similar (second order function now) problem but now with AdaGrad
    2230. -
    2231. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    2232. -
    2233. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    2234. -
    2235. Material for the lab sessions
    2236. +
    2237. Pros and cons
    2238. +
    2239. Convergence rates
    2240. +
    2241. Accuracy
    2242. +
    2243. Stochastic Gradient Descent (SGD)
    2244. +
    2245. Stochastic Gradient Descent
    2246. +
    2247. Computation of gradients
    2248. +
    2249. SGD example
    2250. +
    2251. The gradient step
    2252. +
    2253. Simple example code
    2254. +
    2255. When do we stop?
    2256. +
    2257. Slightly different approach
    2258. +
    2259. Time decay rate
    2260. +
    2261. Code with a Number of Minibatches which varies
    2262. +
    2263. Replace or not
    2264. +
    2265. Momentum based GD
    2266. +
    2267. More on momentum based approaches
    2268. +
    2269. Momentum parameter
    2270. +
    2271. Second moment of the gradient
    2272. +
    2273. RMS prop
    2274. +
    2275. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    2276. +
    2277. Algorithms and codes for Adagrad, RMSprop and Adam
    2278. +
    2279. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2280. +
    2281. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2282. +
    2283. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2284. +
    2285. Practical tips
    2286. +
    2287. Sneaking in auotmatic differentiation using Autograd
    2288. +
    2289. Same code but now with momentum gradient descent
    2290. +
    2291. Including Stochastic Gradient Descent with Autograd
    2292. +
    2293. Same code but now with momentum gradient descent
    2294. +
    2295. Similar (second order function now) problem but now with AdaGrad
    2296. +
    2297. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    2298. +
    2299. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    2300. +
    2301. Material for the lab sessions
    2302. @@ -258,32 +277,13 @@ MathJax.Hub.Config({

       

       

       

      -

      Stochastic Gradient Descent (SGD)

      - -

      In stochastic gradient descent, the extreme case is the case where we -have only one batch, that is we include the whole data set. -

      - -

      This process is called Stochastic Gradient -Descent (SGD) (or also sometimes on-line gradient descent). This is -relatively less common to see because in practice due to vectorized -code optimizations it can be computationally much more efficient to -evaluate the gradient for 100 examples, than the gradient for one -example 100 times. Even though SGD technically refers to using a -single example at a time to evaluate the gradient, you will hear -people use the term SGD even when referring to mini-batch gradient -descent (i.e. mentions of MGD for “Minibatch Gradient Descent”, or BGD -for “Batch gradient descent” are rare to see), where it is usually -assumed that mini-batches are used. The size of the mini-batch is a -hyperparameter but it is not very common to cross-validate or bootstrap it. It is -usually based on memory constraints (if any), or set to some value, -e.g. 32, 64 or 128. We use powers of 2 in practice because many -vectorized operation implementations work faster when their inputs are -sized in powers of 2. -

      - -

      In our notes with SGD we mean stochastic gradient descent with mini-batches.

      +

      Pros and cons

      +
        +
      1. Speed: SGD is faster than gradient descent because it uses only one training example per iteration, whereas gradient descent requires the entire dataset. This speed advantage becomes more significant as the size of the dataset increases.
      2. +
      3. Convergence: Gradient descent has a more predictable convergence behaviour because it uses the average gradient of the entire dataset. In contrast, SGD’s convergence behaviour can be more erratic due to its random sampling of individual training examples.
      4. +
      5. Memory: Gradient descent requires more memory than SGD because it must store the entire dataset for each iteration. SGD only needs to store the current training example, making it more memory-efficient.
      6. +

        @@ -309,7 +309,7 @@ sized in powers of 2.
      • 27
      • 28
      • ...
      • -
      • 46
      • +
      • 48
      • »
      diff --git a/doc/pub/week37/html/._week37-bs019.html b/doc/pub/week37/html/._week37-bs019.html index ceb6547d6..bd928e866 100644 --- a/doc/pub/week37/html/._week37-bs019.html +++ b/doc/pub/week37/html/._week37-bs019.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    2303. Program example for gradient descent with Ridge Regression
    2304. Using gradient descent methods, limitations
    2305. Improving gradient descent with momentum
    2306. -
    2307. Same code but now with momentum gradient descent
    2308. -
    2309. Overview video on Stochastic Gradient Descent
    2310. +
    2311. Same code but now with momentum gradient descent
    2312. +
    2313. Overview video on Stochastic Gradient Descent (SGD)
    2314. Batches and mini-batches
    2315. -
    2316. Stochastic Gradient Descent (SGD)
    2317. -
    2318. Stochastic Gradient Descent
    2319. -
    2320. Computation of gradients
    2321. -
    2322. SGD example
    2323. -
    2324. The gradient step
    2325. -
    2326. Simple example code
    2327. -
    2328. When do we stop?
    2329. -
    2330. Slightly different approach
    2331. -
    2332. Time decay rate
    2333. -
    2334. Code with a Number of Minibatches which varies
    2335. -
    2336. Replace or not
    2337. -
    2338. Momentum based GD
    2339. -
    2340. More on momentum based approaches
    2341. -
    2342. Momentum parameter
    2343. -
    2344. Second moment of the gradient
    2345. -
    2346. RMS prop
    2347. -
    2348. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    2349. -
    2350. Algorithms and codes for Adagrad, RMSprop and Adam
    2351. -
    2352. Practical tips
    2353. -
    2354. Sneaking in automatic differentiation using Autograd
    2355. -
    2356. Same code but now with momentum gradient descent
    2357. -
    2358. But none of these can compete with Newton's method
    2359. -
    2360. Including Stochastic Gradient Descent with Autograd
    2361. -
    2362. Same code but now with momentum gradient descent
    2363. -
    2364. Similar (second order function now) problem but now with AdaGrad
    2365. -
    2366. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    2367. -
    2368. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    2369. -
    2370. Material for the lab sessions
    2371. +
    2372. Pros and cons
    2373. +
    2374. Convergence rates
    2375. +
    2376. Accuracy
    2377. +
    2378. Stochastic Gradient Descent (SGD)
    2379. +
    2380. Stochastic Gradient Descent
    2381. +
    2382. Computation of gradients
    2383. +
    2384. SGD example
    2385. +
    2386. The gradient step
    2387. +
    2388. Simple example code
    2389. +
    2390. When do we stop?
    2391. +
    2392. Slightly different approach
    2393. +
    2394. Time decay rate
    2395. +
    2396. Code with a Number of Minibatches which varies
    2397. +
    2398. Replace or not
    2399. +
    2400. Momentum based GD
    2401. +
    2402. More on momentum based approaches
    2403. +
    2404. Momentum parameter
    2405. +
    2406. Second moment of the gradient
    2407. +
    2408. RMS prop
    2409. +
    2410. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    2411. +
    2412. Algorithms and codes for Adagrad, RMSprop and Adam
    2413. +
    2414. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2415. +
    2416. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2417. +
    2418. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2419. +
    2420. Practical tips
    2421. +
    2422. Sneaking in auotmatic differentiation using Autograd
    2423. +
    2424. Same code but now with momentum gradient descent
    2425. +
    2426. Including Stochastic Gradient Descent with Autograd
    2427. +
    2428. Same code but now with momentum gradient descent
    2429. +
    2430. Similar (second order function now) problem but now with AdaGrad
    2431. +
    2432. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    2433. +
    2434. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    2435. +
    2436. Material for the lab sessions
    2437. @@ -258,22 +277,12 @@ MathJax.Hub.Config({

       

       

       

      -

      Stochastic Gradient Descent

      - -

      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}). -$$ - +

      Convergence rates

      +
        +
      1. Stochastic Gradient Descent has a faster convergence rate due to the use of single training examples in each iteration.
      2. +
      3. Gradient Descent as a slower convergence rate, as it uses the entire dataset for each iteration.
      4. +

      diff --git a/doc/pub/week37/html/._week37-bs020.html b/doc/pub/week37/html/._week37-bs020.html index 75db11f4d..ed9d1f077 100644 --- a/doc/pub/week37/html/._week37-bs020.html +++ b/doc/pub/week37/html/._week37-bs020.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    2438. Program example for gradient descent with Ridge Regression
    2439. Using gradient descent methods, limitations
    2440. Improving gradient descent with momentum
    2441. -
    2442. Same code but now with momentum gradient descent
    2443. -
    2444. Overview video on Stochastic Gradient Descent
    2445. +
    2446. Same code but now with momentum gradient descent
    2447. +
    2448. Overview video on Stochastic Gradient Descent (SGD)
    2449. Batches and mini-batches
    2450. -
    2451. Stochastic Gradient Descent (SGD)
    2452. -
    2453. Stochastic Gradient Descent
    2454. -
    2455. Computation of gradients
    2456. -
    2457. SGD example
    2458. -
    2459. The gradient step
    2460. -
    2461. Simple example code
    2462. -
    2463. When do we stop?
    2464. -
    2465. Slightly different approach
    2466. -
    2467. Time decay rate
    2468. -
    2469. Code with a Number of Minibatches which varies
    2470. -
    2471. Replace or not
    2472. -
    2473. Momentum based GD
    2474. -
    2475. More on momentum based approaches
    2476. -
    2477. Momentum parameter
    2478. -
    2479. Second moment of the gradient
    2480. -
    2481. RMS prop
    2482. -
    2483. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    2484. -
    2485. Algorithms and codes for Adagrad, RMSprop and Adam
    2486. -
    2487. Practical tips
    2488. -
    2489. Sneaking in automatic differentiation using Autograd
    2490. -
    2491. Same code but now with momentum gradient descent
    2492. -
    2493. But none of these can compete with Newton's method
    2494. -
    2495. Including Stochastic Gradient Descent with Autograd
    2496. -
    2497. Same code but now with momentum gradient descent
    2498. -
    2499. Similar (second order function now) problem but now with AdaGrad
    2500. -
    2501. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    2502. -
    2503. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    2504. -
    2505. Material for the lab sessions
    2506. +
    2507. Pros and cons
    2508. +
    2509. Convergence rates
    2510. +
    2511. Accuracy
    2512. +
    2513. Stochastic Gradient Descent (SGD)
    2514. +
    2515. Stochastic Gradient Descent
    2516. +
    2517. Computation of gradients
    2518. +
    2519. SGD example
    2520. +
    2521. The gradient step
    2522. +
    2523. Simple example code
    2524. +
    2525. When do we stop?
    2526. +
    2527. Slightly different approach
    2528. +
    2529. Time decay rate
    2530. +
    2531. Code with a Number of Minibatches which varies
    2532. +
    2533. Replace or not
    2534. +
    2535. Momentum based GD
    2536. +
    2537. More on momentum based approaches
    2538. +
    2539. Momentum parameter
    2540. +
    2541. Second moment of the gradient
    2542. +
    2543. RMS prop
    2544. +
    2545. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    2546. +
    2547. Algorithms and codes for Adagrad, RMSprop and Adam
    2548. +
    2549. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2550. +
    2551. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2552. +
    2553. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2554. +
    2555. Practical tips
    2556. +
    2557. Sneaking in auotmatic differentiation using Autograd
    2558. +
    2559. Same code but now with momentum gradient descent
    2560. +
    2561. Including Stochastic Gradient Descent with Autograd
    2562. +
    2563. Same code but now with momentum gradient descent
    2564. +
    2565. Similar (second order function now) problem but now with AdaGrad
    2566. +
    2567. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    2568. +
    2569. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    2570. +
    2571. Material for the lab sessions
    2572. @@ -258,21 +277,27 @@ MathJax.Hub.Config({

       

       

       

      -

      Computation of gradients

      +

      Accuracy

      -

      This in turn means that the gradient can be -computed as a sum over \( i \)-gradients +

      In general, stochastic Gradient Descent is Less accurate than gradient +descent, as it calculates the gradient on single examples, which may +not accurately represent the overall dataset. Gradient Descent is +more accurate because it uses the average gradient calculated over the +entire dataset.

      -$$ -\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 \). +

      There are other disadvantages to using SGD. The main drawback is that +its convergence behaviour can be more erratic due to the random +sampling of individual training examples. This can lead to less +accurate results, as the algorithm may not converge to the true +minimum of the cost function. Additionally, the learning rate, which +determines the step size of each update to the model’s parameters, +must be carefully chosen to ensure convergence. +

      + +

      It is however the method of choice in deep learning algorithms where +SGD is often used in combination with other optimization techniques, +such as momentum or adaptive learning rates

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

    2573. 29
    2574. 30
    2575. ...
    2576. -
    2577. 46
    2578. +
    2579. 48
    2580. »
    2581. diff --git a/doc/pub/week37/html/._week37-bs021.html b/doc/pub/week37/html/._week37-bs021.html index 4a4d3fe14..3533677e4 100644 --- a/doc/pub/week37/html/._week37-bs021.html +++ b/doc/pub/week37/html/._week37-bs021.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    2582. Program example for gradient descent with Ridge Regression
    2583. Using gradient descent methods, limitations
    2584. Improving gradient descent with momentum
    2585. -
    2586. Same code but now with momentum gradient descent
    2587. -
    2588. Overview video on Stochastic Gradient Descent
    2589. +
    2590. Same code but now with momentum gradient descent
    2591. +
    2592. Overview video on Stochastic Gradient Descent (SGD)
    2593. Batches and mini-batches
    2594. -
    2595. Stochastic Gradient Descent (SGD)
    2596. -
    2597. Stochastic Gradient Descent
    2598. -
    2599. Computation of gradients
    2600. -
    2601. SGD example
    2602. -
    2603. The gradient step
    2604. -
    2605. Simple example code
    2606. -
    2607. When do we stop?
    2608. -
    2609. Slightly different approach
    2610. -
    2611. Time decay rate
    2612. -
    2613. Code with a Number of Minibatches which varies
    2614. -
    2615. Replace or not
    2616. -
    2617. Momentum based GD
    2618. -
    2619. More on momentum based approaches
    2620. -
    2621. Momentum parameter
    2622. -
    2623. Second moment of the gradient
    2624. -
    2625. RMS prop
    2626. -
    2627. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    2628. -
    2629. Algorithms and codes for Adagrad, RMSprop and Adam
    2630. -
    2631. Practical tips
    2632. -
    2633. Sneaking in automatic differentiation using Autograd
    2634. -
    2635. Same code but now with momentum gradient descent
    2636. -
    2637. But none of these can compete with Newton's method
    2638. -
    2639. Including Stochastic Gradient Descent with Autograd
    2640. -
    2641. Same code but now with momentum gradient descent
    2642. -
    2643. Similar (second order function now) problem but now with AdaGrad
    2644. -
    2645. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    2646. -
    2647. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    2648. -
    2649. Material for the lab sessions
    2650. +
    2651. Pros and cons
    2652. +
    2653. Convergence rates
    2654. +
    2655. Accuracy
    2656. +
    2657. Stochastic Gradient Descent (SGD)
    2658. +
    2659. Stochastic Gradient Descent
    2660. +
    2661. Computation of gradients
    2662. +
    2663. SGD example
    2664. +
    2665. The gradient step
    2666. +
    2667. Simple example code
    2668. +
    2669. When do we stop?
    2670. +
    2671. Slightly different approach
    2672. +
    2673. Time decay rate
    2674. +
    2675. Code with a Number of Minibatches which varies
    2676. +
    2677. Replace or not
    2678. +
    2679. Momentum based GD
    2680. +
    2681. More on momentum based approaches
    2682. +
    2683. Momentum parameter
    2684. +
    2685. Second moment of the gradient
    2686. +
    2687. RMS prop
    2688. +
    2689. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    2690. +
    2691. Algorithms and codes for Adagrad, RMSprop and Adam
    2692. +
    2693. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2694. +
    2695. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2696. +
    2697. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2698. +
    2699. Practical tips
    2700. +
    2701. Sneaking in auotmatic differentiation using Autograd
    2702. +
    2703. Same code but now with momentum gradient descent
    2704. +
    2705. Including Stochastic Gradient Descent with Autograd
    2706. +
    2707. Same code but now with momentum gradient descent
    2708. +
    2709. Similar (second order function now) problem but now with AdaGrad
    2710. +
    2711. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    2712. +
    2713. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    2714. +
    2715. Material for the lab sessions
    2716. @@ -258,28 +277,31 @@ 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 \). +

      Stochastic Gradient Descent (SGD)

      + +

      In stochastic gradient descent, the extreme case is the case where we +have only one batch, that is we include the whole data set.

      -

      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 process is called Stochastic Gradient +Descent (SGD) (or also sometimes on-line gradient descent). This is +relatively less common to see because in practice due to vectorized +code optimizations it can be computationally much more efficient to +evaluate the gradient for 100 examples, than the gradient for one +example 100 times. Even though SGD technically refers to using a +single example at a time to evaluate the gradient, you will hear +people use the term SGD even when referring to mini-batch gradient +descent (i.e. mentions of MGD for “Minibatch Gradient Descent”, or BGD +for “Batch gradient descent” are rare to see), where it is usually +assumed that mini-batches are used. The size of the mini-batch is a +hyperparameter but it is not very common to cross-validate or bootstrap it. It is +usually based on memory constraints (if any), or set to some value, +e.g. 32, 64 or 128. We use powers of 2 in practice because many +vectorized operation implementations work faster when their inputs are +sized in powers of 2.

      -$$ -\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}). -$$ +

      In our notes with SGD we mean stochastic gradient descent with mini-batches.

      @@ -306,7 +328,7 @@ $$

    2717. 30
    2718. 31
    2719. ...
    2720. -
    2721. 46
    2722. +
    2723. 48
    2724. »
    2725. diff --git a/doc/pub/week37/html/._week37-bs022.html b/doc/pub/week37/html/._week37-bs022.html index 2921b04c2..e0f11d8cd 100644 --- a/doc/pub/week37/html/._week37-bs022.html +++ b/doc/pub/week37/html/._week37-bs022.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    2726. Program example for gradient descent with Ridge Regression
    2727. Using gradient descent methods, limitations
    2728. Improving gradient descent with momentum
    2729. -
    2730. Same code but now with momentum gradient descent
    2731. -
    2732. Overview video on Stochastic Gradient Descent
    2733. +
    2734. Same code but now with momentum gradient descent
    2735. +
    2736. Overview video on Stochastic Gradient Descent (SGD)
    2737. Batches and mini-batches
    2738. -
    2739. Stochastic Gradient Descent (SGD)
    2740. -
    2741. Stochastic Gradient Descent
    2742. -
    2743. Computation of gradients
    2744. -
    2745. SGD example
    2746. -
    2747. The gradient step
    2748. -
    2749. Simple example code
    2750. -
    2751. When do we stop?
    2752. -
    2753. Slightly different approach
    2754. -
    2755. Time decay rate
    2756. -
    2757. Code with a Number of Minibatches which varies
    2758. -
    2759. Replace or not
    2760. -
    2761. Momentum based GD
    2762. -
    2763. More on momentum based approaches
    2764. -
    2765. Momentum parameter
    2766. -
    2767. Second moment of the gradient
    2768. -
    2769. RMS prop
    2770. -
    2771. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    2772. -
    2773. Algorithms and codes for Adagrad, RMSprop and Adam
    2774. -
    2775. Practical tips
    2776. -
    2777. Sneaking in automatic differentiation using Autograd
    2778. -
    2779. Same code but now with momentum gradient descent
    2780. -
    2781. But none of these can compete with Newton's method
    2782. -
    2783. Including Stochastic Gradient Descent with Autograd
    2784. -
    2785. Same code but now with momentum gradient descent
    2786. -
    2787. Similar (second order function now) problem but now with AdaGrad
    2788. -
    2789. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    2790. -
    2791. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    2792. -
    2793. Material for the lab sessions
    2794. +
    2795. Pros and cons
    2796. +
    2797. Convergence rates
    2798. +
    2799. Accuracy
    2800. +
    2801. Stochastic Gradient Descent (SGD)
    2802. +
    2803. Stochastic Gradient Descent
    2804. +
    2805. Computation of gradients
    2806. +
    2807. SGD example
    2808. +
    2809. The gradient step
    2810. +
    2811. Simple example code
    2812. +
    2813. When do we stop?
    2814. +
    2815. Slightly different approach
    2816. +
    2817. Time decay rate
    2818. +
    2819. Code with a Number of Minibatches which varies
    2820. +
    2821. Replace or not
    2822. +
    2823. Momentum based GD
    2824. +
    2825. More on momentum based approaches
    2826. +
    2827. Momentum parameter
    2828. +
    2829. Second moment of the gradient
    2830. +
    2831. RMS prop
    2832. +
    2833. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    2834. +
    2835. Algorithms and codes for Adagrad, RMSprop and Adam
    2836. +
    2837. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2838. +
    2839. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2840. +
    2841. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2842. +
    2843. Practical tips
    2844. +
    2845. Sneaking in auotmatic differentiation using Autograd
    2846. +
    2847. Same code but now with momentum gradient descent
    2848. +
    2849. Including Stochastic Gradient Descent with Autograd
    2850. +
    2851. Same code but now with momentum gradient descent
    2852. +
    2853. Similar (second order function now) problem but now with AdaGrad
    2854. +
    2855. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    2856. +
    2857. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    2858. +
    2859. Material for the lab sessions
    2860. @@ -258,21 +277,22 @@ MathJax.Hub.Config({

       

       

       

      -

      The gradient step

      +

      Stochastic Gradient Descent

      -

      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}) -$$ - -

      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. +

      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}). +$$ + +

        @@ -298,7 +318,7 @@ the number of minibatches, as exemplified in the code below.
      • 31
      • 32
      • ...
      • -
      • 46
      • +
      • 48
      • »
      diff --git a/doc/pub/week37/html/._week37-bs023.html b/doc/pub/week37/html/._week37-bs023.html index c65574214..9bbefc25d 100644 --- a/doc/pub/week37/html/._week37-bs023.html +++ b/doc/pub/week37/html/._week37-bs023.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    2861. Program example for gradient descent with Ridge Regression
    2862. Using gradient descent methods, limitations
    2863. Improving gradient descent with momentum
    2864. -
    2865. Same code but now with momentum gradient descent
    2866. -
    2867. Overview video on Stochastic Gradient Descent
    2868. +
    2869. Same code but now with momentum gradient descent
    2870. +
    2871. Overview video on Stochastic Gradient Descent (SGD)
    2872. Batches and mini-batches
    2873. -
    2874. Stochastic Gradient Descent (SGD)
    2875. -
    2876. Stochastic Gradient Descent
    2877. -
    2878. Computation of gradients
    2879. -
    2880. SGD example
    2881. -
    2882. The gradient step
    2883. -
    2884. Simple example code
    2885. -
    2886. When do we stop?
    2887. -
    2888. Slightly different approach
    2889. -
    2890. Time decay rate
    2891. -
    2892. Code with a Number of Minibatches which varies
    2893. -
    2894. Replace or not
    2895. -
    2896. Momentum based GD
    2897. -
    2898. More on momentum based approaches
    2899. -
    2900. Momentum parameter
    2901. -
    2902. Second moment of the gradient
    2903. -
    2904. RMS prop
    2905. -
    2906. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    2907. -
    2908. Algorithms and codes for Adagrad, RMSprop and Adam
    2909. -
    2910. Practical tips
    2911. -
    2912. Sneaking in automatic differentiation using Autograd
    2913. -
    2914. Same code but now with momentum gradient descent
    2915. -
    2916. But none of these can compete with Newton's method
    2917. -
    2918. Including Stochastic Gradient Descent with Autograd
    2919. -
    2920. Same code but now with momentum gradient descent
    2921. -
    2922. Similar (second order function now) problem but now with AdaGrad
    2923. -
    2924. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    2925. -
    2926. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    2927. -
    2928. Material for the lab sessions
    2929. +
    2930. Pros and cons
    2931. +
    2932. Convergence rates
    2933. +
    2934. Accuracy
    2935. +
    2936. Stochastic Gradient Descent (SGD)
    2937. +
    2938. Stochastic Gradient Descent
    2939. +
    2940. Computation of gradients
    2941. +
    2942. SGD example
    2943. +
    2944. The gradient step
    2945. +
    2946. Simple example code
    2947. +
    2948. When do we stop?
    2949. +
    2950. Slightly different approach
    2951. +
    2952. Time decay rate
    2953. +
    2954. Code with a Number of Minibatches which varies
    2955. +
    2956. Replace or not
    2957. +
    2958. Momentum based GD
    2959. +
    2960. More on momentum based approaches
    2961. +
    2962. Momentum parameter
    2963. +
    2964. Second moment of the gradient
    2965. +
    2966. RMS prop
    2967. +
    2968. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    2969. +
    2970. Algorithms and codes for Adagrad, RMSprop and Adam
    2971. +
    2972. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2973. +
    2974. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2975. +
    2976. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    2977. +
    2978. Practical tips
    2979. +
    2980. Sneaking in auotmatic differentiation using Autograd
    2981. +
    2982. Same code but now with momentum gradient descent
    2983. +
    2984. Including Stochastic Gradient Descent with Autograd
    2985. +
    2986. Same code but now with momentum gradient descent
    2987. +
    2988. Similar (second order function now) problem but now with AdaGrad
    2989. +
    2990. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    2991. +
    2992. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    2993. +
    2994. Material for the lab sessions
    2995. @@ -258,51 +277,21 @@ MathJax.Hub.Config({

       

       

       

      -

      Simple example code

      +

      Computation of gradients

      +

      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}). +$$ - -
      -
      -
      -
      -
      -
      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. +

      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 \).

      @@ -330,7 +319,7 @@ all \( n \) datapoints.

    2996. 32
    2997. 33
    2998. ...
    2999. -
    3000. 46
    3001. +
    3002. 48
    3003. »
    3004. diff --git a/doc/pub/week37/html/._week37-bs024.html b/doc/pub/week37/html/._week37-bs024.html index 90d0eed4e..8a2f022de 100644 --- a/doc/pub/week37/html/._week37-bs024.html +++ b/doc/pub/week37/html/._week37-bs024.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    3005. Program example for gradient descent with Ridge Regression
    3006. Using gradient descent methods, limitations
    3007. Improving gradient descent with momentum
    3008. -
    3009. Same code but now with momentum gradient descent
    3010. -
    3011. Overview video on Stochastic Gradient Descent
    3012. +
    3013. Same code but now with momentum gradient descent
    3014. +
    3015. Overview video on Stochastic Gradient Descent (SGD)
    3016. Batches and mini-batches
    3017. -
    3018. Stochastic Gradient Descent (SGD)
    3019. -
    3020. Stochastic Gradient Descent
    3021. -
    3022. Computation of gradients
    3023. -
    3024. SGD example
    3025. -
    3026. The gradient step
    3027. -
    3028. Simple example code
    3029. -
    3030. When do we stop?
    3031. -
    3032. Slightly different approach
    3033. -
    3034. Time decay rate
    3035. -
    3036. Code with a Number of Minibatches which varies
    3037. -
    3038. Replace or not
    3039. -
    3040. Momentum based GD
    3041. -
    3042. More on momentum based approaches
    3043. -
    3044. Momentum parameter
    3045. -
    3046. Second moment of the gradient
    3047. -
    3048. RMS prop
    3049. -
    3050. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    3051. -
    3052. Algorithms and codes for Adagrad, RMSprop and Adam
    3053. -
    3054. Practical tips
    3055. -
    3056. Sneaking in automatic differentiation using Autograd
    3057. -
    3058. Same code but now with momentum gradient descent
    3059. -
    3060. But none of these can compete with Newton's method
    3061. -
    3062. Including Stochastic Gradient Descent with Autograd
    3063. -
    3064. Same code but now with momentum gradient descent
    3065. -
    3066. Similar (second order function now) problem but now with AdaGrad
    3067. -
    3068. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    3069. -
    3070. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    3071. -
    3072. Material for the lab sessions
    3073. +
    3074. Pros and cons
    3075. +
    3076. Convergence rates
    3077. +
    3078. Accuracy
    3079. +
    3080. Stochastic Gradient Descent (SGD)
    3081. +
    3082. Stochastic Gradient Descent
    3083. +
    3084. Computation of gradients
    3085. +
    3086. SGD example
    3087. +
    3088. The gradient step
    3089. +
    3090. Simple example code
    3091. +
    3092. When do we stop?
    3093. +
    3094. Slightly different approach
    3095. +
    3096. Time decay rate
    3097. +
    3098. Code with a Number of Minibatches which varies
    3099. +
    3100. Replace or not
    3101. +
    3102. Momentum based GD
    3103. +
    3104. More on momentum based approaches
    3105. +
    3106. Momentum parameter
    3107. +
    3108. Second moment of the gradient
    3109. +
    3110. RMS prop
    3111. +
    3112. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    3113. +
    3114. Algorithms and codes for Adagrad, RMSprop and Adam
    3115. +
    3116. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    3117. +
    3118. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    3119. +
    3120. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    3121. +
    3122. Practical tips
    3123. +
    3124. Sneaking in auotmatic differentiation using Autograd
    3125. +
    3126. Same code but now with momentum gradient descent
    3127. +
    3128. Including Stochastic Gradient Descent with Autograd
    3129. +
    3130. Same code but now with momentum gradient descent
    3131. +
    3132. Similar (second order function now) problem but now with AdaGrad
    3133. +
    3134. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    3135. +
    3136. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    3137. +
    3138. Material for the lab sessions
    3139. @@ -258,20 +277,29 @@ MathJax.Hub.Config({

       

       

       

      -

      When do we stop?

      - -

      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. +

      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 \).

      +

      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 +

      +$$ +\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}). +$$ + +

        @@ -297,7 +325,7 @@ gave the lowest value.
      • 33
      • 34
      • ...
      • -
      • 46
      • +
      • 48
      • »
      diff --git a/doc/pub/week37/html/._week37-bs025.html b/doc/pub/week37/html/._week37-bs025.html index f248bb5e5..3d2c765b5 100644 --- a/doc/pub/week37/html/._week37-bs025.html +++ b/doc/pub/week37/html/._week37-bs025.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    3140. Program example for gradient descent with Ridge Regression
    3141. Using gradient descent methods, limitations
    3142. Improving gradient descent with momentum
    3143. -
    3144. Same code but now with momentum gradient descent
    3145. -
    3146. Overview video on Stochastic Gradient Descent
    3147. +
    3148. Same code but now with momentum gradient descent
    3149. +
    3150. Overview video on Stochastic Gradient Descent (SGD)
    3151. Batches and mini-batches
    3152. -
    3153. Stochastic Gradient Descent (SGD)
    3154. -
    3155. Stochastic Gradient Descent
    3156. -
    3157. Computation of gradients
    3158. -
    3159. SGD example
    3160. -
    3161. The gradient step
    3162. -
    3163. Simple example code
    3164. -
    3165. When do we stop?
    3166. -
    3167. Slightly different approach
    3168. -
    3169. Time decay rate
    3170. -
    3171. Code with a Number of Minibatches which varies
    3172. -
    3173. Replace or not
    3174. -
    3175. Momentum based GD
    3176. -
    3177. More on momentum based approaches
    3178. -
    3179. Momentum parameter
    3180. -
    3181. Second moment of the gradient
    3182. -
    3183. RMS prop
    3184. -
    3185. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    3186. -
    3187. Algorithms and codes for Adagrad, RMSprop and Adam
    3188. -
    3189. Practical tips
    3190. -
    3191. Sneaking in automatic differentiation using Autograd
    3192. -
    3193. Same code but now with momentum gradient descent
    3194. -
    3195. But none of these can compete with Newton's method
    3196. -
    3197. Including Stochastic Gradient Descent with Autograd
    3198. -
    3199. Same code but now with momentum gradient descent
    3200. -
    3201. Similar (second order function now) problem but now with AdaGrad
    3202. -
    3203. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    3204. -
    3205. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    3206. -
    3207. Material for the lab sessions
    3208. +
    3209. Pros and cons
    3210. +
    3211. Convergence rates
    3212. +
    3213. Accuracy
    3214. +
    3215. Stochastic Gradient Descent (SGD)
    3216. +
    3217. Stochastic Gradient Descent
    3218. +
    3219. Computation of gradients
    3220. +
    3221. SGD example
    3222. +
    3223. The gradient step
    3224. +
    3225. Simple example code
    3226. +
    3227. When do we stop?
    3228. +
    3229. Slightly different approach
    3230. +
    3231. Time decay rate
    3232. +
    3233. Code with a Number of Minibatches which varies
    3234. +
    3235. Replace or not
    3236. +
    3237. Momentum based GD
    3238. +
    3239. More on momentum based approaches
    3240. +
    3241. Momentum parameter
    3242. +
    3243. Second moment of the gradient
    3244. +
    3245. RMS prop
    3246. +
    3247. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    3248. +
    3249. Algorithms and codes for Adagrad, RMSprop and Adam
    3250. +
    3251. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    3252. +
    3253. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    3254. +
    3255. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    3256. +
    3257. Practical tips
    3258. +
    3259. Sneaking in auotmatic differentiation using Autograd
    3260. +
    3261. Same code but now with momentum gradient descent
    3262. +
    3263. Including Stochastic Gradient Descent with Autograd
    3264. +
    3265. Same code but now with momentum gradient descent
    3266. +
    3267. Similar (second order function now) problem but now with AdaGrad
    3268. +
    3269. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    3270. +
    3271. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    3272. +
    3273. Material for the lab sessions
    3274. @@ -258,17 +277,19 @@ MathJax.Hub.Config({

       

       

       

      -

      Slightly different approach

      +

      The gradient step

      -

      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. Such approaches are -also called scaling. There are many such ways to scale the learning -rate -and discussions here. See -also -https://towardsdatascience.com/learning-rate-schedules-and-adaptive-learning-rate-methods-for-deep-learning-2c8f433990d1 -for a discussion of different scaling functions for the learning rate. +

      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}) +$$ + +

      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.

      @@ -296,7 +317,7 @@ for a discussion of different scaling functions for the learning rate.

    3275. 34
    3276. 35
    3277. ...
    3278. -
    3279. 46
    3280. +
    3281. 48
    3282. »
    3283. diff --git a/doc/pub/week37/html/._week37-bs026.html b/doc/pub/week37/html/._week37-bs026.html index af0e823ac..b7f2f789a 100644 --- a/doc/pub/week37/html/._week37-bs026.html +++ b/doc/pub/week37/html/._week37-bs026.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
    3284. Program example for gradient descent with Ridge Regression
    3285. Using gradient descent methods, limitations
    3286. Improving gradient descent with momentum
    3287. -
    3288. Same code but now with momentum gradient descent
    3289. -
    3290. Overview video on Stochastic Gradient Descent
    3291. +
    3292. Same code but now with momentum gradient descent
    3293. +
    3294. Overview video on Stochastic Gradient Descent (SGD)
    3295. Batches and mini-batches
    3296. -
    3297. Stochastic Gradient Descent (SGD)
    3298. -
    3299. Stochastic Gradient Descent
    3300. -
    3301. Computation of gradients
    3302. -
    3303. SGD example
    3304. -
    3305. The gradient step
    3306. -
    3307. Simple example code
    3308. -
    3309. When do we stop?
    3310. -
    3311. Slightly different approach
    3312. -
    3313. Time decay rate
    3314. -
    3315. Code with a Number of Minibatches which varies
    3316. -
    3317. Replace or not
    3318. -
    3319. Momentum based GD
    3320. -
    3321. More on momentum based approaches
    3322. -
    3323. Momentum parameter
    3324. -
    3325. Second moment of the gradient
    3326. -
    3327. RMS prop
    3328. -
    3329. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    3330. -
    3331. Algorithms and codes for Adagrad, RMSprop and Adam
    3332. -
    3333. Practical tips
    3334. -
    3335. Sneaking in automatic differentiation using Autograd
    3336. -
    3337. Same code but now with momentum gradient descent
    3338. -
    3339. But none of these can compete with Newton's method
    3340. -
    3341. Including Stochastic Gradient Descent with Autograd
    3342. -
    3343. Same code but now with momentum gradient descent
    3344. -
    3345. Similar (second order function now) problem but now with AdaGrad
    3346. -
    3347. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    3348. -
    3349. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    3350. -
    3351. Material for the lab sessions
    3352. +
    3353. Pros and cons
    3354. +
    3355. Convergence rates
    3356. +
    3357. Accuracy
    3358. +
    3359. Stochastic Gradient Descent (SGD)
    3360. +
    3361. Stochastic Gradient Descent
    3362. +
    3363. Computation of gradients
    3364. +
    3365. SGD example
    3366. +
    3367. The gradient step
    3368. +
    3369. Simple example code
    3370. +
    3371. When do we stop?
    3372. +
    3373. Slightly different approach
    3374. +
    3375. Time decay rate
    3376. +
    3377. Code with a Number of Minibatches which varies
    3378. +
    3379. Replace or not
    3380. +
    3381. Momentum based GD
    3382. +
    3383. More on momentum based approaches
    3384. +
    3385. Momentum parameter
    3386. +
    3387. Second moment of the gradient
    3388. +
    3389. RMS prop
    3390. +
    3391. "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
    3392. +
    3393. Algorithms and codes for Adagrad, RMSprop and Adam
    3394. +
    3395. AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    3396. +
    3397. RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    3398. +
    3399. ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
    3400. +
    3401. Practical tips
    3402. +
    3403. Sneaking in auotmatic differentiation using Autograd
    3404. +
    3405. Same code but now with momentum gradient descent
    3406. +
    3407. Including Stochastic Gradient Descent with Autograd
    3408. +
    3409. Same code but now with momentum gradient descent
    3410. +
    3411. Similar (second order function now) problem but now with AdaGrad
    3412. +
    3413. RMSprop for adaptive learning rate with Stochastic Gradient Descent
    3414. +
    3415. And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
    3416. +
    3417. Material for the lab sessions
    3418. @@ -258,16 +277,7 @@ MathJax.Hub.Config({

       

       

       

      -

      Time decay rate

      - -

      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. -

      +

      Simple example code

      @@ -278,28 +288,18 @@ 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
      +n_epochs = 10 #number of epochs
       
      -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)
      +        #Compute new suggestion for 
               j += 1
      -
      -print("gamma_j after %d epochs: %g" % (n_epochs,gamma_j))
       
    @@ -315,6 +315,14 @@ j = 0 +

    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. +

    @@ -341,7 +349,7 @@ j = 0

  • 35
  • 36
  • ...
  • -
  • 46
  • +
  • 48
  • »
  • diff --git a/doc/pub/week37/html/._week37-bs027.html b/doc/pub/week37/html/._week37-bs027.html index e59a6392a..9a1f03ee5 100644 --- a/doc/pub/week37/html/._week37-bs027.html +++ b/doc/pub/week37/html/._week37-bs027.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -258,97 +277,19 @@ MathJax.Hub.Config({

     

     

     

    -

    Code with a Number of Minibatches which varies

    - -

    In the code here we vary the number of mini-batches.

    - - -
    -
    -
    -
    -
    -
    # Importing various packages
    -from math import exp, sqrt
    -from random import random, seed
    -import numpy as np
    -import matplotlib.pyplot as plt
    -
    -n = 100
    -x = 2*np.random.rand(n,1)
    -y = 4+3*x+np.random.randn(n,1)
    -
    -X = np.c_[np.ones((n,1)), x]
    -XT_X = X.T @ X
    -theta_linreg = np.linalg.inv(X.T @ X) @ (X.T @ y)
    -print("Own inversion")
    -print(theta_linreg)
    -# Hessian matrix
    -H = (2.0/n)* XT_X
    -EigValues, EigVectors = np.linalg.eig(H)
    -print(f"Eigenvalues of Hessian Matrix:{EigValues}")
    -
    -theta = np.random.randn(2,1)
    -eta = 1.0/np.max(EigValues)
    -Niterations = 1000
    -
    -
    -for iter in range(Niterations):
    -    gradients = 2.0/n*X.T @ ((X @ theta)-y)
    -    theta -= eta*gradients
    -print("theta from own gd")
    -print(theta)
    -
    -xnew = np.array([[0],[2]])
    -Xnew = np.c_[np.ones((2,1)), xnew]
    -ypredict = Xnew.dot(theta)
    -ypredict2 = Xnew.dot(theta_linreg)
    -
    -n_epochs = 50
    -M = 5   #size of each minibatch
    -m = int(n/M) #number of minibatches
    -t0, t1 = 5, 50
    -
    -def learning_schedule(t):
    -    return t0/(t+t1)
    -
    -theta = np.random.randn(2,1)
    -
    -for epoch in range(n_epochs):
    -# Can you figure out a better way of setting up the contributions to each batch?
    -    for i in range(m):
    -        random_index = M*np.random.randint(m)
    -        xi = X[random_index:random_index+M]
    -        yi = y[random_index:random_index+M]
    -        gradients = (2.0/M)* xi.T @ ((xi @ 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()
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +

    When do we stop?

    +

    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. +

    @@ -375,7 +316,7 @@ plt.show()

  • 36
  • 37
  • ...
  • -
  • 46
  • +
  • 48
  • »
  • diff --git a/doc/pub/week37/html/._week37-bs028.html b/doc/pub/week37/html/._week37-bs028.html index abcec5972..e9e33bc93 100644 --- a/doc/pub/week37/html/._week37-bs028.html +++ b/doc/pub/week37/html/._week37-bs028.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -258,12 +277,17 @@ MathJax.Hub.Config({

     

     

     

    -

    Replace or not

    +

    Slightly different approach

    -

    In the above code, we have use replacement in setting up the -mini-batches. The discussion -here may be -useful. +

    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. Such approaches are +also called scaling. There are many such ways to scale the learning +rate +and discussions here. See +also +https://towardsdatascience.com/learning-rate-schedules-and-adaptive-learning-rate-methods-for-deep-learning-2c8f433990d1 +for a discussion of different scaling functions for the learning rate.

    @@ -291,7 +315,7 @@ useful.

  • 37
  • 38
  • ...
  • -
  • 46
  • +
  • 48
  • »
  • diff --git a/doc/pub/week37/html/._week37-bs029.html b/doc/pub/week37/html/._week37-bs029.html index e085e692b..202ea0fcc 100644 --- a/doc/pub/week37/html/._week37-bs029.html +++ b/doc/pub/week37/html/._week37-bs029.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -258,39 +277,63 @@ MathJax.Hub.Config({

     

     

     

    -

    Momentum based GD

    +

    Time decay rate

    -

    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 +

    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.

    -$$ -\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{1} -\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 -

    + +
    +
    +
    +
    +
    +
    import numpy as np 
     
    -$$
    -\Delta \boldsymbol{\theta}_{t+1} = \gamma \Delta \boldsymbol{\theta}_t -\ \eta_{t}\nabla_\theta E(\boldsymbol{\theta}_t),
    -$$
    +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))
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    -

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

    @@ -317,7 +360,7 @@ $$

  • 38
  • 39
  • ...
  • -
  • 46
  • +
  • 48
  • »
  • diff --git a/doc/pub/week37/html/._week37-bs030.html b/doc/pub/week37/html/._week37-bs030.html index e149be2ff..4d810a1d2 100644 --- a/doc/pub/week37/html/._week37-bs030.html +++ b/doc/pub/week37/html/._week37-bs030.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -258,30 +277,96 @@ MathJax.Hub.Config({

     

     

     

    -

    More on momentum based approaches

    +

    Code with a Number of Minibatches which varies

    -

    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 -

    +

    In the code here we vary the number of mini-batches.

    -$$ -m {d^2 \mathbf{w} \over dt^2} + \mu {d \mathbf{w} \over dt }= -\nabla_w E(\mathbf{w}). -$$ + +
    +
    +
    +
    +
    +
    # Importing various packages
    +from math import exp, sqrt
    +from random import random, seed
    +import numpy as np
    +import matplotlib.pyplot as plt
     
    -

    We can discretize this equation in the usual way to get

    +n = 100 +x = 2*np.random.rand(n,1) +y = 4+3*x+np.random.randn(n,1) -$$ -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}). -$$ +X = np.c_[np.ones((n,1)), x] +XT_X = X.T @ X +theta_linreg = np.linalg.inv(X.T @ X) @ (X.T @ y) +print("Own inversion") +print(theta_linreg) +# Hessian matrix +H = (2.0/n)* XT_X +EigValues, EigVectors = np.linalg.eig(H) +print(f"Eigenvalues of Hessian Matrix:{EigValues}") -

    Rearranging this equation, we can rewrite this as

    +theta = np.random.randn(2,1) +eta = 1.0/np.max(EigValues) +Niterations = 1000 -$$ -\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. -$$ + +for iter in range(Niterations): + gradients = 2.0/n*X.T @ ((X @ theta)-y) + theta -= eta*gradients +print("theta from own gd") +print(theta) + +xnew = np.array([[0],[2]]) +Xnew = np.c_[np.ones((2,1)), xnew] +ypredict = Xnew.dot(theta) +ypredict2 = Xnew.dot(theta_linreg) + +n_epochs = 50 +M = 5 #size of each minibatch +m = int(n/M) #number of minibatches +t0, t1 = 5, 50 + +def learning_schedule(t): + return t0/(t+t1) + +theta = np.random.randn(2,1) + +for epoch in range(n_epochs): +# Can you figure out a better way of setting up the contributions to each batch? + for i in range(m): + random_index = M*np.random.randint(m) + xi = X[random_index:random_index+M] + yi = y[random_index:random_index+M] + gradients = (2.0/M)* xi.T @ ((xi @ 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() +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    @@ -309,7 +394,7 @@ $$

  • 39
  • 40
  • ...
  • -
  • 46
  • +
  • 48
  • »
  • diff --git a/doc/pub/week37/html/._week37-bs031.html b/doc/pub/week37/html/._week37-bs031.html index 1463b079c..58b507ddc 100644 --- a/doc/pub/week37/html/._week37-bs031.html +++ b/doc/pub/week37/html/._week37-bs031.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -258,58 +277,14 @@ MathJax.Hub.Config({

     

     

     

    -

    Momentum parameter

    +

    Replace or not

    -

    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: +

    In the above code, we have use replacement in setting up the +mini-batches. The discussion +here may be +useful.

    -$$ -\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{2} -\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/week37/html/._week37-bs032.html b/doc/pub/week37/html/._week37-bs032.html index 21fd568cf..c368a7e16 100644 --- a/doc/pub/week37/html/._week37-bs032.html +++ b/doc/pub/week37/html/._week37-bs032.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -258,31 +277,40 @@ MathJax.Hub.Config({

     

     

     

    -

    Second moment of the gradient

    +

    Momentum based GD

    -

    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. +

    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

    -

    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, Root Mean Squared Propagation (RMS-Prop), and -ADAM. +$$ +\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{1} +\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/week37/html/._week37-bs033.html b/doc/pub/week37/html/._week37-bs033.html index a375fe4c2..e18d330fb 100644 --- a/doc/pub/week37/html/._week37-bs033.html +++ b/doc/pub/week37/html/._week37-bs033.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -258,33 +277,31 @@ MathJax.Hub.Config({

     

     

     

    -

    RMS prop

    +

    More on momentum based approaches

    -

    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 +

    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

    $$ -\begin{align} -\mathbf{g}_t &= \nabla_\theta E(\boldsymbol{\theta}) -\tag{3}\\ -\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} +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. $$ -

    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. -

    @@ -311,7 +328,7 @@ learning rate for flat directions.

  • 42
  • 43
  • ...
  • -
  • 46
  • +
  • 48
  • »
  • diff --git a/doc/pub/week37/html/._week37-bs034.html b/doc/pub/week37/html/._week37-bs034.html index 1d4ebc309..c443a8f65 100644 --- a/doc/pub/week37/html/._week37-bs034.html +++ b/doc/pub/week37/html/._week37-bs034.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -258,60 +277,60 @@ MathJax.Hub.Config({

     

     

     

    -

    ADAM optimizer

    +

    Momentum parameter

    -

    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. The method isefficient when working with large -problems involving lots data and/or parameters. It is a combination of the -gradient descent with momentum algorithm and the RMSprop algorithm -discussed above. +

    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:

    -

    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) +$$ +\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{g}_t &= \nabla_\theta E(\boldsymbol{\theta}) -\tag{4}\\ -\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 \\ -\boldsymbol{\mathbf{m}}_t&={\mathbf{m}_t \over 1-\beta_1^t} \nonumber \\ -\boldsymbol{\mathbf{s}}_t &={\mathbf{s}_t \over1-\beta_2^t} \nonumber \\ -\boldsymbol{\theta}_{t+1}&=\boldsymbol{\theta}_t - \eta_t { \boldsymbol{\mathbf{m}}_t \over \sqrt{\boldsymbol{\mathbf{s}}_t} +\epsilon}, \nonumber \\ -\tag{5} +\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{2} \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. +

    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 \).

    -

    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 = \boldsymbol{\mathbf{s}}_t - -(\boldsymbol{\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 { \boldsymbol{m}_t \over \sqrt{\sigma_t^2 + m_t^2 }+\epsilon}. -$$ - -

    diff --git a/doc/pub/week37/html/._week37-bs035.html b/doc/pub/week37/html/._week37-bs035.html index 8d2b305ee..d835233f4 100644 --- a/doc/pub/week37/html/._week37-bs035.html +++ b/doc/pub/week37/html/._week37-bs035.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -258,11 +277,30 @@ MathJax.Hub.Config({

     

     

     

    -

    Algorithms and codes for Adagrad, RMSprop and Adam

    +

    Second moment of the gradient

    -

    The algorithms we have implemented are well described in the text by Goodfellow, Bengio and Courville, chapter 8.

    +

    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. +

    -

    The codes which implement these algorithms are discussed below here.

    +

    During the last decade 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, Root Mean Squared Propagation (RMS-Prop), and +ADAM. +

    @@ -289,7 +327,7 @@ MathJax.Hub.Config({

  • 44
  • 45
  • ...
  • -
  • 46
  • +
  • 48
  • »
  • diff --git a/doc/pub/week37/html/._week37-bs036.html b/doc/pub/week37/html/._week37-bs036.html index e3d652f14..8f8250e24 100644 --- a/doc/pub/week37/html/._week37-bs036.html +++ b/doc/pub/week37/html/._week37-bs036.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -258,14 +277,34 @@ MathJax.Hub.Config({

     

     

     

    -

    Practical tips

    +

    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{3}\\ +\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/week37/html/._week37-bs037.html b/doc/pub/week37/html/._week37-bs037.html index 32d254b75..95a6cb8b2 100644 --- a/doc/pub/week37/html/._week37-bs037.html +++ b/doc/pub/week37/html/._week37-bs037.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -258,82 +277,58 @@ MathJax.Hub.Config({

     

     

     

    -

    Sneaking in automatic differentiation using Autograd

    +

    ADAM optimizer

    -

    We anticipate our discussions to come in connection with neural networks and automatic differentiation -by showing how we can use autograd for the cases above. Later we will replace autograd with JAX. +

    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. The method isefficient when working with large +problems involving lots data and/or parameters. It is a combination of the +gradient descent with momentum algorithm and the RMSprop algorithm +discussed above.

    +

    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) +

    - -
    -
    -
    -
    -
    -
    # Using Autograd to calculate gradients for OLS
    -from random import random, seed
    -import numpy as np
    -import autograd.numpy as np
    -import matplotlib.pyplot as plt
    -from autograd import grad
    +$$
    +\begin{align}
    +\mathbf{g}_t &= \nabla_\theta E(\boldsymbol{\theta}) 
    +\tag{4}\\
    +\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 \\
    +\boldsymbol{\mathbf{m}}_t&={\mathbf{m}_t \over 1-\beta_1^t} \nonumber \\
    +\boldsymbol{\mathbf{s}}_t &={\mathbf{s}_t \over1-\beta_2^t} \nonumber \\
    +\boldsymbol{\theta}_{t+1}&=\boldsymbol{\theta}_t - \eta_t { \boldsymbol{\mathbf{m}}_t \over \sqrt{\boldsymbol{\mathbf{s}}_t} +\epsilon}, \nonumber \\
    +\tag{5}
    +\end{align}
    +$$
     
    -def CostOLS(beta):
    -    return (1.0/n)*np.sum((y-X @ beta)**2)
    +

    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 = 100 -x = 2*np.random.rand(n,1) -y = 4+3*x+np.random.randn(n,1) +

    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 = \boldsymbol{\mathbf{s}}_t - +(\boldsymbol{\mathbf{m}}_t)^2 \). Consider a single parameter \( \theta_t \). The +update rule for this parameter is given by +

    -X = np.c_[np.ones((n,1)), x] -XT_X = X.T @ X -theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y) -print("Own inversion") -print(theta_linreg) -# Hessian matrix -H = (2.0/n)* XT_X -EigValues, EigVectors = np.linalg.eig(H) -print(f"Eigenvalues of Hessian Matrix:{EigValues}") - -theta = np.random.randn(2,1) -eta = 1.0/np.max(EigValues) -Niterations = 1000 -# define the gradient -training_gradient = grad(CostOLS) - -for iter in range(Niterations): - gradients = training_gradient(theta) - theta -= eta*gradients -print("theta from own gd") -print(theta) - -xnew = np.array([[0],[2]]) -Xnew = np.c_[np.ones((2,1)), xnew] -ypredict = Xnew.dot(theta) -ypredict2 = Xnew.dot(theta_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'Random numbers ') -plt.show() -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +$$ +\Delta \theta_{t+1}= -\eta_t { \boldsymbol{m}_t \over \sqrt{\sigma_t^2 + m_t^2 }+\epsilon}. +$$

    @@ -359,6 +354,9 @@ plt.show()

  • 44
  • 45
  • 46
  • +
  • 47
  • +
  • ...
  • +
  • 48
  • »
  • diff --git a/doc/pub/week37/html/._week37-bs038.html b/doc/pub/week37/html/._week37-bs038.html index 0d2d20f03..706f006ab 100644 --- a/doc/pub/week37/html/._week37-bs038.html +++ b/doc/pub/week37/html/._week37-bs038.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -258,82 +277,32 @@ MathJax.Hub.Config({

     

     

     

    -

    Same code but now with momentum gradient descent

    +

    Algorithms and codes for Adagrad, RMSprop and Adam

    - -
    -
    -
    -
    -
    -
    # Using Autograd to calculate gradients for OLS
    -from random import random, seed
    -import numpy as np
    -import autograd.numpy as np
    -import matplotlib.pyplot as plt
    -from autograd import grad
    +

    The algorithms we have implemented are well described in the text by Goodfellow, Bengio and Courville, chapter 8.

    -def CostOLS(beta): - return (1.0/n)*np.sum((y-X @ beta)**2) +

    The codes which implement these algorithms are discussed after our presentation of automatic differentiation.

    +

    AdaGrad algorithm, taken from Goodfellow et al

    -n = 100 -x = 2*np.random.rand(n,1) -y = 4+3*x#+np.random.randn(n,1) +

    +
    +

    +
    +

    +

    RMSProp algorithm, taken from Goodfellow et al

    -X = np.c_[np.ones((n,1)), x] -XT_X = X.T @ X -theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y) -print("Own inversion") -print(theta_linreg) -# Hessian matrix -H = (2.0/n)* XT_X -EigValues, EigVectors = np.linalg.eig(H) -print(f"Eigenvalues of Hessian Matrix:{EigValues}") - -theta = np.random.randn(2,1) -eta = 1.0/np.max(EigValues) -Niterations = 30 - -# define the gradient -training_gradient = grad(CostOLS) - -for iter in range(Niterations): - gradients = training_gradient(theta) - theta -= eta*gradients - print(iter,gradients[0],gradients[1]) -print("theta from own gd") -print(theta) - -# Now improve with momentum gradient descent -change = 0.0 -delta_momentum = 0.3 -for iter in range(Niterations): - # calculate gradient - gradients = training_gradient(theta) - # calculate update - new_change = eta*gradients+delta_momentum*change - # take a step - theta -= new_change - # save the change - change = new_change - print(iter,gradients[0],gradients[1]) -print("theta from own gd wth momentum") -print(theta) -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    +

    +
    +

    +
    +

    +

    ADAM algorithm, taken from Goodfellow et al

    +

    +
    +

    +
    +

    @@ -357,6 +326,8 @@ delta_momentum = 44

  • 45
  • 46
  • +
  • 47
  • +
  • 48
  • »
  • diff --git a/doc/pub/week37/html/._week37-bs039.html b/doc/pub/week37/html/._week37-bs039.html index 7aadc4545..dcc694333 100644 --- a/doc/pub/week37/html/._week37-bs039.html +++ b/doc/pub/week37/html/._week37-bs039.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -258,69 +277,14 @@ MathJax.Hub.Config({

     

     

     

    -

    But none of these can compete with Newton's method

    - - - -
    -
    -
    -
    -
    -
    # Using Newton's method
    -from random import random, seed
    -import numpy as np
    -import autograd.numpy as np
    -import matplotlib.pyplot as plt
    -from autograd import grad
    -
    -def CostOLS(beta):
    -    return (1.0/n)*np.sum((y-X @ beta)**2)
    -
    -n = 100
    -x = 2*np.random.rand(n,1)
    -y = 4+3*x+np.random.randn(n,1)
    -
    -X = np.c_[np.ones((n,1)), x]
    -XT_X = X.T @ X
    -beta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)
    -print("Own inversion")
    -print(beta_linreg)
    -# Hessian matrix
    -H = (2.0/n)* XT_X
    -# Note that here the Hessian does not depend on the parameters beta
    -invH = np.linalg.pinv(H)
    -EigValues, EigVectors = np.linalg.eig(H)
    -print(f"Eigenvalues of Hessian Matrix:{EigValues}")
    -
    -beta = np.random.randn(2,1)
    -Niterations = 5
    -
    -# define the gradient
    -training_gradient = grad(CostOLS)
    -
    -for iter in range(Niterations):
    -    gradients = training_gradient(beta)
    -    beta -= invH @ gradients
    -    print(iter,gradients[0],gradients[1])
    -print("beta from own Newton code")
    -print(beta)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - +

    Practical tips

    +

    diff --git a/doc/pub/week37/html/._week37-bs040.html b/doc/pub/week37/html/._week37-bs040.html index e6c23f356..4d8cb7c5d 100644 --- a/doc/pub/week37/html/._week37-bs040.html +++ b/doc/pub/week37/html/._week37-bs040.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -258,8 +277,12 @@ MathJax.Hub.Config({

     

     

     

    -

    Including Stochastic Gradient Descent with Autograd

    -

    In this code we include the stochastic gradient descent approach discussed above. Note here that we specify which argument we are taking the derivative with respect to when using autograd.

    +

    Sneaking in auotmatic differentiation using Autograd

    + +

    We conclude the part on optmization by showing how we can make codes +for linear regression and logistic regression using autograd. The +first example shows results with ordinary leats squares. +

    @@ -268,17 +291,15 @@ MathJax.Hub.Config({
    -
    # Using Autograd to calculate gradients using SGD
    -# OLS example
    +  
    # Using Autograd to calculate gradients for OLS
     from random import random, seed
     import numpy as np
     import autograd.numpy as np
     import matplotlib.pyplot as plt
     from autograd import grad
     
    -# Note change from previous example
    -def CostOLS(y,X,theta):
    -    return np.sum((y-X @ theta)**2)
    +def CostOLS(beta):
    +    return (1.0/n)*np.sum((y-X @ beta)**2)
     
     n = 100
     x = 2*np.random.rand(n,1)
    @@ -297,12 +318,11 @@ EigValues, EigVectors = np= np.random.randn(2,1)
     eta = 1.0/np.max(EigValues)
     Niterations = 1000
    -
    -# Note that we request the derivative wrt third argument (theta, 2 here)
    -training_gradient = grad(CostOLS,2)
    +# define the gradient
    +training_gradient = grad(CostOLS)
     
     for iter in range(Niterations):
    -    gradients = (1.0/n)*training_gradient(y, X, theta)
    +    gradients = training_gradient(theta)
         theta -= eta*gradients
     print("theta from own gd")
     print(theta)
    @@ -320,27 +340,6 @@ plt.xlabel(r
     plt.ylabel(r'$y$')
     plt.title(r'Random numbers ')
     plt.show()
    -
    -n_epochs = 50
    -M = 5   #size of each minibatch
    -m = int(n/M) #number of minibatches
    -t0, t1 = 5, 50
    -def learning_schedule(t):
    -    return t0/(t+t1)
    -
    -theta = np.random.randn(2,1)
    -
    -for epoch in range(n_epochs):
    -# Can you figure out a better way of setting up the contributions to each batch?
    -    for i in range(m):
    -        random_index = M*np.random.randint(m)
    -        xi = X[random_index:random_index+M]
    -        yi = y[random_index:random_index+M]
    -        gradients = (1.0/M)*training_gradient(yi, xi, theta)
    -        eta = learning_schedule(epoch*m+i)
    -        theta = theta - eta*gradients
    -print("theta from own sdg")
    -print(theta)
     
    @@ -377,6 +376,8 @@ theta = np.44
  • 45
  • 46
  • +
  • 47
  • +
  • 48
  • »
  • diff --git a/doc/pub/week37/html/._week37-bs041.html b/doc/pub/week37/html/._week37-bs041.html index ee18c3199..ca7cb828b 100644 --- a/doc/pub/week37/html/._week37-bs041.html +++ b/doc/pub/week37/html/._week37-bs041.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -266,21 +285,19 @@ MathJax.Hub.Config({
    -
    # Using Autograd to calculate gradients using SGD
    -# OLS example
    +  
    # Using Autograd to calculate gradients for OLS
     from random import random, seed
     import numpy as np
     import autograd.numpy as np
     import matplotlib.pyplot as plt
     from autograd import grad
     
    -# Note change from previous example
    -def CostOLS(y,X,theta):
    -    return np.sum((y-X @ theta)**2)
    +def CostOLS(beta):
    +    return (1.0/n)*np.sum((y-X @ beta)**2)
     
     n = 100
     x = 2*np.random.rand(n,1)
    -y = 4+3*x+np.random.randn(n,1)
    +y = 4+3*x#+np.random.randn(n,1)
     
     X = np.c_[np.ones((n,1)), x]
     XT_X = X.T @ X
    @@ -294,44 +311,32 @@ EigValues, EigVectors = np= np.random.randn(2,1)
     eta = 1.0/np.max(EigValues)
    -Niterations = 100
    +Niterations = 30
     
    -# Note that we request the derivative wrt third argument (theta, 2 here)
    -training_gradient = grad(CostOLS,2)
    +# define the gradient
    +training_gradient = grad(CostOLS)
     
     for iter in range(Niterations):
    -    gradients = (1.0/n)*training_gradient(y, X, theta)
    +    gradients = training_gradient(theta)
         theta -= eta*gradients
    +    print(iter,gradients[0],gradients[1])
     print("theta from own gd")
     print(theta)
     
    -
    -n_epochs = 50
    -M = 5   #size of each minibatch
    -m = int(n/M) #number of minibatches
    -t0, t1 = 5, 50
    -def learning_schedule(t):
    -    return t0/(t+t1)
    -
    -theta = np.random.randn(2,1)
    -
    +# Now improve with momentum gradient descent
     change = 0.0
     delta_momentum = 0.3
    -
    -for epoch in range(n_epochs):
    -    for i in range(m):
    -        random_index = M*np.random.randint(m)
    -        xi = X[random_index:random_index+M]
    -        yi = y[random_index:random_index+M]
    -        gradients = (1.0/M)*training_gradient(yi, xi, theta)
    -        eta = learning_schedule(epoch*m+i)
    -        # calculate update
    -        new_change = eta*gradients+delta_momentum*change
    -        # take a step
    -        theta -= new_change
    -        # save the change
    -        change = new_change
    -print("theta from own sdg with momentum")
    +for iter in range(Niterations):
    +    # calculate gradient
    +    gradients = training_gradient(theta)
    +    # calculate update
    +    new_change = eta*gradients+delta_momentum*change
    +    # take a step
    +    theta -= new_change
    +    # save the change
    +    change = new_change
    +    print(iter,gradients[0],gradients[1])
    +print("theta from own gd wth momentum")
     print(theta)
     
    @@ -368,6 +373,8 @@ delta_momentum = 44
  • 45
  • 46
  • +
  • 47
  • +
  • 48
  • »
  • diff --git a/doc/pub/week37/html/._week37-bs042.html b/doc/pub/week37/html/._week37-bs042.html index ee24d5f87..d0a1066f6 100644 --- a/doc/pub/week37/html/._week37-bs042.html +++ b/doc/pub/week37/html/._week37-bs042.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -258,7 +277,9 @@ MathJax.Hub.Config({

     

     

     

    -

    Similar (second order function now) problem but now with AdaGrad

    +

    Including Stochastic Gradient Descent with Autograd

    +

    In this code we include the stochastic gradient descent approach discussed above. Note here that we specify which argument we are taking the derivative with respect to when using autograd.

    +
    @@ -266,7 +287,7 @@ MathJax.Hub.Config({
    -
    # Using Autograd to calculate gradients using AdaGrad and Stochastic Gradient descent
    +  
    # Using Autograd to calculate gradients using SGD
     # OLS example
     from random import random, seed
     import numpy as np
    @@ -278,41 +299,66 @@ MathJax.Hub.Config({
     def CostOLS(y,X,theta):
         return np.sum((y-X @ theta)**2)
     
    -n = 1000
    -x = np.random.rand(n,1)
    -y = 2.0+3*x +4*x*x
    +n = 100
    +x = 2*np.random.rand(n,1)
    +y = 4+3*x+np.random.randn(n,1)
     
    -X = np.c_[np.ones((n,1)), x, x*x]
    +X = np.c_[np.ones((n,1)), x]
     XT_X = X.T @ X
     theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)
     print("Own inversion")
     print(theta_linreg)
    +# Hessian matrix
    +H = (2.0/n)* XT_X
    +EigValues, EigVectors = np.linalg.eig(H)
    +print(f"Eigenvalues of Hessian Matrix:{EigValues}")
     
    +theta = np.random.randn(2,1)
    +eta = 1.0/np.max(EigValues)
    +Niterations = 1000
     
     # Note that we request the derivative wrt third argument (theta, 2 here)
     training_gradient = grad(CostOLS,2)
    -# Define parameters for Stochastic Gradient Descent
    +
    +for iter in range(Niterations):
    +    gradients = (1.0/n)*training_gradient(y, X, theta)
    +    theta -= eta*gradients
    +print("theta from own gd")
    +print(theta)
    +
    +xnew = np.array([[0],[2]])
    +Xnew = np.c_[np.ones((2,1)), xnew]
    +ypredict = Xnew.dot(theta)
    +ypredict2 = Xnew.dot(theta_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'Random numbers ')
    +plt.show()
    +
     n_epochs = 50
     M = 5   #size of each minibatch
     m = int(n/M) #number of minibatches
    -# Guess for unknown parameters theta
    -theta = np.random.randn(3,1)
    +t0, t1 = 5, 50
    +def learning_schedule(t):
    +    return t0/(t+t1)
    +
    +theta = np.random.randn(2,1)
     
    -# Value for learning rate
    -eta = 0.01
    -# Including AdaGrad parameter to avoid possible division by zero
    -delta  = 1e-8
     for epoch in range(n_epochs):
    -    Giter = 0.0
    +# Can you figure out a better way of setting up the contributions to each batch?
         for i in range(m):
             random_index = M*np.random.randint(m)
             xi = X[random_index:random_index+M]
             yi = y[random_index:random_index+M]
             gradients = (1.0/M)*training_gradient(yi, xi, theta)
    -        Giter += gradients*gradients
    -        update = gradients*eta/(delta+np.sqrt(Giter))
    -        theta -= update
    -print("theta from own AdaGrad")
    +        eta = learning_schedule(epoch*m+i)
    +        theta = theta - eta*gradients
    +print("theta from own sdg")
     print(theta)
     
    @@ -329,7 +375,6 @@ delta = 1e-8
    -

    Running this code we note an almost perfect agreement with the results from matrix inversion.

    @@ -349,6 +394,8 @@ delta = 1e-844

  • 45
  • 46
  • +
  • 47
  • +
  • 48
  • »
  • diff --git a/doc/pub/week37/html/._week37-bs043.html b/doc/pub/week37/html/._week37-bs043.html index 95d62990c..ffedd3995 100644 --- a/doc/pub/week37/html/._week37-bs043.html +++ b/doc/pub/week37/html/._week37-bs043.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -258,7 +277,7 @@ MathJax.Hub.Config({

     

     

     

    -

    RMSprop for adaptive learning rate with Stochastic Gradient Descent

    +

    Same code but now with momentum gradient descent

    @@ -266,7 +285,7 @@ MathJax.Hub.Config({
    -
    # Using Autograd to calculate gradients using RMSprop  and Stochastic Gradient descent
    +  
    # Using Autograd to calculate gradients using SGD
     # OLS example
     from random import random, seed
     import numpy as np
    @@ -278,47 +297,60 @@ MathJax.Hub.Config({
     def CostOLS(y,X,theta):
         return np.sum((y-X @ theta)**2)
     
    -n = 1000
    -x = np.random.rand(n,1)
    -y = 2.0+3*x +4*x*x# +np.random.randn(n,1)
    +n = 100
    +x = 2*np.random.rand(n,1)
    +y = 4+3*x+np.random.randn(n,1)
     
    -X = np.c_[np.ones((n,1)), x, x*x]
    +X = np.c_[np.ones((n,1)), x]
     XT_X = X.T @ X
     theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)
     print("Own inversion")
     print(theta_linreg)
    +# Hessian matrix
    +H = (2.0/n)* XT_X
    +EigValues, EigVectors = np.linalg.eig(H)
    +print(f"Eigenvalues of Hessian Matrix:{EigValues}")
     
    +theta = np.random.randn(2,1)
    +eta = 1.0/np.max(EigValues)
    +Niterations = 100
     
     # Note that we request the derivative wrt third argument (theta, 2 here)
     training_gradient = grad(CostOLS,2)
    -# Define parameters for Stochastic Gradient Descent
    +
    +for iter in range(Niterations):
    +    gradients = (1.0/n)*training_gradient(y, X, theta)
    +    theta -= eta*gradients
    +print("theta from own gd")
    +print(theta)
    +
    +
     n_epochs = 50
     M = 5   #size of each minibatch
     m = int(n/M) #number of minibatches
    -# Guess for unknown parameters theta
    -theta = np.random.randn(3,1)
    +t0, t1 = 5, 50
    +def learning_schedule(t):
    +    return t0/(t+t1)
    +
    +theta = np.random.randn(2,1)
    +
    +change = 0.0
    +delta_momentum = 0.3
     
    -# Value for learning rate
    -eta = 0.01
    -# Value for parameter rho
    -rho = 0.99
    -# Including AdaGrad parameter to avoid possible division by zero
    -delta  = 1e-8
     for epoch in range(n_epochs):
    -    Giter = 0.0
         for i in range(m):
             random_index = M*np.random.randint(m)
             xi = X[random_index:random_index+M]
             yi = y[random_index:random_index+M]
             gradients = (1.0/M)*training_gradient(yi, xi, theta)
    -	# Accumulated gradient
    -	# Scaling with rho the new and the previous results
    -        Giter = (rho*Giter+(1-rho)*gradients*gradients)
    -	# Taking the diagonal only and inverting
    -        update = gradients*eta/(delta+np.sqrt(Giter))
    -	# Hadamard product
    -        theta -= update
    -print("theta from own RMSprop")
    +        eta = learning_schedule(epoch*m+i)
    +        # calculate update
    +        new_change = eta*gradients+delta_momentum*change
    +        # take a step
    +        theta -= new_change
    +        # save the change
    +        change = new_change
    +print("theta from own sdg with momentum")
     print(theta)
     
    @@ -353,6 +385,8 @@ delta = 1e-844
  • 45
  • 46
  • +
  • 47
  • +
  • 48
  • »
  • diff --git a/doc/pub/week37/html/._week37-bs044.html b/doc/pub/week37/html/._week37-bs044.html index 8bebe3729..7324f3be7 100644 --- a/doc/pub/week37/html/._week37-bs044.html +++ b/doc/pub/week37/html/._week37-bs044.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -258,8 +277,7 @@ MathJax.Hub.Config({

     

     

     

    -

    And finally ADAM

    - +

    Similar (second order function now) problem but now with AdaGrad

    @@ -267,7 +285,7 @@ MathJax.Hub.Config({
    -
    # Using Autograd to calculate gradients using RMSprop  and Stochastic Gradient descent
    +  
    # Using Autograd to calculate gradients using AdaGrad and Stochastic Gradient descent
     # OLS example
     from random import random, seed
     import numpy as np
    @@ -281,7 +299,7 @@ MathJax.Hub.Config({
     
     n = 1000
     x = np.random.rand(n,1)
    -y = 2.0+3*x +4*x*x# +np.random.randn(n,1)
    +y = 2.0+3*x +4*x*x
     
     X = np.c_[np.ones((n,1)), x, x*x]
     XT_X = X.T @ X
    @@ -301,30 +319,19 @@ theta = np.# Value for learning rate
     eta = 0.01
    -# Value for parameters beta1 and beta2, see https://arxiv.org/abs/1412.6980
    -beta1 = 0.9
    -beta2 = 0.999
     # Including AdaGrad parameter to avoid possible division by zero
    -delta  = 1e-7
    -iter = 0
    +delta  = 1e-8
     for epoch in range(n_epochs):
    -    first_moment = 0.0
    -    second_moment = 0.0
    -    iter += 1
    +    Giter = 0.0
         for i in range(m):
             random_index = M*np.random.randint(m)
             xi = X[random_index:random_index+M]
             yi = y[random_index:random_index+M]
             gradients = (1.0/M)*training_gradient(yi, xi, theta)
    -        # Computing moments first
    -        first_moment = beta1*first_moment + (1-beta1)*gradients
    -        second_moment = beta2*second_moment+(1-beta2)*gradients*gradients
    -        first_term = first_moment/(1.0-beta1**iter)
    -        second_term = second_moment/(1.0-beta2**iter)
    -	# Scaling with rho the new and the previous results
    -        update = eta*first_term/(np.sqrt(second_term)+delta)
    +        Giter += gradients*gradients
    +        update = gradients*eta/(delta+np.sqrt(Giter))
             theta -= update
    -print("theta from own ADAM")
    +print("theta from own AdaGrad")
     print(theta)
     
    @@ -341,6 +348,7 @@ delta = 1e-7
    +

    Running this code we note an almost perfect agreement with the results from matrix inversion.

    @@ -358,6 +366,8 @@ delta = 1e-744

  • 45
  • 46
  • +
  • 47
  • +
  • 48
  • »
  • diff --git a/doc/pub/week37/html/._week37-bs045.html b/doc/pub/week37/html/._week37-bs045.html index 74fba6165..addba1319 100644 --- a/doc/pub/week37/html/._week37-bs045.html +++ b/doc/pub/week37/html/._week37-bs045.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -258,22 +277,84 @@ MathJax.Hub.Config({

     

     

     

    -

    Material for the lab sessions

    +

    RMSprop for adaptive learning rate with Stochastic Gradient Descent

    -
    -
    - -
      -
    1. Exercise set for week 37
    2. -
    3. Work on project 1 -
    4. -
        -
      • For more discussions of Ridge regression and calculation of averages, Wessel van Wieringen's article is highly recommended.
      • -
      -
    + +
    +
    +
    +
    +
    +
    # Using Autograd to calculate gradients using RMSprop  and Stochastic Gradient descent
    +# OLS example
    +from random import random, seed
    +import numpy as np
    +import autograd.numpy as np
    +import matplotlib.pyplot as plt
    +from autograd import grad
    +
    +# Note change from previous example
    +def CostOLS(y,X,theta):
    +    return np.sum((y-X @ theta)**2)
    +
    +n = 1000
    +x = np.random.rand(n,1)
    +y = 2.0+3*x +4*x*x# +np.random.randn(n,1)
    +
    +X = np.c_[np.ones((n,1)), x, x*x]
    +XT_X = X.T @ X
    +theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)
    +print("Own inversion")
    +print(theta_linreg)
    +
    +
    +# Note that we request the derivative wrt third argument (theta, 2 here)
    +training_gradient = grad(CostOLS,2)
    +# Define parameters for Stochastic Gradient Descent
    +n_epochs = 50
    +M = 5   #size of each minibatch
    +m = int(n/M) #number of minibatches
    +# Guess for unknown parameters theta
    +theta = np.random.randn(3,1)
    +
    +# Value for learning rate
    +eta = 0.01
    +# Value for parameter rho
    +rho = 0.99
    +# Including AdaGrad parameter to avoid possible division by zero
    +delta  = 1e-8
    +for epoch in range(n_epochs):
    +    Giter = 0.0
    +    for i in range(m):
    +        random_index = M*np.random.randint(m)
    +        xi = X[random_index:random_index+M]
    +        yi = y[random_index:random_index+M]
    +        gradients = (1.0/M)*training_gradient(yi, xi, theta)
    +	# Accumulated gradient
    +	# Scaling with rho the new and the previous results
    +        Giter = (rho*Giter+(1-rho)*gradients*gradients)
    +	# Taking the diagonal only and inverting
    +        update = gradients*eta/(delta+np.sqrt(Giter))
    +	# Hadamard product
    +        theta -= update
    +print("theta from own RMSprop")
    +print(theta)
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    - + +

      @@ -289,6 +370,9 @@ MathJax.Hub.Config({
    • 44
    • 45
    • 46
    • +
    • 47
    • +
    • 48
    • +
    • »
    diff --git a/doc/pub/week37/html/._week37-bs046.html b/doc/pub/week37/html/._week37-bs046.html index 9da2c6905..669e81735 100644 --- a/doc/pub/week37/html/._week37-bs046.html +++ b/doc/pub/week37/html/._week37-bs046.html @@ -40,159 +40,148 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'plans-for-week-37-lecture-monday'), - ('Plans for week 37, lab sessions', + ('Readings and Videos:', 2, None, 'readings-and-videos'), + ('Material for lecture Monday September 8', 2, None, - 'plans-for-week-37-lab-sessions'), - ('Material for lecture Monday September 9', + 'material-for-lecture-monday-september-8'), + ('Gradient descent and revisiting Ordinary Least Squares from ' + 'last week', 2, None, - 'material-for-lecture-monday-september-9'), - ('Deriving OLS from a probability distribution', + 'gradient-descent-and-revisiting-ordinary-least-squares-from-last-week'), + ('Gradient descent example', 2, None, 'gradient-descent-example'), + ('The derivative of the cost/loss function', 2, None, - 'deriving-ols-from-a-probability-distribution'), - ('Independent and Identically Distrubuted (iid)', + 'the-derivative-of-the-cost-loss-function'), + ('The Hessian matrix', 2, None, 'the-hessian-matrix'), + ('Simple program', 2, None, 'simple-program'), + ('Gradient Descent Example', 2, None, 'gradient-descent-example'), + ('Gradient descent and Ridge', 2, None, - 'independent-and-identically-distrubuted-iid'), - ('Maximum Likelihood Estimation (MLE)', + 'gradient-descent-and-ridge'), + ('The Hessian matrix for Ridge Regression', 2, None, - 'maximum-likelihood-estimation-mle'), - ('A new Cost Function', 2, None, 'a-new-cost-function'), - ("More basic Statistics and Bayes' theorem", + 'the-hessian-matrix-for-ridge-regression'), + ('Program example for gradient descent with Ridge Regression', 2, None, - 'more-basic-statistics-and-bayes-theorem'), - ('Marginal Probability', 2, None, 'marginal-probability'), - ('Conditional Probability', 2, None, 'conditional-probability'), - ("Bayes' Theorem", 2, None, 'bayes-theorem'), - ("Interpretations of Bayes' Theorem", + 'program-example-for-gradient-descent-with-ridge-regression'), + ('Using gradient descent methods, limitations', 2, None, - 'interpretations-of-bayes-theorem'), - ("Example of Usage of Bayes' theorem", + 'using-gradient-descent-methods-limitations'), + ('Improving gradient descent with momentum', 2, None, - 'example-of-usage-of-bayes-theorem'), - ('Doing it correctly', 2, None, 'doing-it-correctly'), - ("Bayes' Theorem and Ridge and Lasso Regression", + 'improving-gradient-descent-with-momentum'), + ('Same code but now with momentum gradient descent', 2, None, - 'bayes-theorem-and-ridge-and-lasso-regression'), - ('Ridge and Bayes', 2, None, 'ridge-and-bayes'), - ('Lasso and Bayes', 2, None, 'lasso-and-bayes'), - ('Why resampling methods', 2, None, 'why-resampling-methods'), - ('Resampling methods', 2, None, 'resampling-methods'), - ('Resampling approaches can be computationally expensive', + 'same-code-but-now-with-momentum-gradient-descent'), + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'resampling-approaches-can-be-computationally-expensive'), - ('Why resampling methods ?', 2, None, 'why-resampling-methods'), - ('Statistical analysis', 2, None, 'statistical-analysis'), - ('Resampling methods', 2, None, 'resampling-methods'), - ('Resampling methods: Bootstrap', + 'overview-video-on-stochastic-gradient-descent-sgd'), + ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), + ('Stochastic Gradient Descent (SGD)', 2, None, - 'resampling-methods-bootstrap'), - ('The Central Limit Theorem', + 'stochastic-gradient-descent-sgd'), + ('Stochastic Gradient Descent', 2, None, - 'the-central-limit-theorem'), - ('Finding the Limit', 2, None, 'finding-the-limit'), - ('Rewriting the $\\delta$-function', + 'stochastic-gradient-descent'), + ('Computation of gradients', 2, None, 'computation-of-gradients'), + ('SGD example', 2, None, 'sgd-example'), + ('The gradient step', 2, None, 'the-gradient-step'), + ('Simple example code', 2, None, 'simple-example-code'), + ('When do we stop?', 2, None, 'when-do-we-stop'), + ('Slightly different approach', 2, None, - 'rewriting-the-delta-function'), - ('Identifying Terms', 2, None, 'identifying-terms'), - ('Wrapping it up', 2, None, 'wrapping-it-up'), - ('Confidence Intervals', 2, None, 'confidence-intervals'), - ('Standard Approach based on the Normal Distribution', + 'slightly-different-approach'), + ('Time decay rate', 2, None, 'time-decay-rate'), + ('Code with a Number of Minibatches which varies', 2, None, - 'standard-approach-based-on-the-normal-distribution'), - ('Resampling methods: Bootstrap background', + 'code-with-a-number-of-minibatches-which-varies'), + ('Replace or not', 2, None, 'replace-or-not'), + ('Momentum based GD', 2, None, 'momentum-based-gd'), + ('More on momentum based approaches', 2, None, - 'resampling-methods-bootstrap-background'), - ('Resampling methods: More Bootstrap background', + 'more-on-momentum-based-approaches'), + ('Momentum parameter', 2, None, 'momentum-parameter'), + ('Second moment of the gradient', 2, None, - 'resampling-methods-more-bootstrap-background'), - ('Resampling methods: Bootstrap approach', + 'second-moment-of-the-gradient'), + ('RMS prop', 2, None, 'rms-prop'), + ('"ADAM optimizer":"https://arxiv.org/abs/1412.6980"', 2, None, - 'resampling-methods-bootstrap-approach'), - ('Resampling methods: Bootstrap steps', + 'adam-optimizer-https-arxiv-org-abs-1412-6980'), + ('Algorithms and codes for Adagrad, RMSprop and Adam', 2, None, - 'resampling-methods-bootstrap-steps'), - ('Code example for the Bootstrap method', + 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'code-example-for-the-bootstrap-method'), - ('Plotting the Histogram', 2, None, 'plotting-the-histogram'), - ('The bias-variance tradeoff', + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'the-bias-variance-tradeoff'), - ('A way to Read the Bias-Variance Tradeoff', + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'a-way-to-read-the-bias-variance-tradeoff'), - ('Example code for Bias-Variance tradeoff', + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', 2, None, - 'example-code-for-bias-variance-tradeoff'), - ('Understanding what happens', + 'sneaking-in-auotmatic-differentiation-using-autograd'), + ('Same code but now with momentum gradient descent', 2, None, - 'understanding-what-happens'), - ('Summing up', 2, None, 'summing-up'), - ("Another Example from Scikit-Learn's Repository", + 'same-code-but-now-with-momentum-gradient-descent'), + ('Including Stochastic Gradient Descent with Autograd', 2, None, - 'another-example-from-scikit-learn-s-repository'), - ('Various steps in cross-validation', + 'including-stochastic-gradient-descent-with-autograd'), + ('Same code but now with momentum gradient descent', 2, None, - 'various-steps-in-cross-validation'), - ('Cross-validation in brief', + 'same-code-but-now-with-momentum-gradient-descent'), + ('Similar (second order function now) problem but now with ' + 'AdaGrad', 2, None, - 'cross-validation-in-brief'), - ('Code Example for Cross-validation and $k$-fold ' - 'Cross-validation', + 'similar-second-order-function-now-problem-but-now-with-adagrad'), + ('RMSprop for adaptive learning rate with Stochastic Gradient ' + 'Descent', 2, None, - 'code-example-for-cross-validation-and-k-fold-cross-validation'), - ('More examples on bootstrap and cross-validation and errors', + 'rmsprop-for-adaptive-learning-rate-with-stochastic-gradient-descent'), + ('And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"', 2, None, - 'more-examples-on-bootstrap-and-cross-validation-and-errors'), - ('The same example but now with cross-validation', - 2, - None, - 'the-same-example-but-now-with-cross-validation'), + 'and-finally-adam-https-arxiv-org-pdf-1412-6980-pdf'), ('Material for the lab sessions', 2, None, - 'material-for-the-lab-sessions'), - ('Linking the regression analysis with a statistical ' - 'interpretation', - 2, - None, - 'linking-the-regression-analysis-with-a-statistical-interpretation'), - ('Assumptions made', 2, None, 'assumptions-made'), - ('Expectation value and variance', - 2, - None, - 'expectation-value-and-variance'), - ('Expectation value and variance for $\\boldsymbol{\\beta}$', - 2, - None, - 'expectation-value-and-variance-for-boldsymbol-beta')]} + 'material-for-the-lab-sessions')]} end of tocinfo --> @@ -228,58 +217,55 @@ MathJax.Hub.Config({ Contents @@ -291,9 +277,8 @@ MathJax.Hub.Config({

     

     

     

    -

    Code Example for Cross-validation and \( k \)-fold Cross-validation

    +

    And finally ADAM

    -

    The code here uses Ridge regression with cross-validation (CV) resampling and \( k \)-fold CV in order to fit a specific polynomial.

    @@ -301,95 +286,65 @@ MathJax.Hub.Config({
    -
    import numpy as np
    +  
    # Using Autograd to calculate gradients using RMSprop  and Stochastic Gradient descent
    +# OLS example
    +from random import random, seed
    +import numpy as np
    +import autograd.numpy as np
     import matplotlib.pyplot as plt
    -from sklearn.model_selection import KFold
    -from sklearn.linear_model import Ridge
    -from sklearn.model_selection import cross_val_score
    -from sklearn.preprocessing import PolynomialFeatures
    +from autograd import grad
     
    -# A seed just to ensure that the random numbers are the same for every run.
    -# Useful for eventual debugging.
    -np.random.seed(3155)
    +# Note change from previous example
    +def CostOLS(y,X,theta):
    +    return np.sum((y-X @ theta)**2)
     
    -# Generate the data.
    -nsamples = 100
    -x = np.random.randn(nsamples)
    -y = 3*x**2 + np.random.randn(nsamples)
    +n = 1000
    +x = np.random.rand(n,1)
    +y = 2.0+3*x +4*x*x# +np.random.randn(n,1)
     
    -## Cross-validation on Ridge regression using KFold only
    -
    -# Decide degree on polynomial to fit
    -poly = PolynomialFeatures(degree = 6)
    -
    -# Decide which values of lambda to use
    -nlambdas = 500
    -lambdas = np.logspace(-3, 5, nlambdas)
    -
    -# Initialize a KFold instance
    -k = 5
    -kfold = KFold(n_splits = k)
    -
    -# Perform the cross-validation to estimate MSE
    -scores_KFold = np.zeros((nlambdas, k))
    -
    -i = 0
    -for lmb in lambdas:
    -    ridge = Ridge(alpha = lmb)
    -    j = 0
    -    for train_inds, test_inds in kfold.split(x):
    -        xtrain = x[train_inds]
    -        ytrain = y[train_inds]
    -
    -        xtest = x[test_inds]
    -        ytest = y[test_inds]
    -
    -        Xtrain = poly.fit_transform(xtrain[:, np.newaxis])
    -        ridge.fit(Xtrain, ytrain[:, np.newaxis])
    -
    -        Xtest = poly.fit_transform(xtest[:, np.newaxis])
    -        ypred = ridge.predict(Xtest)
    -
    -        scores_KFold[i,j] = np.sum((ypred - ytest[:, np.newaxis])**2)/np.size(ypred)
    -
    -        j += 1
    -    i += 1
    +X = np.c_[np.ones((n,1)), x, x*x]
    +XT_X = X.T @ X
    +theta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)
    +print("Own inversion")
    +print(theta_linreg)
     
     
    -estimated_mse_KFold = np.mean(scores_KFold, axis = 1)
    +# Note that we request the derivative wrt third argument (theta, 2 here)
    +training_gradient = grad(CostOLS,2)
    +# Define parameters for Stochastic Gradient Descent
    +n_epochs = 50
    +M = 5   #size of each minibatch
    +m = int(n/M) #number of minibatches
    +# Guess for unknown parameters theta
    +theta = np.random.randn(3,1)
     
    -## Cross-validation using cross_val_score from sklearn along with KFold
    -
    -# kfold is an instance initialized above as:
    -# kfold = KFold(n_splits = k)
    -
    -estimated_mse_sklearn = np.zeros(nlambdas)
    -i = 0
    -for lmb in lambdas:
    -    ridge = Ridge(alpha = lmb)
    -
    -    X = poly.fit_transform(x[:, np.newaxis])
    -    estimated_mse_folds = cross_val_score(ridge, X, y[:, np.newaxis], scoring='neg_mean_squared_error', cv=kfold)
    -
    -    # cross_val_score return an array containing the estimated negative mse for every fold.
    -    # we have to the the mean of every array in order to get an estimate of the mse of the model
    -    estimated_mse_sklearn[i] = np.mean(-estimated_mse_folds)
    -
    -    i += 1
    -
    -## Plot and compare the slightly different ways to perform cross-validation
    -
    -plt.figure()
    -
    -plt.plot(np.log10(lambdas), estimated_mse_sklearn, label = 'cross_val_score')
    -plt.plot(np.log10(lambdas), estimated_mse_KFold, 'r--', label = 'KFold')
    -
    -plt.xlabel('log10(lambda)')
    -plt.ylabel('mse')
    -
    -plt.legend()
    -
    -plt.show()
    +# Value for learning rate
    +eta = 0.01
    +# Value for parameters beta1 and beta2, see https://arxiv.org/abs/1412.6980
    +beta1 = 0.9
    +beta2 = 0.999
    +# Including AdaGrad parameter to avoid possible division by zero
    +delta  = 1e-7
    +iter = 0
    +for epoch in range(n_epochs):
    +    first_moment = 0.0
    +    second_moment = 0.0
    +    iter += 1
    +    for i in range(m):
    +        random_index = M*np.random.randint(m)
    +        xi = X[random_index:random_index+M]
    +        yi = y[random_index:random_index+M]
    +        gradients = (1.0/M)*training_gradient(yi, xi, theta)
    +        # Computing moments first
    +        first_moment = beta1*first_moment + (1-beta1)*gradients
    +        second_moment = beta2*second_moment+(1-beta2)*gradients*gradients
    +        first_term = first_moment/(1.0-beta1**iter)
    +        second_term = second_moment/(1.0-beta2**iter)
    +	# Scaling with rho the new and the previous results
    +        update = eta*first_term/(np.sqrt(second_term)+delta)
    +        theta -= update
    +print("theta from own ADAM")
    +print(theta)
     
    @@ -422,12 +377,6 @@ plt.show()
  • 46
  • 47
  • 48
  • -
  • 49
  • -
  • 50
  • -
  • 51
  • -
  • 52
  • -
  • 53
  • -
  • 54
  • »
  • diff --git a/doc/pub/week37/html/._week37-bs047.html b/doc/pub/week37/html/._week37-bs047.html index a80e1fa8d..e2634b78a 100644 --- a/doc/pub/week37/html/._week37-bs047.html +++ b/doc/pub/week37/html/._week37-bs047.html @@ -40,159 +40,148 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'plans-for-week-37-lecture-monday'), - ('Plans for week 37, lab sessions', + ('Readings and Videos:', 2, None, 'readings-and-videos'), + ('Material for lecture Monday September 8', 2, None, - 'plans-for-week-37-lab-sessions'), - ('Material for lecture Monday September 9', + 'material-for-lecture-monday-september-8'), + ('Gradient descent and revisiting Ordinary Least Squares from ' + 'last week', 2, None, - 'material-for-lecture-monday-september-9'), - ('Deriving OLS from a probability distribution', + 'gradient-descent-and-revisiting-ordinary-least-squares-from-last-week'), + ('Gradient descent example', 2, None, 'gradient-descent-example'), + ('The derivative of the cost/loss function', 2, None, - 'deriving-ols-from-a-probability-distribution'), - ('Independent and Identically Distrubuted (iid)', + 'the-derivative-of-the-cost-loss-function'), + ('The Hessian matrix', 2, None, 'the-hessian-matrix'), + ('Simple program', 2, None, 'simple-program'), + ('Gradient Descent Example', 2, None, 'gradient-descent-example'), + ('Gradient descent and Ridge', 2, None, - 'independent-and-identically-distrubuted-iid'), - ('Maximum Likelihood Estimation (MLE)', + 'gradient-descent-and-ridge'), + ('The Hessian matrix for Ridge Regression', 2, None, - 'maximum-likelihood-estimation-mle'), - ('A new Cost Function', 2, None, 'a-new-cost-function'), - ("More basic Statistics and Bayes' theorem", + 'the-hessian-matrix-for-ridge-regression'), + ('Program example for gradient descent with Ridge Regression', 2, None, - 'more-basic-statistics-and-bayes-theorem'), - ('Marginal Probability', 2, None, 'marginal-probability'), - ('Conditional Probability', 2, None, 'conditional-probability'), - ("Bayes' Theorem", 2, None, 'bayes-theorem'), - ("Interpretations of Bayes' Theorem", + 'program-example-for-gradient-descent-with-ridge-regression'), + ('Using gradient descent methods, limitations', 2, None, - 'interpretations-of-bayes-theorem'), - ("Example of Usage of Bayes' theorem", + 'using-gradient-descent-methods-limitations'), + ('Improving gradient descent with momentum', 2, None, - 'example-of-usage-of-bayes-theorem'), - ('Doing it correctly', 2, None, 'doing-it-correctly'), - ("Bayes' Theorem and Ridge and Lasso Regression", + 'improving-gradient-descent-with-momentum'), + ('Same code but now with momentum gradient descent', 2, None, - 'bayes-theorem-and-ridge-and-lasso-regression'), - ('Ridge and Bayes', 2, None, 'ridge-and-bayes'), - ('Lasso and Bayes', 2, None, 'lasso-and-bayes'), - ('Why resampling methods', 2, None, 'why-resampling-methods'), - ('Resampling methods', 2, None, 'resampling-methods'), - ('Resampling approaches can be computationally expensive', + 'same-code-but-now-with-momentum-gradient-descent'), + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'resampling-approaches-can-be-computationally-expensive'), - ('Why resampling methods ?', 2, None, 'why-resampling-methods'), - ('Statistical analysis', 2, None, 'statistical-analysis'), - ('Resampling methods', 2, None, 'resampling-methods'), - ('Resampling methods: Bootstrap', + 'overview-video-on-stochastic-gradient-descent-sgd'), + ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), + ('Stochastic Gradient Descent (SGD)', 2, None, - 'resampling-methods-bootstrap'), - ('The Central Limit Theorem', + 'stochastic-gradient-descent-sgd'), + ('Stochastic Gradient Descent', 2, None, - 'the-central-limit-theorem'), - ('Finding the Limit', 2, None, 'finding-the-limit'), - ('Rewriting the $\\delta$-function', + 'stochastic-gradient-descent'), + ('Computation of gradients', 2, None, 'computation-of-gradients'), + ('SGD example', 2, None, 'sgd-example'), + ('The gradient step', 2, None, 'the-gradient-step'), + ('Simple example code', 2, None, 'simple-example-code'), + ('When do we stop?', 2, None, 'when-do-we-stop'), + ('Slightly different approach', 2, None, - 'rewriting-the-delta-function'), - ('Identifying Terms', 2, None, 'identifying-terms'), - ('Wrapping it up', 2, None, 'wrapping-it-up'), - ('Confidence Intervals', 2, None, 'confidence-intervals'), - ('Standard Approach based on the Normal Distribution', + 'slightly-different-approach'), + ('Time decay rate', 2, None, 'time-decay-rate'), + ('Code with a Number of Minibatches which varies', 2, None, - 'standard-approach-based-on-the-normal-distribution'), - ('Resampling methods: Bootstrap background', + 'code-with-a-number-of-minibatches-which-varies'), + ('Replace or not', 2, None, 'replace-or-not'), + ('Momentum based GD', 2, None, 'momentum-based-gd'), + ('More on momentum based approaches', 2, None, - 'resampling-methods-bootstrap-background'), - ('Resampling methods: More Bootstrap background', + 'more-on-momentum-based-approaches'), + ('Momentum parameter', 2, None, 'momentum-parameter'), + ('Second moment of the gradient', 2, None, - 'resampling-methods-more-bootstrap-background'), - ('Resampling methods: Bootstrap approach', + 'second-moment-of-the-gradient'), + ('RMS prop', 2, None, 'rms-prop'), + ('"ADAM optimizer":"https://arxiv.org/abs/1412.6980"', 2, None, - 'resampling-methods-bootstrap-approach'), - ('Resampling methods: Bootstrap steps', + 'adam-optimizer-https-arxiv-org-abs-1412-6980'), + ('Algorithms and codes for Adagrad, RMSprop and Adam', 2, None, - 'resampling-methods-bootstrap-steps'), - ('Code example for the Bootstrap method', + 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'code-example-for-the-bootstrap-method'), - ('Plotting the Histogram', 2, None, 'plotting-the-histogram'), - ('The bias-variance tradeoff', + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'the-bias-variance-tradeoff'), - ('A way to Read the Bias-Variance Tradeoff', + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'a-way-to-read-the-bias-variance-tradeoff'), - ('Example code for Bias-Variance tradeoff', + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', 2, None, - 'example-code-for-bias-variance-tradeoff'), - ('Understanding what happens', + 'sneaking-in-auotmatic-differentiation-using-autograd'), + ('Same code but now with momentum gradient descent', 2, None, - 'understanding-what-happens'), - ('Summing up', 2, None, 'summing-up'), - ("Another Example from Scikit-Learn's Repository", + 'same-code-but-now-with-momentum-gradient-descent'), + ('Including Stochastic Gradient Descent with Autograd', 2, None, - 'another-example-from-scikit-learn-s-repository'), - ('Various steps in cross-validation', + 'including-stochastic-gradient-descent-with-autograd'), + ('Same code but now with momentum gradient descent', 2, None, - 'various-steps-in-cross-validation'), - ('Cross-validation in brief', + 'same-code-but-now-with-momentum-gradient-descent'), + ('Similar (second order function now) problem but now with ' + 'AdaGrad', 2, None, - 'cross-validation-in-brief'), - ('Code Example for Cross-validation and $k$-fold ' - 'Cross-validation', + 'similar-second-order-function-now-problem-but-now-with-adagrad'), + ('RMSprop for adaptive learning rate with Stochastic Gradient ' + 'Descent', 2, None, - 'code-example-for-cross-validation-and-k-fold-cross-validation'), - ('More examples on bootstrap and cross-validation and errors', + 'rmsprop-for-adaptive-learning-rate-with-stochastic-gradient-descent'), + ('And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"', 2, None, - 'more-examples-on-bootstrap-and-cross-validation-and-errors'), - ('The same example but now with cross-validation', - 2, - None, - 'the-same-example-but-now-with-cross-validation'), + 'and-finally-adam-https-arxiv-org-pdf-1412-6980-pdf'), ('Material for the lab sessions', 2, None, - 'material-for-the-lab-sessions'), - ('Linking the regression analysis with a statistical ' - 'interpretation', - 2, - None, - 'linking-the-regression-analysis-with-a-statistical-interpretation'), - ('Assumptions made', 2, None, 'assumptions-made'), - ('Expectation value and variance', - 2, - None, - 'expectation-value-and-variance'), - ('Expectation value and variance for $\\boldsymbol{\\beta}$', - 2, - None, - 'expectation-value-and-variance-for-boldsymbol-beta')]} + 'material-for-the-lab-sessions')]} end of tocinfo --> @@ -228,58 +217,55 @@ MathJax.Hub.Config({ Contents @@ -291,109 +277,22 @@ MathJax.Hub.Config({

     

     

     

    -

    More examples on bootstrap and cross-validation and errors

    +

    Material for the lab sessions

    - - -
    -
    -
    -
    -
    -
    # Common imports
    -import os
    -import numpy as np
    -import pandas as pd
    -import matplotlib.pyplot as plt
    -from sklearn.linear_model import LinearRegression, Ridge, Lasso
    -from sklearn.model_selection import train_test_split
    -from sklearn.utils import resample
    -from sklearn.metrics import mean_squared_error
    -# Where to save the figures and data files
    -PROJECT_ROOT_DIR = "Results"
    -FIGURE_ID = "Results/FigureFiles"
    -DATA_ID = "DataFiles/"
    -
    -if not os.path.exists(PROJECT_ROOT_DIR):
    -    os.mkdir(PROJECT_ROOT_DIR)
    -
    -if not os.path.exists(FIGURE_ID):
    -    os.makedirs(FIGURE_ID)
    -
    -if not os.path.exists(DATA_ID):
    -    os.makedirs(DATA_ID)
    -
    -def image_path(fig_id):
    -    return os.path.join(FIGURE_ID, fig_id)
    -
    -def data_path(dat_id):
    -    return os.path.join(DATA_ID, dat_id)
    -
    -def save_fig(fig_id):
    -    plt.savefig(image_path(fig_id) + ".png", format='png')
    -
    -infile = open(data_path("EoS.csv"),'r')
    -
    -# Read the EoS data as  csv file and organize the data into two arrays with density and energies
    -EoS = pd.read_csv(infile, names=('Density', 'Energy'))
    -EoS['Energy'] = pd.to_numeric(EoS['Energy'], errors='coerce')
    -EoS = EoS.dropna()
    -Energies = EoS['Energy']
    -Density = EoS['Density']
    -#  The design matrix now as function of various polytrops
    -
    -Maxpolydegree = 30
    -X = np.zeros((len(Density),Maxpolydegree))
    -X[:,0] = 1.0
    -testerror = np.zeros(Maxpolydegree)
    -trainingerror = np.zeros(Maxpolydegree)
    -polynomial = np.zeros(Maxpolydegree)
    -
    -trials = 100
    -for polydegree in range(1, Maxpolydegree):
    -    polynomial[polydegree] = polydegree
    -    for degree in range(polydegree):
    -        X[:,degree] = Density**(degree/3.0)
    -
    -# loop over trials in order to estimate the expectation value of the MSE
    -    testerror[polydegree] = 0.0
    -    trainingerror[polydegree] = 0.0
    -    for samples in range(trials):
    -        x_train, x_test, y_train, y_test = train_test_split(X, Energies, test_size=0.2)
    -        model = LinearRegression(fit_intercept=False).fit(x_train, y_train)
    -        ypred = model.predict(x_train)
    -        ytilde = model.predict(x_test)
    -        testerror[polydegree] += mean_squared_error(y_test, ytilde)
    -        trainingerror[polydegree] += mean_squared_error(y_train, ypred) 
    -
    -    testerror[polydegree] /= trials
    -    trainingerror[polydegree] /= trials
    -    print("Degree of polynomial: %3d"% polynomial[polydegree])
    -    print("Mean squared error on training data: %.8f" % trainingerror[polydegree])
    -    print("Mean squared error on test data: %.8f" % testerror[polydegree])
    -
    -plt.plot(polynomial, np.log10(trainingerror), label='Training Error')
    -plt.plot(polynomial, np.log10(testerror), label='Test Error')
    -plt.xlabel('Polynomial degree')
    -plt.ylabel('log10[MSE]')
    -plt.legend()
    -plt.show()
    -
    +
    +
    + +
      +
    1. Exercise set for week 37
    2. +
    3. Work on project 1 +
    4. +
        +
      • For more discussions of Ridge regression and calculation of averages, Wessel van Wieringen's article is highly recommended.
      • +
      +
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -

    Note that we kept the intercept column in the fitting here. This means that we need to set the intercept in the call to the Scikit-Learn function as False. Alternatively, we could have set up the design matrix \( X \) without the first column of ones.

    +

    @@ -410,13 +309,6 @@ plt.show()

  • 46
  • 47
  • 48
  • -
  • 49
  • -
  • 50
  • -
  • 51
  • -
  • 52
  • -
  • 53
  • -
  • 54
  • -
  • »
  • diff --git a/doc/pub/week37/html/week37-bs.html b/doc/pub/week37/html/week37-bs.html index 541ecc814..cfe72140a 100644 --- a/doc/pub/week37/html/week37-bs.html +++ b/doc/pub/week37/html/week37-bs.html @@ -82,11 +82,14 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -129,19 +132,30 @@ doconce format html week37.do.txt --html_style=bootstrap --pygments_html_style=d 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -216,37 +230,42 @@ MathJax.Hub.Config({
  • Program example for gradient descent with Ridge Regression
  • Using gradient descent methods, limitations
  • Improving gradient descent with momentum
  • -
  • Same code but now with momentum gradient descent
  • -
  • Overview video on Stochastic Gradient Descent
  • +
  • Same code but now with momentum gradient descent
  • +
  • Overview video on Stochastic Gradient Descent (SGD)
  • Batches and mini-batches
  • -
  • Stochastic Gradient Descent (SGD)
  • -
  • Stochastic Gradient Descent
  • -
  • Computation of gradients
  • -
  • SGD example
  • -
  • The gradient step
  • -
  • Simple example code
  • -
  • When do we stop?
  • -
  • Slightly different approach
  • -
  • Time decay rate
  • -
  • Code with a Number of Minibatches which varies
  • -
  • Replace or not
  • -
  • Momentum based GD
  • -
  • More on momentum based approaches
  • -
  • Momentum parameter
  • -
  • Second moment of the gradient
  • -
  • RMS prop
  • -
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • -
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • -
  • Practical tips
  • -
  • Sneaking in automatic differentiation using Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • But none of these can compete with Newton's method
  • -
  • Including Stochastic Gradient Descent with Autograd
  • -
  • Same code but now with momentum gradient descent
  • -
  • Similar (second order function now) problem but now with AdaGrad
  • -
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • -
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • -
  • Material for the lab sessions
  • +
  • Pros and cons
  • +
  • Convergence rates
  • +
  • Accuracy
  • +
  • Stochastic Gradient Descent (SGD)
  • +
  • Stochastic Gradient Descent
  • +
  • Computation of gradients
  • +
  • SGD example
  • +
  • The gradient step
  • +
  • Simple example code
  • +
  • When do we stop?
  • +
  • Slightly different approach
  • +
  • Time decay rate
  • +
  • Code with a Number of Minibatches which varies
  • +
  • Replace or not
  • +
  • Momentum based GD
  • +
  • More on momentum based approaches
  • +
  • Momentum parameter
  • +
  • Second moment of the gradient
  • +
  • RMS prop
  • +
  • "ADAM optimizer":"https://arxiv.org/abs/1412.6980"
  • +
  • Algorithms and codes for Adagrad, RMSprop and Adam
  • +
  • AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html"
  • +
  • Practical tips
  • +
  • Sneaking in auotmatic differentiation using Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Including Stochastic Gradient Descent with Autograd
  • +
  • Same code but now with momentum gradient descent
  • +
  • Similar (second order function now) problem but now with AdaGrad
  • +
  • RMSprop for adaptive learning rate with Stochastic Gradient Descent
  • +
  • And finally "ADAM":"https://arxiv.org/pdf/1412.6980.pdf"
  • +
  • Material for the lab sessions
  • @@ -300,7 +319,7 @@ MathJax.Hub.Config({
  • 9
  • 10
  • ...
  • -
  • 46
  • +
  • 48
  • »
  • diff --git a/doc/pub/week37/html/week37-reveal.html b/doc/pub/week37/html/week37-reveal.html index c8984a7e6..f33912778 100644 --- a/doc/pub/week37/html/week37-reveal.html +++ b/doc/pub/week37/html/week37-reveal.html @@ -217,7 +217,7 @@ MathJax.Hub.Config({

      -

    1. Recommended: Goodfellow et al, Deep Learning, introduction to gradient descent, see sections 4.3-4.5 at https://www.deeplearningbook.org/contents/numerical.html and chapter 8.3-8.5 at URL::https://www.deeplearningbook.org/contents/optimization.html"
    2. +

    3. Recommended: Goodfellow et al, Deep Learning, introduction to gradient descent, see sections 4.3-4.5 at https://www.deeplearningbook.org/contents/numerical.html and chapter 8.3-8.5 at https://www.deeplearningbook.org/contents/optimization.html
    4. Rashcka et al, pages 37-44 and pages 278-283 with focus on linear regression.
    5. Video on gradient descent at https://www.youtube.com/watch?v=sDv4f4s2SB8
    6. Video on Stochastic gradient descent at https://www.youtube.com/watch?v=vMh0zPT0tLI
    7. @@ -743,9 +743,16 @@ pyplot.show()
      -

      Overview video on Stochastic Gradient Descent

      +

      Overview video on Stochastic Gradient Descent (SGD)

      What is Stochastic Gradient Descent +

      There are several reasons for using stochastic gradient descent. Some of these are:

      + +
        +

      1. Efficiency: Updates weights more frequently using a single or a small batch of samples, which speeds up convergence.
      2. +

      3. Hopefully avoid Local Minima
      4. +

      5. Memory Usage: Requires less memory compared to computing gradients for the entire dataset.
      6. +
      @@ -764,6 +771,50 @@ perform a parameter update.

      +
      +

      Pros and cons

      + +
        +

      1. Speed: SGD is faster than gradient descent because it uses only one training example per iteration, whereas gradient descent requires the entire dataset. This speed advantage becomes more significant as the size of the dataset increases.
      2. +

      3. Convergence: Gradient descent has a more predictable convergence behaviour because it uses the average gradient of the entire dataset. In contrast, SGD’s convergence behaviour can be more erratic due to its random sampling of individual training examples.
      4. +

      5. Memory: Gradient descent requires more memory than SGD because it must store the entire dataset for each iteration. SGD only needs to store the current training example, making it more memory-efficient.
      6. +
      +
      + +
      +

      Convergence rates

      + +
        +

      1. Stochastic Gradient Descent has a faster convergence rate due to the use of single training examples in each iteration.
      2. +

      3. Gradient Descent as a slower convergence rate, as it uses the entire dataset for each iteration.
      4. +
      +
      + +
      +

      Accuracy

      + +

      In general, stochastic Gradient Descent is Less accurate than gradient +descent, as it calculates the gradient on single examples, which may +not accurately represent the overall dataset. Gradient Descent is +more accurate because it uses the average gradient calculated over the +entire dataset. +

      + +

      There are other disadvantages to using SGD. The main drawback is that +its convergence behaviour can be more erratic due to the random +sampling of individual training examples. This can lead to less +accurate results, as the algorithm may not converge to the true +minimum of the cost function. Additionally, the learning rate, which +determines the step size of each update to the model’s parameters, +must be carefully chosen to ensure convergence. +

      + +

      It is however the method of choice in deep learning algorithms where +SGD is often used in combination with other optimization techniques, +such as momentum or adaptive learning rates +

      +
      +

      Stochastic Gradient Descent (SGD)

      @@ -1249,7 +1300,9 @@ $$ $$

       
      -

      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 \).

      +

      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 \). +

      @@ -1272,7 +1325,7 @@ the steep computational price of calculating or approximating Hessians.

      -

      Recently, a number of methods have been introduced that accomplish +

      During the last decade 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, Root Mean Squared Propagation (RMS-Prop), and ADAM. @@ -1375,7 +1428,28 @@ $$

      The algorithms we have implemented are well described in the text by Goodfellow, Bengio and Courville, chapter 8.

      -

      The codes which implement these algorithms are discussed below here.

      +

      The codes which implement these algorithms are discussed after our presentation of automatic differentiation.

      +

      AdaGrad algorithm, taken from Goodfellow et al

      + +

      +
      +

      +
      +

      +

      RMSProp algorithm, taken from Goodfellow et al

      + +

      +
      +

      +
      +

      +

      ADAM algorithm, taken from Goodfellow et al

      + +

      +
      +

      +
      +

      @@ -1390,10 +1464,11 @@ $$
      -

      Sneaking in automatic differentiation using Autograd

      +

      Sneaking in auotmatic differentiation using Autograd

      -

      We anticipate our discussions to come in connection with neural networks and automatic differentiation -by showing how we can use autograd for the cases above. Later we will replace autograd with JAX. +

      We conclude the part on optmization by showing how we can make codes +for linear regression and logistic regression using autograd. The +first example shows results with ordinary leats squares.

      @@ -1546,70 +1621,6 @@ delta_momentum = 0.3
    -
    -

    But none of these can compete with Newton's method

    - - - -
    -
    -
    -
    -
    -
    # Using Newton's method
    -from random import random, seed
    -import numpy as np
    -import autograd.numpy as np
    -import matplotlib.pyplot as plt
    -from autograd import grad
    -
    -def CostOLS(beta):
    -    return (1.0/n)*np.sum((y-X @ beta)**2)
    -
    -n = 100
    -x = 2*np.random.rand(n,1)
    -y = 4+3*x+np.random.randn(n,1)
    -
    -X = np.c_[np.ones((n,1)), x]
    -XT_X = X.T @ X
    -beta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)
    -print("Own inversion")
    -print(beta_linreg)
    -# Hessian matrix
    -H = (2.0/n)* XT_X
    -# Note that here the Hessian does not depend on the parameters beta
    -invH = np.linalg.pinv(H)
    -EigValues, EigVectors = np.linalg.eig(H)
    -print(f"Eigenvalues of Hessian Matrix:{EigValues}")
    -
    -beta = np.random.randn(2,1)
    -Niterations = 5
    -
    -# define the gradient
    -training_gradient = grad(CostOLS)
    -
    -for iter in range(Niterations):
    -    gradients = training_gradient(beta)
    -    beta -= invH @ gradients
    -    print(iter,gradients[0],gradients[1])
    -print("beta from own Newton code")
    -print(beta)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    Including Stochastic Gradient Descent with Autograd

    In this code we include the stochastic gradient descent approach discussed above. Note here that we specify which argument we are taking the derivative with respect to when using autograd.

    diff --git a/doc/pub/week37/html/week37-solarized.html b/doc/pub/week37/html/week37-solarized.html index f1b99880d..db444578b 100644 --- a/doc/pub/week37/html/week37-solarized.html +++ b/doc/pub/week37/html/week37-solarized.html @@ -109,11 +109,14 @@ div.toc p,a { 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -156,19 +159,30 @@ div.toc p,a { 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -258,7 +272,7 @@ MathJax.Hub.Config({

      -
    1. Recommended: Goodfellow et al, Deep Learning, introduction to gradient descent, see sections 4.3-4.5 at https://www.deeplearningbook.org/contents/numerical.html and chapter 8.3-8.5 at URL::https://www.deeplearningbook.org/contents/optimization.html"
    2. +
    3. Recommended: Goodfellow et al, Deep Learning, introduction to gradient descent, see sections 4.3-4.5 at https://www.deeplearningbook.org/contents/numerical.html and chapter 8.3-8.5 at https://www.deeplearningbook.org/contents/optimization.html
    4. Rashcka et al, pages 37-44 and pages 278-283 with focus on linear regression.
    5. Video on gradient descent at https://www.youtube.com/watch?v=sDv4f4s2SB8
    6. Video on Stochastic gradient descent at https://www.youtube.com/watch?v=vMh0zPT0tLI
    7. @@ -753,10 +767,16 @@ pyplot.show()









      -

      Overview video on Stochastic Gradient Descent

      +

      Overview video on Stochastic Gradient Descent (SGD)

      What is Stochastic Gradient Descent +

      There are several reasons for using stochastic gradient descent. Some of these are:

      +
        +
      1. Efficiency: Updates weights more frequently using a single or a small batch of samples, which speeds up convergence.
      2. +
      3. Hopefully avoid Local Minima
      4. +
      5. Memory Usage: Requires less memory compared to computing gradients for the entire dataset.
      6. +










      Batches and mini-batches

      @@ -772,6 +792,45 @@ an entire training set of several millions. This batch is then used to perform a parameter update.

      +









      +

      Pros and cons

      + +
        +
      1. Speed: SGD is faster than gradient descent because it uses only one training example per iteration, whereas gradient descent requires the entire dataset. This speed advantage becomes more significant as the size of the dataset increases.
      2. +
      3. Convergence: Gradient descent has a more predictable convergence behaviour because it uses the average gradient of the entire dataset. In contrast, SGD’s convergence behaviour can be more erratic due to its random sampling of individual training examples.
      4. +
      5. Memory: Gradient descent requires more memory than SGD because it must store the entire dataset for each iteration. SGD only needs to store the current training example, making it more memory-efficient.
      6. +
      +









      +

      Convergence rates

      + +
        +
      1. Stochastic Gradient Descent has a faster convergence rate due to the use of single training examples in each iteration.
      2. +
      3. Gradient Descent as a slower convergence rate, as it uses the entire dataset for each iteration.
      4. +
      +









      +

      Accuracy

      + +

      In general, stochastic Gradient Descent is Less accurate than gradient +descent, as it calculates the gradient on single examples, which may +not accurately represent the overall dataset. Gradient Descent is +more accurate because it uses the average gradient calculated over the +entire dataset. +

      + +

      There are other disadvantages to using SGD. The main drawback is that +its convergence behaviour can be more erratic due to the random +sampling of individual training examples. This can lead to less +accurate results, as the algorithm may not converge to the true +minimum of the cost function. Additionally, the learning rate, which +determines the step size of each update to the model’s parameters, +must be carefully chosen to ensure convergence. +

      + +

      It is however the method of choice in deep learning algorithms where +SGD is often used in combination with other optimization techniques, +such as momentum or adaptive learning rates +

      +









      Stochastic Gradient Descent (SGD)

      @@ -1225,7 +1284,9 @@ $$ \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 \).

      +

      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

      @@ -1247,7 +1308,7 @@ the steep computational price of calculating or approximating Hessians.

      -

      Recently, a number of methods have been introduced that accomplish +

      During the last decade 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, Root Mean Squared Propagation (RMS-Prop), and ADAM. @@ -1342,7 +1403,28 @@ $$

      The algorithms we have implemented are well described in the text by Goodfellow, Bengio and Courville, chapter 8.

      -

      The codes which implement these algorithms are discussed below here.

      +

      The codes which implement these algorithms are discussed after our presentation of automatic differentiation.

      +

      AdaGrad algorithm, taken from Goodfellow et al

      + +

      +
      +

      +
      +

      +

      RMSProp algorithm, taken from Goodfellow et al

      + +

      +
      +

      +
      +

      +

      ADAM algorithm, taken from Goodfellow et al

      + +

      +
      +

      +
      +











      Practical tips

      @@ -1354,10 +1436,11 @@ $$
    8. 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.










    9. -

      Sneaking in automatic differentiation using Autograd

      +

      Sneaking in auotmatic differentiation using Autograd

      -

      We anticipate our discussions to come in connection with neural networks and automatic differentiation -by showing how we can use autograd for the cases above. Later we will replace autograd with JAX. +

      We conclude the part on optmization by showing how we can make codes +for linear regression and logistic regression using autograd. The +first example shows results with ordinary leats squares.

      @@ -1510,70 +1593,6 @@ delta_momentum = 0.3
    -









    -

    But none of these can compete with Newton's method

    - - - -
    -
    -
    -
    -
    -
    # Using Newton's method
    -from random import random, seed
    -import numpy as np
    -import autograd.numpy as np
    -import matplotlib.pyplot as plt
    -from autograd import grad
    -
    -def CostOLS(beta):
    -    return (1.0/n)*np.sum((y-X @ beta)**2)
    -
    -n = 100
    -x = 2*np.random.rand(n,1)
    -y = 4+3*x+np.random.randn(n,1)
    -
    -X = np.c_[np.ones((n,1)), x]
    -XT_X = X.T @ X
    -beta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)
    -print("Own inversion")
    -print(beta_linreg)
    -# Hessian matrix
    -H = (2.0/n)* XT_X
    -# Note that here the Hessian does not depend on the parameters beta
    -invH = np.linalg.pinv(H)
    -EigValues, EigVectors = np.linalg.eig(H)
    -print(f"Eigenvalues of Hessian Matrix:{EigValues}")
    -
    -beta = np.random.randn(2,1)
    -Niterations = 5
    -
    -# define the gradient
    -training_gradient = grad(CostOLS)
    -
    -for iter in range(Niterations):
    -    gradients = training_gradient(beta)
    -    beta -= invH @ gradients
    -    print(iter,gradients[0],gradients[1])
    -print("beta from own Newton code")
    -print(beta)
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -









    Including Stochastic Gradient Descent with Autograd

    In this code we include the stochastic gradient descent approach discussed above. Note here that we specify which argument we are taking the derivative with respect to when using autograd.

    @@ -2020,6 +2039,7 @@ delta = 1e-7
    +
    © 1999-2025, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license diff --git a/doc/pub/week37/html/week37.html b/doc/pub/week37/html/week37.html index 3187de778..73e5119f6 100644 --- a/doc/pub/week37/html/week37.html +++ b/doc/pub/week37/html/week37.html @@ -186,11 +186,14 @@ div.toc p,a { 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ('Overview video on Stochastic Gradient Descent', + ('Overview video on Stochastic Gradient Descent (SGD)', 2, None, - 'overview-video-on-stochastic-gradient-descent'), + 'overview-video-on-stochastic-gradient-descent-sgd'), ('Batches and mini-batches', 2, None, 'batches-and-mini-batches'), + ('Pros and cons', 2, None, 'pros-and-cons'), + ('Convergence rates', 2, None, 'convergence-rates'), + ('Accuracy', 2, None, 'accuracy'), ('Stochastic Gradient Descent (SGD)', 2, None, @@ -233,19 +236,30 @@ div.toc p,a { 2, None, 'algorithms-and-codes-for-adagrad-rmsprop-and-adam'), - ('Practical tips', 2, None, 'practical-tips'), - ('Sneaking in automatic differentiation using Autograd', + ('AdaGrad algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', 2, None, - 'sneaking-in-automatic-differentiation-using-autograd'), + 'adagrad-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('RMSProp algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'rmsprop-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('ADAM algorithm, taken from "Goodfellow et ' + 'al":"https://www.deeplearningbook.org/contents/optimization.html"', + 2, + None, + 'adam-algorithm-taken-from-goodfellow-et-al-https-www-deeplearningbook-org-contents-optimization-html'), + ('Practical tips', 2, None, 'practical-tips'), + ('Sneaking in auotmatic differentiation using Autograd', + 2, + None, + 'sneaking-in-auotmatic-differentiation-using-autograd'), ('Same code but now with momentum gradient descent', 2, None, 'same-code-but-now-with-momentum-gradient-descent'), - ("But none of these can compete with Newton's method", - 2, - None, - 'but-none-of-these-can-compete-with-newton-s-method'), ('Including Stochastic Gradient Descent with Autograd', 2, None, @@ -335,7 +349,7 @@ MathJax.Hub.Config({

      -
    1. Recommended: Goodfellow et al, Deep Learning, introduction to gradient descent, see sections 4.3-4.5 at https://www.deeplearningbook.org/contents/numerical.html and chapter 8.3-8.5 at URL::https://www.deeplearningbook.org/contents/optimization.html"
    2. +
    3. Recommended: Goodfellow et al, Deep Learning, introduction to gradient descent, see sections 4.3-4.5 at https://www.deeplearningbook.org/contents/numerical.html and chapter 8.3-8.5 at https://www.deeplearningbook.org/contents/optimization.html
    4. Rashcka et al, pages 37-44 and pages 278-283 with focus on linear regression.
    5. Video on gradient descent at https://www.youtube.com/watch?v=sDv4f4s2SB8
    6. Video on Stochastic gradient descent at https://www.youtube.com/watch?v=vMh0zPT0tLI
    7. @@ -830,10 +844,16 @@ pyplot.show()









      -

      Overview video on Stochastic Gradient Descent

      +

      Overview video on Stochastic Gradient Descent (SGD)

      What is Stochastic Gradient Descent +

      There are several reasons for using stochastic gradient descent. Some of these are:

      +
        +
      1. Efficiency: Updates weights more frequently using a single or a small batch of samples, which speeds up convergence.
      2. +
      3. Hopefully avoid Local Minima
      4. +
      5. Memory Usage: Requires less memory compared to computing gradients for the entire dataset.
      6. +










      Batches and mini-batches

      @@ -849,6 +869,45 @@ an entire training set of several millions. This batch is then used to perform a parameter update.

      +









      +

      Pros and cons

      + +
        +
      1. Speed: SGD is faster than gradient descent because it uses only one training example per iteration, whereas gradient descent requires the entire dataset. This speed advantage becomes more significant as the size of the dataset increases.
      2. +
      3. Convergence: Gradient descent has a more predictable convergence behaviour because it uses the average gradient of the entire dataset. In contrast, SGD’s convergence behaviour can be more erratic due to its random sampling of individual training examples.
      4. +
      5. Memory: Gradient descent requires more memory than SGD because it must store the entire dataset for each iteration. SGD only needs to store the current training example, making it more memory-efficient.
      6. +
      +









      +

      Convergence rates

      + +
        +
      1. Stochastic Gradient Descent has a faster convergence rate due to the use of single training examples in each iteration.
      2. +
      3. Gradient Descent as a slower convergence rate, as it uses the entire dataset for each iteration.
      4. +
      +









      +

      Accuracy

      + +

      In general, stochastic Gradient Descent is Less accurate than gradient +descent, as it calculates the gradient on single examples, which may +not accurately represent the overall dataset. Gradient Descent is +more accurate because it uses the average gradient calculated over the +entire dataset. +

      + +

      There are other disadvantages to using SGD. The main drawback is that +its convergence behaviour can be more erratic due to the random +sampling of individual training examples. This can lead to less +accurate results, as the algorithm may not converge to the true +minimum of the cost function. Additionally, the learning rate, which +determines the step size of each update to the model’s parameters, +must be carefully chosen to ensure convergence. +

      + +

      It is however the method of choice in deep learning algorithms where +SGD is often used in combination with other optimization techniques, +such as momentum or adaptive learning rates +

      +









      Stochastic Gradient Descent (SGD)

      @@ -1302,7 +1361,9 @@ $$ \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 \).

      +

      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

      @@ -1324,7 +1385,7 @@ the steep computational price of calculating or approximating Hessians.

      -

      Recently, a number of methods have been introduced that accomplish +

      During the last decade 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, Root Mean Squared Propagation (RMS-Prop), and ADAM. @@ -1419,7 +1480,28 @@ $$

      The algorithms we have implemented are well described in the text by Goodfellow, Bengio and Courville, chapter 8.

      -

      The codes which implement these algorithms are discussed below here.

      +

      The codes which implement these algorithms are discussed after our presentation of automatic differentiation.

      +

      AdaGrad algorithm, taken from Goodfellow et al

      + +

      +
      +

      +
      +

      +

      RMSProp algorithm, taken from Goodfellow et al

      + +

      +
      +

      +
      +

      +

      ADAM algorithm, taken from Goodfellow et al

      + +

      +
      +

      +
      +











      Practical tips

      @@ -1431,10 +1513,11 @@ $$
    8. 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.










    9. -

      Sneaking in automatic differentiation using Autograd

      +

      Sneaking in auotmatic differentiation using Autograd

      -

      We anticipate our discussions to come in connection with neural networks and automatic differentiation -by showing how we can use autograd for the cases above. Later we will replace autograd with JAX. +

      We conclude the part on optmization by showing how we can make codes +for linear regression and logistic regression using autograd. The +first example shows results with ordinary leats squares.

      @@ -1587,70 +1670,6 @@ delta_momentum = But none of these can compete with Newton's method - - - -
      -
      -
      -
      -
      -
      # Using Newton's method
      -from random import random, seed
      -import numpy as np
      -import autograd.numpy as np
      -import matplotlib.pyplot as plt
      -from autograd import grad
      -
      -def CostOLS(beta):
      -    return (1.0/n)*np.sum((y-X @ beta)**2)
      -
      -n = 100
      -x = 2*np.random.rand(n,1)
      -y = 4+3*x+np.random.randn(n,1)
      -
      -X = np.c_[np.ones((n,1)), x]
      -XT_X = X.T @ X
      -beta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)
      -print("Own inversion")
      -print(beta_linreg)
      -# Hessian matrix
      -H = (2.0/n)* XT_X
      -# Note that here the Hessian does not depend on the parameters beta
      -invH = np.linalg.pinv(H)
      -EigValues, EigVectors = np.linalg.eig(H)
      -print(f"Eigenvalues of Hessian Matrix:{EigValues}")
      -
      -beta = np.random.randn(2,1)
      -Niterations = 5
      -
      -# define the gradient
      -training_gradient = grad(CostOLS)
      -
      -for iter in range(Niterations):
      -    gradients = training_gradient(beta)
      -    beta -= invH @ gradients
      -    print(iter,gradients[0],gradients[1])
      -print("beta from own Newton code")
      -print(beta)
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      -
      - -









      Including Stochastic Gradient Descent with Autograd

      In this code we include the stochastic gradient descent approach discussed above. Note here that we specify which argument we are taking the derivative with respect to when using autograd.

      @@ -2097,6 +2116,7 @@ delta = 1e-7
    +
    © 1999-2025, Morten Hjorth-Jensen. Released under CC Attribution-NonCommercial 4.0 license diff --git a/doc/pub/week37/ipynb/ipynb-week37-src.tar.gz b/doc/pub/week37/ipynb/ipynb-week37-src.tar.gz index 3a4cefdc61d80e7ac69bbe519ac967765a0137b8..9dcd12eef2adf47174b1aefb00d5ed0a6da36449 100644 GIT binary patch literal 492464 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 z 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

    Figure 1:

    \n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "d42508aa", + "metadata": { + "editable": true + }, + "source": [ + "## RMSProp algorithm, taken from [Goodfellow et al](https://www.deeplearningbook.org/contents/optimization.html)\n", + "\n", + "\n", + "\n", + "\n", + "

    Figure 1:

    \n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "54d1c89f", + "metadata": { + "editable": true + }, + "source": [ + "## ADAM algorithm, taken from [Goodfellow et al](https://www.deeplearningbook.org/contents/optimization.html)\n", + "\n", + "\n", + "\n", + "\n", + "

    Figure 1:

    \n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "90c96a47", "metadata": { "editable": true }, @@ -1789,21 +1903,22 @@ }, { "cell_type": "markdown", - "id": "3ffaaf9a", + "id": "79eb9b5f", "metadata": { "editable": true }, "source": [ - "## Sneaking in automatic differentiation using Autograd\n", + "## Sneaking in auotmatic differentiation using Autograd\n", "\n", - "We anticipate our discussions to come in connection with neural networks and automatic differentiation\n", - "by showing how we can use **autograd** for the cases above. Later we will replace **autograd** with **JAX**." + "We conclude the part on optmization by showing how we can make codes\n", + "for linear regression and logistic regression using **autograd**. The\n", + "first example shows results with ordinary leats squares." ] }, { "cell_type": "code", "execution_count": 9, - "id": "51503c7d", + "id": "8749e605", "metadata": { "collapsed": false, "editable": true @@ -1863,7 +1978,7 @@ }, { "cell_type": "markdown", - "id": "67d85da7", + "id": "4f7cb53b", "metadata": { "editable": true }, @@ -1874,7 +1989,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "586da287", + "id": "2ca61a91", "metadata": { "collapsed": false, "editable": true @@ -1938,67 +2053,7 @@ }, { "cell_type": "markdown", - "id": "b0d53639", - "metadata": { - "editable": true - }, - "source": [ - "## But none of these can compete with Newton's method" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "81089279", - "metadata": { - "collapsed": false, - "editable": true - }, - "outputs": [], - "source": [ - "# Using Newton's method\n", - "from random import random, seed\n", - "import numpy as np\n", - "import autograd.numpy as np\n", - "import matplotlib.pyplot as plt\n", - "from autograd import grad\n", - "\n", - "def CostOLS(beta):\n", - " return (1.0/n)*np.sum((y-X @ beta)**2)\n", - "\n", - "n = 100\n", - "x = 2*np.random.rand(n,1)\n", - "y = 4+3*x+np.random.randn(n,1)\n", - "\n", - "X = np.c_[np.ones((n,1)), x]\n", - "XT_X = X.T @ X\n", - "beta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y)\n", - "print(\"Own inversion\")\n", - "print(beta_linreg)\n", - "# Hessian matrix\n", - "H = (2.0/n)* XT_X\n", - "# Note that here the Hessian does not depend on the parameters beta\n", - "invH = np.linalg.pinv(H)\n", - "EigValues, EigVectors = np.linalg.eig(H)\n", - "print(f\"Eigenvalues of Hessian Matrix:{EigValues}\")\n", - "\n", - "beta = np.random.randn(2,1)\n", - "Niterations = 5\n", - "\n", - "# define the gradient\n", - "training_gradient = grad(CostOLS)\n", - "\n", - "for iter in range(Niterations):\n", - " gradients = training_gradient(beta)\n", - " beta -= invH @ gradients\n", - " print(iter,gradients[0],gradients[1])\n", - "print(\"beta from own Newton code\")\n", - "print(beta)" - ] - }, - { - "cell_type": "markdown", - "id": "e302b6c8", + "id": "5ab2acb5", "metadata": { "editable": true }, @@ -2009,8 +2064,8 @@ }, { "cell_type": "code", - "execution_count": 12, - "id": "88efb71c", + "execution_count": 11, + "id": "47c2c7fd", "metadata": { "collapsed": false, "editable": true @@ -2094,7 +2149,7 @@ }, { "cell_type": "markdown", - "id": "a3e14887", + "id": "fd8262d3", "metadata": { "editable": true }, @@ -2104,8 +2159,8 @@ }, { "cell_type": "code", - "execution_count": 13, - "id": "607e3bc9", + "execution_count": 12, + "id": "38b4d9b4", "metadata": { "collapsed": false, "editable": true @@ -2183,7 +2238,7 @@ }, { "cell_type": "markdown", - "id": "d96e1c2c", + "id": "5aa8d23f", "metadata": { "editable": true }, @@ -2193,8 +2248,8 @@ }, { "cell_type": "code", - "execution_count": 14, - "id": "6cbe854b", + "execution_count": 13, + "id": "ad237e29", "metadata": { "collapsed": false, "editable": true @@ -2253,7 +2308,7 @@ }, { "cell_type": "markdown", - "id": "0ed15b7b", + "id": "d7b69389", "metadata": { "editable": true }, @@ -2263,7 +2318,7 @@ }, { "cell_type": "markdown", - "id": "d97ab879", + "id": "b3d0a76d", "metadata": { "editable": true }, @@ -2273,8 +2328,8 @@ }, { "cell_type": "code", - "execution_count": 15, - "id": "c58a19a2", + "execution_count": 14, + "id": "62e76ebb", "metadata": { "collapsed": false, "editable": true @@ -2339,7 +2394,7 @@ }, { "cell_type": "markdown", - "id": "d7106089", + "id": "296f1151", "metadata": { "editable": true }, @@ -2349,8 +2404,8 @@ }, { "cell_type": "code", - "execution_count": 16, - "id": "d3b9cdb9", + "execution_count": 15, + "id": "004c5081", "metadata": { "collapsed": false, "editable": true @@ -2420,7 +2475,7 @@ }, { "cell_type": "markdown", - "id": "e6a7abff", + "id": "d51c3400", "metadata": { "editable": true }, diff --git a/doc/src/week37/week37.do.txt b/doc/src/week37/week37.do.txt index fc160fb0e..20b5caa14 100644 --- a/doc/src/week37/week37.do.txt +++ b/doc/src/week37/week37.do.txt @@ -21,7 +21,7 @@ o More advanced updates of the learning rate: ADAgrad, RMSprop and ADAM !split ===== Readings and Videos: ===== !bblock -o Recommended: Goodfellow et al, Deep Learning, introduction to gradient descent, see sections 4.3-4.5 at URL:"https://www.deeplearningbook.org/contents/numerical.html" and chapter 8.3-8.5 at URL::https://www.deeplearningbook.org/contents/optimization.html" +o Recommended: Goodfellow et al, Deep Learning, introduction to gradient descent, see sections 4.3-4.5 at URL:"https://www.deeplearningbook.org/contents/numerical.html" and chapter 8.3-8.5 at URL:"https://www.deeplearningbook.org/contents/optimization.html" o Rashcka et al, pages 37-44 and pages 278-283 with focus on linear regression. o Video on gradient descent at URL:"https://www.youtube.com/watch?v=sDv4f4s2SB8" o Video on Stochastic gradient descent at URL:"https://www.youtube.com/watch?v=vMh0zPT0tLI" @@ -452,13 +452,15 @@ pyplot.plot(solutions, scores, '.-', color='red') pyplot.show() !ec - - !split -===== Overview video on Stochastic Gradient Descent ===== +===== Overview video on Stochastic Gradient Descent (SGD) ===== "What is Stochastic Gradient Descent":"https://www.youtube.com/watch?v=vMh0zPT0tLI&ab_channel=StatQuestwithJoshStarmer" +There are several reasons for using stochastic gradient descent. Some of these are: +o Efficiency: Updates weights more frequently using a single or a small batch of samples, which speeds up convergence. +o Hopefully avoid Local Minima +o Memory Usage: Requires less memory compared to computing gradients for the entire dataset. !split ===== Batches and mini-batches ===== @@ -474,6 +476,44 @@ gradient over batches of the training data. For example, a typical batch could c an entire training set of several millions. This batch is then used to perform a parameter update. + +!split +===== Pros and cons ===== + + +o Speed: SGD is faster than gradient descent because it uses only one training example per iteration, whereas gradient descent requires the entire dataset. This speed advantage becomes more significant as the size of the dataset increases. +o Convergence: Gradient descent has a more predictable convergence behaviour because it uses the average gradient of the entire dataset. In contrast, SGD’s convergence behaviour can be more erratic due to its random sampling of individual training examples. +o Memory: Gradient descent requires more memory than SGD because it must store the entire dataset for each iteration. SGD only needs to store the current training example, making it more memory-efficient. + + +!split +===== Convergence rates ===== + +o Stochastic Gradient Descent has a faster convergence rate due to the use of single training examples in each iteration. +o Gradient Descent as a slower convergence rate, as it uses the entire dataset for each iteration. + +!split +===== Accuracy ===== + +In general, stochastic Gradient Descent is Less accurate than gradient +descent, as it calculates the gradient on single examples, which may +not accurately represent the overall dataset. Gradient Descent is +more accurate because it uses the average gradient calculated over the +entire dataset. + + +There are other disadvantages to using SGD. The main drawback is that +its convergence behaviour can be more erratic due to the random +sampling of individual training examples. This can lead to less +accurate results, as the algorithm may not converge to the true +minimum of the cost function. Additionally, the learning rate, which +determines the step size of each update to the model’s parameters, +must be carefully chosen to ensure convergence. + +It is however the method of choice in deep learning algorithms where +SGD is often used in combination with other optimization techniques, +such as momentum or adaptive learning rates + !split ===== Stochastic Gradient Descent (SGD) ===== @@ -670,10 +710,6 @@ print("gamma_j after %d epochs: %g" % (n_epochs,gamma_j)) !ec - - - - !split ===== Code with a Number of Minibatches which varies ===== @@ -870,8 +906,8 @@ our current momentum, $\nabla_\theta E(\boldsymbol{\theta}_t +\gamma \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$. - +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 ===== @@ -893,7 +929,7 @@ 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 +During the last decade 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, Root Mean Squared Propagation (RMS-Prop), and "ADAM":"https://arxiv.org/abs/1412.6980". @@ -980,7 +1016,26 @@ update rule for this parameter is given by The algorithms we have implemented are well described in the text by "Goodfellow, Bengio and Courville, chapter 8":"https://www.deeplearningbook.org/contents/optimization.html". -The codes which implement these algorithms are discussed below here. +The codes which implement these algorithms are discussed after our presentation of automatic differentiation. + + +===== AdaGrad algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html" ===== + +FIGURE: [figures/adagrad.png, width=600 frac=0.8] + + +===== RMSProp algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html" ===== + +FIGURE: [figures/rmsprop.png, width=600 frac=0.8] + + + +===== ADAM algorithm, taken from "Goodfellow et al":"https://www.deeplearningbook.org/contents/optimization.html" ===== + +FIGURE: [figures/adam.png, width=600 frac=0.8] + + + !split @@ -995,15 +1050,12 @@ The codes which implement these algorithms are discussed below here. * _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. - - - !split -===== Sneaking in automatic differentiation using Autograd ===== - -We anticipate our discussions to come in connection with neural networks and automatic differentiation -by showing how we can use _autograd_ for the cases above. Later we will replace _autograd_ with _JAX_. +===== Sneaking in auotmatic differentiation using Autograd ===== +We conclude the part on optmization by showing how we can make codes +for linear regression and logistic regression using _autograd_. The +first example shows results with ordinary leats squares. !bc pycod # Using Autograd to calculate gradients for OLS @@ -1118,51 +1170,6 @@ print(theta) !ec -!split -===== But none of these can compete with Newton's method ===== - -!bc pycod -# Using Newton's method -from random import random, seed -import numpy as np -import autograd.numpy as np -import matplotlib.pyplot as plt -from autograd import grad - -def CostOLS(beta): - return (1.0/n)*np.sum((y-X @ beta)**2) - -n = 100 -x = 2*np.random.rand(n,1) -y = 4+3*x+np.random.randn(n,1) - -X = np.c_[np.ones((n,1)), x] -XT_X = X.T @ X -beta_linreg = np.linalg.pinv(XT_X) @ (X.T @ y) -print("Own inversion") -print(beta_linreg) -# Hessian matrix -H = (2.0/n)* XT_X -# Note that here the Hessian does not depend on the parameters beta -invH = np.linalg.pinv(H) -EigValues, EigVectors = np.linalg.eig(H) -print(f"Eigenvalues of Hessian Matrix:{EigValues}") - -beta = np.random.randn(2,1) -Niterations = 5 - -# define the gradient -training_gradient = grad(CostOLS) - -for iter in range(Niterations): - gradients = training_gradient(beta) - beta -= invH @ gradients - print(iter,gradients[0],gradients[1]) -print("beta from own Newton code") -print(beta) -!ec - - !split ===== Including Stochastic Gradient Descent with Autograd ===== In this code we include the stochastic gradient descent approach discussed above. Note here that we specify which argument we are taking the derivative with respect to when using _autograd_. @@ -1512,3 +1519,11 @@ o Work on project 1 # * "Video of exercise sessions week 37":"https://youtu.be/bK4AEcTu-oM" * For more discussions of Ridge regression and calculation of averages, "Wessel van Wieringen's":"https://arxiv.org/abs/1509.09169" article is highly recommended. !eblock + + + + + + + +

    G&gZxftwkA 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%0AS`|7-puoiFOStNVhtNgjJ`)8r^M$HpbQ02S%Ip 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 literal 192 zcmV;x06+g9iwFR3YrSXy1MSbv3c@f92k@Qu6nTQtxpqAZ?%+WX@dY}TxjNU*wnO*! z?gR9sco`z}cli?%LUPE~n_U*Uy9*XW2uUf0F?q_SB&)fe#4&@I5yn?3V~hid6GmwO zWVw@GI_rcPPHCz$DvRpf+%Q&_ANI_zz%&2Ev62?H``%Srfzl3ht!ua;)(MYf+p8Q3 ujdpB-!D}ZCf>1q(qL5B%B`#rW^vQ_EM&YlY@jTD-zV-m5&|SX(2mk=b2wM&S diff --git a/doc/pub/week37/ipynb/week37.ipynb b/doc/pub/week37/ipynb/week37.ipynb index c40ec2419..386e755d2 100644 --- a/doc/pub/week37/ipynb/week37.ipynb +++ b/doc/pub/week37/ipynb/week37.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "ebae0536", + "id": "26195c6c", "metadata": { "editable": true }, @@ -14,7 +14,7 @@ }, { "cell_type": "markdown", - "id": "c87edf63", + "id": "2f3d0562", "metadata": { "editable": true }, @@ -29,7 +29,7 @@ }, { "cell_type": "markdown", - "id": "9b6436c9", + "id": "3a04c093", "metadata": { "editable": true }, @@ -52,13 +52,13 @@ }, { "cell_type": "markdown", - "id": "01055296", + "id": "71cbeb43", "metadata": { "editable": true }, "source": [ "## Readings and Videos:\n", - "1. Recommended: Goodfellow et al, Deep Learning, introduction to gradient descent, see sections 4.3-4.5 at and chapter 8.3-8.5 at URL::https://www.deeplearningbook.org/contents/optimization.html\"\n", + "1. Recommended: Goodfellow et al, Deep Learning, introduction to gradient descent, see sections 4.3-4.5 at and chapter 8.3-8.5 at \n", "\n", "2. Rashcka et al, pages 37-44 and pages 278-283 with focus on linear regression.\n", "\n", @@ -69,7 +69,7 @@ }, { "cell_type": "markdown", - "id": "5b4c3f44", + "id": "eaa820fc", "metadata": { "editable": true }, @@ -79,7 +79,7 @@ }, { "cell_type": "markdown", - "id": "23544472", + "id": "ff06566a", "metadata": { "editable": true }, @@ -103,7 +103,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "d74adaf2", + "id": "059f5649", "metadata": { "collapsed": false, "editable": true @@ -116,7 +116,7 @@ }, { "cell_type": "markdown", - "id": "fa36c64d", + "id": "3cdf34a5", "metadata": { "editable": true }, @@ -127,7 +127,7 @@ }, { "cell_type": "markdown", - "id": "571c791d", + "id": "d66f2b53", "metadata": { "editable": true }, @@ -139,7 +139,7 @@ }, { "cell_type": "markdown", - "id": "12d3e9eb", + "id": "e0c22d3d", "metadata": { "editable": true }, @@ -149,7 +149,7 @@ }, { "cell_type": "markdown", - "id": "17610490", + "id": "8cb6c439", "metadata": { "editable": true }, @@ -161,7 +161,7 @@ }, { "cell_type": "markdown", - "id": "47fefa69", + "id": "45ba3ffb", "metadata": { "editable": true }, @@ -175,7 +175,7 @@ }, { "cell_type": "markdown", - "id": "52eb2d30", + "id": "9a8ffab0", "metadata": { "editable": true }, @@ -191,7 +191,7 @@ }, { "cell_type": "markdown", - "id": "7d89f32b", + "id": "9bb32152", "metadata": { "editable": true }, @@ -201,7 +201,7 @@ }, { "cell_type": "markdown", - "id": "5b0fb490", + "id": "7d386532", "metadata": { "editable": true }, @@ -213,7 +213,7 @@ }, { "cell_type": "markdown", - "id": "891f388a", + "id": "3eaf521e", "metadata": { "editable": true }, @@ -223,7 +223,7 @@ }, { "cell_type": "markdown", - "id": "d05ffb4b", + "id": "8e6191e9", "metadata": { "editable": true }, @@ -235,7 +235,7 @@ }, { "cell_type": "markdown", - "id": "f59689ea", + "id": "ac7e5a33", "metadata": { "editable": true }, @@ -249,7 +249,7 @@ }, { "cell_type": "markdown", - "id": "9a119fe4", + "id": "f5d64e82", "metadata": { "editable": true }, @@ -259,7 +259,7 @@ }, { "cell_type": "markdown", - "id": "ef5c109f", + "id": "65cef2b1", "metadata": { "editable": true }, @@ -270,7 +270,7 @@ }, { "cell_type": "markdown", - "id": "5412ed07", + "id": "dd1c97dd", "metadata": { "editable": true }, @@ -285,7 +285,7 @@ }, { "cell_type": "markdown", - "id": "33c5d9c9", + "id": "4771d71e", "metadata": { "editable": true }, @@ -295,7 +295,7 @@ }, { "cell_type": "markdown", - "id": "a8cf7d20", + "id": "8140a000", "metadata": { "editable": true }, @@ -307,7 +307,7 @@ }, { "cell_type": "markdown", - "id": "40f0daf3", + "id": "16bbcf2f", "metadata": { "editable": true }, @@ -319,7 +319,7 @@ }, { "cell_type": "markdown", - "id": "b09c9d54", + "id": "f2b8a434", "metadata": { "editable": true }, @@ -334,7 +334,7 @@ }, { "cell_type": "markdown", - "id": "081f1192", + "id": "4515d126", "metadata": { "editable": true }, @@ -347,7 +347,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "5842a0a2", + "id": "0fbb2309", "metadata": { "collapsed": false, "editable": true @@ -406,7 +406,7 @@ }, { "cell_type": "markdown", - "id": "923874ba", + "id": "9e083c31", "metadata": { "editable": true }, @@ -418,7 +418,7 @@ }, { "cell_type": "markdown", - "id": "442c5abb", + "id": "10a41983", "metadata": { "editable": true }, @@ -430,7 +430,7 @@ }, { "cell_type": "markdown", - "id": "743e05ca", + "id": "9e612405", "metadata": { "editable": true }, @@ -440,7 +440,7 @@ }, { "cell_type": "markdown", - "id": "27dfced9", + "id": "618d8dd0", "metadata": { "editable": true }, @@ -454,7 +454,7 @@ }, { "cell_type": "markdown", - "id": "3ff66697", + "id": "d0c88404", "metadata": { "editable": true }, @@ -464,7 +464,7 @@ }, { "cell_type": "markdown", - "id": "f63f80f9", + "id": "96f35638", "metadata": { "editable": true }, @@ -476,7 +476,7 @@ }, { "cell_type": "markdown", - "id": "dc6a4fff", + "id": "99d2a6dd", "metadata": { "editable": true }, @@ -487,7 +487,7 @@ }, { "cell_type": "markdown", - "id": "56a4b43d", + "id": "7f61638e", "metadata": { "editable": true }, @@ -502,7 +502,7 @@ }, { "cell_type": "markdown", - "id": "38c6aab3", + "id": "256e6480", "metadata": { "editable": true }, @@ -516,7 +516,7 @@ }, { "cell_type": "markdown", - "id": "a4f724c3", + "id": "3b9bd1b5", "metadata": { "editable": true }, @@ -527,7 +527,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "ae5d09dc", + "id": "d99082f7", "metadata": { "collapsed": false, "editable": true @@ -588,7 +588,7 @@ }, { "cell_type": "markdown", - "id": "184d283f", + "id": "65bea527", "metadata": { "editable": true }, @@ -610,7 +610,7 @@ }, { "cell_type": "markdown", - "id": "cfb021a5", + "id": "6d7105d1", "metadata": { "editable": true }, @@ -623,7 +623,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "a89ea0e9", + "id": "6b3f6111", "metadata": { "collapsed": false, "editable": true @@ -689,7 +689,7 @@ }, { "cell_type": "markdown", - "id": "4a29024a", + "id": "085e9053", "metadata": { "editable": true }, @@ -700,7 +700,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "9212126a", + "id": "4dc281e1", "metadata": { "collapsed": false, "editable": true @@ -774,19 +774,26 @@ }, { "cell_type": "markdown", - "id": "c12221ee", + "id": "095fdc5b", "metadata": { "editable": true }, "source": [ - "## Overview video on Stochastic Gradient Descent\n", + "## Overview video on Stochastic Gradient Descent (SGD)\n", "\n", - "[What is Stochastic Gradient Descent](https://www.youtube.com/watch?v=vMh0zPT0tLI&ab_channel=StatQuestwithJoshStarmer)" + "[What is Stochastic Gradient Descent](https://www.youtube.com/watch?v=vMh0zPT0tLI&ab_channel=StatQuestwithJoshStarmer)\n", + "There are several reasons for using stochastic gradient descent. Some of these are:\n", + "\n", + "1. Efficiency: Updates weights more frequently using a single or a small batch of samples, which speeds up convergence.\n", + "\n", + "2. Hopefully avoid Local Minima\n", + "\n", + "3. Memory Usage: Requires less memory compared to computing gradients for the entire dataset." ] }, { "cell_type": "markdown", - "id": "89e21421", + "id": "c1acf305", "metadata": { "editable": true }, @@ -807,7 +814,65 @@ }, { "cell_type": "markdown", - "id": "b3d6706b", + "id": "bb9ccd97", + "metadata": { + "editable": true + }, + "source": [ + "## Pros and cons\n", + "\n", + "1. Speed: SGD is faster than gradient descent because it uses only one training example per iteration, whereas gradient descent requires the entire dataset. This speed advantage becomes more significant as the size of the dataset increases.\n", + "\n", + "2. Convergence: Gradient descent has a more predictable convergence behaviour because it uses the average gradient of the entire dataset. In contrast, SGD’s convergence behaviour can be more erratic due to its random sampling of individual training examples.\n", + "\n", + "3. Memory: Gradient descent requires more memory than SGD because it must store the entire dataset for each iteration. SGD only needs to store the current training example, making it more memory-efficient." + ] + }, + { + "cell_type": "markdown", + "id": "f5aaa59d", + "metadata": { + "editable": true + }, + "source": [ + "## Convergence rates\n", + "\n", + "1. Stochastic Gradient Descent has a faster convergence rate due to the use of single training examples in each iteration.\n", + "\n", + "2. Gradient Descent as a slower convergence rate, as it uses the entire dataset for each iteration." + ] + }, + { + "cell_type": "markdown", + "id": "b6e06eb4", + "metadata": { + "editable": true + }, + "source": [ + "## Accuracy\n", + "\n", + "In general, stochastic Gradient Descent is Less accurate than gradient\n", + "descent, as it calculates the gradient on single examples, which may\n", + "not accurately represent the overall dataset. Gradient Descent is\n", + "more accurate because it uses the average gradient calculated over the\n", + "entire dataset.\n", + "\n", + "There are other disadvantages to using SGD. The main drawback is that\n", + "its convergence behaviour can be more erratic due to the random\n", + "sampling of individual training examples. This can lead to less\n", + "accurate results, as the algorithm may not converge to the true\n", + "minimum of the cost function. Additionally, the learning rate, which\n", + "determines the step size of each update to the model’s parameters,\n", + "must be carefully chosen to ensure convergence.\n", + "\n", + "It is however the method of choice in deep learning algorithms where\n", + "SGD is often used in combination with other optimization techniques,\n", + "such as momentum or adaptive learning rates" + ] + }, + { + "cell_type": "markdown", + "id": "e6de9732", "metadata": { "editable": true }, @@ -839,7 +904,7 @@ }, { "cell_type": "markdown", - "id": "f2900e4e", + "id": "5d6f2336", "metadata": { "editable": true }, @@ -856,7 +921,7 @@ }, { "cell_type": "markdown", - "id": "b6745dec", + "id": "9c24946f", "metadata": { "editable": true }, @@ -869,7 +934,7 @@ }, { "cell_type": "markdown", - "id": "b6f524f1", + "id": "15ae46aa", "metadata": { "editable": true }, @@ -882,7 +947,7 @@ }, { "cell_type": "markdown", - "id": "db7c028a", + "id": "eba44d5b", "metadata": { "editable": true }, @@ -895,7 +960,7 @@ }, { "cell_type": "markdown", - "id": "813b7f85", + "id": "fa5a0e9f", "metadata": { "editable": true }, @@ -909,7 +974,7 @@ }, { "cell_type": "markdown", - "id": "a562fa9a", + "id": "86e67dff", "metadata": { "editable": true }, @@ -931,7 +996,7 @@ }, { "cell_type": "markdown", - "id": "75d84b18", + "id": "1ffda2a5", "metadata": { "editable": true }, @@ -946,7 +1011,7 @@ }, { "cell_type": "markdown", - "id": "0cf6f343", + "id": "dd9589cf", "metadata": { "editable": true }, @@ -958,7 +1023,7 @@ }, { "cell_type": "markdown", - "id": "44f85de2", + "id": "bccd17a0", "metadata": { "editable": true }, @@ -971,7 +1036,7 @@ }, { "cell_type": "markdown", - "id": "92851949", + "id": "fa4254bc", "metadata": { "editable": true }, @@ -985,7 +1050,7 @@ }, { "cell_type": "markdown", - "id": "21d2691e", + "id": "d6134b3d", "metadata": { "editable": true }, @@ -996,7 +1061,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "6536b711", + "id": "46bbb72f", "metadata": { "collapsed": false, "editable": true @@ -1021,7 +1086,7 @@ }, { "cell_type": "markdown", - "id": "4005ce6c", + "id": "f354fc55", "metadata": { "editable": true }, @@ -1037,7 +1102,7 @@ }, { "cell_type": "markdown", - "id": "adec9808", + "id": "3ff93d52", "metadata": { "editable": true }, @@ -1058,7 +1123,7 @@ }, { "cell_type": "markdown", - "id": "deecc226", + "id": "3010708d", "metadata": { "editable": true }, @@ -1078,7 +1143,7 @@ }, { "cell_type": "markdown", - "id": "73685769", + "id": "0052d791", "metadata": { "editable": true }, @@ -1097,7 +1162,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "6484bffa", + "id": "aaa345b9", "metadata": { "collapsed": false, "editable": true @@ -1132,7 +1197,7 @@ }, { "cell_type": "markdown", - "id": "2438f642", + "id": "851c6b4d", "metadata": { "editable": true }, @@ -1145,7 +1210,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "8d624cf1", + "id": "664d6772", "metadata": { "collapsed": false, "editable": true @@ -1222,7 +1287,7 @@ }, { "cell_type": "markdown", - "id": "6e9eb916", + "id": "6905c3ba", "metadata": { "editable": true }, @@ -1237,7 +1302,7 @@ }, { "cell_type": "markdown", - "id": "c60a0137", + "id": "6f7347c9", "metadata": { "editable": true }, @@ -1252,7 +1317,7 @@ }, { "cell_type": "markdown", - "id": "2d8174d4", + "id": "7a8fac99", "metadata": { "editable": true }, @@ -1264,7 +1329,7 @@ }, { "cell_type": "markdown", - "id": "afc41240", + "id": "61c534ef", "metadata": { "editable": true }, @@ -1282,7 +1347,7 @@ }, { "cell_type": "markdown", - "id": "e3c96a9f", + "id": "cbe325b2", "metadata": { "editable": true }, @@ -1301,7 +1366,7 @@ }, { "cell_type": "markdown", - "id": "74e0e345", + "id": "18c4f71f", "metadata": { "editable": true }, @@ -1313,7 +1378,7 @@ }, { "cell_type": "markdown", - "id": "288fcc66", + "id": "b84f0488", "metadata": { "editable": true }, @@ -1323,7 +1388,7 @@ }, { "cell_type": "markdown", - "id": "63b49aca", + "id": "c5772ef7", "metadata": { "editable": true }, @@ -1339,7 +1404,7 @@ }, { "cell_type": "markdown", - "id": "94b37496", + "id": "c86bbefb", "metadata": { "editable": true }, @@ -1351,7 +1416,7 @@ }, { "cell_type": "markdown", - "id": "3a439485", + "id": "88aea644", "metadata": { "editable": true }, @@ -1361,7 +1426,7 @@ }, { "cell_type": "markdown", - "id": "ff92e318", + "id": "8d0f09dd", "metadata": { "editable": true }, @@ -1373,7 +1438,7 @@ }, { "cell_type": "markdown", - "id": "142e0f95", + "id": "3c0f263a", "metadata": { "editable": true }, @@ -1383,7 +1448,7 @@ }, { "cell_type": "markdown", - "id": "88d4ce9a", + "id": "e022e30b", "metadata": { "editable": true }, @@ -1395,7 +1460,7 @@ }, { "cell_type": "markdown", - "id": "5c662618", + "id": "e29f7ed3", "metadata": { "editable": true }, @@ -1411,7 +1476,7 @@ }, { "cell_type": "markdown", - "id": "2c4a2172", + "id": "745ac9fb", "metadata": { "editable": true }, @@ -1423,7 +1488,7 @@ }, { "cell_type": "markdown", - "id": "630c69f8", + "id": "e7608c5b", "metadata": { "editable": true }, @@ -1456,7 +1521,7 @@ }, { "cell_type": "markdown", - "id": "7fc49052", + "id": "3af69259", "metadata": { "editable": true }, @@ -1468,7 +1533,7 @@ }, { "cell_type": "markdown", - "id": "800856ba", + "id": "fe7f114b", "metadata": { "editable": true }, @@ -1486,17 +1551,18 @@ }, { "cell_type": "markdown", - "id": "154d4907", + "id": "aac7d523", "metadata": { "editable": true }, "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$." + "One of the major advantages of NAG is that it allows for the use of a\n", + "larger learning rate than GDM for the same choice of $\\gamma$." ] }, { "cell_type": "markdown", - "id": "17557243", + "id": "0f6129f0", "metadata": { "editable": true }, @@ -1519,7 +1585,7 @@ "the steep computational price of calculating or approximating\n", "Hessians.\n", "\n", - "Recently, a number of methods have been introduced that accomplish\n", + "During the last decade a number of methods have been introduced that accomplish\n", "this by tracking not only the gradient, but also the second moment of\n", "the gradient. These methods include AdaGrad, AdaDelta, Root Mean Squared Propagation (RMS-Prop), and\n", "[ADAM](https://arxiv.org/abs/1412.6980)." @@ -1527,7 +1593,7 @@ }, { "cell_type": "markdown", - "id": "f3d09840", + "id": "4ee6d23c", "metadata": { "editable": true }, @@ -1542,7 +1608,7 @@ }, { "cell_type": "markdown", - "id": "175455a1", + "id": "410f1144", "metadata": { "editable": true }, @@ -1560,7 +1626,7 @@ }, { "cell_type": "markdown", - "id": "cf1e9538", + "id": "b3336df7", "metadata": { "editable": true }, @@ -1572,7 +1638,7 @@ }, { "cell_type": "markdown", - "id": "da9b6589", + "id": "a50a2257", "metadata": { "editable": true }, @@ -1584,7 +1650,7 @@ }, { "cell_type": "markdown", - "id": "cbc7a25f", + "id": "1fb1ab6a", "metadata": { "editable": true }, @@ -1602,7 +1668,7 @@ }, { "cell_type": "markdown", - "id": "e8064f4a", + "id": "9e04c2f8", "metadata": { "editable": true }, @@ -1631,7 +1697,7 @@ }, { "cell_type": "markdown", - "id": "12912817", + "id": "9450e0f8", "metadata": { "editable": true }, @@ -1649,7 +1715,7 @@ }, { "cell_type": "markdown", - "id": "7864ca89", + "id": "0ec4afd8", "metadata": { "editable": true }, @@ -1661,7 +1727,7 @@ }, { "cell_type": "markdown", - "id": "02a5d4ef", + "id": "7d09f8b8", "metadata": { "editable": true }, @@ -1673,7 +1739,7 @@ }, { "cell_type": "markdown", - "id": "327a1f34", + "id": "219826a3", "metadata": { "editable": true }, @@ -1685,7 +1751,7 @@ }, { "cell_type": "markdown", - "id": "c5ac526b", + "id": "d3f0e5c5", "metadata": { "editable": true }, @@ -1697,7 +1763,7 @@ }, { "cell_type": "markdown", - "id": "e6a33564", + "id": "46fcf54e", "metadata": { "editable": true }, @@ -1709,7 +1775,7 @@ }, { "cell_type": "markdown", - "id": "4ffe0088", + "id": "9f3f1e9c", "metadata": { "editable": true }, @@ -1726,7 +1792,7 @@ }, { "cell_type": "markdown", - "id": "34eb03fb", + "id": "e4d859d2", "metadata": { "editable": true }, @@ -1745,7 +1811,7 @@ }, { "cell_type": "markdown", - "id": "18f62c05", + "id": "d9fb412a", "metadata": { "editable": true }, @@ -1757,7 +1823,7 @@ }, { "cell_type": "markdown", - "id": "5539d5a5", + "id": "a4ed4fe4", "metadata": { "editable": true }, @@ -1766,12 +1832,60 @@ "\n", "The algorithms we have implemented are well described in the text by [Goodfellow, Bengio and Courville, chapter 8](https://www.deeplearningbook.org/contents/optimization.html).\n", "\n", - "The codes which implement these algorithms are discussed below here." + "The codes which implement these algorithms are discussed after our presentation of automatic differentiation." ] }, { "cell_type": "markdown", - "id": "ae04cfe0", + "id": "c8b687aa", + "metadata": { + "editable": true + }, + "source": [ + "## AdaGrad algorithm, taken from [Goodfellow et al](https://www.deeplearningbook.org/contents/optimization.html)\n", + "\n", + "\n", + "\n", + "\n", + "