{ "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": [ "\n", " \n", " \n", "
\n", " \"Open\n", " \n", " \n", "
" ] }, { "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" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "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" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "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", "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" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n", " \n", "
\n", " \n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "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", " 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": [ "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", "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" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n", " \n", "
\n", " \n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "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": [ "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", "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", "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", "* 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" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n", " \n", "
\n", " \n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "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": [ "
\n", "\n", "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", "
" ] }, { "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": [ "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", "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-ml2/blob/master/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", "
\n", "\n", "$f'(x) = \\underset{\\epsilon \\to 0}\\lim\\dfrac{f(x + \\epsilon) - f(x)}{\\epsilon}$\n", "\n", "
" ] }, { "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": [ "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", "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": [ "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" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n", " \n", "
\n", " \n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "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", " 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", " 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", "animate_tangent(f, fp, \"x^2\")" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "-cFmqj7LMtJI" }, "source": [ "
\n", "\n", "**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", "$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", "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", "So we get the following equation for the tangent:\n", "\n", "$y = f(x_\\mathrm{A}) + f'(x_\\mathrm{A})(x - x_\\mathrm{A})$\n", "\n", "For example, the tangent to the $y=x^2$ curve is given by:\n", "\n", "$y = {x_\\mathrm{A}}^2 + 2x_\\mathrm{A}(x - x_\\mathrm{A}) = 2x_\\mathrm{A}x - x_\\mathrm{A}^2$\n", "
" ] }, { "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$                             | Derivative $f'$                                                   |\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", "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" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n", " \n", "
\n", " \n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "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" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEnCAYAAABG91+tAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3dd3wUdf7H8dcnFQikQEiAQOi9BAjSFMFyCpyIXfEs2PthuaKe55Wfv7Ocvzv1LKgoigXs5RRFhUSk9xZCIPTQUyEJIcnm+/tjl71cTNkkuzObzef5eMyD3ZnZmTffZPaTmfnOjBhjUEoppQCC7A6glFLKf2hRUEop5aZFQSmllJsWBaWUUm5aFJRSSrlpUVBKKeWmRUEppZSbFgWllFJuWhSUagQROVtEvhSRAyJiRGS63ZmUagwtCko1TmtgCzADOGlzFqUaTfQ2F0p5h4gUAvcaY96yO4tSDaV7Ckr5EREJEpHVIvKxDevuIiKpIrJVRDaKyGVWZ1D2C7E7gFLqv9wF7MSebbMcuN8Ys0FE4oC1IvKtMabYhizKJrqnoPyaiNwmIrtEpFxEXhWRGBE5IiI967GMj0XkQV/m9AbXF/FlwGt2rN8Yc8gYs8H1+iiQB8TakUXZR4uC8lsi0g94BXgI6OL691FgvjFmZz0W9RfgMRGJ8n5Kr/o78Eegwu4gIjICCAX2e3m5f3b10qo8HPbmOlTjaFFQ/uxiYIsx5jNjzCGcX5a3Am/UZyHGmM3ALuA670f0DhE5GzDGmGV+kKUdMAe4xXjQE0VE3hKRP9djFRlAx0rD4IbkVL6hRUHVm4hkVT0cIyKDRaRERAZ4aR3bgaeBJNdfk58Bk3EWhqVV5r1SRE6JSNdK454XkZ0iEu8a9SUwzRvZqqy7tYgMFZGhOLenRNf7xHpmHAv8QkT2APOASSJSr+LnQdY620lEwoHPgCd9WKDKjTGHKw3HfLQe1RDGGB10qNcAfATMrTJuIfBiNfM+ChTWMYyr5nNxOP+i/APQAYgEnge+q2ZeAdYAr7ve/wY4CvSuNM9EoBRo6a2Mrs9OAEw1w1v1zVhlmR/74OdWawbX9LnAn+u53Lc8/QzwZ6AYOADsxlkAe9j9O63DfwbtfaQaYjlw9+k3InIJMAy4qpp5ZwIf1rG8A9WMOw70AJYaYw671tMVOFR1RmOMEZFHga9FZCfOQnKuMWZHpdkO4jxG3gln7x5vZMQYk4rzy7RWHmb0KQ8ynAlcDWxy/UwBrjfOw2/eshKYDmzDWfgfA5aJyEBjTI4X16Mayu6qpEPTG3Ae6jBAWyAcyMTZldGb6xjhWkd0pXELgFdr+cwynN0qJ1UzrbdreYNsbrsaM9ZjGU9Q/d5J5WGCrzLw8z2rMpx7YXXuWVWzrNY491YetPPnosN/Bt1TUA2xFueXwAicewjlwEvVzej6y/TROpY3yRjzU5VxQ4G9xpj8SuOygZga1nMukITzr/Yj1czS1vXvz45fNzSjiHh8OwBjjHiQ0VPPAe/WMc++6kZ6KUPVPaunce5JvVBpXLV7VlUZYwpFJA1n0VZ+QIuCqjdjzCkRWQ9MAW4ErjXGlNUwe0MPzQwFNlQZtx7noYf/IiJJwKfAfcAvgSeBC6vMNgg4aIyp7ouwQRmNMXUeNqpnRo8YY7JxFsh68VYGY0wukFtpuSeAXGNMZgMytQD6ASn1/azyEbt3VXRomgPwT5w9gRb4aPlLqHLyEmfXRQfQrtK4rji/sB93vR/kyjWhymffAt7wcZs8ivPQzYtVxnuU0cfZfJaB+p1ofhYYD3QHRgFf4Tx/1NWqttCh9kG7pKqG2oDzS8XrVwqLiABDqLKnYJwnPFcB17jmawt8C3xljPmra54tOHtHPVlpeS2AS4HXvZ210jpGA7cBm6qM9yijL/lDhko64+zhlIFzr+UUMNoYs9fiHKoGepdU1SAi8h2wwxhzj8XrnYiza+oAY4zDw8/cA0w1xlzgo0xRwDqcReFxnBfc3euLdSnla7qnoDzmuoNnvIj8HuehnMeszmCM+RbnSe3O9fhYGc7j6L7yGs7rChb5cB1KWUJPNKv6OBtYhHPX/3JjTJ4dIYwxL9Q913/N77MbzInIbUAv4HpfrUMpK2lRUB4zzgu1dO/SRUT6An/D2Se/1O48SnmDnlNQqoFcz2OejbNH1GnBOHsgVQARxphTNkRTqsG0KCjVQCISzc/PbcwGduDcg0gzuoGpJkYPHynVQMZ5tXXlK64RkSKcF3JtsSeVUo2jx4eVUkq56eEjpZRSbrqnoJRSyq3Jn1OIjY013bp1q3F6UVERERER1gWqJ83XOP6aLyMjA4fDwYABXnkQnU/4a9udpvkap658a9euzTbGtP/ZBLtvvtTYITk52dQmJSWl1ul203yN46/5xo8fb5KSkuyOUSt/bbvTNF/j1JUPWGP0hnhKKaVqo0VBKaWUmxYFpZRSbloUlFJKuWlRUEop5aZFQSmllJsWBaWUUm5aFJRSSrlpUVBKKeWmRUEppZSbFgWllFJuWhSUUkq5aVFQSinlpkVBKaWUmxYFpZRSbloUlFJKuWlRUEop5aZFQSmllJsWBaWUUm5aFJRSSrlpUVBKKeWmRUEppZSbFgWllFJuWhSUUkq5aVFQSinlpkVBKaWUm2VFQUTeFJGjIrKlhukiIi+ISKaIbBKR4VZlU0op5WTlnsJbwMRapk8CeruG24FXLMiklFKqEsuKgjFmMZBbyyxTgTnGaQUQLSIdrUmnlFIKIMTuAJUkAPsrvc9yjTtUdUYRuR3n3gTx8fGkpqbWuNDCwsJap9tN8zWOv+bLz8/H4XD4ZbbT/LXtTtN8jdPgfMYYywagG7ClhmlfA2dVer8QSK5rmcnJyaY2KSkptU63m+ZrHH/NN378eJOUlGR3jFr5a9udpvkap658wBpTzXeqP/U+ygK6VHrfGThoUxallGqW/KkofAnc4OqFNBooMMb87NBRVdmFp3yfTCmlAsijn22ucZpl5xREZC4wAYgVkSzgT0AogDFmJjAfmAxkAsXATZ4sN6+4zBdxlVIqIOUWlfL+yn01TresKBhjptUx3QD31He5JWUOSsoctAgNbnA2pZRqLjZl5dc63Z8OHzVY2sECuyMopVSTsDmr9u/LgCgKG/ZrUVBKKU9szCqgR/uIGqc3+aIQGhzExv217w4ppZRyXoKwYX8+Q7tE1zhPky8KLUOD2VjHMTKllFJwIP8k2YWnGBbIRaFVWDB7c4rJKyq1O4pSSvm1Da6jKkmBXBRahjl7HeneglJK1W7DvnzCQoLo1yGyxnmafFFoFRaMCGzUk81KKVWrDfvzGdQpkrCQmr/6m3xRCBKhV/vWdfa9VUqp5qzMUcHmAwUM7RJT63xNviiA8/jYxqz80zfSU0opVUXG4ROcKq9gaGLN5xMggIpCdmEpB/JP2h1FKaX80nrXSebaeh5BgBSFoZ2d/8kNer2CUkpVa8O+fNpFhNE5pmWt8wVEUejboQ3hIUGs36dFQSmlqrNhfx5Du0QjIrXOFxBFISwkiKQu0azZm2d3FKWU8jvHS8rYeayo1iuZTwuIogCQ3DWGtAMFlJQ57I6ilFJ+ZZOry35tF62dFjhFITGG8grDpjruAKiUUs3N2r15iDSzojC8q7Pv7Vo9hKSUUv9lzd5c+sa3IaplaJ3zBkxRaBsRRo/YCNbuzbU7ilJK+Y1yRwXr9uYxolvtF62dFjBFAZznFdbuzdOL2JRSymXb4RMUlTo4o1tbj+YPuKKQV1zG7uwiu6MopZRfOH1IPblrM91TAD2voJRSp63Zm0fHqBYkRNd+0dppAVUUerZvTWSLENbt06KglFIAa/bkktw1ps6L1k4LqKIQFCQM7xrDmj1aFJRS6kD+SQ4VlHh8PgECrCiA83qFHUcLyS/WJ7EppZq3NXucvTE9PZ8AAVgURnZ3VsTVureglGrm1uzJo3V4CP06tPH4MwFXFJK6RBMWEsTKXTl2R1FKKVut3pPLsMRoQoI9/6oPuKLQIjSYYV2iWbFbi4JSqvkqKjNkHDlRr0NHEIBFAWBUj3ZsPXic4yVldkdRSilbbM9zYAyM7tGuXp8LyKIwuntbKsx/TrIopVRzsy3HQXhIkEe3y64sIIvCsMQYQoOFlbu0KCilmqf03AqGJ8bQIjS4Xp+ztCiIyEQRyRCRTBF5uJrpE0SkQEQ2uIbHG7KelmHBDO0SzYrdWhSUUs1PfnEp+09UMKZn/Q4dgYVFQUSCgZeAScAAYJqIDKhm1p+MMUNdw18bur5R3dux5UABJ8v15nhKqeZl5e5cDPU/nwDW7imMBDKNMbuMMaXAPGCqr1Y2qkdbHBWGHXn6JDalVPOyYlcOYUGQ1CWq3p8N8UGemiQA+yu9zwJGVTPfGBHZCBwEfmOMSWvIypK7xhASJGTkVjTk40p5xBhDwckyDuaXcDD/JNmFpygpc3Aw/yTFJw0zf9xJRHgIEWHBtI0Io0vbViREt6z3cV6l6mP5zhx6xQQRHlL/3zMri0J1d2OqemxnHdDVGFMoIpOBz4HeP1uQyO3A7QDx8fGkpqZWu8JukUJadmmN0/1BYWGh5msEq/MVlhrScx3sLqhg73EHe45XUFRNz+fDucUAPPXNtp9NEyCmhdA9KojuUUH0iAqmZ3QQ4cGe3bDMW/Rn2zj+mq+w1LDtcDEXdTUNymdlUcgCulR63xnn3oCbMeZ4pdfzReRlEYk1xmRXme814DWAESNGmAkTJlS7wrWlGbyUksnw0WcS2aLux9DZITU1lZry+4Pmns8YQ9rB4yxIO8zi7cfYdKAAYyA0WOjboQ1TekTRK641naJb0jGqBXGRLWgVGszU5c9QUFDA8r9eSNEpB0WnyskuPMW+3GL2555k57FCNmXls3Z7MVBGeEgQY3q249x+cZzXP97j2xw3RnP/2TaWv+b7dsshYB1JHVo2KJ+VRWE10FtEugMHgGuAayvPICIdgCPGGCMiI3Ge82jwpcln9YrlX4syWb4zhwsHdmhEdNXc7M8t5vP1B/h8wwF2HisiSGBol2hmnNebcb3bMzghirCQmk/JBYkgQKuwEFqFhdC+TTjdYiMYUeVulXlFpWzYn8/iHcdI2XaUx79I4/Ev0hjdoy2XD+/MpMEdaR1u5WaqmrrlO3NoGRpM96iGnTK27LfNGFMuIvcCC4Bg4E1jTJqI3OmaPhO4ArhLRMqBk8A1phHP1hyWGEN4MCzZka1FQdXJGMPyXTnMXrqHH9KPYAyM7NaWm8/qzuRBHYmJCPP6OmMiwjinXxzn9IvjT1MGsutYIV9tOsSn67L47ceb+NOXaVyR3Jmbz+xOt9gIr69fBZ6lO3MY0S2GkKCTDfq8pX+CGGPmA/OrjJtZ6fWLwIveWl9YSBB92wazNDO77plVs1VRYfh68yFeSslk2+ETxLQK5e4JPZk2MpHOMa0szdKjfWt+fV5v7ju3F+v25fH+yv3MXbWPd1bs5Rf947lrQk+GJdbvXjaq+TiYf5LMo4VcPaILVOxr0DICfr90YLtg5m4r4kD+SUuO06qmo6LC8G3aYZ7/YQcZR07QK641z1wxhIuTOtneO0hESO7aluSubfn9xL68s2Iv767Yy3cvH+H8/nE8dEFf+neMtDWj8j9Ldjj/AD67T3sObWtYUQjI21xUNqidc+NesuOYzUmUP1m7N49LX17K3e+to6yighemDWPB/Wdz1YgutheEquIiW/DQBX1Z8vtz+c0FfVi5O5fJL/zEjHnrOVTQsEMEKjAt3nGMuDbh9Ilv3eBlBPyeQqfWQlybcJZk5nD1GYl2x1E2O1xQwlPfpPP5hoPER4bz7JVJXDosgeAga7uDNkREeAj3ntub60d349XFO3ljyW6+SzvCvef24tZx3RvUJ10FDkeFYUlmNuf1i/f4eczVCfiiICKc1SuW1O3HqKgwBDWBjV95X0WF4b2Ve3nqm22UVRjuPacXd03oSUQT7NkT1SqU303sx7SRiTzx9Vb+viCDD9fs52+XDubMXrF2x1M22XKggPziMs7u07jfgYA/fARwVu9YcotK2XroeN0zq4CzO7uIa15fwR+/SGNYYgw/PDCe31zYt0kWhMq6tG3Fq9ePYM7NIwkS4VezVvLIp5s5oc8RaZZ+ch0ib+wfBs2jKLga6acd2gupOamoMLy+eBcTn1tM+qHjPHP5EN65ZSSJ7aztUeRrZ/dpz/xfj+O2cd35YPU+LvznYvcXhGo+Fu/IZlBCJLGtwxu1nGZRFOIiWzCgYyQp247aHUVZ5OiJEm54cxX/Oz+dcb3b88OD47nqjC6NOtbqz1qGBfOHXw7g47vG0jIsmOvfWMWT36RTWq73/moOCk+Vs25vHuN6t2/0sppFUQA4t18ca/flUVCsu9aBLjXjKJOe+4k1e3N58rLBvH5DMvGRLeyOZYnhiTF8dd84rh2VyKs/7uLKV5ezL6fY7ljKx5bvzKG8wjCud+PPKTWbonBOvzgcFYYfdbc6YJU7Kvjb/HSmz15N+zbh/Pves5g2MjFg9w5q0jIsmL9dOpiXfzWc3ccKmfzCT3y16WDdH1RN1qJtR4kICya5a+MvbGw2RWFol2jaRoTpIaQAlVN4iuveWMlri3dx3ehEPr/nTHrHt7E7lq0mD+7I/Bnj6NuhDfe+v54n56dT7tDDSYHGGMOibUc4u097r3RLbjZFIThIGN+nPakZR3FU6NPYAsmWAwVc/OJS1u3L5/+uTOKJSwb73QVodukc04q5t43mutGJvLp4F9NnryavqNTuWMqLthw4zpHjpzivf7xXltdsigI4DyHlFZexYX++3VHqZcWKFYhIg4dAtuxgOZe/sgxjDJ/cOZbLkzvbHcnvhIUE8cQlg3n68sGs2p3LxS8tYetB7Z5dE0+3q3POOccvtrWF244gAuf0bfxJZmhmRWF87/YEB0mTO4S0cuVKjDENHgKRMYZ/fL+d1zadYmiXaL687ywGd67/owebk6vPSOSDO0ZTWl7BlTOXselYud2R/NJzzz3n0XaVkpLiF9vawvSjDE+MoV0ju6Ke1qyKQlSrUJITY1jUhIqCw+EgNNQ/HxBkl9LyCh76cCMvLNzBuIQQ3r11VKP7ZjcXwxJj+PLes+jaLoLn1p3i/ZUNu2laoGpq29uR4yVsPlDAuf3ivLbMZlUUAM7tH8fWQ8ebzI3Eli5dytixY+2O4TcKisu44c2VfLr+AA/9og83DwojNLjZ/Ro3SnxkCz68cwyDYoN59LPNPPlNOhV6ng1oetvbwnTnH7jne+l8AjTDovCLAc7G+y7tiM1JPLNx40aGDh1qdwy/sD+3mMtnLmPt3jz+eXUS953XO+DPmfhK6/AQZgwL51eu6xnum7uekjKH3bFs19S2t4XpR+gc07JRd0WtqtkVhZ7tW9M7rjXfbDlkd5QGe/LJJznjjDOIjIykffv2TJkyhS1bttgdy6e2HznB5a8s4+jxEt65ZRSXDtMTyo0VHCQ8cckgHpnUj683H+Km2aspPKXnGSrz523tZKmDpTuzOb9/4+6KWlWzKwoAkwZ1YNXuXHIKT9kdpVbbt2+nb9++PxufmprK3XffzbJly1i0aBEhISGcf/755Obm2pDS99bvy+OqV5cD8NGdYxndo53NiQKHiHDH+J48d/VQVu3J5drXV5DbTLusVre9+fO29uP2o5SUVbiPfnhL075NZANdOKgDLyzK5If0I371jIU5c+bQrl07fvnLXwLOX8jp06f/bL4FCxb81/t33nmHqKgoli5dypQpU6yIapmlmdncNmcNsa3DefeWUQF3Mzt/ccmwBFqHh3DP++u4+tXlvHPLKDpEBfatQTzZ3mrb1tq0sffiyK83H6ZtRBijurf16nKb5Z7CgI6RdGnbkm+3HLY7itupU6eIi4vj/fffd48rKysjLKzuh8WfOHGCiooKYmIC69m9C9IOc9Ps1XSJacXHd47RguBj5w+I5+2bR3KooIQrZi5jT3aR3ZF8pqHbm79sayVlDhalH+HCgR0I8XJHi2ZZFESESYM6siQzm+N+cu/58PBwJk6cyN69eykvLycnJ4fYWM9ubjVjxgyGDh3KmDFjfJzSOp+vP8Dd761jYEIkH9wxmrhmckM7u43u0Y65t42muNTBFTOXs+PICbsj+URDtzd/2dYWbz9GUamDyYM7eH3ZHhUFEckSkQerjBssIiUiMsDrqSxw4cAOlDmMzy9ke+yxx+q8KjI1NdU9/7hx41i8eDHfffcdF1xwQZ3Lf/DBB1myZAmffPIJwcGBcWuHT9dl8eCHGzijWwzv3jKK6FZ17y0p7xncOYoP7xhNkMA1r60g43BgFgao3/bmT9vaN1sOE90q1Cfn1zzdU1gOnFFl3HPALGPMVu9GssawLtHER4bzzWbfHkK6//77SU9Pr3F4++23GTlypHv+qVOn8sUXX5CXl1fnLuoDDzzA3LlzWbRoET169PDp/8MqH6/N4qGPNjKmZztmTx/Z5J+O1lT1imvDvNtHExIsTHt9BekB+tRCT7c3f9rWTpU7+GHrES4c0MEn1+g0qCiIyCXAMOBPXk9kkaAg5yGklIyjPn18YWxsLP369atxSExMpFWr/xwrHzVqFCtWrCA8vPYrdGfMmMH777/PokWL6Nevn8/yW+nD1fv57ccbOatXLG/ceAYtwwJjz6ep6tG+NR/cPobwkCCmvb6CtIMFdkfyOk+2N3/b1pbsyObEqXIm+eDQEXheFFYAPUWkrYiEA88CfzXG5PgklUUuHtqJU+UVLPCjC9lEhCFDhjBhwoQa57nnnnuYPXs2c+fOJSYmhsOHD3P48GEKCwutC+pl81bt43efbOKsXrG8fsMIvcupn+gWG8G820fTKjSYa19fyZYDgVUY6tre/HFb+3rzISJbhDC2Z+MfqFMdT4vCWqAUGAHcD5QDL/kkkYWGdYmma7tWfLHhgN1R/stTTz1Fz549a5z+8ssvc+LECc477zw6duzoHp599lkLU3rP+yv38fCnmxnfp70WBD/UtV0EH9wxhtbhIVz7+go2ZwVWYahte/O3be1kqYPv0py9jsJCfNNPyKMDtsaYUyKyHpgC3Ahca4zxj247jSAiTE3qxIspmRw9UUJcG//o4dKuXe0njwLpzqfzVu3j0c82c07f9rxyXbIWBD/VpW0rPrhjNNe8toLr3ljJvNtH079jpN2xvKK27a22ba1yBxGrfJ9+hMJT5Vw23HdX9Nen1CwH7gGWG2O+8lEey108NIEKA//e2HRve9FUfb7+AI98tpkJfdsz83otCP7u9AN7WoUFc92slWQeDdxeSf7qs3VZJES39PoFa5XVpyhsACqAB+uasSnpFdeaQQmRfOlnh5AC3bdbDvPQRxsZ1b0tM69L9spjBJXvdWnbivduHUVQkHDt6ysD+gI3f3PsxCkW78hm6tBOBAX57kaQ9SkKvwJeNcak+SqMXS4ZmsDGrAJ26y+4JVIzjnLf3HUM6RzFrBvP0D2EJqZH+9a8d+soyisMv5q1kqy8YrsjNQtfbjyIo8Jw2fAEn66n1qIgIkEiEi8ivwcGA481ZmUiMlFEMkQkU0Qerma6iMgLrumbRGR4Y9bnqSlJnRBx7pop31qxK4c73llL77g2vHXTSFrrdQhNUp/4Nrxzy0hOlJRx7esrOVxQYnekgPfZ+iwGJ0TRK86391yqa0/hbOAQMB243BiT19AViUgwzh5Lk4ABwLRqroaeBPR2DbcDrzR0ffURH9mCs3u356O1WTj0YSM+s25fHre8tZrEtq1455aRRLVsOk+4Uj83sFMUc24ZRW5RKdfOWsGxE/591+GmbMeRE2w5cJxLh/l2LwHqKArGmFRjTJAxpr8xZlkj1zUSyDTG7DLGlALzgKlV5pkKzDFOK4BoEenYyPV6ZNrILhwqKOHH7U3nUZ1NSdrBAqa/uYrYNuG8d+sorz1PVtlraJdoZt90BofyS7hu1spme9ttX/tobRYhQcKUpE4+X5eV++4JwP5K77OAUR7Mk4Bzb6VaGRkZtV7olZ+fT3R0dJ3hjIGcfXlc90UIfeKtuyWup/ns4o18J8scbD14nCCBiE5RXPW19/pX+2v7bdiwgfLy8lp/N+3mzbZrebKMnw6foPfLwfTvGEmIF06E+uvP9jSr8lUYw/p9+bRpEcKVy57x+HMNzWdlUajut6TqsRpP5kFEbsd5eInQ0FDy8/NrXKnD4ah1emWRoZBbVEp2bj4+ui7kZ2rKl5mZCUCvXr2sCVKD+rRfdcoqYO/xCgASWgdxsvA43nw6dmPz+Up5eTnGGL/Mdpq32y6htZB1opy0rDy6tAmisXXB7p9tXdugVfmOlxrKHBVEBJXXa30NzmeMsWQAxgALKr1/BHikyjyvAtMqvc8AOta23OTkZFOblJSUWqdXtutYoen6+6/Mi4t2ePyZxqop3/jx48348eMty1GT+rRfVQfyis3YJxeaoX9ZYLYdOu69UJU0Jp8vjR8/3iQlJdkdo1a+aLtvNh8yPR752lzz6nJzsrS8Ucuy+2db1zZoVb4rZy4z455eZByOinp9rq58wBpTzXeqlc9TWA30FpHuIhIGXAN8WWWeL4EbXL2QRgMFxhjLrirrHhvBqO5t+WD1fir0hHOjHD1Rwq9mreT4yTLm3DyKvh3sfUqVssbEQR34x1VJrNidw13vrqW0vMLuSE1a5tETrNqdy7WjEn16bUJllhUFY0w5cC+wAEgHPjTGpInInSJyp2u2+cAuIBN4HbjbqnynTRuZyL7cYn7KzLZ61QEjr6iU62et4nBBCW/dfAaDO0fZHUlZaOrQBJ68dDApGceYMW895Q4tDA313sp9hAYLVyT77rYWVVn65DVjzHxjTB9jTE9jzP+6xs00xsx0vTbGmHtc0wcbY9ZYmQ9g0uAOxLYOZ/bS3VavOiAcLynjhjdXsTuniFk3jiC5q+8ux1f+65qRiTx+0QC+2XKY3368Sfe8G6CkzMEna7OYOKgjsRb21tMrh6oIDwnm+tFd+ecP28k8esLnF4rU5KqrrrJlvY1RXFrOzbNXk37oOK/dkMyZvXxza1/VNNx8VndOljn4+4IMWoQG87dLBxU+fXQAABYtSURBVCFizSEQb7B7G/xkXRbHS8q5blSipevVolCNX41O5KXUTGYv3cP/XjrYlgx33235kbNGKSlzcPuctazbl8e/pg3n3H7xdkdSfuCec3pRXFrOSyk7aRkazB8v6t9kCoOd22BFhWHWT7sZ0jmKkT68+V11LD181FTEtg7nkqGd+GRdFvnF9lyMU1xcTHFx07inTJmjgnvfX8eSzGyeuSKJXw6x5HpD1UT85oK+3HRmN95cupv/+2673XE8Zuc2+EP6EXZnF3HbuB6WF1EtCjW46czulJRV8P6qfbasf/LkyUyePNmWddeHo8LwwAcb+CH9KP8zdaClJ8RU0yAiPH7RAKaN7MKLKZm8lJJpdySP2LkNzvppNwnRLZk0yDeP3KyNFoUa9O8Yydie7Xh72R5Kyhx2x/FLFRWGhz/ZxFebDvHIpH5cP6ab3ZGUnxIRnrhkMJcM7cTfF2Tw5hLtyFGTDfvzWbUnl5vP6k5IsPVf0VoUanH3hF4cOX6Kj9bq3VOrMsbwl3+n8dHaLH59Xm/uGF/z40OVAggOEp69MomJAzvw16+2Ms+mvXB/9/riXbRpEcLVZ3SxZf1aFGpxZq92JHeN4ZWUTL0IpxJjDE9/m8Hby/dy61ndeeD83nZHUk1ESHAQL0wbxoS+7Xnks818vl4fblXZjiMnmL/lENeN7mrbbeW1KNRCRPj1eb05WFDCx7q34PZSSiYzf9zJtaMS+cMvm05vEuUfwkKCmHldMqO7t+Ohjzby7ZbDdkfyGy8syqRlaDC3jethWwYtCnU4u3csSV2ieSklkzILr8ycPn0606dPt2x9npr10y6e/W47lw5L4ImpTavfufIfLUKDmXXjCJI6R3Hf3HWkZPjfLeut3gZ3HDnBV5sOcuPYbrSNCLNsvVVpUaiDiDDjvF4cyD/JpxY+mc0fi8IbS3bzxNfpTBrUgb9fMcSye7GowBQRHsLsm0bSt0Mb7nxnLct35tgd6b9YvQ0+v3CH7XsJoEXBI+f0jSOpSzT//H4HJ0ut6YmUnZ1Ndrb/3H/pzSW7+Z+vtjJpUAdemDbMll4RKvBEtQxlzs2j6NquFbe8vZq1exv8cEevs3Ib3JSVz1ebDnHTmfbuJYAWBY+ICI9O6sfh4yW8adE9ka644gquuOIKS9ZVl9lLd/PXr7YycaCzIIRqQVBe1DYijHdvGUVcm3Cmz17FlgMFdkcCrNsGjTH8bX467SLCuNMPevHp1u2hUT3acX7/eF5J3Ul2YfN5Fu0Pe8v4y7+3cuHAeP51rRYE5RtxkS1477bRRLYI5drXV7Bhv/8+nMjbFqYfZcWuXGac35s2Lex/brlu4fXw8KR+nCxz8I/vm86l+o0xZ/ke3k0v5YIB8fxr2nAtCMqnEqJb8sEdo4luFcZ1s1ayPS/wLxotLa/gyW/S6REbwbSR1t74ria6lddDr7jW3DCmK3NX7WNjgP8lM/PHnTz+RRrD4oJ58drhhFn1fFLVrHWOacWHd4whrk04z64pYVmAP9dk1pJd7DxWxB8vGuA3f3T5R4om5MFf9KF963Ae+3wLjgC8R7wxhmcXZPDUN9uYktSJe4aGa0FQluoQ1YJ5d4ymfUvhprdWk+qH3VW9ISuvmBcW7uDCgfGc0y/O7jhuurXXU5sWoTx20QA2Hyjg3RV7fbaeu+66i7vuustny69ORYXhL//eyospmVxzRheeu3ooIdrtVNkgrk0LHh7Zkp7tW3P7nLV8l2b9BW6+3AaNMfz5yzQE4fEpA32yjobSotAAU4Z05Ow+7Xn6223szSnyyTquvvpqrr76ap8suzrljgp+98km3lq2h1vP6s6Tlw0mWAuCslGbMGHubaPp3ymSu95bx0dr9lu6fl9ug59vOMAP6Ud54Be9SYhu6ZN1NJQWhQYQEZ5yfWn+9iPfPGpw//797N9vzUZwstTB3e+t4+O1Wdx/fm+9dYXyG1GtQnnv1lGM6dGO3368iZdSMjHGmsO2vtoGDxeU8PgXaSR3jeGWs+y9UK06WhQaqFN0S/40ZSCr9uQya8kury//+uuv5/rrr/f6cqvKLjzFtNdX8H36Ef40ZQD3n99HC4LyK63DQ3hz+hlMdd12+09fpllyPs8X22BFheF3n2yizFHBs1cm+eXeuD6OsxEuH57AD1uP8My3GSR3bUty1xi7I9XLrmOFTJ+9miPHS3jlV8lMtOGBHkp5IiwkiH9eNZT4yBa8tngXx06c4h9XDaVlWLDd0erllR93snj7Mf7nkkF0j42wO061dE+hEUSEp68YQqfoltz7/jpyi+x5dGdDrN6Ty2WvLKPwVDlzbx+tBUH5vaAg4dHJ/Xnsl/35Nu0wV766jIP5J+2O5bHlO3P4v+8ymJLUietG+cc1CdXRotBIUS1DeflXw8kpKuWe99b5/XMXjDG8s2Iv015bQUyrMD67eyzDE5vWHo5q3m4d14NZN4xgT3YxF7+4lLV7c+2OVKf9ucXcN3cd3WIjePKywX59iFaLghcMSoji6csHs3xXDo9+ttmyE2H1darcwcOfbOaPn29hXO9YPr/nTLq2889dWKVqc17/eD67eywR4cFMe20lH662tmdSfRScLOOmt1ZTWl7Ba9cn2/bwHE/5d7om5NJhndmbU8xzP+ygU1QLHrygb6OW99BDD3kpmdO+nGLum7eejfvzue/cXtx/fh+/PMmllKd6x7fhi3vO5J731/G7Tzaxak8uf506kFZh3vla88Y2WFLm4I531rA3p4g5N4+iV1wbLyTzLS0KXjTjvN4czD/JC4syCQkO4tfnNfwxlVOmTPFars/XH+Cxz7cgAjOv0xPKKnBEtwrj7ZtG8vzCHbyYksm6fXm8dO1w+neMbPSyG7sNlpQ5uG3OGlbuzuWfVw1lTM92jc5kBT185EUiwpOXDeGyYQn84/vt/OP77Q0+lJSRkUFGRkaj8hScLOOBDzZw/wcb6NehDd/MGKcFQQWckOAgHrqgL+/dMooTJeVMfWkpry3eSXkjn5TYmG2w8FQ5t81Zw5LMbJ65fAiXDEtoVBYr6Z6ClwUHCX+/MomgIOGFhTs4mH+Sv106uN73D7rjjjsASE1NrXcGYwzfbjnMn75MI7vwFA+c34d7zumpD8ZRAW1sr1i+mTGOhz/ZzN/mb+OrTYd4+vIhDd5raOg2eLighJvfWk3GkRM8c/kQrhzRpUHrt4sWBR8IDhL+fsUQEqJb8vzCHezNKeL5a4bRyYLL2XdnF/G/X6fzQ/oRBnaK5I0bz2Bw5yifr1cpfxDbOpzXb0jm682H+NMXaUz51xJuHdeDe87pacmzCpbvzOH+D9ZTWFLOGzeOYEJf/7nRnae0KPiIiPDAL/rQo30Ej366mUnP/8QTlwzioiEdfdIdLbeolBcW7uDdFXsJCwnikUn9uOWs7rp3oJodEeGiIZ04s2csT3ydzswfd/LRmv3cf35vrhmZ6JNbVJeUOfjXoh28nLqT7rERvHXTSK+c17CDJUVBRNoCHwDdgD3AVcaYnz2MVUT2ACcAB1BujBlhRT5fmjo0gSGdo5kxbz33zV3PB6v38/iUAfSJ904vhKy8Ymb9tJsPVu/nVLmDa0Ymcv/5vYlr08Iry1eqqYqJCOP/rkrixrFd+dv8dP74RRovp+7klrO6M21kIhFe6BpqjOGH9KP8z1db2ZdbzBXJnfnLxQO9smy7WJX8YWChMeYpEXnY9f73Ncx7jjEmoJ6s0T02gk/vGst7K/fx7HcZXPDPxVw4MJ6bz+xORQNORJeUOViYfpRP12WRuv0YAlwyLIE7x/doEl3elLLSkM7RzL1tND9uP8YrqTt54ut0nl+4g4uGdOKy4QmM6BpT7733kjIHKw6W88wLS9h66Dg920fw3q2jOLNXrI/+F9axqihMBSa4Xr8NpFJzUQhIIcFB3Di2G1OSOvHW0t28tWwPC9KO0K6FcHFhGqO6t2VQQhQdo1oSHCQ89thj7s8WFJeReewE6/fls2xnDit35VBU6iA+MpzbxvXgxrFd6RjlX7ffVcqfiAgT+sYxoW8c6/flMWf5Xj5ff4C5q/YRHxnO2J6xjOnZjsEJUXSPjaBFaPB/bYMlZQ725xazfl8+y3fl8P3WIxSeKqdH+xCeuWIIlwxNCJiHUVlVFOKNMYcAjDGHRKSmsy8G+E5EDPCqMeY1i/JZpm1EGA9e0Jc7xvfku62Hmb1wC3NX7WP20j0AhAYLMa3CaBEaTLmjghmLv6Wo9D/Pqu3RPoJLhiUwaVBHxvRspxegKVVPwxJjGJYYwxOXlPPtlsOkZBxl8fZjfLb+AAAiENkilMiWIRgDD6/4npyiUk7v1LeNCGPioA70CMrmjkvHB9w2KN66JYOI/ABU1wn+D8DbxpjoSvPmGWN+dsMdEelkjDnoKhrfA/cZYxZXM9/twO0A8fHxyfPmzasxV2FhIa1bt673/8cqhYWFtGgVwe6CCg4UVnC02FBYZihzGIJEiAiF6BZCp4ggukYGEdPC2r9GmkL7+WO++++/H4fDwb/+9S+7o9TIX9vuNCvzGWM4WGjIKqzgcFEFx0sNxeUGQQgLcm6D7VsK3aKC6RQhiEiTb79zzjlnbbXnbY0xPh+ADKCj63VHIMODz/wZ+E1d8yUnJ5vapKSk1Drdbpqvcfw13/jx401SUpLdMWrlr213muZrnLryAWtMNd+pVv3Z+SVwo+v1jcAXVWcQkQgRaXP6NXABsMWifEoppbDuNhdPAb8QkR3AL1zvEZFOIjLfNU88sERENgKrgK+NMd9alE8ppRQWnWg2xuQA51Uz/iAw2fV6F5BkRR6llFLVC4w+VEoppbxCi4JSSik3LQpKKaXctCgopZRy06KglFLKTYuCUkopNy0KSiml3LQoKKWUctOioJRSyk2LglJKKTctCkoppdy0KCillHLToqCUUspNi4JSSik3LQpKKaXctCgopZRy06KglFLKTYuCUkopNy0KSiml3LQoKKWUctOioJRSyk2LglJKKTctCkoppdy0KCillHLToqCUUspNi4JSSik3LQpKKaXctCgopZRy06KglFLKTYuCUkopN0uKgohcKSJpIlIhIiNqmW+iiGSISKaIPGxFNqWUUv9h1Z7CFuAyYHFNM4hIMPASMAkYAEwTkQHWxFNKKQUQYsVKjDHpACJS22wjgUxjzC7XvPOAqcBWnwdUSikF+Nc5hQRgf6X3Wa5xSimlLOK1PQUR+QHoUM2kPxhjvvBkEdWMMzWs63bgdoD4+HhSU1NrXGhhYWGt0+2m+RrHX/Pl5+fjcDj8Mttp/tp2p2m+xmlwPmOMZQOQCoyoYdoYYEGl948Aj9S1zOTkZFOblJSUWqfbTfM1jr/mGz9+vElKSrI7Rq38te1O03yNU1c+YI2p5jvVnw4frQZ6i0h3EQkDrgG+tDmTUko1K1Z1Sb1URLJw7g18LSILXOM7ich8AGNMOXAvsABIBz40xqRZkU8ppZSTVb2PPgM+q2b8QWBypffzgflWZFJKKfVz/nT4SCmllM20KCillHLToqCUUspNi4JSSik3LQpKKaXctCgopZRy06KglFLKTYuCUkopNy0KSiml3LQoKKWUctOioJRSyk2LglJKKTctCkoppdy0KCillHLToqCUUspNi4JSSik3LQpKKaXctCgopZRy06KglFLKTYuCUkopNy0KSiml3LQoKKWUctOioJRSyk2LglJKKTctCkoppdy0KCillHITY4zdGRpFRI4Be2uZJRbItihOQ2i+xvHnfP6cDTRfYzX1fF2NMe2rjmzyRaEuIrLGGDPC7hw10XyN48/5/DkbaL7GCtR8evhIKaWUmxYFpZRSbs2hKLxmd4A6aL7G8ed8/pwNNF9jBWS+gD+noJRSynPNYU9BKaWUhwKuKIjI30Vkm4hsEpHPRCS6hvkmikiGiGSKyMMW5rtSRNJEpEJEauwZICJ7RGSziGwQkTV+mM/y9hORtiLyvYjscP0bU8N8lrZdXW0hTi+4pm8SkeG+zlTPfBNEpMDVXhtE5HELs70pIkdFZEsN0+1uu7ry2dZ2rvV3EZEUEUl3bbczqpmnfm1ojAmoAbgACHG9fhp4upp5goGdQA8gDNgIDLAoX3+gL5AKjKhlvj1ArA3tV2c+u9oPeAZ42PX64ep+tla3nSdtAUwGvgEEGA2stPDn6Um+CcBXVv+uudZ9NjAc2FLDdNvazsN8trWda/0dgeGu122A7Y39/Qu4PQVjzHfGmHLX2xVA52pmGwlkGmN2GWNKgXnAVIvypRtjMqxYV0N4mM+u9psKvO16/TZwiQXrrIsnbTEVmGOcVgDRItLRj/LZxhizGMitZRY7286TfLYyxhwyxqxzvT4BpAMJVWarVxsGXFGo4macFbKqBGB/pfdZ/Lwh7WaA70RkrYjcbneYKuxqv3hjzCFwbgxAXA3zWdl2nrSFnb9vnq57jIhsFJFvRGSgNdE80hS2Vb9oOxHpBgwDVlaZVK82DPF2MCuIyA9Ah2om/cEY84Vrnj8A5cB71S2imnFe64blST4PnGmMOSgiccD3IrLN9VeLP+TzWfvVlq0ei/FZ21XDk7bw6e9bHTxZ9zqctzwoFJHJwOdAb58n84ydbecJv2g7EWkNfALcb4w5XnVyNR+psQ2bZFEwxpxf23QRuRG4CDjPuA6qVZEFdKn0vjNw0Kp8Hi7joOvfoyLyGc7DAF75YvNCPp+1X23ZROSIiHQ0xhxy7f4erWEZPmu7anjSFj79fatDneuu/CVijJkvIi+LSKwxxh/u62Nn29XJH9pOREJxFoT3jDGfVjNLvdow4A4fichE4PfAxcaY4hpmWw30FpHuIhIGXAN8aVXGuohIhIi0Of0a58nzans/2MSu9vsSuNH1+kbgZ3s1NrSdJ23xJXCDqxfIaKDg9GEwC9SZT0Q6iIi4Xo/E+b2QY1G+utjZdnWyu+1c634DSDfG/KOG2erXhnadNffVAGTiPH62wTXMdI3vBMyvNN9knGfqd+I8bGJVvktxVu5TwBFgQdV8OHuKbHQNaf6Wz672A9oBC4Edrn/b+kPbVdcWwJ3Ana7XArzkmr6ZWnqd2ZTvXldbbcTZOWOshdnmAoeAMtfv3S1+1nZ15bOt7VzrPwvnoaBNlb7zJjemDfWKZqWUUm4Bd/hIKaVUw2lRUEop5aZFQSmllJsWBaWUUm5aFJRSSrlpUVBKKeWmRUEppZSbFgWllFJuWhSU8iJxPqTolIh0rTTueRHZKSLxdmZTyhN6RbNSXuS6F81qYL0x5jYR+Q3wO5x3bt1hbzql6tYk75KqlL8yxhgReRT4WkR24rzl97laEFRToXsKSvmAiCzDecvuKcaY6h70pJRf0nMKSnmZiJwLJOG8O+URm+MoVS+6p6CUF4lIEvAj8CDwS6C1MeZCe1Mp5TktCkp5iavH0TLgVWPMX0VkEM773J9rjEm1NZxSHtKioJQXiEhbYCmw2BhzR6XxHwCJxpgxtoVTqh60KCillHLTE81KKaXctCgopZRy06KglFLKTYuCUkopNy0KSiml3LQoKKWUctOioJRSyk2LglJKKTctCkoppdz+HyMh49s5Pp5DAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "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", "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" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "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": [ "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" }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n", " \n", "
\n", " \n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", "
\n", "
\n", "
\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "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", " 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", " 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", "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" }, "outputs": [ { "data": { "image/png": "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D2mHKeF1rrzySqZNm8ajjz7K22+/zbRp03y9JIlRzJw5cygpKeHw4cOoVCqeeeYZXy9JYpQgCaaE19m1axeHDh1CEASpDCvhda688krnDOkFF1xAQ0ODj1ckMVqQBFPCqxw6dIibbrqJdevWccMNN/DQQw/5ekke5bbbbmPmzJmUlZWRlpbGK6+84uslSbjw6quvMm/ePF8vQ2KUII2VSHiN2tpaLrzwQu6++24ef/xxSkpKmDhxIrt27XJ6l0pInAmDyapcuXIl+/bt45///KdkuycxVKQ5TInho6uri1mzZnHxxRfz8ssvO39+6623UldXx969e324OgnoMz5ftGgRLS0tyOVy7rrrLpYsWeLrZXmETZs2sXHjRnbu3EloaKivlyMx8pAEU0JC4geam5tpbm5m8uTJ6HQ6pkyZwgcffDDiQ7s//fRTli5dyu7du0lISPD1ciRGJpJgSkhIDMz111/Pr371K+bMmePrpZwVeXl5mM1m4uLigL7Gn40bN/p4VRIjDEkwJSQk+qempoaLL76YkpISIiMjfb0cCQlfI1njSUhInIxer2fBggWsXbtWEksJiVMgCaaExDmM1WplwYIFLFy4kJtuusnXy5GQ8GukkqyExDmKIAjcfvvtxMbGsnbtWl8vR0LCn5DOMCUkJH5gz549zJ49m/POO8+ZT7lq1SquvvpqH69MQsLnnJFgSkhISEhISCCdYUpISEhISAwKSTAlJCQkJCQGgSSYEhISEhISg0ASTAkJCQkJiUEgCaaEhISEhMQgkARTQkJCQkJiEPx/fs/DmusUG8gAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "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=mpl.cm.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", "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", "$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": [ "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": [ "## 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", "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", "* $\\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", "* $\\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", "\\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", "* 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" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "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", "
\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", "
\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", "
\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", "
\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", "
\n", "\n", "We have proven that:\n", "\n", "$\\underset{\\theta \\to 0}\\lim\\dfrac{\\sin(\\theta)}{\\theta}=1$\n", "\n", "
" ] }, { "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", "
\n", "\n", "We have proven that:\n", "\n", "$\\underset{\\theta \\to 0}\\lim\\dfrac{\\cos(\\theta) - 1}{\\theta}=0$\n", "\n", "
" ] }, { "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": [], "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", "version": "3.7.10" }, "pycharm": { "stem_cell": { "cell_type": "raw", "metadata": { "collapsed": false }, "source": [] } } }, "nbformat": 4, "nbformat_minor": 1 }