handson-ml/math_differential_calculus....

6015 lines
593 KiB
Plaintext
Raw Normal View History

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Math - Differential Calculus**\n",
"\n",
"Calculus is the study of continuous change. It has two major subfields: *differential calculus*, which studies the rate of change of functions, and *integral calculus*, which studies the area under the curve. In this notebook, we will discuss the former.\n",
"\n",
"*Differential calculus is at the core of Deep Learning, so it is important to understand what derivatives and gradients are, how they are used in Deep Learning, and understand what their limitations are.*\n",
"\n",
"**Note:** the code in this notebook is only used to create figures and animations. You do not need to understand how it works (although I did my best to make it clear, in case you are interested)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<table align=\"left\">\n",
" <td>\n",
" <a href=\"https://colab.research.google.com/github/ageron/handson-ml3/blob/main/math_differential_calculus.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>\n",
" </td>\n",
2021-05-25 21:31:19 +02:00
" <td>\n",
" <a target=\"_blank\" href=\"https://kaggle.com/kernels/welcome?src=https://github.com/ageron/handson-ml3/blob/main/math_differential_calculus.ipynb\"><img src=\"https://kaggle.com/static/images/open-in-kaggle.svg\" /></a>\n",
2021-05-25 21:31:19 +02:00
" </td>\n",
"</table>"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "ChS5BE53XXYr"
},
"source": [
"# Slope of a straight line"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"cellView": "form",
"colab": {},
"colab_type": "code",
"id": "QXiG4ZiHvf_5"
},
"outputs": [],
"source": [
"#@title\n",
"%matplotlib inline\n",
"import matplotlib as mpl\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"# To get smooth animations\n",
"import matplotlib.animation as animation\n",
"mpl.rc('animation', html='jshtml')"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "AA7V2hteveV4"
},
"source": [
"What is the slope of the following line?"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"cellView": "form",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 300
},
"colab_type": "code",
"id": "m9h_md3TvVUh",
"outputId": "1c00aae1-f836-4335-af04-079ece1074c5"
},
2022-02-19 10:24:54 +01:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#@title\n",
"def get_AB_line(A_pos, B_pos, x_min=-1000, x_max=+1000):\n",
" rise = B_pos[1] - A_pos[1]\n",
" run = B_pos[0] - A_pos[0]\n",
" slope = rise / run\n",
" offset = A_pos[1] - slope * A_pos[0]\n",
" return [x_min, x_max], [x_min * slope + offset, x_max * slope + offset]\n",
"\n",
"def plot_AB_line(A_pos, B_pos, A_name=\"A\", B_name=\"B\"):\n",
" for point, name in ((A_pos, A_name), (B_pos, B_name)):\n",
" plt.plot(point[0], point[1], \"bo\")\n",
" plt.text(point[0] - 0.35, point[1], name, fontsize=14)\n",
" xs, ys = get_AB_line(A_pos, B_pos)\n",
" plt.plot(xs, ys)\n",
"\n",
"def plot_rise_over_run(A_pos, B_pos):\n",
" plt.plot([A_pos[0], B_pos[0]], [A_pos[1], A_pos[1]], \"k--\")\n",
" plt.text((A_pos[0] + B_pos[0]) / 2, A_pos[1] - 0.4, \"run\", fontsize=14)\n",
" plt.plot([B_pos[0], B_pos[0]], [A_pos[1], B_pos[1]], \"k--\")\n",
" plt.text(B_pos[0] + 0.2, (A_pos[1] + B_pos[1]) / 2, \"rise\", fontsize=14)\n",
"\n",
"def show(axis=\"equal\", ax=None, title=None, xlabel=\"$x$\", ylabel=\"$y$\"):\n",
" ax = ax or plt.gca()\n",
" ax.axis(axis)\n",
" ax.grid()\n",
" ax.set_title(title, fontsize=14)\n",
" ax.set_xlabel(xlabel, fontsize=14)\n",
" ax.set_ylabel(ylabel, fontsize=14, rotation=0)\n",
" ax.axhline(y=0, color='k')\n",
" ax.axvline(x=0, color='k')\n",
"\n",
"A_pos = np.array([1, 1])\n",
"B_pos = np.array([7, 4])\n",
"plot_AB_line(A_pos, B_pos)\n",
"plot_rise_over_run(A_pos, B_pos)\n",
"show([0, 8.4, 0, 5.5], title=\"Slope = rise / run\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "ya-lEC7O5IHX"
},
"source": [
"As you probably know, the slope of a (non-vertical) straight line can be calculated by taking any two points $\\mathrm{A}$ and $\\mathrm{B}$ on the line, and computing the \"rise over run\":\n",
"\n",
"$slope = \\dfrac{rise}{run} = \\dfrac{\\Delta y}{\\Delta x} = \\dfrac{y_\\mathrm{B} - y_\\mathrm{A}}{x_\\mathrm{B} - x_\\mathrm{A}}$\n",
"\n",
"\n",
"In this example, the rise is 3, and the run is 6, so the slope is 3/6 = 0.5."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "mKJGxZIAXikF"
},
"source": [
"# Defining the slope of a curve"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "gcb7eqkmGGXf"
},
"source": [
"But what if you want to know the slope of something else than a straight line? For example, let's consider the curve defined by $y = f(x) = x^2$:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"cellView": "form",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 305
},
"colab_type": "code",
"id": "U6T3WLcsRZuh",
"outputId": "aae68e5b-77d2-4cf0-a0da-015b14daea25"
},
2022-02-19 10:24:54 +01:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#@title\n",
"xs = np.linspace(-2.1, 2.1, 500)\n",
"ys = xs**2\n",
"plt.plot(xs, ys)\n",
"\n",
"plt.plot([0, 0], [0, 3], \"k--\")\n",
"plt.arrow(-1.4, 2.5, 0.5, -1.3, head_width=0.1)\n",
"plt.arrow(0.85, 1.05, 0.5, 1.3, head_width=0.1)\n",
2020-04-12 13:32:03 +02:00
"show([-2.1, 2.1, 0, 2.8], title=\"Slope of the curve $y = x^2$\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "eCBsOOBAG1vh"
},
"source": [
"Obviously, the slope varies: on the left (i.e., when $x<0$), the slope is negative (i.e., when we move from left to right, the curve goes down), while on the right (i.e., when $x>0$) the slope is positive (i.e., when we move from left to right, the curve goes up). At the point $x=0$, the slope is equal to 0 (i.e., the curve is locally flat). The fact that the slope is 0 when we reach a minimum (or indeed a maximum) is crucially important, and we will come back to it later."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "4qCXg9nQSp6S"
},
"source": [
"How can we put numbers on these intuitions? Well, say we want to estimate the slope of the curve at a point $\\mathrm{A}$, we can do this by taking another point $\\mathrm{B}$ on the curve, not too far away, and then computing the slope between these two points:\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"cellView": "form",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 382
},
"colab_type": "code",
"id": "39VP85dfYwLW",
"outputId": "a614f61c-26bf-4380-bf0a-b6d3541e891a"
},
2022-02-19 10:24:54 +01:00
"outputs": [
{
"data": {
"text/html": [
"\n",
"<link rel=\"stylesheet\"\n",
"href=\"https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/\n",
"css/font-awesome.min.css\">\n",
"<script language=\"javascript\">\n",
" function isInternetExplorer() {\n",
" ua = navigator.userAgent;\n",
" /* MSIE used to detect old browsers and Trident used to newer ones*/\n",
" return ua.indexOf(\"MSIE \") > -1 || ua.indexOf(\"Trident/\") > -1;\n",
" }\n",
"\n",
" /* Define the Animation class */\n",
" function Animation(frames, img_id, slider_id, interval, loop_select_id){\n",
" this.img_id = img_id;\n",
" this.slider_id = slider_id;\n",
" this.loop_select_id = loop_select_id;\n",
" this.interval = interval;\n",
" this.current_frame = 0;\n",
" this.direction = 0;\n",
" this.timer = null;\n",
" this.frames = new Array(frames.length);\n",
"\n",
" for (var i=0; i<frames.length; i++)\n",
" {\n",
" this.frames[i] = new Image();\n",
" this.frames[i].src = frames[i];\n",
" }\n",
" var slider = document.getElementById(this.slider_id);\n",
" slider.max = this.frames.length - 1;\n",
" if (isInternetExplorer()) {\n",
" // switch from oninput to onchange because IE <= 11 does not conform\n",
" // with W3C specification. It ignores oninput and onchange behaves\n",
" // like oninput. In contrast, Mircosoft Edge behaves correctly.\n",
" slider.setAttribute('onchange', slider.getAttribute('oninput'));\n",
" slider.setAttribute('oninput', null);\n",
" }\n",
" this.set_frame(this.current_frame);\n",
" }\n",
"\n",
" Animation.prototype.get_loop_state = function(){\n",
" var button_group = document[this.loop_select_id].state;\n",
" for (var i = 0; i < button_group.length; i++) {\n",
" var button = button_group[i];\n",
" if (button.checked) {\n",
" return button.value;\n",
" }\n",
" }\n",
" return undefined;\n",
" }\n",
"\n",
" Animation.prototype.set_frame = function(frame){\n",
" this.current_frame = frame;\n",
" document.getElementById(this.img_id).src =\n",
" this.frames[this.current_frame].src;\n",
" document.getElementById(this.slider_id).value = this.current_frame;\n",
" }\n",
"\n",
" Animation.prototype.next_frame = function()\n",
" {\n",
" this.set_frame(Math.min(this.frames.length - 1, this.current_frame + 1));\n",
" }\n",
"\n",
" Animation.prototype.previous_frame = function()\n",
" {\n",
" this.set_frame(Math.max(0, this.current_frame - 1));\n",
" }\n",
"\n",
" Animation.prototype.first_frame = function()\n",
" {\n",
" this.set_frame(0);\n",
" }\n",
"\n",
" Animation.prototype.last_frame = function()\n",
" {\n",
" this.set_frame(this.frames.length - 1);\n",
" }\n",
"\n",
" Animation.prototype.slower = function()\n",
" {\n",
" this.interval /= 0.7;\n",
" if(this.direction > 0){this.play_animation();}\n",
" else if(this.direction < 0){this.reverse_animation();}\n",
" }\n",
"\n",
" Animation.prototype.faster = function()\n",
" {\n",
" this.interval *= 0.7;\n",
" if(this.direction > 0){this.play_animation();}\n",
" else if(this.direction < 0){this.reverse_animation();}\n",
" }\n",
"\n",
" Animation.prototype.anim_step_forward = function()\n",
" {\n",
" this.current_frame += 1;\n",
" if(this.current_frame < this.frames.length){\n",
" this.set_frame(this.current_frame);\n",
" }else{\n",
" var loop_state = this.get_loop_state();\n",
" if(loop_state == \"loop\"){\n",
" this.first_frame();\n",
" }else if(loop_state == \"reflect\"){\n",
" this.last_frame();\n",
" this.reverse_animation();\n",
" }else{\n",
" this.pause_animation();\n",
" this.last_frame();\n",
" }\n",
" }\n",
" }\n",
"\n",
" Animation.prototype.anim_step_reverse = function()\n",
" {\n",
" this.current_frame -= 1;\n",
" if(this.current_frame >= 0){\n",
" this.set_frame(this.current_frame);\n",
" }else{\n",
" var loop_state = this.get_loop_state();\n",
" if(loop_state == \"loop\"){\n",
" this.last_frame();\n",
" }else if(loop_state == \"reflect\"){\n",
" this.first_frame();\n",
" this.play_animation();\n",
" }else{\n",
" this.pause_animation();\n",
" this.first_frame();\n",
" }\n",
" }\n",
" }\n",
"\n",
" Animation.prototype.pause_animation = function()\n",
" {\n",
" this.direction = 0;\n",
" if (this.timer){\n",
" clearInterval(this.timer);\n",
" this.timer = null;\n",
" }\n",
" }\n",
"\n",
" Animation.prototype.play_animation = function()\n",
" {\n",
" this.pause_animation();\n",
" this.direction = 1;\n",
" var t = this;\n",
" if (!this.timer) this.timer = setInterval(function() {\n",
" t.anim_step_forward();\n",
" }, this.interval);\n",
" }\n",
"\n",
" Animation.prototype.reverse_animation = function()\n",
" {\n",
" this.pause_animation();\n",
" this.direction = -1;\n",
" var t = this;\n",
" if (!this.timer) this.timer = setInterval(function() {\n",
" t.anim_step_reverse();\n",
" }, this.interval);\n",
" }\n",
"</script>\n",
"\n",
"<style>\n",
".animation {\n",
" display: inline-block;\n",
" text-align: center;\n",
"}\n",
"input[type=range].anim-slider {\n",
" width: 374px;\n",
" margin-left: auto;\n",
" margin-right: auto;\n",
"}\n",
".anim-buttons {\n",
" margin: 8px 0px;\n",
"}\n",
".anim-buttons button {\n",
" padding: 0;\n",
" width: 36px;\n",
"}\n",
".anim-state label {\n",
" margin-right: 8px;\n",
"}\n",
".anim-state input {\n",
" margin: 0;\n",
" vertical-align: middle;\n",
"}\n",
"</style>\n",
"\n",
"<div class=\"animation\">\n",
" <img id=\"_anim_imgb009e807ff7f4da6bfedc9c8e64865bd\">\n",
" <div class=\"anim-controls\">\n",
" <input id=\"_anim_sliderb009e807ff7f4da6bfedc9c8e64865bd\" type=\"range\" class=\"anim-slider\"\n",
" name=\"points\" min=\"0\" max=\"1\" step=\"1\" value=\"0\"\n",
" oninput=\"animb009e807ff7f4da6bfedc9c8e64865bd.set_frame(parseInt(this.value));\"></input>\n",
" <div class=\"anim-buttons\">\n",
" <button onclick=\"animb009e807ff7f4da6bfedc9c8e64865bd.slower()\"><i class=\"fa fa-minus\"></i></button>\n",
" <button onclick=\"animb009e807ff7f4da6bfedc9c8e64865bd.first_frame()\"><i class=\"fa fa-fast-backward\">\n",
" </i></button>\n",
" <button onclick=\"animb009e807ff7f4da6bfedc9c8e64865bd.previous_frame()\">\n",
" <i class=\"fa fa-step-backward\"></i></button>\n",
" <button onclick=\"animb009e807ff7f4da6bfedc9c8e64865bd.reverse_animation()\">\n",
" <i class=\"fa fa-play fa-flip-horizontal\"></i></button>\n",
" <button onclick=\"animb009e807ff7f4da6bfedc9c8e64865bd.pause_animation()\"><i class=\"fa fa-pause\">\n",
" </i></button>\n",
" <button onclick=\"animb009e807ff7f4da6bfedc9c8e64865bd.play_animation()\"><i class=\"fa fa-play\"></i>\n",
" </button>\n",
" <button onclick=\"animb009e807ff7f4da6bfedc9c8e64865bd.next_frame()\"><i class=\"fa fa-step-forward\">\n",
" </i></button>\n",
" <button onclick=\"animb009e807ff7f4da6bfedc9c8e64865bd.last_frame()\"><i class=\"fa fa-fast-forward\">\n",
" </i></button>\n",
" <button onclick=\"animb009e807ff7f4da6bfedc9c8e64865bd.faster()\"><i class=\"fa fa-plus\"></i></button>\n",
" </div>\n",
" <form action=\"#n\" name=\"_anim_loop_selectb009e807ff7f4da6bfedc9c8e64865bd\" class=\"anim-state\">\n",
" <input type=\"radio\" name=\"state\" value=\"once\" id=\"_anim_radio1_b009e807ff7f4da6bfedc9c8e64865bd\"\n",
" >\n",
" <label for=\"_anim_radio1_b009e807ff7f4da6bfedc9c8e64865bd\">Once</label>\n",
" <input type=\"radio\" name=\"state\" value=\"loop\" id=\"_anim_radio2_b009e807ff7f4da6bfedc9c8e64865bd\"\n",
" checked>\n",
" <label for=\"_anim_radio2_b009e807ff7f4da6bfedc9c8e64865bd\">Loop</label>\n",
" <input type=\"radio\" name=\"state\" value=\"reflect\" id=\"_anim_radio3_b009e807ff7f4da6bfedc9c8e64865bd\"\n",
" >\n",
" <label for=\"_anim_radio3_b009e807ff7f4da6bfedc9c8e64865bd\">Reflect</label>\n",
" </form>\n",
" </div>\n",
"</div>\n",
"\n",
"\n",
"<script language=\"javascript\">\n",
" /* Instantiate the Animation class. */\n",
" /* The IDs given should match those used in the template above. */\n",
" (function() {\n",
" var img_id = \"_anim_imgb009e807ff7f4da6bfedc9c8e64865bd\";\n",
" var slider_id = \"_anim_sliderb009e807ff7f4da6bfedc9c8e64865bd\";\n",
" var loop_select_id = \"_anim_loop_selectb009e807ff7f4da6bfedc9c8e64865bd\";\n",
" var frames = new Array(1);\n",
" \n",
" frames[0] = \"data:image/png;base64,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\\\n",
"IYQQVun/AUrgnKx9Gj5qAAAAAElFTkSuQmCC\\\n",
"\"\n",
"\n",
"\n",
" /* set a timeout to make sure all the above elements are created before\n",
" the object is initialized. */\n",
" setTimeout(function() {\n",
" animb009e807ff7f4da6bfedc9c8e64865bd = new Animation(frames, img_id, slider_id, 20.0,\n",
" loop_select_id);\n",
" }, 0);\n",
" })()\n",
"</script>\n"
],
"text/plain": [
"<matplotlib.animation.FuncAnimation at 0x7ff8300d7bd0>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#@title\n",
"def animate_AB_line(f, fp, f_str, x_A, axis=None):\n",
" y_A = f(x_A)\n",
" eps = 1e-4\n",
" x_B_range = 1.5\n",
" x_B = x_A + eps\n",
"\n",
" n_frames = 200\n",
" text_offset_A = -0.2\n",
" text_offset_B = +0.1\n",
" x_min, x_max = -1000, 1000\n",
"\n",
" fig, ax = plt.subplots()\n",
"\n",
" # plot f(x)\n",
" xs = np.linspace(-2.1, 2.1, 500)\n",
" ys = f(xs)\n",
" ax.plot(xs, ys)\n",
"\n",
" # plot the tangent to the curve at point A\n",
" if fp:\n",
" slope = fp(x_A)\n",
" offset = y_A - slope * x_A\n",
" ax.plot([x_min, x_max], [slope*x_min + offset, slope*x_max + offset],\n",
" \"y--\")\n",
"\n",
" # plot the line AB and the labels A and B so they can be animated\n",
" y_A = f(x_A)\n",
" y_B = f(x_B)\n",
" xs, ys = get_AB_line([x_A, y_A], [x_B, y_B])\n",
" line_inf, = ax.plot(xs, ys, \"-\")\n",
" line_AB, = ax.plot([x_A, x_B], [y_A, y_B], \"bo-\")\n",
" ax.text(x_A + text_offset_A, y_A, \"A\", fontsize=14)\n",
" B_text = ax.text(x_B + text_offset_B, y_B, \"B\", fontsize=14)\n",
"\n",
" # plot the grid and axis labels\n",
2020-04-12 13:32:03 +02:00
" title = r\"Slope of the curve $y = {}$ at $x_\\mathrm{{A}} = {}$\".format(f_str, x_A)\n",
" show(axis or [-2.1, 2.1, 0, 2.8], title=title)\n",
"\n",
" def update_graph(i):\n",
" x_B = x_A + x_B_range * np.cos(i * 2 * np.pi / n_frames) ** 3\n",
" if np.abs(x_B - x_A) < eps:\n",
" x_B = x_A + eps # to avoid division by 0\n",
" y_B = f(x_B)\n",
" xs, ys = get_AB_line([x_A, y_A], [x_B, y_B])\n",
" line_inf.set_data(xs, ys)\n",
" line_AB.set_data([x_A, x_B], [y_A, y_B])\n",
" B_text.set_position([x_B + text_offset_B, y_B])\n",
" return line_inf, line_AB\n",
"\n",
" anim = animation.FuncAnimation(fig, update_graph,\n",
" init_func=lambda: update_graph(0),\n",
" frames=n_frames,\n",
" interval=20,\n",
" blit=True)\n",
" plt.close()\n",
" return anim\n",
"\n",
"animate_AB_line(lambda x: x**2, lambda x: 2*x, \"x^2\", -1)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "GAV2or0qutJX"
},
"source": [
2020-04-12 13:32:03 +02:00
"As you can see, when point $\\mathrm{B}$ is very close to point $\\mathrm{A}$, the $(\\mathrm{AB})$ line becomes almost indistinguishable from the curve itself (at least locally around point $\\mathrm{A}$). The $(\\mathrm{AB})$ line gets closer and closer to the **tangent** line to the curve at point $\\mathrm{A}$: this is the best linear approximation of the curve at point $\\mathrm{A}$.\n",
"\n",
2020-04-12 13:32:03 +02:00
"So it makes sense to define the slope of the curve at point $\\mathrm{A}$ as the slope that the $\\mathrm{(AB)}$ line approaches when $\\mathrm{B}$ gets infinitely close to $\\mathrm{A}$. This slope is called the **derivative** of the function $f$ at $x=x_\\mathrm{A}$. For example, the derivative of the function $f(x)=x^2$ at $x=x_\\mathrm{A}$ is equal to $2x_\\mathrm{A}$ (we will see how to get this result shortly), so on the graph above, since the point $\\mathrm{A}$ is located at $x_\\mathrm{A}=-1$, the tangent line to the curve at that point has a slope of $-2$."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "fKEdGL20JM-l"
},
"source": [
"# Differentiability\n",
"\n",
"Note that some functions are not quite as well-behaved as $x^2$: for example, consider the function $f(x)=|x|$, the absolute value of $x$:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"cellView": "form",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 382
},
"colab_type": "code",
"id": "V_K6JrBhF11E",
"outputId": "f50cca79-4c04-46e1-cb70-bad878b33da4"
},
2022-02-19 10:24:54 +01:00
"outputs": [
{
"data": {
"text/html": [
"\n",
"<link rel=\"stylesheet\"\n",
"href=\"https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/\n",
"css/font-awesome.min.css\">\n",
"<script language=\"javascript\">\n",
" function isInternetExplorer() {\n",
" ua = navigator.userAgent;\n",
" /* MSIE used to detect old browsers and Trident used to newer ones*/\n",
" return ua.indexOf(\"MSIE \") > -1 || ua.indexOf(\"Trident/\") > -1;\n",
" }\n",
"\n",
" /* Define the Animation class */\n",
" function Animation(frames, img_id, slider_id, interval, loop_select_id){\n",
" this.img_id = img_id;\n",
" this.slider_id = slider_id;\n",
" this.loop_select_id = loop_select_id;\n",
" this.interval = interval;\n",
" this.current_frame = 0;\n",
" this.direction = 0;\n",
" this.timer = null;\n",
" this.frames = new Array(frames.length);\n",
"\n",
" for (var i=0; i<frames.length; i++)\n",
" {\n",
" this.frames[i] = new Image();\n",
" this.frames[i].src = frames[i];\n",
" }\n",
" var slider = document.getElementById(this.slider_id);\n",
" slider.max = this.frames.length - 1;\n",
" if (isInternetExplorer()) {\n",
" // switch from oninput to onchange because IE <= 11 does not conform\n",
" // with W3C specification. It ignores oninput and onchange behaves\n",
" // like oninput. In contrast, Mircosoft Edge behaves correctly.\n",
" slider.setAttribute('onchange', slider.getAttribute('oninput'));\n",
" slider.setAttribute('oninput', null);\n",
" }\n",
" this.set_frame(this.current_frame);\n",
" }\n",
"\n",
" Animation.prototype.get_loop_state = function(){\n",
" var button_group = document[this.loop_select_id].state;\n",
" for (var i = 0; i < button_group.length; i++) {\n",
" var button = button_group[i];\n",
" if (button.checked) {\n",
" return button.value;\n",
" }\n",
" }\n",
" return undefined;\n",
" }\n",
"\n",
" Animation.prototype.set_frame = function(frame){\n",
" this.current_frame = frame;\n",
" document.getElementById(this.img_id).src =\n",
" this.frames[this.current_frame].src;\n",
" document.getElementById(this.slider_id).value = this.current_frame;\n",
" }\n",
"\n",
" Animation.prototype.next_frame = function()\n",
" {\n",
" this.set_frame(Math.min(this.frames.length - 1, this.current_frame + 1));\n",
" }\n",
"\n",
" Animation.prototype.previous_frame = function()\n",
" {\n",
" this.set_frame(Math.max(0, this.current_frame - 1));\n",
" }\n",
"\n",
" Animation.prototype.first_frame = function()\n",
" {\n",
" this.set_frame(0);\n",
" }\n",
"\n",
" Animation.prototype.last_frame = function()\n",
" {\n",
" this.set_frame(this.frames.length - 1);\n",
" }\n",
"\n",
" Animation.prototype.slower = function()\n",
" {\n",
" this.interval /= 0.7;\n",
" if(this.direction > 0){this.play_animation();}\n",
" else if(this.direction < 0){this.reverse_animation();}\n",
" }\n",
"\n",
" Animation.prototype.faster = function()\n",
" {\n",
" this.interval *= 0.7;\n",
" if(this.direction > 0){this.play_animation();}\n",
" else if(this.direction < 0){this.reverse_animation();}\n",
" }\n",
"\n",
" Animation.prototype.anim_step_forward = function()\n",
" {\n",
" this.current_frame += 1;\n",
" if(this.current_frame < this.frames.length){\n",
" this.set_frame(this.current_frame);\n",
" }else{\n",
" var loop_state = this.get_loop_state();\n",
" if(loop_state == \"loop\"){\n",
" this.first_frame();\n",
" }else if(loop_state == \"reflect\"){\n",
" this.last_frame();\n",
" this.reverse_animation();\n",
" }else{\n",
" this.pause_animation();\n",
" this.last_frame();\n",
" }\n",
" }\n",
" }\n",
"\n",
" Animation.prototype.anim_step_reverse = function()\n",
" {\n",
" this.current_frame -= 1;\n",
" if(this.current_frame >= 0){\n",
" this.set_frame(this.current_frame);\n",
" }else{\n",
" var loop_state = this.get_loop_state();\n",
" if(loop_state == \"loop\"){\n",
" this.last_frame();\n",
" }else if(loop_state == \"reflect\"){\n",
" this.first_frame();\n",
" this.play_animation();\n",
" }else{\n",
" this.pause_animation();\n",
" this.first_frame();\n",
" }\n",
" }\n",
" }\n",
"\n",
" Animation.prototype.pause_animation = function()\n",
" {\n",
" this.direction = 0;\n",
" if (this.timer){\n",
" clearInterval(this.timer);\n",
" this.timer = null;\n",
" }\n",
" }\n",
"\n",
" Animation.prototype.play_animation = function()\n",
" {\n",
" this.pause_animation();\n",
" this.direction = 1;\n",
" var t = this;\n",
" if (!this.timer) this.timer = setInterval(function() {\n",
" t.anim_step_forward();\n",
" }, this.interval);\n",
" }\n",
"\n",
" Animation.prototype.reverse_animation = function()\n",
" {\n",
" this.pause_animation();\n",
" this.direction = -1;\n",
" var t = this;\n",
" if (!this.timer) this.timer = setInterval(function() {\n",
" t.anim_step_reverse();\n",
" }, this.interval);\n",
" }\n",
"</script>\n",
"\n",
"<style>\n",
".animation {\n",
" display: inline-block;\n",
" text-align: center;\n",
"}\n",
"input[type=range].anim-slider {\n",
" width: 374px;\n",
" margin-left: auto;\n",
" margin-right: auto;\n",
"}\n",
".anim-buttons {\n",
" margin: 8px 0px;\n",
"}\n",
".anim-buttons button {\n",
" padding: 0;\n",
" width: 36px;\n",
"}\n",
".anim-state label {\n",
" margin-right: 8px;\n",
"}\n",
".anim-state input {\n",
" margin: 0;\n",
" vertical-align: middle;\n",
"}\n",
"</style>\n",
"\n",
"<div class=\"animation\">\n",
" <img id=\"_anim_img5ca2016451b14f3d80e7bc061349915a\">\n",
" <div class=\"anim-controls\">\n",
" <input id=\"_anim_slider5ca2016451b14f3d80e7bc061349915a\" type=\"range\" class=\"anim-slider\"\n",
" name=\"points\" min=\"0\" max=\"1\" step=\"1\" value=\"0\"\n",
" oninput=\"anim5ca2016451b14f3d80e7bc061349915a.set_frame(parseInt(this.value));\"></input>\n",
" <div class=\"anim-buttons\">\n",
" <button onclick=\"anim5ca2016451b14f3d80e7bc061349915a.slower()\"><i class=\"fa fa-minus\"></i></button>\n",
" <button onclick=\"anim5ca2016451b14f3d80e7bc061349915a.first_frame()\"><i class=\"fa fa-fast-backward\">\n",
" </i></button>\n",
" <button onclick=\"anim5ca2016451b14f3d80e7bc061349915a.previous_frame()\">\n",
" <i class=\"fa fa-step-backward\"></i></button>\n",
" <button onclick=\"anim5ca2016451b14f3d80e7bc061349915a.reverse_animation()\">\n",
" <i class=\"fa fa-play fa-flip-horizontal\"></i></button>\n",
" <button onclick=\"anim5ca2016451b14f3d80e7bc061349915a.pause_animation()\"><i class=\"fa fa-pause\">\n",
" </i></button>\n",
" <button onclick=\"anim5ca2016451b14f3d80e7bc061349915a.play_animation()\"><i class=\"fa fa-play\"></i>\n",
" </button>\n",
" <button onclick=\"anim5ca2016451b14f3d80e7bc061349915a.next_frame()\"><i class=\"fa fa-step-forward\">\n",
" </i></button>\n",
" <button onclick=\"anim5ca2016451b14f3d80e7bc061349915a.last_frame()\"><i class=\"fa fa-fast-forward\">\n",
" </i></button>\n",
" <button onclick=\"anim5ca2016451b14f3d80e7bc061349915a.faster()\"><i class=\"fa fa-plus\"></i></button>\n",
" </div>\n",
" <form action=\"#n\" name=\"_anim_loop_select5ca2016451b14f3d80e7bc061349915a\" class=\"anim-state\">\n",
" <input type=\"radio\" name=\"state\" value=\"once\" id=\"_anim_radio1_5ca2016451b14f3d80e7bc061349915a\"\n",
" >\n",
" <label for=\"_anim_radio1_5ca2016451b14f3d80e7bc061349915a\">Once</label>\n",
" <input type=\"radio\" name=\"state\" value=\"loop\" id=\"_anim_radio2_5ca2016451b14f3d80e7bc061349915a\"\n",
" checked>\n",
" <label for=\"_anim_radio2_5ca2016451b14f3d80e7bc061349915a\">Loop</label>\n",
" <input type=\"radio\" name=\"state\" value=\"reflect\" id=\"_anim_radio3_5ca2016451b14f3d80e7bc061349915a\"\n",
" >\n",
" <label for=\"_anim_radio3_5ca2016451b14f3d80e7bc061349915a\">Reflect</label>\n",
" </form>\n",
" </div>\n",
"</div>\n",
"\n",
"\n",
"<script language=\"javascript\">\n",
" /* Instantiate the Animation class. */\n",
" /* The IDs given should match those used in the template above. */\n",
" (function() {\n",
" var img_id = \"_anim_img5ca2016451b14f3d80e7bc061349915a\";\n",
" var slider_id = \"_anim_slider5ca2016451b14f3d80e7bc061349915a\";\n",
" var loop_select_id = \"_anim_loop_select5ca2016451b14f3d80e7bc061349915a\";\n",
" var frames = new Array(1);\n",
" \n",
" frames[0] = \"data:image/png;base64,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\\\n",
"\"\n",
"\n",
"\n",
" /* set a timeout to make sure all the above elements are created before\n",
" the object is initialized. */\n",
" setTimeout(function() {\n",
" anim5ca2016451b14f3d80e7bc061349915a = new Animation(frames, img_id, slider_id, 20.0,\n",
" loop_select_id);\n",
" }, 0);\n",
" })()\n",
"</script>\n"
],
"text/plain": [
"<matplotlib.animation.FuncAnimation at 0x7ff820137190>"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#@title\n",
"animate_AB_line(lambda x: np.abs(x), None, \"|x|\", 0)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "l9dTigohF0BM"
},
"source": [
2020-04-12 13:32:03 +02:00
"No matter how much you zoom in on the origin (the point at $x=0, y=0$), the curve will always look like a V. The slope is -1 for any $x < 0$, and it is +1 for any $x > 0$, but **at $x = 0$, the slope is undefined**, since it is not possible to approximate the curve $y=|x|$ locally around the origin using a straight line, no matter how much you zoom in on that point.\n",
"\n",
2020-04-12 13:32:03 +02:00
"The function $f(x)=|x|$ is said to be **non-differentiable** at $x=0$: its derivative is undefined at $x=0$. This means that the curve $y=|x|$ has an undefined slope at that point. However, the function $f(x)=|x|$ is **differentiable** at all other points.\n",
"\n",
2020-04-12 13:32:03 +02:00
"In order for a function $f(x)$ to be differentiable at some point $x_\\mathrm{A}$, the slope of the $(\\mathrm{AB})$ line must approach a single finite value as $\\mathrm{B}$ gets infinitely close to $\\mathrm{A}$.\n",
"\n",
"This implies several constraints:\n",
"\n",
2020-04-12 13:32:03 +02:00
"* First, the function must of course be **defined** at $x_\\mathrm{A}$. As a counterexample, the function $f(x)=\\dfrac{1}{x}$ is undefined at $x_\\mathrm{A}=0$, so it is not differentiable at that point.\n",
"* The function must also be **continuous** at $x_\\mathrm{A}$, meaning that as $x_\\mathrm{B}$ gets infinitely close to $x_\\mathrm{A}$, $f(x_\\mathrm{B})$ must also get infinitely close to $f(x_\\mathrm{A})$. As a counterexample, $f(x)=\\begin{cases}-1 \\text{ if }x < 0\\\\+1 \\text{ if }x \\geq 0\\end{cases}$ is not continuous at $x_\\mathrm{A}=0$, even though it is defined at that point: indeed, when you approach it from the negative side, it does not approach infinitely close to $f(0)=+1$. Therefore, it is not continuous at that point, and thus not differentiable either.\n",
"* The function must not have a **breaking point** at $x_\\mathrm{A}$, meaning that the slope that the $(\\mathrm{AB})$ line approaches as $\\mathrm{B}$ approaches $\\mathrm{A}$ must be the same whether $\\mathrm{B}$ approaches from the left side or from the right side. We already saw a counterexample with $f(x)=|x|$, which is both defined and continuous at $x_\\mathrm{A}=0$, but which has a breaking point at $x_\\mathrm{A}=0$: the slope of the curve $y=|x|$ is -1 on the left, and +1 on the right.\n",
"* The curve $y=f(x)$ must not be **vertical** at point $\\mathrm{A}$. One counterexample is $f(x)=\\sqrt[3]{x}$, the cubic root of $x$: the curve is vertical at the origin, so the function is not differentiable at $x_\\mathrm{A}=0$, as you can see in the following animation:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"cellView": "form",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 382
},
"colab_type": "code",
"id": "W_hMdqOHUCmt",
"outputId": "6ade4050-7f96-45a3-fe54-23399e821b2b"
},
2022-02-19 10:24:54 +01:00
"outputs": [
{
"data": {
"text/html": [
"\n",
"<link rel=\"stylesheet\"\n",
"href=\"https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/\n",
"css/font-awesome.min.css\">\n",
"<script language=\"javascript\">\n",
" function isInternetExplorer() {\n",
" ua = navigator.userAgent;\n",
" /* MSIE used to detect old browsers and Trident used to newer ones*/\n",
" return ua.indexOf(\"MSIE \") > -1 || ua.indexOf(\"Trident/\") > -1;\n",
" }\n",
"\n",
" /* Define the Animation class */\n",
" function Animation(frames, img_id, slider_id, interval, loop_select_id){\n",
" this.img_id = img_id;\n",
" this.slider_id = slider_id;\n",
" this.loop_select_id = loop_select_id;\n",
" this.interval = interval;\n",
" this.current_frame = 0;\n",
" this.direction = 0;\n",
" this.timer = null;\n",
" this.frames = new Array(frames.length);\n",
"\n",
" for (var i=0; i<frames.length; i++)\n",
" {\n",
" this.frames[i] = new Image();\n",
" this.frames[i].src = frames[i];\n",
" }\n",
" var slider = document.getElementById(this.slider_id);\n",
" slider.max = this.frames.length - 1;\n",
" if (isInternetExplorer()) {\n",
" // switch from oninput to onchange because IE <= 11 does not conform\n",
" // with W3C specification. It ignores oninput and onchange behaves\n",
" // like oninput. In contrast, Mircosoft Edge behaves correctly.\n",
" slider.setAttribute('onchange', slider.getAttribute('oninput'));\n",
" slider.setAttribute('oninput', null);\n",
" }\n",
" this.set_frame(this.current_frame);\n",
" }\n",
"\n",
" Animation.prototype.get_loop_state = function(){\n",
" var button_group = document[this.loop_select_id].state;\n",
" for (var i = 0; i < button_group.length; i++) {\n",
" var button = button_group[i];\n",
" if (button.checked) {\n",
" return button.value;\n",
" }\n",
" }\n",
" return undefined;\n",
" }\n",
"\n",
" Animation.prototype.set_frame = function(frame){\n",
" this.current_frame = frame;\n",
" document.getElementById(this.img_id).src =\n",
" this.frames[this.current_frame].src;\n",
" document.getElementById(this.slider_id).value = this.current_frame;\n",
" }\n",
"\n",
" Animation.prototype.next_frame = function()\n",
" {\n",
" this.set_frame(Math.min(this.frames.length - 1, this.current_frame + 1));\n",
" }\n",
"\n",
" Animation.prototype.previous_frame = function()\n",
" {\n",
" this.set_frame(Math.max(0, this.current_frame - 1));\n",
" }\n",
"\n",
" Animation.prototype.first_frame = function()\n",
" {\n",
" this.set_frame(0);\n",
" }\n",
"\n",
" Animation.prototype.last_frame = function()\n",
" {\n",
" this.set_frame(this.frames.length - 1);\n",
" }\n",
"\n",
" Animation.prototype.slower = function()\n",
" {\n",
" this.interval /= 0.7;\n",
" if(this.direction > 0){this.play_animation();}\n",
" else if(this.direction < 0){this.reverse_animation();}\n",
" }\n",
"\n",
" Animation.prototype.faster = function()\n",
" {\n",
" this.interval *= 0.7;\n",
" if(this.direction > 0){this.play_animation();}\n",
" else if(this.direction < 0){this.reverse_animation();}\n",
" }\n",
"\n",
" Animation.prototype.anim_step_forward = function()\n",
" {\n",
" this.current_frame += 1;\n",
" if(this.current_frame < this.frames.length){\n",
" this.set_frame(this.current_frame);\n",
" }else{\n",
" var loop_state = this.get_loop_state();\n",
" if(loop_state == \"loop\"){\n",
" this.first_frame();\n",
" }else if(loop_state == \"reflect\"){\n",
" this.last_frame();\n",
" this.reverse_animation();\n",
" }else{\n",
" this.pause_animation();\n",
" this.last_frame();\n",
" }\n",
" }\n",
" }\n",
"\n",
" Animation.prototype.anim_step_reverse = function()\n",
" {\n",
" this.current_frame -= 1;\n",
" if(this.current_frame >= 0){\n",
" this.set_frame(this.current_frame);\n",
" }else{\n",
" var loop_state = this.get_loop_state();\n",
" if(loop_state == \"loop\"){\n",
" this.last_frame();\n",
" }else if(loop_state == \"reflect\"){\n",
" this.first_frame();\n",
" this.play_animation();\n",
" }else{\n",
" this.pause_animation();\n",
" this.first_frame();\n",
" }\n",
" }\n",
" }\n",
"\n",
" Animation.prototype.pause_animation = function()\n",
" {\n",
" this.direction = 0;\n",
" if (this.timer){\n",
" clearInterval(this.timer);\n",
" this.timer = null;\n",
" }\n",
" }\n",
"\n",
" Animation.prototype.play_animation = function()\n",
" {\n",
" this.pause_animation();\n",
" this.direction = 1;\n",
" var t = this;\n",
" if (!this.timer) this.timer = setInterval(function() {\n",
" t.anim_step_forward();\n",
" }, this.interval);\n",
" }\n",
"\n",
" Animation.prototype.reverse_animation = function()\n",
" {\n",
" this.pause_animation();\n",
" this.direction = -1;\n",
" var t = this;\n",
" if (!this.timer) this.timer = setInterval(function() {\n",
" t.anim_step_reverse();\n",
" }, this.interval);\n",
" }\n",
"</script>\n",
"\n",
"<style>\n",
".animation {\n",
" display: inline-block;\n",
" text-align: center;\n",
"}\n",
"input[type=range].anim-slider {\n",
" width: 374px;\n",
" margin-left: auto;\n",
" margin-right: auto;\n",
"}\n",
".anim-buttons {\n",
" margin: 8px 0px;\n",
"}\n",
".anim-buttons button {\n",
" padding: 0;\n",
" width: 36px;\n",
"}\n",
".anim-state label {\n",
" margin-right: 8px;\n",
"}\n",
".anim-state input {\n",
" margin: 0;\n",
" vertical-align: middle;\n",
"}\n",
"</style>\n",
"\n",
"<div class=\"animation\">\n",
" <img id=\"_anim_imgea3d9a997ba2429fbd1b76f5e6f09474\">\n",
" <div class=\"anim-controls\">\n",
" <input id=\"_anim_sliderea3d9a997ba2429fbd1b76f5e6f09474\" type=\"range\" class=\"anim-slider\"\n",
" name=\"points\" min=\"0\" max=\"1\" step=\"1\" value=\"0\"\n",
" oninput=\"animea3d9a997ba2429fbd1b76f5e6f09474.set_frame(parseInt(this.value));\"></input>\n",
" <div class=\"anim-buttons\">\n",
" <button onclick=\"animea3d9a997ba2429fbd1b76f5e6f09474.slower()\"><i class=\"fa fa-minus\"></i></button>\n",
" <button onclick=\"animea3d9a997ba2429fbd1b76f5e6f09474.first_frame()\"><i class=\"fa fa-fast-backward\">\n",
" </i></button>\n",
" <button onclick=\"animea3d9a997ba2429fbd1b76f5e6f09474.previous_frame()\">\n",
" <i class=\"fa fa-step-backward\"></i></button>\n",
" <button onclick=\"animea3d9a997ba2429fbd1b76f5e6f09474.reverse_animation()\">\n",
" <i class=\"fa fa-play fa-flip-horizontal\"></i></button>\n",
" <button onclick=\"animea3d9a997ba2429fbd1b76f5e6f09474.pause_animation()\"><i class=\"fa fa-pause\">\n",
" </i></button>\n",
" <button onclick=\"animea3d9a997ba2429fbd1b76f5e6f09474.play_animation()\"><i class=\"fa fa-play\"></i>\n",
" </button>\n",
" <button onclick=\"animea3d9a997ba2429fbd1b76f5e6f09474.next_frame()\"><i class=\"fa fa-step-forward\">\n",
" </i></button>\n",
" <button onclick=\"animea3d9a997ba2429fbd1b76f5e6f09474.last_frame()\"><i class=\"fa fa-fast-forward\">\n",
" </i></button>\n",
" <button onclick=\"animea3d9a997ba2429fbd1b76f5e6f09474.faster()\"><i class=\"fa fa-plus\"></i></button>\n",
" </div>\n",
" <form action=\"#n\" name=\"_anim_loop_selectea3d9a997ba2429fbd1b76f5e6f09474\" class=\"anim-state\">\n",
" <input type=\"radio\" name=\"state\" value=\"once\" id=\"_anim_radio1_ea3d9a997ba2429fbd1b76f5e6f09474\"\n",
" >\n",
" <label for=\"_anim_radio1_ea3d9a997ba2429fbd1b76f5e6f09474\">Once</label>\n",
" <input type=\"radio\" name=\"state\" value=\"loop\" id=\"_anim_radio2_ea3d9a997ba2429fbd1b76f5e6f09474\"\n",
" checked>\n",
" <label for=\"_anim_radio2_ea3d9a997ba2429fbd1b76f5e6f09474\">Loop</label>\n",
" <input type=\"radio\" name=\"state\" value=\"reflect\" id=\"_anim_radio3_ea3d9a997ba2429fbd1b76f5e6f09474\"\n",
" >\n",
" <label for=\"_anim_radio3_ea3d9a997ba2429fbd1b76f5e6f09474\">Reflect</label>\n",
" </form>\n",
" </div>\n",
"</div>\n",
"\n",
"\n",
"<script language=\"javascript\">\n",
" /* Instantiate the Animation class. */\n",
" /* The IDs given should match those used in the template above. */\n",
" (function() {\n",
" var img_id = \"_anim_imgea3d9a997ba2429fbd1b76f5e6f09474\";\n",
" var slider_id = \"_anim_sliderea3d9a997ba2429fbd1b76f5e6f09474\";\n",
" var loop_select_id = \"_anim_loop_selectea3d9a997ba2429fbd1b76f5e6f09474\";\n",
" var frames = new Array(1);\n",
" \n",
" frames[0] = \"data:image/png;base64,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\\\n",
"GW+88UaxBVaa5WVtbU1oaCjbt28vVPTbt29n4MCB980uyo8UmIlJT0/nmWeeYeTIkQQHB+Po6Mjh\\\n",
"w4f517/+Rffu3XFycio0vkaNGowbN47p06fj7u5O/fr1+fe//83Vq1cZP358obGJiYm8+uqrjB8/\\\n",
"npMnTzJ37lzefvttABwdHZk6dSpTp05FKUWXLl24efMmBw4cwNzcnNGjR9+T9WHmfT9+fn4cPHiQ\\\n",
"2NhYHBwcHmizTmkyOzo6MnnyZN58801sbGzo0qUL6enpHDlypOCP3KOPPsqrr77KunXraNy4Md99\\\n",
"9x1xcXH3LTDI34zYo0cPYmJieOGFFzA3/8+ZKqXJe1f79u35/PPP6dmzZ4knsZdlk1j37t2xs7PD\\\n",
"w8PjnrXLuy5fvkyfPn2YMmUKI0eOpG3btgQHBxMeHk7Xrl2LfW1XV1fc3d35/vvv8fHxISEhgWnT\\\n",
"pmFpWfhPUFGfg/9ehg+aYdWqVfTv35+2bduSmJhIYmIinp6e9+Qq7fKaMmUKL730Em3btqVjx458\\\n",
"++23JCYmMnbs2Id+LVEGGu17E8XIyspSb775pmrdurVycXFRdnZ2KiAgQL322msqPT1dKVXyYfTW\\\n",
"1tYlHkY/YcIE5ezsrFxcXNSUKVMKHeVlMBjUF198oZo2baqsra2Vu7u76tGjh9q2bVuJeUua94Me\\\n",
"xHHu3DnVrl07ZWdnV+gw+vsdTFGazHq9Xs2ZM0fVr19fWVlZKW9vbzVjxoyC6Tk5OWr8+PHKzc1N\\\n",
"ubm5qXfeeafIgziKOtjAYDCoevXqKUCdOHGiyOkPm1cppRYuXKgsLCzUqVOnShxXVlOnTlV//vln\\\n",
"kdPS09NVkyZN1OjRows9/uyzz95zsE1RduzYoYKCgpSNjY0KCgpSW7ZsUTVq1FALFiwoGFPU56A0\\\n",
"Gbp3767279+vlFLqzTffVJ9//vl98z2sefPmqXr16ilra2vVqlWrew7qEBXPTCm53kt10LVrV5o1\\\n",
"a8ZXX32ldRRRCr169aJhw4bMmzdP6ygmLyUlBV9fX+rWrQv85yCZvXv3apxMlDe5EocQJspgMHD1\\\n",
"6lU+/vhjTp48yT//+U+tI1UKK1euZMyYMcTGxhIbG0tCQgKpqalylYwqSApMCBO1a9cuPDw8WLhw\\\n",
"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\\\n",
"lDjAiIjIlH4BXpOt+i9OH4gAAAAASUVORK5CYII=\\\n",
"\"\n",
"\n",
"\n",
" /* set a timeout to make sure all the above elements are created before\n",
" the object is initialized. */\n",
" setTimeout(function() {\n",
" animea3d9a997ba2429fbd1b76f5e6f09474 = new Animation(frames, img_id, slider_id, 20.0,\n",
" loop_select_id);\n",
" }, 0);\n",
" })()\n",
"</script>\n"
],
"text/plain": [
"<matplotlib.animation.FuncAnimation at 0x7ff860115a10>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#@title\n",
"animate_AB_line(lambda x: np.cbrt(x), None, r\"\\sqrt[3]{x}\", 0,\n",
" axis=[-2.1, 2.1, -1.4, 1.4])"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "XM4SCdrL5vje"
},
"source": [
"Now let's see how to actually differentiate a function (i.e., find its derivative)."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "9ElT95A6ZDTi"
},
"source": [
"# Differentiating a function"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "8cTI3LmRZBKE"
},
"source": [
"The previous discussion leads to the following definition:"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "mACDlgXT63eo"
},
"source": [
"<hr />\n",
"\n",
2020-04-12 13:32:03 +02:00
"The **derivative** of a function $f(x)$ at $x = x_\\mathrm{A}$ is noted $f'(x_\\mathrm{A})$, and it is defined as:\n",
"\n",
"$f'(x_\\mathrm{A}) = \\underset{x_\\mathrm{B} \\to x_\\mathrm{A}}\\lim\\dfrac{f(x_\\mathrm{B}) - f(x_\\mathrm{A})}{x_\\mathrm{B} - x_\\mathrm{A}}$\n",
"\n",
"<hr />"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "TkID_gVd2g7x"
},
"source": [
"Don't be scared, this is simpler than it looks! You may recognize the _rise over run_ equation $\\dfrac{y_\\mathrm{B} - y_\\mathrm{A}}{x_\\mathrm{B} - x_\\mathrm{A}}$ that we discussed earlier. That's just the slope of the $\\mathrm{(AB)}$ line. And the notation $\\underset{x_\\mathrm{B} \\to x_\\mathrm{A}}\\lim$ means that we are making $x_\\mathrm{B}$ approach infinitely close to $x_\\mathrm{A}$. So in plain English, $f'(x_\\mathrm{A})$ is the value that the slope of the $\\mathrm{(AB)}$ line approaches when $\\mathrm{B}$ gets infinitely close to $\\mathrm{A}$. This is just a formal way of saying exactly the same thing as earlier."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "5TAe9ANZXoDK"
},
"source": [
"## Example: finding the derivative of $x^2$"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "1Hab-C8p8GPw"
},
"source": [
2020-04-12 13:32:03 +02:00
"Let's look at a concrete example. Let's see if we can determine what the slope of the $y=x^2$ curve is, at any point $\\mathrm{A}$ (try to understand each line, I promise it's not that hard):\n",
"\n",
"$\n",
"\\begin{align*}\n",
"f'(x_\\mathrm{A}) \\, & = \\underset{x_\\mathrm{B} \\to x_\\mathrm{A}}\\lim\\dfrac{f(x_\\mathrm{B}) - f(x_\\mathrm{A})}{x_\\mathrm{B} - x_\\mathrm{A}} \\\\\n",
"& = \\underset{x_\\mathrm{B} \\to x_\\mathrm{A}}\\lim\\dfrac{{x_\\mathrm{B}}^2 - {x_\\mathrm{A}}^2}{x_\\mathrm{B} - x_\\mathrm{A}} \\quad && \\text{since } f(x) = x^2\\\\\n",
"& = \\underset{x_\\mathrm{B} \\to x_\\mathrm{A}}\\lim\\dfrac{(x_\\mathrm{B} - x_\\mathrm{A})(x_\\mathrm{B} + x_\\mathrm{A})}{x_\\mathrm{B} - x_\\mathrm{A}}\\quad && \\text{since } {x_\\mathrm{A}}^2 - {x_\\mathrm{B}}^2 = (x_\\mathrm{A}-x_\\mathrm{B})(x_\\mathrm{A}+x_\\mathrm{B})\\\\\n",
"& = \\underset{x_\\mathrm{B} \\to x_\\mathrm{A}}\\lim(x_\\mathrm{B} + x_\\mathrm{A})\\quad && \\text{since the two } (x_\\mathrm{B} - x_\\mathrm{A}) \\text{ cancel out}\\\\\n",
"& = \\underset{x_\\mathrm{B} \\to x_\\mathrm{A}}\\lim x_\\mathrm{B} \\, + \\underset{x_\\mathrm{B} \\to x_\\mathrm{A}}\\lim x_\\mathrm{A}\\quad && \\text{since the limit of a sum is the sum of the limits}\\\\\n",
"& = x_\\mathrm{A} \\, + \\underset{x_\\mathrm{B} \\to x_\\mathrm{A}}\\lim x_\\mathrm{A} \\quad && \\text{since } x_\\mathrm{B}\\text{ approaches } x_\\mathrm{A} \\\\\n",
"& = x_\\mathrm{A} + x_\\mathrm{A} \\quad && \\text{since } x_\\mathrm{A} \\text{ remains constant when } x_\\mathrm{B}\\text{ approaches } x_\\mathrm{A} \\\\\n",
"& = 2 x_\\mathrm{A}\n",
"\\end{align*}\n",
"$\n",
"\n",
2020-04-12 13:32:03 +02:00
"That's it! We just proved that the slope of $y = x^2$ at any point $\\mathrm{A}$ is $f'(x_\\mathrm{A}) = 2x_\\mathrm{A}$. What we have done is called **differentiation**: finding the derivative of a function."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "IecILr3XK1Mn"
},
"source": [
"Note that we used a couple of important properties of limits. Here are the main properties you need to know to work with derivatives:\n",
"\n",
"* $\\underset{x \\to k}\\lim c = c \\quad$ if $c$ is some constant value that does not depend on $x$, then the limit is just $c$.\n",
"* $\\underset{x \\to k}\\lim x = k \\quad$ if $x$ approaches some value $k$, then the limit is $k$.\n",
"* $\\underset{x \\to k}\\lim\\,\\left[f(x) + g(x)\\right] = \\underset{x \\to k}\\lim f(x) + \\underset{x \\to k}\\lim g(x) \\quad$ the limit of a sum is the sum of the limits\n",
"* $\\underset{x \\to k}\\lim\\,\\left[f(x) \\times g(x)\\right] = \\underset{x \\to k}\\lim f(x) \\times \\underset{x \\to k}\\lim g(x) \\quad$ the limit of a product is the product of the limits\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "ebb31wJp72Zn"
},
"source": [
"**Important note:** in Deep Learning, differentiation is almost always performed automatically by the framework you are using (such as TensorFlow or PyTorch). This is called auto-diff, and I did [another notebook](https://github.com/ageron/handson-ml3/blob/main/extra_autodiff.ipynb) on that topic. However, you should still make sure you have a good understanding of derivatives, or else they will come and bite you one day, for example when you use a square root in your cost function without realizing that its derivative approaches infinity when $x$ approaches 0 (tip: you should use $\\sqrt{x+\\epsilon}$ instead, where $\\epsilon$ is some small constant, such as $10^{-4}$)."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "iUbStNR19xuJ"
},
"source": [
"You will often find a slightly different (but equivalent) definition of the derivative. Let's derive it from the previous definition. First, let's define $\\epsilon = x_\\mathrm{B} - x_\\mathrm{A}$. Next, note that $\\epsilon$ will approach 0 as $x_\\mathrm{B}$ approaches $x_\\mathrm{A}$. Lastly, note that $x_\\mathrm{B} = x_\\mathrm{A} + \\epsilon$. With that, we can reformulate the definition above like so:\n",
"\n",
"$f'(x_\\mathrm{A}) = \\underset{\\epsilon \\to 0}\\lim\\dfrac{f(x_\\mathrm{A} + \\epsilon) - f(x_\\mathrm{A})}{\\epsilon}$"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "CqvPHwZaHJAq"
},
"source": [
"While we're at it, let's just rename $x_\\mathrm{A}$ to $x$, to get rid of the annoying subscript A and make the equation simpler to read:\n",
"\n",
"<hr />\n",
"\n",
"$f'(x) = \\underset{\\epsilon \\to 0}\\lim\\dfrac{f(x + \\epsilon) - f(x)}{\\epsilon}$\n",
"\n",
"<hr />"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "SSGmiDApBEAX"
},
"source": [
"Okay! Now let's use this new definition to find the derivative of $f(x) = x^2$ at any point $x$, and (hopefully) we should find the same result as above (except using $x$ instead of $x_\\mathrm{A}$):\n",
"\n",
"$\n",
"\\begin{align*}\n",
"f'(x) \\, & = \\underset{\\epsilon \\to 0}\\lim\\dfrac{f(x + \\epsilon) - f(x)}{\\epsilon} \\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim\\dfrac{(x + \\epsilon)^2 - {x}^2}{\\epsilon} \\quad && \\text{since } f(x) = x^2\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim\\dfrac{{x}^2 + 2x\\epsilon + \\epsilon^2 - {x}^2}{\\epsilon}\\quad && \\text{since } (x + \\epsilon)^2 = {x}^2 + 2x\\epsilon + \\epsilon^2\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim\\dfrac{2x\\epsilon + \\epsilon^2}{\\epsilon}\\quad && \\text{since the two } {x}^2 \\text{ cancel out}\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim \\, (2x + \\epsilon)\\quad && \\text{since } 2x\\epsilon \\text{ and } \\epsilon^2 \\text{ can both be divided by } \\epsilon\\\\\n",
"& = 2 x\n",
"\\end{align*}\n",
"$\n",
"\n",
"Yep! It works out."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "tnzKmXysX5QF"
},
"source": [
"## Notations"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "Zu6u_8bw7ZUc"
},
"source": [
2020-11-20 00:48:32 +01:00
"A word about notations: there are several other notations for the derivative that you will find in the literature:\n",
"\n",
"$f'(x) = \\dfrac{\\mathrm{d}f(x)}{\\mathrm{d}x} = \\dfrac{\\mathrm{d}}{\\mathrm{d}x}f(x)$\n",
"\n",
2020-04-12 13:32:03 +02:00
"This notation is also handy when a function is not named. For example $\\dfrac{\\mathrm{d}}{\\mathrm{d}x}[x^2]$ refers to the derivative of the function $x \\mapsto x^2$.\n",
"\n",
"Moreover, when people talk about the function $f(x)$, they sometimes leave out \"$(x)$\", and they just talk about the function $f$. When this is the case, the notation of the derivative is also simpler:\n",
"\n",
"$f' = \\dfrac{\\mathrm{d}f}{\\mathrm{d}x} = \\dfrac{\\mathrm{d}}{\\mathrm{d}x}f$\n",
"\n",
"The $f'$ notation is Lagrange's notation, while $\\dfrac{\\mathrm{d}f}{\\mathrm{d}x}$ is Leibniz's notation.\n",
"\n",
"There are also other less common notations, such as Newton's notation $\\dot y$ (assuming $y = f(x)$) or Euler's notation $\\mathrm{D}f$."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "NIOYmhljX-ST"
},
"source": [
"## Plotting the tangent to a curve"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "hLxiC5r4Xk3N"
},
"source": [
2020-04-12 13:32:03 +02:00
"Let's use the equation $f'(x) = 2x$ to plot the tangent to the $y=x^2$ curve at various values of $x$ (you can click on the play button under the graphs to play the animation):"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"cellView": "form",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 670
},
"colab_type": "code",
"id": "ugfKA3shvvGo",
"outputId": "c1b303df-65b3-4b4e-fbf0-6c16087112b1"
},
2022-02-19 10:24:54 +01:00
"outputs": [
{
"data": {
"text/html": [
"\n",
"<link rel=\"stylesheet\"\n",
"href=\"https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/\n",
"css/font-awesome.min.css\">\n",
"<script language=\"javascript\">\n",
" function isInternetExplorer() {\n",
" ua = navigator.userAgent;\n",
" /* MSIE used to detect old browsers and Trident used to newer ones*/\n",
" return ua.indexOf(\"MSIE \") > -1 || ua.indexOf(\"Trident/\") > -1;\n",
" }\n",
"\n",
" /* Define the Animation class */\n",
" function Animation(frames, img_id, slider_id, interval, loop_select_id){\n",
" this.img_id = img_id;\n",
" this.slider_id = slider_id;\n",
" this.loop_select_id = loop_select_id;\n",
" this.interval = interval;\n",
" this.current_frame = 0;\n",
" this.direction = 0;\n",
" this.timer = null;\n",
" this.frames = new Array(frames.length);\n",
"\n",
" for (var i=0; i<frames.length; i++)\n",
" {\n",
" this.frames[i] = new Image();\n",
" this.frames[i].src = frames[i];\n",
" }\n",
" var slider = document.getElementById(this.slider_id);\n",
" slider.max = this.frames.length - 1;\n",
" if (isInternetExplorer()) {\n",
" // switch from oninput to onchange because IE <= 11 does not conform\n",
" // with W3C specification. It ignores oninput and onchange behaves\n",
" // like oninput. In contrast, Mircosoft Edge behaves correctly.\n",
" slider.setAttribute('onchange', slider.getAttribute('oninput'));\n",
" slider.setAttribute('oninput', null);\n",
" }\n",
" this.set_frame(this.current_frame);\n",
" }\n",
"\n",
" Animation.prototype.get_loop_state = function(){\n",
" var button_group = document[this.loop_select_id].state;\n",
" for (var i = 0; i < button_group.length; i++) {\n",
" var button = button_group[i];\n",
" if (button.checked) {\n",
" return button.value;\n",
" }\n",
" }\n",
" return undefined;\n",
" }\n",
"\n",
" Animation.prototype.set_frame = function(frame){\n",
" this.current_frame = frame;\n",
" document.getElementById(this.img_id).src =\n",
" this.frames[this.current_frame].src;\n",
" document.getElementById(this.slider_id).value = this.current_frame;\n",
" }\n",
"\n",
" Animation.prototype.next_frame = function()\n",
" {\n",
" this.set_frame(Math.min(this.frames.length - 1, this.current_frame + 1));\n",
" }\n",
"\n",
" Animation.prototype.previous_frame = function()\n",
" {\n",
" this.set_frame(Math.max(0, this.current_frame - 1));\n",
" }\n",
"\n",
" Animation.prototype.first_frame = function()\n",
" {\n",
" this.set_frame(0);\n",
" }\n",
"\n",
" Animation.prototype.last_frame = function()\n",
" {\n",
" this.set_frame(this.frames.length - 1);\n",
" }\n",
"\n",
" Animation.prototype.slower = function()\n",
" {\n",
" this.interval /= 0.7;\n",
" if(this.direction > 0){this.play_animation();}\n",
" else if(this.direction < 0){this.reverse_animation();}\n",
" }\n",
"\n",
" Animation.prototype.faster = function()\n",
" {\n",
" this.interval *= 0.7;\n",
" if(this.direction > 0){this.play_animation();}\n",
" else if(this.direction < 0){this.reverse_animation();}\n",
" }\n",
"\n",
" Animation.prototype.anim_step_forward = function()\n",
" {\n",
" this.current_frame += 1;\n",
" if(this.current_frame < this.frames.length){\n",
" this.set_frame(this.current_frame);\n",
" }else{\n",
" var loop_state = this.get_loop_state();\n",
" if(loop_state == \"loop\"){\n",
" this.first_frame();\n",
" }else if(loop_state == \"reflect\"){\n",
" this.last_frame();\n",
" this.reverse_animation();\n",
" }else{\n",
" this.pause_animation();\n",
" this.last_frame();\n",
" }\n",
" }\n",
" }\n",
"\n",
" Animation.prototype.anim_step_reverse = function()\n",
" {\n",
" this.current_frame -= 1;\n",
" if(this.current_frame >= 0){\n",
" this.set_frame(this.current_frame);\n",
" }else{\n",
" var loop_state = this.get_loop_state();\n",
" if(loop_state == \"loop\"){\n",
" this.last_frame();\n",
" }else if(loop_state == \"reflect\"){\n",
" this.first_frame();\n",
" this.play_animation();\n",
" }else{\n",
" this.pause_animation();\n",
" this.first_frame();\n",
" }\n",
" }\n",
" }\n",
"\n",
" Animation.prototype.pause_animation = function()\n",
" {\n",
" this.direction = 0;\n",
" if (this.timer){\n",
" clearInterval(this.timer);\n",
" this.timer = null;\n",
" }\n",
" }\n",
"\n",
" Animation.prototype.play_animation = function()\n",
" {\n",
" this.pause_animation();\n",
" this.direction = 1;\n",
" var t = this;\n",
" if (!this.timer) this.timer = setInterval(function() {\n",
" t.anim_step_forward();\n",
" }, this.interval);\n",
" }\n",
"\n",
" Animation.prototype.reverse_animation = function()\n",
" {\n",
" this.pause_animation();\n",
" this.direction = -1;\n",
" var t = this;\n",
" if (!this.timer) this.timer = setInterval(function() {\n",
" t.anim_step_reverse();\n",
" }, this.interval);\n",
" }\n",
"</script>\n",
"\n",
"<style>\n",
".animation {\n",
" display: inline-block;\n",
" text-align: center;\n",
"}\n",
"input[type=range].anim-slider {\n",
" width: 374px;\n",
" margin-left: auto;\n",
" margin-right: auto;\n",
"}\n",
".anim-buttons {\n",
" margin: 8px 0px;\n",
"}\n",
".anim-buttons button {\n",
" padding: 0;\n",
" width: 36px;\n",
"}\n",
".anim-state label {\n",
" margin-right: 8px;\n",
"}\n",
".anim-state input {\n",
" margin: 0;\n",
" vertical-align: middle;\n",
"}\n",
"</style>\n",
"\n",
"<div class=\"animation\">\n",
" <img id=\"_anim_img4069ab61593447c6a60b34327518ba24\">\n",
" <div class=\"anim-controls\">\n",
" <input id=\"_anim_slider4069ab61593447c6a60b34327518ba24\" type=\"range\" class=\"anim-slider\"\n",
" name=\"points\" min=\"0\" max=\"1\" step=\"1\" value=\"0\"\n",
" oninput=\"anim4069ab61593447c6a60b34327518ba24.set_frame(parseInt(this.value));\"></input>\n",
" <div class=\"anim-buttons\">\n",
" <button onclick=\"anim4069ab61593447c6a60b34327518ba24.slower()\"><i class=\"fa fa-minus\"></i></button>\n",
" <button onclick=\"anim4069ab61593447c6a60b34327518ba24.first_frame()\"><i class=\"fa fa-fast-backward\">\n",
" </i></button>\n",
" <button onclick=\"anim4069ab61593447c6a60b34327518ba24.previous_frame()\">\n",
" <i class=\"fa fa-step-backward\"></i></button>\n",
" <button onclick=\"anim4069ab61593447c6a60b34327518ba24.reverse_animation()\">\n",
" <i class=\"fa fa-play fa-flip-horizontal\"></i></button>\n",
" <button onclick=\"anim4069ab61593447c6a60b34327518ba24.pause_animation()\"><i class=\"fa fa-pause\">\n",
" </i></button>\n",
" <button onclick=\"anim4069ab61593447c6a60b34327518ba24.play_animation()\"><i class=\"fa fa-play\"></i>\n",
" </button>\n",
" <button onclick=\"anim4069ab61593447c6a60b34327518ba24.next_frame()\"><i class=\"fa fa-step-forward\">\n",
" </i></button>\n",
" <button onclick=\"anim4069ab61593447c6a60b34327518ba24.last_frame()\"><i class=\"fa fa-fast-forward\">\n",
" </i></button>\n",
" <button onclick=\"anim4069ab61593447c6a60b34327518ba24.faster()\"><i class=\"fa fa-plus\"></i></button>\n",
" </div>\n",
" <form action=\"#n\" name=\"_anim_loop_select4069ab61593447c6a60b34327518ba24\" class=\"anim-state\">\n",
" <input type=\"radio\" name=\"state\" value=\"once\" id=\"_anim_radio1_4069ab61593447c6a60b34327518ba24\"\n",
" >\n",
" <label for=\"_anim_radio1_4069ab61593447c6a60b34327518ba24\">Once</label>\n",
" <input type=\"radio\" name=\"state\" value=\"loop\" id=\"_anim_radio2_4069ab61593447c6a60b34327518ba24\"\n",
" checked>\n",
" <label for=\"_anim_radio2_4069ab61593447c6a60b34327518ba24\">Loop</label>\n",
" <input type=\"radio\" name=\"state\" value=\"reflect\" id=\"_anim_radio3_4069ab61593447c6a60b34327518ba24\"\n",
" >\n",
" <label for=\"_anim_radio3_4069ab61593447c6a60b34327518ba24\">Reflect</label>\n",
" </form>\n",
" </div>\n",
"</div>\n",
"\n",
"\n",
"<script language=\"javascript\">\n",
" /* Instantiate the Animation class. */\n",
" /* The IDs given should match those used in the template above. */\n",
" (function() {\n",
" var img_id = \"_anim_img4069ab61593447c6a60b34327518ba24\";\n",
" var slider_id = \"_anim_slider4069ab61593447c6a60b34327518ba24\";\n",
" var loop_select_id = \"_anim_loop_select4069ab61593447c6a60b34327518ba24\";\n",
" var frames = new Array(1);\n",
" \n",
" frames[0] = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWgAAAJACAYAAACg8vwTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\\\n",
"AAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0\\\n",
"dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdd1wUZ/4H8M/C0qv0piggUgUhIFbU\\\n",
"2MASTYymqlGjcvpDz5gziTFePCXFmDuj3ikmZ4kxYkliLKBJFGNURCMgCCIWkA7SpLPsPr8/iHsS\\\n",
"2i7s7swu3/fr5SthZ5jnM+PwdXjmmWcEjDEGQgghvKPFdQBCCCHtowJNCCE8RQWaEEJ4igo0IYTw\\\n",
"FBVoQgjhKSrQhBDCU1SgCSGEp6hAE0IIT1GBJoQQnqICTQghPEUFmhBCeIoKNCGE8BQVaEII4Skq\\\n",
"0IQQwlNUoAkhhKeoQBNCCE9RgSaEEJ6iAk0IITxFBZoQQniKCjQhhPAUFWhCCOEpKtCEEMJTVKAJ\\\n",
"IYSnqEATQghPUYEmhBCeogJNCCE8RQWaEEJ4igo0IYTwFBVoQgjhKSrQhBDCU1SgCSGEp6hAE0II\\\n",
"T1GBJoQQnqICTQghPEUFmhBCeIoKNCGE8BQVaEII4Skq0IQQwlNUoAkhhKeoQBNCCE9RgSaEEJ6i\\\n",
"Ak0IITxFBZoQQniKCjQhhPAUFWhCCOEpKtCEEMJTVKAJIYSnqEATQghPUYEmyM3NxZgxY+Dl5QU/\\\n",
"Pz989913XEcihAAQMMYY1yEItwoLC1FcXAx/f3+UlJQgMDAQmZmZMDQ05DoaIb0aXUErwO7du+Hi\\\n",
"4gKhUIglS5agoqICtra2uHfvnszbmDVrFj7//HMlpuyYvb09/P39AQA2Njbo06cPHj16pPIcU6dO\\\n",
"xfz58+X+vjFjxmD58uWKD0QIx6hA99Dt27cRERGBLVu2IDc3F1u2bEFUVBTCw8Ph6uoq83bWr1+P\\\n",
"jRs3oqqqSolpu3b9+nWIRCL07duX0xztUXUh1oTCr8h90ITjoW6oQPfQjz/+CB8fH8ycORP29vbQ\\\n",
"0tLCl19+iYULF8q1HV9fX7i4uODAgQNKStq1srIyzJ07F1999RUEAgFnOQghf2AaytHRkW3ZsqXV\\\n",
"Zzdv3mR6enrs1q1bCmlj4MCBDID0z4wZM9iRI0eYhYUFk0gkrdY9fPgw09XVZdnZ2dLPIiMjmYuL\\\n",
"CysqKmKMMfbhhx+yESNGKCSbvG03NDSwUaNGsf3793e5vdjYWDZy5Ehmbm7O+vTpwyZOnMjS09Ol\\\n",
"y0NDQ1lERAR79913maWlJbO2tmZvvfUWE4vF0nVqa2vZvHnzmJGREbOxsWGbNm1iU6ZMYfPmzWu3\\\n",
"zXnz5rU61gDYgwcPZG5PIpGwTz75hLm4uDB9fX3m4+PDvv766w73saP2utp3WfPU1NSw119/Xbr/\\\n",
"UVFRbfa/q8xdtdPZMZP371SebclyvvWUKtrgA40t0LNmzWIvvfRSq8/GjRvHli1b1mbdTZs2MSMj\\\n",
"o07//Prrr22+r7i4mLm7u7ONGzeywsJCVlVVxSIjI9mECRParCuRSFhgYCBbtGgRY4yxzZs3M2tr\\\n",
"a3bnzh3pOrGxsUxHR4fV1dUpLKMsbUskEvbSSy+x9evXd3A0Wzt69Cg7evQou3PnDktJSWEvvvgi\\\n",
"c3V1ZY2NjYyxlsJhamrK1q1bxzIzM1lMTAzT1tZmBw8elG4jIiKCOTg4sLi4OJaamspmzZrFTExM\\\n",
"OizQlZWVbNiwYeyNN95ghYWFrLCwkDU3N8vc3nvvvcfc3d1ZbGwsu3//Pvvmm2+YoaEhO3nypFzt\\\n",
"dbXvsuZZsmQJ69evHzt79ixLS0tjc+bMYaampq32v6vMXbXT2TGT9+9Unm3Jcq4/0d3zWp421JnG\\\n",
"FugtW7YwV1dX6dfff/8969OnD3v06FGbdcvKylhWVlanf9ormvX19UwoFLLz589LP3vuuefY3Llz\\\n",
"28105swZJhQK2UcffcSMjY1ZYmJiq+UpKSkMALt7967CMsrS9sWLF5lAIGB+fn7SPzdv3uxwW39W\\\n",
"U1PDtLS02MWLFxljLYUjJCSk1Trjx49nCxcuZIwxVl1dzXR1ddmBAweky6urq5mZmVmHBfrJdtv7\\\n",
"B7ar9mpqapi+vn6bH/QVK1awsLAwudt72p/3XZY81dXVTEdHh3377bettmNubi7df1kyd9WOrPsg\\\n",
"z37Juq2uzvUnenJey9qGOhOqtkNFdUJCQvDWW2+hvLwcRkZGWL16NT744ANYWlq2WdfCwgIWFhZy\\\n",
"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\\\n",
"hg8f3u56qjy2mvL3qKj90JTjoQhqX6Dv3r0Le3t7DB8+HHZ2dtDV1W21vK6uDl9++SUWLlwo13Z9\\\n",
"fX3h4uKCAwcOKDIu4VhX5wshvMJUaN++fczCwoI1NDS0+vyVV15h06ZNk3t78+bNYwCkf5ydndm8\\\n",
"efPY+vXrpescOXKEWVhYMIlEIv2spKSE2dnZsQ8//FD6WUpKCtPT02NHjhyRfvbhhx+yESNGdJoh\\\n",
"NjaWjRw5kpmbm7M+ffqwiRMnsvT09FbrhIaGsoiICPbuu+8yS0tLZm1tzd566y0mFosZY4zV1tay\\\n",
"efPmMSMjI2ZjY8M2bdrEpkyZwubNmyfzvgNgDx486LItxhiTSCTsk08+YS4uLkxfX5/5+Piwr7/+\\\n",
"utP9vHDhAhs6dCgzMjJipqamLDg4mKWmpkqzTJkyRbpuQ0MDW7FiBbOxsWF6enps6NCh7OLFi22O\\\n",
"yZIlS1hkZCQzNzdn5ubmbPXq1T3O2Vnb7Z0vXB/bjtpirOtzS5Y8NTU17PXXX5eeW1FRUW3OLVky\\\n",
"d9VWZ/vxtK72SdbtMMbY4cOHma6uLsvOzpZ+FhkZyVxcXFhRUVGHx1weqmijMyot0HV1dczc3JzF\\\n",
"xMRIP6usrGQGBgbshx9+YIwxtmnTJmZkZNTpn19//VX6vR988AFzcnJihYWFrKSkpE2BjoyMZBMm\\\n",
"TGiTJS4ujuno6LDLly+zuro65uXlxebPn99qndjYWKajo8Pq6uo63KejR4+yo0ePsjt37rCUlBT2\\\n",
"4osvMldXV9bY2ChdJzQ0lJmamrJ169axzMxMFhMTw7S1tdnBgwcZY4xFREQwBwcHFhcXx1JTU9ms\\\n",
"WbOYiYlJpwW6srKSDRs2jL3xxhussLCQFRYWsubm5i7bYoyx9957j7m7u7PY2Fh2//599s033zBD\\\n",
"Q0N28uTJdtsSiUTM3NycvfXWW+zu3bssIyODffPNN9IfrD8X6MjISGZnZ8dOnjzJ0tPT2aJFi5iR\\\n",
"kRErKChodUyMjY3Z8uXLWUZGBouJiWGmpqZsy5Yt3c7ZVdvtnS9cH9uO2mKs63NLljxLlixh/fr1\\\n",
"Y2fPnmVpaWlszpw5zNTUtNW5JUvmrtrqbD+e1tU+ybodxlr+YQkMDGSLFi1ijDG2efNmZm1tze7c\\\n",
"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\\\n",
"\"\n",
"\n",
"\n",
" /* set a timeout to make sure all the above elements are created before\n",
" the object is initialized. */\n",
" setTimeout(function() {\n",
" anim4069ab61593447c6a60b34327518ba24 = new Animation(frames, img_id, slider_id, 20.0,\n",
" loop_select_id);\n",
" }, 0);\n",
" })()\n",
"</script>\n"
],
"text/plain": [
"<matplotlib.animation.FuncAnimation at 0x7ff7f01165d0>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#@title\n",
"def animate_tangent(f, fp, f_str):\n",
" n_frames = 200\n",
" x_min, x_max = -1000, 1000\n",
"\n",
" fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(5, 8), sharex=True)\n",
"\n",
" # plot f\n",
" xs = np.linspace(-2.1, 2.1, 500)\n",
" ys = f(xs)\n",
" ax1.plot(xs, ys)\n",
"\n",
" # plot tangent\n",
" line_tangent, = ax1.plot([x_min, x_max], [0, 0])\n",
"\n",
" # plot f'\n",
" xs = np.linspace(-2.1, 2.1, 500)\n",
" ys = fp(xs)\n",
" ax2.plot(xs, ys, \"r-\")\n",
"\n",
" # plot points A\n",
" point_A1, = ax1.plot(0, 0, \"bo\")\n",
" point_A2, = ax2.plot(0, 0, \"bo\")\n",
"\n",
" show([-2.1, 2.1, 0, 2.8], ax=ax1, ylabel=\"$f(x)$\",\n",
2020-04-12 13:32:03 +02:00
" title=r\"$y=f(x)=\" + f_str + \"$ and the tangent at $x=x_\\mathrm{A}$\")\n",
" show([-2.1, 2.1, -4.2, 4.2], ax=ax2, ylabel=\"$f'(x)$\",\n",
2020-04-12 13:32:03 +02:00
" title=r\"y=f'(x) and the slope of the tangent at $x=x_\\mathrm{A}$\")\n",
"\n",
" def update_graph(i):\n",
" x = 1.5 * np.sin(2 * np.pi * i / n_frames)\n",
" f_x = f(x)\n",
" df_dx = fp(x)\n",
" offset = f_x - df_dx * x\n",
" line_tangent.set_data([x_min, x_max],\n",
" [df_dx * x_min + offset, df_dx * x_max + offset])\n",
" point_A1.set_data(x, f_x)\n",
" point_A2.set_data(x, df_dx)\n",
" return line_tangent, point_A1, point_A2\n",
"\n",
" anim = animation.FuncAnimation(fig, update_graph,\n",
" init_func=lambda: update_graph(0),\n",
" frames=n_frames,\n",
" interval=20,\n",
" blit=True)\n",
" plt.close()\n",
" return anim\n",
"\n",
"def f(x):\n",
" return x**2\n",
"\n",
"def fp(x):\n",
" return 2*x\n",
"\n",
2020-04-12 13:32:03 +02:00
"animate_tangent(f, fp, \"x^2\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "-cFmqj7LMtJI"
},
"source": [
"<hr />\n",
"\n",
2020-04-12 13:32:03 +02:00
"**Note:** consider the tangent line to the curve $y=f(x)$ at some point $\\mathrm{A}$. What is its equation? Well, since the tangent is a straight line, its equation must look like:\n",
"\n",
2020-04-12 13:32:03 +02:00
"$y = \\alpha x + \\beta$\n",
"\n",
"where $\\alpha$ is the slope of the line, and $\\beta$ is the offset (i.e., the $y$ coordinate of the point at which the line crosses the vertical axis). We already know that the slope of the tangent line at point $\\mathrm{A}$ is the derivative of $f(x)$ at that point, so:\n",
"\n",
"$\\alpha = f'(x_\\mathrm{A})$\n",
"\n",
2020-04-12 13:32:03 +02:00
"But what about the offset $\\beta$? Well we also know that the tangent line touches the curve at point $\\mathrm{A}$, so we know that $\\alpha x_\\mathrm{A} + \\beta = f(x_\\mathrm{A})$. So:\n",
"\n",
"$\\beta = f(x_\\mathrm{A}) - f'(x_\\mathrm{A})x_\\mathrm{A}$\n",
"\n",
2020-04-12 13:32:03 +02:00
"So we get the following equation for the tangent:\n",
"\n",
2020-04-12 13:32:03 +02:00
"$y = f(x_\\mathrm{A}) + f'(x_\\mathrm{A})(x - x_\\mathrm{A})$\n",
"\n",
2020-04-12 13:32:03 +02:00
"For example, the tangent to the $y=x^2$ curve is given by:\n",
"\n",
2020-04-12 13:32:03 +02:00
"$y = {x_\\mathrm{A}}^2 + 2x_\\mathrm{A}(x - x_\\mathrm{A}) = 2x_\\mathrm{A}x - x_\\mathrm{A}^2$\n",
"<hr />"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "vUT-AtXrYEVp"
},
"source": [
"# Differentiation rules"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "Vev7qaj1ZLBB"
},
"source": [
"One very important rule is that **the derivative of a sum is the sum of the derivatives**. More precisely, if we define $f(x) = g(x) + h(x)$, then $f'(x) = g'(x) + h'(x)$. This is quite easy to prove:\n",
"\n",
"$\n",
"\\begin{align*}\n",
"f'(x) & = \\underset{\\epsilon \\to 0}\\lim\\dfrac{f(x+\\epsilon) - f(x)}{\\epsilon} && \\quad\\text{by definition}\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim\\dfrac{g(x+\\epsilon) + h(x+\\epsilon) - g(x) - h(x)}{\\epsilon} && \\quad \\text{using }f(x) = g(x) + h(x) \\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim\\dfrac{g(x+\\epsilon) - g(x) + h(x+\\epsilon) - h(x)}{\\epsilon} && \\quad \\text{just moving terms around}\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim\\dfrac{g(x+\\epsilon) - g(x)}{\\epsilon} + \\underset{\\epsilon \\to 0}\\lim\\dfrac{h(x+\\epsilon) - h(x)}{\\epsilon} && \\quad \\text{since the limit of a sum is the sum of the limits}\\\\\n",
"& = g'(x) + h'(x) && \\quad \\text{using the definitions of }g'(x) \\text{ and } h'(x)\n",
"\\end{align*}\n",
"$"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "oAPCTc3rbKIc"
},
"source": [
"Similarly, it is possible to show the following important rules (I've included the proofs at the end of this notebook, in case you're curious):\n",
"\n",
"| | Function $f$ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | Derivative $f'$ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |\n",
"| ---------------- |------------------- | ------------------------------- |\n",
"| **Constant** | $f(x) = c$ | $f'(x) = 0$ |\n",
"| **Sum** | $f(x) = g(x) + h(x)$ | $f'(x) = g'(x) + h'(x)$ |\n",
"| **Product** | $f(x) = g(x) h(x)$ | $f'(x) = g(x)h'(x) + g'(x)h(x)$ |\n",
"| **Quotient** | $f(x) = \\dfrac{g(x)}{h(x)}$ | $f'(x) = \\dfrac{g'(x)h(x) - g(x)h'(x)}{h^2(x)}$ |\n",
"| **Power** | $f(x) = x^r$ with $r \\neq 0$ | $f'(x) = rx^{r-1}$ |\n",
"| **Exponential** | $f(x) = \\exp(x)$ | $f'(x)=\\exp(x)$ |\n",
"| **Logarithm** | $f(x) = \\ln(x)$ | $f'(x) = \\dfrac{1}{x} $ |\n",
"| **Sin** | $f(x) = \\sin(x)$ | $f'(x) = \\cos(x) $ |\n",
"| **Cos** | $f(x) = \\cos(x)$ | $f'(x) = -\\sin(x) $ |\n",
"| **Tan** | $f(x) = \\tan(x)$ | $f'(x) = \\dfrac{1}{\\cos^2(x)}$ |\n",
"| **Chain Rule** | $f(x) = g(h(x))$ | $f'(x) = g'(h(x))\\,h'(x)$ |\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "mnywx0pgMCLA"
},
"source": [
"---\n",
"\n",
"Let's try differentiating a simple function using the above rules: we will find the derivative of $f(x)=x^3+\\cos(x)$. Using the rule for the derivative of sums, we find that $f'(x)=\\dfrac{\\mathrm{d}}{\\mathrm{d}x}[x^3] + \\dfrac{\\mathrm{d}}{\\mathrm{d}x}[\\cos(x)]$. Using the rule for the derivative of powers and for the $\\cos$ function, we find that $f'(x) = 3x^2 - \\sin(x)$."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "n6HwqWcADMVk"
},
"source": [
"---\n",
"\n",
"Let's try a harder example: let's find the derivative of $f(x) = \\sin(2 x^2) + 1$. First, let's define $u(x)=\\sin(x) + 1$ and $v(x) = 2x^2$. Using the rule for sums, we find that $u'(x)=\\dfrac{\\mathrm{d}}{\\mathrm{d}x}[sin(x)] + \\dfrac{\\mathrm{d}}{\\mathrm{d}x}[1]$. Since the derivative of the $\\sin$ function is $\\cos$, and the derivative of constants is 0, we find that $u'(x)=\\cos(x)$. Next, using the product rule, we find that $v'(x)=2\\dfrac{\\mathrm{d}}{\\mathrm{d}x}[x^2] + \\dfrac{\\mathrm{d}}{\\mathrm{d}x}[2]\\,x^2$. Since the derivative of a constant is 0, the second term cancels out. And since the power rule tells us that the derivative of $x^2$ is $2x$, we find that $v'(x)=4x$. Lastly, using the chain rule, since $f(x)=u(v(x))$, we find that $f'(x)=u'(v(x))\\,v'(x)=\\cos(2x^2)\\,4x$.\n",
"\n",
2020-04-12 13:32:03 +02:00
"Let's plot $f$ followed by $f'$, and let's use $f'(x_\\mathbf{A})$ to find the slope of the tangent at some point $\\mathbf{A}$:\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"cellView": "form",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 670
},
"colab_type": "code",
"id": "QJYnQ1JSIVfh",
"outputId": "30cc1238-1793-43e3-af53-f60b623db28d"
},
2022-02-19 10:24:54 +01:00
"outputs": [
{
"data": {
"text/html": [
"\n",
"<link rel=\"stylesheet\"\n",
"href=\"https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/\n",
"css/font-awesome.min.css\">\n",
"<script language=\"javascript\">\n",
" function isInternetExplorer() {\n",
" ua = navigator.userAgent;\n",
" /* MSIE used to detect old browsers and Trident used to newer ones*/\n",
" return ua.indexOf(\"MSIE \") > -1 || ua.indexOf(\"Trident/\") > -1;\n",
" }\n",
"\n",
" /* Define the Animation class */\n",
" function Animation(frames, img_id, slider_id, interval, loop_select_id){\n",
" this.img_id = img_id;\n",
" this.slider_id = slider_id;\n",
" this.loop_select_id = loop_select_id;\n",
" this.interval = interval;\n",
" this.current_frame = 0;\n",
" this.direction = 0;\n",
" this.timer = null;\n",
" this.frames = new Array(frames.length);\n",
"\n",
" for (var i=0; i<frames.length; i++)\n",
" {\n",
" this.frames[i] = new Image();\n",
" this.frames[i].src = frames[i];\n",
" }\n",
" var slider = document.getElementById(this.slider_id);\n",
" slider.max = this.frames.length - 1;\n",
" if (isInternetExplorer()) {\n",
" // switch from oninput to onchange because IE <= 11 does not conform\n",
" // with W3C specification. It ignores oninput and onchange behaves\n",
" // like oninput. In contrast, Mircosoft Edge behaves correctly.\n",
" slider.setAttribute('onchange', slider.getAttribute('oninput'));\n",
" slider.setAttribute('oninput', null);\n",
" }\n",
" this.set_frame(this.current_frame);\n",
" }\n",
"\n",
" Animation.prototype.get_loop_state = function(){\n",
" var button_group = document[this.loop_select_id].state;\n",
" for (var i = 0; i < button_group.length; i++) {\n",
" var button = button_group[i];\n",
" if (button.checked) {\n",
" return button.value;\n",
" }\n",
" }\n",
" return undefined;\n",
" }\n",
"\n",
" Animation.prototype.set_frame = function(frame){\n",
" this.current_frame = frame;\n",
" document.getElementById(this.img_id).src =\n",
" this.frames[this.current_frame].src;\n",
" document.getElementById(this.slider_id).value = this.current_frame;\n",
" }\n",
"\n",
" Animation.prototype.next_frame = function()\n",
" {\n",
" this.set_frame(Math.min(this.frames.length - 1, this.current_frame + 1));\n",
" }\n",
"\n",
" Animation.prototype.previous_frame = function()\n",
" {\n",
" this.set_frame(Math.max(0, this.current_frame - 1));\n",
" }\n",
"\n",
" Animation.prototype.first_frame = function()\n",
" {\n",
" this.set_frame(0);\n",
" }\n",
"\n",
" Animation.prototype.last_frame = function()\n",
" {\n",
" this.set_frame(this.frames.length - 1);\n",
" }\n",
"\n",
" Animation.prototype.slower = function()\n",
" {\n",
" this.interval /= 0.7;\n",
" if(this.direction > 0){this.play_animation();}\n",
" else if(this.direction < 0){this.reverse_animation();}\n",
" }\n",
"\n",
" Animation.prototype.faster = function()\n",
" {\n",
" this.interval *= 0.7;\n",
" if(this.direction > 0){this.play_animation();}\n",
" else if(this.direction < 0){this.reverse_animation();}\n",
" }\n",
"\n",
" Animation.prototype.anim_step_forward = function()\n",
" {\n",
" this.current_frame += 1;\n",
" if(this.current_frame < this.frames.length){\n",
" this.set_frame(this.current_frame);\n",
" }else{\n",
" var loop_state = this.get_loop_state();\n",
" if(loop_state == \"loop\"){\n",
" this.first_frame();\n",
" }else if(loop_state == \"reflect\"){\n",
" this.last_frame();\n",
" this.reverse_animation();\n",
" }else{\n",
" this.pause_animation();\n",
" this.last_frame();\n",
" }\n",
" }\n",
" }\n",
"\n",
" Animation.prototype.anim_step_reverse = function()\n",
" {\n",
" this.current_frame -= 1;\n",
" if(this.current_frame >= 0){\n",
" this.set_frame(this.current_frame);\n",
" }else{\n",
" var loop_state = this.get_loop_state();\n",
" if(loop_state == \"loop\"){\n",
" this.last_frame();\n",
" }else if(loop_state == \"reflect\"){\n",
" this.first_frame();\n",
" this.play_animation();\n",
" }else{\n",
" this.pause_animation();\n",
" this.first_frame();\n",
" }\n",
" }\n",
" }\n",
"\n",
" Animation.prototype.pause_animation = function()\n",
" {\n",
" this.direction = 0;\n",
" if (this.timer){\n",
" clearInterval(this.timer);\n",
" this.timer = null;\n",
" }\n",
" }\n",
"\n",
" Animation.prototype.play_animation = function()\n",
" {\n",
" this.pause_animation();\n",
" this.direction = 1;\n",
" var t = this;\n",
" if (!this.timer) this.timer = setInterval(function() {\n",
" t.anim_step_forward();\n",
" }, this.interval);\n",
" }\n",
"\n",
" Animation.prototype.reverse_animation = function()\n",
" {\n",
" this.pause_animation();\n",
" this.direction = -1;\n",
" var t = this;\n",
" if (!this.timer) this.timer = setInterval(function() {\n",
" t.anim_step_reverse();\n",
" }, this.interval);\n",
" }\n",
"</script>\n",
"\n",
"<style>\n",
".animation {\n",
" display: inline-block;\n",
" text-align: center;\n",
"}\n",
"input[type=range].anim-slider {\n",
" width: 374px;\n",
" margin-left: auto;\n",
" margin-right: auto;\n",
"}\n",
".anim-buttons {\n",
" margin: 8px 0px;\n",
"}\n",
".anim-buttons button {\n",
" padding: 0;\n",
" width: 36px;\n",
"}\n",
".anim-state label {\n",
" margin-right: 8px;\n",
"}\n",
".anim-state input {\n",
" margin: 0;\n",
" vertical-align: middle;\n",
"}\n",
"</style>\n",
"\n",
"<div class=\"animation\">\n",
" <img id=\"_anim_img169490c4c4664f3c8432d3b5400bdd27\">\n",
" <div class=\"anim-controls\">\n",
" <input id=\"_anim_slider169490c4c4664f3c8432d3b5400bdd27\" type=\"range\" class=\"anim-slider\"\n",
" name=\"points\" min=\"0\" max=\"1\" step=\"1\" value=\"0\"\n",
" oninput=\"anim169490c4c4664f3c8432d3b5400bdd27.set_frame(parseInt(this.value));\"></input>\n",
" <div class=\"anim-buttons\">\n",
" <button onclick=\"anim169490c4c4664f3c8432d3b5400bdd27.slower()\"><i class=\"fa fa-minus\"></i></button>\n",
" <button onclick=\"anim169490c4c4664f3c8432d3b5400bdd27.first_frame()\"><i class=\"fa fa-fast-backward\">\n",
" </i></button>\n",
" <button onclick=\"anim169490c4c4664f3c8432d3b5400bdd27.previous_frame()\">\n",
" <i class=\"fa fa-step-backward\"></i></button>\n",
" <button onclick=\"anim169490c4c4664f3c8432d3b5400bdd27.reverse_animation()\">\n",
" <i class=\"fa fa-play fa-flip-horizontal\"></i></button>\n",
" <button onclick=\"anim169490c4c4664f3c8432d3b5400bdd27.pause_animation()\"><i class=\"fa fa-pause\">\n",
" </i></button>\n",
" <button onclick=\"anim169490c4c4664f3c8432d3b5400bdd27.play_animation()\"><i class=\"fa fa-play\"></i>\n",
" </button>\n",
" <button onclick=\"anim169490c4c4664f3c8432d3b5400bdd27.next_frame()\"><i class=\"fa fa-step-forward\">\n",
" </i></button>\n",
" <button onclick=\"anim169490c4c4664f3c8432d3b5400bdd27.last_frame()\"><i class=\"fa fa-fast-forward\">\n",
" </i></button>\n",
" <button onclick=\"anim169490c4c4664f3c8432d3b5400bdd27.faster()\"><i class=\"fa fa-plus\"></i></button>\n",
" </div>\n",
" <form action=\"#n\" name=\"_anim_loop_select169490c4c4664f3c8432d3b5400bdd27\" class=\"anim-state\">\n",
" <input type=\"radio\" name=\"state\" value=\"once\" id=\"_anim_radio1_169490c4c4664f3c8432d3b5400bdd27\"\n",
" >\n",
" <label for=\"_anim_radio1_169490c4c4664f3c8432d3b5400bdd27\">Once</label>\n",
" <input type=\"radio\" name=\"state\" value=\"loop\" id=\"_anim_radio2_169490c4c4664f3c8432d3b5400bdd27\"\n",
" checked>\n",
" <label for=\"_anim_radio2_169490c4c4664f3c8432d3b5400bdd27\">Loop</label>\n",
" <input type=\"radio\" name=\"state\" value=\"reflect\" id=\"_anim_radio3_169490c4c4664f3c8432d3b5400bdd27\"\n",
" >\n",
" <label for=\"_anim_radio3_169490c4c4664f3c8432d3b5400bdd27\">Reflect</label>\n",
" </form>\n",
" </div>\n",
"</div>\n",
"\n",
"\n",
"<script language=\"javascript\">\n",
" /* Instantiate the Animation class. */\n",
" /* The IDs given should match those used in the template above. */\n",
" (function() {\n",
" var img_id = \"_anim_img169490c4c4664f3c8432d3b5400bdd27\";\n",
" var slider_id = \"_anim_slider169490c4c4664f3c8432d3b5400bdd27\";\n",
" var loop_select_id = \"_anim_loop_select169490c4c4664f3c8432d3b5400bdd27\";\n",
" var frames = new Array(1);\n",
" \n",
" frames[0] = \"data:image/png;base64,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\\\n",
"P4//i9gxDgAAAABJRU5ErkJggg==\\\n",
"\"\n",
"\n",
"\n",
" /* set a timeout to make sure all the above elements are created before\n",
" the object is initialized. */\n",
" setTimeout(function() {\n",
" anim169490c4c4664f3c8432d3b5400bdd27 = new Animation(frames, img_id, slider_id, 20.0,\n",
" loop_select_id);\n",
" }, 0);\n",
" })()\n",
"</script>\n"
],
"text/plain": [
"<matplotlib.animation.FuncAnimation at 0x7ff8a21a1810>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#@title\n",
"animate_tangent(lambda x: np.sin(2*x**2) + 1, lambda x: 4*x*np.cos(2*x**2), r\"\\sin(2x^2)+1\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## The chain rule\n",
"\n",
"The chain rule is easier to remember using Leibniz's notation:\n",
"\n",
"If $f(x)=g(h(x))$ and $y=h(x)$, then: $\\dfrac{\\mathrm{d}f}{\\mathrm{d}x} = \\dfrac{\\mathrm{d}f}{\\mathrm{d}y} \\dfrac{\\mathrm{d}y}{\\mathrm{d}x}$\n",
"\n",
"Indeed, $\\dfrac{\\mathrm{d}f}{\\mathrm{d}y} = f'(y) = f'(h(x))$ and $\\dfrac{\\mathrm{d}y}{\\mathrm{d}x}=h'(x)$.\n",
"\n",
"It is possible to chain many functions. For example, if $f(x)=g(h(i(x)))$, and we define $y=i(x)$ and $z=h(y)$, then $\\dfrac{\\mathrm{d}f}{\\mathrm{d}x} = \\dfrac{\\mathrm{d}f}{\\mathrm{d}z} \\dfrac{\\mathrm{d}z}{\\mathrm{d}y} \\dfrac{\\mathrm{d}y}{\\mathrm{d}x}$. Using Lagrange's notation, we get $f'(x)=g'(z)\\,h'(y)\\,i'(x)=g'(h(i(x)))\\,h'(i(x))\\,i'(x)$\n",
"\n",
"The chain rule is crucial in Deep Learning, as a neural network is basically as a long composition of functions. For example, a 3-layer dense neural network corresponds to the following function: $f(\\mathbf{x})=\\operatorname{Dense}_3(\\operatorname{Dense}_2(\\operatorname{Dense}_1(\\mathbf{x})))$ (in this example, $\\operatorname{Dense}_3$ is the output layer).\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "JvAsOt0yAypb"
},
"source": [
"# Derivatives and optimization\n",
"\n",
"When trying to optimize a function $f(x)$, we look for the values of $x$ that minimize (or maximize) the function.\n",
"\n",
"It is important to note that when a function reaches a minimum or maximum, assuming it is differentiable at that point, the derivative will necessarily be equal to 0. For example, you can check the above animation, and notice that whenever the function $f$ (in the upper graph) reaches a maximum or minimum, then the derivative $f'$ (in the lower graph) is equal to 0.\n",
"\n",
"So one way to optimize a function is to differentiate it and analytically find all the values for which the derivative is 0, then determine which of these values optimize the function (if any). For example, consider the function $f(x)=\\dfrac{1}{4}x^4 - x^2 + \\dfrac{1}{2}$. Using the derivative rules (specifically, the sum rule, the product rule, the power rule and the constant rule), we find that $f'(x)=x^3 - 2x$. We look for the values of $x$ for which $f'(x)=0$, so $x^3-2x=0$, and therefore $x(x^2-2)=0$. So $x=0$, or $x=\\sqrt2$ or $x=-\\sqrt2$. As you can see on the following graph of $f(x)$, these 3 values correspond to local extrema. Two global minima $f\\left(\\sqrt2\\right)=f\\left(-\\sqrt2\\right)=-\\dfrac{1}{2}$ and one local maximum $f(0)=\\dfrac{1}{2}$.\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"cellView": "form",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 312
},
"colab_type": "code",
"id": "fQKvFaf4AXgu",
"outputId": "4880d3c9-02ba-4685-ca00-2c4f4ec7d430"
},
2022-02-19 10:24:54 +01:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#@title\n",
"def f(x):\n",
" return 1/4 * x**4 - x**2 + 1/2\n",
"\n",
"xs = np.linspace(-2.1, 2.1, 500)\n",
"ys = f(xs)\n",
"plt.plot(xs, ys)\n",
"plt.plot([np.sqrt(2), np.sqrt(2)], [0, f(np.sqrt(2))], \"k--\")\n",
"plt.plot([-np.sqrt(2), -np.sqrt(2)], [0, f(-np.sqrt(2))], \"k--\")\n",
"plt.text(-np.sqrt(2), 0.1, r\"$-\\sqrt{2}$\",\n",
" fontsize=14, horizontalalignment=\"center\")\n",
"plt.text(np.sqrt(2), 0.1, r\"$\\sqrt{2}$\",\n",
" fontsize=14, horizontalalignment=\"center\")\n",
2020-04-12 13:32:03 +02:00
"show(axis=[-2.1, 2.1, -1.4, 1.4], title=r\"$y=f(x)=\\dfrac{1}{4}x^4 - x^2 + 5$\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "ghbWt5dXDaDz"
},
"source": [
"If a function has a local extremum at a point $x_\\mathrm{A}$ and is differentiable at that point, then $f'(x_\\mathrm{A})=0$. However, the reverse is not always true. For example, consider $f(x)=x^3$. Its derivative is $f'(x)=x^2$, which is equal to 0 at $x_\\mathrm{A}=0$. Yet, this point is _not_ an extremum, as you can see on the following diagram. It's just a single point where the slope is 0."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"cellView": "form",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 304
},
"colab_type": "code",
"id": "iHRMtekMDXzz",
"outputId": "6ced4763-8dc6-4714-df7a-334c61954f41"
},
2022-02-19 10:24:54 +01:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#@title\n",
"def f(x):\n",
" return x**3\n",
"\n",
"xs = np.linspace(-1.05, 1.05, 500)\n",
"ys = f(xs)\n",
"plt.plot(xs, ys)\n",
"show(axis=[-1.05, 1.05, -0.7, 0.7], title=r\"$f(x)=x^3$\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "NyDyBVnUFlUl"
},
"source": [
2020-04-12 13:32:03 +02:00
"So in short, you can optimize a function by analytically working out the points at which the derivative is 0, and then investigating only these points. It's a beautifully elegant solution, but it requires a lot of work, and it's not always easy, or even possible. For neural networks, it's practically impossible."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "GqsVUknIGU3E"
},
"source": [
"Another option to optimize a function is to perform **Gradient Descent** (we will consider minimizing the function, but the process would be almost identical if we tried to maximize a function instead): start at a random point $x_0$, then use the function's derivative to determine the slope at that point, and move a little bit in the downwards direction, then repeat the process until you reach a local minimum, and cross your fingers in the hope that this happens to be the global minimum.\n",
"\n",
"At each iteration, the step size is proportional to the slope, so the process naturally slows down as it approaches a local minimum. Each step is also proportional to the learning rate: a parameter of the Gradient Descent algorithm itself (since it is not a parameter of the function we are optimizing, it is called a **hyperparameter**).\n",
"\n",
"Here is an animation of this process on the function $f(x)=\\dfrac{1}{4}x^4 - x^2 + \\dfrac{1}{2}$:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"cellView": "form",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 670
},
"colab_type": "code",
"id": "xyz-9xHeHPq2",
"outputId": "5f6e6147-7b26-4a70-b390-08daee87788e"
},
2022-02-19 10:24:54 +01:00
"outputs": [
{
"data": {
"text/html": [
"\n",
"<link rel=\"stylesheet\"\n",
"href=\"https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/\n",
"css/font-awesome.min.css\">\n",
"<script language=\"javascript\">\n",
" function isInternetExplorer() {\n",
" ua = navigator.userAgent;\n",
" /* MSIE used to detect old browsers and Trident used to newer ones*/\n",
" return ua.indexOf(\"MSIE \") > -1 || ua.indexOf(\"Trident/\") > -1;\n",
" }\n",
"\n",
" /* Define the Animation class */\n",
" function Animation(frames, img_id, slider_id, interval, loop_select_id){\n",
" this.img_id = img_id;\n",
" this.slider_id = slider_id;\n",
" this.loop_select_id = loop_select_id;\n",
" this.interval = interval;\n",
" this.current_frame = 0;\n",
" this.direction = 0;\n",
" this.timer = null;\n",
" this.frames = new Array(frames.length);\n",
"\n",
" for (var i=0; i<frames.length; i++)\n",
" {\n",
" this.frames[i] = new Image();\n",
" this.frames[i].src = frames[i];\n",
" }\n",
" var slider = document.getElementById(this.slider_id);\n",
" slider.max = this.frames.length - 1;\n",
" if (isInternetExplorer()) {\n",
" // switch from oninput to onchange because IE <= 11 does not conform\n",
" // with W3C specification. It ignores oninput and onchange behaves\n",
" // like oninput. In contrast, Mircosoft Edge behaves correctly.\n",
" slider.setAttribute('onchange', slider.getAttribute('oninput'));\n",
" slider.setAttribute('oninput', null);\n",
" }\n",
" this.set_frame(this.current_frame);\n",
" }\n",
"\n",
" Animation.prototype.get_loop_state = function(){\n",
" var button_group = document[this.loop_select_id].state;\n",
" for (var i = 0; i < button_group.length; i++) {\n",
" var button = button_group[i];\n",
" if (button.checked) {\n",
" return button.value;\n",
" }\n",
" }\n",
" return undefined;\n",
" }\n",
"\n",
" Animation.prototype.set_frame = function(frame){\n",
" this.current_frame = frame;\n",
" document.getElementById(this.img_id).src =\n",
" this.frames[this.current_frame].src;\n",
" document.getElementById(this.slider_id).value = this.current_frame;\n",
" }\n",
"\n",
" Animation.prototype.next_frame = function()\n",
" {\n",
" this.set_frame(Math.min(this.frames.length - 1, this.current_frame + 1));\n",
" }\n",
"\n",
" Animation.prototype.previous_frame = function()\n",
" {\n",
" this.set_frame(Math.max(0, this.current_frame - 1));\n",
" }\n",
"\n",
" Animation.prototype.first_frame = function()\n",
" {\n",
" this.set_frame(0);\n",
" }\n",
"\n",
" Animation.prototype.last_frame = function()\n",
" {\n",
" this.set_frame(this.frames.length - 1);\n",
" }\n",
"\n",
" Animation.prototype.slower = function()\n",
" {\n",
" this.interval /= 0.7;\n",
" if(this.direction > 0){this.play_animation();}\n",
" else if(this.direction < 0){this.reverse_animation();}\n",
" }\n",
"\n",
" Animation.prototype.faster = function()\n",
" {\n",
" this.interval *= 0.7;\n",
" if(this.direction > 0){this.play_animation();}\n",
" else if(this.direction < 0){this.reverse_animation();}\n",
" }\n",
"\n",
" Animation.prototype.anim_step_forward = function()\n",
" {\n",
" this.current_frame += 1;\n",
" if(this.current_frame < this.frames.length){\n",
" this.set_frame(this.current_frame);\n",
" }else{\n",
" var loop_state = this.get_loop_state();\n",
" if(loop_state == \"loop\"){\n",
" this.first_frame();\n",
" }else if(loop_state == \"reflect\"){\n",
" this.last_frame();\n",
" this.reverse_animation();\n",
" }else{\n",
" this.pause_animation();\n",
" this.last_frame();\n",
" }\n",
" }\n",
" }\n",
"\n",
" Animation.prototype.anim_step_reverse = function()\n",
" {\n",
" this.current_frame -= 1;\n",
" if(this.current_frame >= 0){\n",
" this.set_frame(this.current_frame);\n",
" }else{\n",
" var loop_state = this.get_loop_state();\n",
" if(loop_state == \"loop\"){\n",
" this.last_frame();\n",
" }else if(loop_state == \"reflect\"){\n",
" this.first_frame();\n",
" this.play_animation();\n",
" }else{\n",
" this.pause_animation();\n",
" this.first_frame();\n",
" }\n",
" }\n",
" }\n",
"\n",
" Animation.prototype.pause_animation = function()\n",
" {\n",
" this.direction = 0;\n",
" if (this.timer){\n",
" clearInterval(this.timer);\n",
" this.timer = null;\n",
" }\n",
" }\n",
"\n",
" Animation.prototype.play_animation = function()\n",
" {\n",
" this.pause_animation();\n",
" this.direction = 1;\n",
" var t = this;\n",
" if (!this.timer) this.timer = setInterval(function() {\n",
" t.anim_step_forward();\n",
" }, this.interval);\n",
" }\n",
"\n",
" Animation.prototype.reverse_animation = function()\n",
" {\n",
" this.pause_animation();\n",
" this.direction = -1;\n",
" var t = this;\n",
" if (!this.timer) this.timer = setInterval(function() {\n",
" t.anim_step_reverse();\n",
" }, this.interval);\n",
" }\n",
"</script>\n",
"\n",
"<style>\n",
".animation {\n",
" display: inline-block;\n",
" text-align: center;\n",
"}\n",
"input[type=range].anim-slider {\n",
" width: 374px;\n",
" margin-left: auto;\n",
" margin-right: auto;\n",
"}\n",
".anim-buttons {\n",
" margin: 8px 0px;\n",
"}\n",
".anim-buttons button {\n",
" padding: 0;\n",
" width: 36px;\n",
"}\n",
".anim-state label {\n",
" margin-right: 8px;\n",
"}\n",
".anim-state input {\n",
" margin: 0;\n",
" vertical-align: middle;\n",
"}\n",
"</style>\n",
"\n",
"<div class=\"animation\">\n",
" <img id=\"_anim_img1ec1960c5a024fac9a7ad4b17405fd20\">\n",
" <div class=\"anim-controls\">\n",
" <input id=\"_anim_slider1ec1960c5a024fac9a7ad4b17405fd20\" type=\"range\" class=\"anim-slider\"\n",
" name=\"points\" min=\"0\" max=\"1\" step=\"1\" value=\"0\"\n",
" oninput=\"anim1ec1960c5a024fac9a7ad4b17405fd20.set_frame(parseInt(this.value));\"></input>\n",
" <div class=\"anim-buttons\">\n",
" <button onclick=\"anim1ec1960c5a024fac9a7ad4b17405fd20.slower()\"><i class=\"fa fa-minus\"></i></button>\n",
" <button onclick=\"anim1ec1960c5a024fac9a7ad4b17405fd20.first_frame()\"><i class=\"fa fa-fast-backward\">\n",
" </i></button>\n",
" <button onclick=\"anim1ec1960c5a024fac9a7ad4b17405fd20.previous_frame()\">\n",
" <i class=\"fa fa-step-backward\"></i></button>\n",
" <button onclick=\"anim1ec1960c5a024fac9a7ad4b17405fd20.reverse_animation()\">\n",
" <i class=\"fa fa-play fa-flip-horizontal\"></i></button>\n",
" <button onclick=\"anim1ec1960c5a024fac9a7ad4b17405fd20.pause_animation()\"><i class=\"fa fa-pause\">\n",
" </i></button>\n",
" <button onclick=\"anim1ec1960c5a024fac9a7ad4b17405fd20.play_animation()\"><i class=\"fa fa-play\"></i>\n",
" </button>\n",
" <button onclick=\"anim1ec1960c5a024fac9a7ad4b17405fd20.next_frame()\"><i class=\"fa fa-step-forward\">\n",
" </i></button>\n",
" <button onclick=\"anim1ec1960c5a024fac9a7ad4b17405fd20.last_frame()\"><i class=\"fa fa-fast-forward\">\n",
" </i></button>\n",
" <button onclick=\"anim1ec1960c5a024fac9a7ad4b17405fd20.faster()\"><i class=\"fa fa-plus\"></i></button>\n",
" </div>\n",
" <form action=\"#n\" name=\"_anim_loop_select1ec1960c5a024fac9a7ad4b17405fd20\" class=\"anim-state\">\n",
" <input type=\"radio\" name=\"state\" value=\"once\" id=\"_anim_radio1_1ec1960c5a024fac9a7ad4b17405fd20\"\n",
" >\n",
" <label for=\"_anim_radio1_1ec1960c5a024fac9a7ad4b17405fd20\">Once</label>\n",
" <input type=\"radio\" name=\"state\" value=\"loop\" id=\"_anim_radio2_1ec1960c5a024fac9a7ad4b17405fd20\"\n",
" checked>\n",
" <label for=\"_anim_radio2_1ec1960c5a024fac9a7ad4b17405fd20\">Loop</label>\n",
" <input type=\"radio\" name=\"state\" value=\"reflect\" id=\"_anim_radio3_1ec1960c5a024fac9a7ad4b17405fd20\"\n",
" >\n",
" <label for=\"_anim_radio3_1ec1960c5a024fac9a7ad4b17405fd20\">Reflect</label>\n",
" </form>\n",
" </div>\n",
"</div>\n",
"\n",
"\n",
"<script language=\"javascript\">\n",
" /* Instantiate the Animation class. */\n",
" /* The IDs given should match those used in the template above. */\n",
" (function() {\n",
" var img_id = \"_anim_img1ec1960c5a024fac9a7ad4b17405fd20\";\n",
" var slider_id = \"_anim_slider1ec1960c5a024fac9a7ad4b17405fd20\";\n",
" var loop_select_id = \"_anim_loop_select1ec1960c5a024fac9a7ad4b17405fd20\";\n",
" var frames = new Array(1);\n",
" \n",
" frames[0] = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWgAAAJACAYAAACg8vwTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\\\n",
"AAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0\\\n",
"dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdeVxU9f7H8dcM+yICsgguKOCOoiGI\\\n",
"aErllpZpaWmLW4Zr2m3zdlusrprdsjK1DDVtc0mzzLUs19zIDfd9B3cBAQGB+f7+mOQXgTLIDHMY\\\n",
"Ps/Hw0fNzJlz3meYeTOc5Xt0SimFEEIIzdFbO4AQQojiSUELIYRGSUELIYRGSUELIYRGSUELIYRG\\\n",
"SUELIYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRGSUEL\\\n",
"IYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRG\\\n",
"SUELIYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRGSUEL\\\n",
"IYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRGSUELIYRG\\\n",
"SUELIYRGSUELIYRGSUFbwIYNG+jevTs1atRAp9MxZ84ca0fSNHm9hCieFLQFZGRkEBYWxuTJk3Fx\\\n",
"cbF2HM2T10uI4umUUsraIWyZu7s7U6dOZcCAAdaOUiHI6yXE/5Nv0BWAwWAgMjKSXr16lfuyz549\\\n",
"S2xsLI0bNyY8PJzFixeXewYhKit7awcQJfv8888JCQkhLy+v3Jdtb2/PJ598QvPmzbl06RIRERF0\\\n",
"6dIFV1fXcs8iRGVTIb9Bz5gxg+DgYOzt7RkyZAgpKSn4+/tz/Phxk+fRq1cvPvroIwumNI9Lly6x\\\n",
"ePFi4uLirLL8gIAAmjdvDoCfnx9eXl5cuXLFKlnK00MPPXRXm1liY2MZOXKk+QOJSqnCFfShQ4cY\\\n",
"NmwYkyZN4uzZs0yaNIkJEybQtWtXQkJCTJ7P2LFjGTduHGlpaRZMW3avvPIK//3vf9Hrrf+j2r59\\\n",
"O7m5udSqVcvaUTShPMvYForfnOtgC6+HKaz/qS+ln3/+mbCwMHr27ElAQAB6vZ6ZM2fy7LPPlmo+\\\n",
"TZs2JTg4mG+//dZCSctuw4YN6HQ6YmJirB2Fq1ev0q9fP2bNmoVOpytx+gEDBvD2229bPpgQtkyZ\\\n",
"SY0aNdSkSZMK3bdnzx7l5OSk9u/fb5Zl1KtXTwEF/3r06KEWLlyovL29lcFgKDTt999/rxwdHdWp\\\n",
"U6cK7hs1apQKDg5WFy5cUEop9c4776g2bdqYJdvfpaenq127dqldu3YpFxcX9c4776hdu3ap06dP\\\n",
"lyrje++9pwIDA1VQUJDy9/dXrq6uatCgQWbNasrrlJ2dre6991719ddfmzzf/v37q7Fjx5o0ramv\\\n",
"V3FWrlyp2rZtqzw9PZWXl5fq1KmTOnDgQMHj7du3V8OGDVOvvfaaqlatmvL19VUvvfSSys/PL5gm\\\n",
"MzNT9e/fX7m5uSk/Pz81fvx41a1bN9W/f/87rt/f34uAOnnypEnLMxgM6v3331fBwcHK2dlZhYWF\\\n",
"qW+++abUyzLX+mdkZKhnnnmmYP0nTJhQZP1NyXynZd1pHUr7My3NvEx5f5eVJZdhtoLu1auX6tOn\\\n",
"T6H77r//fjVixIgi044fP165ubnd8d+GDRuKPO/ixYuqfv36aty4cer8+fMqLS1NjRo1SnXs2LHI\\\n",
"tAaDQUVERKjBgwcrpZT64IMPlK+vrzpy5EjBNCtXrlQODg7qxo0bZsuolFJr164t8gYCinzgTcn4\\\n",
"93k+9thjxS6vLErKYDAYVJ8+fUwu21tKU9Cmvl7FWbRokVq0aJE6cuSISkxMVL1791YhISEqJydH\\\n",
"KWUsDQ8PD/Xmm2+qw4cPqwULFig7Ozs1d+7cgnkMGzZMBQYGqlWrVqm9e/eqXr16qSpVqtxx+amp\\\n",
"qap169Zq4MCB6vz58+r8+fMqLy/PpOX95z//UfXr11crV65UJ06cUN99951ydXVVy5YtK9WyzLX+\\\n",
"Q4YMUbVr11a//vqr2rdvn3riiSeUh4dHofU3JfOdlnWndSjtz7Q08yrNZ+xuP/OlWUZpma2gJ02a\\\n",
"pEJCQgpu//jjj8rLy0tduXKlyLRXr15VR48eveO/4kozKytL2dvbq7Vr1xbc98gjj6h+/foVm+mX\\\n",
"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\\\n",
"GUkIITTDYgX9448/UrNmTbZs2UK3bt3o3LkzAMnJyXTt2hUAe3t7pk6dSufOnWnUqBGPP/44TZo0\\\n",
"sVQkIYSoUCx2FEfPnj3p2bNnkfsDAwNZsWJFwe2uXbsWFLYQQoj/J2cSCiGERklBCyGERklBCyGE\\\n",
"RklBCyGERklBCyGERklBCyGERklBCyGERklBCyGERklBCyGERklBCyGERklBCyGERklBCyGERklB\\\n",
"CyGERklBCyGERklBCyGERklBCyGERklBCyGERklBCyGERklBCyGERklBCyGERklBCyGERklBCyGE\\\n",
"RklBCyGERumUUsraIUrLx8eHOnXqFPvY5cuX8fX1Ld9AkkGzGbSSQzJUjAynTp3iypUr5ZzoDpSN\\\n",
"iYiIsHYEyaChDEppWHbihwAAIABJREFUI4dkkAx3QzZxCCGERklBCyGERtm9/fbbb1s7hLlFRERY\\\n",
"O4Jk0FAG0EYOySAZSqtC7iQUQojKQDZxCCGERklBC5uzcOFCnJycOH36dMF9o0ePJiQkhIsXL1ox\\\n",
"mRClI5s4hM1RShEZGUmLFi2YMWMGH374If/73//YtGkT9erVs3Y8IUxmb+0AQpibTqdjwoQJdOvW\\\n",
"jZCQEMaPH8+aNWuknEWFI9+ghc2KiYkhISGBpUuX8uCDD1o7jhClJtughU1as2YNiYmJKKXw9/e3\\\n",
"dhwh7op8gxY2JzExkfbt2/PRRx+xfPlyMjIy+OWXX6wdS4hSk4IWNuX06dPExMQwZMgQ3nrrLfbt\\\n",
"20ezZs1Ys2YNsbGx1o4nRKlIQQubce3aNdq0aUO7du344osvCu5/4oknOHPmDFu2bLFiOiFKTwpa\\\n",
"CCE0SnYSCiGERklBCyGERklBCyGERklBCyGERklBCyGERtlUQc+YMYPg4GDs7e0ZMmRIkcdTUlLw\\\n",
"9/fn+PHjJs+zV69efPTRR+aMWWoPPfQQAwYMKNVzYmNjGTlypGUC3cGAAQN46KGHyn25d8NgMDBk\\\n",
"yBCqVauGTqdj3bp1Jj3PWq+tqHxspqAPHTrEsGHDmDRpEmfPnmXSpEm8/fbbfPzxxwXTTJgwga5d\\\n",
"uxISEmLyfMeOHcu4ceNIS0uzRGyzkMK4OytWrGD27NksXbqU8+fPExMTU2Sa8nxtbeXnaK71sJXX\\\n",
"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\\\n",
"JoQQ4uzZsyIyMjJ/u4SEBNG0aVPh4+MjZsyYYdIMq1atEl5eXsLR0VG4u7uLiIiIQhmOHz8uAgMD\\\n",
"RWBgoGjZsqWSDEKYtx0uX74sOnbsKJo0aSI6duworly5UiiDudqhqOP67LPPxGeffSaEECIvL0+M\\\n",
"GDFC+Pj4CH9/f4OjbcyVISYmRrRs2VIEBgaKtm3biu3bt5s8wzPPPCPq1asn7O3thZeXl/jiiy8s\\\n",
"3g4lZbBEO2zbtk0AEAEBAfm1ISEhweJtUV68k5CISKOsvouDiMhWsUATEWkUCzQRkUaxQBMRaRQL\\\n",
"NBGRRrFAExFpFAs0EZFGsUATEWkUCzTZnBUrVsDJyQmnTp3Kf2zMmDFo3LgxLly4oDAZUenwTkKy\\\n",
"OUIItGnTBq1atcKCBQvwwQcf4L333sP27dvRtGlT1fGIjGYVs9kRlYZOp0N0dDS6d++Oxo0bY+bM\\\n",
"mdiyZQuLM1kdnkGTzXrkkUeQnJyMdevWFbmQA5HWsQ+abNKWLVuwf/9+CCFQt25d1XGIyoRn0GRz\\\n",
"9u/fj/DwcMyZMwcJCQnIysrCxo0bVcciKjUWaLIpp06dwiOPPIJhw4Zh2rRpSElJQWBgILZs2YIO\\\n",
"HTqojkdUKizQZDOuXr2K9u3bIywsDPPnz89/vH///jh9+jR27typMB1R6bFAExFpFC8SEhFpFAs0\\\n",
"EZFGsUATEWkUCzQRkUaxQBMRaRQLNBGRRrFAExFpFAs0EZFGsUATEWkUCzQRkUaxQBMRaRQLNBGR\\\n",
"RrFAExFpFAs0EZFGsUATEWkUCzQRkUaxQBMRaRQLNBGRRrFAExFpFAs0EZFGsUATEWkUCzQRkUax\\\n",
"QBMRaRQLNBGRRrFAExFpFAs0EZFGsUATEWkUCzQRkUaxQBMRaRQLNBGRRrFAExFpFAs0EZFGsUAT\\\n",
"EWkUCzQRkUaxQBMRaRQLNBGRRrFAExFpFAs0EZFGsUATEWnU/wGgA4L5O+ZOmAAAAABJRU5ErkJg\\\n",
"gg==\\\n",
"\"\n",
"\n",
"\n",
" /* set a timeout to make sure all the above elements are created before\n",
" the object is initialized. */\n",
" setTimeout(function() {\n",
" anim1ec1960c5a024fac9a7ad4b17405fd20 = new Animation(frames, img_id, slider_id, 20.0,\n",
" loop_select_id);\n",
" }, 0);\n",
" })()\n",
"</script>\n"
],
"text/plain": [
"<matplotlib.animation.FuncAnimation at 0x7ff84006e310>"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#@title\n",
"def animate_gradient_descent(f, fp, f_str, x_0):\n",
" learning_rate = 0.01\n",
" n_frames = 200\n",
" x_min, x_max = -1000, 1000\n",
"\n",
" fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(5, 8), sharex=True)\n",
"\n",
" # plot f\n",
" xs = np.linspace(-2.1, 2.1, 500)\n",
" ys = f(xs)\n",
" ax1.plot(xs, ys)\n",
"\n",
" # plot tangent\n",
" line_tangent, = ax1.plot([x_min, x_max], [0, 0])\n",
"\n",
" # plot f'\n",
" xs = np.linspace(-2.1, 2.1, 500)\n",
" ys = fp(xs)\n",
" ax2.plot(xs, ys, \"r-\")\n",
"\n",
" # plot points A\n",
" point_A1, = ax1.plot(0, 0, \"bo\")\n",
" point_A2, = ax2.plot(0, 0, \"bo\")\n",
"\n",
" show([-2.1, 2.1, -1.4, 1.4], ax=ax1, ylabel=\"$f(x)$\",\n",
2020-04-12 13:32:03 +02:00
" title=r\"$y=f(x)=\" + f_str + \"$ and the tangent at $x=x_\\mathrm{A}$\")\n",
" show([-2.1, 2.1, -4.2, 4.2], ax=ax2, ylabel=\"$f'(x)$\",\n",
2020-04-12 13:32:03 +02:00
" title=r\"$y=f'(x)$ and the slope of the tangent at $x=x_\\mathrm{A}$\")\n",
"\n",
" xs = []\n",
" x = x_0\n",
" for index in range(n_frames):\n",
" xs.append(x)\n",
" slope = fp(x)\n",
" x = x - slope * learning_rate\n",
"\n",
" def update_graph(i):\n",
" x = xs[i]\n",
" f_x = f(x)\n",
" df_dx = fp(x)\n",
" offset = f_x - df_dx * x\n",
" line_tangent.set_data([x_min, x_max],\n",
" [df_dx * x_min + offset, df_dx * x_max + offset])\n",
" point_A1.set_data(x, f_x)\n",
" point_A2.set_data(x, df_dx)\n",
" return line_tangent, point_A1, point_A2\n",
"\n",
" anim = animation.FuncAnimation(fig, update_graph,\n",
" init_func=lambda: update_graph(0),\n",
" frames=n_frames,\n",
" interval=20,\n",
" blit=True)\n",
" plt.close()\n",
" return anim\n",
"\n",
"def f(x):\n",
" return 1/4 * x**4 - x**2 + 1/2\n",
"\n",
"def fp(x):\n",
" return x**3 - 2*x\n",
"\n",
"animate_gradient_descent(f, fp, r\"\\dfrac{1}{4}x^4 - x^2 + \\dfrac{1}{2}\",\n",
" x_0=1/4)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "7L5F3UXga42Y"
},
"source": [
"In this example, we started with $x_0 = \\dfrac{1}{4}$, so Gradient Descent \"rolled down\" towards the minimum value at $x = \\sqrt2$. But if we had started at $x_0 = -\\dfrac{1}{4}$, it would have gone towards $-\\sqrt2$. This illustrates the fact that the initial value is important: depending on $x_0$, the algorithm may converge to a global minimum (hurray!) or to a poor local minimum (boo!) or stay stuck on a plateau, such as a horizontal inflection point (boo!)."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "48eMS_1gJYai"
},
"source": [
"There are many variants of the Gradient Descent algorithm, discussed in Chapter 11 of the book. These are the ones we care about in Deep Learning. They all rely on the derivative of the cost function with regards to the model parameters (we will discuss functions with multiple parameters later in this notebook)."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "vEb15WdbYYiB"
},
"source": [
"# Higher order derivatives\n",
"\n",
2020-04-12 10:28:34 +02:00
"What happens if we try to differentiate the function $f'(x)$? Well, we get the so-called second order derivative, noted $f''(x)$, or $\\dfrac{\\mathrm{d}^2f}{\\mathrm{d}x^2}$. If we repeat the process by differentiating $f''(x)$, we get the third-order derivative $f'''(x)$, or $\\dfrac{\\mathrm{d}^3f}{\\mathrm{d}x^3}$. And we could go on to get higher order derivatives.\n",
"\n",
"What's the intuition behind second order derivatives? Well, since the (first order) derivative represents the instantaneous rate of change of $f$ at each point, the second order derivative represents the instantaneous rate of change of the rate of change itself, in other words, you can think of it as the **acceleration** of the curve: if $f''(x) < 0$, then the curve is accelerating \"downwards\", if $f''(x) > 0$ then the curve is accelerating \"upwards\", and if $f''(x) = 0$, then the curve is locally a straight line. Note that a curve could be going upwards (i.e., $f'(x)>0$) but also be accelerating downwards (i.e., $f''(x) < 0$): for example, imagine the path of a stone thrown upwards, as it is being slowed down by gravity (which constantly accelerates the stone downwards).\n",
"\n",
"Deep Learning generally only uses first order derivatives, but you will sometimes run into some optimization algorithms or cost functions based on second order derivatives."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "TwrWcqj7Ybyk"
},
"source": [
"# Partial derivatives\n",
"\n",
"Up to now, we have only considered functions with a single variable $x$. What happens when there are multiple variables? For example, let's start with a simple function with 2 variables: $f(x,y)=\\sin(xy)$. If we plot this function, using $z=f(x,y)$, we get the following 3D graph. I also plotted some point $\\mathrm{A}$ on the surface, along with two lines I will describe shortly."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"cellView": "form",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 303
},
"colab_type": "code",
"id": "eOzDBgjndchn",
"outputId": "e73007e2-89e1-4904-a577-5ada89669ae9"
},
2022-02-19 10:24:54 +01:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 576x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#@title\n",
"from mpl_toolkits.mplot3d import Axes3D\n",
"\n",
"def plot_3d(f, title):\n",
" fig = plt.figure(figsize=(8, 5))\n",
" ax = fig.add_subplot(111, projection='3d')\n",
"\n",
" xs = np.linspace(-2.1, 2.1, 100)\n",
" ys = np.linspace(-2.1, 2.1, 100)\n",
" xs, ys = np.meshgrid(xs, ys)\n",
" zs = f(xs, ys)\n",
"\n",
" surface = ax.plot_surface(xs, ys, zs,\n",
" cmap=\"coolwarm\",\n",
" linewidth=0.3, edgecolor='k')\n",
"\n",
" ax.set_xlabel(\"$x$\", fontsize=14)\n",
" ax.set_ylabel(\"$y$\", fontsize=14)\n",
" ax.set_zlabel(\"$z$\", fontsize=14)\n",
" ax.set_title(title, fontsize=14)\n",
" return ax\n",
"\n",
"def plot_tangents(ax, x_A, y_A, f, df_dx, df_dy):\n",
" ax.plot3D([x_A], [y_A], f(x_A, y_A), \"bo\", zorder=10)\n",
" x_min, x_max = -2.1, 2.1\n",
" slope_x = df_dx(x_A, y_A)\n",
" offset_x = f(x_A, y_A) - slope_x * x_A\n",
" ax.plot3D([x_min, x_max], [y_A, y_A],\n",
" [slope_x * x_min + offset_x, slope_x * x_max + offset_x], \"b-.\",\n",
" zorder=5)\n",
" y_min, y_max = -2.1, 2.1\n",
" slope_y = df_dy(x_A, y_A)\n",
" offset_y = f(x_A, y_A) - slope_y * y_A\n",
" ax.plot3D([x_A, x_A], [y_min, y_max],\n",
" [slope_y * y_min + offset_y, slope_y * y_max + offset_y], \"r-\",\n",
" zorder=5)\n",
"\n",
"def f(x, y):\n",
" return np.sin(x * y)\n",
"\n",
"def df_dx(x, y):\n",
" return y * np.cos(x * y)\n",
"\n",
"def df_dy(x, y):\n",
" return x * np.cos(x * y)\n",
"\n",
2020-04-12 13:32:03 +02:00
"ax = plot_3d(f, r\"$z = f(x, y) = \\sin(xy)$\")\n",
"plot_tangents(ax, 0.1, -1, f, df_dx, df_dy)\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "_gEEyyJLdFzM"
},
"source": [
"If you were to stand on this surface at point $\\mathrm{A}$ and walk along the $x$ axis towards the right (increasing $x$), your path would go down quite steeply (along the dashed blue line). The slope along this axis would be negative. However, if you were to walk along the $y$ axis, towards the back (increasing $y$), then your path would almost be flat (along the solid red line), at least locally: the slope along that axis, at point $\\mathrm{A}$, would be very slightly positive.\n",
"\n",
"As you can see, a single number is no longer sufficient to describe the slope of the function at a given point. We need one slope for the $x$ axis, and one slope for the $y$ axis. One slope for each variable. To find the slope along the $x$ axis, called the **partial derivative of $f$ with regards to $x$**, and noted $\\dfrac{\\partial f}{\\partial x}$ (with curly $\\partial$), we can differentiate $f(x,y)$ with regards to $x$ while treating all other variables (in this case just $y$) as constants:\n",
"\n",
"$ \\dfrac{\\partial f}{\\partial x} = \\underset{\\epsilon \\to 0}\\lim\\dfrac{f(x+\\epsilon, y) - f(x,y)}{\\epsilon}$\n",
"\n",
"If you use the derivative rules listed earlier (in this example you would just need the product rule and the chain rule), making sure to treat $y$ as a constant, then you will find:\n",
"\n",
"$ \\dfrac{\\partial f}{\\partial x} = y\\cos(xy)$\n",
"\n",
"Similarly, the partial derivative of $f$ with regards to $y$ is defined as:\n",
"\n",
"$ \\dfrac{\\partial f}{\\partial y} = \\underset{\\epsilon \\to 0}\\lim\\dfrac{f(x, y+\\epsilon) - f(x,y)}{\\epsilon}$\n",
"\n",
"All variables except for $y$ are treated like constants (just $x$ in this example). Using the derivative rules, we get:\n",
"\n",
"$ \\dfrac{\\partial f}{\\partial y} = x\\cos(xy)$\n",
"\n",
"We now have equations to compute the slope along the $x$ axis and along the $y$ axis. But what about the other directions? If you were standing on the surface at point $\\mathrm{A}$, you could decide to walk in any direction you choose, not just along the $x$ or $y$ axes. What would the slope be then? Shouldn't we compute the slope along every possible direction?\n",
"\n",
"Well, it can be shown that if all the partial derivatives are defined and continuous in a neighborhood around point $\\mathrm{A}$, then the function $f$ is **totally differentiable** at that point, meaning that it can be locally approximated by a plane $P_\\mathrm{A}$ (the tangent plane to the surface at point $\\mathrm{A}$). In this case, having just the partial derivatives along each axis ($x$ and $y$ in our case) is sufficient to perfectly characterize that plane. Its equation is:\n",
"\n",
2020-04-12 13:32:03 +02:00
"$z = f(x_\\mathrm{A},y_\\mathrm{A}) + (x - x_\\mathrm{A})\\dfrac{\\partial f}{\\partial x}(x_\\mathrm{A},y_\\mathrm{A}) + (y - y_\\mathrm{A})\\dfrac{\\partial f}{\\partial y}(x_\\mathrm{A},y_\\mathrm{A})$\n",
"\n",
"In Deep Learning, we will generally be dealing with well-behaved functions that are totally differentiable at any point where all the partial derivatives are defined, but you should know that some functions are not that nice. For example, consider the function:\n",
"\n",
"$h(x,y)=\\begin{cases}0 \\text { if } x=0 \\text{ or } y=0\\\\1 \\text { otherwise}\\end{cases}$\n",
"\n",
"At the origin (i.e., at $(x,y)=(0,0)$), the partial derivatives of the function $h$ with respect to $x$ and $y$ are both perfectly defined: they are equal to 0. Yet the function can clearly not be approximated by a plane at that point. It is not totally differentiable at that point (but it is totally differentiable at any point off the axes).\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "VS0xnTE_Ym4c"
},
"source": [
"# Gradients\n",
"\n",
"So far we have considered only functions with a single variable $x$, or with 2 variables, $x$ and $y$, but the previous paragraph also applies to functions with more variables. So let's consider a function $f$ with $n$ variables: $f(x_1, x_2, \\dots, x_n)$. For convenience, we will define a vector $\\mathbf{x}$ whose components are these variables:\n",
"\n",
"$\\mathbf{x}=\\begin{pmatrix}\n",
"x_1\\\\\n",
"x_2\\\\\n",
"\\vdots\\\\\n",
"x_n\n",
"\\end{pmatrix}$ \n",
"\n",
"Now $f(\\mathbf{x})$ is easier to write than $f(x_1, x_2, \\dots, x_n)$.\n",
"\n",
"The gradient of the function $f(\\mathbf{x})$ at some point $\\mathbf{x}_\\mathrm{A}$ is the vector whose components are all the partial derivatives of the function at that point. It is noted $\\nabla f(\\mathbf{x}_\\mathrm{A})$, or sometimes $\\nabla_{\\mathbf{x}_\\mathrm{A}}f$:\n",
"\n",
"$\\nabla f(\\mathbf{x}_\\mathrm{A}) = \\begin{pmatrix}\n",
"\\dfrac{\\partial f}{\\partial x_1}(\\mathbf{x}_\\mathrm{A})\\\\\n",
"\\dfrac{\\partial f}{\\partial x_2}(\\mathbf{x}_\\mathrm{A})\\\\\n",
"\\vdots\\\\\\\n",
"\\dfrac{\\partial f}{\\partial x_n}(\\mathbf{x}_\\mathrm{A})\\\\\n",
"\\end{pmatrix}$"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "u2YNS1ZqsKeg"
},
"source": [
2020-04-12 13:32:03 +02:00
"Assuming the function is totally differentiable at the point $\\mathbf{x}_\\mathbf{A}$, then the surface it describes can be approximated by a plane at that point (as discussed in the previous section), and the gradient vector is the one that points towards the steepest slope on that plane."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "GF8nLfs08iuR"
},
"source": [
2020-04-12 13:32:03 +02:00
"## Gradient Descent, revisited\n",
"\n",
"In Deep Learning, the Gradient Descent algorithm we discussed earlier is based on gradients instead of derivatives (hence its name). It works in much the same way, but using vectors instead of scalars: simply start with a random vector $\\mathbf{x}_0$, then compute the gradient of $f$ at that point, and perform a small step in the opposite direction, then repeat until convergence. More precisely, at each step $t$, compute $\\mathbf{x}_t = \\mathbf{x}_{t-1} - \\eta \\nabla f(\\mathbf{x}_{t-1})$. The constant $\\eta$ is the learning rate, typically a small value such as $10^{-3}$. In practice, we generally use more efficient variants of this algorithm, but the general idea remains the same.\n",
"\n",
"In Deep Learning, the letter $\\mathbf{x}$ is generally used to represent the input data. When you _use_ a neural network to make predictions, you feed the neural network the inputs $\\mathbf{x}$, and you get back a prediction $\\hat{y} = f(\\mathbf{x})$. The function $f$ treats the model parameters as constants. We can use more explicit notation by writing $\\hat{y} = f_\\mathbf{w}(\\mathbf{x})$, where $\\mathbf{w}$ represents the model parameters and indicates that the function relies on them, but treats them as constants.\n",
"\n",
"However, when _training_ a neural network, we do quite the opposite: all the training examples are grouped in a matrix $\\mathbf{X}$, all the labels are grouped in a vector $\\mathbf{y}$, and both $\\mathbf{X}$ and $\\mathbf{y}$ are treated as constants, while $\\mathbf{w}$ is treated as variable: specifically, we try to minimize the cost function $\\mathcal L_{\\mathbf{X}, \\mathbf{y}}(\\mathbf{w}) = g(f_{\\mathbf{X}}(\\mathbf{w}), \\mathbf{y})$, where $g$ is a function that measures the \"discrepancy\" between the predictions $f_{\\mathbf{X}}(\\mathbf{w})$ and the labels $\\mathbf{y}$, where $f_{\\mathbf{X}}(\\mathbf{w})$ represents the vector containing the predictions for each training example. Minimizing the loss function is usually performed using Gradient Descent (or a variant of GD): we start with random model parameters $\\mathbf{w}_0$, then we compute $\\nabla \\mathcal L(\\mathbf{w}_0)$ and we use this gradient vector to perform a Gradient Descent step, then we repeat the process until convergence. It is crucial to understand that the gradient of the loss function is with regards to the model parameters $\\mathbf{w}$ (_not_ the inputs $\\mathbf{x}$)."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "Ldp74ZLCZjm5"
},
"source": [
"# Jacobians\n",
"\n",
"Until now we have only considered functions that output a scalar, but it is possible to output vectors instead. For example, a classification neural network typically outputs one probability for each class, so if there are $m$ classes, the neural network will output an $d$-dimensional vector for each input.\n",
"\n",
"In Deep Learning we generally only need to differentiate the loss function, which almost always outputs a single scalar number. But suppose for a second that you want to differentiate a function $\\mathbf{f}(\\mathbf{x})$ which outputs $d$-dimensional vectors. The good news is that you can treat each _output_ dimension independently of the others. This will give you a partial derivative for each input dimension and each output dimension. If you put them all in a single matrix, with one column per input dimension and one row per output dimension, you get the so-called **Jacobian matrix**.\n",
"\n",
"$\n",
"\\mathbf{J}_\\mathbf{f}(\\mathbf{x}_\\mathbf{A}) = \\begin{pmatrix}\n",
"\\dfrac{\\partial f_1}{\\partial x_1}(\\mathbf{x}_\\mathbf{A})\n",
"&& \\dfrac{\\partial f_1}{\\partial x_2}(\\mathbf{x}_\\mathbf{A})\n",
"&& \\dots\n",
"&& \\dfrac{\\partial f_1}{\\partial x_n}(\\mathbf{x}_\\mathbf{A})\\\\\n",
"\\dfrac{\\partial f_2}{\\partial x_1}(\\mathbf{x}_\\mathbf{A})\n",
"&& \\dfrac{\\partial f_2}{\\partial x_2}(\\mathbf{x}_\\mathbf{A})\n",
"&& \\dots\n",
"&& \\dfrac{\\partial f_2}{\\partial x_n}(\\mathbf{x}_\\mathbf{A})\\\\\n",
"\\vdots && \\vdots && \\ddots && \\vdots \\\\\n",
"\\dfrac{\\partial f_m}{\\partial x_1}(\\mathbf{x}_\\mathbf{A})\n",
"&& \\dfrac{\\partial f_m}{\\partial x_2}(\\mathbf{x}_\\mathbf{A})\n",
"&& \\dots\n",
"&& \\dfrac{\\partial f_m}{\\partial x_n}(\\mathbf{x}_\\mathbf{A})\n",
"\\end{pmatrix}\n",
"$\n",
"\n",
"The partial derivatives themselves are often called the **Jacobians**. It's just the first order partial derivatives of the function $\\mathbf{f}$."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "fAx8-JfDgtVY"
},
"source": [
"# Hessians\n",
"\n",
"Let's come back to a function $f(\\mathbf{x})$ which takes an $n$-dimensional vector as input and outputs a scalar. If you determine the equation of the partial derivative of $f$ with regards to $x_i$ (the $i^\\text{th}$ component of $\\mathbf{x}$), you will get a new function of $\\mathbf{x}$: $\\dfrac{\\partial f}{\\partial x_i}$. You can then compute the partial derivative of this function with regards to $x_j$ (the $j^\\text{th}$ component of $\\mathbf{x}$). The result is a partial derivative of a partial derivative: in other words, it is a **second order partial derivatives**, also called a **Hessian**. It is noted $\\mathbf{x}$: $\\dfrac{\\partial^2 f}{\\partial x_jx_i}$. If $i\\neq j$ then it is called a **mixed second order partial derivative**.\n",
2020-04-12 10:28:34 +02:00
"Or else, if $j=i$, it is noted $\\dfrac{\\partial^2 f}{\\partial {x_i}^2}$\n",
"\n",
"Let's look at an example: $f(x, y)=\\sin(xy)$. As we showed earlier, the first order partial derivatives of $f$ are: $\\dfrac{\\partial f}{\\partial x}=y\\cos(xy)$ and $\\dfrac{\\partial f}{\\partial y}=x\\cos(xy)$. So we can now compute all the Hessians (using the derivative rules we discussed earlier):\n",
"\n",
2020-04-12 10:28:34 +02:00
"* $\\dfrac{\\partial^2 f}{\\partial x^2} = \\dfrac{\\partial f}{\\partial x}\\left[y\\cos(xy)\\right] = -y^2\\sin(xy)$\n",
"* $\\dfrac{\\partial^2 f}{\\partial y\\,\\partial x} = \\dfrac{\\partial f}{\\partial y}\\left[y\\cos(xy)\\right] = \\cos(xy) - xy\\sin(xy)$\n",
"* $\\dfrac{\\partial^2 f}{\\partial x\\,\\partial y} = \\dfrac{\\partial f}{\\partial x}\\left[x\\cos(xy)\\right] = \\cos(xy) - xy\\sin(xy)$\n",
2020-04-12 10:28:34 +02:00
"* $\\dfrac{\\partial^2 f}{\\partial y^2} = \\dfrac{\\partial f}{\\partial y}\\left[x\\cos(xy)\\right] = -x^2\\sin(xy)$\n",
"\n",
"Note that $\\dfrac{\\partial^2 f}{\\partial x\\,\\partial y} = \\dfrac{\\partial^2 f}{\\partial y\\,\\partial x}$. This is the case whenever all the partial derivatives are defined and continuous in a neighborhood around the point at which we differentiate.\n",
"\n",
"The matrix containing all the Hessians is called the **Hessian matrix**:\n",
"\n",
"$\n",
"\\mathbf{H}_f(\\mathbf{x}_\\mathbf{A}) = \\begin{pmatrix}\n",
2020-04-12 10:28:34 +02:00
"\\dfrac{\\partial^2 f}{\\partial {x_1}^2}(\\mathbf{x}_\\mathbf{A})\n",
"&& \\dfrac{\\partial^2 f}{\\partial x_1\\, \\partial x_2}(\\mathbf{x}_\\mathbf{A})\n",
"&& \\dots\n",
"&& \\dfrac{\\partial^2 f}{\\partial x_1\\, \\partial x_n}(\\mathbf{x}_\\mathbf{A})\\\\\n",
"\\dfrac{\\partial^2 f}{\\partial x_2\\,\\partial x_1}(\\mathbf{x}_\\mathbf{A})\n",
"&& \\dfrac{\\partial^2 f}{\\partial {x_2}^2}(\\mathbf{x}_\\mathbf{A})\n",
"&& \\dots\n",
"&& \\dfrac{\\partial^2 f}{\\partial x_2\\, \\partial x_n}(\\mathbf{x}_\\mathbf{A})\\\\\n",
"\\vdots && \\vdots && \\ddots && \\vdots \\\\\n",
"\\dfrac{\\partial^2 f}{\\partial x_n\\,\\partial x_1}(\\mathbf{x}_\\mathbf{A})\n",
"&& \\dfrac{\\partial^2 f}{\\partial x_n\\,\\partial x_2}(\\mathbf{x}_\\mathbf{A})\n",
"&& \\dots\n",
"&& \\dfrac{\\partial^2 f}{\\partial {x_n}^2}(\\mathbf{x}_\\mathbf{A})\\\\\n",
"\\end{pmatrix}\n",
"$"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "PS5P5-frqleX"
},
"source": [
"There are great optimization algorithms which take advantage of the Hessians, but in practice Deep Learning almost never uses them. Indeed, if a function has $n$ variables, there are $n^2$ Hessians: since neural networks typically have several millions of parameters, the number of Hessians would exceed thousands of billions. Even if we had the necessary amount of RAM, the computations would be prohibitively slow."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "IOpOUgSyWhou"
},
"source": [
"## A few proofs\n",
"\n",
"Let's finish by proving all the derivative rules we listed earlier. You don't have to go through all these proofs to be a good Deep Learning practitioner, but it may help you get a deeper understanding of derivatives."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "vdbMt5GSW2og"
},
"source": [
"## Constant: $f(x)=c$\n",
"\n",
"$\n",
"\\begin{align*}\n",
"f'(x) & = \\underset{\\epsilon \\to 0}\\lim\\dfrac{f(x+\\epsilon) - f(x)}{\\epsilon} && \\quad\\text{by definition}\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim\\dfrac{c - c}{\\epsilon} && \\quad \\text{using }f(x) = c \\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim 0 && \\quad \\text{since }c - c = 0\\\\\n",
"& = 0 && \\quad \\text{since the limit of a constant is that constant}\n",
"\\end{align*}\n",
"$\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "f6XsnZ_FGMpN"
},
"source": [
"## Product rule: $f(x)=g(x)h(x)$\n",
"\n",
"$\n",
"\\begin{align*}\n",
"f'(x) & = \\underset{\\epsilon \\to 0}\\lim\\dfrac{f(x+\\epsilon) - f(x)}{\\epsilon} && \\quad\\text{by definition}\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim\\dfrac{g(x+\\epsilon)h(x+\\epsilon) - g(x)h(x)}{\\epsilon} && \\quad \\text{using }f(x) = g(x)h(x) \\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim\\dfrac{g(x+\\epsilon)h(x+\\epsilon) - g(x)h(x+\\epsilon) + g(x)h(x + \\epsilon) - g(x)h(x)}{\\epsilon} && \\quad \\text{subtracting and adding }g(x)h(x + \\epsilon)\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim\\dfrac{g(x+\\epsilon)h(x+\\epsilon) - g(x)h(x+\\epsilon)}{\\epsilon} + \\underset{\\epsilon \\to 0}\\lim\\dfrac{g(x)h(x + \\epsilon) - g(x)h(x)}{\\epsilon} && \\quad \\text{since the limit of a sum is the sum of the limits}\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim{\\left[\\dfrac{g(x+\\epsilon) - g(x)}{\\epsilon}h(x+\\epsilon)\\right]} \\,+\\, \\underset{\\epsilon \\to 0}\\lim{\\left[g(x)\\dfrac{h(x + \\epsilon) - h(x)}{\\epsilon}\\right]} && \\quad \\text{factorizing }h(x+\\epsilon) \\text{ and } g(x)\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim{\\left[\\dfrac{g(x+\\epsilon) - g(x)}{\\epsilon}h(x+\\epsilon)\\right]} \\,+\\, g(x)\\underset{\\epsilon \\to 0}\\lim{\\dfrac{h(x + \\epsilon) - h(x)}{\\epsilon}} && \\quad \\text{taking } g(x) \\text{ out of the limit since it does not depend on }\\epsilon\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim{\\left[\\dfrac{g(x+\\epsilon) - g(x)}{\\epsilon}h(x+\\epsilon)\\right]} \\,+\\, g(x)h'(x) && \\quad \\text{using the definition of h'(x)}\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim{\\left[\\dfrac{g(x+\\epsilon) - g(x)}{\\epsilon}\\right]}\\underset{\\epsilon \\to 0}\\lim{h(x+\\epsilon)} + g(x)h'(x) && \\quad \\text{since the limit of a product is the product of the limits}\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim{\\left[\\dfrac{g(x+\\epsilon) - g(x)}{\\epsilon}\\right]}h(x) + h(x)g'(x) && \\quad \\text{since } h(x) \\text{ is continuous}\\\\\n",
"& = g'(x)h(x) + g(x)h'(x) && \\quad \\text{using the definition of }g'(x)\n",
"\\end{align*}\n",
"$\n",
"\n",
"Note that if $g(x)=c$ (a constant), then $g'(x)=0$, so the equation simplifies to:\n",
"\n",
"$f'(x)=c \\, h'(x)$"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "l_qgG_SjOEyD"
},
"source": [
"## Chain rule: $f(x)=g(h(x))$\n",
"\n",
"$\n",
"\\begin{align*}\n",
"f'(x) & = \\underset{\\epsilon \\to 0}\\lim\\dfrac{f(x+\\epsilon) - f(x)}{\\epsilon} && \\quad\\text{by definition}\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim\\dfrac{g(h(x+\\epsilon)) - g(h(x))}{\\epsilon} && \\quad \\text{using }f(x) = g(h(x))\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim{\\left[\\dfrac{h(x+\\epsilon)-h(x)}{h(x+\\epsilon)-h(x)}\\,\\dfrac{g(h(x+\\epsilon)) - g(h(x))}{\\epsilon}\\right]} && \\quad \\text{multiplying and dividing by }h(x+\\epsilon) - h(x)\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim{\\left[\\dfrac{h(x+\\epsilon)-h(x)}{\\epsilon}\\,\\dfrac{g(h(x+\\epsilon)) - g(h(x))}{h(x+\\epsilon)-h(x)}\\right]} && \\quad \\text{swapping the denominators}\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim{\\left[\\dfrac{h(x+\\epsilon)-h(x)}{\\epsilon}\\right]} \\underset{\\epsilon \\to 0}\\lim{\\left[\\dfrac{g(h(x+\\epsilon)) - g(h(x))}{h(x+\\epsilon)-h(x)}\\right]} && \\quad \\text{the limit of a product is the product of the limits}\\\\\n",
"& = h'(x) \\underset{\\epsilon \\to 0}\\lim{\\left[\\dfrac{g(h(x+\\epsilon)) - g(h(x))}{h(x+\\epsilon)-h(x)}\\right]} && \\quad \\text{using the definition of }h'(x)\\\\\n",
"& = h'(x) \\underset{\\epsilon \\to 0}\\lim{\\left[\\dfrac{g(u) - g(v)}{u-v}\\right]} && \\quad \\text{using }u=h(x+\\epsilon) \\text{ and } v=h(x)\\\\\n",
"& = h'(x) \\underset{u \\to v}\\lim{\\left[\\dfrac{g(u) - g(v)}{u-v}\\right]} && \\quad \\text{ since } h \\text{ is continuous, so } \\underset{\\epsilon \\to 0}\\lim{u}=v\\\\\n",
"& = h'(x)g'(v) && \\quad \\text{ using the definition of } g'(v)\\\\\n",
"& = h'(x)g'(h(x)) && \\quad \\text{ since } v = h(x)\n",
"\\end{align*}\n",
"$"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "bRimto0DexEG"
},
"source": [
"## Exponential: $f(x)=\\exp(x)=e^x$\n",
"\n",
"There are several equivalent definitions of the number $e$. One of them states that $e$ is the unique positive number for which $\\underset{\\epsilon \\to 0}\\lim{\\dfrac{e^\\epsilon - 1}{\\epsilon}}=1$. We will use this in this proof:\n",
"\n",
"$\n",
"\\begin{align*}\n",
"f'(x) & = \\underset{\\epsilon \\to 0}\\lim\\dfrac{f(x+\\epsilon) - f(x)}{\\epsilon} && \\quad\\text{by definition}\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim\\dfrac{e^{x+\\epsilon} - e^x}{\\epsilon} && \\quad \\text{using }f(x) = e^x\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim\\dfrac{e^x e^\\epsilon - e^x}{\\epsilon} && \\quad \\text{using the fact that } x^{a+b}=x^a x^b\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim{\\left[e^x\\dfrac{e^\\epsilon - 1}{\\epsilon}\\right]} && \\quad \\text{factoring out }e^x\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim{e^x} \\, \\underset{\\epsilon \\to 0}\\lim{\\dfrac{e^\\epsilon - 1}{\\epsilon}} && \\quad \\text{the limit of a product is the product of the limits}\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim{e^x} && \\quad \\text{since }\\underset{\\epsilon \\to 0}\\lim{\\dfrac{e^\\epsilon - 1}{\\epsilon}}=1\\\\\n",
"& = e^x && \\quad \\text{since } e^x \\text{ does not depend on }\\epsilon\n",
"\\end{align*}\n",
"$\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "ddqGVIxKkPga"
},
"source": [
"## Logarithm: $f(x) = \\ln(x)$\n",
"\n",
"Another definition of the number $e$ is:\n",
"\n",
"$e = \\underset{n \\to \\infty}\\lim\\left(1+\\dfrac{1}{n}\\right)^n$\n",
"\n",
"By defining $\\epsilon = \\dfrac{1}{n}$, we can rewrite the previous definition as:\n",
"\n",
"$e = \\underset{\\epsilon \\to 0}\\lim\\left(1+\\epsilon\\right)^{1/\\epsilon}$\n",
"\n",
"This will come in handy in a second:\n",
"\n",
"$\n",
"\\begin{align*}\n",
"f'(x) & = \\underset{\\epsilon \\to 0}\\lim\\dfrac{f(x+\\epsilon) - f(x)}{\\epsilon} && \\quad\\text{by definition}\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim\\dfrac{\\ln(x+\\epsilon) - \\ln(x)}{\\epsilon} && \\quad \\text{using }f(x) = \\ln(x)\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim\\dfrac{\\ln\\left(\\dfrac{x+\\epsilon}{x}\\right)}{\\epsilon} && \\quad \\text{since }\\ln(a)-\\ln(b)=\\ln\\left(\\dfrac{a}{b}\\right)\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim{\\left[\\dfrac{1}{\\epsilon} \\, \\ln\\left(1 + \\dfrac{\\epsilon}{x}\\right)\\right]} && \\quad \\text{just moving things around a bit}\\\\\n",
"& = \\underset{\\epsilon \\to 0}\\lim{\\left[\\dfrac{1}{xu} \\, \\ln\\left(1 + u\\right)\\right]} && \\quad \\text{defining }u=\\dfrac{\\epsilon}{x} \\text{ and thus } \\epsilon=xu\\\\\n",
"& = \\underset{u \\to 0}\\lim{\\left[\\dfrac{1}{xu} \\, \\ln\\left(1 + u\\right)\\right]} && \\quad \\text{replacing } \\underset{\\epsilon \\to 0}\\lim \\text{ with } \\underset{u \\to 0}\\lim \\text{ since }\\underset{\\epsilon \\to 0}\\lim u=0\\\\\n",
"& = \\underset{u \\to 0}\\lim{\\left[\\dfrac{1}{x} \\, \\ln\\left((1 + u)^{1/u}\\right)\\right]} && \\quad \\text{since }a\\ln(b)=\\ln(a^b)\\\\\n",
"& = \\dfrac{1}{x}\\underset{u \\to 0}\\lim{\\left[\\ln\\left((1 + u)^{1/u}\\right)\\right]} && \\quad \\text{taking }\\dfrac{1}{x} \\text{ out since it does not depend on }\\epsilon\\\\\n",
"& = \\dfrac{1}{x}\\ln\\left(\\underset{u \\to 0}\\lim{(1 + u)^{1/u}}\\right) && \\quad \\text{taking }\\ln\\text{ out since it is a continuous function}\\\\\n",
"& = \\dfrac{1}{x}\\ln(e) && \\quad \\text{since }e=\\underset{u \\to 0}\\lim{(1 + u)^{1/u}}\\\\\n",
"& = \\dfrac{1}{x} && \\quad \\text{since }\\ln(e)=1\n",
"\\end{align*}\n",
"$\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "Vp8dwDsrq6Tn"
},
"source": [
"## Power rule: $f(x)=x^r$, with $r \\neq 0$\n",
"\n",
"Let's define $g(x)=e^x$ and $h(x)=\\ln(x^r)$. Since $a = e^{\\ln(a)}$, we can rewrite $f$ as $f(x)=g(h(x))$, which allows us to use the chain rule:\n",
"\n",
"$f'(x) = h'(x)g'(h(x))$\n",
"\n",
"We know the derivative of the exponential: $g'(x)=e^x$. We also know the derivative of the natural logarithm: $\\ln'(x)=\\dfrac{1}{x}$ so $h'(x)=\\dfrac{r}{x}$. Therefore:\n",
"\n",
"$f'(x) = \\dfrac{r}{x}\\exp\\left({\\ln(x^r)}\\right)$\n",
"\n",
"Since $a = \\exp(\\ln(a))$, this equation simplifies to:\n",
"\n",
"$f'(x) = \\dfrac{r}{x} x^r$\n",
"\n",
"And finally:\n",
"\n",
"$f'(x) = rx^{r - 1}$\n",
"\n",
"Note that the power rule works for any $r \\neq 0$, including negative numbers and real numbers. For example:\n",
"\n",
"* if $f(x) = \\dfrac{1}{x} = x^{-1}$, then $f'(x)=-x^{-2}=-\\dfrac{1}{x^2}$.\n",
2020-04-20 04:50:27 +02:00
"* if $f(x) = \\sqrt(x) = x^{1/2}$, then $f'(x)=\\dfrac{1}{2}x^{-1/2}=\\dfrac{1}{2\\sqrt{x}}$"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "tgj5_lMHX3mG"
},
"source": [
"## Multiplicative inverse: $f(x)=\\dfrac{1}{h(x)}$\n",
"First, let's define $g(x) = \\dfrac{1}{x}$. This leads to $f(x)=g(h(x))$.\n",
"Now we can use the chain rule:\n",
"\n",
"$f'(x) = h'(x)g'(h(x))$\n",
"\n",
"Since $g(x)=x^{-1}$, we can use the power rule to find $g'(x)=-\\dfrac{1}{x^2}$\n",
"\n",
"Finally, we get:\n",
"\n",
"$f'(x) = -\\dfrac{h'(x)}{h^2(x)}$"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "8xeXRy13czHW"
},
"source": [
"## Quotient rule: $f(x)=\\dfrac{g(x)}{h(x)}$\n",
"\n",
"Let's rewrite $f(x)$ as a product: $f(x)=g(x)u(x)$ with $u(x)=\\dfrac{1}{h(x)}$\n",
"\n",
"We can now use the product rule to get:\n",
"\n",
"$f(x) = g'(x)u(x) + g(x)u'(x)$\n",
"\n",
"Replacing $u(x)$ with $\\dfrac{1}{h(x)}$ and using the result of the previous section to replace $u'(x)$ with $\\dfrac{-h'(x)}{h^2(x)}$, we get:\n",
"\n",
"$f(x) = g'(x)\\dfrac{1}{h(x)} + g(x)\\dfrac{-h'(x)}{h^2(x)}$\n",
"\n",
"Now we multiply and divide the first term by $h(x)$:\n",
"\n",
"$f(x) = \\dfrac{g'(x)h(x)}{h^2(x)} - \\dfrac{g(x)h'(x)}{h^2(x)}$\n",
"\n",
"And finally:\n",
"\n",
"$f(x) = \\dfrac{g'(x)h(x) - g(x)h'(x)}{h^2(x)}$"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "3vlr8D3VdAYd"
},
"source": [
"## Sin: $f(x)=\\sin(x)$\n",
"\n",
"For this proof we will first need to prove that $\\underset{\\theta \\to 0}\\lim\\dfrac{\\sin(\\theta)}{\\theta}=1$. One way to do that is to consider the following diagram:\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"cellView": "form",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 357
},
"colab_type": "code",
"id": "dDEQiqFFowrb",
"outputId": "0c3c302d-5593-457a-b82e-6ac7c0f48b5a"
},
2022-02-19 10:24:54 +01:00
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 432x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#@title\n",
"angle = np.pi/5\n",
"A_pos = [np.cos(angle), np.sin(angle)]\n",
"\n",
"fig, ax = plt.subplots(figsize=(6, 6))\n",
"\n",
"from functools import partial\n",
"ax_text = partial(ax.text, color=\"w\", fontsize=18, zorder=4,\n",
" horizontalalignment='center', verticalalignment='center')\n",
"\n",
"circle = plt.Circle((0, 0), 1,\n",
" zorder=0, facecolor='w', edgecolor='k', linestyle=\"--\")\n",
"triangle1 = plt.Polygon([[0, 0], [1, np.tan(angle)], [1, 0]],\n",
" zorder=1, facecolor='r', edgecolor='k')\n",
"arc_points = np.array([[0, 0]] + [[np.cos(a), np.sin(a)] \n",
" for a in np.linspace(0, angle, 50)])\n",
"ax.fill(arc_points[:, 0], arc_points[:, 1],\n",
" zorder=2, facecolor='c', edgecolor='k')\n",
"triangle2 = plt.Polygon([[0, 0], A_pos, [A_pos[0], 0]],\n",
" zorder=3, facecolor='b', edgecolor='k')\n",
"ax_text(2*np.cos(angle)/3, np.sin(angle)/4, \"A\")\n",
"ax_text((1+np.cos(angle))/2, np.sin(angle)/4, \"B\")\n",
"ax_text((1+np.cos(angle))/2, 0.9*np.sin(angle), \"C\")\n",
"ax_text(0.25*np.cos(angle/2), 0.25*np.sin(angle/2), r\"$\\theta$\")\n",
"arc = mpl.patches.Arc([0, 0], 2*0.2, 2*0.2, theta1=0, theta2=angle*180/np.pi,\n",
" zorder=5, color='y', linewidth=3)\n",
"ax_text(0.03, -0.05, \"0\", color='k')\n",
"ax_text(1.03, -0.05, \"1\", color='k')\n",
"\n",
"ax.axhline(y=0, color='k', zorder=4)\n",
"ax.axvline(x=0, color='k', zorder=4)\n",
"ax.axvline(x=1, color='k', zorder=4, linewidth=1, linestyle='--')\n",
"ax.axis('equal')\n",
"ax.axis([-0.1, 1.1, -0.1, 1.1])\n",
"ax.axis('off')\n",
"ax.add_artist(circle)\n",
"ax.add_artist(triangle1)\n",
"ax.add_artist(triangle2)\n",
"ax.add_patch(arc)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "0w_55TJGUMxe"
},
"source": [
"The circle is the unit circle (radius=1).\n",
"\n",
"Assuming $0 < \\theta < \\dfrac{\\pi}{2}$, the area of the blue triangle (area $\\mathrm{A}$) is equal to its height ($\\sin(\\theta)$), times its base ($\\cos(\\theta)$), divided by 2. So $\\mathrm{A} = \\dfrac{1}{2}\\sin(\\theta)\\cos(\\theta)$.\n",
"\n",
"The unit circle has an area of $\\pi$, so the circular sector (in the shape of a pizza slice) has an area of A + B = $\\pi\\dfrac{\\theta}{2\\pi} = \\dfrac{\\theta}{2}$.\n",
"\n",
"Next, the large triangle (A + B + C) has an area equal to its height ($\\tan(\\theta)$) multiplied by its base (1) divided by 2, so A + B + C = $\\dfrac{\\tan(\\theta)}{2}$.\n",
"\n",
"When $0 < \\theta < \\dfrac{\\pi}{2}$, we have $\\mathrm{A} < \\mathrm{A} + \\mathrm{B} < \\mathrm{A} + \\mathrm{B} + \\mathrm{C}$, therefore:\n",
"\n",
"$\\dfrac{1}{2}\\sin(\\theta)\\cos(\\theta) < \\dfrac{\\theta}{2} < \\dfrac{\\tan(\\theta)}{2}$\n",
"\n",
"We can multiply all the terms by 2 to get rid of the $\\dfrac{1}{2}$ factors. We can also divide by $\\sin(\\theta)$, which is stricly positive (assuming $0 < \\theta < \\dfrac{\\pi}{2}$), so the inequalities still hold:\n",
"\n",
"$cos(\\theta) < \\dfrac{\\theta}{\\sin(\\theta)} < \\dfrac{\\tan(\\theta)}{\\sin(\\theta)}$\n",
"\n",
"Recall that $\\tan(\\theta)=\\dfrac{\\sin(\\theta)}{\\cos(\\theta)}$, so the last term simplifies like so:\n",
"\n",
"$cos(\\theta) < \\dfrac{\\theta}{\\sin(\\theta)} < \\dfrac{1}{\\cos(\\theta)}$\n",
"\n",
"Since all these terms are strictly positive when $0 < \\theta < \\dfrac{\\pi}{2}$, we can take their inverse and change the direction of the inequalities:\n",
"\n",
"<hr />\n",
"\n",
"**Inequalities (1)**\n",
"\n",
"$\\dfrac{1}{cos(\\theta)} > \\dfrac{\\sin(\\theta)}{\\theta} > \\cos(\\theta)$\n",
"\n",
"assuming $0 < \\theta < \\dfrac{\\pi}{2}$\n",
"<hr />\n",
"\n",
"Now since $\\sin(-\\theta)=-\\sin(\\theta)$, we see that $\\dfrac{\\sin(-\\theta)}{-\\theta}=\\dfrac{\\sin(\\theta)}{\\theta}$. Moreover, $\\cos(-\\theta)=\\cos(\\theta)$, and therefore $\\dfrac{1}{\\cos(-\\theta)}=\\dfrac{1}{\\cos(\\theta)}$. Replacing the terms in the inequalities (1), we get:\n",
"\n",
"$\\dfrac{1}{cos(-\\theta)} > \\dfrac{\\sin(-\\theta)}{-\\theta} > \\cos(-\\theta)$\n",
"\n",
"assuming $0 < \\theta < \\dfrac{\\pi}{2}$\n",
"\n",
"In other words, the inequalities (1) also hold for $-\\dfrac{\\pi}{2} < \\theta < 0$:\n",
"\n",
"<hr />\n",
"\n",
"**Inequalities (2)**\n",
"\n",
"$\\dfrac{1}{cos(\\theta)} > \\dfrac{\\sin(\\theta)}{\\theta} > \\cos(\\theta)$\n",
"\n",
"assuming $-\\dfrac{\\theta}{2} < \\theta < \\dfrac{\\pi}{2}$ and $\\theta \\neq 0$\n",
"<hr />\n",
"\n",
"Since $\\cos$ is a continuous function, $\\underset{\\theta \\to 0}\\lim\\cos(\\theta)=\\cos(0)=1$. Similarly, $\\underset{\\theta \\to 0}\\lim\\dfrac{1}{cos(\\theta)}=\\dfrac{1}{\\cos(0)}=1$.\n",
"\n",
"Since the inequalities (2) tell us that $\\dfrac{\\sin(\\theta)}{\\theta}$ is squeezed between $\\dfrac{1}{cos(\\theta)}$ and $\\cos(\\theta)$ when $\\theta$ is close to 0, and since both of these approach 1 when $\\theta$ approaches 0, we can use the **squeeze theorem** (also called the **sandwich theorem**) to conclude that $\\dfrac{\\sin(\\theta)}{\\theta}$ must also approach 1 when $\\theta$ approaches 0.\n",
"\n",
"<hr />\n",
"\n",
"We have proven that:\n",
"\n",
"$\\underset{\\theta \\to 0}\\lim\\dfrac{\\sin(\\theta)}{\\theta}=1$\n",
"\n",
"<hr />"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "VazHS7zeifmv"
},
"source": [
"Now the second thing we need to prove before we can tackle the derivative of the $\\sin$ function is the fact that $\\underset{\\theta \\to 0}\\lim\\dfrac{\\cos(\\theta) - 1}{\\theta}=0$. Here we go:\n",
"\n",
"$\n",
"\\begin{align*}\n",
"\\underset{\\theta \\to 0}\\lim\\dfrac{\\cos(\\theta) - 1}{\\theta} & = \\underset{\\theta \\to 0}\\lim\\dfrac{\\cos(\\theta) - 1}{\\theta}\\frac{\\cos(\\theta) + 1}{\\cos(\\theta) + 1} && \\quad \\text{ multiplying and dividing by }\\cos(\\theta)+1\\\\\n",
"& = \\underset{\\theta \\to 0}\\lim\\dfrac{\\cos^2(\\theta) - 1}{\\theta(\\cos(\\theta) + 1)} && \\quad \\text{ since }(a-1)(a+1)=a^2-1\\\\\n",
"& = \\underset{\\theta \\to 0}\\lim\\dfrac{\\sin^2(\\theta)}{\\theta(\\cos(\\theta) + 1)} && \\quad \\text{ since }\\cos^2(\\theta) - 1 = \\sin^2(\\theta)\\\\\n",
"& = \\underset{\\theta \\to 0}\\lim\\dfrac{\\sin(\\theta)}{\\theta}\\dfrac{\\sin(\\theta)}{\\cos(\\theta) + 1} && \\quad \\text{ just rearranging the terms}\\\\\n",
"& = \\underset{\\theta \\to 0}\\lim\\dfrac{\\sin(\\theta)}{\\theta} \\, \\underset{\\theta \\to 0}\\lim\\dfrac{\\sin(\\theta)}{\\cos(\\theta) + 1} && \\quad \\text{ since the limit of a product is the product of the limits}\\\\\n",
"& = \\underset{\\theta \\to 0}\\lim\\dfrac{\\sin(\\theta)}{\\cos(\\theta) + 1} && \\quad \\text{ since } \\underset{\\theta \\to 0}\\lim\\dfrac{\\sin(\\theta)}{\\theta}=1\\\\\n",
"& = \\dfrac{0}{1+1} && \\quad \\text{ since } \\underset{\\theta \\to 0}\\lim\\sin(\\theta)=0 \\text{ and } \\underset{\\theta \\to 0}\\lim\\cos(\\theta)=1\\\\\n",
"& = 0\\\\\n",
"\\end{align*}\n",
"$\n",
"\n",
"<hr />\n",
"\n",
"We have proven that:\n",
"\n",
"$\\underset{\\theta \\to 0}\\lim\\dfrac{\\cos(\\theta) - 1}{\\theta}=0$\n",
"\n",
"<hr />"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "T1fYGYy2lO-f"
},
"source": [
"With all that, we are finally ready to prove the fact that the derivative of the $\\sin$ function is the $\\cos$ function:"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "Qg1q6fdlou9m"
},
"source": [
"$\n",
"\\begin{align*}\n",
"f'(x) & = \\underset{\\theta \\to 0}\\lim\\dfrac{f(x+\\theta) - f(x)}{\\theta} && \\quad\\text{by definition}\\\\\n",
"& = \\underset{\\theta \\to 0}\\lim\\dfrac{\\sin(x+\\theta) - \\sin(x)}{\\theta} && \\quad \\text{using }f(x) = \\sin(x)\\\\\n",
"& = \\underset{\\theta \\to 0}\\lim\\dfrac{\\cos(x)\\sin(\\theta) + \\sin(x)\\cos(\\theta) - \\sin(x)}{\\theta} && \\quad \\text{since } cos(a+b)=\\cos(a)\\sin(b)+\\sin(a)\\cos(b)\\\\\n",
"& = \\underset{\\theta \\to 0}\\lim\\dfrac{\\cos(x)\\sin(\\theta)}{\\theta} + \\underset{\\theta \\to 0}\\lim\\dfrac{\\sin(x)\\cos(\\theta) - \\sin(x)}{\\theta} && \\quad \\text{since the limit of a sum is the sum of the limits}\\\\\n",
"& = \\cos(x)\\underset{\\theta \\to 0}\\lim\\dfrac{\\sin(\\theta)}{\\theta} + \\sin(x)\\underset{\\theta \\to 0}\\lim\\dfrac{\\cos(\\theta) - 1}{\\theta} && \\quad \\text{bringing out } \\cos(x) \\text{ and } \\sin(x) \\text{ since they don't depend on }\\theta\\\\\n",
"& = \\cos(x)\\underset{\\theta \\to 0}\\lim\\dfrac{\\sin(\\theta)}{\\theta} && \\quad \\text{since }\\underset{\\theta \\to 0}\\lim\\dfrac{\\cos(\\theta) - 1}{\\theta}=0\\\\\n",
"& = \\cos(x) && \\quad \\text{since }\\underset{\\theta \\to 0}\\lim\\dfrac{\\sin(\\theta)}{\\theta}=1\\\\\n",
"\\end{align*}\n",
"$\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "oSZq5EGNn6ER"
},
"source": [
"## Cosine: $f(x)=\\cos(x)$\n",
"\n",
"Since we have proven that $\\sin'(x)=\\cos(x)$, proving that $\\cos'(x)=-\\sin(x)$ will be much easier.\n",
"\n",
"$\n",
"\\begin{align*}\n",
"f'(x) & = \\underset{\\theta \\to 0}\\lim\\dfrac{f(x+\\theta) - f(x)}{\\theta} && \\quad\\text{by definition}\\\\\n",
"& = \\underset{\\theta \\to 0}\\lim\\dfrac{\\cos(x+\\theta) - \\cos(x)}{\\theta} && \\quad \\text{using }f(x) = \\cos(x)\\\\\n",
"& = \\underset{\\theta \\to 0}\\lim\\dfrac{\\sin\\left(x+\\dfrac{\\pi}{2}+\\theta\\right) - \\sin\\left(x+\\dfrac{\\pi}{2}\\right)}{\\theta} && \\quad \\text{since }\\cos(x) = \\sin\\left(x+\\dfrac{\\pi}{2}\\right)\\\\\n",
"& = \\underset{\\theta \\to 0}\\lim\\dfrac{\\sin(z+\\theta) - \\sin(z)}{\\theta} && \\quad \\text{using }z = x + \\dfrac{\\pi}{2}\\\\\n",
"& = \\sin'(z) && \\quad \\text{using the definition of }\\sin'(z)\\\\\n",
"& = \\cos(z) && \\quad \\text{since we proved that }\\sin'(z)=\\cos(z)\\\\\n",
"& = \\cos\\left(x + \\dfrac{\\pi}{2}\\right) && \\quad \\text{using the definition of }z\\\\\n",
"& = -\\sin(x) && \\quad \\text{using this well-known rule of trigonometry}\n",
"\\end{align*}\n",
"$\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "nwzF_EXtqqe1"
},
"source": [
"## Tangent: $f(x) = \\tan(x)$\n",
"\n",
"Since $\\tan(x)=\\dfrac{\\sin(x)}{\\cos(x)}$, we can use the quotient rule to get:\n",
"\n",
"$f'(x) = \\dfrac{\\sin'(x)\\cos(x) - \\sin(x)\\cos'(x)}{\\cos^2(x)}$\n",
"\n",
"Since $\\sin'(x)=\\cos(x)$ and $\\cos'(x)=-\\sin(x)$, we get:\n",
"\n",
"$f'(x) = \\dfrac{\\cos^2(x) + \\sin^2(x)}{\\cos^2(x)}$\n",
"\n",
"And finally, since $\\cos^2(x) + \\sin^2(x) = 1$, we get:\n",
"\n",
"$f'(x) = \\dfrac{1}{\\cos^2(x)}$\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"colab": {
"collapsed_sections": [],
2020-04-12 08:59:42 +02:00
"name": "math_differential_calculus",
"provenance": [],
"toc_visible": true
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
2021-10-17 03:27:34 +02:00
"version": "3.8.12"
},
"pycharm": {
"stem_cell": {
"cell_type": "raw",
"metadata": {
"collapsed": false
},
"source": []
}
}
},
"nbformat": 4,
"nbformat_minor": 1
}