diff --git a/lectures/micrograd/Making of Micrograd/.ipynb_checkpoints/0 Derivative Basics-checkpoint.ipynb b/lectures/micrograd/Making of Micrograd/.ipynb_checkpoints/0 Derivative Basics-checkpoint.ipynb new file mode 100644 index 00000000..0df18849 --- /dev/null +++ b/lectures/micrograd/Making of Micrograd/.ipynb_checkpoints/0 Derivative Basics-checkpoint.ipynb @@ -0,0 +1,575 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "77c17d60", + "metadata": {}, + "source": [ + "## The Introduction to Neural Networks and Backpropagation" + ] + }, + { + "cell_type": "markdown", + "id": "c3216dbf", + "metadata": {}, + "source": [ + "# Basics of Derivative" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cc7300b4", + "metadata": {}, + "outputs": [], + "source": [ + "# Important libraries to import to perform further operations\n", + "\n", + "import math # for performing mathematical operations\n", + "import numpy as np # for numerical computing that provides support for arrays, mathematical functions, etc.\n", + "import matplotlib.pyplot as plt # for creating static, interactive, and animated visualizations.\n", + "\n", + "# display matplotlib plots directly within the notebook interface.\n", + "%matplotlib inline " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "130189b2", + "metadata": {}, + "outputs": [], + "source": [ + "# example function: 3x^2 − 4x + 5\n", + "def f(x):\n", + " return 3*x**2 - 4*x + 5" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "48a349a9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20\n" + ] + } + ], + "source": [ + "# when input is 3 (int)\n", + "print(f(3))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "64269a4c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20.0\n" + ] + } + ], + "source": [ + "# when input is 3.0 (float)\n", + "print(f(3.0))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "f079e6b7", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n", + "5\n", + "12\n", + "29605\n" + ] + } + ], + "source": [ + "# other input e.g.\n", + "print(f(1))\n", + "print(f(0))\n", + "print(f(-1))\n", + "print(f(100))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "c463cdc1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-5. -4.75 -4.5 -4.25 -4. -3.75 -3.5 -3.25 -3. -2.75 -2.5 -2.25\n", + " -2. -1.75 -1.5 -1.25 -1. -0.75 -0.5 -0.25 0. 0.25 0.5 0.75\n", + " 1. 1.25 1.5 1.75 2. 2.25 2.5 2.75 3. 3.25 3.5 3.75\n", + " 4. 4.25 4.5 4.75]\n", + "xs type: \n", + "40\n" + ] + } + ], + "source": [ + "# array of evenly spaced values within (-5,5)\n", + "xs = np.arange(-5,5,0.25)\n", + "print(xs)\n", + "print(\"xs type:\", type(xs))\n", + "print(len(xs))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "55320423", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[100. 91.6875 83.75 76.1875 69. 62.1875 55.75 49.6875\n", + " 44. 38.6875 33.75 29.1875 25. 21.1875 17.75 14.6875\n", + " 12. 9.6875 7.75 6.1875 5. 4.1875 3.75 3.6875\n", + " 4. 4.6875 5.75 7.1875 9. 11.1875 13.75 16.6875\n", + " 20. 23.6875 27.75 32.1875 37. 42.1875 47.75 53.6875]\n", + "\n" + ] + } + ], + "source": [ + "# Applying func to each scalar in xs\n", + "ys = f(xs)\n", + "print(ys)\n", + "print(type(ys))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "b25b9b94", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[]\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiIAAAGdCAYAAAAvwBgXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA5wElEQVR4nO3deXiU5d328e9M9oQkLIGEkBDCvgSygCIq7qK4IopAeFutrU9tw1ZcCloLqDVWEQsEbW19rH1qAEXAFQUXEKRWIAth3yGsISxZySSZud4/+sr7oGyBTO5Zzs9xzHGQyST3eXGFzMn9m8VmjDGIiIiIWMBudQARERHxXyoiIiIiYhkVEREREbGMioiIiIhYRkVERERELKMiIiIiIpZRERERERHLqIiIiIiIZQKtDnAuLpeLAwcOEBkZic1mszqOiIiIXABjDBUVFcTHx2O3n/uch0cXkQMHDpCYmGh1DBEREbkIxcXFJCQknPM2Hl1EIiMjgf8sJCoqyuI0IiIiciHKy8tJTEw8dT9+Lh5dRL4fx0RFRamIiIiIeJkLeViFHqwqIiIillEREREREcuoiIiIiIhlVERERETEMioiIiIiYhkVEREREbGMioiIiIhYRkVERERELKMiIiIiIpZRERERERHLqIiIiIiIZVRERERExDIqIiIiIn7oRHUtv/yfNXyzvdTSHCoiIiIifmbtnuPcPnMln204zBPz11HndFmWJdCyI4uIiEiTcrkMr6/YyUufbcHpMnRoFU5OZgZBAdadl1ARERER8QPHqmqZ8E4By7YcAeDO1HievyeFyNAgS3OpiIiIiPi473YdY+ycfA6V1xASaGfynb0YeXkiNpvN6mgqIiIiIr7K5TK8umw705duxWWgY+sIZmdm0KNtlNXRTlERERER8UFHKhxMeKeAFdv+86yYoenteHZIChEhnnXX71lpRERE5JKt2lHKuLkFHKlwEBpk55m7UxjWN8EjRjE/pCIiIiLiI5wuw6wvtzHzi224DHRp04zZozLoGhtpdbSzUhERERHxASXlNYybW8C/dh4F4P5+CUy9K4Ww4ACLk52bioiIiIiXW7HtCL+ZV0BpZS3hwQE8NySFoRkJVse6ICoiIiIiXqre6eJPn29j9rLtGAPd4yLJycygc5tmVke7YCoiIiIiXuhg2UnGzSngu93HAMjs357f39GT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V2CzwZgbujDuxi4E2G1WRxMREfF5fl1E5q/dx9OL1nOyzklMsxBmjEjjqs4xVscSERHxG35ZRKpr6/ndovUsyNsPwNWdY3hleBqtI0MsTiYiIuJf/LKI5P57Lwvy9mO3wYSbu/Kr6zprFCMiImIBvywiD17ZgYLiE/zkiiT6d2xldRwRERG/5ZdFJDDATk5mhtUxRERE/J5epUtEREQsoyIiIiIillEREREREcuoiIiIiIhlVERERETEMioiIiIiYhkVEREREbGMioiIiIhYRkVERERELKMiIiIiIpZRERERERHLqIiIiIiIZVRERERExDIe/e67xhgAysvLLU4iIiIiF+r7++3v78fPxaOLSEVFBQCJiYkWJxEREZGGqqioIDo6+py3sZkLqSsWcblcHDhwgMjISGw2W6N+7/LychITEykuLiYqKqpRv7cn8Yd1+sMaQev0NVqn7/CHNULD1mmMoaKigvj4eOz2cz8KxKPPiNjtdhISEtx6jKioKJ/+wfmeP6zTH9YIWqev0Tp9hz+sES58nec7E/I9PVhVRERELKMiIiIiIpbx2yISEhLC5MmTCQkJsTqKW/nDOv1hjaB1+hqt03f4wxrBfev06AerioiIiG/z2zMiIiIiYj0VEREREbGMioiIiIhYRkVERERELOOXReTVV18lOTmZ0NBQ+vbty4oVK6yO1KimTJmCzWY77RIXF2d1rEv29ddfc+eddxIfH4/NZmPRokWnfd4Yw5QpU4iPjycsLIzrrruODRs2WBP2EpxvnQ8++OCP9veKK66wJuxFys7O5rLLLiMyMpI2bdowZMgQtmzZctptfGE/L2SdvrCfr732Gn369Dn1QlcDBgxg8eLFpz7vC3sJ51+nL+zlD2VnZ2Oz2Rg/fvyp6xp7P/2uiMybN4/x48fz1FNPkZ+fz8CBAxk8eDB79+61Olqj6tWrFwcPHjx1KSoqsjrSJauqqiI1NZWcnJwzfv7FF19k+vTp5OTksHr1auLi4rj55ptPvWeRtzjfOgFuvfXW0/b3k08+acKEl2758uVkZWXx7bffsnTpUurr6xk0aBBVVVWnbuML+3kh6wTv38+EhAReeOEF1qxZw5o1a7jhhhu4++67T905+cJewvnXCd6/l//b6tWref311+nTp89p1zf6fho/c/nll5tHHnnktOu6d+9uJk6caFGixjd58mSTmppqdQy3AszChQtPfexyuUxcXJx54YUXTl1XU1NjoqOjzZ///GcLEjaOH67TGGMeeOABc/fdd1uSx11KSkoMYJYvX26M8d39/OE6jfHN/TTGmBYtWpi//e1vPruX3/t+ncb41l5WVFSYLl26mKVLl5prr73WjBs3zhjjnn+bfnVGpLa2lrVr1zJo0KDTrh80aBCrVq2yKJV7bNu2jfj4eJKTkxkxYgQ7d+60OpJb7dq1i0OHDp22tyEhIVx77bU+t7cAy5Yto02bNnTt2pWHH36YkpISqyNdkrKyMgBatmwJ+O5+/nCd3/Ol/XQ6ncydO5eqqioGDBjgs3v5w3V+z1f2Misri9tvv52bbrrptOvdsZ8e/aZ3ja20tBSn00lsbOxp18fGxnLo0CGLUjW+/v37849//IOuXbty+PBhnnvuOa688ko2bNhAq1atrI7nFt/v35n2ds+ePVZEcpvBgwczbNgwkpKS2LVrF08//TQ33HADa9eu9cpXdjTGMGHCBK6++mpSUlIA39zPM60TfGc/i4qKGDBgADU1NTRr1oyFCxfSs2fPU3dOvrKXZ1sn+M5ezp07l7y8PFavXv2jz7nj36ZfFZHv2Wy20z42xvzoOm82ePDgU3/u3bs3AwYMoFOnTrz11ltMmDDBwmTu5+t7CzB8+PBTf05JSaFfv34kJSXx8ccfM3ToUAuTXZzRo0ezbt06Vq5c+aPP+dJ+nm2dvrKf3bp1o6CggBMnTvDee+/xwAMPsHz58lOf95W9PNs6e/bs6RN7WVxczLhx41iyZAmhoaFnvV1j7qdfjWZiYmIICAj40dmPkpKSH7U7XxIREUHv3r3Ztm2b1VHc5vtnBfnb3gK0bduWpKQkr9zfMWPG8MEHH/DVV1+RkJBw6npf28+zrfNMvHU/g4OD6dy5M/369SM7O5vU1FRmzJjhc3t5tnWeiTfu5dq1aykpKaFv374EBgYSGBjI8uXLmTlzJoGBgaf2rDH306+KSHBwMH379mXp0qWnXb906VKuvPJKi1K5n8PhYNOmTbRt29bqKG6TnJxMXFzcaXtbW1vL8uXLfXpvAY4ePUpxcbFX7a8xhtGjR7NgwQK+/PJLkpOTT/u8r+zn+dZ5Jt64n2dijMHhcPjMXp7N9+s8E2/cyxtvvJGioiIKCgpOXfr168eoUaMoKCigY8eOjb+fF/2QWi81d+5cExQUZN544w2zceNGM378eBMREWF2795tdbRG8+ijj5ply5aZnTt3mm+//dbccccdJjIy0uvXWFFRYfLz801+fr4BzPTp001+fr7Zs2ePMcaYF154wURHR5sFCxaYoqIiM3LkSNO2bVtTXl5ucfKGOdc6KyoqzKOPPmpWrVpldu3aZb766iszYMAA065dO69a569+9SsTHR1tli1bZg4ePHjqUl1dfeo2vrCf51unr+znpEmTzNdff2127dpl1q1bZ5588kljt9vNkiVLjDG+sZfGnHudvrKXZ/K/nzVjTOPvp98VEWOMmT17tklKSjLBwcEmIyPjtKfS+YLhw4ebtm3bmqCgIBMfH2+GDh1qNmzYYHWsS/bVV18Z4EeXBx54wBjzn6eVTZ482cTFxZmQkBBzzTXXmKKiImtDX4RzrbO6utoMGjTItG7d2gQFBZn27dubBx54wOzdu9fq2A1ypvUB5s033zx1G1/Yz/Ot01f286GHHjr1O7V169bmxhtvPFVCjPGNvTTm3Ov0lb08kx8WkcbeT5sxxlzcuRQRERGRS+NXjxERERERz6IiIiIiIpZRERERERHLqIiIiIiIZVRERERExDIqIiIiImIZFRERERGxjIqIiIiIWEZFRERERCyjIiIiIiKWURERERERy6iIiIiIiGX+L9a8Yz3WBc6jAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plotting all the inputs xs using matplotlib \n", + "print(plt.plot(xs))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "ca6c68ae", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[]\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plotting all the outputs ys\n", + "print(plt.plot(ys))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "e6ddda33", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot ys versus xs (notice the x-axis values in this case (-5, 5))\n", + "plt.plot(xs, ys)\n", + "\n", + "# Turn on the grid\n", + "plt.grid(True)\n", + "\n", + "# Display the plot\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "7694e96e", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "id": "6099e9f1", + "metadata": {}, + "source": [ + "# Derivative:" + ] + }, + { + "cell_type": "markdown", + "id": "01763699", + "metadata": {}, + "source": [ + "![Derivative](https://miro.medium.com/v2/resize:fit:828/format:webp/0*6-cw21HL-I0hXxjF.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "7a68aa11", + "metadata": {}, + "outputs": [], + "source": [ + "# small increment value 'h' which we will add to 'x' for computing the derivative at x=3\n", + "h = 0.00000001\n", + "x = 3.0" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "77fea8df", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20.0\n", + "20.00000014\n" + ] + } + ], + "source": [ + "# output of function 3x^2 − 4x + 5 when x=3\n", + "print(f(x))\n", + "\n", + "# output of function 3x^2 − 4x + 5 when x=3.00000001\n", + "print(f(x+h))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "365d694a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.400000009255109e-07\n" + ] + } + ], + "source": [ + "# difference\n", + "print(f(x+h) - f(x))" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "28ec5fee", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "14.00000009255109\n" + ] + } + ], + "source": [ + "# derivative\n", + "print((f(x+h) - f(x)) / h)" + ] + }, + { + "cell_type": "markdown", + "id": "9da8fac1", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "id": "0959adf0", + "metadata": {}, + "source": [ + "## Performing Manual Derivative\n", + "\n", + "Derivative of \\(3x^2 - 4x + 5\\) is \\(6x - 4\\).\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "aa6597b0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "14.0\n" + ] + } + ], + "source": [ + "# therefore: 6x - 4 = 6*3 - 4 = 14\n", + "print(6*3.0 - 4)" + ] + }, + { + "cell_type": "markdown", + "id": "bbf2eb6c", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "id": "93a8c758", + "metadata": {}, + "source": [ + "### derivative of function with multiple inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "516ab937", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "d1: 4.0\n", + "d2: 3.999699999999999\n", + "slope: -3.000000000010772\n" + ] + } + ], + "source": [ + "# small increment\n", + "h = 0.0001\n", + "\n", + "# inputs\n", + "a = 2.0\n", + "b = -3.0\n", + "c = 10.0\n", + "\n", + "# function\n", + "d1 = a*b + c\n", + "\n", + "# increasing a with small amount\n", + "a += h \n", + "\n", + "# function after increasing 'a' with small amount\n", + "d2 = a*b + c\n", + "\n", + "\n", + "print(\"d1:\", d1)\n", + "print(\"d2:\", d2)\n", + "print(\"slope:\", (d2-d1)/h)" + ] + }, + { + "cell_type": "markdown", + "id": "b4410c5e", + "metadata": {}, + "source": [ + "## since: derivative of (a*b + c) w.r.t a ----> b" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "087d4a1d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "d1: 4.0\n", + "d2: 4.0002\n", + "slope: 2.0000000000042206\n" + ] + } + ], + "source": [ + "h = 0.0001\n", + "\n", + "# inputs\n", + "a = 2.0\n", + "b = -3.0\n", + "c = 10.0\n", + "\n", + "# function evaluation \n", + "d1 = a*b + c\n", + "\n", + "# increasing b with small amount\n", + "b += h \n", + "\n", + "# function evaluation after increasing b with a small amount\n", + "d2 = a*b + c\n", + "\n", + "\n", + "print(\"d1:\", d1)\n", + "print(\"d2:\", d2)\n", + "print(\"slope:\", (d2-d1)/h)" + ] + }, + { + "cell_type": "markdown", + "id": "b582e7b7", + "metadata": {}, + "source": [ + "## since: derivative of (a*b + c) w.r.t b ----> a\n", + "## here negative sign indicates that the function is decreasing at that point" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "cbf85343", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "d1: 9994.0\n", + "d2: 9994.0001\n", + "slope: 0.9999999929277692\n" + ] + } + ], + "source": [ + "h = 0.0001\n", + "\n", + "# inputs\n", + "a = 2.0\n", + "b = -3.0\n", + "c = 10000.0\n", + "\n", + "# function evaluation \n", + "d1 = a*b + c\n", + "\n", + "# increasing c with small amount\n", + "c += h \n", + "\n", + "# function evaluation after increasing c with a small amount\n", + "d2 = a*b + c\n", + "\n", + "\n", + "print(\"d1:\", d1)\n", + "print(\"d2:\", d2)\n", + "print(\"slope:\", (d2-d1)/h)" + ] + }, + { + "cell_type": "markdown", + "id": "bdf03ecd", + "metadata": {}, + "source": [ + "## since: derivative of (a*b + c) w.r.t c ----> (0+1) = 1" + ] + }, + { + "cell_type": "markdown", + "id": "e855fa28", + "metadata": {}, + "source": [ + " " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lectures/micrograd/Making of Micrograd/0 Derivative Basics.ipynb b/lectures/micrograd/Making of Micrograd/0 Derivative Basics.ipynb new file mode 100644 index 00000000..0df18849 --- /dev/null +++ b/lectures/micrograd/Making of Micrograd/0 Derivative Basics.ipynb @@ -0,0 +1,575 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "77c17d60", + "metadata": {}, + "source": [ + "## The Introduction to Neural Networks and Backpropagation" + ] + }, + { + "cell_type": "markdown", + "id": "c3216dbf", + "metadata": {}, + "source": [ + "# Basics of Derivative" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cc7300b4", + "metadata": {}, + "outputs": [], + "source": [ + "# Important libraries to import to perform further operations\n", + "\n", + "import math # for performing mathematical operations\n", + "import numpy as np # for numerical computing that provides support for arrays, mathematical functions, etc.\n", + "import matplotlib.pyplot as plt # for creating static, interactive, and animated visualizations.\n", + "\n", + "# display matplotlib plots directly within the notebook interface.\n", + "%matplotlib inline " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "130189b2", + "metadata": {}, + "outputs": [], + "source": [ + "# example function: 3x^2 − 4x + 5\n", + "def f(x):\n", + " return 3*x**2 - 4*x + 5" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "48a349a9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20\n" + ] + } + ], + "source": [ + "# when input is 3 (int)\n", + "print(f(3))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "64269a4c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20.0\n" + ] + } + ], + "source": [ + "# when input is 3.0 (float)\n", + "print(f(3.0))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "f079e6b7", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n", + "5\n", + "12\n", + "29605\n" + ] + } + ], + "source": [ + "# other input e.g.\n", + "print(f(1))\n", + "print(f(0))\n", + "print(f(-1))\n", + "print(f(100))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "c463cdc1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-5. -4.75 -4.5 -4.25 -4. -3.75 -3.5 -3.25 -3. -2.75 -2.5 -2.25\n", + " -2. -1.75 -1.5 -1.25 -1. -0.75 -0.5 -0.25 0. 0.25 0.5 0.75\n", + " 1. 1.25 1.5 1.75 2. 2.25 2.5 2.75 3. 3.25 3.5 3.75\n", + " 4. 4.25 4.5 4.75]\n", + "xs type: \n", + "40\n" + ] + } + ], + "source": [ + "# array of evenly spaced values within (-5,5)\n", + "xs = np.arange(-5,5,0.25)\n", + "print(xs)\n", + "print(\"xs type:\", type(xs))\n", + "print(len(xs))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "55320423", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[100. 91.6875 83.75 76.1875 69. 62.1875 55.75 49.6875\n", + " 44. 38.6875 33.75 29.1875 25. 21.1875 17.75 14.6875\n", + " 12. 9.6875 7.75 6.1875 5. 4.1875 3.75 3.6875\n", + " 4. 4.6875 5.75 7.1875 9. 11.1875 13.75 16.6875\n", + " 20. 23.6875 27.75 32.1875 37. 42.1875 47.75 53.6875]\n", + "\n" + ] + } + ], + "source": [ + "# Applying func to each scalar in xs\n", + "ys = f(xs)\n", + "print(ys)\n", + "print(type(ys))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "b25b9b94", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[]\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiIAAAGdCAYAAAAvwBgXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA5wElEQVR4nO3deXiU5d328e9M9oQkLIGEkBDCvgSygCIq7qK4IopAeFutrU9tw1ZcCloLqDVWEQsEbW19rH1qAEXAFQUXEKRWIAth3yGsISxZySSZud4/+sr7oGyBTO5Zzs9xzHGQyST3eXGFzMn9m8VmjDGIiIiIWMBudQARERHxXyoiIiIiYhkVEREREbGMioiIiIhYRkVERERELKMiIiIiIpZRERERERHLqIiIiIiIZQKtDnAuLpeLAwcOEBkZic1mszqOiIiIXABjDBUVFcTHx2O3n/uch0cXkQMHDpCYmGh1DBEREbkIxcXFJCQknPM2Hl1EIiMjgf8sJCoqyuI0IiIiciHKy8tJTEw8dT9+Lh5dRL4fx0RFRamIiIiIeJkLeViFHqwqIiIillEREREREcuoiIiIiIhlVERERETEMioiIiIiYhkVEREREbGMioiIiIhYRkVERERELKMiIiIiIpZRERERERHLqIiIiIiIZVRERERExDIqIiIiIn7oRHUtv/yfNXyzvdTSHCoiIiIifmbtnuPcPnMln204zBPz11HndFmWJdCyI4uIiEiTcrkMr6/YyUufbcHpMnRoFU5OZgZBAdadl1ARERER8QPHqmqZ8E4By7YcAeDO1HievyeFyNAgS3OpiIiIiPi473YdY+ycfA6V1xASaGfynb0YeXkiNpvN6mgqIiIiIr7K5TK8umw705duxWWgY+sIZmdm0KNtlNXRTlERERER8UFHKhxMeKeAFdv+86yYoenteHZIChEhnnXX71lpRERE5JKt2lHKuLkFHKlwEBpk55m7UxjWN8EjRjE/pCIiIiLiI5wuw6wvtzHzi224DHRp04zZozLoGhtpdbSzUhERERHxASXlNYybW8C/dh4F4P5+CUy9K4Ww4ACLk52bioiIiIiXW7HtCL+ZV0BpZS3hwQE8NySFoRkJVse6ICoiIiIiXqre6eJPn29j9rLtGAPd4yLJycygc5tmVke7YCoiIiIiXuhg2UnGzSngu93HAMjs357f39GT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V2CzwZgbujDuxi4E2G1WRxMREfF5fl1E5q/dx9OL1nOyzklMsxBmjEjjqs4xVscSERHxG35ZRKpr6/ndovUsyNsPwNWdY3hleBqtI0MsTiYiIuJf/LKI5P57Lwvy9mO3wYSbu/Kr6zprFCMiImIBvywiD17ZgYLiE/zkiiT6d2xldRwRERG/5ZdFJDDATk5mhtUxRERE/J5epUtEREQsoyIiIiIillEREREREcuoiIiIiIhlVERERETEMioiIiIiYhkVEREREbGMioiIiIhYRkVERERELKMiIiIiIpZRERERERHLqIiIiIiIZVRERERExDIe/e67xhgAysvLLU4iIiIiF+r7++3v78fPxaOLSEVFBQCJiYkWJxEREZGGqqioIDo6+py3sZkLqSsWcblcHDhwgMjISGw2W6N+7/LychITEykuLiYqKqpRv7cn8Yd1+sMaQev0NVqn7/CHNULD1mmMoaKigvj4eOz2cz8KxKPPiNjtdhISEtx6jKioKJ/+wfmeP6zTH9YIWqev0Tp9hz+sES58nec7E/I9PVhVRERELKMiIiIiIpbx2yISEhLC5MmTCQkJsTqKW/nDOv1hjaB1+hqt03f4wxrBfev06AerioiIiG/z2zMiIiIiYj0VEREREbGMioiIiIhYRkVERERELOOXReTVV18lOTmZ0NBQ+vbty4oVK6yO1KimTJmCzWY77RIXF2d1rEv29ddfc+eddxIfH4/NZmPRokWnfd4Yw5QpU4iPjycsLIzrrruODRs2WBP2EpxvnQ8++OCP9veKK66wJuxFys7O5rLLLiMyMpI2bdowZMgQtmzZctptfGE/L2SdvrCfr732Gn369Dn1QlcDBgxg8eLFpz7vC3sJ51+nL+zlD2VnZ2Oz2Rg/fvyp6xp7P/2uiMybN4/x48fz1FNPkZ+fz8CBAxk8eDB79+61Olqj6tWrFwcPHjx1KSoqsjrSJauqqiI1NZWcnJwzfv7FF19k+vTp5OTksHr1auLi4rj55ptPvWeRtzjfOgFuvfXW0/b3k08+acKEl2758uVkZWXx7bffsnTpUurr6xk0aBBVVVWnbuML+3kh6wTv38+EhAReeOEF1qxZw5o1a7jhhhu4++67T905+cJewvnXCd6/l//b6tWref311+nTp89p1zf6fho/c/nll5tHHnnktOu6d+9uJk6caFGixjd58mSTmppqdQy3AszChQtPfexyuUxcXJx54YUXTl1XU1NjoqOjzZ///GcLEjaOH67TGGMeeOABc/fdd1uSx11KSkoMYJYvX26M8d39/OE6jfHN/TTGmBYtWpi//e1vPruX3/t+ncb41l5WVFSYLl26mKVLl5prr73WjBs3zhjjnn+bfnVGpLa2lrVr1zJo0KDTrh80aBCrVq2yKJV7bNu2jfj4eJKTkxkxYgQ7d+60OpJb7dq1i0OHDp22tyEhIVx77bU+t7cAy5Yto02bNnTt2pWHH36YkpISqyNdkrKyMgBatmwJ+O5+/nCd3/Ol/XQ6ncydO5eqqioGDBjgs3v5w3V+z1f2Misri9tvv52bbrrptOvdsZ8e/aZ3ja20tBSn00lsbOxp18fGxnLo0CGLUjW+/v37849//IOuXbty+PBhnnvuOa688ko2bNhAq1atrI7nFt/v35n2ds+ePVZEcpvBgwczbNgwkpKS2LVrF08//TQ33HADa9eu9cpXdjTGMGHCBK6++mpSUlIA39zPM60TfGc/i4qKGDBgADU1NTRr1oyFCxfSs2fPU3dOvrKXZ1sn+M5ezp07l7y8PFavXv2jz7nj36ZfFZHv2Wy20z42xvzoOm82ePDgU3/u3bs3AwYMoFOnTrz11ltMmDDBwmTu5+t7CzB8+PBTf05JSaFfv34kJSXx8ccfM3ToUAuTXZzRo0ezbt06Vq5c+aPP+dJ+nm2dvrKf3bp1o6CggBMnTvDee+/xwAMPsHz58lOf95W9PNs6e/bs6RN7WVxczLhx41iyZAmhoaFnvV1j7qdfjWZiYmIICAj40dmPkpKSH7U7XxIREUHv3r3Ztm2b1VHc5vtnBfnb3gK0bduWpKQkr9zfMWPG8MEHH/DVV1+RkJBw6npf28+zrfNMvHU/g4OD6dy5M/369SM7O5vU1FRmzJjhc3t5tnWeiTfu5dq1aykpKaFv374EBgYSGBjI8uXLmTlzJoGBgaf2rDH306+KSHBwMH379mXp0qWnXb906VKuvPJKi1K5n8PhYNOmTbRt29bqKG6TnJxMXFzcaXtbW1vL8uXLfXpvAY4ePUpxcbFX7a8xhtGjR7NgwQK+/PJLkpOTT/u8r+zn+dZ5Jt64n2dijMHhcPjMXp7N9+s8E2/cyxtvvJGioiIKCgpOXfr168eoUaMoKCigY8eOjb+fF/2QWi81d+5cExQUZN544w2zceNGM378eBMREWF2795tdbRG8+ijj5ply5aZnTt3mm+//dbccccdJjIy0uvXWFFRYfLz801+fr4BzPTp001+fr7Zs2ePMcaYF154wURHR5sFCxaYoqIiM3LkSNO2bVtTXl5ucfKGOdc6KyoqzKOPPmpWrVpldu3aZb766iszYMAA065dO69a569+9SsTHR1tli1bZg4ePHjqUl1dfeo2vrCf51unr+znpEmTzNdff2127dpl1q1bZ5588kljt9vNkiVLjDG+sZfGnHudvrKXZ/K/nzVjTOPvp98VEWOMmT17tklKSjLBwcEmIyPjtKfS+YLhw4ebtm3bmqCgIBMfH2+GDh1qNmzYYHWsS/bVV18Z4EeXBx54wBjzn6eVTZ482cTFxZmQkBBzzTXXmKKiImtDX4RzrbO6utoMGjTItG7d2gQFBZn27dubBx54wOzdu9fq2A1ypvUB5s033zx1G1/Yz/Ot01f286GHHjr1O7V169bmxhtvPFVCjPGNvTTm3Ov0lb08kx8WkcbeT5sxxlzcuRQRERGRS+NXjxERERERz6IiIiIiIpZRERERERHLqIiIiIiIZVRERERExDIqIiIiImIZFRERERGxjIqIiIiIWEZFRERERCyjIiIiIiKWURERERERy6iIiIiIiGX+L9a8Yz3WBc6jAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plotting all the inputs xs using matplotlib \n", + "print(plt.plot(xs))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "ca6c68ae", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[]\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plotting all the outputs ys\n", + "print(plt.plot(ys))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "e6ddda33", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot ys versus xs (notice the x-axis values in this case (-5, 5))\n", + "plt.plot(xs, ys)\n", + "\n", + "# Turn on the grid\n", + "plt.grid(True)\n", + "\n", + "# Display the plot\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "7694e96e", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "id": "6099e9f1", + "metadata": {}, + "source": [ + "# Derivative:" + ] + }, + { + "cell_type": "markdown", + "id": "01763699", + "metadata": {}, + "source": [ + "![Derivative](https://miro.medium.com/v2/resize:fit:828/format:webp/0*6-cw21HL-I0hXxjF.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "7a68aa11", + "metadata": {}, + "outputs": [], + "source": [ + "# small increment value 'h' which we will add to 'x' for computing the derivative at x=3\n", + "h = 0.00000001\n", + "x = 3.0" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "77fea8df", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20.0\n", + "20.00000014\n" + ] + } + ], + "source": [ + "# output of function 3x^2 − 4x + 5 when x=3\n", + "print(f(x))\n", + "\n", + "# output of function 3x^2 − 4x + 5 when x=3.00000001\n", + "print(f(x+h))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "365d694a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.400000009255109e-07\n" + ] + } + ], + "source": [ + "# difference\n", + "print(f(x+h) - f(x))" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "28ec5fee", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "14.00000009255109\n" + ] + } + ], + "source": [ + "# derivative\n", + "print((f(x+h) - f(x)) / h)" + ] + }, + { + "cell_type": "markdown", + "id": "9da8fac1", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "id": "0959adf0", + "metadata": {}, + "source": [ + "## Performing Manual Derivative\n", + "\n", + "Derivative of \\(3x^2 - 4x + 5\\) is \\(6x - 4\\).\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "aa6597b0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "14.0\n" + ] + } + ], + "source": [ + "# therefore: 6x - 4 = 6*3 - 4 = 14\n", + "print(6*3.0 - 4)" + ] + }, + { + "cell_type": "markdown", + "id": "bbf2eb6c", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "id": "93a8c758", + "metadata": {}, + "source": [ + "### derivative of function with multiple inputs" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "516ab937", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "d1: 4.0\n", + "d2: 3.999699999999999\n", + "slope: -3.000000000010772\n" + ] + } + ], + "source": [ + "# small increment\n", + "h = 0.0001\n", + "\n", + "# inputs\n", + "a = 2.0\n", + "b = -3.0\n", + "c = 10.0\n", + "\n", + "# function\n", + "d1 = a*b + c\n", + "\n", + "# increasing a with small amount\n", + "a += h \n", + "\n", + "# function after increasing 'a' with small amount\n", + "d2 = a*b + c\n", + "\n", + "\n", + "print(\"d1:\", d1)\n", + "print(\"d2:\", d2)\n", + "print(\"slope:\", (d2-d1)/h)" + ] + }, + { + "cell_type": "markdown", + "id": "b4410c5e", + "metadata": {}, + "source": [ + "## since: derivative of (a*b + c) w.r.t a ----> b" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "087d4a1d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "d1: 4.0\n", + "d2: 4.0002\n", + "slope: 2.0000000000042206\n" + ] + } + ], + "source": [ + "h = 0.0001\n", + "\n", + "# inputs\n", + "a = 2.0\n", + "b = -3.0\n", + "c = 10.0\n", + "\n", + "# function evaluation \n", + "d1 = a*b + c\n", + "\n", + "# increasing b with small amount\n", + "b += h \n", + "\n", + "# function evaluation after increasing b with a small amount\n", + "d2 = a*b + c\n", + "\n", + "\n", + "print(\"d1:\", d1)\n", + "print(\"d2:\", d2)\n", + "print(\"slope:\", (d2-d1)/h)" + ] + }, + { + "cell_type": "markdown", + "id": "b582e7b7", + "metadata": {}, + "source": [ + "## since: derivative of (a*b + c) w.r.t b ----> a\n", + "## here negative sign indicates that the function is decreasing at that point" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "cbf85343", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "d1: 9994.0\n", + "d2: 9994.0001\n", + "slope: 0.9999999929277692\n" + ] + } + ], + "source": [ + "h = 0.0001\n", + "\n", + "# inputs\n", + "a = 2.0\n", + "b = -3.0\n", + "c = 10000.0\n", + "\n", + "# function evaluation \n", + "d1 = a*b + c\n", + "\n", + "# increasing c with small amount\n", + "c += h \n", + "\n", + "# function evaluation after increasing c with a small amount\n", + "d2 = a*b + c\n", + "\n", + "\n", + "print(\"d1:\", d1)\n", + "print(\"d2:\", d2)\n", + "print(\"slope:\", (d2-d1)/h)" + ] + }, + { + "cell_type": "markdown", + "id": "bdf03ecd", + "metadata": {}, + "source": [ + "## since: derivative of (a*b + c) w.r.t c ----> (0+1) = 1" + ] + }, + { + "cell_type": "markdown", + "id": "e855fa28", + "metadata": {}, + "source": [ + " " + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lectures/micrograd/Making of Micrograd/1 Data Structure for NN - Value.ipynb b/lectures/micrograd/Making of Micrograd/1 Data Structure for NN - Value.ipynb new file mode 100644 index 00000000..1c185e24 --- /dev/null +++ b/lectures/micrograd/Making of Micrograd/1 Data Structure for NN - Value.ipynb @@ -0,0 +1,8166 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "fec59295", + "metadata": {}, + "source": [ + "# The Intro to Neural Network" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "c33853ec", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import math" + ] + }, + { + "cell_type": "markdown", + "id": "e4a59a4a", + "metadata": {}, + "source": [ + "## Data Structure for Neural Network" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "0d59dc1b", + "metadata": {}, + "outputs": [], + "source": [ + "# Value Object\n", + "\n", + "class Value:\n", + " \n", + " def __init__(self,data):\n", + " self.data = data\n", + " \n", + " # represent nicer looking expressions \n", + " def __repr__(self):\n", + " return f\"Value(data={self.data})\"\n", + " \n", + " def __add__(self, otherObj):\n", + " # return NEW Value Obj \n", + " out = Value(self.data + otherObj.data)\n", + " return out\n", + " \n", + " def __mul__(self, otherObj):\n", + " out = Value(self.data * otherObj.data)\n", + " return out\n", + " \n", + " def __sub__(self, otherObj):\n", + " out = Value(self.data - otherObj.data)\n", + " return out" + ] + }, + { + "cell_type": "markdown", + "id": "c58ba5fa", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b55010c9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=2.0) Value(data=-3.0)\n" + ] + } + ], + "source": [ + "a = Value(2.0)\n", + "b = Value(-3.0)\n", + "c = Value(10.0)\n", + "print(a,b)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "b4fa6981", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "print(type(a))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "9c9aa016", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=-1.0)\n" + ] + } + ], + "source": [ + "print(a + b) \n", + "# internally python will call\n", + "# a.__add__(b)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "300b03af", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=-1.0)\n" + ] + } + ], + "source": [ + "newObj = a + b\n", + "print(newObj)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2149328a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=-6.0)\n" + ] + } + ], + "source": [ + "print(a * b)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "ef0efadd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=5.0)\n" + ] + } + ], + "source": [ + "print(a - b)" + ] + }, + { + "cell_type": "markdown", + "id": "26a99e24", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "88bf72a5", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "be3cf3ae", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "393809e6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=4.0)\n" + ] + } + ], + "source": [ + "print(a*b + c)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "6ac945d2", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=4.0)\n" + ] + } + ], + "source": [ + "# internally\n", + "print((a.__mul__(b)).__add__(c))" + ] + }, + { + "cell_type": "markdown", + "id": "499610a8", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "4ec15926", + "metadata": {}, + "outputs": [], + "source": [ + "a = Value(2.0)\n", + "b = Value(-3.0)\n", + "c = Value(10.0)\n", + "\n", + "# expression\n", + "d = a*b + c" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "2a2d24c3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=4.0)\n" + ] + } + ], + "source": [ + "print(d)" + ] + }, + { + "cell_type": "markdown", + "id": "2fa51d34", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "0feefd8c", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "18ce52f4", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "1d09b299", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "9307cbc3", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "8c8ab284", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "224e4058", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "74413de9", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "7119d25c", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "e21e97e6", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "373ee2fb", + "metadata": {}, + "source": [ + "# Updating Value Obj" + ] + }, + { + "cell_type": "markdown", + "id": "82572d4f", + "metadata": {}, + "source": [ + "### let's see connected tissue of expressions\n", + "### i.e what value produce what another value" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "d0797a90", + "metadata": {}, + "outputs": [], + "source": [ + "# Value Obj\n", + "\n", + "class Value:\n", + " \n", + " def __init__( self, data, _children=(), _op='' ):\n", + " self.data = data\n", + " self._prev = set(_children)\n", + " self._op = _op # operation\n", + " \n", + " # represents nicer looking expressions \n", + " def __repr__(self):\n", + " return f\"Value(data={self.data})\"\n", + " \n", + " def __add__(self, otherObj):\n", + " out = Value(self.data + otherObj.data, (self, otherObj), '+' )\n", + " return out\n", + " \n", + " def __mul__(self, otherObj):\n", + " out = Value(self.data * otherObj.data, (self, otherObj), '*')\n", + " return out\n", + " \n", + " def __sub__(self, otherObj):\n", + " out = Value(self.data - otherObj.data, (self, otherObj), '-')\n", + " return out" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "8b4dbf7d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=4.0)\n" + ] + } + ], + "source": [ + "a = Value(2.0)\n", + "b = Value(-3.0)\n", + "c = Value(10.0)\n", + "\n", + "# expression\n", + "d = a*b + c\n", + "print(d)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "5b514056", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{Value(data=-6.0), Value(data=10.0)}\n" + ] + } + ], + "source": [ + "print(d._prev)\n", + "\n", + "# a*b = -6,0\n", + "# c = 10.0" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "3a2fb276", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+\n" + ] + } + ], + "source": [ + "print(d._op)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "3711d771", + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "set()\n" + ] + } + ], + "source": [ + "print(a._prev)\n", + "# empty set --> 'cause its not produce from previous expression" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "07dae2a9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=-6.0)\n", + "Operation: *\n", + "z._prev = {Value(data=-3.0), Value(data=2.0)}\n" + ] + } + ], + "source": [ + "z = a*b\n", + "print(z)\n", + "print(\"Operation: \", z._op)\n", + "print(f\"{z._prev = }\")" + ] + }, + { + "cell_type": "markdown", + "id": "94465f89", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "id": "1e22c792", + "metadata": {}, + "source": [ + "# Step 1: Install Graphviz binary\n", + "\n", + "## Windows:\n", + "\n", + "1. Download Graphviz from [Graphviz website](http://www.graphviz.org/download/).\n", + "2. Add the following paths to the PATH environment variable (replace `{graphviz_version}` with the installed Graphviz version):\n", + " - `C:\\Program Files (x86)\\Graphviz{graphviz_version}\\bin`\n", + " - `C:\\Program Files (x86)\\Graphviz{graphviz_version}\\bin\\dot.exe`\n", + "3. Close any opened Jupyter notebook and the command prompt.\n", + "4. Restart Jupyter or the command prompt and test.\n", + "\n", + "## Linux:\n", + "\n", + "1. Update package information:\n", + " ```bash\n", + " sudo apt-get update\n", + " ```\n", + "2. Install Graphviz:\n", + " ```bash\n", + " sudo apt-get install graphviz\n", + " ```\n", + " or build it manually from [Graphviz website](http://www.graphviz.org/download/).\n", + "\n", + "# Step 2: Install graphviz module for python\n", + "\n", + "## pip:\n", + "\n", + "```bash\n", + "pip install graphviz\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "827332e6", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "id": "d38520ed", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "id": "54da19c4", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "id": "7c008950", + "metadata": {}, + "source": [ + " # Graph Tracing Explanation\n", + "\n", + "The provided Python code snippet demonstrates a function for tracing a graph using the Graphviz library. Let's break down its functionality:\n", + "\n", + "1. **Importing Dependencies**:\n", + " - `from graphviz import Digraph`: This line imports the `Digraph` class from the Graphviz library, which is used to represent directed graphs.\n", + "\n", + "2. **Defining the Trace Function**:\n", + " - `def trace(root)`: This function, named `trace`, is defined to trace a graph starting from a given root node.\n", + "\n", + "3. **Inside the Trace Function**:\n", + " - **Initializing Nodes and Edges**:\n", + " - `nodes, edges = set(), set()`: Two empty sets, `nodes` and `edges`, are initialized to store the nodes and edges of the graph, respectively.\n", + "\n", + " - **Defining the Build Function**:\n", + " - `def build(value)`: This function, `build`, is an inner function of `trace` responsible for recursively traversing the graph from a given node.\n", + "\n", + " - **Checking Node Existence**:\n", + " - `if value not in nodes:`: This condition checks if the current node `value` is not already in the set of nodes. If not, it adds the node to the `nodes` set.\n", + "\n", + " - **Traversing Through Predecessors**:\n", + " - `for child in value._prev:`: This loop iterates over the predecessors (or parents) of the current node `value`, as stored in the `_prev` attribute of the `value` object.\n", + "\n", + " - **Adding Edges**:\n", + " - `edges.add((child, value))`: For each predecessor `child`, it adds an edge from `child` to `value` to the set of `edges`.\n", + "\n", + " - **Recursive Call**:\n", + " - `build(child)`: Recursively calls the `build` function for each predecessor `child`, effectively exploring the graph depth-first.\n", + "\n", + " - **Initiating Tracing**:\n", + " - `build(root)`: This line initiates the tracing process by calling the `build` function with the root node of the graph.\n", + "\n", + " - **Returning Collected Nodes and Edges**:\n", + " - `return nodes, edges`: Finally, the function returns the sets of nodes and edges that were collected during the tracing process.\n", + "\n", + "This code is designed to trace the graph starting from a given root node, collecting all the nodes and edges encountered during the traversal. These sets of nodes and edges can then be used for further analysis or visualization.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "c439589b", + "metadata": {}, + "outputs": [], + "source": [ + "from graphviz import Digraph" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "90f4590d", + "metadata": {}, + "outputs": [], + "source": [ + "def trace(root):\n", + " # builds a set of all nodes and edges in graph\n", + " nodes, edges = set(), set()\n", + " print(\"nodes: \", nodes)\n", + " print(\"edges: \", edges)\n", + " def build(value):\n", + " print(\"value: \", value)\n", + " if value not in nodes:\n", + " nodes.add(value)\n", + " print(\"nodes: \", nodes)\n", + " \n", + " for child in value._prev:\n", + " print(\"value._prev: \", value._prev)\n", + " print(\"child: \", child)\n", + " edges.add((child, value))\n", + " print(\"edges: \", edges)\n", + " build(child)\n", + " \n", + " build(root)\n", + " print(\"final nodes: \", nodes)\n", + " print(\"final edges: \", edges)\n", + " return nodes, edges" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "51f9d80f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=-6.0)\n", + "----------------------\n", + "nodes: set()\n", + "edges: set()\n", + "value: Value(data=-6.0)\n", + "nodes: {Value(data=-6.0)}\n", + "value._prev: {Value(data=2.0), Value(data=-3.0)}\n", + "child: Value(data=2.0)\n", + "edges: {(Value(data=2.0), Value(data=-6.0))}\n", + "value: Value(data=2.0)\n", + "nodes: {Value(data=-6.0), Value(data=2.0)}\n", + "value._prev: {Value(data=2.0), Value(data=-3.0)}\n", + "child: Value(data=-3.0)\n", + "edges: {(Value(data=2.0), Value(data=-6.0)), (Value(data=-3.0), Value(data=-6.0))}\n", + "value: Value(data=-3.0)\n", + "nodes: {Value(data=-6.0), Value(data=2.0), Value(data=-3.0)}\n", + "final nodes: {Value(data=-6.0), Value(data=2.0), Value(data=-3.0)}\n", + "final edges: {(Value(data=2.0), Value(data=-6.0)), (Value(data=-3.0), Value(data=-6.0))}\n" + ] + }, + { + "data": { + "text/plain": [ + "({Value(data=-3.0), Value(data=-6.0), Value(data=2.0)},\n", + " {(Value(data=-3.0), Value(data=-6.0)), (Value(data=2.0), Value(data=-6.0))})" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = Value(2.0)\n", + "b = Value(-3.0)\n", + "c = Value(10.0)\n", + "\n", + "# expression\n", + "d = a*b\n", + "print(d)\n", + "print('----------------------')\n", + "trace(d)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "68945d0d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=4.0)\n", + "----------------------\n", + "nodes: set()\n", + "edges: set()\n", + "value: Value(data=4.0)\n", + "nodes: {Value(data=4.0)}\n", + "value._prev: {Value(data=-6.0), Value(data=10.0)}\n", + "child: Value(data=-6.0)\n", + "edges: {(Value(data=-6.0), Value(data=4.0))}\n", + "value: Value(data=-6.0)\n", + "nodes: {Value(data=-6.0), Value(data=4.0)}\n", + "value._prev: {Value(data=2.0), Value(data=-3.0)}\n", + "child: Value(data=2.0)\n", + "edges: {(Value(data=-6.0), Value(data=4.0)), (Value(data=2.0), Value(data=-6.0))}\n", + "value: Value(data=2.0)\n", + "nodes: {Value(data=-6.0), Value(data=4.0), Value(data=2.0)}\n", + "value._prev: {Value(data=2.0), Value(data=-3.0)}\n", + "child: Value(data=-3.0)\n", + "edges: {(Value(data=-6.0), Value(data=4.0)), (Value(data=2.0), Value(data=-6.0)), (Value(data=-3.0), Value(data=-6.0))}\n", + "value: Value(data=-3.0)\n", + "nodes: {Value(data=-6.0), Value(data=4.0), Value(data=-3.0), Value(data=2.0)}\n", + "value._prev: {Value(data=-6.0), Value(data=10.0)}\n", + "child: Value(data=10.0)\n", + "edges: {(Value(data=-6.0), Value(data=4.0)), (Value(data=2.0), Value(data=-6.0)), (Value(data=10.0), Value(data=4.0)), (Value(data=-3.0), Value(data=-6.0))}\n", + "value: Value(data=10.0)\n", + "nodes: {Value(data=-3.0), Value(data=4.0), Value(data=2.0), Value(data=-6.0), Value(data=10.0)}\n", + "final nodes: {Value(data=-3.0), Value(data=4.0), Value(data=2.0), Value(data=-6.0), Value(data=10.0)}\n", + "final edges: {(Value(data=-6.0), Value(data=4.0)), (Value(data=2.0), Value(data=-6.0)), (Value(data=10.0), Value(data=4.0)), (Value(data=-3.0), Value(data=-6.0))}\n" + ] + }, + { + "data": { + "text/plain": [ + "({Value(data=-3.0),\n", + " Value(data=-6.0),\n", + " Value(data=10.0),\n", + " Value(data=2.0),\n", + " Value(data=4.0)},\n", + " {(Value(data=-3.0), Value(data=-6.0)),\n", + " (Value(data=-6.0), Value(data=4.0)),\n", + " (Value(data=10.0), Value(data=4.0)),\n", + " (Value(data=2.0), Value(data=-6.0))})" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = Value(2.0)\n", + "b = Value(-3.0)\n", + "c = Value(10.0)\n", + "\n", + "# expression\n", + "d = a*b + c\n", + "print(d)\n", + "print('----------------------')\n", + "trace(d)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "3ab092e8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Value(data=-46.0)" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "complex_eg = a*b - c + b*c \n", + "complex_eg" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "ec032647", + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "nodes: set()\n", + "edges: set()\n", + "value: Value(data=-46.0)\n", + "nodes: {Value(data=-46.0)}\n", + "value._prev: {Value(data=-30.0), Value(data=-16.0)}\n", + "child: Value(data=-30.0)\n", + "edges: {(Value(data=-30.0), Value(data=-46.0))}\n", + "value: Value(data=-30.0)\n", + "nodes: {Value(data=-46.0), Value(data=-30.0)}\n", + "value._prev: {Value(data=-3.0), Value(data=10.0)}\n", + "child: Value(data=-3.0)\n", + "edges: {(Value(data=-3.0), Value(data=-30.0)), (Value(data=-30.0), Value(data=-46.0))}\n", + "value: Value(data=-3.0)\n", + "nodes: {Value(data=-3.0), Value(data=-46.0), Value(data=-30.0)}\n", + "value._prev: {Value(data=-3.0), Value(data=10.0)}\n", + "child: Value(data=10.0)\n", + "edges: {(Value(data=-3.0), Value(data=-30.0)), (Value(data=10.0), Value(data=-30.0)), (Value(data=-30.0), Value(data=-46.0))}\n", + "value: Value(data=10.0)\n", + "nodes: {Value(data=-3.0), Value(data=-46.0), Value(data=-30.0), Value(data=10.0)}\n", + "value._prev: {Value(data=-30.0), Value(data=-16.0)}\n", + "child: Value(data=-16.0)\n", + "edges: {(Value(data=-16.0), Value(data=-46.0)), (Value(data=-3.0), Value(data=-30.0)), (Value(data=10.0), Value(data=-30.0)), (Value(data=-30.0), Value(data=-46.0))}\n", + "value: Value(data=-16.0)\n", + "nodes: {Value(data=-3.0), Value(data=-46.0), Value(data=-16.0), Value(data=-30.0), Value(data=10.0)}\n", + "value._prev: {Value(data=10.0), Value(data=-6.0)}\n", + "child: Value(data=10.0)\n", + "edges: {(Value(data=-3.0), Value(data=-30.0)), (Value(data=10.0), Value(data=-30.0)), (Value(data=-16.0), Value(data=-46.0)), (Value(data=-30.0), Value(data=-46.0)), (Value(data=10.0), Value(data=-16.0))}\n", + "value: Value(data=10.0)\n", + "value._prev: {Value(data=10.0), Value(data=-6.0)}\n", + "child: Value(data=-6.0)\n", + "edges: {(Value(data=-6.0), Value(data=-16.0)), (Value(data=-3.0), Value(data=-30.0)), (Value(data=10.0), Value(data=-30.0)), (Value(data=-16.0), Value(data=-46.0)), (Value(data=-30.0), Value(data=-46.0)), (Value(data=10.0), Value(data=-16.0))}\n", + "value: Value(data=-6.0)\n", + "nodes: {Value(data=-3.0), Value(data=-46.0), Value(data=-16.0), Value(data=-6.0), Value(data=-30.0), Value(data=10.0)}\n", + "value._prev: {Value(data=2.0), Value(data=-3.0)}\n", + "child: Value(data=2.0)\n", + "edges: {(Value(data=-6.0), Value(data=-16.0)), (Value(data=-3.0), Value(data=-30.0)), (Value(data=10.0), Value(data=-30.0)), (Value(data=-16.0), Value(data=-46.0)), (Value(data=2.0), Value(data=-6.0)), (Value(data=-30.0), Value(data=-46.0)), (Value(data=10.0), Value(data=-16.0))}\n", + "value: Value(data=2.0)\n", + "nodes: {Value(data=-3.0), Value(data=-46.0), Value(data=-16.0), Value(data=-6.0), Value(data=2.0), Value(data=-30.0), Value(data=10.0)}\n", + "value._prev: {Value(data=2.0), Value(data=-3.0)}\n", + "child: Value(data=-3.0)\n", + "edges: {(Value(data=-6.0), Value(data=-16.0)), (Value(data=-3.0), Value(data=-30.0)), (Value(data=10.0), Value(data=-30.0)), (Value(data=-16.0), Value(data=-46.0)), (Value(data=2.0), Value(data=-6.0)), (Value(data=-3.0), Value(data=-6.0)), (Value(data=-30.0), Value(data=-46.0)), (Value(data=10.0), Value(data=-16.0))}\n", + "value: Value(data=-3.0)\n", + "final nodes: {Value(data=-3.0), Value(data=-46.0), Value(data=-16.0), Value(data=-6.0), Value(data=2.0), Value(data=-30.0), Value(data=10.0)}\n", + "final edges: {(Value(data=-6.0), Value(data=-16.0)), (Value(data=-3.0), Value(data=-30.0)), (Value(data=10.0), Value(data=-30.0)), (Value(data=-16.0), Value(data=-46.0)), (Value(data=2.0), Value(data=-6.0)), (Value(data=-3.0), Value(data=-6.0)), (Value(data=-30.0), Value(data=-46.0)), (Value(data=10.0), Value(data=-16.0))}\n" + ] + }, + { + "data": { + "text/plain": [ + "({Value(data=-16.0),\n", + " Value(data=-3.0),\n", + " Value(data=-30.0),\n", + " Value(data=-46.0),\n", + " Value(data=-6.0),\n", + " Value(data=10.0),\n", + " Value(data=2.0)},\n", + " {(Value(data=-16.0), Value(data=-46.0)),\n", + " (Value(data=-3.0), Value(data=-30.0)),\n", + " (Value(data=-3.0), Value(data=-6.0)),\n", + " (Value(data=-30.0), Value(data=-46.0)),\n", + " (Value(data=-6.0), Value(data=-16.0)),\n", + " (Value(data=10.0), Value(data=-16.0)),\n", + " (Value(data=10.0), Value(data=-30.0)),\n", + " (Value(data=2.0), Value(data=-6.0))})" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "trace(complex_eg)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "4938b467", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "nodes: set()\n", + "edges: set()\n", + "value: Value(data=4.0)\n", + "nodes: {Value(data=4.0)}\n", + "value._prev: {Value(data=-6.0), Value(data=10.0)}\n", + "child: Value(data=-6.0)\n", + "edges: {(Value(data=-6.0), Value(data=4.0))}\n", + "value: Value(data=-6.0)\n", + "nodes: {Value(data=-6.0), Value(data=4.0)}\n", + "value._prev: {Value(data=2.0), Value(data=-3.0)}\n", + "child: Value(data=2.0)\n", + "edges: {(Value(data=-6.0), Value(data=4.0)), (Value(data=2.0), Value(data=-6.0))}\n", + "value: Value(data=2.0)\n", + "nodes: {Value(data=-6.0), Value(data=4.0), Value(data=2.0)}\n", + "value._prev: {Value(data=2.0), Value(data=-3.0)}\n", + "child: Value(data=-3.0)\n", + "edges: {(Value(data=-6.0), Value(data=4.0)), (Value(data=2.0), Value(data=-6.0)), (Value(data=-3.0), Value(data=-6.0))}\n", + "value: Value(data=-3.0)\n", + "nodes: {Value(data=-6.0), Value(data=4.0), Value(data=-3.0), Value(data=2.0)}\n", + "value._prev: {Value(data=-6.0), Value(data=10.0)}\n", + "child: Value(data=10.0)\n", + "edges: {(Value(data=-6.0), Value(data=4.0)), (Value(data=2.0), Value(data=-6.0)), (Value(data=10.0), Value(data=4.0)), (Value(data=-3.0), Value(data=-6.0))}\n", + "value: Value(data=10.0)\n", + "nodes: {Value(data=-3.0), Value(data=4.0), Value(data=2.0), Value(data=-6.0), Value(data=10.0)}\n", + "final nodes: {Value(data=-3.0), Value(data=4.0), Value(data=2.0), Value(data=-6.0), Value(data=10.0)}\n", + "final edges: {(Value(data=-6.0), Value(data=4.0)), (Value(data=2.0), Value(data=-6.0)), (Value(data=10.0), Value(data=4.0)), (Value(data=-3.0), Value(data=-6.0))}\n" + ] + }, + { + "data": { + "text/plain": [ + "({Value(data=-3.0),\n", + " Value(data=-6.0),\n", + " Value(data=10.0),\n", + " Value(data=2.0),\n", + " Value(data=4.0)},\n", + " {(Value(data=-3.0), Value(data=-6.0)),\n", + " (Value(data=-6.0), Value(data=4.0)),\n", + " (Value(data=10.0), Value(data=4.0)),\n", + " (Value(data=2.0), Value(data=-6.0))})" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "trace(d)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6ebfaa92", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "4d138bda", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=2.0)\n" + ] + } + ], + "source": [ + "print(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "f7bbf314", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "nodes: set()\n", + "edges: set()\n", + "value: Value(data=2.0)\n", + "nodes: {Value(data=2.0)}\n", + "final nodes: {Value(data=2.0)}\n", + "final edges: set()\n" + ] + }, + { + "data": { + "text/plain": [ + "({Value(data=2.0)}, set())" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "trace(a)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b3c7a4f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "64f158a4", + "metadata": {}, + "source": [ + "### Recursion is a programming technique where a function calls itself directly or indirectly to solve a problem." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "6dc00910", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5\n", + "10\n", + "20\n", + "40\n", + "80\n" + ] + } + ], + "source": [ + "# recursion\n", + "def add(n):\n", + " print(n) \n", + " if n < 100:\n", + " n += n\n", + " if n < 100:\n", + " add(n)\n", + "add(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "db570503", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5\n", + "10\n", + "20\n", + "40\n", + "80\n" + ] + } + ], + "source": [ + "def lol(n):\n", + " while(n<100):\n", + " print(n) \n", + " n += n\n", + "lol(5)" + ] + }, + { + "cell_type": "markdown", + "id": "bbb9e613", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "9d51c00f", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "2556097297712\n", + "2556097296944\n", + "2556097297904\n", + "2556097463728\n", + "2556097038656\n", + "2556097038656\n", + "\n", + "\n" + ] + } + ], + "source": [ + "print(type(id(a)))\n", + "\n", + "print(id(a))\n", + "print(id(b))\n", + "print(id(c))\n", + "print(id(d))\n", + "\n", + "print(id(z))\n", + "print(str(id(z)))\n", + "\n", + "print(type(id(z)))\n", + "print(type(str(id(z))))" + ] + }, + { + "cell_type": "markdown", + "id": "8ba76eeb", + "metadata": {}, + "source": [ + "### " + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "bdec0928", + "metadata": {}, + "outputs": [], + "source": [ + "# Value Obj\n", + "\n", + "class Value:\n", + " \n", + " def __init__( self, data, _children=(), _operation='' ):\n", + " self.data = data\n", + " self._prev = set(_children)\n", + " self._op = _operation\n", + " \n", + " # represents nicer looking expressions \n", + " def __repr__(self):\n", + " return f\"Value(data={self.data})\"\n", + " \n", + " def __add__(self, otherObj):\n", + " # return NEW Value Obj \n", + " out = Value(self.data + otherObj.data, (self, otherObj), '+' )\n", + " return out\n", + " \n", + " def __mul__(self, otherObj):\n", + " out = Value(self.data * otherObj.data, (self, otherObj), '*')\n", + " return out\n", + " \n", + " def __sub__(self, otherObj):\n", + " out = Value(self.data - otherObj.data, (self, otherObj), '-')\n", + " return out" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "4be74ef5", + "metadata": {}, + "outputs": [], + "source": [ + "from graphviz import Digraph\n", + "\n", + "def trace(root):\n", + " # builds a set of all nodes and edges in graph\n", + " nodes, edges = set(), set()\n", + " def build(v):\n", + " if v not in nodes:\n", + " nodes.add(v)\n", + " for child in v._prev:\n", + " edges.add((child, v))\n", + " build(child)\n", + " build(root)\n", + " return nodes, edges\n", + "\n", + "def draw_dot(root):\n", + " dot = Digraph(format='svg', graph_attr={'rankdir': 'LR'}) # LR = left to right\n", + "\n", + " nodes, edges = trace(root)\n", + " print(f\"{nodes = }, {edges = }\")\n", + " for n in nodes:\n", + " print(f\"node = {n}\")\n", + " uid = str(id(n))\n", + " print(f\"{uid = }\")\n", + " # for any value in the graph, create a rectangular ('record') node for it\n", + " dot.node(name = uid, label = \"{ data %.4f }\" % (n.data, ), shape='record', color='orange', style=\"filled\")\n", + " if n._op:\n", + " print(f\"{n._op = }\")\n", + " # if this value is result of some operation , create an op node for it\n", + " dot.node(name = uid + n._op, label = n._op)\n", + " # and connect this node to it\n", + " dot.edge(uid + n._op, uid)\n", + " \n", + " for n1, n2 in edges:\n", + " print(f\"{n1 = }, {n2 = }\")\n", + " # connect n1 node to op node of n2\n", + " dot.edge(str(id(n1)), str(id(n2)) + n2._op)\n", + " \n", + " print(f\"{dot = }\")\n", + " return dot" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "bc0a38ff", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "d = Value(data=-1.0)\n", + "\n", + "nodes = {Value(data=-1.0), Value(data=-3.0), Value(data=2.0)}, edges = {(Value(data=-3.0), Value(data=-1.0)), (Value(data=2.0), Value(data=-1.0))}\n", + "node = Value(data=-1.0)\n", + "uid = '2556097648512'\n", + "n._op = '+'\n", + "node = Value(data=-3.0)\n", + "uid = '2556097650528'\n", + "node = Value(data=2.0)\n", + "uid = '2556097657968'\n", + "n1 = Value(data=-3.0), n2 = Value(data=-1.0)\n", + "n1 = Value(data=2.0), n2 = Value(data=-1.0)\n", + "dot = \n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097648512\n", + "\n", + "data -1.0000\n", + "\n", + "\n", + "\n", + "2556097648512+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556097648512+->2556097648512\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097650528\n", + "\n", + "data -3.0000\n", + "\n", + "\n", + "\n", + "2556097650528->2556097648512+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097657968\n", + "\n", + "data 2.0000\n", + "\n", + "\n", + "\n", + "2556097657968->2556097648512+\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = Value(2.0)\n", + "b = Value(-3.0)\n", + "c = Value(10.0)\n", + "\n", + "# expression\n", + "d = a+b\n", + "print(f\"{d = }\\n\")\n", + "draw_dot(d)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "0b37bc22", + "metadata": {}, + "outputs": [], + "source": [ + "a = Value(2.0)\n", + "b = Value(-3.0)\n", + "c = Value(10.0)\n", + "\n", + "# expression\n", + "d = a*b + c" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "8d7509cc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "nodes = {Value(data=10.0), Value(data=-3.0), Value(data=2.0), Value(data=4.0), Value(data=-6.0)}, edges = {(Value(data=2.0), Value(data=-6.0)), (Value(data=10.0), Value(data=4.0)), (Value(data=-3.0), Value(data=-6.0)), (Value(data=-6.0), Value(data=4.0))}\n", + "node = Value(data=10.0)\n", + "uid = '2556097655376'\n", + "node = Value(data=-3.0)\n", + "uid = '2556097649760'\n", + "node = Value(data=2.0)\n", + "uid = '2556097656432'\n", + "node = Value(data=4.0)\n", + "uid = '2556097650384'\n", + "n._op = '+'\n", + "node = Value(data=-6.0)\n", + "uid = '2556097655088'\n", + "n._op = '*'\n", + "n1 = Value(data=2.0), n2 = Value(data=-6.0)\n", + "n1 = Value(data=10.0), n2 = Value(data=4.0)\n", + "n1 = Value(data=-3.0), n2 = Value(data=-6.0)\n", + "n1 = Value(data=-6.0), n2 = Value(data=4.0)\n", + "dot = \n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097655376\n", + "\n", + "data 10.0000\n", + "\n", + "\n", + "\n", + "2556097650384+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556097655376->2556097650384+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097649760\n", + "\n", + "data -3.0000\n", + "\n", + "\n", + "\n", + "2556097655088*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556097649760->2556097655088*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097656432\n", + "\n", + "data 2.0000\n", + "\n", + "\n", + "\n", + "2556097656432->2556097655088*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097650384\n", + "\n", + "data 4.0000\n", + "\n", + "\n", + "\n", + "2556097650384+->2556097650384\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097655088\n", + "\n", + "data -6.0000\n", + "\n", + "\n", + "\n", + "2556097655088->2556097650384+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097655088*->2556097655088\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "draw_dot(d)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "529aca72", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "nodes = {Value(data=2.0)}, edges = set()\n", + "node = Value(data=2.0)\n", + "uid = '2556097656432'\n", + "dot = \n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097656432\n", + "\n", + "data 2.0000\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "draw_dot(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "ea95ed71", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "nodes = {Value(data=-6.0), Value(data=-3.0), Value(data=2.0)}, edges = {(Value(data=2.0), Value(data=-6.0)), (Value(data=-3.0), Value(data=-6.0))}\n", + "node = Value(data=-6.0)\n", + "uid = '2556097038656'\n", + "n._op = '*'\n", + "node = Value(data=-3.0)\n", + "uid = '2556096819936'\n", + "node = Value(data=2.0)\n", + "uid = '2556096813936'\n", + "n1 = Value(data=2.0), n2 = Value(data=-6.0)\n", + "n1 = Value(data=-3.0), n2 = Value(data=-6.0)\n", + "dot = \n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097038656\n", + "\n", + "data -6.0000\n", + "\n", + "\n", + "\n", + "2556097038656*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556097038656*->2556097038656\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556096819936\n", + "\n", + "data -3.0000\n", + "\n", + "\n", + "\n", + "2556096819936->2556097038656*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556096813936\n", + "\n", + "data 2.0000\n", + "\n", + "\n", + "\n", + "2556096813936->2556097038656*\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "draw_dot(z)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "355dfd17", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "nodes = {Value(data=-3.0), Value(data=-46.0), Value(data=-16.0), Value(data=-6.0), Value(data=2.0), Value(data=-30.0), Value(data=10.0)}, edges = {(Value(data=-6.0), Value(data=-16.0)), (Value(data=-3.0), Value(data=-30.0)), (Value(data=10.0), Value(data=-30.0)), (Value(data=-16.0), Value(data=-46.0)), (Value(data=2.0), Value(data=-6.0)), (Value(data=-3.0), Value(data=-6.0)), (Value(data=-30.0), Value(data=-46.0)), (Value(data=10.0), Value(data=-16.0))}\n", + "node = Value(data=-3.0)\n", + "uid = '2556097296944'\n", + "node = Value(data=-46.0)\n", + "uid = '2556097298000'\n", + "n._op = '+'\n", + "node = Value(data=-16.0)\n", + "uid = '2556097295072'\n", + "n._op = '-'\n", + "node = Value(data=-6.0)\n", + "uid = '2556097297136'\n", + "n._op = '*'\n", + "node = Value(data=2.0)\n", + "uid = '2556097297712'\n", + "node = Value(data=-30.0)\n", + "uid = '2556097296224'\n", + "n._op = '*'\n", + "node = Value(data=10.0)\n", + "uid = '2556097297904'\n", + "n1 = Value(data=-6.0), n2 = Value(data=-16.0)\n", + "n1 = Value(data=-3.0), n2 = Value(data=-30.0)\n", + "n1 = Value(data=10.0), n2 = Value(data=-30.0)\n", + "n1 = Value(data=-16.0), n2 = Value(data=-46.0)\n", + "n1 = Value(data=2.0), n2 = Value(data=-6.0)\n", + "n1 = Value(data=-3.0), n2 = Value(data=-6.0)\n", + "n1 = Value(data=-30.0), n2 = Value(data=-46.0)\n", + "n1 = Value(data=10.0), n2 = Value(data=-16.0)\n", + "dot = \n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097296944\n", + "\n", + "data -3.0000\n", + "\n", + "\n", + "\n", + "2556097297136*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556097296944->2556097297136*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097296224*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556097296944->2556097296224*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097298000\n", + "\n", + "data -46.0000\n", + "\n", + "\n", + "\n", + "2556097298000+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556097298000+->2556097298000\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097295072\n", + "\n", + "data -16.0000\n", + "\n", + "\n", + "\n", + "2556097295072->2556097298000+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097295072-\n", + "\n", + "-\n", + "\n", + "\n", + "\n", + "2556097295072-->2556097295072\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097297136\n", + "\n", + "data -6.0000\n", + "\n", + "\n", + "\n", + "2556097297136->2556097295072-\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097297136*->2556097297136\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097297712\n", + "\n", + "data 2.0000\n", + "\n", + "\n", + "\n", + "2556097297712->2556097297136*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097296224\n", + "\n", + "data -30.0000\n", + "\n", + "\n", + "\n", + "2556097296224->2556097298000+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097296224*->2556097296224\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097297904\n", + "\n", + "data 10.0000\n", + "\n", + "\n", + "\n", + "2556097297904->2556097295072-\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097297904->2556097296224*\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "draw_dot(complex_eg)" + ] + }, + { + "cell_type": "markdown", + "id": "f434999c", + "metadata": {}, + "source": [ + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "318b437c", + "metadata": {}, + "source": [ + "# Updating Value Obj\n", + "## assigning label" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "82b60897", + "metadata": {}, + "outputs": [], + "source": [ + "# Value Obj\n", + "\n", + "class Value:\n", + " \n", + "\n", + " def __init__( self, data, _children=(), _operation='', label='' ):\n", + " self.data = data\n", + " self._prev = set(_children)\n", + " self._op = _operation\n", + " self.label = label\n", + " \n", + " # represents nicer looking expressions \n", + " def __repr__(self):\n", + " return f\"Value(data={self.data})\"\n", + " \n", + " def __add__(self, otherObj):\n", + " # return NEW Value Obj \n", + " out = Value(self.data + otherObj.data, (self, otherObj), '+' )\n", + " return out\n", + " \n", + " def __mul__(self, otherObj):\n", + " out = Value(self.data * otherObj.data, (self, otherObj), '*')\n", + " return out\n", + " \n", + " def __sub__(self, otherObj):\n", + " out = Value(self.data - otherObj.data, (self, otherObj), '-')\n", + " return out" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "39e14cd4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Value(data=-8.0)" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = Value(2.0, label='a')\n", + "b = Value(-3.0, label='b')\n", + "c = Value(10.0, label='c')\n", + "\n", + "# expression\n", + "e = a*b; e.label='e'\n", + "d = e + c; d.label='d'\n", + "f = Value(-2.0, label='f')\n", + "\n", + "L = d*f ; L.label='L'\n", + "L" + ] + }, + { + "cell_type": "markdown", + "id": "70f0b2d2", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "id": "8348760c", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "46744edf", + "metadata": {}, + "outputs": [], + "source": [ + "from graphviz import Digraph\n", + "\n", + "def trace(root):\n", + " # builds a set of all nodes and edges in graph\n", + " nodes, edges = set(), set()\n", + " def build(v):\n", + " if v not in nodes:\n", + " nodes.add(v)\n", + " for child in v._prev:\n", + " edges.add((child, v))\n", + " build(child)\n", + " build(root)\n", + " return nodes, edges\n", + "\n", + "def draw_dot(root):\n", + " dot = Digraph(format='svg', graph_attr={'rankdir': 'LR'}) # LR = left to right, TB = Top to Bottom\n", + "\n", + " nodes, edges = trace(root)\n", + " for n in nodes:\n", + " uid = str(id(n))\n", + " # for any value in the graph, create a rectangular ('record') node for it\n", + " dot.node(name = uid, label = \"{ %s | data %.4f }\" % (n.label, n.data, ), shape='record')\n", + " if n._op:\n", + " # if this value is result of some operation , create an op node for it\n", + " dot.node(name = uid + n._op, label = n._op)\n", + " # and connect this node to it\n", + " dot.edge(uid + n._op, uid)\n", + " \n", + " for n1, n2 in edges:\n", + " # connect n1 node to op node of n2\n", + " dot.edge(str(id(n1)), str(id(n2)) + n2._op)\n", + " \n", + " return dot" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "f4d66e13", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097653792\n", + "\n", + "c\n", + "\n", + "data 10.0000\n", + "\n", + "\n", + "\n", + "2556097645632+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556097653792->2556097645632+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097645632\n", + "\n", + "d\n", + "\n", + "data 4.0000\n", + "\n", + "\n", + "\n", + "2556097645632+->2556097645632\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097654464\n", + "\n", + "a\n", + "\n", + "data 2.0000\n", + "\n", + "\n", + "\n", + "2556097642704*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556097654464->2556097642704*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097642704\n", + "\n", + "e\n", + "\n", + "data -6.0000\n", + "\n", + "\n", + "\n", + "2556097642704->2556097645632+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097642704*->2556097642704\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097655136\n", + "\n", + "b\n", + "\n", + "data -3.0000\n", + "\n", + "\n", + "\n", + "2556097655136->2556097642704*\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "draw_dot(d)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "45a41669", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097653792\n", + "\n", + "c\n", + "\n", + "data 10.0000\n", + "\n", + "\n", + "\n", + "2556097645632+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556097653792->2556097645632+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097645632\n", + "\n", + "d\n", + "\n", + "data 4.0000\n", + "\n", + "\n", + "\n", + "2556097650816*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556097645632->2556097650816*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097645632+->2556097645632\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097650816\n", + "\n", + "L\n", + "\n", + "data -8.0000\n", + "\n", + "\n", + "\n", + "2556097650816*->2556097650816\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097654464\n", + "\n", + "a\n", + "\n", + "data 2.0000\n", + "\n", + "\n", + "\n", + "2556097642704*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556097654464->2556097642704*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097642704\n", + "\n", + "e\n", + "\n", + "data -6.0000\n", + "\n", + "\n", + "\n", + "2556097642704->2556097645632+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097642704*->2556097642704\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097657680\n", + "\n", + "f\n", + "\n", + "data -2.0000\n", + "\n", + "\n", + "\n", + "2556097657680->2556097650816*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097655136\n", + "\n", + "b\n", + "\n", + "data -3.0000\n", + "\n", + "\n", + "\n", + "2556097655136->2556097642704*\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "draw_dot(L)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "0eff316e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "digraph {\n", + "\tgraph [rankdir=LR]\n", + "\t2556097653792 [label=\"{ c | data 10.0000 }\" shape=record]\n", + "\t2556097645632 [label=\"{ d | data 4.0000 }\" shape=record]\n", + "\t\"2556097645632+\" [label=\"+\"]\n", + "\t\"2556097645632+\" -> 2556097645632\n", + "\t2556097650816 [label=\"{ L | data -8.0000 }\" shape=record]\n", + "\t\"2556097650816*\" [label=\"*\"]\n", + "\t\"2556097650816*\" -> 2556097650816\n", + "\t2556097654464 [label=\"{ a | data 2.0000 }\" shape=record]\n", + "\t2556097642704 [label=\"{ e | data -6.0000 }\" shape=record]\n", + "\t\"2556097642704*\" [label=\"*\"]\n", + "\t\"2556097642704*\" -> 2556097642704\n", + "\t2556097657680 [label=\"{ f | data -2.0000 }\" shape=record]\n", + "\t2556097655136 [label=\"{ b | data -3.0000 }\" shape=record]\n", + "\t2556097645632 -> \"2556097650816*\"\n", + "\t2556097655136 -> \"2556097642704*\"\n", + "\t2556097642704 -> \"2556097645632+\"\n", + "\t2556097654464 -> \"2556097642704*\"\n", + "\t2556097657680 -> \"2556097650816*\"\n", + "\t2556097653792 -> \"2556097645632+\"\n", + "}\n", + "\n" + ] + } + ], + "source": [ + "print(draw_dot(L))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b3da8f62", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "86056c2b", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "3bcd8e7f", + "metadata": {}, + "outputs": [], + "source": [ + "# Value Obj\n", + "\n", + "class Value:\n", + " \n", + " def __init__( self, data, _children=(), _operation='', label='' ):\n", + " self.data = data\n", + " self.grad = 0.0\n", + " self._prev = set(_children)\n", + " self._op = _operation\n", + " self.label = label\n", + " \n", + " # represents nicer looking expressions \n", + " def __repr__(self):\n", + " return f\"Value(data={self.data})\"\n", + " \n", + " def __add__(self, otherObj):\n", + " # return NEW Value Obj \n", + " out = Value(self.data + otherObj.data, (self, otherObj), '+' )\n", + " return out\n", + " \n", + " def __mul__(self, otherObj):\n", + " out = Value(self.data * otherObj.data, (self, otherObj), '*')\n", + " return out\n", + " \n", + " def __sub__(self, otherObj):\n", + " out = Value(self.data - otherObj.data, (self, otherObj), '-')\n", + " return out" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "fb5b5fc6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Value(data=-8.0)" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = Value(2.0, label='a')\n", + "b = Value(-3.0, label='b')\n", + "c = Value(10.0, label='c')\n", + "\n", + "# expression\n", + "e = a*b; e.label='e'\n", + "d = e + c; d.label='d'\n", + "f = Value(-2.0, label='f')\n", + "\n", + "L = d*f ; L.label='L'\n", + "L" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "11aabb77", + "metadata": {}, + "outputs": [], + "source": [ + "from graphviz import Digraph\n", + "\n", + "def trace(root):\n", + " # builds a set of all nodes and edges in graph\n", + " nodes, edges = set(), set()\n", + " def build(v):\n", + " if v not in nodes:\n", + " nodes.add(v)\n", + " for child in v._prev:\n", + " edges.add((child, v))\n", + " build(child)\n", + " build(root)\n", + " return nodes, edges\n", + "\n", + "def draw_dot(root):\n", + " dot = Digraph(format='svg', graph_attr={'rankdir': 'LR'}) # LR = left to right, TB = Top to Bottom\n", + "\n", + " nodes, edges = trace(root)\n", + " for n in nodes:\n", + " uid = str(id(n))\n", + " # for any value in the graph, create a rectangular ('record') node for it\n", + " dot.node(name = uid, label = \"{ %s | data %.4f | grad %.4f }\" % (n.label, n.data, n.grad ), shape='record')\n", + " if n._op:\n", + " # if this value is result of some operation , create an op node for it\n", + " dot.node(name = uid + n._op, label = n._op)\n", + " # and connect this node to it\n", + " dot.edge(uid + n._op, uid)\n", + " \n", + " for n1, n2 in edges:\n", + " # connect n1 node to op node of n2\n", + " dot.edge(str(id(n1)), str(id(n2)) + n2._op)\n", + " \n", + " return dot" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "8bc64024", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097647120\n", + "\n", + "f\n", + "\n", + "data -2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097650912*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556097647120->2556097650912*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097648608\n", + "\n", + "a\n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097645536*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556097648608->2556097645536*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097650912\n", + "\n", + "L\n", + "\n", + "data -8.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097650912*->2556097650912\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097646832\n", + "\n", + "b\n", + "\n", + "data -3.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097646832->2556097645536*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097645872\n", + "\n", + "d\n", + "\n", + "data 4.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097645872->2556097650912*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097645872+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556097645872+->2556097645872\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097656240\n", + "\n", + "c\n", + "\n", + "data 10.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097656240->2556097645872+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097645536\n", + "\n", + "e\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097645536->2556097645872+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097645536*->2556097645536\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "draw_dot(L)\n", + "# grad represents derivative of o/p w.r.t these values\n", + "# e.g: grad represents derivative of L w.r.t d as well as f" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "b3ee7a51", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-2.000000000000668\n" + ] + } + ], + "source": [ + "def lol():\n", + " \n", + " h = 0.001\n", + " \n", + " a = Value(2.0,label=\"a\")\n", + " b = Value(-3.0,label=\"b\")\n", + " c = Value(10,label=\"c\")\n", + " e = a * b; e.label='e'\n", + " d = e + c; d.label='d'\n", + " f = Value(-2.0, label='f')\n", + " L = d * f; L.label='L'\n", + " L1 = L.data\n", + " \n", + " a = Value(2.0,label=\"a\") \n", + " b = Value(-3.0,label=\"b\")\n", + " c = Value(10,label=\"c\")\n", + " e = a * b; e.label='e'\n", + " d = e + c; d.label='d'\n", + " d.data += h; # small increment in d\n", + " f = Value(-2.0, label='f')\n", + " L = d * f; L.label='L'\n", + " L2 = L.data\n", + " \n", + " print((L2 - L1)/h)\n", + "\n", + "# derivative of 'L' w.r.t. 'd'\n", + "lol()" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "acabe85f", + "metadata": {}, + "outputs": [], + "source": [ + "# L = d * f\n", + "# derivative of L w.r.t. d: \n", + "# dL/dd = 1 * f\n", + "# dL/dd = -2\n", + "\n", + "# Also:\n", + "# (f(x+h) - f(x))/h\n", + "# ((d+h)*f - d*f)/h\n", + "# (d*f + h*f - d*f)/h\n", + "# (h*f)/h\n", + "# f\n", + "# -2" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "d6c4f983", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097647120\n", + "\n", + "f\n", + "\n", + "data -2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097650912*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556097647120->2556097650912*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097648608\n", + "\n", + "a\n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097645536*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556097648608->2556097645536*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097650912\n", + "\n", + "L\n", + "\n", + "data -8.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097650912*->2556097650912\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097646832\n", + "\n", + "b\n", + "\n", + "data -3.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097646832->2556097645536*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097645872\n", + "\n", + "d\n", + "\n", + "data 4.0000\n", + "\n", + "grad -2.0000\n", + "\n", + "\n", + "\n", + "2556097645872->2556097650912*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097645872+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556097645872+->2556097645872\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097656240\n", + "\n", + "c\n", + "\n", + "data 10.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097656240->2556097645872+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097645536\n", + "\n", + "e\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097645536->2556097645872+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097645536*->2556097645536\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Therefore\n", + "d.grad = -2.0\n", + "draw_dot(L)" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "ce5b143f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-1.9999999999988916\n" + ] + } + ], + "source": [ + "# Similarly\n", + "def lol():\n", + " \n", + " h = 0.001\n", + " \n", + " a = Value(2.0,label=\"a\")\n", + " b = Value(-3.0,label=\"b\")\n", + " c = Value(10,label=\"c\")\n", + " e = a * b; e.label='e'\n", + " d = e + c; d.label='d'\n", + " f = Value(-2.0, label='f')\n", + " L = d * f; L.label='L'\n", + " L1 = L.data\n", + " \n", + " a = Value(2.0,label=\"a\") \n", + " b = Value(-3.0,label=\"b\")\n", + " c = Value(10 + h,label=\"c\") # small increment in c\n", + " e = a * b; e.label='e'\n", + " d = e + c; d.label='d'\n", + " f = Value(-2.0, label='f')\n", + " L = d * f; L.label='L'\n", + " L2 = L.data\n", + " \n", + " print((L2 - L1)/h)\n", + "\n", + "# derivative of 'L' w.r.t. 'c'\n", + "lol()" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "14dca371", + "metadata": {}, + "outputs": [], + "source": [ + "# L = d * f\n", + "# L = (e+c) * f\n", + "# (by chain rule...)\n", + "# derivative of L w.r.t. c: \n", + "# dL/dc = (dL/dd) * (dd/dc)\n", + "# dL/dc = -2 * (de/dc + dc/dc)\n", + "# dL/dc = -2 * (0 + 1)\n", + "# dL/dc = -2 \n", + "\n", + "# Also:\n", + "# (f(x+h) - f(x))/h\n", + "# ((e + (c+h))*f - ((e+c)*f))/h\n", + "# ((e*f+c*f+h*f) - (e*f + c*f))/h\n", + "# (h*f)/h\n", + "# f\n", + "# -2" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "4d46c15b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097647120\n", + "\n", + "f\n", + "\n", + "data -2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097650912*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556097647120->2556097650912*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097648608\n", + "\n", + "a\n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097645536*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556097648608->2556097645536*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097650912\n", + "\n", + "L\n", + "\n", + "data -8.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097650912*->2556097650912\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097646832\n", + "\n", + "b\n", + "\n", + "data -3.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097646832->2556097645536*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097645872\n", + "\n", + "d\n", + "\n", + "data 4.0000\n", + "\n", + "grad -2.0000\n", + "\n", + "\n", + "\n", + "2556097645872->2556097650912*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097645872+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556097645872+->2556097645872\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097656240\n", + "\n", + "c\n", + "\n", + "data 10.0000\n", + "\n", + "grad -2.0000\n", + "\n", + "\n", + "\n", + "2556097656240->2556097645872+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097645536\n", + "\n", + "e\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097645536->2556097645872+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097645536*->2556097645536\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Therefore\n", + "c.grad = -2.0\n", + "draw_dot(L)" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "6395cdb0", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097647120\n", + "\n", + "f\n", + "\n", + "data -2.0000\n", + "\n", + "grad 4.0000\n", + "\n", + "\n", + "\n", + "2556097650912*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556097647120->2556097650912*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097648608\n", + "\n", + "a\n", + "\n", + "data 2.0000\n", + "\n", + "grad 6.0000\n", + "\n", + "\n", + "\n", + "2556097645536*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556097648608->2556097645536*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097650912\n", + "\n", + "L\n", + "\n", + "data -8.0000\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2556097650912*->2556097650912\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097646832\n", + "\n", + "b\n", + "\n", + "data -3.0000\n", + "\n", + "grad -4.0000\n", + "\n", + "\n", + "\n", + "2556097646832->2556097645536*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097645872\n", + "\n", + "d\n", + "\n", + "data 4.0000\n", + "\n", + "grad -2.0000\n", + "\n", + "\n", + "\n", + "2556097645872->2556097650912*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097645872+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556097645872+->2556097645872\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097656240\n", + "\n", + "c\n", + "\n", + "data 10.0000\n", + "\n", + "grad -2.0000\n", + "\n", + "\n", + "\n", + "2556097656240->2556097645872+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097645536\n", + "\n", + "e\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097645536->2556097645872+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097645536*->2556097645536\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Similarly\n", + "a.grad = 6.0\n", + "b.grad = -4.0\n", + "c.grad = -2.0\n", + "f.grad = 4.0\n", + "L.grad = 1.0\n", + "\n", + "draw_dot(L)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3693769c", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "9c332e75", + "metadata": {}, + "source": [ + "![neuron_model](https://www.cs.toronto.edu/~lczhang/360/lec/w02/imgs/neuron_model.jpeg)\n" + ] + }, + { + "cell_type": "markdown", + "id": "f214e409", + "metadata": {}, + "source": [ + "### Understanding Neurons in Machine Learning\n", + "\n", + "In machine learning, a neuron, also known as a node or unit, is a fundamental building block of artificial neural networks (ANNs). Inspired by biological neurons, these computational units process input data and produce an output signal, which serves as input to subsequent layers or the final output of the network.\n", + "\n", + "#### Anatomy of a Neuron:\n", + "\n", + "A typical neuron consists of the following components:\n", + "\n", + "1. **Inputs (x)**: Neurons receive input signals from other neurons or directly from the input data. Each input is associated with a weight that determines its contribution to the neuron's output.\n", + "\n", + "2. **Weights (w)**: Weights represent the strength of connections between neurons. They are adjustable parameters learned during the training process, allowing the network to adapt and optimize its performance.\n", + "\n", + "3. **Activation Function (f)**: The activation function determines the output of the neuron based on the weighted sum of its inputs. Common activation functions include sigmoid, tanh, ReLU, and softmax, each with its own properties and use cases.\n", + "\n", + "4. **Bias (b)**: The bias is an additional parameter added to the weighted sum before applying the activation function. It allows the neuron to learn an offset from zero, providing flexibility in modeling complex relationships in the data.\n", + "\n", + "5. **Output (y)**: The output of the neuron is the result of applying the activation function to the weighted sum of inputs and bias. It represents the neuron's response to the input data.\n", + "\n", + "#### Neuron Operation:\n", + "\n", + "The operation of a neuron can be summarized as follows:\n", + "\n", + "1. **Input Aggregation**: The neuron calculates the weighted sum of its inputs, incorporating the contribution of each input based on its associated weight.\n", + "\n", + "2. **Adding Bias**: The bias term is added to the weighted sum, allowing the neuron to learn an offset from zero.\n", + "\n", + "3. **Activation**: The neuron applies an activation function to the aggregated input, transforming it into the neuron's output signal.\n", + "\n", + "4. **Output**: The resulting output signal is propagated to the next layer of neurons or serves as the final output of the network.\n", + "\n", + "#### Role in Neural Networks:\n", + "\n", + "Neurons form the basic computational units of neural networks, enabling the network to learn and model complex patterns in data. By adjusting the weights and biases of neurons through training, neural networks can perform tasks such as classification, regression, and pattern recognition.\n", + "\n", + "#### Conclusion:\n", + "\n", + "In summary, neurons are the building blocks of artificial neural networks, responsible for processing input data and producing output signals through weighted summation and activation. Understanding the operation and characteristics of neurons is essential for effectively designing and training neural network models.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16ea542f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "31c16686", + "metadata": {}, + "source": [ + "### Understanding the Hyperbolic Tangent (tanh) Function\n", + "\n", + "The hyperbolic tangent function, often denoted as \\\\( \\text{tanh}(x) \\\\), is a fundamental component in machine learning, particularly in neural networks. It serves as an activation function, transforming input values into a bounded output range.\n", + "\n", + "#### Function Definition:\n", + "The tanh function is defined mathematically as:\n", + "\n", + "\\\\[ \\text{tanh}(x) = \\frac{e^x - e^{-x}}{e^x + e^{-x}} = \\frac{e^{2x} - 1}{e^{2x} + 1}\\\\]\n", + "\n", + "#### Key Characteristics:\n", + "\n", + "1. **Range**: The tanh function maps real-valued numbers to the interval [-1, 1]. This property makes it useful when outputs need to be limited to a specific range, facilitating stable learning in neural networks.\n", + "\n", + "2. **Zero-centered**: Unlike the sigmoid function, tanh outputs are zero-centered. This feature aids in mitigating issues like the vanishing gradient problem during neural network training.\n", + "\n", + "3. **S-shaped Curve**: Similar to the sigmoid function, tanh exhibits an S-shaped curve. This non-linear behavior enables neural networks to model complex relationships in the data.\n", + "\n", + "4. **Vanishing Gradients**: While tanh can help alleviate the vanishing gradient problem compared to sigmoid, it may still encounter gradient vanishing issues in deep networks.\n", + "\n", + "#### Derivative:\n", + "The derivative of the tanh function is given by:\n", + "\\\\[ \\frac{d}{dx} \\text{tanh}(x) = 1 - \\text{tanh}^2(x) \\\\]\n", + "\n", + "This derivative is crucial in the backpropagation algorithm for updating network weights during training.\n", + "\n", + "#### Conclusion:\n", + "In summary, the tanh function is a versatile activation function widely employed in neural networks. Its bounded output range, zero-centered nature, and non-linear characteristics make it a valuable tool for learning complex patterns from data.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "2e27b24c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAAGdCAYAAAAfTAk2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAABHXElEQVR4nO3de1yUdd4//tfMMAwHYRSQARQBjRREUyERTM1VUMvOnu6K1lZt/dnJqF/FWpu623J32KQsK3fdJQ+pd7dr1h0Zo+WhQPMAmqakpoLIWWBQZI7X9w9kcuQgo8xczDWv5+MxD5hrPnPxvt4N+Oo6fC6ZIAgCiIiIiCRELnYBRERERF2NAYeIiIgkhwGHiIiIJIcBh4iIiCSHAYeIiIgkhwGHiIiIJIcBh4iIiCSHAYeIiIgkx0PsAsRgsVhw/vx5+Pn5QSaTiV0OERERdYIgCGhoaEBYWBjk8o730bhlwDl//jzCw8PFLoOIiIhuQElJCfr27dvhGLcMOH5+fgCaG+Tv7y9yNd2D0WhEbm4uUlNToVQqxS5H8thv52K/nYv9di536rdOp0N4eLj13/GOuGXAaTks5e/vz4BzhdFohI+PD/z9/SX/C9IdsN/OxX47F/vtXO7Y786cXsKTjImIiEhyGHCIiIhIchhwiIiISHIYcIiIiEhyGHCIiIhIchhwiIiISHIYcIiIiEhyGHCIiIhIchhwiIiISHIcGnB27dqFe+65B2FhYZDJZPj888+v+56dO3ciPj4eXl5e6N+/Pz766KNWYzZt2oTY2FioVCrExsZi8+bNDqieiIiIXJVDA86lS5dw22234f333+/U+NOnT+Ouu+7CmDFjUFBQgD/96U945plnsGnTJuuY/Px8zJw5E2lpaTh06BDS0tIwY8YM7N2711GbQURERC7GofeimjJlCqZMmdLp8R999BH69euHrKwsAEBMTAz279+Pt99+Gw899BAAICsrCykpKcjIyAAAZGRkYOfOncjKysL69eu7fBuIiIjI9XSrm23m5+cjNTXVZtmkSZOwatUqGI1GKJVK5Ofn47nnnms1piUUtUWv10Ov11uf63Q6AM03KDMajV23AS6spQ/sh3Ow387FfjuXlPtttggwmCwwWSwwmgWYLAJMZguMFgEm85XvzQJMFgvMFgFmQWj+agHMFgvMAmA2Ny+3XHndIgDClXEt31sEwCwI1u9bvgKARRAgCL99NZnNOHFOhlPbT0Aml0MAAAEQ0Py6AFz5euUJflvW/L1w1fdXvrYsuMq1Y64eJ7QxLtDXEwvu7H9T/b6WPZ+pbhVwysvLodFobJZpNBqYTCZUV1cjNDS03THl5eXtrjczMxNLlixptTw3Nxc+Pj5dU7xEaLVasUtwK+y3c7HfziVWvy0CcNkENJqAy2ag0STDZRPQZAYMlisPswz6K8+v/mq0yGASAJMFMFrQ6nuLcP27WItDAZScFrsIG8FeAiIbj3fpOhsbGzs9tlsFHKD1LdBb0uHVy9sa09Gt0zMyMpCenm59rtPpEB4ejtTUVPj7+3dF2S7PaDRCq9UiJSUFSqVS7HIkj/12Lvbbubq634Ig4KLehMoGA6oa9Khs0KPqot76ffVFA+oajdA1GVF/2YSLelMXbEXnyGWAh0IOpVwGD4UMHnI5PBQyKOUyKORyKOQyKOSAQiaDQiFr/ipvfshlv32Vy9D8VX7lq0wGWcsyWfO/ezLgquUArrwmWASUnS9F3759IJcrIJMBV16GDDLrc1xZR8s/l83fy6763nbbbP7dtS5reS67Zixaje3l64m7kiNussO2Wo7AdEa3CjghISGt9sRUVlbCw8MDgYGBHY65dq/O1VQqFVQqVavlSqWSf+yuwZ44F/vtXOy3c9nTb4PJgpLaRpypvoTT1ZdwpuYSzlQ3oqS2ERW6JjQZLXb/fB9PBdTeSqi9lfD3UqKHlwe8PRXwUSrgq/rtex+VB3w8FfDxVEDloYCXUg5PDzlUHgqoPORXHoory+RQesihVMiglMshl4u/R8doNCInpwR33TVE8p9ve7avWwWcpKQkfPnllzbLcnNzkZCQYN2opKQkaLVam/NwcnNzkZyc7NRaiYjIfiazBScqL6KwpA7Hy3Q4XdMcas7VNlrPMWmPn5cHgv1UCPbzQrC/yvp9bz8VevoorWFG7a2En5cSnh6c6s2dOTTgXLx4ESdPnrQ+P336NAoLCxEQEIB+/fohIyMDpaWlWL16NQBg/vz5eP/995Geno558+YhPz8fq1atsrk66tlnn8XYsWPxxhtv4L777sOWLVuwbds2fP/9947cFCIispMgCDhfdxmHSupQWFKHgpI6HCmtR6PB3OZ4H08FIgN9ERXki8ggH0QG+iIi0Bch/s0hxttT4eQtIFfm0ICzf/9+jB8/3vq85TyY3//+98jOzkZZWRmKi4utr0dFRSEnJwfPPfccPvjgA4SFheG9996zXiIOAMnJydiwYQNeeeUVvPrqqxgwYAA2btyIxMRER24KERF1wtmaS9j603n833E5Xj+yC5UN+lZjeqg8MLSvGkP6qNG/t6811PT2U3V4PiWRPRwacO688842LzVrkZ2d3WrZuHHjcPDgwQ7XO23aNEybNu1myyMiopskCAKOntch92g5cn+uwPHyhiuvyAHooZDLMFDjh2H9emJYeE8MD++JAb17dItzV0jautU5OERE1P2ZzBbsP1uLb46WI/doBUrrLltfU8hlGBnZC71NVZiVMgrDIwJ5aIlEwYBDRESdcqxMh0/yzuCbo+WobfxtwjUvpRxjo3tj0uAQ/G5QMHp4ypCTk4PbI3tBqWS4IXEw4BARUbsEQUD+qRp8tOtX7Pqlyrq8p48SEwZpMGmwBmOie9vspZHiDMbkehhwiIioFZPZgq+PlOPjXadwpLR5cjW5DJgyJBSPjOyHkVEB8FDwMmzqvhhwiIjIqtFgwmf7z+Gf3/+KkgvN59Z4KeWYkRCOuXf0R79A3t6GXAMDDhER4aLehJW7fsXq/DOou3J+TYCvJx5LisBjSZEI8PUUuUIi+zDgEBG5ud0nqvDypp+sV0P1C/DBvDFRmBYfziugyGUx4BARuSldkxGZOcew/scSAEB4gDdenhyDyXEhUHCeGnJxDDhERG5oR1ElMv7zE8rqmwAAs5Mj8eLkgfDx5D8LJA38JBMRuZH6y0a8/tXP+J/95wAAEYE+ePOhoUjsHyhyZURdiwGHiMhNfHe8ea9Nua4JMhnweHIU/v9JA3meDUkSAw4RkcTVXzZi6Zc/Y9PB5r02UUG+eGvaUCREBohcGZHjMOAQEUlYpa4Jj67ai18qLkImA+beEYX0FO61IeljwCEikqiSC414dNVenK1phMZfhRWPjEB8BPfakHtgwCEikqCTlRfx6D/3olzXhH4BPlg3NxHhAZyFmNwHAw4RkcQcKa3HY//6ERcuGRAd3ANr5yZC4+8ldllETsWAQ0QkIfvPXMDj2fvQ0GTCkD5qfPKHkbzNArklBhwiIonYfaIKT6w+gMtGM0ZGBuCfsxPg76UUuywiUTDgEBFJwDdHy/H0pwUwmC0Yd2tvfPRoPK+UIrfGgENE5OI2F5zDC58dhtkiYEpcCN6dNRyeHnKxyyISFQMOEZELW/9jMTL+8xMAYFp8X/z3g0PgoWC4IWLAISJyUXt/rcErnx8B0HyzzD9PjYWcdwEnAsCAQ0Tkkqoa9Hh6fQHMFgEPDO+D1+6JhUzGcEPUgvsxiYhcjNkiYOHGAlQ26BEd3AOvPxDHcEN0DQYcIiIX8+72E/jhZA28lQp8+OgI+HhyZzzRtRhwiIhcyK5fqrD82xMAgMwHh+CWYD+RKyLqnhhwiIhcRFn9ZSzcWAhBAB5O7If7h/cRuySibosBh4jIBRjNFjz9aQEuXDJgcJg//jw1VuySiLo1BhwiIhfw1jdF2H+2Fn4qD6x4ZAS8lJylmKgjDDhERN1c7tFyrNz1KwDgrelDERHoK3JFRN0fAw4RUTdWXNOI5z87BACYc0cUJseFilwRkWtwSsBZsWIFoqKi4OXlhfj4eOzevbvdsbNnz4ZMJmv1GDx4sHVMdnZ2m2OampqcsTlERE7RZDTjyU8PoqHJhOH9euKlyYPELonIZTg84GzcuBELFy7EokWLUFBQgDFjxmDKlCkoLi5uc/y7776LsrIy66OkpAQBAQGYPn26zTh/f3+bcWVlZfDy8nL05hAROc3rXx3DT6X16OWjxAcPj+ANNIns4PDflnfeeQdz5szB3LlzERMTg6ysLISHh+PDDz9sc7xarUZISIj1sX//ftTW1uLxxx+3GSeTyWzGhYSEOHpTiIicZt+ZC1iz5ywA4J2ZwxDW01vkiohci0OnvzQYDDhw4ABefvllm+WpqanIy8vr1DpWrVqFiRMnIiIiwmb5xYsXERERAbPZjGHDhuEvf/kLhg8f3uY69Ho99Hq99blOpwMAGI1GGI1GezZJslr6wH44B/vtXK7Wb4tFwF++PAoAmJnQB3f07+UytQOu129X5079tmcbHRpwqqurYTabodFobJZrNBqUl5df9/1lZWX4+uuv8emnn9osHzRoELKzszFkyBDodDq8++67GD16NA4dOoTo6OhW68nMzMSSJUtaLc/NzYWPj4+dWyVtWq1W7BLcCvvtXK7S7/1VMhwuVUAlFxAnnEVOzlmxS7ohrtJvqXCHfjc2NnZ6rFNuYHLtTeAEQejUjeGys7PRs2dP3H///TbLR40ahVGjRlmfjx49GiNGjMDy5cvx3nvvtVpPRkYG0tPTrc91Oh3Cw8ORmpoKf39/O7dGmoxGI7RaLVJSUqBUKsUuR/LYb+dypX43Gc3473d/ANCEJ38XjVnj+otdkt1cqd9S4E79bjkC0xkODThBQUFQKBSt9tZUVla22qtzLUEQ8K9//QtpaWnw9PTscKxcLsftt9+OEydOtPm6SqWCSqVqtVypVEr+w2Av9sS52G/ncoV+r/z+LMrqmxCm9sIT426B0oUn9HOFfkuJO/Tbnu1z6EnGnp6eiI+Pb7XbTKvVIjk5ucP37ty5EydPnsScOXOu+3MEQUBhYSFCQzk/BBG5rsqGJqz47iQA4KUpgzhbMdFNcPghqvT0dKSlpSEhIQFJSUlYuXIliouLMX/+fADNh49KS0uxevVqm/etWrUKiYmJiIuLa7XOJUuWYNSoUYiOjoZOp8N7772HwsJCfPDBB47eHCIih1mm/QWXDGbc1leNe4aGiV0OkUtzeMCZOXMmampqsHTpUpSVlSEuLg45OTnWq6LKyspazYlTX1+PTZs24d13321znXV1dXjiiSdQXl4OtVqN4cOHY9euXRg5cqSjN4eIyCGOl+uwcV8JAOCVqbGQy69/niIRtc8pJxkvWLAACxYsaPO17OzsVsvUanWHZ0ovW7YMy5Yt66ryiIhEJQgCXv/qGCwCcNeQENweGSB2SUQuj9NiEhGJbMcvVdh9ohqeCjlvx0DURRhwiIhEZDJb8PpXxwAAv0+O4J3CiboIAw4RkYg27CvBycqL6OWjxFO/az1RKRHdGAYcIiKR6JqMWKb9BQCwcOKtUHtLew4TImdiwCEiEsmK706h5pIB/Xv74uHEfmKXQyQpDDhERCIoudCIf/1wGgDwpykxUCr455ioK/E3iohIBG9+UwSDyYLkAYGYEBMsdjlEksOAQ0TkZD+dq8eXh85DJgMW3R3TqZsPE5F9GHCIiJys5dDUvbeFYXCYWuRqiKSJAYeIyIkqG5rwf4fPAwDm3BElcjVE0sWAQ0TkROv2FMNoFhAf0QtD+/YUuxwiyWLAISJyEr3JjHV7m28uPDs5UtxiiCSOAYeIyEm+OlyG6ot6hPh7YXJciNjlEEkaAw4RkRMIgoB//3AGAJCWFMF5b4gcjL9hREROcLC4Fj+V1sPTQ45Zt4eLXQ6R5DHgEBE5Qcvem/uHhSGwh0rcYojcAAMOEZGDldVfxtdHygEAs5N5aTiRMzDgEBE52No9Z2G2CEiMCkBsmL/Y5RC5BQYcIiIHajKa8emVS8MfHx0pbjFEboQBh4jIgb4oPI/aRiP69PTGxBiN2OUQuQ0GHCIiBxEEAf/OOwMAeCwpAh68NJzIafjbRkTkIHtPX8CxMh28lHLM5KXhRE7FgENE5CDZVy4Nf3BEX/T08RS3GCI3w4BDROQAJRcakftzy6XhkeIWQ+SGGHCIiBxg7Z6zsAjA6FsCcavGT+xyiNwOAw4RURdrNJiw/scrl4ZzYj8iUTDgEBF1sc0FpdA1mdAvwAfjBwWLXQ6RW2LAISLqQoIgWE8u/n1yJBRymbgFEbkpBhwioi70w8kanKi8CB9PBaYn9BW7HCK3xYBDRNSFPjtQAgB4cEQf+HspRa6GyH0x4BARdZHLBjO0P1cAaJ77hojE45SAs2LFCkRFRcHLywvx8fHYvXt3u2N37NgBmUzW6nH8+HGbcZs2bUJsbCxUKhViY2OxefNmR28GEVGHth2rQKPBjPAAbwwP7yl2OURuzeEBZ+PGjVi4cCEWLVqEgoICjBkzBlOmTEFxcXGH7ysqKkJZWZn1ER0dbX0tPz8fM2fORFpaGg4dOoS0tDTMmDEDe/fudfTmEBG1a0vheQDAPUPDIJPx5GIiMTk84LzzzjuYM2cO5s6di5iYGGRlZSE8PBwffvhhh+8LDg5GSEiI9aFQKKyvZWVlISUlBRkZGRg0aBAyMjIwYcIEZGVlOXhriIjaVt9oxM5fKgEA9w3rI3I1ROThyJUbDAYcOHAAL7/8ss3y1NRU5OXldfje4cOHo6mpCbGxsXjllVcwfvx462v5+fl47rnnbMZPmjSp3YCj1+uh1+utz3U6HQDAaDTCaDTas0mS1dIH9sM52G/ncka/vzp8DkazgFuDe6B/oJdb/7fl59u53Knf9myjQwNOdXU1zGYzNBqNzXKNRoPy8vI23xMaGoqVK1ciPj4eer0ea9aswYQJE7Bjxw6MHTsWAFBeXm7XOjMzM7FkyZJWy3Nzc+Hj43MjmyZZWq1W7BLcCvvtXI7sd/bPcgByRKvqkZOT47Cf40r4+XYud+h3Y2Njp8c6NOC0uPZYtCAI7R6fHjhwIAYOHGh9npSUhJKSErz99tvWgGPvOjMyMpCenm59rtPpEB4ejtTUVPj7+9u9PVJkNBqh1WqRkpICpZKXtjoa++1cju53ZYMeJ/bsBACkTxuHfgHu/T9O/Hw7lzv1u+UITGc4NOAEBQVBoVC02rNSWVnZag9MR0aNGoW1a9dan4eEhNi1TpVKBZVK1Wq5UqmU/IfBXuyJc7HfzuWofn/z8zkIAjC8X08M0Ki7fP2uip9v53KHftuzfQ49ydjT0xPx8fGtdptptVokJyd3ej0FBQUIDQ21Pk9KSmq1ztzcXLvWSUTUVb441Hz11L23hYlcCRG1cPghqvT0dKSlpSEhIQFJSUlYuXIliouLMX/+fADNh49KS0uxevVqAM1XSEVGRmLw4MEwGAxYu3YtNm3ahE2bNlnX+eyzz2Ls2LF44403cN9992HLli3Ytm0bvv/+e0dvDhGRjeKaRhSW1EEuA+4eGnr9NxCRUzg84MycORM1NTVYunQpysrKEBcXh5ycHERERAAAysrKbObEMRgMeOGFF1BaWgpvb28MHjwYX331Fe666y7rmOTkZGzYsAGvvPIKXn31VQwYMAAbN25EYmKiozeHiMjGl4eb994kDQhEsJ+XyNUQUQunnGS8YMECLFiwoM3XsrOzbZ6/+OKLePHFF6+7zmnTpmHatGldUR4R0Q3bUlgKALjvNs59Q9Sd8F5UREQ36Hi5Dr9UXISnQo5JcSFil0NEV2HAISK6QV9cuTXDuIG9ofaW9tUrRK6GAYeI6AYIgmA9/+a+Ybx6iqi7YcAhIroBBSV1KLlwGb6eCkwY1Pl5vYjIORhwiIhuQMvhqZRYDbw9FdcZTUTOxoBDRGQnk9mC/ztcBgC4l4eniLolBhwiIjvt+fUCqi/q0ctHiTHRvcUuh4jawIBDRGSnLw41z30zZUgolAr+GSXqjvibSURkB73JjK+PNN/sl/eeIuq+GHCIiOywo6gKDU0mhPh7YWRkgNjlEFE7GHCIiOzQcufwe24LhVwuE7kaImoPAw4RUSdd0puw/VgFAOBe3nuKqFtjwCEi6iTtzxVoMloQFeSLuD7+YpdDRB1gwCEi6qSWuW/uuS0MMhkPTxF1Zww4RESd0GQ04/uTVQCAKbxzOFG3x4BDRNQJP5ysRpPRgj49vTEoxE/scojoOhhwiIg6YduxSgDA7wYF8/AUkQtgwCEiug5BEPDt8earpybEBItcDRF1BgMOEdF1HD2vQ4VODx9PBUb1DxS7HCLqBAYcIqLr2HZl7psx0UHwUipEroaIOoMBh4joOrZfOf9mQoxG5EqIqLMYcIiIOlCha8JPpfWQyYDxA3n+DZGrYMAhIupAy96b2/r2RG8/lcjVEFFnMeAQEXWg5eqpibx6isilMOAQEbWjefbiagA8/4bI1TDgEBG1o2X24jC1F2cvJnIxDDhERO3YdtXVU5y9mMi1MOAQEbWBsxcTuTYGHCKiNhwp5ezFRK6MAYeIqA3bj3P2YiJXxoBDRNQG6+zFg3j1FJErckrAWbFiBaKiouDl5YX4+Hjs3r273bH/+c9/kJKSgt69e8Pf3x9JSUn45ptvbMZkZ2dDJpO1ejQ1NTl6U4jIDdjMXjyI598QuSKHB5yNGzdi4cKFWLRoEQoKCjBmzBhMmTIFxcXFbY7ftWsXUlJSkJOTgwMHDmD8+PG45557UFBQYDPO398fZWVlNg8vLy9Hbw4RuQHOXkzk+jwc/QPeeecdzJkzB3PnzgUAZGVl4ZtvvsGHH36IzMzMVuOzsrJsnv/tb3/Dli1b8OWXX2L48OHW5TKZDCEhIQ6tnYjc0/ZjnL2YyNU5NOAYDAYcOHAAL7/8ss3y1NRU5OXldWodFosFDQ0NCAgIsFl+8eJFREREwGw2Y9iwYfjLX/5iE4Cuptfrodfrrc91Oh0AwGg0wmg02rNJktXSB/bDOdhv57Kn35cNv81ePPaWQP43ugH8fDuXO/Xbnm10aMCprq6G2WyGRmN7kp5Go0F5eXmn1vH3v/8dly5dwowZM6zLBg0ahOzsbAwZMgQ6nQ7vvvsuRo8ejUOHDiE6OrrVOjIzM7FkyZJWy3Nzc+Hj42PnVkmbVqsVuwS3wn47V2f6faRWBr1JgZ6eAn49uBunOb/fDePn27ncod+NjY2dHuvwQ1QAWs0AKghCp2YFXb9+PRYvXowtW7YgOPi3XcWjRo3CqFGjrM9Hjx6NESNGYPny5XjvvfdarScjIwPp6enW5zqdDuHh4UhNTYW/v/+NbJLkGI1GaLVapKSkQKlUil2O5LHfzmVPv/O2/AzgHO4e1g933x3jnAIlhp9v53KnfrccgekMhwacoKAgKBSKVntrKisrW+3VudbGjRsxZ84cfPbZZ5g4cWKHY+VyOW6//XacOHGizddVKhVUqtYnCiqVSsl/GOzFnjgX++1c1+u3IAjY8UsVACBlcAj/29wkfr6dyx36bc/2OfQqKk9PT8THx7fababVapGcnNzu+9avX4/Zs2fj008/xd13333dnyMIAgoLCxEaGnrTNROR++LsxUTS4fBDVOnp6UhLS0NCQgKSkpKwcuVKFBcXY/78+QCaDx+VlpZi9erVAJrDzWOPPYZ3330Xo0aNsu798fb2hlqtBgAsWbIEo0aNQnR0NHQ6Hd577z0UFhbigw8+cPTmEJGEtcxefMctnL2YyNU5PODMnDkTNTU1WLp0KcrKyhAXF4ecnBxEREQAAMrKymzmxPn4449hMpnw5JNP4sknn7Qu//3vf4/s7GwAQF1dHZ544gmUl5dDrVZj+PDh2LVrF0aOHOnozSEiCWuZ/2ZiDGcvJnJ1TjnJeMGCBViwYEGbr7WElhY7duy47vqWLVuGZcuWdUFlRETNOHsxkbTwXlRERODsxURSw4BDRATOXkwkNQw4ROT2moxm/HCqefZiHp4ikgYGHCJye/vP1KLJaEGwnwqxoZz8k0gKGHCIyO3tOtE8ud+Y6N6dmmWdiLo/Bhwicnu7rsxePPbWIJErIaKuwoBDRG6tQteE4+UNkMma9+AQkTQw4BCRW2vZezOkjxoBvp4iV0NEXYUBh4jc2q4TzVdPjeXeGyJJYcAhIrdltgj4/kTL+TcMOERSwoBDRG7rSGk9ahuN6KHywPB+PcUuh4i6EAMOEbmtlvNvkgcEQqngn0MiKeFvNBG5rV08PEUkWQw4ROSWdE1GHCyuAwCMY8AhkhwGHCJyS3kna2C2CIgK8kV4gI/Y5RBRF2PAISK3ZD08Fc3Zi4mkiAGHiNyOIAhX3Z6Bh6eIpIgBh4jczunqSzhXexlKhQyj+geKXQ4ROQADDhG5nZa9NwkRAfBVeYhcDRE5AgMOEbkd6+0ZeHiKSLIYcIjIrehNZuSfqgEAjL2VJxgTSRUDDhG5lQNnanHZaEZQDxViQvzFLoeIHIQBh4jcyk7r7MVBkMtlIldDRI7CgENEbmXXL83n33D2YiJpY8AhIrdR1aDHsTIdZDLgjlt4/g2RlDHgEJHb+P5k88nFcWFqBPZQiVwNETkSAw4RuY3dJ1suD+feGyKpY8AhIrdgEX7bgzM2muffEEkdAw4RuYXSS0BtoxE9VB4YEdFL7HKIyMEYcIjILRyra74kPGlAIJQK/ukjkjr+lhORWzhe1/znjrdnIHIPTgk4K1asQFRUFLy8vBAfH4/du3d3OH7nzp2Ij4+Hl5cX+vfvj48++qjVmE2bNiE2NhYqlQqxsbHYvHmzo8onIhfX0GTC6YvN34/j+TdEbsHhAWfjxo1YuHAhFi1ahIKCAowZMwZTpkxBcXFxm+NPnz6Nu+66C2PGjEFBQQH+9Kc/4ZlnnsGmTZusY/Lz8zFz5kykpaXh0KFDSEtLw4wZM7B3715Hbw4RuaA9v16ARZAhIsAH/QJ9xC6HiJzA4QHnnXfewZw5czB37lzExMQgKysL4eHh+PDDD9sc/9FHH6Ffv37IyspCTEwM5s6diz/84Q94++23rWOysrKQkpKCjIwMDBo0CBkZGZgwYQKysrIcvTlE5IJaLg8fEx0ociVE5Cwejly5wWDAgQMH8PLLL9ssT01NRV5eXpvvyc/PR2pqqs2ySZMmYdWqVTAajVAqlcjPz8dzzz3Xakx7AUev10Ov11uf63Q6AIDRaITRaLR3sySppQ/sh3Ow384jCAJ2n2gOOEmRPdlzJ+Dn27ncqd/2bKNDA051dTXMZjM0Go3Nco1Gg/Ly8jbfU15e3uZ4k8mE6upqhIaGtjumvXVmZmZiyZIlrZbn5ubCx4e7q6+m1WrFLsGtsN+OV3kZOFfnAYVMwKXTBcgpLhC7JLfBz7dzuUO/GxsbOz3WoQGnhUxme8deQRBaLbve+GuX27POjIwMpKenW5/rdDqEh4cjNTUV/v7+ndsIiTMajdBqtUhJSYFSqRS7HMljv51nzZ5ioPA4ovwETJ3MfjsDP9/O5U79bjkC0xkODThBQUFQKBSt9qxUVla22gPTIiQkpM3xHh4eCAwM7HBMe+tUqVRQqVrfd0apVEr+w2Av9sS52G/H++HUBQDAoJ4C++1k7LdzuUO/7dk+h55k7Onpifj4+Fa7zbRaLZKTk9t8T1JSUqvxubm5SEhIsG5Ye2PaWycRuSeDyYL8X5tvzxDTUxC5GiJyJocfokpPT0daWhoSEhKQlJSElStXori4GPPnzwfQfPiotLQUq1evBgDMnz8f77//PtLT0zFv3jzk5+dj1apVWL9+vXWdzz77LMaOHYs33ngD9913H7Zs2YJt27bh+++/d/TmEJEL2X/2AhoNZgT6eiLMxyR2OUTkRA4PODNnzkRNTQ2WLl2KsrIyxMXFIScnBxEREQCAsrIymzlxoqKikJOTg+eeew4ffPABwsLC8N577+Ghhx6yjklOTsaGDRvwyiuv4NVXX8WAAQOwceNGJCYmOnpziMiF7Pql+eqpO24JhFzW+ZMTicj1OeUk4wULFmDBggVtvpadnd1q2bhx43Dw4MEO1zlt2jRMmzatK8ojIona9UsVAGDMLYHA+RKRqyEiZ+K9qIhIkqoa9Pi5rPmKiztu4QR/RO6GAYeIJGn3iea9N4PD/BHYo/VVlEQkbQw4RCRJLYenePdwIvfEgENEkmOx/HZ7hnEMOERuiQGHiCTn5zIdai4Z4OupwIh+vcQuh4hEwIBDRJKz88rhqaQBQfD04J85InfE33wikpyW82/G3RokciVEJBYGHCKSlIt6Ew6crQXAE4yJ3BkDDhFJSv6pGpgsAiICfRAR6Ct2OUQkEgYcIpIU6+Xh0dx7Q+TOGHCISFJ2neD8N0TEgENEEnK25hLO1jTCQy5D0gDenoHInTHgEJFktByeio/ohR4qp9xLmIi6KQYcIpKMnb80z17Mw1NExIBDRJJgMFmQf4q3ZyCiZgw4RCQJB4trcclgRqCvJ2JD/cUuh4hExoBDRJLQcv7NmOggyOUykashIrEx4BCRJPDycCK6GgMOEbm8qgY9jpTqAABjOMEfEYEBh4gk4PuTzXtvYkP90dtPJXI1RNQdMOAQkcvbxcvDiegaDDhE5NIsFgG7r5x/w8vDiagFAw4RubSfy3SovmiAr6cC8RG9xC6HiLoJBhwicmktV08lDQiEpwf/pBFRM/41ICKX1jL/Dc+/IaKrMeAQkcu6pDfhwNlaAMBYXh5ORFdhwCEil5V3qgZGs4B+AT6IDPIVuxwi6kYYcIjIZX17vAIAMH4g994QkS0GHCJySRaLgO3HKgEAE2I0IldDRN0NAw4RuaQj5+tR2aCHr6cCif0DxC6HiLoZBhwicknbruy9GXtrb6g8FCJXQ0TdjUMDTm1tLdLS0qBWq6FWq5GWloa6urp2xxuNRrz00ksYMmQIfH19ERYWhsceewznz5+3GXfnnXdCJpPZPGbNmuXITSGibmb7sebzb343KFjkSoioO3JowHn44YdRWFiIrVu3YuvWrSgsLERaWlq74xsbG3Hw4EG8+uqrOHjwIP7zn//gl19+wb333ttq7Lx581BWVmZ9fPzxx47cFCLqRsrqL+PoeR1kMmA8Aw4RtcHDUSs+duwYtm7dij179iAxMREA8I9//ANJSUkoKirCwIEDW71HrVZDq9XaLFu+fDlGjhyJ4uJi9OvXz7rcx8cHISEhjiqfiLqxb483H54aHt4TQT1493Aias1hASc/Px9qtdoabgBg1KhRUKvVyMvLazPgtKW+vh4ymQw9e/a0Wb5u3TqsXbsWGo0GU6ZMwWuvvQY/P78216HX66HX663PdTodgOZDYkaj0c4tk6aWPrAfzsF+3xzt0XIAwPhbgzrVQ/bbudhv53KnftuzjQ4LOOXl5QgObr3rODg4GOXl5Z1aR1NTE15++WU8/PDD8Pf3ty5/5JFHEBUVhZCQEBw5cgQZGRk4dOhQq70/LTIzM7FkyZJWy3Nzc+Hj49PJLXIP7fWQHIP9tp/BDPxwQgFABo+q48jJOd7p97LfzsV+O5c79LuxsbHTY+0OOIsXL24zLFxt3759AACZTNbqNUEQ2lx+LaPRiFmzZsFisWDFihU2r82bN8/6fVxcHKKjo5GQkICDBw9ixIgRrdaVkZGB9PR063OdTofw8HCkpqbaBCd3ZjQaodVqkZKSAqVSKXY5ksd+37jtxyph/LEQfXp6Yc5DYzr994T9dh7227ncqd8tR2A6w+6A89RTT133iqXIyEgcPnwYFRUVrV6rqqqCRtPxpFxGoxEzZszA6dOn8e233143hIwYMQJKpRInTpxoM+CoVCqoVK2P0yuVSsl/GOzFnjgX+22/HSdqAAATYzTw9PS0673st3Ox387lDv22Z/vsDjhBQUEICgq67rikpCTU19fjxx9/xMiRIwEAe/fuRX19PZKTk9t9X0u4OXHiBL777jsEBgZe92cdPXoURqMRoaGhnd8QInI5FotgPcGYsxcTUUccdpl4TEwMJk+ejHnz5mHPnj3Ys2cP5s2bh6lTp9qcYDxo0CBs3rwZAGAymTBt2jTs378f69atg9lsRnl5OcrLy2EwGAAAp06dwtKlS7F//36cOXMGOTk5mD59OoYPH47Ro0c7anOIqBvg7MVE1FkOnQdn3bp1GDJkCFJTU5GamoqhQ4dizZo1NmOKiopQX18PADh37hy++OILnDt3DsOGDUNoaKj1kZeXBwDw9PTE9u3bMWnSJAwcOBDPPPMMUlNTsW3bNigUnM2USMpaZi8eE83Zi4moYw67igoAAgICsHbt2g7HCIJg/T4yMtLmeVvCw8Oxc+fOLqmPiFxLy+zFE2I4uR8RdYz3oiIil8DZi4nIHgw4ROQSOHsxEdmDAYeIXML2Y7x6iog6jwGHiLq9ywYzfjhZDYDn3xBR5zDgEFG39/3JauhNFvTp6Y2BmrbvOUdEdDUGHCLq9lqunpoYE9ypWzMQETHgEFG3ZrEI2M7Zi4nITgw4RNStHTlfjyrOXkxEdmLAIaJujbMXE9GNYMAhom6NsxcT0Y1gwCGibouzFxPRjWLAIaJuq2VyP85eTET2YsAhom7rW149RUQ3iAGHiLolzl5MRDeDAYeIuiXOXkxEN4MBh4i6pa+PlAHg7MVEdGMYcIio22kympF7tPny8HtuCxO5GiJyRQw4RNTtfHu8Ehf1JvTp6Y0R/XqJXQ4RuSAGHCLqdr4oPA8AmHpbKORyHp4iIvsx4BBRt6JrMuLboubLw+/l4SkiukEMOETUreQerYDBZMEtwT0QG+ovdjlE5KIYcIioW9lSWAqgee8Nr54iohvFgENE3Ub1RT3yTtUA4OEpIro5DDhE1G3k/FQGs0XA0L5qRAb5il0OEbkwBhwi6jZarp7i3hsiulkMOETULZyrbcT+s7WQyTi5HxHdPAYcIuoWvjzUfGuGxKgAaPy9RK6GiFwdAw4RdQtfHGo5PNVH5EqISAoYcIhIdCcrG3CsTAelQoYpcSFil0NEEsCAQ0Siazm5eGx0b/Ty9RS5GiKSAgYcIhKVIAi/HZ4axpOLiahrODTg1NbWIi0tDWq1Gmq1Gmlpaairq+vwPbNnz4ZMJrN5jBo1ymaMXq/H008/jaCgIPj6+uLee+/FuXPnHLglROQoh8/V40xNI7yUckyM0YhdDhFJhEMDzsMPP4zCwkJs3boVW7duRWFhIdLS0q77vsmTJ6OsrMz6yMnJsXl94cKF2Lx5MzZs2IDvv/8eFy9exNSpU2E2mx21KUTkIC17b1JiQ+Cr8hC5GiKSCof9NTl27Bi2bt2KPXv2IDExEQDwj3/8A0lJSSgqKsLAgQPbfa9KpUJISNsnGtbX12PVqlVYs2YNJk6cCABYu3YtwsPDsW3bNkyaNKnrN4aIHMJsEfB/hzm5HxF1PYcFnPz8fKjVamu4AYBRo0ZBrVYjLy+vw4CzY8cOBAcHo2fPnhg3bhxef/11BAcHAwAOHDgAo9GI1NRU6/iwsDDExcUhLy+vzYCj1+uh1+utz3U6HQDAaDTCaDTe9LZKQUsf2A/nYL+b7T19ARU6Pfy9PJAU1dNh/WC/nYv9di536rc92+iwgFNeXm4NJVcLDg5GeXl5u++bMmUKpk+fjoiICJw+fRqvvvoqfve73+HAgQNQqVQoLy+Hp6cnevXqZfM+jUbT7nozMzOxZMmSVstzc3Ph4+Nj55ZJm1arFbsEt+Lu/d5wSg5Ajlh/A7bnbnX4z3P3fjsb++1c7tDvxsbGTo+1O+AsXry4zbBwtX379gEAZDJZq9cEQWhzeYuZM2dav4+Li0NCQgIiIiLw1Vdf4cEHH2z3fR2tNyMjA+np6dbnOp0O4eHhSE1Nhb+/f4fb4i6MRiO0Wi1SUlKgVCrFLkfy2G/AYLLgz2/uAGDCgrtvR1L/QIf9LPbbudhv53KnfrccgekMuwPOU089hVmzZnU4JjIyEocPH0ZFRUWr16qqqqDRdP5KidDQUERERODEiRMAgJCQEBgMBtTW1trsxamsrERycnKb61CpVFCpVK2WK5VKyX8Y7MWeOJc793vXyQrUXzYh2E+F0dEaKOTt/49PV3HnfouB/XYud+i3Pdtnd8AJCgpCUFDQdcclJSWhvr4eP/74I0aOHAkA2Lt3L+rr69sNIm2pqalBSUkJQkNDAQDx8fFQKpXQarWYMWMGAKCsrAxHjhzBm2++ae/mEJFIWq6euntoqFPCDRG5F4ddJh4TE4PJkydj3rx52LNnD/bs2YN58+Zh6tSpNicYDxo0CJs3bwYAXLx4ES+88ALy8/Nx5swZ7NixA/fccw+CgoLwwAMPAADUajXmzJmD559/Htu3b0dBQQEeffRRDBkyxHpVFRF1b40GE7Q/N+/h5dVTROQIDp10Yt26dXjmmWesVzzde++9eP/9923GFBUVob6+HgCgUCjw008/YfXq1airq0NoaCjGjx+PjRs3ws/Pz/qeZcuWwcPDAzNmzMDly5cxYcIEZGdnQ6FQOHJziKiLbDtWiUaDGf0CfDAsvKfY5RCRBDk04AQEBGDt2rUdjhEEwfq9t7c3vvnmm+uu18vLC8uXL8fy5ctvukYicr7NB5tnHr/3trAOLzogIrpRvBcVETnV6epL+K6oCjIZ8FB8X7HLISKJYsAhIqf6JO8MAGD8wGBEBfmKWwwRSRYDDhE5TUOTEf97oPnw1OOjI8UthogkjQGHiJzmfw+cw0W9CbcE98Adt1x/ugkiohvFgENETmGxCNbDU7OTI3lyMRE5FAMOETnFjl8qcaamEX5eHnhwRB+xyyEiiWPAISKn+PcPZwAAs24Ph4+nQ2eoICJiwCEixztZ2YDdJ6ohlwGPJUWKXQ4RuQEGHCJyuOwr595MjNEgPMBH3GKIyC0w4BCRQ9U3GrHpQCkAYDYvDSciJ2HAISKH+p/9JbhsNGNQiB+S+geKXQ4RuQkGHCJyGLNFwCf5ZwDw0nAici4GHCJymG3HKnCu9jJ6+ihx/3BeGk5EzsOAQ0QO8+8fTgMA/mtkP3gpFSJXQ0TuhAGHiBziWJkOe369AIVchrRREWKXQ0RuhgGHiByi5bYMkweHIKynt7jFEJHbYcAhoi534ZIBmwt4aTgRiYcBh4i63IZ9xdCbLIjr44+EiF5il0NEbogBh4i6lNFswZr8swCA2clRvDSciETBgENEXSr3aAXK6psQ6OuJqUNDxS6HiNwUAw4RdRlBELDq+18BAI8k8tJwIhIPAw4RdZlvjlbgYHEdVB5yPMJLw4lIRAw4RNQlDCYL/vvrYwCAeWP6Q+PvJXJFROTOGHCIqEus2XMWZ2oaEdRDhfl3DhC7HCJycww4RHTT6hoNeG/7CQDAC6m3oofKQ+SKiMjdMeAQ0U17b/tJ1F82YlCIH6YnhItdDhERAw4R3Zxfqy5idf4ZAMCiu2OgkHPeGyISHwMOEd2U//76OEwWAeMH9saY6N5il0NEBIABh4huwp5fa5D7cwUUchn+dFeM2OUQEVkx4BDRDbFYBPz1q58BAP81MhzRGj+RKyIi+g0DDhHdkM0FpThSqoOfygMLJ94qdjlERDYcGnBqa2uRlpYGtVoNtVqNtLQ01NXVdfgemUzW5uOtt96yjrnzzjtbvT5r1ixHbgoRXaXRYMJb3xQBAJ783S0I6qESuSIiIlsOnazi4Ycfxrlz57B161YAwBNPPIG0tDR8+eWX7b6nrKzM5vnXX3+NOXPm4KGHHrJZPm/ePCxdutT63NvbuwsrJ6KO/GPXaZTrmtC3lzdmJ0eKXQ4RUSsOCzjHjh3D1q1bsWfPHiQmJgIA/vGPfyApKQlFRUUYOHBgm+8LCQmxeb5lyxaMHz8e/fv3t1nu4+PTaiwROV6Frgkf7TwFAHhp8iDeUJOIuiWHBZz8/Hyo1WpruAGAUaNGQa1WIy8vr92Ac7WKigp89dVX+OSTT1q9tm7dOqxduxYajQZTpkzBa6+9Bj+/tk9y1Ov10Ov11uc6nQ4AYDQaYTQa7d00SWrpA/vhHK7c77e2HsdloxnDwtWYFBPkEtvgyv12Rey3c7lTv+3ZRocFnPLycgQHB7daHhwcjPLy8k6t45NPPoGfnx8efPBBm+WPPPIIoqKiEBISgiNHjiAjIwOHDh2CVqttcz2ZmZlYsmRJq+W5ubnw8fHpVC3uor0ekmO4Wr/PXQI2HVYAkGG8ugZff/212CXZxdX67erYb+dyh343NjZ2eqzdAWfx4sVthoWr7du3D0DzCcPXEgShzeVt+de//oVHHnkEXl62dyWeN2+e9fu4uDhER0cjISEBBw8exIgRI1qtJyMjA+np6dbnOp0O4eHhSE1Nhb+/f6dqkTqj0QitVouUlBQolUqxy5E8V+y3IAj4ffYBCLiAu4eEYMGMoWKX1Gmu2G9Xxn47lzv1u+UITGfYHXCeeuqp616xFBkZicOHD6OioqLVa1VVVdBoNNf9Obt370ZRURE2btx43bEjRoyAUqnEiRMn2gw4KpUKKlXrqzyUSqXkPwz2Yk+cy5X6nf3DaeT/egGeHnK8PCXGZeq+miv1WwrYb+dyh37bs312B5ygoCAEBQVdd1xSUhLq6+vx448/YuTIkQCAvXv3or6+HsnJydd9/6pVqxAfH4/bbrvtumOPHj0Ko9GI0NDQ628AEdmtsKQOr+ccA9B8YnF4AA/tElH35rB5cGJiYjB58mTMmzcPe/bswZ49ezBv3jxMnTrV5gTjQYMGYfPmzTbv1el0+OyzzzB37txW6z116hSWLl2K/fv348yZM8jJycH06dMxfPhwjB492lGbQ+S26hoNeHLdQRjNAqbEheAPoyPFLomI6LocOtHfunXrMGTIEKSmpiI1NRVDhw7FmjVrbMYUFRWhvr7eZtmGDRsgCAL+67/+q9U6PT09sX37dkyaNAkDBw7EM888g9TUVGzbtg0KBS9XJepKFouA5//nEErrLiMi0AdvTBva6XPoiIjE5NCJ/gICArB27doOxwiC0GrZE088gSeeeKLN8eHh4di5c2eX1EdEHft416/YfrwSnh5yrHhkBPy9pH18n4ikg/eiIqI27f21Bm/nNt+OYcm9gzE4TC1yRUREnceAQ0StVDXo8fT6ApgtAh4Y3gezbg8XuyQiIrsw4BCRDbNFwLMbClDZoEd0cA+8/kAcz7shIpfDgENENt7dfgJ5p2rgrVRgxSMj4OPp0FP1iIgcggGHiKx2/VKF5d+eAABkPjgE0Zq27+9GRNTdMeAQEQCgrP4yFm4shCAADyf2w/3D+4hdEhHRDWPAISIYTBY8/WkBLlwyYHCYP/48NVbskoiIbgoDDpGbazKa8cSa/dh/thZ+Kg+seGQEvJScNJOIXBvPHiRyYw1NRsz9ZD/2nr4AL6UcKx4dgYhAX7HLIiK6aQw4RG6q9pIBs//9Iw6dq4efygOrZt+OkVEBYpdFRNQlGHCI3FClrglpq35EUUUDevkosfoPiRjSlzMVE5F0MOAQuZmSC414dNVenK1phMZfhbVzEnk5OBFJDgMOkRs5VXURj/5zL8rqmxAe4I11c0ahX6CP2GUREXU5BhwiN3H0fD0eW/Ujai4ZcEtwD6ydk4gQtZfYZREROQQDDpEbOHC2FrP//SMamkwYHOaP1X8YicAeKrHLIiJyGAYcIgkTBAH/d7gML206jEaDGQkRvfCvx2+Hv5dS7NKIiByKAYdIoqoa9Hj18yPYerQcADAmOggfp8Xz5plE5Bb4l45IYgRBwBeHzuO1L46irtEID7kMT46/BU+OvwWeHpy8nIjcAwMOkYRU6pqw6PMj0P5cAQCIDfXHW9OHYnAY57ghIvfCgEMkAYIg4PPCUiz+4mfUXzZCqZDh6d9F4/+7cwCUCu61ISL3w4BD5OIqdE1YtPknbDtWCQCI6+OPt6bdhphQf5ErIyISDwMOkYu6pDdh/Y/FeG/7CeiaTFAqZFg48VY8MbY/99oQkdtjwCFyMZUNTfgk7wzW7ilG/WUjAGBoXzXemnYbBobwlgtERAADDpHLOFV1Ef/c/Ss2HSyFwWQBAEQF+eKJsf0xPb4vPLjXhojIigGHqJs7cLYWH+88Be2xCghC87Lh/Xrij2MHICVWA4VcJm6BRETdEAMOUTfU0GTEd0VVWJN/BvvO1FqXT4wJxh/HDUBCRC/IZAw2RETtYcAh6iYqG5qw7edKfHO0HHmnqmE0N++u8VTIcf/wMDwxtj9uCeY5NkREncGAQySiszWN+PaXanxztAIHi2uth6AAoH+QL+4aEoq0pAho/HnXbyIiezDgEDlRha4JhSV1OHCmBl8WKlCW/73N67eF90RqrAaTBmu4t4aI6CYw4BA5yCW9CT+V1qOwpA6HSupQWFKHsvqmq0bI4CGXYVT/QEwarMHEWA1C1d6i1UtEJCUMOEQ3qcloxtmaRpyuvoQzNZfwa9VFHD5Xj18qGmARbMfKZcCtGj8M7eMPz/piLJwxEUH+PuIUTkQkYQ4NOK+//jq++uorFBYWwtPTE3V1ddd9jyAIWLJkCVauXIna2lokJibigw8+wODBg61j9Ho9XnjhBaxfvx6XL1/GhAkTsGLFCvTt29eBW0PuymS2oPqiAZUNTSivb2oOMzWXcKa6+XHeZq+MrVC1F4aF98Rt4T0xLLwnhvRRw1flAaPRiJycs1B7K524JURE7sOhAcdgMGD69OlISkrCqlWrOvWeN998E++88w6ys7Nx66234q9//StSUlJQVFQEP7/mcxIWLlyIL7/8Ehs2bEBgYCCef/55TJ06FQcOHIBCoXDkJpEEGM0W6C4bUX/No67RiMqGJlTq9KhsaH5UNTSh5pLB5uTftvh7eSAqyBeRQb6IDPRFbJg/hoX35MnBREQicWjAWbJkCQAgOzu7U+MFQUBWVhYWLVqEBx98EADwySefQKPR4NNPP8Uf//hH1NfXY9WqVVizZg0mTpwIAFi7di3Cw8Oxbds2TJo0ySHbQo5lsQgwWiwwmQWYzL99bzBZYDCb0WS0QG+ywGCyQG8yX/W9BZeNZlw2mHBJb8ZloxmNBhMa9WY0GsxoNJrRqDfhot5kDTWXDGa765PLgKAeKmj8vdAv0AdRgc1hJirIB5GBvgjw9eS8NERE3Ui3Ogfn9OnTKC8vR2pqqnWZSqXCuHHjkJeXhz/+8Y84cOAAjEajzZiwsDDExcUhLy+vzYCj1+uh1+utz3U6HQDAaDTCaDR2Wf01F/VYsfO0zbJ2/8f/ql0CQtuLIVx5pWVZ2+MEm9cFwfZ9wpVvWr5vef2315qfmy0WVJTL8VVdAQQ0/0NtufI+iyBcea8Ai/DbcrNFgOWqZRZBgMXy23Kz5cpDEGCxCDBZmse2LLcGmivPnc1XpYDaSwl/byXU3h5QeyvRu4cKvf1UCPbzRG8/FXr3UCHYT4UAX88OZww2mUx2/eyWz11Xfv6ofey3c7HfzuVO/bZnG7tVwCkvLwcAaDQam+UajQZnz561jvH09ESvXr1ajWl5/7UyMzOte5OulpubCx+frjvBs/IysLqwW7XUTnLgQpXYRVjJZQI8ZIBSDnjIAA958+O3582veyoAlbz5q6e85blgs1ylAHwUArw9AB8PwNsDUMhMAPStf3Bj86OxAjiL5oejaLVaB66drsV+Oxf77Vzu0O/GxsZOj7X7X+PFixe3GRautm/fPiQkJNi7aqtrd/ULgnDd3f8djcnIyEB6err1uU6nQ3h4OFJTU+Hv73/DdV7rwiUDLqhb/3MoQ9t1XV2urN3lMpsBtuNkNstksqu/l101ruU1mXWM9b0yQC6TwWI2o6joOGJjYqBQKCCXya681vwT5LLfxjY/YB2jkMuuGi+zPveQyyCXAx5yOeSyK1/laF4uk0GpkMND0TzOQyGHUm67TMqHfIxGI7RaLVJSUqBU8kRjR2O/nYv9di536nfLEZjOsDvgPPXUU5g1a1aHYyIjI+1dLQAgJCQEQPNemtDQUOvyyspK616dkJAQGAwG1NbW2uzFqaysRHJycpvrValUUKlUrZYrlcou/TBoeirx0pTYLlufMxmNRuTUH8NdSZGS/wXpTrr6M0gdY7+di/12Lnfotz3bZ3fACQoKQlBQkL1v65SoqCiEhIRAq9Vi+PDhAJqvxNq5cyfeeOMNAEB8fDyUSiW0Wi1mzJgBACgrK8ORI0fw5ptvOqQuIiIici0OPWGkuLgYFy5cQHFxMcxmMwoLCwEAt9xyC3r06AEAGDRoEDIzM/HAAw9AJpNh4cKF+Nvf/obo6GhER0fjb3/7G3x8fPDwww8DANRqNebMmYPnn38egYGBCAgIwAsvvIAhQ4ZYr6oiIiIi9+bQgPPnP/8Zn3zyifV5y16Z7777DnfeeScAoKioCPX19dYxL774Ii5fvowFCxZYJ/rLzc21zoEDAMuWLYOHhwdmzJhhnegvOzubc+AQERERAAcHnOzs7OvOgSNcM4OaTCbD4sWLsXjx4nbf4+XlheXLl2P58uVdUCURERFJjVzsAoiIiIi6GgMOERERSQ4DDhEREUkOAw4RERFJDgMOERERSQ4DDhEREUkOAw4RERFJDgMOERERSQ4DDhEREUmOQ2cy7q5aZk+257brUmc0GtHY2AidTif5u9F2B+y3c7HfzsV+O5c79bvl3+1r74LQFrcMOA0NDQCA8PBwkSshIiIiezU0NECtVnc4RiZ0JgZJjMViwfnz5+Hn5weZTCZ2Od2CTqdDeHg4SkpK4O/vL3Y5ksd+Oxf77Vzst3O5U78FQUBDQwPCwsIgl3d8lo1b7sGRy+Xo27ev2GV0S/7+/pL/BelO2G/nYr+di/12Lnfp9/X23LTgScZEREQkOQw4REREJDkMOAQAUKlUeO2116BSqcQuxS2w387FfjsX++1c7Hfb3PIkYyIiIpI27sEhIiIiyWHAISIiIslhwCEiIiLJYcAhIiIiyWHAoXbp9XoMGzYMMpkMhYWFYpcjSWfOnMGcOXMQFRUFb29vDBgwAK+99hoMBoPYpUnGihUrEBUVBS8vL8THx2P37t1ilyRZmZmZuP322+Hn54fg4GDcf//9KCoqErsst5CZmQmZTIaFCxeKXUq3wYBD7XrxxRcRFhYmdhmSdvz4cVgsFnz88cc4evQoli1bho8++gh/+tOfxC5NEjZu3IiFCxdi0aJFKCgowJgxYzBlyhQUFxeLXZok7dy5E08++ST27NkDrVYLk8mE1NRUXLp0SezSJG3fvn1YuXIlhg4dKnYp3QovE6c2ff3110hPT8emTZswePBgFBQUYNiwYWKX5RbeeustfPjhh/j111/FLsXlJSYmYsSIEfjwww+ty2JiYnD//fcjMzNTxMrcQ1VVFYKDg7Fz506MHTtW7HIk6eLFixgxYgRWrFiBv/71rxg2bBiysrLELqtb4B4caqWiogLz5s3DmjVr4OPjI3Y5bqe+vh4BAQFil+HyDAYDDhw4gNTUVJvlqampyMvLE6kq91JfXw8A/Dw70JNPPom7774bEydOFLuUbsctb7ZJ7RMEAbNnz8b8+fORkJCAM2fOiF2SWzl16hSWL1+Ov//972KX4vKqq6thNpuh0Whslms0GpSXl4tUlfsQBAHp6em44447EBcXJ3Y5krRhwwYcPHgQ+/btE7uUbol7cNzE4sWLIZPJOnzs378fy5cvh06nQ0ZGhtglu7TO9vtq58+fx+TJkzF9+nTMnTtXpMqlRyaT2TwXBKHVMup6Tz31FA4fPoz169eLXYoklZSU4Nlnn8XatWvh5eUldjndEs/BcRPV1dWorq7ucExkZCRmzZqFL7/80uYfALPZDIVCgUceeQSffPKJo0uVhM72u+UP0/nz5zF+/HgkJiYiOzsbcjn/3+NmGQwG+Pj44LPPPsMDDzxgXf7ss8+isLAQO3fuFLE6aXv66afx+eefY9euXYiKihK7HEn6/PPP8cADD0ChUFiXmc1myGQyyOVy6PV6m9fcEQMO2SguLoZOp7M+P3/+PCZNmoT//d//RWJiIvr27StiddJUWlqK8ePHIz4+HmvXrnX7P0pdKTExEfHx8VixYoV1WWxsLO677z6eZOwAgiDg6aefxubNm7Fjxw5ER0eLXZJkNTQ04OzZszbLHn/8cQwaNAgvvfQSDwuC5+DQNfr162fzvEePHgCAAQMGMNw4wPnz53HnnXeiX79+ePvtt1FVVWV9LSQkRMTKpCE9PR1paWlISEhAUlISVq5cieLiYsyfP1/s0iTpySefxKeffootW7bAz8/Peq6TWq2Gt7e3yNVJi5+fX6sQ4+vri8DAQIabKxhwiESUm5uLkydP4uTJk60CJHeu3ryZM2eipqYGS5cuRVlZGeLi4pCTk4OIiAixS5Oklsvx77zzTpvl//73vzF79mznF0RujYeoiIiISHJ4JiMRERFJDgMOERERSQ4DDhEREUkOAw4RERFJDgMOERERSQ4DDhEREUkOAw4RERFJDgMOERERSQ4DDhEREUkOAw4RERFJDgMOERERSQ4DDhEREUnO/wN9DLF6gnWttQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(np.arange(-5,5,0.2), np.tanh(np.arange(-5,5,0.2)))\n", + "plt.grid()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0d962f46", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "82879c9f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097470496\n", + "\n", + "x2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100203792*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556097470496->2556100203792*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556098542128\n", + "\n", + "x1\n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556098690880*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556098542128->2556098690880*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556098527296\n", + "\n", + "w2\n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556098527296->2556100203792*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100203600\n", + "\n", + "n\n", + "\n", + "data 0.7000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100203600+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100203600+->2556100203600\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556098533536\n", + "\n", + "w1\n", + "\n", + "data -3.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556098533536->2556098690880*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100203696\n", + "\n", + "x1w1x2w2\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100203696->2556100203600+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100203696+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100203696+->2556100203696\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100203792\n", + "\n", + "x2w2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100203792->2556100203696+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100203792*->2556100203792\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556098690880\n", + "\n", + "x1w1\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556098690880->2556100203696+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556098690880*->2556098690880\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556098678736\n", + "\n", + "b\n", + "\n", + "data 6.7000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556098678736->2556100203600+\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Inputs\n", + "x1 = Value(2.0, label=\"x1\")\n", + "x2 = Value(0.0, label=\"x2\")\n", + "# Weights\n", + "w1 = Value(-3.0, label='w1')\n", + "w2 = Value(1.0, label='w2')\n", + "# bias of the neuron\n", + "b = Value(6.7, label='b')\n", + "# x1w1 + x2w2 + b\n", + "x1w1 = x1*w1; x1w1.label='x1w1'\n", + "x2w2 = x2*w2; x2w2.label='x2w2'\n", + "x1w1x2w2 = x1w1 + x2w2; x1w1x2w2.label='x1w1x2w2'\n", + "n = x1w1x2w2 + b; n.label='n'\n", + "\n", + "draw_dot(n)" + ] + }, + { + "cell_type": "markdown", + "id": "b210c889", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "id": "e287e82c", + "metadata": {}, + "source": [ + "####\n", + "####\n" + ] + }, + { + "cell_type": "markdown", + "id": "311d7d23", + "metadata": {}, + "source": [ + "#### updating Value: adding tanh" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "89d43bb9", + "metadata": {}, + "outputs": [], + "source": [ + "import math\n", + "\n", + "class Value:\n", + " \n", + " def __init__( self, data, _children=(), _operation='', label='' ):\n", + " self.data = data\n", + " self.grad = 0.0\n", + " self._prev = set(_children)\n", + " self._op = _operation\n", + " self.label = label\n", + " \n", + " def __repr__(self):\n", + " return f\"Value(data={self.data})\"\n", + " \n", + " def __add__(self, otherObj):\n", + " out = Value(self.data + otherObj.data, (self, otherObj), '+' )\n", + " return out\n", + " \n", + " def __mul__(self, otherObj):\n", + " out = Value(self.data * otherObj.data, (self, otherObj), '*')\n", + " return out\n", + " \n", + " def __sub__(self, otherObj):\n", + " out = Value(self.data - otherObj.data, (self, otherObj), '-')\n", + " return out\n", + " \n", + " # tanh(x) = (e^2x - 1) / (e^2x + 1)\n", + " def tanh(self):\n", + " x = self.data\n", + " t = (math.exp(2*x) - 1) / (math.exp(2*x) + 1)\n", + " out = Value(t, (self, ),'tanh')\n", + " return out" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "cb1ee4f6", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100213776\n", + "\n", + "b\n", + "\n", + "data 6.7000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100211664+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100213776->2556100211664+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100211280\n", + "\n", + "x1w1x2w2\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100211280->2556100211664+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100211280+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100211280+->2556100211280\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100213872\n", + "\n", + "x1w1\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100213872->2556100211280+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100213872*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100213872*->2556100213872\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100211376\n", + "\n", + "x2w2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100211376->2556100211280+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100211376*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100211376*->2556100211376\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100206336\n", + "\n", + "w2\n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100206336->2556100211376*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097468240\n", + "\n", + "x1\n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097468240->2556100213872*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556098678736\n", + "\n", + "o\n", + "\n", + "data 0.6044\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556098678736tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2556098678736tanh->2556098678736\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100211664\n", + "\n", + "n\n", + "\n", + "data 0.7000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100211664->2556098678736tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100211664+->2556100211664\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097476064\n", + "\n", + "w1\n", + "\n", + "data -3.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097476064->2556100213872*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097478128\n", + "\n", + "x2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097478128->2556100211376*\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Inputs\n", + "x1 = Value(2.0, label=\"x1\")\n", + "x2 = Value(0.0, label=\"x2\")\n", + "# Weights\n", + "w1 = Value(-3.0, label='w1')\n", + "w2 = Value(1.0, label='w2')\n", + "# bias of the neuron\n", + "b = Value(6.7, label='b')\n", + "# x1w1 + x2w2 + b\n", + "x1w1 = x1*w1; x1w1.label='x1w1'\n", + "x2w2 = x2*w2; x2w2.label='x2w2'\n", + "x1w1x2w2 = x1w1 + x2w2; x1w1x2w2.label='x1w1x2w2'\n", + "n = x1w1x2w2 + b; n.label='n'\n", + "\n", + "o = n.tanh(); o.label='o'\n", + "draw_dot(o)" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "233d229f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208160\n", + "\n", + "x1w1x2w2\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100208544+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100208160->2556100208544+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208160+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100208160+->2556100208160\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204080\n", + "\n", + "w2\n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100208208*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100204080->2556100208208*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097473088\n", + "\n", + "x1\n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100204320*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556097473088->2556100204320*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208208\n", + "\n", + "x2w2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100208208->2556100208160+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208208*->2556100208208\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208736\n", + "\n", + "o\n", + "\n", + "data 0.7071\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100208736tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2556100208736tanh->2556100208736\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097473664\n", + "\n", + "w1\n", + "\n", + "data -3.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097473664->2556100204320*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204320\n", + "\n", + "x1w1\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100204320->2556100208160+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204320*->2556100204320\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556098533152\n", + "\n", + "x2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556098533152->2556100208208*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204416\n", + "\n", + "b\n", + "\n", + "data 6.8814\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100204416->2556100208544+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208544\n", + "\n", + "n\n", + "\n", + "data 0.8814\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100208544->2556100208736tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208544+->2556100208544\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Inputs\n", + "x1 = Value(2.0, label=\"x1\")\n", + "x2 = Value(0.0, label=\"x2\")\n", + "# Weights\n", + "w1 = Value(-3.0, label='w1')\n", + "w2 = Value(1.0, label='w2')\n", + "# bias of the neuron\n", + "b = Value(6.8813735870195432, label='b')\n", + "# x1w1 + x2w2 + b\n", + "x1w1 = x1*w1; x1w1.label='x1w1'\n", + "x2w2 = x2*w2; x2w2.label='x2w2'\n", + "x1w1x2w2 = x1w1 + x2w2; x1w1x2w2.label='x1w1x2w2'\n", + "n = x1w1x2w2 + b; n.label='n'\n", + "\n", + "o = n.tanh(); o.label='o'\n", + "draw_dot(o)" + ] + }, + { + "cell_type": "markdown", + "id": "a2ebf0f3", + "metadata": {}, + "source": [ + "### Manual Backpropagation: neuron" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "f616c9c5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.4999999999999999" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# derivate of 'o' wrt 'o':\n", + "o.grad = 1.0\n", + "\n", + "# o = tanh(n)\n", + "# derivate of 'o' wrt 'n':\n", + "# do/dn = 1 - o**2\n", + "\n", + "1 - (o.data**2)" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "9f924345", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208160\n", + "\n", + "x1w1x2w2\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100208544+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100208160->2556100208544+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208160+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100208160+->2556100208160\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204080\n", + "\n", + "w2\n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100208208*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100204080->2556100208208*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097473088\n", + "\n", + "x1\n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100204320*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556097473088->2556100204320*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208208\n", + "\n", + "x2w2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100208208->2556100208160+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208208*->2556100208208\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208736\n", + "\n", + "o\n", + "\n", + "data 0.7071\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2556100208736tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2556100208736tanh->2556100208736\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097473664\n", + "\n", + "w1\n", + "\n", + "data -3.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097473664->2556100204320*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204320\n", + "\n", + "x1w1\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100204320->2556100208160+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204320*->2556100204320\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556098533152\n", + "\n", + "x2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556098533152->2556100208208*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204416\n", + "\n", + "b\n", + "\n", + "data 6.8814\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100204416->2556100208544+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208544\n", + "\n", + "n\n", + "\n", + "data 0.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100208544->2556100208736tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208544+->2556100208544\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "n.grad = 0.5\n", + "draw_dot(o)" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "40b3131f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208160\n", + "\n", + "x1w1x2w2\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100208544+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100208160->2556100208544+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208160+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100208160+->2556100208160\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204080\n", + "\n", + "w2\n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100208208*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100204080->2556100208208*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097473088\n", + "\n", + "x1\n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100204320*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556097473088->2556100204320*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208208\n", + "\n", + "x2w2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100208208->2556100208160+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208208*->2556100208208\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208736\n", + "\n", + "o\n", + "\n", + "data 0.7071\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2556100208736tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2556100208736tanh->2556100208736\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097473664\n", + "\n", + "w1\n", + "\n", + "data -3.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556097473664->2556100204320*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204320\n", + "\n", + "x1w1\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100204320->2556100208160+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204320*->2556100204320\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556098533152\n", + "\n", + "x2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556098533152->2556100208208*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204416\n", + "\n", + "b\n", + "\n", + "data 6.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100204416->2556100208544+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208544\n", + "\n", + "n\n", + "\n", + "data 0.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100208544->2556100208736tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208544+->2556100208544\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "b.grad = 0.5\n", + "x1w1x2w2.grad = 0.5\n", + "\n", + "x1w1.grad = 0.5\n", + "x2w2.grad = 0.5\n", + "\n", + "draw_dot(o)" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "8957ca64", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208160\n", + "\n", + "x1w1x2w2\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100208544+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100208160->2556100208544+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208160+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100208160+->2556100208160\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204080\n", + "\n", + "w2\n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100208208*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100204080->2556100208208*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097473088\n", + "\n", + "x1\n", + "\n", + "data 2.0000\n", + "\n", + "grad -1.5000\n", + "\n", + "\n", + "\n", + "2556100204320*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556097473088->2556100204320*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208208\n", + "\n", + "x2w2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100208208->2556100208160+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208208*->2556100208208\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208736\n", + "\n", + "o\n", + "\n", + "data 0.7071\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2556100208736tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2556100208736tanh->2556100208736\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556097473664\n", + "\n", + "w1\n", + "\n", + "data -3.0000\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2556097473664->2556100204320*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204320\n", + "\n", + "x1w1\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100204320->2556100208160+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204320*->2556100204320\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556098533152\n", + "\n", + "x2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556098533152->2556100208208*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204416\n", + "\n", + "b\n", + "\n", + "data 6.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100204416->2556100208544+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208544\n", + "\n", + "n\n", + "\n", + "data 0.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100208544->2556100208736tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100208544+->2556100208544\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# x2.grad = do/dx2w2 * dx2w2/dx2\n", + "x2.grad = 0.5 * 1.0\n", + "# w2.grad = do/dx2w2 * dx2w2/dw2\n", + "w2.grad = 0.5 * 0.0\n", + "\n", + "x1.grad = w1.data * x1w1.grad\n", + "w1.grad = x1.data * x1w1.grad\n", + "\n", + "draw_dot(o)" + ] + }, + { + "cell_type": "markdown", + "id": "2353f98f", + "metadata": {}, + "source": [ + "#\n", + "#" + ] + }, + { + "cell_type": "markdown", + "id": "2ef99213", + "metadata": {}, + "source": [ + "Updating Value: adding backward function for each operation" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "id": "81485061", + "metadata": {}, + "outputs": [], + "source": [ + "class Value:\n", + " \n", + " def __init__( self, data, _children=(), _operation='', label='' ):\n", + " self.data = data\n", + " self.grad = 0.0\n", + " self._prev = set(_children)\n", + " self._op = _operation\n", + " self._backward = lambda: None \n", + " self.label = label\n", + " \n", + " def __repr__(self):\n", + " return f\"Value(data={self.data})\"\n", + " \n", + " def __add__(self, otherObj):\n", + " out = Value(self.data + otherObj.data, (self, otherObj), '+' )\n", + " # backward logic for addition\n", + " def _backward():\n", + " self.grad += 1.0 * out.grad # \"+=\" because we need to accumulate gradients \n", + " otherObj.grad += 1.0 * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " def __mul__(self, otherObj):\n", + " out = Value(self.data * otherObj.data, (self, otherObj), '*')\n", + " # backward logic for multiplication\n", + " def _backward():\n", + " self.grad += otherObj.data * out.grad\n", + " otherObj.grad += self.data * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " def tanh(self):\n", + " x = self.data\n", + " t = (math.exp(2*x) - 1) / (math.exp(2*x) + 1)\n", + " out = Value(t, (self, ),'tanh')\n", + " # backward logic for tanh function\n", + " def _backward():\n", + " self.grad += (1 - t**2) * out.grad\n", + " out._backward = _backward \n", + " return out" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "5bbf9748", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100444704\n", + "\n", + "w1\n", + "\n", + "data -3.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100449408*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100444704->2556100449408*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100451904\n", + "\n", + "x1w1x2w2\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100452672+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100451904->2556100452672+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100451904+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100451904+->2556100451904\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100444752\n", + "\n", + "w2\n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100449744*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100444752->2556100449744*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449408\n", + "\n", + "x1w1\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100449408->2556100451904+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449408*->2556100449408\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452000\n", + "\n", + "o\n", + "\n", + "data 0.7071\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100452000tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2556100452000tanh->2556100452000\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100453536\n", + "\n", + "b\n", + "\n", + "data 6.8814\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100453536->2556100452672+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452672\n", + "\n", + "n\n", + "\n", + "data 0.8814\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100452672->2556100452000tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452672+->2556100452672\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100451664\n", + "\n", + "x1\n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100451664->2556100449408*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100455792\n", + "\n", + "x2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100455792->2556100449744*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449744\n", + "\n", + "x2w2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100449744->2556100451904+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449744*->2556100449744\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Inputs\n", + "x1 = Value(2.0, label=\"x1\")\n", + "x2 = Value(0.0, label=\"x2\")\n", + "# Weights\n", + "w1 = Value(-3.0, label='w1')\n", + "w2 = Value(1.0, label='w2')\n", + "# bias of the neuron\n", + "b = Value(6.8813735870195432, label='b')\n", + "# x1w1 + x2w2 + b\n", + "x1w1 = x1*w1; x1w1.label='x1w1'\n", + "x2w2 = x2*w2; x2w2.label='x2w2'\n", + "x1w1x2w2 = x1w1 + x2w2; x1w1x2w2.label='x1w1x2w2'\n", + "n = x1w1x2w2 + b; n.label='n'\n", + "\n", + "o = n.tanh(); o.label='o'\n", + "draw_dot(o)" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "a147fc66", + "metadata": {}, + "outputs": [], + "source": [ + "o.grad = 1.0 # setting '1.0', because by default it is '0.0'\n", + "o._backward()" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "id": "dd9af428", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100444704\n", + "\n", + "w1\n", + "\n", + "data -3.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100449408*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100444704->2556100449408*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100451904\n", + "\n", + "x1w1x2w2\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100452672+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100451904->2556100452672+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100451904+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100451904+->2556100451904\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100444752\n", + "\n", + "w2\n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100449744*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100444752->2556100449744*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449408\n", + "\n", + "x1w1\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100449408->2556100451904+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449408*->2556100449408\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452000\n", + "\n", + "o\n", + "\n", + "data 0.7071\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2556100452000tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2556100452000tanh->2556100452000\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100453536\n", + "\n", + "b\n", + "\n", + "data 6.8814\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100453536->2556100452672+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452672\n", + "\n", + "n\n", + "\n", + "data 0.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100452672->2556100452000tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452672+->2556100452672\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100451664\n", + "\n", + "x1\n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100451664->2556100449408*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100455792\n", + "\n", + "x2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100455792->2556100449744*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449744\n", + "\n", + "x2w2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100449744->2556100451904+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449744*->2556100449744\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "draw_dot(o)" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "349bd933", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100444704\n", + "\n", + "w1\n", + "\n", + "data -3.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100449408*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100444704->2556100449408*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100451904\n", + "\n", + "x1w1x2w2\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100452672+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100451904->2556100452672+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100451904+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100451904+->2556100451904\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100444752\n", + "\n", + "w2\n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100449744*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100444752->2556100449744*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449408\n", + "\n", + "x1w1\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100449408->2556100451904+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449408*->2556100449408\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452000\n", + "\n", + "o\n", + "\n", + "data 0.7071\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2556100452000tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2556100452000tanh->2556100452000\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100453536\n", + "\n", + "b\n", + "\n", + "data 6.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100453536->2556100452672+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452672\n", + "\n", + "n\n", + "\n", + "data 0.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100452672->2556100452000tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452672+->2556100452672\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100451664\n", + "\n", + "x1\n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100451664->2556100449408*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100455792\n", + "\n", + "x2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100455792->2556100449744*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449744\n", + "\n", + "x2w2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100449744->2556100451904+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449744*->2556100449744\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "n._backward()\n", + "draw_dot(o)" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "09231d5b", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100444704\n", + "\n", + "w1\n", + "\n", + "data -3.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100449408*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100444704->2556100449408*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100451904\n", + "\n", + "x1w1x2w2\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100452672+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100451904->2556100452672+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100451904+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100451904+->2556100451904\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100444752\n", + "\n", + "w2\n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100449744*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100444752->2556100449744*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449408\n", + "\n", + "x1w1\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100449408->2556100451904+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449408*->2556100449408\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452000\n", + "\n", + "o\n", + "\n", + "data 0.7071\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2556100452000tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2556100452000tanh->2556100452000\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100453536\n", + "\n", + "b\n", + "\n", + "data 6.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100453536->2556100452672+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452672\n", + "\n", + "n\n", + "\n", + "data 0.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100452672->2556100452000tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452672+->2556100452672\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100451664\n", + "\n", + "x1\n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100451664->2556100449408*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100455792\n", + "\n", + "x2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100455792->2556100449744*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449744\n", + "\n", + "x2w2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100449744->2556100451904+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449744*->2556100449744\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 70, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "b._backward()\n", + "draw_dot(o)" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "efe5f02b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100444704\n", + "\n", + "w1\n", + "\n", + "data -3.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100449408*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100444704->2556100449408*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100451904\n", + "\n", + "x1w1x2w2\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100452672+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100451904->2556100452672+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100451904+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100451904+->2556100451904\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100444752\n", + "\n", + "w2\n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100449744*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100444752->2556100449744*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449408\n", + "\n", + "x1w1\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100449408->2556100451904+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449408*->2556100449408\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452000\n", + "\n", + "o\n", + "\n", + "data 0.7071\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2556100452000tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2556100452000tanh->2556100452000\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100453536\n", + "\n", + "b\n", + "\n", + "data 6.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100453536->2556100452672+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452672\n", + "\n", + "n\n", + "\n", + "data 0.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100452672->2556100452000tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452672+->2556100452672\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100451664\n", + "\n", + "x1\n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100451664->2556100449408*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100455792\n", + "\n", + "x2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100455792->2556100449744*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449744\n", + "\n", + "x2w2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100449744->2556100451904+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449744*->2556100449744\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x1w1x2w2._backward()\n", + "draw_dot(o)" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "66ce4028", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100444704\n", + "\n", + "w1\n", + "\n", + "data -3.0000\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2556100449408*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100444704->2556100449408*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100451904\n", + "\n", + "x1w1x2w2\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100452672+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100451904->2556100452672+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100451904+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100451904+->2556100451904\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100444752\n", + "\n", + "w2\n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100449744*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100444752->2556100449744*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449408\n", + "\n", + "x1w1\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100449408->2556100451904+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449408*->2556100449408\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452000\n", + "\n", + "o\n", + "\n", + "data 0.7071\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2556100452000tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2556100452000tanh->2556100452000\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100453536\n", + "\n", + "b\n", + "\n", + "data 6.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100453536->2556100452672+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452672\n", + "\n", + "n\n", + "\n", + "data 0.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100452672->2556100452000tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452672+->2556100452672\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100451664\n", + "\n", + "x1\n", + "\n", + "data 2.0000\n", + "\n", + "grad -1.5000\n", + "\n", + "\n", + "\n", + "2556100451664->2556100449408*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100455792\n", + "\n", + "x2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100455792->2556100449744*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449744\n", + "\n", + "x2w2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100449744->2556100451904+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449744*->2556100449744\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 72, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x1w1._backward()\n", + "x2w2._backward()\n", + "draw_dot(o)" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "0dada9c1", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100444704\n", + "\n", + "w1\n", + "\n", + "data -3.0000\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2556100449408*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100444704->2556100449408*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100451904\n", + "\n", + "x1w1x2w2\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100452672+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100451904->2556100452672+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100451904+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100451904+->2556100451904\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100444752\n", + "\n", + "w2\n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100449744*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100444752->2556100449744*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449408\n", + "\n", + "x1w1\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100449408->2556100451904+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449408*->2556100449408\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452000\n", + "\n", + "o\n", + "\n", + "data 0.7071\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2556100452000tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2556100452000tanh->2556100452000\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100453536\n", + "\n", + "b\n", + "\n", + "data 6.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100453536->2556100452672+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452672\n", + "\n", + "n\n", + "\n", + "data 0.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100452672->2556100452000tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452672+->2556100452672\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100451664\n", + "\n", + "x1\n", + "\n", + "data 2.0000\n", + "\n", + "grad -1.5000\n", + "\n", + "\n", + "\n", + "2556100451664->2556100449408*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100455792\n", + "\n", + "x2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100455792->2556100449744*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449744\n", + "\n", + "x2w2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100449744->2556100451904+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100449744*->2556100449744\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "draw_dot(o)" + ] + }, + { + "cell_type": "markdown", + "id": "e4333462", + "metadata": {}, + "source": [ + "---\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "e44f3f40", + "metadata": {}, + "source": [ + "## Topological Sort\n" + ] + }, + { + "cell_type": "markdown", + "id": "4508d973", + "metadata": {}, + "source": [ + "Topological sort is a technique used to order the vertices of a directed graph in such a way that for every directed edge u → v, vertex u comes before vertex v in the ordering. It is applicable only to directed acyclic graphs (DAGs), where no cycles are present." + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "85e32b03", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Value(data=6.881373587019543),\n", + " Value(data=-3.0),\n", + " Value(data=2.0),\n", + " Value(data=-6.0),\n", + " Value(data=1.0),\n", + " Value(data=0.0),\n", + " Value(data=0.0),\n", + " Value(data=-6.0),\n", + " Value(data=0.8813735870195432),\n", + " Value(data=0.7071067811865476)]" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Initialize an empty list to store topologically sorted nodes\n", + "topo = []\n", + "# Initialize a set to keep track of visited nodes during topological sorting\n", + "visited = set()\n", + "# Define a function to recursively build the topological sort\n", + "def build_topo(v):\n", + " if v not in visited: # Check if the node has already been visited\n", + " visited.add(v) # Mark the current node as visited\n", + " for child in v._prev: # Iterate through the predecessors of the current node\n", + " build_topo(child) # Recursively call build_topo for each predecessor\n", + " topo.append(v) # Add the current node to the topologically sorted list\n", + "\n", + "# Build the topological sort starting from the output node 'o'\n", + "build_topo(o)\n", + "topo" + ] + }, + { + "cell_type": "markdown", + "id": "348d3606", + "metadata": {}, + "source": [ + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "0fbbb652", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452912\n", + "\n", + "w2\n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100456320*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100452912->2556100456320*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100456512\n", + "\n", + "n\n", + "\n", + "data 0.8814\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100444944tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2556100456512->2556100444944tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100456512+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100456512+->2556100456512\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100460112\n", + "\n", + "x2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100460112->2556100456320*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100450176\n", + "\n", + "w1\n", + "\n", + "data -3.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100458288*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100450176->2556100458288*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100448928\n", + "\n", + "x1\n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100448928->2556100458288*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100450560\n", + "\n", + "b\n", + "\n", + "data 6.8814\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100450560->2556100456512+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100444944\n", + "\n", + "o\n", + "\n", + "data 0.7071\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100444944tanh->2556100444944\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100458288\n", + "\n", + "x1w1\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100456416+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100458288->2556100456416+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100458288*->2556100458288\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100456320\n", + "\n", + "x2w2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100456320->2556100456416+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100456320*->2556100456320\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100456416\n", + "\n", + "x1w1x2w2\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100456416->2556100456512+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100456416+->2556100456416\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 75, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Inputs\n", + "x1 = Value(2.0, label=\"x1\")\n", + "x2 = Value(0.0, label=\"x2\")\n", + "# Weights\n", + "w1 = Value(-3.0, label='w1')\n", + "w2 = Value(1.0, label='w2')\n", + "# bias of the neuron\n", + "b = Value(6.8813735870195432, label='b')\n", + "# x1w1 + x2w2 + b\n", + "x1w1 = x1*w1; x1w1.label='x1w1'\n", + "x2w2 = x2*w2; x2w2.label='x2w2'\n", + "x1w1x2w2 = x1w1 + x2w2; x1w1x2w2.label='x1w1x2w2'\n", + "n = x1w1x2w2 + b; n.label='n'\n", + "\n", + "o = n.tanh(); o.label='o'\n", + "draw_dot(o)" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "3e9a7910", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100452912\n", + "\n", + "w2\n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100456320*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100452912->2556100456320*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100456512\n", + "\n", + "n\n", + "\n", + "data 0.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100444944tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2556100456512->2556100444944tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100456512+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100456512+->2556100456512\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100460112\n", + "\n", + "x2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100460112->2556100456320*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100450176\n", + "\n", + "w1\n", + "\n", + "data -3.0000\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2556100458288*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100450176->2556100458288*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100448928\n", + "\n", + "x1\n", + "\n", + "data 2.0000\n", + "\n", + "grad -1.5000\n", + "\n", + "\n", + "\n", + "2556100448928->2556100458288*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100450560\n", + "\n", + "b\n", + "\n", + "data 6.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100450560->2556100456512+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100444944\n", + "\n", + "o\n", + "\n", + "data 0.7071\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2556100444944tanh->2556100444944\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100458288\n", + "\n", + "x1w1\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100456416+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100458288->2556100456416+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100458288*->2556100458288\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100456320\n", + "\n", + "x2w2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100456320->2556100456416+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100456320*->2556100456320\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100456416\n", + "\n", + "x1w1x2w2\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100456416->2556100456512+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100456416+->2556100456416\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Set the gradient of the output node to 1.0\n", + "o.grad = 1.0 \n", + "\n", + "# Initialize an empty list to store topologically sorted nodes\n", + "topo = []\n", + "\n", + "# Initialize a set to keep track of visited nodes during topological sorting\n", + "visited = set()\n", + "\n", + "# Define a function to recursively build the topological sort\n", + "def build_topo(v):\n", + " if v not in visited: # Check if the node has already been visited\n", + " visited.add(v) # Mark the current node as visited\n", + " for child in v._prev: # Iterate through the predecessors of the current node\n", + " build_topo(child) # Recursively call build_topo for each predecessor\n", + " topo.append(v) # Add the current node to the topologically sorted list\n", + "\n", + "# Build the topological sort starting from the output node 'o'\n", + "build_topo(o)\n", + " \n", + "# Iterate through the topologically sorted nodes in reversed order\n", + "for node in reversed(topo):\n", + " node._backward() # Perform backpropagation for each node\n", + "\n", + "# Visualize\n", + "draw_dot(o)" + ] + }, + { + "cell_type": "markdown", + "id": "55395a2b", + "metadata": {}, + "source": [ + "#\n", + "#\n", + "---\n", + "#\n", + "#" + ] + }, + { + "cell_type": "markdown", + "id": "11750ad9", + "metadata": {}, + "source": [ + "updating Value: adding backpropagation" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "45acf4c0", + "metadata": {}, + "outputs": [], + "source": [ + "class Value:\n", + " \n", + " def __init__( self, data, _children=(), _operation='', label='' ):\n", + " self.data = data\n", + " self.grad = 0.0\n", + " self._prev = set(_children)\n", + " self._op = _operation\n", + " self._backward = lambda: None \n", + " self.label = label\n", + " \n", + " def __repr__(self):\n", + " return f\"Value(data={self.data})\"\n", + " \n", + " def __add__(self, otherObj):\n", + " out = Value(self.data + otherObj.data, (self, otherObj), '+' )\n", + " # backward logic for addition\n", + " def _backward():\n", + " self.grad += 1.0 * out.grad # \"+=\" because we need to accumulate gradients \n", + " otherObj.grad += 1.0 * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " def __mul__(self, otherObj):\n", + " out = Value(self.data * otherObj.data, (self, otherObj), '*')\n", + " # backward logic for multiplication\n", + " def _backward():\n", + " self.grad += otherObj.data * out.grad\n", + " otherObj.grad += self.data * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " def tanh(self):\n", + " x = self.data\n", + " t = (math.exp(2*x) - 1) / (math.exp(2*x) + 1)\n", + " out = Value(t, (self, ),'tanh')\n", + " # backward logic for tanh function\n", + " def _backward():\n", + " self.grad += (1 - t**2) * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " def backward(self):\n", + " topo = []\n", + " visited = set()\n", + " def build_topo(v):\n", + " if v not in visited:\n", + " visited.add(v)\n", + " for child in v._prev:\n", + " build_topo(child)\n", + " topo.append(v)\n", + " build_topo(self)\n", + " self.grad = 1.0 \n", + " for node in reversed(topo):\n", + " node._backward()" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "65efe50f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204560\n", + "\n", + "n\n", + "\n", + "data 0.8814\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100204272tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2556100204560->2556100204272tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204560+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100204560+->2556100204560\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100206144\n", + "\n", + "x2w2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100202352+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100206144->2556100202352+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100206144*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100206144*->2556100206144\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100202064\n", + "\n", + "x1w1\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100202064->2556100202352+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100202064*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100202064*->2556100202064\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100198464\n", + "\n", + "w1\n", + "\n", + "data -3.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100198464->2556100202064*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100207728\n", + "\n", + "w2\n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100207728->2556100206144*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204752\n", + "\n", + "b\n", + "\n", + "data 6.8814\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100204752->2556100204560+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204272\n", + "\n", + "o\n", + "\n", + "data 0.7071\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100204272tanh->2556100204272\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100200240\n", + "\n", + "x2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100200240->2556100206144*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100202352\n", + "\n", + "x1w1x2w2\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100202352->2556100204560+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100202352+->2556100202352\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100206000\n", + "\n", + "x1\n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100206000->2556100202064*\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Inputs\n", + "x1 = Value(2.0, label=\"x1\")\n", + "x2 = Value(0.0, label=\"x2\")\n", + "# Weights\n", + "w1 = Value(-3.0, label='w1')\n", + "w2 = Value(1.0, label='w2')\n", + "# bias of the neuron\n", + "b = Value(6.8813735870195432, label='b')\n", + "# x1w1 + x2w2 + b\n", + "x1w1 = x1*w1; x1w1.label='x1w1'\n", + "x2w2 = x2*w2; x2w2.label='x2w2'\n", + "x1w1x2w2 = x1w1 + x2w2; x1w1x2w2.label='x1w1x2w2'\n", + "n = x1w1x2w2 + b; n.label='n'\n", + "\n", + "o = n.tanh(); o.label='o'\n", + "draw_dot(o)" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "7d1a4412", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204560\n", + "\n", + "n\n", + "\n", + "data 0.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100204272tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2556100204560->2556100204272tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204560+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100204560+->2556100204560\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100206144\n", + "\n", + "x2w2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100202352+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2556100206144->2556100202352+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100206144*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100206144*->2556100206144\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100202064\n", + "\n", + "x1w1\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100202064->2556100202352+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100202064*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2556100202064*->2556100202064\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100198464\n", + "\n", + "w1\n", + "\n", + "data -3.0000\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2556100198464->2556100202064*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100207728\n", + "\n", + "w2\n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2556100207728->2556100206144*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204752\n", + "\n", + "b\n", + "\n", + "data 6.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100204752->2556100204560+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100204272\n", + "\n", + "o\n", + "\n", + "data 0.7071\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2556100204272tanh->2556100204272\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100200240\n", + "\n", + "x2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100200240->2556100206144*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100202352\n", + "\n", + "x1w1x2w2\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2556100202352->2556100204560+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100202352+->2556100202352\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2556100206000\n", + "\n", + "x1\n", + "\n", + "data 2.0000\n", + "\n", + "grad -1.5000\n", + "\n", + "\n", + "\n", + "2556100206000->2556100202064*\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 79, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "o.backward()\n", + "draw_dot(o)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lectures/micrograd/Making of Micrograd/2 Value - adding more operations.ipynb b/lectures/micrograd/Making of Micrograd/2 Value - adding more operations.ipynb new file mode 100644 index 00000000..59bbd881 --- /dev/null +++ b/lectures/micrograd/Making of Micrograd/2 Value - adding more operations.ipynb @@ -0,0 +1,2440 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "9ee4e5ae", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import math\n", + "import torch" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "f31c76f8", + "metadata": {}, + "outputs": [], + "source": [ + "from graphviz import Digraph\n", + "\n", + "def trace(root):\n", + " # builds a set of all nodes and edges in graph\n", + " nodes, edges = set(), set()\n", + " def build(v):\n", + " if v not in nodes:\n", + " nodes.add(v)\n", + " for child in v._prev:\n", + " edges.add((child, v))\n", + " build(child)\n", + " build(root)\n", + " return nodes, edges\n", + "\n", + "def draw_dot(root):\n", + " dot = Digraph(format='svg', graph_attr={'rankdir': 'LR'}) # LR = left to right, TB = Top to Bottom\n", + "\n", + " nodes, edges = trace(root)\n", + " for n in nodes:\n", + " uid = str(id(n))\n", + " # for any value in the graph, create a rectangular ('record') node for it\n", + " dot.node(name = uid, label = \"{ %s | data %.4f | grad %.4f }\" % (n.label, n.data, n.grad ), shape='record')\n", + " if n._op:\n", + " # if this value is result of some operation , create an op node for it\n", + " dot.node(name = uid + n._op, label = n._op)\n", + " # and connect this node to it\n", + " dot.edge(uid + n._op, uid)\n", + " \n", + " for n1, n2 in edges:\n", + " # connect n1 node to op node of n2\n", + " dot.edge(str(id(n1)), str(id(n2)) + n2._op)\n", + " \n", + " return dot" + ] + }, + { + "cell_type": "markdown", + "id": "0f768659", + "metadata": {}, + "source": [ + "### - Breaking up a `tanh` function\n", + "### - Adding more operations" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "69653b74", + "metadata": {}, + "outputs": [], + "source": [ + "class Value:\n", + " \n", + " def __init__( self, data, _children=(), _operation='', label='' ):\n", + " self.data = data\n", + " self.grad = 0.0\n", + " self._prev = set(_children)\n", + " self._op = _operation\n", + " self._backward = lambda: None \n", + " self.label = label\n", + " \n", + " def __repr__(self):\n", + " return f\"Value(data={self.data})\"\n", + " \n", + " def __add__(self, otherObj):\n", + " # Ensure that `otherObj` is of type `Value`, \n", + " # if not, create a new `Value` object with `otherObj` as its value\n", + " otherObj = otherObj if isinstance(otherObj, Value) else Value(otherObj)\n", + " out = Value(self.data + otherObj.data, (self, otherObj), '+' )\n", + " def _backward():\n", + " self.grad += 1.0 * out.grad\n", + " otherObj.grad += 1.0 * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " def __mul__(self, otherObj):\n", + " # Ensure that `otherObj` is of type `Value`, \n", + " # if not, create a new `Value` object with `otherObj` as its value\n", + " otherObj = otherObj if isinstance(otherObj, Value) else Value(otherObj)\n", + " out = Value(self.data * otherObj.data, (self, otherObj), '*')\n", + " def _backward():\n", + " self.grad += otherObj.data * out.grad\n", + " otherObj.grad += self.data * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " def tanh(self):\n", + " x = self.data\n", + " t = (math.exp(2*x) - 1) / (math.exp(2*x) + 1)\n", + " out = Value(t, (self, ),'tanh')\n", + " def _backward():\n", + " self.grad += (1 - t**2) * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " def backward(self):\n", + " topo = []\n", + " visited = set()\n", + " def build_topo(v):\n", + " if v not in visited:\n", + " visited.add(v)\n", + " for child in v._prev:\n", + " build_topo(child)\n", + " topo.append(v)\n", + " build_topo(self)\n", + " self.grad = 1.0 \n", + " for node in reversed(topo):\n", + " node._backward()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7a458fa1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=15)\n" + ] + } + ], + "source": [ + "a = Value(5)\n", + "b = Value(10)\n", + "print(a+b)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "e331079d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=15)\n", + "Value(data=4587)\n" + ] + } + ], + "source": [ + "print(a + 10)\n", + "print(a + 4582)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "1eb44fea", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342388768\n", + "\n", + " \n", + "\n", + "data 15.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2161342388768+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2161342388768+->2161342388768\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342391744\n", + "\n", + " \n", + "\n", + "data 10.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2161342391744->2161342388768+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342391840\n", + "\n", + " \n", + "\n", + "data 5.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2161342391840->2161342388768+\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "draw_dot(a + b)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "9f8d34ed", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342391840\n", + "\n", + " \n", + "\n", + "data 5.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2161342391600+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2161342391840->2161342391600+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342391600\n", + "\n", + " \n", + "\n", + "data 4587.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2161342391600+->2161342391600\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342383920\n", + "\n", + " \n", + "\n", + "data 4582.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2161342383920->2161342391600+\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "draw_dot(a + 4582 )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5bf5785a", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "5fa024f7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=25)\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342393856\n", + "\n", + " \n", + "\n", + "data 5.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2161342391408*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2161342393856->2161342391408*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342391840\n", + "\n", + " \n", + "\n", + "data 5.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2161342391840->2161342391408*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342391408\n", + "\n", + " \n", + "\n", + "data 25.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2161342391408*->2161342391408\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(a * 5)\n", + "draw_dot(a*5)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20c4ae8e", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "125e5d97", + "metadata": {}, + "outputs": [], + "source": [ + "# reverse doesn't work\n", + "# 5 * a\n", + "\n", + "# TypeError: unsupported operand type(s) for *: 'int' and 'Value'" + ] + }, + { + "cell_type": "markdown", + "id": "8ffc7886", + "metadata": {}, + "source": [ + "### Special Methods for Arithmetic Operations in Python\n", + "\n", + "Python provides special methods, often referred to as \"magic methods\" or \"dunder methods\" (short for \"double underscore\"), to define the behavior of built-in operators like addition (`+`), multiplication (`*`), etc., for user-defined objects. These methods enable custom objects to support arithmetic operations seamlessly.\n", + "\n", + "#### Right-Hand Arithmetic Operations:\n", + "\n", + "1. **`__radd__(self, other)`**: This method defines the behavior of the right-hand addition operation (`+`) when the left operand does not support the operation. It is called when the object appears on the right side of the `+` operator.\n", + " \n", + "2. **`__rsub__(self, other)`**: Defines the behavior of the right-hand subtraction operation (`-`).\n", + "\n", + "3. **`__rmul__(self, other)`**: Defines the behavior of the right-hand multiplication operation (`*`).\n", + "\n", + "4. **`__rdiv__(self, other)`**: Defines the behavior of the right-hand division operation (`/`).\n", + "\n", + "5. **`__rmod__(self, other)`**: Defines the behavior of the right-hand modulo operation (`%`).\n", + "\n", + "#### Right-Hand Arithmetic Operations:\n", + "\n", + "1. **`__rmul__(self, otherObj)`**: This method defines the behavior of the right-hand multiplication operation (`*`). It is called when the object appears on the right side of the `*` operator, and the left operand does not support the operation.\n", + "\n", + "2. **`__mul__(self, otherObj)`**: This method defines the behavior of the left-hand multiplication operation (`*`). It is called when the object appears on the left side of the `*` operator, or when both operands support the operation.\n", + "\n", + "#### Usage Example:\n", + "\n", + "```python\n", + "class Value:\n", + " def __init__(self, data):\n", + " self.data = data\n", + "\n", + " def __rmul__(self, otherObj):\n", + " return Value(self.data * otherObj)\n", + "\n", + " def __mul__(self, otherObj):\n", + " return Value(self.data * otherObj)\n", + "\n", + "a = Value(5)\n", + "b = 3\n", + "\n", + "result1 = a * b # Calls a.__mul__(b), returns a new instance of Value with data 15\n", + "result2 = b * a # Calls a.__rmul__(b), returns a new instance of Value with data 15\n", + "\n", + "print(result1.data) # Output: 15\n", + "print(result2.data) # Output: 15\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "960de8e4", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "917d39b5", + "metadata": {}, + "outputs": [], + "source": [ + "class Value:\n", + " \n", + " def __init__( self, data, _children=(), _operation='', label='' ):\n", + " self.data = data\n", + " self.grad = 0.0\n", + " self._prev = set(_children)\n", + " self._op = _operation\n", + " self._backward = lambda: None \n", + " self.label = label\n", + " \n", + " def __repr__(self):\n", + " return f\"Value(data={self.data})\"\n", + " \n", + " def __add__(self, otherObj):\n", + " otherObj = otherObj if isinstance(otherObj, Value) else Value(otherObj)\n", + " out = Value(self.data + otherObj.data, (self, otherObj), '+' )\n", + " def _backward():\n", + " self.grad += 1.0 * out.grad\n", + " otherObj.grad += 1.0 * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " # Right-Hand Arithmetic Operation\n", + " def __radd__(self, otherObj):\n", + " return self+otherObj\n", + " \n", + " def __mul__(self, otherObj):\n", + " otherObj = otherObj if isinstance(otherObj, Value) else Value(otherObj)\n", + " out = Value(self.data * otherObj.data, (self, otherObj), '*')\n", + " def _backward():\n", + " self.grad += otherObj.data * out.grad\n", + " otherObj.grad += self.data * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " # Right-Hand Arithmetic Operation\n", + " def __rmul__(self, otherObj):\n", + " return self*otherObj\n", + " \n", + " def tanh(self):\n", + " x = self.data\n", + " t = (math.exp(2*x) - 1) / (math.exp(2*x) + 1)\n", + " out = Value(t, (self, ),'tanh')\n", + " def _backward():\n", + " self.grad += (1 - t**2) * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " def backward(self):\n", + " topo = []\n", + " visited = set()\n", + " def build_topo(v):\n", + " if v not in visited:\n", + " visited.add(v)\n", + " for child in v._prev:\n", + " build_topo(child)\n", + " topo.append(v)\n", + " build_topo(self)\n", + " self.grad = 1.0 \n", + " for node in reversed(topo):\n", + " node._backward()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "8c17369a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=4587)\n", + "Value(data=4587)\n" + ] + } + ], + "source": [ + "a = Value(5)\n", + "print(a + 4582)\n", + "print(4582 + a)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "aba93059", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=50)\n", + "Value(data=50)\n" + ] + } + ], + "source": [ + "a = Value(5)\n", + "print(a * 10)\n", + "print(10 * a)" + ] + }, + { + "cell_type": "markdown", + "id": "aa2a712a", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "id": "73433d14", + "metadata": {}, + "source": [ + "### Understanding the Hyperbolic Tangent (tanh) Function\n", + "\n", + "The hyperbolic tangent function, often denoted as \\\\( \\text{tanh}(x) \\\\), is a fundamental component in machine learning, particularly in neural networks. It serves as an activation function, transforming input values into a bounded output range.\n", + "\n", + "#### Function Definition:\n", + "The tanh function is defined mathematically as:\n", + "\n", + "\\\\[ \\text{tanh}(x) = \\frac{e^x - e^{-x}}{e^x + e^{-x}} = \\frac{e^{2x} - 1}{e^{2x} + 1}\\\\]\n" + ] + }, + { + "cell_type": "markdown", + "id": "fce559e8", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "id": "d86a25d4", + "metadata": {}, + "source": [ + "### Updating Value: adding exponentiation using Euler's number e" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "39e0dd0e", + "metadata": {}, + "outputs": [], + "source": [ + "class Value:\n", + " \n", + " def __init__( self, data, _children=(), _operation='', label='' ):\n", + " self.data = data\n", + " self.grad = 0.0\n", + " self._prev = set(_children)\n", + " self._op = _operation\n", + " self._backward = lambda: None \n", + " self.label = label\n", + " \n", + " def __repr__(self):\n", + " return f\"Value(data={self.data})\"\n", + " \n", + " def __add__(self, otherObj):\n", + " otherObj = otherObj if isinstance(otherObj, Value) else Value(otherObj)\n", + " out = Value(self.data + otherObj.data, (self, otherObj), '+' )\n", + " def _backward():\n", + " self.grad += 1.0 * out.grad\n", + " otherObj.grad += 1.0 * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " def __radd__(self, otherObj):\n", + " return self+otherObj\n", + " \n", + " def __mul__(self, otherObj):\n", + " otherObj = otherObj if isinstance(otherObj, Value) else Value(otherObj)\n", + " out = Value(self.data * otherObj.data, (self, otherObj), '*')\n", + " def _backward():\n", + " self.grad += otherObj.data * out.grad\n", + " otherObj.grad += self.data * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " def __rmul__(self, otherObj):\n", + " return self*otherObj\n", + "\n", + " def tanh(self):\n", + " x = self.data\n", + " t = (math.exp(2*x) - 1) / (math.exp(2*x) + 1)\n", + " out = Value(t, (self, ),'tanh')\n", + " def _backward():\n", + " self.grad += (1 - t**2) * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " def exp(self):\n", + " x = self.data\n", + " out = Value(math.exp(x), (self, ), 'exp')\n", + " def _backward():\n", + " self.grad += out.data * out.grad\n", + " return out\n", + " \n", + " def backward(self):\n", + " topo = []\n", + " visited = set()\n", + " def build_topo(v):\n", + " if v not in visited:\n", + " visited.add(v)\n", + " for child in v._prev:\n", + " build_topo(child)\n", + " topo.append(v)\n", + " build_topo(self)\n", + " self.grad = 1.0 \n", + " for node in reversed(topo):\n", + " node._backward()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "f6f0cb5e", + "metadata": {}, + "outputs": [], + "source": [ + "a= Value(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "4ff14a36", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Value(data=7.38905609893065)" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a.exp()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "8758d89e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "7.3890461584" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "2.71828**2" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "1f224e7e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=2) Value(data=5)\n" + ] + } + ], + "source": [ + "b = Value(5)\n", + "print(a, b)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "66de5795", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(Value(data=2), Value(data=5))" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a, b" + ] + }, + { + "cell_type": "markdown", + "id": "b1fb09df", + "metadata": {}, + "source": [ + "---\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "708f3a37", + "metadata": {}, + "source": [ + "### division of Values" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "f87e6598", + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# a / b\n", + "\n", + "# TypeError: unsupported operand type(s) for /: 'Value' and 'Value'" + ] + }, + { + "cell_type": "markdown", + "id": "fd73e6ee", + "metadata": {}, + "source": [ + "### all operations are same\n", + "- a / b\n", + "- a * (1/b)\n", + "- a * (b**-1) \n", + "#### we need power operation `**` and subtraction operation `-` as well \n", + "- `a - b` is same as `a + (-b)`" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "ab28e34d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.5\n", + "2.5\n", + "2.5\n" + ] + } + ], + "source": [ + "x = 10\n", + "y = 4\n", + "\n", + "print(x/y)\n", + "print(x* (1/y))\n", + "print(x * (y)**-1)" + ] + }, + { + "cell_type": "markdown", + "id": "d3e119c9", + "metadata": {}, + "source": [ + " " + ] + }, + { + "cell_type": "markdown", + "id": "fb878386", + "metadata": {}, + "source": [ + "### Understanding the `assert` Statement in Python\n", + "\n", + "The `assert` statement is a powerful tool in Python used to debug code and ensure that certain conditions are met during program execution. It allows you to quickly verify assumptions about your code and catch potential errors early in the development process.\n", + "\n", + "#### Syntax:\n", + "\n", + "The syntax of the `assert` statement is simple:\n", + "\n", + "```python\n", + "assert condition, message\n", + "x = 10\n", + "assert x > 0, \"Value of x must be positive\"\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "96dae19d", + "metadata": {}, + "outputs": [], + "source": [ + "class Value:\n", + " \n", + " def __init__( self, data, _children=(), _operation='', label='' ):\n", + " self.data = data\n", + " self.grad = 0.0\n", + " self._prev = set(_children)\n", + " self._op = _operation\n", + " self._backward = lambda: None \n", + " self.label = label\n", + " \n", + " def __repr__(self):\n", + " return f\"Value(data={self.data})\"\n", + " \n", + " def __add__(self, otherObj):\n", + " otherObj = otherObj if isinstance(otherObj, Value) else Value(otherObj)\n", + " out = Value(self.data + otherObj.data, (self, otherObj), '+' )\n", + " def _backward():\n", + " self.grad += 1.0 * out.grad\n", + " otherObj.grad += 1.0 * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " def __radd__(self, otherObj):\n", + " return self+otherObj\n", + " \n", + " # -self\n", + " def __neg__(self): \n", + " # here we are using multiplication method for subtraction\n", + " return self * (-1)\n", + " \n", + " # self - otherObj\n", + " def __sub__(self, otherObj):\n", + " # here we are using addition and negation method for subtraction\n", + " return self + (-otherObj)\n", + " \n", + " def __mul__(self, otherObj):\n", + " otherObj = otherObj if isinstance(otherObj, Value) else Value(otherObj)\n", + " out = Value(self.data * otherObj.data, (self, otherObj), '*')\n", + " def _backward():\n", + " self.grad += otherObj.data * out.grad\n", + " otherObj.grad += self.data * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " # otherObj * self\n", + " def __rmul__(self, otherObj): \n", + " return self*otherObj\n", + " \n", + " # self/otherObj\n", + " def __truediv__(self, otherObj): \n", + " return self * (otherObj**(-1))\n", + " \n", + " # self**otherObj\n", + " def __pow__(self, otherObj): \n", + " assert isinstance(otherObj, (int, float)), \"only supporting int/float powers for now\"\n", + " out = Value(self.data ** otherObj, (self, ), f\"**{otherObj}\")\n", + " def _backward():\n", + " self.grad += (otherObj * self.data**(otherObj-1)) * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " def tanh(self):\n", + " x = self.data\n", + " t = (math.exp(2*x) - 1) / (math.exp(2*x) + 1)\n", + " out = Value(t, (self, ),'tanh')\n", + " def _backward():\n", + " self.grad += (1 - t**2) * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " def exp(self):\n", + " x = self.data\n", + " out = Value(math.exp(x), (self, ), 'exp')\n", + " def _backward():\n", + " self.grad += out.data * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " def backward(self):\n", + " topo = []\n", + " visited = set()\n", + " def build_topo(v):\n", + " if v not in visited:\n", + " visited.add(v)\n", + " for child in v._prev:\n", + " build_topo(child)\n", + " topo.append(v)\n", + " build_topo(self)\n", + " self.grad = 1.0 \n", + " for node in reversed(topo):\n", + " node._backward()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "ebb0d6ca", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=0.5)\n" + ] + } + ], + "source": [ + "a = Value(2.0)\n", + "b = Value(4.0)\n", + "print(a/b)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "fb2dff5f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=0.5)\n" + ] + } + ], + "source": [ + "print(a*(b**-1))" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "c8f472f9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=2.0)\n", + "Value(data=-2.0)\n" + ] + } + ], + "source": [ + "print(a)\n", + "print(-a)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "af71019a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Value(data=-2.0)\n" + ] + } + ], + "source": [ + "print(a-b)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a3be6272", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "c5649eca", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161341978160\n", + "\n", + "x1\n", + "\n", + "data 2.0000\n", + "\n", + "grad -1.5000\n", + "\n", + "\n", + "\n", + "2161341986032*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2161341978160->2161341986032*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161341986368\n", + "\n", + "w2\n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2161342418416*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2161341986368->2161342418416*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161341985360\n", + "\n", + "w1\n", + "\n", + "data -3.0000\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2161341985360->2161341986032*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342422112\n", + "\n", + "x1*w1 + x2*w2\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2161342428496+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2161342422112->2161342428496+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342422112+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2161342422112+->2161342422112\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161341978208\n", + "\n", + "b\n", + "\n", + "data 6.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2161341978208->2161342428496+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342419568\n", + "\n", + "o\n", + "\n", + "data 0.7071\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2161342419568tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2161342419568tanh->2161342419568\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161341986032\n", + "\n", + "x1*w1\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2161341986032->2161342422112+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161341986032*->2161341986032\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342428496\n", + "\n", + "n\n", + "\n", + "data 0.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2161342428496->2161342419568tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342428496+->2161342428496\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161341980032\n", + "\n", + "x2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2161341980032->2161342418416*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342418416\n", + "\n", + "x2*w2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2161342418416->2161342422112+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342418416*->2161342418416\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Inputs\n", + "x1 = Value(2.0, label=\"x1\")\n", + "x2 = Value(0.0, label=\"x2\")\n", + "# Weights\n", + "w1 = Value(-3.0, label='w1')\n", + "w2 = Value(1.0, label='w2')\n", + "# bias of the neuron\n", + "b = Value(6.8813735870195432, label='b')\n", + "# x1w1 + x2w2 + b\n", + "x1w1 = x1*w1; x1w1.label='x1*w1'\n", + "x2w2 = x2*w2; x2w2.label='x2*w2'\n", + "x1w1x2w2 = x1w1 + x2w2; x1w1x2w2.label='x1*w1 + x2*w2'\n", + "n = x1w1x2w2 + b; n.label='n'\n", + "\n", + "o = n.tanh(); o.label='o'\n", + "o.backward()\n", + "draw_dot(o)" + ] + }, + { + "cell_type": "markdown", + "id": "c7120dfe", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "id": "4500c911", + "metadata": {}, + "source": [ + "The tanh function is defined mathematically as:\n", + "\n", + "\\\\[ \\text{tanh}(x) = \\frac{e^x - e^{-x}}{e^x + e^{-x}} = \\frac{e^{2x} - 1}{e^{2x} + 1}\\\\]" + ] + }, + { + "cell_type": "markdown", + "id": "4a474f57", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "ec2e5481", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342422016\n", + "\n", + "w1\n", + "\n", + "data -3.0000\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2161342418656*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2161342422016->2161342418656*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342419520\n", + "\n", + "b\n", + "\n", + "data 6.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2161342418272+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2161342419520->2161342418272+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342426192\n", + "\n", + "w2\n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2161342426480*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2161342426192->2161342426480*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342419040\n", + "\n", + " \n", + "\n", + "data 0.1464\n", + "\n", + "grad 4.8284\n", + "\n", + "\n", + "\n", + "2161342421632*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2161342419040->2161342421632*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342419040**-1\n", + "\n", + "**-1\n", + "\n", + "\n", + "\n", + "2161342419040**-1->2161342419040\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342427248\n", + "\n", + " \n", + "\n", + "data 5.8284\n", + "\n", + "grad 0.0429\n", + "\n", + "\n", + "\n", + "2161342418512+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2161342427248->2161342418512+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342426960+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2161342427248->2161342426960+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342427248exp\n", + "\n", + "exp\n", + "\n", + "\n", + "\n", + "2161342427248exp->2161342427248\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342421632\n", + "\n", + "o\n", + "\n", + "data 0.7071\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2161342421632*->2161342421632\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342418512\n", + "\n", + " \n", + "\n", + "data 6.8284\n", + "\n", + "grad -0.1036\n", + "\n", + "\n", + "\n", + "2161342418512->2161342419040**-1\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342418512+->2161342418512\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342425760\n", + "\n", + "x1\n", + "\n", + "data 2.0000\n", + "\n", + "grad -1.5000\n", + "\n", + "\n", + "\n", + "2161342425760->2161342418656*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342418656\n", + "\n", + "x1*w1\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2161342415104+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2161342418656->2161342415104+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342418656*->2161342418656\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342427392\n", + "\n", + " \n", + "\n", + "data 1.7627\n", + "\n", + "grad 0.2500\n", + "\n", + "\n", + "\n", + "2161342427392->2161342427248exp\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342427392*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2161342427392*->2161342427392\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342415104\n", + "\n", + "x1*w1 + x2*w2\n", + "\n", + "data -6.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2161342415104->2161342418272+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342415104+->2161342415104\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342423360\n", + "\n", + " \n", + "\n", + "data -1.0000\n", + "\n", + "grad 0.1464\n", + "\n", + "\n", + "\n", + "2161342423360->2161342426960+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342426960\n", + "\n", + " \n", + "\n", + "data 4.8284\n", + "\n", + "grad 0.1464\n", + "\n", + "\n", + "\n", + "2161342426960->2161342421632*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342426960+->2161342426960\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342418272\n", + "\n", + "n\n", + "\n", + "data 0.8814\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2161342418272->2161342427392*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342418272+->2161342418272\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342426480\n", + "\n", + "x2*w2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2161342426480->2161342415104+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342426480*->2161342426480\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342421920\n", + "\n", + " \n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.2203\n", + "\n", + "\n", + "\n", + "2161342421920->2161342427392*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342419904\n", + "\n", + "x2\n", + "\n", + "data 0.0000\n", + "\n", + "grad 0.5000\n", + "\n", + "\n", + "\n", + "2161342419904->2161342426480*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2161342421968\n", + "\n", + " \n", + "\n", + "data 1.0000\n", + "\n", + "grad -0.1036\n", + "\n", + "\n", + "\n", + "2161342421968->2161342418512+\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Inputs\n", + "x1 = Value(2.0, label=\"x1\")\n", + "x2 = Value(0.0, label=\"x2\")\n", + "# Weights\n", + "w1 = Value(-3.0, label='w1')\n", + "w2 = Value(1.0, label='w2')\n", + "# bias of the neuron\n", + "b = Value(6.8813735870195432, label='b')\n", + "# x1w1 + x2w2 + b\n", + "x1w1 = x1*w1; x1w1.label='x1*w1'\n", + "x2w2 = x2*w2; x2w2.label='x2*w2'\n", + "x1w1x2w2 = x1w1 + x2w2; x1w1x2w2.label='x1*w1 + x2*w2'\n", + "n = x1w1x2w2 + b; n.label='n'\n", + "\n", + "# ----------------------\n", + "e = (2*n).exp()\n", + "o = (e - 1) / (e + 1)\n", + "# ----------------------\n", + "\n", + "o.label='o'\n", + "o.backward()\n", + "draw_dot(o)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "97178b6a", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "e75c376d", + "metadata": {}, + "source": [ + "### Doing the same thing but in PyTorch" + ] + }, + { + "cell_type": "markdown", + "id": "ca16b514", + "metadata": {}, + "source": [ + "# PyTorch: Deep Learning Framework\n", + "\n", + "PyTorch is an open-source machine learning library primarily developed by Facebook's AI Research lab (FAIR). It provides a flexible and dynamic deep learning framework for building and training neural networks.\n", + "\n", + "## Key Features:\n", + "\n", + "1. **Tensor Computation**: PyTorch provides multi-dimensional arrays called tensors, similar to NumPy arrays but with additional GPU acceleration support for faster computation. Tensors in PyTorch can be easily manipulated and used for numerical computations.\n", + "\n", + "2. **Automatic Differentiation**: PyTorch offers automatic differentiation through its `autograd` package, allowing gradients to be computed automatically for tensor operations. This feature simplifies the process of implementing and training neural networks by automatically calculating gradients for backpropagation.\n", + "\n", + "3. **Dynamic Computational Graphs**: Unlike some other deep learning frameworks that use static computational graphs, PyTorch uses dynamic computational graphs. This means that the computational graph is built on-the-fly during execution, allowing for more flexibility and easier debugging.\n", + "\n", + "4. **Neural Network Building Blocks**: PyTorch provides a rich set of tools and modules for building neural networks, including layers, activation functions, optimization algorithms, loss functions, and more. It also offers a high-level neural network module called `torch.nn` for building complex architectures with ease.\n", + "\n", + "5. **GPU Acceleration**: PyTorch supports seamless integration with GPUs, enabling accelerated training of deep neural networks on compatible hardware. This GPU acceleration significantly speeds up the training process for large-scale models.\n", + "\n", + "6. **Community and Ecosystem**: PyTorch has a vibrant community of developers and researchers contributing to its development. It also offers extensive documentation, tutorials, and resources, making it accessible to both beginners and experienced practitioners.\n", + "\n", + "PyTorch has gained popularity among researchers and practitioners in the machine learning and deep learning communities due to its flexibility, ease of use, and powerful capabilities for building and training neural networks.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "82eb4172", + "metadata": {}, + "outputs": [], + "source": [ + "import torch" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "d630912d", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([1.3000])" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "element1 = torch.Tensor([1.3])\n", + "element1" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "43e9b03a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([1.3000])" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "element1.data" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "92b71046", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.2999999523162842" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "element1.data.item()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1b2ec2c9", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "100b071a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[1, 2],\n", + " [3, 4]])" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = [[1, 2],[3, 4]]\n", + "x_data = torch.tensor(data)\n", + "x_data" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "5e7ddcaf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "torch.int64" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x_data.dtype" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "52837bbe", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[2, 4],\n", + " [6, 8]])" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x_data + x_data" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "ee2a7835", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[ 1, 4],\n", + " [ 9, 16]])" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x_data * x_data " + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "b3c1fe3b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[0, 0],\n", + " [0, 0]])" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x_data - x_data " + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "dbc3bb34", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[1, 2],\n", + " [3, 4]])" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x_data.data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e11a893d", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "401c9643", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[[ 1., 2., 3., 4.],\n", + " [ 9., 7., 8., 6.]],\n", + "\n", + " [[11., 21., 31., 12.],\n", + " [86., 78., 98., 75.]]])" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_data = torch.Tensor([[[1,2,3,4],[9,7,8,6]],[[11,21,31,12], [86,78,98,75]]])\n", + "y_data" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "1ed5ca59", + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]],\n", + "\n", + " [[0., 0., 0., 0.],\n", + " [0., 0., 0., 0.]]])" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_data - y_data" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "905f2f54", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[[ 2., 4., 6., 8.],\n", + " [ 18., 14., 16., 12.]],\n", + "\n", + " [[ 22., 42., 62., 24.],\n", + " [172., 156., 196., 150.]]])" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_data + y_data" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "e9713cec", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "tensor([[[1.0000e+00, 4.0000e+00, 9.0000e+00, 1.6000e+01],\n", + " [8.1000e+01, 4.9000e+01, 6.4000e+01, 3.6000e+01]],\n", + "\n", + " [[1.2100e+02, 4.4100e+02, 9.6100e+02, 1.4400e+02],\n", + " [7.3960e+03, 6.0840e+03, 9.6040e+03, 5.6250e+03]]])" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_data * y_data" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "35328f2c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "torch.float32" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_data.dtype" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "9e461d91", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "torch.float64" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_data.double().dtype" + ] + }, + { + "cell_type": "markdown", + "id": "fd9a8aac", + "metadata": {}, + "source": [ + "---\n", + "---\n", + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "dd9bdec1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.7071066904050358\n", + "---------------\n", + "x2 0.5000001283844369\n", + "w2 0.0\n", + "x1 -1.5000003851533106\n", + "w1 1.0000002567688737\n" + ] + } + ], + "source": [ + "x1 = torch.Tensor([2.0]).double() ; x1.requires_grad = True\n", + "x2 = torch.Tensor([0.0]).double() ; x2.requires_grad = True\n", + "w1 = torch.Tensor([-3.0]).double() ; w1.requires_grad = True\n", + "w2 = torch.Tensor([1.0]).double() ; w2.requires_grad = True\n", + "b = torch.Tensor([6.8813735870195432]).double() ; b.requires_grad = True\n", + "\n", + "n = x1*w1 + x2*w2 + b\n", + "o = torch.tanh(n)\n", + "\n", + "print(o.data.item())\n", + "o.backward()\n", + "\n", + "\n", + "print(\"---\"*5)\n", + "print(\"x2\", x2.grad.item())\n", + "print(\"w2\", w2.grad.item())\n", + "print(\"x1\", x1.grad.item())\n", + "print(\"w1\", w1.grad.item())" + ] + }, + { + "cell_type": "markdown", + "id": "392104df", + "metadata": {}, + "source": [ + "Therefore it is proved that our previous gradients were correct" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "deac8c2d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor([0.7071], dtype=torch.float64, grad_fn=)\n", + "0.7071066904050358\n" + ] + } + ], + "source": [ + "print(o)\n", + "print(o.data.item())" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "2df776ce", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tensor([-1.5000], dtype=torch.float64)\n", + "-1.5000003851533106\n" + ] + } + ], + "source": [ + "print(x1.grad)\n", + "print(x1.grad.item())" + ] + }, + { + "cell_type": "markdown", + "id": "63bdf300", + "metadata": {}, + "source": [ + "---\n", + "#\n", + "#\n", + "---\n", + "#\n", + "#\n", + "---" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lectures/micrograd/Making of Micrograd/3 Multi-Layer Perceptron.ipynb b/lectures/micrograd/Making of Micrograd/3 Multi-Layer Perceptron.ipynb new file mode 100644 index 00000000..e7566dd2 --- /dev/null +++ b/lectures/micrograd/Making of Micrograd/3 Multi-Layer Perceptron.ipynb @@ -0,0 +1,16389 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "fd16312b", + "metadata": {}, + "source": [ + "## Multi-Layer Perceptron (MLP)" + ] + }, + { + "cell_type": "markdown", + "id": "4cb537f0", + "metadata": {}, + "source": [ + "![Multi-Layer Perceptron (MLP)](https://media.geeksforgeeks.org/wp-content/uploads/nodeNeural.jpg)" + ] + }, + { + "cell_type": "markdown", + "id": "392dc643", + "metadata": {}, + "source": [ + "---\n", + "---\n", + "![neuron_model](https://www.cs.toronto.edu/~lczhang/360/lec/w02/imgs/neuron_model.jpeg)\n", + "\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "01043eb8", + "metadata": {}, + "source": [ + "The Multilayer Perceptron (MLP) is a type of feedforward artificial neural network that consists of multiple layers of nodes, also known as neurons. Here's a breakdown:\n", + "\n", + "- **Architecture**: An MLP typically consists of an input layer, one or more hidden layers, and an output layer. Each layer is composed of multiple neurons, and each neuron in one layer is connected to every neuron in the adjacent layers.\n", + "\n", + "- **Activation Function**: Neurons in each layer (except the input layer) apply an activation function to their input to introduce non-linearity into the network. Common activation functions include sigmoid, tanh, ReLU, and softmax.\n", + "\n", + "- **Feedforward Operation**: During the feedforward operation, the input data is passed through the network layer by layer. The output of each layer serves as the input to the next layer, and this process continues until the output layer is reached, producing the final prediction.\n", + "\n", + "- **Training**: MLPs are trained using supervised learning techniques such as backpropagation and gradient descent. During training, the network adjusts its weights and biases iteratively to minimize a loss function, typically based on the discrepancy between predicted and actual outputs.\n", + "\n", + "- **Applications**: MLPs are used in various applications, including classification, regression, pattern recognition, and function approximation. They have been successfully applied in areas such as image recognition, natural language processing, and financial forecasting.\n", + "\n", + "MLPs are versatile and powerful models capable of learning complex patterns in data, making them one of the fundamental building blocks of deep learning.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "4df33fb7", + "metadata": {}, + "outputs": [], + "source": [ + "# Important lib\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import math\n", + "import random\n", + "import torch" + ] + }, + { + "cell_type": "markdown", + "id": "654536be", + "metadata": {}, + "source": [ + "#### Explanation of `random.uniform(-1,1)`\n", + "\n", + "The `random.uniform()` function in Python's `random` module generates random floating-point numbers within a specified range. Here's a breakdown:\n", + "\n", + "- **Function**: `random.uniform()`\n", + "- **Parameters**: The function takes two parameters: `a` and `b`, representing the lower and upper bounds of the range from which random numbers will be generated.\n", + "- **Range**: The function generates random floating-point numbers uniformly distributed between `a` and `b`, inclusive of `a` but exclusive of `b`.\n", + "- **Example**: `random.uniform(-1,1)` generates random numbers between -1 (inclusive) and 1 (exclusive), meaning the numbers can be any value within the interval [-1, 1), including -1 but not including 1.\n", + "\n", + "This function is commonly used in various applications, including generating initial weights for neural networks and implementing various statistical simulations.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "f17bca87", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.543045045937409" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "random.uniform(-1,1)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "08d9e56f", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[-0.1360362333236096,\n", + " 0.8845403902641489,\n", + " 0.06797862977821811,\n", + " -0.289456137994337,\n", + " -0.014659348613420109]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[random.uniform(-1,1) for _ in range(5)]" + ] + }, + { + "cell_type": "markdown", + "id": "65a3ef13", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "id": "2329bcb2", + "metadata": {}, + "source": [ + "### `__call__` Method\n", + "\n", + "The `__call__` method in Python is a special method that allows instances of a class to be called as if they were functions. Here's a breakdown:\n", + "\n", + "- **Usage**: The `__call__` method is invoked when an instance of a class is used with function-call syntax, i.e., `instance()`.\n", + " \n", + "- **Functionality**: The purpose of the `__call__` method is to define what happens when an instance of the class is called. It allows the object to behave like a function, executing custom logic defined within the method.\n", + "\n", + "- **Flexibility**: By implementing the `__call__` method in a class, you can customize the behavior of instances and make them callable, enabling them to perform specific actions when invoked.\n", + "\n", + "- **Example**: Suppose you have a class named `MyFunction` with a `__call__` method defined. When you create an instance of `MyFunction` and call it with parentheses, the `__call__` method will be executed, allowing you to define custom behavior for the instance.\n", + "\n", + "- **Applications**: The `__call__` method is commonly used in various scenarios, such as creating callable objects, implementing function-like behavior for classes, and defining function decorators.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "95cf2690", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n" + ] + } + ], + "source": [ + "# eg\n", + "class Multiplier:\n", + " def __init__(self, factor):\n", + " self.factor = factor\n", + "\n", + " def __call__(self, x):\n", + " return x * self.factor\n", + "\n", + "# Create an instance of Multiplier with a factor of 2\n", + "double = Multiplier(2)\n", + "\n", + "# Call the instance as if it were a function\n", + "result = double(5) # This will multiply 5 by 2\n", + "print(result) # Output: 10\n" + ] + }, + { + "cell_type": "markdown", + "id": "1a6fd5a8", + "metadata": {}, + "source": [ + "### Explanation of `zip()` Function\n", + "\n", + "The `zip()` function in Python is used to combine multiple iterable objects (such as lists, tuples, or strings) element-wise into tuples. Here's a breakdown:\n", + "\n", + "- **Usage**: The `zip()` function takes in one or more iterable objects and returns an iterator that generates tuples containing elements from each iterable.\n", + "\n", + "- **Functionality**: When `zip()` is called, it iterates through the provided iterables in parallel, creating tuples where the i-th element of each iterable is paired together. If the iterables are of different lengths, `zip()` stops when the shortest iterable is exhausted.\n", + "\n", + "- **Flexibility**: The `zip()` function is versatile and can be used to combine elements from different data structures, making it useful for tasks such as iterating over multiple lists simultaneously or pairing keys and values from dictionaries.\n", + "\n", + "- **Example**: Suppose we have two lists, `names` and `ages`, containing names and corresponding ages. We can use `zip()` to pair each name with its corresponding age, creating a list of tuples.\n", + "\n", + " ```python\n", + " # Example usage of zip()\n", + " names = ['Alice', 'Bob', 'Charlie']\n", + " ages = [30, 25, 35]\n", + "\n", + " # Pair each name with its corresponding age using zip()\n", + " name_age_pairs = list(zip(names, ages))\n", + " print(name_age_pairs)\n", + " # Output: [('Alice', 30), ('Bob', 25), ('Charlie', 35)]\n", + " ```\n", + "\n", + "In this example:\n", + "- We have two lists, `names` and `ages`, representing names and ages, respectively.\n", + "- We use `zip(names, ages)` to pair each name with its corresponding age.\n", + "- The resulting list of tuples, `name_age_pairs`, contains tuples where each tuple contains a name and its corresponding age.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "613dccc3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('Alice', 30), ('Bob', 25), ('Charlie', 35)]\n" + ] + } + ], + "source": [ + "names = ['Alice', 'Bob', 'Charlie']\n", + "ages = [30, 25, 35]\n", + "\n", + "# Pair each name with its corresponding age using zip()\n", + "name_age_pairs = list(zip(names, ages))\n", + "print(name_age_pairs)" + ] + }, + { + "cell_type": "markdown", + "id": "820ad328", + "metadata": {}, + "source": [ + "---\n", + "---\n", + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "d5dd1d03", + "metadata": {}, + "outputs": [], + "source": [ + "class Value:\n", + " \n", + " def __init__( self, data, _children=(), _operation='', label='' ):\n", + " self.data = data\n", + " self.grad = 0.0\n", + " self._prev = set(_children)\n", + " self._op = _operation\n", + " self._backward = lambda: None \n", + " self.label = label\n", + " \n", + " def __repr__(self):\n", + " return f\"Value(data={self.data})\"\n", + " \n", + " def __add__(self, otherObj):\n", + " otherObj = otherObj if isinstance(otherObj, Value) else Value(otherObj)\n", + " out = Value(self.data + otherObj.data, (self, otherObj), '+' )\n", + " def _backward():\n", + " self.grad += 1.0 * out.grad\n", + " otherObj.grad += 1.0 * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " def __radd__(self, otherObj):\n", + " return self+otherObj\n", + " \n", + " # -self\n", + " def __neg__(self): \n", + " # here we are using multiplication method for subtraction\n", + " return self * (-1)\n", + " \n", + " # self - otherObj\n", + " def __sub__(self, otherObj):\n", + " # here we are using addition and negation method for subtraction\n", + " return self + (-otherObj)\n", + " \n", + " def __mul__(self, otherObj):\n", + " otherObj = otherObj if isinstance(otherObj, Value) else Value(otherObj)\n", + " out = Value(self.data * otherObj.data, (self, otherObj), '*')\n", + " def _backward():\n", + " self.grad += otherObj.data * out.grad\n", + " otherObj.grad += self.data * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " # otherObj * self\n", + " def __rmul__(self, otherObj): \n", + " return self*otherObj\n", + " \n", + " # self/otherObj\n", + " def __truediv__(self, otherObj): \n", + " return self * (otherObj**(-1))\n", + " \n", + " # self**otherObj\n", + " def __pow__(self, otherObj): \n", + " assert isinstance(otherObj, (int, float)), \"only supporting int/float powers for now\"\n", + " out = Value(self.data ** otherObj, (self, ), f\"**{otherObj}\")\n", + " def _backward():\n", + " self.grad += (otherObj * self.data**(otherObj-1)) * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " def tanh(self):\n", + " x = self.data\n", + " t = (math.exp(2*x) - 1) / (math.exp(2*x) + 1)\n", + " out = Value(t, (self, ),'tanh')\n", + " def _backward():\n", + " self.grad += (1 - t**2) * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " def exp(self):\n", + " x = self.data\n", + " out = Value(math.exp(x), (self, ), 'exp')\n", + " def _backward():\n", + " self.grad += out.data * out.grad\n", + " out._backward = _backward \n", + " return out\n", + " \n", + " def backward(self):\n", + " topo = []\n", + " visited = set()\n", + " def build_topo(v):\n", + " if v not in visited:\n", + " visited.add(v)\n", + " for child in v._prev:\n", + " build_topo(child)\n", + " topo.append(v)\n", + " build_topo(self)\n", + " self.grad = 1.0 \n", + " for node in reversed(topo):\n", + " node._backward()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "c0c6116a", + "metadata": {}, + "outputs": [], + "source": [ + "from graphviz import Digraph\n", + "\n", + "def trace(root):\n", + " # builds a set of all nodes and edges in graph\n", + " nodes, edges = set(), set()\n", + " def build(v):\n", + " if v not in nodes:\n", + " nodes.add(v)\n", + " for child in v._prev:\n", + " edges.add((child, v))\n", + " build(child)\n", + " build(root)\n", + " return nodes, edges\n", + "\n", + "def draw_dot(root):\n", + " dot = Digraph(format='svg', graph_attr={'rankdir': 'LR'}) # LR = left to right, TB = Top to Bottom\n", + "\n", + " nodes, edges = trace(root)\n", + " for n in nodes:\n", + " uid = str(id(n))\n", + " # for any value in the graph, create a rectangular ('record') node for it\n", + " dot.node(name = uid, label = \"{ %s | data %.4f | grad %.4f }\" % (n.label, n.data, n.grad ), shape='record')\n", + " if n._op:\n", + " # if this value is result of some operation , create an op node for it\n", + " dot.node(name = uid + n._op, label = n._op)\n", + " # and connect this node to it\n", + " dot.edge(uid + n._op, uid)\n", + " \n", + " for n1, n2 in edges:\n", + " # connect n1 node to op node of n2\n", + " dot.edge(str(id(n1)), str(id(n2)) + n2._op)\n", + " \n", + " return dot" + ] + }, + { + "cell_type": "markdown", + "id": "a75b757e", + "metadata": {}, + "source": [ + "## Neuron" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "2a7e06d6", + "metadata": {}, + "outputs": [], + "source": [ + "class Neuron:\n", + " \n", + " # nin - no. of inputs\n", + " def __init__(self, nin):\n", + " self.w = [Value(random.uniform(-1,1)) for _ in range(nin)] \n", + " self.b = Value(np.random.uniform(-1,1))\n", + " \n", + " def __call__(self, x):\n", + " # (w * x) + b\n", + " print(list(zip(self.w, x)))\n", + " return 0.0" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "334b6c97", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(Value(data=0.502514166664368), 2.0), (Value(data=0.43965088240158146), 3.0)]\n" + ] + }, + { + "data": { + "text/plain": [ + "0.0" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# inputs - 2\n", + "x = [2.0,3.0]\n", + "# Neuron object with 2 inputs\n", + "n = Neuron(2)\n", + "# call like a function by passing inputs\n", + "n(x)" + ] + }, + { + "cell_type": "markdown", + "id": "7eb5134f", + "metadata": {}, + "source": [ + "---\n", + "\n", + "![neuron_model](https://www.cs.toronto.edu/~lczhang/360/lec/w02/imgs/neuron_model.jpeg)\n", + "\n", + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "a6386327", + "metadata": {}, + "outputs": [], + "source": [ + "class Neuron:\n", + " \n", + " # nin - no. of inputs\n", + " def __init__(self, nin):\n", + " self.w = [Value(random.uniform(-1,1)) for _ in range(nin)] \n", + " self.b = Value(np.random.uniform(-1,1))\n", + " \n", + " def __call__(self, x):\n", + " # (w * x) + b\n", + " # activation \n", + " act = sum((wi*xi for wi,xi in zip(self.w, x)), start=self.b) \n", + " out = act.tanh()\n", + " return out" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "38814823", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Value(data=-0.16485927195115005)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x = [2.0,3.0]\n", + "n = Neuron(2)\n", + "n(x)" + ] + }, + { + "cell_type": "markdown", + "id": "24460f54", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "id": "d94bcda5", + "metadata": {}, + "source": [ + "![Multi-Layer Perceptron (MLP)](https://media.geeksforgeeks.org/wp-content/uploads/nodeNeural.jpg)\n" + ] + }, + { + "cell_type": "markdown", + "id": "dea0f7e1", + "metadata": {}, + "source": [ + "### Layers of Neuron\n", + "\n", + "The term \"Layers of Neuron\" typically refers to the structured arrangement of neurons within a neural network. Neural networks are composed of layers, each of which contains one or more neurons. Here's a brief explanation:\n", + "\n", + "1. **Input Layer**: The first layer of the neural network is called the input layer. It consists of neurons that receive input data and pass it to the next layer. Each neuron in the input layer corresponds to an input feature.\n", + "\n", + "2. **Hidden Layers**: Between the input and output layers, there can be one or more hidden layers. These layers perform computations on the input data through weighted connections and activation functions. Hidden layers help neural networks learn complex patterns and relationships in the data.\n", + "\n", + "3. **Output Layer**: The last layer of the neural network is called the output layer. It produces the final output of the network based on the computations performed in the hidden layers. The number of neurons in the output layer depends on the type of task the network is designed for (e.g., classification, regression).\n", + "\n", + "Neurons in each layer are interconnected through weighted connections, and each neuron applies an activation function to its weighted sum of inputs to produce an output. The arrangement and size of layers in a neural network architecture play a crucial role in determining the network's capacity to learn and generalize from data.\n" + ] + }, + { + "cell_type": "markdown", + "id": "25ef2a43", + "metadata": {}, + "source": [ + "Now let's define Layers of Neuron" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "2ee17118", + "metadata": {}, + "outputs": [], + "source": [ + "class Layer:\n", + " \n", + " # nin - no. of inputs\n", + " # nout - no. of Neurons in a single Layer\n", + " def __init__(self, nin, nout):\n", + " # list of Neurons\n", + " self.neurons = [Neuron(nin) for _ in range(nout)]\n", + " print(self.neurons)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "cbffdcb1", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[<__main__.Neuron object at 0x000002729718FD30>, <__main__.Neuron object at 0x000002729718D6F0>, <__main__.Neuron object at 0x00000272971997B0>]\n" + ] + }, + { + "data": { + "text/plain": [ + "<__main__.Layer at 0x2729718fbb0>" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Layer(2,3)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "94a9f183", + "metadata": {}, + "outputs": [], + "source": [ + "class Layer:\n", + " \n", + " def __init__(self, nin, nout):\n", + " # list of Neurons\n", + " self.neurons = [Neuron(nin) for _ in range(nout)]\n", + " \n", + " def __call__(self, x):\n", + " # evaluation\n", + " outs = [n(x) for n in self.neurons]\n", + " return outs" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "df33fc84", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Value(data=0.6576209556570828),\n", + " Value(data=0.257178137152771),\n", + " Value(data=0.9990105570285065)]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x = [2.0, 3.0]\n", + "n = Layer(2, 3)\n", + "n(x)" + ] + }, + { + "cell_type": "markdown", + "id": "eec5293b", + "metadata": {}, + "source": [ + "## Multi-Layer Perceptron" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "344375f7", + "metadata": {}, + "outputs": [], + "source": [ + "class MLP:\n", + " \n", + " # nouts - list of sizes of Layers\n", + " def __init__(self, nin, nouts):\n", + " # creating list of no. of neurons in a layers \n", + " # i.e. len(sz) - no. of layers\n", + " # and elements in sz - neurons in each layer\n", + " sz = [nin] + nouts\n", + " self.layers = [Layer(sz[i], sz[i+1]) for i in range(len(nouts))]\n", + " print(f'{sz = }')\n", + " print(f'{self.layers = }') " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "03d9f0b2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sz = [3, 4, 4, 1]\n", + "self.layers = [<__main__.Layer object at 0x0000027297199780>, <__main__.Layer object at 0x0000027297199510>, <__main__.Layer object at 0x00000272971982E0>]\n" + ] + }, + { + "data": { + "text/plain": [ + "<__main__.MLP at 0x2729719bee0>" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# (3, [4,4,1]) - 3 inputs and 2 layers with 4 neurons and 1 output neuron\n", + "MLP(3, [4,4,1])" + ] + }, + { + "cell_type": "markdown", + "id": "c50d338c", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "9822a4f9", + "metadata": {}, + "outputs": [], + "source": [ + "class Neuron:\n", + " def __init__(self, nin):\n", + " self.w = [Value(random.uniform(-1,1)) for _ in range(nin)] \n", + " self.b = Value(np.random.uniform(-1,1)) \n", + " def __call__(self, x):\n", + " act = sum((wi*xi for wi,xi in zip(self.w, x)), start=self.b) \n", + " out = act.tanh()\n", + " return out\n", + "\n", + "class Layer:\n", + " def __init__(self, nin, nout):\n", + " self.neurons = [Neuron(nin) for _ in range(nout)]\n", + " def __call__(self, x):\n", + " outs = [n(x) for n in self.neurons]\n", + " return outs[0] if len(outs)==1 else outs\n", + " \n", + "class MLP:\n", + " # nouts - list of sizes of Layers\n", + " def __init__(self, nin, nouts):\n", + " # creating list of no. of neurons in a layers \n", + " # i.e. len(sz) - no. of layers\n", + " # and elements in sz - neurons in each layer\n", + " sz = [nin] + nouts\n", + " self.layers = [Layer(sz[i], sz[i+1]) for i in range(len(nouts))] \n", + " \n", + " def __call__(self, x):\n", + " # Iterate over each layer in the MLP\n", + " for layer in self.layers:\n", + " # Pass the input data through the current layer\n", + " x = layer(x)\n", + " # Return the final output after passing through all layers\n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "2a05e04e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Value(data=-0.31758403218930287)" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 3 inputs \n", + "x = [2.0, 3.0, -1.0]\n", + "# (3, [4,4,1]) - 3 inputs and 2 layers with 4 neurons and 1 output neuron\n", + "n = MLP(3, [4, 4, 1])\n", + "n(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "91ebf7fd", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185074208\n", + "\n", + " \n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185074496*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185074208->2691185074496*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185279088\n", + "\n", + " \n", + "\n", + "data 0.7646\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185279280+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185279088->2691185279280+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185279088*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185279088*->2691185279088\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185172608\n", + "\n", + " \n", + "\n", + "data 3.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185172656*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185172608->2691185172656*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185172656\n", + "\n", + " \n", + "\n", + "data 0.6452\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185172848+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185172656->2691185172848+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185172656*->2691185172656\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185279280\n", + "\n", + " \n", + "\n", + "data -0.3184\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185279664+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185279280->2691185279664+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185279280+->2691185279280\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185074496\n", + "\n", + " \n", + "\n", + "data 0.5762\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185080640+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185074496->2691185080640+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185074496*->2691185074496\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185172848\n", + "\n", + " \n", + "\n", + "data 0.8843\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185173280+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185172848->2691185173280+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185172848+->2691185172848\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185279472\n", + "\n", + " \n", + "\n", + "data 0.0484\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185279472->2691185279664+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185279472*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185279472*->2691185279472\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185173040\n", + "\n", + " \n", + "\n", + "data -1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185173088*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185173040->2691185173088*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185173088\n", + "\n", + " \n", + "\n", + "data -0.2971\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185173088->2691185173280+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185173088*->2691185173088\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185074784\n", + "\n", + " \n", + "\n", + "data -0.6594\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185281584*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185074784->2691185281584*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185074832\n", + "\n", + " \n", + "\n", + "data -0.9378\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185280624+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185074832->2691185280624+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185279664\n", + "\n", + " \n", + "\n", + "data -0.2699\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185280048+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185279664->2691185280048+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185279664+->2691185279664\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185074928\n", + "\n", + " \n", + "\n", + "data -0.9090\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185281200*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185074928->2691185281200*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185173280\n", + "\n", + " \n", + "\n", + "data 0.5872\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185173376tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185173280->2691185173376tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185173280+->2691185173280\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185075024\n", + "\n", + " \n", + "\n", + "data 0.0592\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185280816*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185075024->2691185280816*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185279856\n", + "\n", + " \n", + "\n", + "data 0.0093\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185279856->2691185280048+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185279856*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185279856*->2691185279856\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185173376\n", + "\n", + " \n", + "\n", + "data 0.5279\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185173376->2691185279472*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185175920*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185173376->2691185175920*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177648*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185173376->2691185177648*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179376*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185173376->2691185179376*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185173376tanh->2691185173376\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280048\n", + "\n", + " \n", + "\n", + "data -0.2607\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185280144tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185280048->2691185280144tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280048+->2691185280048\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280144\n", + "\n", + " \n", + "\n", + "data -0.2549\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185280144->2691185281584*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280144tanh->2691185280144\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185173664\n", + "\n", + " \n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185173712*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185173664->2691185173712*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185173712\n", + "\n", + " \n", + "\n", + "data -1.2136\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185173904+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185173712->2691185173904+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185173712*->2691185173712\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185173904\n", + "\n", + " \n", + "\n", + "data -1.2409\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185174336+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185173904->2691185174336+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185173904+->2691185173904\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280432\n", + "\n", + " \n", + "\n", + "data -0.1828\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185280432->2691185280624+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280432*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185280432*->2691185280432\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185174096\n", + "\n", + " \n", + "\n", + "data 3.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185174144*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185174096->2691185174144*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280624\n", + "\n", + " \n", + "\n", + "data -1.1205\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185281008+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185280624->2691185281008+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280624+->2691185280624\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185174144\n", + "\n", + " \n", + "\n", + "data 0.9154\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185174144->2691185174336+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185174144*->2691185174144\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280816\n", + "\n", + " \n", + "\n", + "data -0.0477\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185280816->2691185281008+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280816*->2691185280816\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185174336\n", + "\n", + " \n", + "\n", + "data -0.3254\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185174768+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185174336->2691185174768+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185174336+->2691185174336\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185281008\n", + "\n", + " \n", + "\n", + "data -1.1682\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185281392+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185281008->2691185281392+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185281008+->2691185281008\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185174528\n", + "\n", + " \n", + "\n", + "data -1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185174576*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185174528->2691185174576*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185068064\n", + "\n", + " \n", + "\n", + "data -0.5322\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185170112*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185068064->2691185170112*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185174576\n", + "\n", + " \n", + "\n", + "data -0.1872\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185174576->2691185174768+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185174576*->2691185174576\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185281200\n", + "\n", + " \n", + "\n", + "data 0.6711\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185281200->2691185281392+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185281200*->2691185281200\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185174768\n", + "\n", + " \n", + "\n", + "data -0.5126\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185174864tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185174768->2691185174864tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185174768+->2691185174768\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076464\n", + "\n", + " \n", + "\n", + "data -0.8690\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185076464->2691185280432*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185174864\n", + "\n", + " \n", + "\n", + "data -0.4720\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185174864->2691185279856*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185176304*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185174864->2691185176304*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178032*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185174864->2691185178032*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179760*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185174864->2691185179760*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185174864tanh->2691185174864\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076560\n", + "\n", + " \n", + "\n", + "data 0.5674\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185178992*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185076560->2691185178992*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185281392\n", + "\n", + " \n", + "\n", + "data -0.4971\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185281776+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185281392->2691185281776+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185281392+->2691185281392\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076608\n", + "\n", + " \n", + "\n", + "data 0.7163\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185076608->2691185179760*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076656\n", + "\n", + " \n", + "\n", + "data -0.5292\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185178800+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185076656->2691185178800+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185281584\n", + "\n", + " \n", + "\n", + "data 0.1681\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185281584->2691185281776+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185281584*->2691185281584\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076800\n", + "\n", + " \n", + "\n", + "data -0.8737\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185076800->2691185279088*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076848\n", + "\n", + " \n", + "\n", + "data -0.0197\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185076848->2691185279856*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185175152\n", + "\n", + " \n", + "\n", + "data -0.2749\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185175344+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185175152->2691185175344+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185175152*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185175152*->2691185175152\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076944\n", + "\n", + " \n", + "\n", + "data 0.0917\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185076944->2691185279472*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185281776\n", + "\n", + " \n", + "\n", + "data -0.3290\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185281872tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185281776->2691185281872tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185281776+->2691185281776\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076992\n", + "\n", + " \n", + "\n", + "data -0.2685\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185180336*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185076992->2691185180336*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077040\n", + "\n", + " \n", + "\n", + "data 0.6165\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185077040->2691185179376*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185175344\n", + "\n", + " \n", + "\n", + "data 0.5478\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185175728+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185175344->2691185175728+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185175344+->2691185175344\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185281872\n", + "\n", + " \n", + "\n", + "data -0.3176\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185281872tanh->2691185281872\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077088\n", + "\n", + " \n", + "\n", + "data 0.2669\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185178608*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185077088->2691185178608*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077136\n", + "\n", + " \n", + "\n", + "data 0.8372\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185177264*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185077136->2691185177264*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077184\n", + "\n", + " \n", + "\n", + "data 0.0592\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185176880*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185077184->2691185176880*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185175536\n", + "\n", + " \n", + "\n", + "data -0.2111\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185175536->2691185175728+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185175536*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185175536*->2691185175536\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077280\n", + "\n", + " \n", + "\n", + "data 0.9408\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185077280->2691185177648*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077328\n", + "\n", + " \n", + "\n", + "data 0.8226\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185077328->2691185175344+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077424\n", + "\n", + " \n", + "\n", + "data -0.9646\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185177072+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185077424->2691185177072+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185175728\n", + "\n", + " \n", + "\n", + "data 0.3367\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185176112+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185175728->2691185176112+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185175728+->2691185175728\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077472\n", + "\n", + " \n", + "\n", + "data -0.1473\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185077472->2691185178032*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185175920\n", + "\n", + " \n", + "\n", + "data -0.4267\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185175920->2691185176112+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185175920*->2691185175920\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077616\n", + "\n", + " \n", + "\n", + "data -0.6430\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185077616->2691185176304*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077760\n", + "\n", + " \n", + "\n", + "data -0.9909\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185180528+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185077760->2691185180528+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185176112\n", + "\n", + " \n", + "\n", + "data -0.0900\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185176496+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185176112->2691185176496+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185176112+->2691185176112\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077808\n", + "\n", + " \n", + "\n", + "data -0.8083\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185077808->2691185175920*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077856\n", + "\n", + " \n", + "\n", + "data 0.6644\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185172416+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185077856->2691185172416+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078000\n", + "\n", + " \n", + "\n", + "data 0.2971\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185078000->2691185173088*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185176304\n", + "\n", + " \n", + "\n", + "data 0.3035\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185176304->2691185176496+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185176304*->2691185176304\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078048\n", + "\n", + " \n", + "\n", + "data -0.6068\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185078048->2691185173712*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078096\n", + "\n", + " \n", + "\n", + "data 0.2151\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185078096->2691185172656*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078144\n", + "\n", + " \n", + "\n", + "data 0.1872\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185078144->2691185174576*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185176496\n", + "\n", + " \n", + "\n", + "data 0.2135\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185176592tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185176496->2691185176592tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185176496+->2691185176496\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078240\n", + "\n", + " \n", + "\n", + "data 0.3051\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185078240->2691185174144*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078288\n", + "\n", + " \n", + "\n", + "data -0.2127\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185172224*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185078288->2691185172224*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185176592\n", + "\n", + " \n", + "\n", + "data 0.2103\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185176592->2691185280432*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185176592tanh->2691185176592\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078384\n", + "\n", + " \n", + "\n", + "data -0.0272\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185078384->2691185173904+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078480\n", + "\n", + " \n", + "\n", + "data 0.2412\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185078480->2691185175536*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078528\n", + "\n", + " \n", + "\n", + "data -0.8013\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185078528->2691185175152*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185176880\n", + "\n", + " \n", + "\n", + "data 0.0203\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185176880->2691185177072+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185176880*->2691185176880\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078672\n", + "\n", + " \n", + "\n", + "data 0.5019\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185170928+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185078672->2691185170928+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177072\n", + "\n", + " \n", + "\n", + "data -0.9443\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185177456+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185177072->2691185177456+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177072+->2691185177072\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177264\n", + "\n", + " \n", + "\n", + "data -0.7327\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185177264->2691185177456+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177264*->2691185177264\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177456\n", + "\n", + " \n", + "\n", + "data -1.6770\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185177840+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185177456->2691185177840+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177456+->2691185177456\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177648\n", + "\n", + " \n", + "\n", + "data 0.4966\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185177648->2691185177840+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177648*->2691185177648\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185169536\n", + "\n", + " \n", + "\n", + "data 3.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185169584*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185169536->2691185169584*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185169584\n", + "\n", + " \n", + "\n", + "data -1.4450\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185169872+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185169584->2691185169872+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185169584*->2691185169584\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177840\n", + "\n", + " \n", + "\n", + "data -1.1804\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185178224+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185177840->2691185178224+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177840+->2691185177840\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178032\n", + "\n", + " \n", + "\n", + "data 0.0695\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185178032->2691185178224+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178032*->2691185178032\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185169872\n", + "\n", + " \n", + "\n", + "data -0.1747\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185170304+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185169872->2691185170304+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185169872+->2691185169872\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178224\n", + "\n", + " \n", + "\n", + "data -1.1108\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185178320tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185178224->2691185178320tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178224+->2691185178224\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185170064\n", + "\n", + " \n", + "\n", + "data -1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185170064->2691185170112*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185170112\n", + "\n", + " \n", + "\n", + "data 0.5322\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185170112->2691185170304+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185170112*->2691185170112\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178320\n", + "\n", + " \n", + "\n", + "data -0.8044\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185178320->2691185280816*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178320tanh->2691185178320\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185170304\n", + "\n", + " \n", + "\n", + "data 0.3575\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185170400tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185170304->2691185170400tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185170304+->2691185170304\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185170400\n", + "\n", + " \n", + "\n", + "data 0.3430\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185170400->2691185175152*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185170400->2691185176880*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185170400->2691185178608*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185170400->2691185180336*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185170400tanh->2691185170400\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178608\n", + "\n", + " \n", + "\n", + "data 0.0915\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185178608->2691185178800+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178608*->2691185178608\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178800\n", + "\n", + " \n", + "\n", + "data -0.4376\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185179184+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185178800->2691185179184+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178800+->2691185178800\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185170688\n", + "\n", + " \n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185170736*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185170688->2691185170736*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185170736\n", + "\n", + " \n", + "\n", + "data 1.4173\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185170736->2691185170928+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185170736*->2691185170736\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185080640\n", + "\n", + " \n", + "\n", + "data 1.2703\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185080640->2691185169872+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185080640+->2691185080640\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178992\n", + "\n", + " \n", + "\n", + "data -0.4966\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185178992->2691185179184+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178992*->2691185178992\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185170928\n", + "\n", + " \n", + "\n", + "data 1.9191\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185171360+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185170928->2691185171360+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185170928+->2691185170928\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185080880\n", + "\n", + " \n", + "\n", + "data 0.7086\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185080880->2691185170736*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179184\n", + "\n", + " \n", + "\n", + "data -0.9342\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185179568+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185179184->2691185179568+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179184+->2691185179184\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185080928\n", + "\n", + " \n", + "\n", + "data -0.8542\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185171168*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185080928->2691185171168*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185080976\n", + "\n", + " \n", + "\n", + "data 0.7115\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185171600*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185080976->2691185171600*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185171120\n", + "\n", + " \n", + "\n", + "data 3.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185171120->2691185171168*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185171168\n", + "\n", + " \n", + "\n", + "data -2.5625\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185171168->2691185171360+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185171168*->2691185171168\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179376\n", + "\n", + " \n", + "\n", + "data 0.3255\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185179376->2691185179568+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179376*->2691185179376\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185171360\n", + "\n", + " \n", + "\n", + "data -0.6434\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185171792+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185171360->2691185171792+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185171360+->2691185171360\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179568\n", + "\n", + " \n", + "\n", + "data -0.6087\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185179952+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185179568->2691185179952+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179568+->2691185179568\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185171552\n", + "\n", + " \n", + "\n", + "data -1.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185171552->2691185171600*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179760\n", + "\n", + " \n", + "\n", + "data -0.3381\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185179760->2691185179952+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179760*->2691185179760\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185171600\n", + "\n", + " \n", + "\n", + "data -0.7115\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185171600->2691185171792+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185171600*->2691185171600\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185081600\n", + "\n", + " \n", + "\n", + "data 0.6941\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185081600->2691185080640+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179952\n", + "\n", + " \n", + "\n", + "data -0.9468\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185180048tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185179952->2691185180048tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179952+->2691185179952\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185171792\n", + "\n", + " \n", + "\n", + "data -1.3549\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185171888tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185171792->2691185171888tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185171792+->2691185171792\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185073536\n", + "\n", + " \n", + "\n", + "data -0.4817\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185073536->2691185169584*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185180048\n", + "\n", + " \n", + "\n", + "data -0.7383\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185180048->2691185281200*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185180048tanh->2691185180048\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185171888\n", + "\n", + " \n", + "\n", + "data -0.8752\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185171888->2691185279088*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185171888->2691185175536*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185171888->2691185177264*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185171888->2691185178992*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185171888tanh->2691185171888\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185180336\n", + "\n", + " \n", + "\n", + "data -0.0921\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185180336->2691185180528+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185180336*->2691185180336\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185172176\n", + "\n", + " \n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185172176->2691185172224*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185172224\n", + "\n", + " \n", + "\n", + "data -0.4253\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185172224->2691185172416+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185172224*->2691185172224\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185074016\n", + "\n", + " \n", + "\n", + "data 0.2881\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185074016->2691185074496*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185180528\n", + "\n", + " \n", + "\n", + "data -1.0830\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185180528->2691185279280+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185180528+->2691185180528\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185172416\n", + "\n", + " \n", + "\n", + "data 0.2391\n", + "\n", + "grad 0.0000\n", + "\n", + "\n", + "\n", + "2691185172416->2691185172848+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185172416+->2691185172416\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "draw_dot(n(x))" + ] + }, + { + "cell_type": "markdown", + "id": "0567c7e9", + "metadata": {}, + "source": [ + "---\n", + "---\n", + "---\n", + "## Creating a tiny Dataset \n", + "## Writing the loss function" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "3d63704b", + "metadata": {}, + "outputs": [], + "source": [ + "xs = [\n", + " [2.0, 3.0, -1.0],\n", + " [3.0, -1.0, 0.5],\n", + " [0.5, 1.0, 1.0],\n", + " [1.0, 1.0, -1.0],\n", + "]\n", + "ys = [1.0, -1.0, -1.0, 1.0] # desired targets" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "7bcc37d2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Value(data=-0.31758403218930287),\n", + " Value(data=-0.5198083164593772),\n", + " Value(data=-0.7482140329368582),\n", + " Value(data=-0.12527297444659258)]" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ypred = [n(x) for x in xs]\n", + "ypred" + ] + }, + { + "cell_type": "markdown", + "id": "091aaa60", + "metadata": {}, + "source": [ + "### Loss Function\n", + "\n", + "A loss function, also known as a cost function or objective function, quantifies the discrepancy between the predicted values of a model and the actual values in the training data. Its primary role is to measure how well the model is performing on a given task, such as classification or regression.\n", + "\n", + "#### Key Points:\n", + "\n", + "1. **Evaluation of Performance**: The loss function provides a measure of how well a model is performing. By comparing the model's predictions to the ground truth labels or values, the loss function quantifies the model's accuracy or error.\n", + "\n", + "2. **Optimization**: During training, the goal is to minimize the loss function. This optimization process involves adjusting the parameters of the model (e.g., weights in neural networks) to reduce the discrepancy between predicted and actual values, thereby improving the model's performance.\n", + "\n", + "3. **Different Types**: There are various types of loss functions, each suited to different types of tasks. For example, mean squared error (MSE) is commonly used for regression tasks, while cross-entropy loss is often used for classification tasks.\n", + "\n", + "4. **Gradient Descent**: The gradient of the loss function with respect to the model parameters guides the optimization process. Techniques like gradient descent are used to iteratively update the parameters in the direction that minimizes the loss.\n", + "\n", + "5. **Interpretation**: A low value of the loss function indicates that the model's predictions are close to the ground truth values, while a high value indicates a significant discrepancy. Understanding the loss function helps in interpreting the performance of machine learning models.\n", + "\n", + "6. **Model Training**: Loss functions are essential for training machine learning models. They form the basis of optimization algorithms like gradient descent, enabling models to learn from data and improve their performance over time.\n", + "\n", + "In summary, the loss function serves as a crucial metric for evaluating and optimizing machine learning models, guiding the training process towards achieving better performance on the given task." + ] + }, + { + "cell_type": "markdown", + "id": "cdcc0505", + "metadata": {}, + "source": [ + "### Mean Square Error (MSE)\n", + "\n", + "Mean Square Error (MSE) is a metric used to evaluate the performance of regression models. It measures the average squared difference between the actual and predicted values.\n", + "\n", + "The formula for MSE is:\n", + "\n", + "$$ MSE = \\frac{1}{n} \\sum_{i=1}^{n}(y_i - \\hat{y}_i)^2 $$\n", + "\n", + "#### A lower MSE indicates better predictive performance of the model.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "7cfdc149", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Value(data=1.7360276818802218),\n", + " Value(data=0.23058405294157763),\n", + " Value(data=0.06339617320992154),\n", + " Value(data=1.2662392670198819)]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[(yout - ygt)**2 for ygt, yout in zip(ys, ypred)]\n", + "# higher values indicates ypred is far away from desired ys, therefore high loss" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "f1f9b5e0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Value(data=3.296247175051603)" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "loss = sum([(yout - ygt)**2 for ygt, yout in zip(ys, ypred)])\n", + "loss" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "d68038c0", + "metadata": {}, + "outputs": [], + "source": [ + "loss.backward()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "61398d2d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-3.484298150134485" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# a single parameter\n", + "n.layers[0].neurons[0].w[0].grad" + ] + }, + { + "cell_type": "markdown", + "id": "57e820a2", + "metadata": {}, + "source": [ + "This above expression refers to the gradient of the weight parameter of the first neuron in the first layer of a neural network `n`. Let's break it down:\n", + "\n", + "- `n`: Refers to the neural network object.\n", + "- `layers[0]`: Refers to the first layer of the neural network.\n", + "- `neurons[0]`: Refers to the first neuron in the first layer.\n", + "- `w[0]`: Refers to the weight parameter of the first neuron.\n", + "- `grad`: Refers to the gradient of the weight parameter, which is used in the backpropagation algorithm to update the weights during training.\n", + "\n", + "In summary, `n.layers[0].neurons[0].w[0].grad` accesses the gradient of the weight parameter of the first neuron in the first layer of the neural network `n`.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "19d387eb", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185279136\n", + "\n", + " \n", + "\n", + "data 0.4966\n", + "\n", + "grad -0.0496\n", + "\n", + "\n", + "\n", + "2691185289360+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185279136->2691185289360+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185279136*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185279136*->2691185279136\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185475792\n", + "\n", + " \n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0549\n", + "\n", + "\n", + "\n", + "2691185475840*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185475792->2691185475840*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185475840\n", + "\n", + " \n", + "\n", + "data -0.8542\n", + "\n", + "grad -0.0643\n", + "\n", + "\n", + "\n", + "2691185476032+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185475840->2691185476032+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185475840*->2691185475840\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185476032\n", + "\n", + " \n", + "\n", + "data 0.0020\n", + "\n", + "grad -0.0643\n", + "\n", + "\n", + "\n", + "2691185476464+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185476032->2691185476464+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185476032+->2691185476032\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185279616\n", + "\n", + " \n", + "\n", + "data -1.6770\n", + "\n", + "grad -0.0496\n", + "\n", + "\n", + "\n", + "2691185279616->2691185289360+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185279616+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185279616+->2691185279616\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185476224\n", + "\n", + " \n", + "\n", + "data 1.0000\n", + "\n", + "grad -0.0458\n", + "\n", + "\n", + "\n", + "2691185476272*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185476224->2691185476272*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185476272\n", + "\n", + " \n", + "\n", + "data 0.7115\n", + "\n", + "grad -0.0643\n", + "\n", + "\n", + "\n", + "2691185476272->2691185476464+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185476272*->2691185476272\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185279760\n", + "\n", + " \n", + "\n", + "data -0.7327\n", + "\n", + "grad -0.0496\n", + "\n", + "\n", + "\n", + "2691185279760->2691185279616+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185279760*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185279760*->2691185279760\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185476464\n", + "\n", + " \n", + "\n", + "data 0.7136\n", + "\n", + "grad -0.0643\n", + "\n", + "\n", + "\n", + "2691185476560tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185476464->2691185476560tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185476464+->2691185476464\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185279904\n", + "\n", + " \n", + "\n", + "data -0.9443\n", + "\n", + "grad -0.0496\n", + "\n", + "\n", + "\n", + "2691185279904->2691185279616+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185279904+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185279904+->2691185279904\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185476560\n", + "\n", + " \n", + "\n", + "data 0.6129\n", + "\n", + "grad -0.1030\n", + "\n", + "\n", + "\n", + "2691185480208*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185476560->2691185480208*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185481936*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185476560->2691185481936*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185483664*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185476560->2691185483664*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185485392*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185476560->2691185485392*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185476560tanh->2691185476560\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280048\n", + "\n", + " \n", + "\n", + "data -0.2111\n", + "\n", + "grad 1.9679\n", + "\n", + "\n", + "\n", + "2691185280192+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185280048->2691185280192+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280048*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185280048*->2691185280048\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280192\n", + "\n", + " \n", + "\n", + "data 0.3367\n", + "\n", + "grad 1.9679\n", + "\n", + "\n", + "\n", + "2691185281536+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185280192->2691185281536+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280192+->2691185280192\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185476848\n", + "\n", + " \n", + "\n", + "data 0.5000\n", + "\n", + "grad -0.0029\n", + "\n", + "\n", + "\n", + "2691185476896*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185476848->2691185476896*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280288\n", + "\n", + " \n", + "\n", + "data 0.0203\n", + "\n", + "grad -0.0496\n", + "\n", + "\n", + "\n", + "2691185280288->2691185279904+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280288*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185280288*->2691185280288\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185476896\n", + "\n", + " \n", + "\n", + "data -0.1063\n", + "\n", + "grad 0.0138\n", + "\n", + "\n", + "\n", + "2691185477088+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185476896->2691185477088+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185476896*->2691185476896\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185477088\n", + "\n", + " \n", + "\n", + "data 0.5581\n", + "\n", + "grad 0.0138\n", + "\n", + "\n", + "\n", + "2691185477520+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185477088->2691185477520+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185477088+->2691185477088\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280624\n", + "\n", + " \n", + "\n", + "data 0.5478\n", + "\n", + "grad 1.9679\n", + "\n", + "\n", + "\n", + "2691185280624->2691185280192+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280624+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185280624+->2691185280624\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280672\n", + "\n", + " \n", + "\n", + "data 0.2103\n", + "\n", + "grad 2.0590\n", + "\n", + "\n", + "\n", + "2691185293584*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185280672->2691185293584*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280672tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185280672tanh->2691185280672\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185477280\n", + "\n", + " \n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0030\n", + "\n", + "\n", + "\n", + "2691185477328*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185477280->2691185477328*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185477328\n", + "\n", + " \n", + "\n", + "data 0.2151\n", + "\n", + "grad 0.0138\n", + "\n", + "\n", + "\n", + "2691185477328->2691185477520+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185477328*->2691185477328\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280912\n", + "\n", + " \n", + "\n", + "data 0.2135\n", + "\n", + "grad 1.9679\n", + "\n", + "\n", + "\n", + "2691185280912->2691185280672tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185280912+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185280912+->2691185280912\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185477520\n", + "\n", + " \n", + "\n", + "data 0.7732\n", + "\n", + "grad 0.0138\n", + "\n", + "\n", + "\n", + "2691185477952+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185477520->2691185477952+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185477520+->2691185477520\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185281056\n", + "\n", + " \n", + "\n", + "data 0.3035\n", + "\n", + "grad 1.9679\n", + "\n", + "\n", + "\n", + "2691185281056->2691185280912+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185281056*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185281056*->2691185281056\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185477712\n", + "\n", + " \n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.0041\n", + "\n", + "\n", + "\n", + "2691185477760*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185477712->2691185477760*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185477760\n", + "\n", + " \n", + "\n", + "data 0.2971\n", + "\n", + "grad 0.0138\n", + "\n", + "\n", + "\n", + "2691185477760->2691185477952+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185477760*->2691185477760\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185281200\n", + "\n", + " \n", + "\n", + "data -0.2749\n", + "\n", + "grad 1.9679\n", + "\n", + "\n", + "\n", + "2691185281200->2691185280624+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185281200*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185281200*->2691185281200\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185477952\n", + "\n", + " \n", + "\n", + "data 1.0702\n", + "\n", + "grad 0.0138\n", + "\n", + "\n", + "\n", + "2691185478048tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185477952->2691185478048tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185477952+->2691185477952\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185478048\n", + "\n", + " \n", + "\n", + "data 0.7896\n", + "\n", + "grad 0.0367\n", + "\n", + "\n", + "\n", + "2691185480592*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185478048->2691185480592*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185482320*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185478048->2691185482320*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185484048*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185478048->2691185484048*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185485776*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185478048->2691185485776*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185478048tanh->2691185478048\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185281536\n", + "\n", + " \n", + "\n", + "data -0.0900\n", + "\n", + "grad 1.9679\n", + "\n", + "\n", + "\n", + "2691185281536->2691185280912+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185281536+->2691185281536\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185281680\n", + "\n", + " \n", + "\n", + "data -0.4267\n", + "\n", + "grad 1.9679\n", + "\n", + "\n", + "\n", + "2691185281680->2691185281536+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185281680*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185281680*->2691185281680\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185478336\n", + "\n", + " \n", + "\n", + "data 0.5000\n", + "\n", + "grad 0.0110\n", + "\n", + "\n", + "\n", + "2691185478384*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185478336->2691185478384*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185478384\n", + "\n", + " \n", + "\n", + "data -0.3034\n", + "\n", + "grad -0.0182\n", + "\n", + "\n", + "\n", + "2691185478576+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185478384->2691185478576+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185478384*->2691185478384\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185478576\n", + "\n", + " \n", + "\n", + "data -0.3306\n", + "\n", + "grad -0.0182\n", + "\n", + "\n", + "\n", + "2691185479008+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185478576->2691185479008+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185478576+->2691185478576\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185478768\n", + "\n", + " \n", + "\n", + "data 1.0000\n", + "\n", + "grad -0.0055\n", + "\n", + "\n", + "\n", + "2691185478816*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185478768->2691185478816*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185478816\n", + "\n", + " \n", + "\n", + "data 0.3051\n", + "\n", + "grad -0.0182\n", + "\n", + "\n", + "\n", + "2691185478816->2691185479008+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185478816*->2691185478816\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185479008\n", + "\n", + " \n", + "\n", + "data -0.0255\n", + "\n", + "grad -0.0182\n", + "\n", + "\n", + "\n", + "2691185479440+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185479008->2691185479440+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185479008+->2691185479008\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185479200\n", + "\n", + " \n", + "\n", + "data 1.0000\n", + "\n", + "grad -0.0034\n", + "\n", + "\n", + "\n", + "2691185479248*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185479200->2691185479248*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185479248\n", + "\n", + " \n", + "\n", + "data 0.1872\n", + "\n", + "grad -0.0182\n", + "\n", + "\n", + "\n", + "2691185479248->2691185479440+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185479248*->2691185479248\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185479440\n", + "\n", + " \n", + "\n", + "data 0.1617\n", + "\n", + "grad -0.0182\n", + "\n", + "\n", + "\n", + "2691185479536tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185479440->2691185479536tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185479440+->2691185479440\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185479536\n", + "\n", + " \n", + "\n", + "data 0.1603\n", + "\n", + "grad -0.0187\n", + "\n", + "\n", + "\n", + "2691185480976*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185479536->2691185480976*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185482704*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185479536->2691185482704*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185484432*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185479536->2691185484432*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185486160*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185479536->2691185486160*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185479536tanh->2691185479536\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185283120\n", + "\n", + " \n", + "\n", + "data 1.4173\n", + "\n", + "grad -0.0673\n", + "\n", + "\n", + "\n", + "2691185289120+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185283120->2691185289120+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185283120*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185283120*->2691185283120\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185479824\n", + "\n", + " \n", + "\n", + "data 0.1394\n", + "\n", + "grad -0.1686\n", + "\n", + "\n", + "\n", + "2691185480016+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185479824->2691185480016+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185479824*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185479824*->2691185479824\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185480016\n", + "\n", + " \n", + "\n", + "data 0.9621\n", + "\n", + "grad -0.1686\n", + "\n", + "\n", + "\n", + "2691185480400+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185480016->2691185480400+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185480016+->2691185480016\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185283456\n", + "\n", + " \n", + "\n", + "data 2.0000\n", + "\n", + "grad -0.0477\n", + "\n", + "\n", + "\n", + "2691185283456->2691185283120*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185480208\n", + "\n", + " \n", + "\n", + "data 0.1478\n", + "\n", + "grad -0.1686\n", + "\n", + "\n", + "\n", + "2691185480208->2691185480400+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185480208*->2691185480208\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185480400\n", + "\n", + " \n", + "\n", + "data 1.1099\n", + "\n", + "grad -0.1686\n", + "\n", + "\n", + "\n", + "2691185480784+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185480400->2691185480784+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185480400+->2691185480400\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185480592\n", + "\n", + " \n", + "\n", + "data -0.6382\n", + "\n", + "grad -0.1686\n", + "\n", + "\n", + "\n", + "2691185480592->2691185480784+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185480592*->2691185480592\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185480784\n", + "\n", + " \n", + "\n", + "data 0.4717\n", + "\n", + "grad -0.1686\n", + "\n", + "\n", + "\n", + "2691185481168+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185480784->2691185481168+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185480784+->2691185480784\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185480976\n", + "\n", + " \n", + "\n", + "data -0.1031\n", + "\n", + "grad -0.1686\n", + "\n", + "\n", + "\n", + "2691185480976->2691185481168+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185480976*->2691185480976\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185481168\n", + "\n", + " \n", + "\n", + "data 0.3686\n", + "\n", + "grad -0.1686\n", + "\n", + "\n", + "\n", + "2691185481264tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185481168->2691185481264tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185481168+->2691185481168\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185481264\n", + "\n", + " \n", + "\n", + "data 0.3528\n", + "\n", + "grad -0.1926\n", + "\n", + "\n", + "\n", + "2691185486736*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185481264->2691185486736*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185481264tanh->2691185481264\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185481552\n", + "\n", + " \n", + "\n", + "data -0.0103\n", + "\n", + "grad 0.0123\n", + "\n", + "\n", + "\n", + "2691185481744+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185481552->2691185481744+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185481552*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185481552*->2691185481552\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185481744\n", + "\n", + " \n", + "\n", + "data -0.9749\n", + "\n", + "grad 0.0123\n", + "\n", + "\n", + "\n", + "2691185482128+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185481744->2691185482128+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185481744+->2691185481744\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185285328\n", + "\n", + " \n", + "\n", + "data -0.1747\n", + "\n", + "grad -1.5093\n", + "\n", + "\n", + "\n", + "2691185287152+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185285328->2691185287152+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185285328+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185285328+->2691185285328\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185481936\n", + "\n", + " \n", + "\n", + "data 0.5131\n", + "\n", + "grad 0.0123\n", + "\n", + "\n", + "\n", + "2691185481936->2691185482128+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185481936*->2691185481936\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185482128\n", + "\n", + " \n", + "\n", + "data -0.4617\n", + "\n", + "grad 0.0123\n", + "\n", + "\n", + "\n", + "2691185482512+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185482128->2691185482512+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185482128+->2691185482128\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185285616\n", + "\n", + " \n", + "\n", + "data -1.4450\n", + "\n", + "grad -1.5093\n", + "\n", + "\n", + "\n", + "2691185285616->2691185285328+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185285616*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185285616*->2691185285616\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185285664\n", + "\n", + " \n", + "\n", + "data 3.0000\n", + "\n", + "grad 0.7270\n", + "\n", + "\n", + "\n", + "2691185285664->2691185285616*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185482320\n", + "\n", + " \n", + "\n", + "data 0.7428\n", + "\n", + "grad 0.0123\n", + "\n", + "\n", + "\n", + "2691185482320->2691185482512+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185482320*->2691185482320\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185482512\n", + "\n", + " \n", + "\n", + "data 0.2811\n", + "\n", + "grad 0.0123\n", + "\n", + "\n", + "\n", + "2691185482896+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185482512->2691185482896+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185482512+->2691185482512\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185285952\n", + "\n", + " \n", + "\n", + "data 1.2703\n", + "\n", + "grad -1.5093\n", + "\n", + "\n", + "\n", + "2691185285952->2691185285328+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185285952+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185285952+->2691185285952\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185482704\n", + "\n", + " \n", + "\n", + "data -0.0236\n", + "\n", + "grad 0.0123\n", + "\n", + "\n", + "\n", + "2691185482704->2691185482896+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185482704*->2691185482704\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185482896\n", + "\n", + " \n", + "\n", + "data 0.2575\n", + "\n", + "grad 0.0123\n", + "\n", + "\n", + "\n", + "2691185482992tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185482896->2691185482992tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185482896+->2691185482896\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185482992\n", + "\n", + " \n", + "\n", + "data 0.2519\n", + "\n", + "grad 0.0131\n", + "\n", + "\n", + "\n", + "2691185487120*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185482992->2691185487120*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185482992tanh->2691185482992\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185483280\n", + "\n", + " \n", + "\n", + "data -0.0464\n", + "\n", + "grad -0.1758\n", + "\n", + "\n", + "\n", + "2691185483472+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185483280->2691185483472+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185483280*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185483280*->2691185483280\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185286768\n", + "\n", + " \n", + "\n", + "data 0.5762\n", + "\n", + "grad -1.5093\n", + "\n", + "\n", + "\n", + "2691185286768->2691185285952+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185286768*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185286768*->2691185286768\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185286816\n", + "\n", + " \n", + "\n", + "data 2.0000\n", + "\n", + "grad -0.4349\n", + "\n", + "\n", + "\n", + "2691185286816->2691185286768*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185483472\n", + "\n", + " \n", + "\n", + "data -0.5756\n", + "\n", + "grad -0.1758\n", + "\n", + "\n", + "\n", + "2691185483856+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185483472->2691185483856+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185483472+->2691185483472\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185483664\n", + "\n", + " \n", + "\n", + "data 0.3477\n", + "\n", + "grad -0.1758\n", + "\n", + "\n", + "\n", + "2691185483664->2691185483856+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185483664*->2691185483664\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185287152\n", + "\n", + " \n", + "\n", + "data 0.3575\n", + "\n", + "grad -1.5093\n", + "\n", + "\n", + "\n", + "2691185287248tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185287152->2691185287248tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185287152+->2691185287152\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185287248\n", + "\n", + " \n", + "\n", + "data 0.3430\n", + "\n", + "grad -1.7106\n", + "\n", + "\n", + "\n", + "2691185287248->2691185280288*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185287248->2691185281200*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185290128*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185287248->2691185290128*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185291856*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185287248->2691185291856*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185287248tanh->2691185287248\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185483856\n", + "\n", + " \n", + "\n", + "data -0.2279\n", + "\n", + "grad -0.1758\n", + "\n", + "\n", + "\n", + "2691185484240+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185483856->2691185484240+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185483856+->2691185483856\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185287392\n", + "\n", + " \n", + "\n", + "data -0.4720\n", + "\n", + "grad -0.5850\n", + "\n", + "\n", + "\n", + "2691185287392->2691185281056*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185289552*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185287392->2691185289552*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185291280*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185287392->2691185291280*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185293008*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185287392->2691185293008*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185287392tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185287392tanh->2691185287392\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185484048\n", + "\n", + " \n", + "\n", + "data 0.4868\n", + "\n", + "grad -0.1758\n", + "\n", + "\n", + "\n", + "2691185484048->2691185484240+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185484048*->2691185484048\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185484240\n", + "\n", + " \n", + "\n", + "data 0.2589\n", + "\n", + "grad -0.1758\n", + "\n", + "\n", + "\n", + "2691185484624+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185484240->2691185484624+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185484240+->2691185484240\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185484432\n", + "\n", + " \n", + "\n", + "data 0.1148\n", + "\n", + "grad -0.1758\n", + "\n", + "\n", + "\n", + "2691185484432->2691185484624+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185484432*->2691185484432\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185484624\n", + "\n", + " \n", + "\n", + "data 0.3738\n", + "\n", + "grad -0.1758\n", + "\n", + "\n", + "\n", + "2691185484720tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185484624->2691185484720tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185484624+->2691185484624\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185484720\n", + "\n", + " \n", + "\n", + "data 0.3573\n", + "\n", + "grad -0.2015\n", + "\n", + "\n", + "\n", + "2691185487504*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185484720->2691185487504*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185484720tanh->2691185484720\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185485008\n", + "\n", + " \n", + "\n", + "data 0.0467\n", + "\n", + "grad -0.0310\n", + "\n", + "\n", + "\n", + "2691185485200+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185485008->2691185485200+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185485008*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185485008*->2691185485008\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185485200\n", + "\n", + " \n", + "\n", + "data -0.9442\n", + "\n", + "grad -0.0310\n", + "\n", + "\n", + "\n", + "2691185485584+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185485200->2691185485584+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185485200+->2691185485200\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185485392\n", + "\n", + " \n", + "\n", + "data -0.5355\n", + "\n", + "grad -0.0310\n", + "\n", + "\n", + "\n", + "2691185485392->2691185485584+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185485392*->2691185485392\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185288880\n", + "\n", + " \n", + "\n", + "data 0.5322\n", + "\n", + "grad -1.5093\n", + "\n", + "\n", + "\n", + "2691185288880->2691185287152+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185288880*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185288880*->2691185288880\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185288928\n", + "\n", + " \n", + "\n", + "data -1.0000\n", + "\n", + "grad 0.8033\n", + "\n", + "\n", + "\n", + "2691185288928->2691185288880*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185485584\n", + "\n", + " \n", + "\n", + "data -1.4796\n", + "\n", + "grad -0.0310\n", + "\n", + "\n", + "\n", + "2691185485968+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185485584->2691185485968+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185485584+->2691185485584\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185289120\n", + "\n", + " \n", + "\n", + "data 1.9191\n", + "\n", + "grad -0.0673\n", + "\n", + "\n", + "\n", + "2691185178032+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185289120->2691185178032+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185289120+->2691185289120\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185485776\n", + "\n", + " \n", + "\n", + "data 0.0724\n", + "\n", + "grad -0.0310\n", + "\n", + "\n", + "\n", + "2691185485776->2691185485968+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185485776*->2691185485776\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185289312\n", + "\n", + " \n", + "\n", + "data 3.0000\n", + "\n", + "grad 0.0574\n", + "\n", + "\n", + "\n", + "2691185073632*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185289312->2691185073632*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185289360\n", + "\n", + " \n", + "\n", + "data -1.1804\n", + "\n", + "grad -0.0496\n", + "\n", + "\n", + "\n", + "2691185289744+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185289360->2691185289744+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185289360+->2691185289360\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185485968\n", + "\n", + " \n", + "\n", + "data -1.4072\n", + "\n", + "grad -0.0310\n", + "\n", + "\n", + "\n", + "2691185486352+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185485968->2691185486352+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185485968+->2691185485968\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185289552\n", + "\n", + " \n", + "\n", + "data 0.0695\n", + "\n", + "grad -0.0496\n", + "\n", + "\n", + "\n", + "2691185289552->2691185289744+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185289552*->2691185289552\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185486160\n", + "\n", + " \n", + "\n", + "data -0.0032\n", + "\n", + "grad -0.0310\n", + "\n", + "\n", + "\n", + "2691185486160->2691185486352+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185486160*->2691185486160\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185289744\n", + "\n", + " \n", + "\n", + "data -1.1108\n", + "\n", + "grad -0.0496\n", + "\n", + "\n", + "\n", + "2691185289840tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185289744->2691185289840tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185289744+->2691185289744\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185486352\n", + "\n", + " \n", + "\n", + "data -1.4104\n", + "\n", + "grad -0.0310\n", + "\n", + "\n", + "\n", + "2691185486448tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185486352->2691185486448tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185486352+->2691185486352\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185289840\n", + "\n", + " \n", + "\n", + "data -0.8044\n", + "\n", + "grad -0.1404\n", + "\n", + "\n", + "\n", + "2691185293968*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185289840->2691185293968*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185289840tanh->2691185289840\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185486448\n", + "\n", + " \n", + "\n", + "data -0.8876\n", + "\n", + "grad -0.1462\n", + "\n", + "\n", + "\n", + "2691185487888*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185486448->2691185487888*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185486448tanh->2691185486448\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185290128\n", + "\n", + " \n", + "\n", + "data 0.0915\n", + "\n", + "grad 0.9797\n", + "\n", + "\n", + "\n", + "2691185290320+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185290128->2691185290320+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185290128*->2691185290128\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185486736\n", + "\n", + " \n", + "\n", + "data -0.3066\n", + "\n", + "grad 0.2217\n", + "\n", + "\n", + "\n", + "2691185486928+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185486736->2691185486928+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185486736*->2691185486736\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185290320\n", + "\n", + " \n", + "\n", + "data -0.4376\n", + "\n", + "grad 0.9797\n", + "\n", + "\n", + "\n", + "2691185290704+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185290320->2691185290704+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185290320+->2691185290320\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185486928\n", + "\n", + " \n", + "\n", + "data -1.2443\n", + "\n", + "grad 0.2217\n", + "\n", + "\n", + "\n", + "2691185487312+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185486928->2691185487312+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185486928+->2691185486928\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185290512\n", + "\n", + " \n", + "\n", + "data -0.4966\n", + "\n", + "grad 0.9797\n", + "\n", + "\n", + "\n", + "2691185290512->2691185290704+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185290512*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185290512*->2691185290512\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185487120\n", + "\n", + " \n", + "\n", + "data 0.0149\n", + "\n", + "grad 0.2217\n", + "\n", + "\n", + "\n", + "2691185487120->2691185487312+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185487120*->2691185487120\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185290704\n", + "\n", + " \n", + "\n", + "data -0.9342\n", + "\n", + "grad 0.9797\n", + "\n", + "\n", + "\n", + "2691185291088+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185290704->2691185291088+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185290704+->2691185290704\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185487312\n", + "\n", + " \n", + "\n", + "data -1.2294\n", + "\n", + "grad 0.2217\n", + "\n", + "\n", + "\n", + "2691185487696+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185487312->2691185487696+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185487312+->2691185487312\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185290896\n", + "\n", + " \n", + "\n", + "data 0.3255\n", + "\n", + "grad 0.9797\n", + "\n", + "\n", + "\n", + "2691185290896->2691185291088+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185290896*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185290896*->2691185290896\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185487504\n", + "\n", + " \n", + "\n", + "data -0.3248\n", + "\n", + "grad 0.2217\n", + "\n", + "\n", + "\n", + "2691185487504->2691185487696+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185487504*->2691185487504\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185291088\n", + "\n", + " \n", + "\n", + "data -0.6087\n", + "\n", + "grad 0.9797\n", + "\n", + "\n", + "\n", + "2691185291472+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185291088->2691185291472+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185291088+->2691185291088\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185487696\n", + "\n", + " \n", + "\n", + "data -1.5542\n", + "\n", + "grad 0.2217\n", + "\n", + "\n", + "\n", + "2691185488080+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185487696->2691185488080+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185487696+->2691185487696\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185291280\n", + "\n", + " \n", + "\n", + "data -0.3381\n", + "\n", + "grad 0.9797\n", + "\n", + "\n", + "\n", + "2691185291280->2691185291472+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185291280*->2691185291280\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185487888\n", + "\n", + " \n", + "\n", + "data 0.5853\n", + "\n", + "grad 0.2217\n", + "\n", + "\n", + "\n", + "2691185487888->2691185488080+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185487888*->2691185487888\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185291472\n", + "\n", + " \n", + "\n", + "data -0.9468\n", + "\n", + "grad 0.9797\n", + "\n", + "\n", + "\n", + "2691185291568tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185291472->2691185291568tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185291472+->2691185291472\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185488080\n", + "\n", + " \n", + "\n", + "data -0.9689\n", + "\n", + "grad 0.2217\n", + "\n", + "\n", + "\n", + "2691185488176tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185488080->2691185488176tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185488080+->2691185488080\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185291568\n", + "\n", + " \n", + "\n", + "data -0.7383\n", + "\n", + "grad 2.1538\n", + "\n", + "\n", + "\n", + "2691185294352*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185291568->2691185294352*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185291568tanh->2691185291568\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185488176\n", + "\n", + " \n", + "\n", + "data -0.7482\n", + "\n", + "grad 0.5036\n", + "\n", + "\n", + "\n", + "2691185572256+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185488176->2691185572256+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185488176tanh->2691185488176\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185488464\n", + "\n", + " \n", + "\n", + "data 1.0000\n", + "\n", + "grad -0.1557\n", + "\n", + "\n", + "\n", + "2691185488512*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185488464->2691185488512*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185291856\n", + "\n", + " \n", + "\n", + "data -0.0921\n", + "\n", + "grad 1.4609\n", + "\n", + "\n", + "\n", + "2691185292048+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185291856->2691185292048+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185291856*->2691185291856\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185488512\n", + "\n", + " \n", + "\n", + "data 0.2881\n", + "\n", + "grad -0.5404\n", + "\n", + "\n", + "\n", + "2691185488704+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185488512->2691185488704+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185488512*->2691185488512\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185292048\n", + "\n", + " \n", + "\n", + "data -1.0830\n", + "\n", + "grad 1.4609\n", + "\n", + "\n", + "\n", + "2691185292432+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185292048->2691185292432+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185292048+->2691185292048\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185488704\n", + "\n", + " \n", + "\n", + "data 0.9822\n", + "\n", + "grad -0.5404\n", + "\n", + "\n", + "\n", + "2691185489136+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185488704->2691185489136+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185488704+->2691185488704\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185292240\n", + "\n", + " \n", + "\n", + "data 0.7646\n", + "\n", + "grad 1.4609\n", + "\n", + "\n", + "\n", + "2691185292240->2691185292432+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185292240*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185292240*->2691185292240\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185488896\n", + "\n", + " \n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.2603\n", + "\n", + "\n", + "\n", + "2691185488944*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185488896->2691185488944*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185488944\n", + "\n", + " \n", + "\n", + "data -0.4817\n", + "\n", + "grad -0.5404\n", + "\n", + "\n", + "\n", + "2691185488944->2691185489136+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185488944*->2691185488944\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185292432\n", + "\n", + " \n", + "\n", + "data -0.3184\n", + "\n", + "grad 1.4609\n", + "\n", + "\n", + "\n", + "2691185292816+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185292432->2691185292816+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185292432+->2691185292432\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185489136\n", + "\n", + " \n", + "\n", + "data 0.5005\n", + "\n", + "grad -0.5404\n", + "\n", + "\n", + "\n", + "2691185489568+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185489136->2691185489568+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185489136+->2691185489136\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185292624\n", + "\n", + " \n", + "\n", + "data 0.0484\n", + "\n", + "grad 1.4609\n", + "\n", + "\n", + "\n", + "2691185292624->2691185292816+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185292624*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185292624*->2691185292624\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185489328\n", + "\n", + " \n", + "\n", + "data -1.0000\n", + "\n", + "grad 0.2876\n", + "\n", + "\n", + "\n", + "2691185489376*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185489328->2691185489376*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185489376\n", + "\n", + " \n", + "\n", + "data 0.5322\n", + "\n", + "grad -0.5404\n", + "\n", + "\n", + "\n", + "2691185489376->2691185489568+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185489376*->2691185489376\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185292816\n", + "\n", + " \n", + "\n", + "data -0.2699\n", + "\n", + "grad 1.4609\n", + "\n", + "\n", + "\n", + "2691185293200+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185292816->2691185293200+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185292816+->2691185292816\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185489568\n", + "\n", + " \n", + "\n", + "data 1.0327\n", + "\n", + "grad -0.5404\n", + "\n", + "\n", + "\n", + "2691185489664tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185489568->2691185489664tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185489568+->2691185489568\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185293008\n", + "\n", + " \n", + "\n", + "data 0.0093\n", + "\n", + "grad 1.4609\n", + "\n", + "\n", + "\n", + "2691185293008->2691185293200+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185293008*->2691185293008\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185489664\n", + "\n", + " \n", + "\n", + "data 0.7750\n", + "\n", + "grad -1.3530\n", + "\n", + "\n", + "\n", + "2691185560016*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185489664->2691185560016*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185561744*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185489664->2691185561744*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185563472*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185489664->2691185563472*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185565200*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185489664->2691185565200*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185489664tanh->2691185489664\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185442768\n", + "\n", + " \n", + "\n", + "data 0.8562\n", + "\n", + "grad -0.0643\n", + "\n", + "\n", + "\n", + "2691185442768->2691185476032+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185442768+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185442768+->2691185442768\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185293200\n", + "\n", + " \n", + "\n", + "data -0.2607\n", + "\n", + "grad 1.4609\n", + "\n", + "\n", + "\n", + "2691185293296tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185293200->2691185293296tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185293200+->2691185293200\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185293296\n", + "\n", + " \n", + "\n", + "data -0.2549\n", + "\n", + "grad 1.5625\n", + "\n", + "\n", + "\n", + "2691185294736*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185293296->2691185294736*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185293296tanh->2691185293296\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185489952\n", + "\n", + " \n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.3230\n", + "\n", + "\n", + "\n", + "2691185490000*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185489952->2691185490000*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185490000\n", + "\n", + " \n", + "\n", + "data 0.7086\n", + "\n", + "grad 0.4559\n", + "\n", + "\n", + "\n", + "2691185490192+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185490000->2691185490192+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185490000*->2691185490000\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185490192\n", + "\n", + " \n", + "\n", + "data 1.2105\n", + "\n", + "grad 0.4559\n", + "\n", + "\n", + "\n", + "2691185490624+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185490192->2691185490624+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185490192+->2691185490192\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185293584\n", + "\n", + " \n", + "\n", + "data -0.1828\n", + "\n", + "grad -2.3694\n", + "\n", + "\n", + "\n", + "2691185293776+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185293584->2691185293776+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185293584*->2691185293584\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185490384\n", + "\n", + " \n", + "\n", + "data 1.0000\n", + "\n", + "grad -0.3894\n", + "\n", + "\n", + "\n", + "2691185490432*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185490384->2691185490432*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185293776\n", + "\n", + " \n", + "\n", + "data -1.1205\n", + "\n", + "grad -2.3694\n", + "\n", + "\n", + "\n", + "2691185294160+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185293776->2691185294160+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185293776+->2691185293776\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185490432\n", + "\n", + " \n", + "\n", + "data -0.8542\n", + "\n", + "grad 0.4559\n", + "\n", + "\n", + "\n", + "2691185490432->2691185490624+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185490432*->2691185490432\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185293968\n", + "\n", + " \n", + "\n", + "data -0.0477\n", + "\n", + "grad -2.3694\n", + "\n", + "\n", + "\n", + "2691185293968->2691185294160+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185293968*->2691185293968\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185490624\n", + "\n", + " \n", + "\n", + "data 0.3563\n", + "\n", + "grad 0.4559\n", + "\n", + "\n", + "\n", + "2691185491056+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185490624->2691185491056+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185490624+->2691185490624\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185294160\n", + "\n", + " \n", + "\n", + "data -1.1682\n", + "\n", + "grad -2.3694\n", + "\n", + "\n", + "\n", + "2691185294544+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185294160->2691185294544+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185294160+->2691185294160\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185490816\n", + "\n", + " \n", + "\n", + "data -1.0000\n", + "\n", + "grad 0.3244\n", + "\n", + "\n", + "\n", + "2691185490864*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185490816->2691185490864*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185490864\n", + "\n", + " \n", + "\n", + "data -0.7115\n", + "\n", + "grad 0.4559\n", + "\n", + "\n", + "\n", + "2691185490864->2691185491056+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185490864*->2691185490864\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185294352\n", + "\n", + " \n", + "\n", + "data 0.6711\n", + "\n", + "grad -2.3694\n", + "\n", + "\n", + "\n", + "2691185294352->2691185294544+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185294352*->2691185294352\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185491056\n", + "\n", + " \n", + "\n", + "data -0.3552\n", + "\n", + "grad 0.4559\n", + "\n", + "\n", + "\n", + "2691185491152tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185491056->2691185491152tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185491056+->2691185491056\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185491152\n", + "\n", + " \n", + "\n", + "data -0.3410\n", + "\n", + "grad 0.5158\n", + "\n", + "\n", + "\n", + "2691185560400*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185491152->2691185560400*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185562128*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185491152->2691185562128*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185563856*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185491152->2691185563856*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185565584*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185491152->2691185565584*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185491152tanh->2691185491152\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185294544\n", + "\n", + " \n", + "\n", + "data -0.4971\n", + "\n", + "grad -2.3694\n", + "\n", + "\n", + "\n", + "2691185294928+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185294544->2691185294928+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185294544+->2691185294544\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185294736\n", + "\n", + " \n", + "\n", + "data 0.1681\n", + "\n", + "grad -2.3694\n", + "\n", + "\n", + "\n", + "2691185294736->2691185294928+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185294736*->2691185294736\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185491440\n", + "\n", + " \n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.1263\n", + "\n", + "\n", + "\n", + "2691185491488*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185491440->2691185491488*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185491488\n", + "\n", + " \n", + "\n", + "data -0.2127\n", + "\n", + "grad -0.5937\n", + "\n", + "\n", + "\n", + "2691185491680+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185491488->2691185491680+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185491488*->2691185491488\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185294928\n", + "\n", + " \n", + "\n", + "data -0.3290\n", + "\n", + "grad -2.3694\n", + "\n", + "\n", + "\n", + "2691185295024tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185294928->2691185295024tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185294928+->2691185294928\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185295024\n", + "\n", + " \n", + "\n", + "data -0.3176\n", + "\n", + "grad -2.6352\n", + "\n", + "\n", + "\n", + "2691185571536+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185295024->2691185571536+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185295024tanh->2691185295024\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185491680\n", + "\n", + " \n", + "\n", + "data 0.4517\n", + "\n", + "grad -0.5937\n", + "\n", + "\n", + "\n", + "2691185557712+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185491680->2691185557712+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185491680+->2691185491680\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185491872\n", + "\n", + " \n", + "\n", + "data 1.0000\n", + "\n", + "grad -0.1277\n", + "\n", + "\n", + "\n", + "2691185491920*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185491872->2691185491920*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185295312\n", + "\n", + " \n", + "\n", + "data 3.0000\n", + "\n", + "grad 0.0026\n", + "\n", + "\n", + "\n", + "2691185426496*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185295312->2691185426496*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185491920\n", + "\n", + " \n", + "\n", + "data 0.2151\n", + "\n", + "grad -0.5937\n", + "\n", + "\n", + "\n", + "2691185491920->2691185557712+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185491920*->2691185491920\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185426496\n", + "\n", + " \n", + "\n", + "data 0.8644\n", + "\n", + "grad 0.0092\n", + "\n", + "\n", + "\n", + "2691185426688+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185426496->2691185426688+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185426496*->2691185426496\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185557712\n", + "\n", + " \n", + "\n", + "data 0.6668\n", + "\n", + "grad -0.5937\n", + "\n", + "\n", + "\n", + "2691185558144+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185557712->2691185558144+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185557712+->2691185557712\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185426688\n", + "\n", + " \n", + "\n", + "data 1.5584\n", + "\n", + "grad 0.0092\n", + "\n", + "\n", + "\n", + "2691185427120+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185426688->2691185427120+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185426688+->2691185426688\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185557904\n", + "\n", + " \n", + "\n", + "data -1.0000\n", + "\n", + "grad -0.1764\n", + "\n", + "\n", + "\n", + "2691185557952*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185557904->2691185557952*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185557952\n", + "\n", + " \n", + "\n", + "data -0.2971\n", + "\n", + "grad -0.5937\n", + "\n", + "\n", + "\n", + "2691185557952->2691185558144+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185557952*->2691185557952\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185426880\n", + "\n", + " \n", + "\n", + "data -1.0000\n", + "\n", + "grad -0.0044\n", + "\n", + "\n", + "\n", + "2691185426928*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185426880->2691185426928*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185426928\n", + "\n", + " \n", + "\n", + "data 0.4817\n", + "\n", + "grad 0.0092\n", + "\n", + "\n", + "\n", + "2691185426928->2691185427120+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185426928*->2691185426928\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185558144\n", + "\n", + " \n", + "\n", + "data 0.3697\n", + "\n", + "grad -0.5937\n", + "\n", + "\n", + "\n", + "2691185558240tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185558144->2691185558240tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185558144+->2691185558144\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185427120\n", + "\n", + " \n", + "\n", + "data 2.0401\n", + "\n", + "grad 0.0092\n", + "\n", + "\n", + "\n", + "2691185427552+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185427120->2691185427552+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185427120+->2691185427120\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185558240\n", + "\n", + " \n", + "\n", + "data 0.3538\n", + "\n", + "grad -0.6787\n", + "\n", + "\n", + "\n", + "2691185560784*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185558240->2691185560784*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185562512*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185558240->2691185562512*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185564240*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185558240->2691185564240*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185565968*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185558240->2691185565968*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185558240tanh->2691185558240\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185427312\n", + "\n", + " \n", + "\n", + "data 0.5000\n", + "\n", + "grad -0.0049\n", + "\n", + "\n", + "\n", + "2691185427360*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185427312->2691185427360*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185427360\n", + "\n", + " \n", + "\n", + "data -0.2661\n", + "\n", + "grad 0.0092\n", + "\n", + "\n", + "\n", + "2691185427360->2691185427552+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185427360*->2691185427360\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185558528\n", + "\n", + " \n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.1099\n", + "\n", + "\n", + "\n", + "2691185558576*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185558528->2691185558576*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185558576\n", + "\n", + " \n", + "\n", + "data -0.6068\n", + "\n", + "grad -0.1810\n", + "\n", + "\n", + "\n", + "2691185558768+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185558576->2691185558768+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185558576*->2691185558576\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185427552\n", + "\n", + " \n", + "\n", + "data 1.7740\n", + "\n", + "grad 0.0092\n", + "\n", + "\n", + "\n", + "2691185427648tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185427552->2691185427648tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185427552+->2691185427552\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185427648\n", + "\n", + " \n", + "\n", + "data 0.9440\n", + "\n", + "grad 0.0844\n", + "\n", + "\n", + "\n", + "2691185432400*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185427648->2691185432400*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185434128*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185427648->2691185434128*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185435856*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185427648->2691185435856*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185437584*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185427648->2691185437584*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185427648tanh->2691185427648\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185558768\n", + "\n", + " \n", + "\n", + "data -0.6340\n", + "\n", + "grad -0.1810\n", + "\n", + "\n", + "\n", + "2691185559200+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185558768->2691185559200+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185558768+->2691185558768\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185558960\n", + "\n", + " \n", + "\n", + "data 1.0000\n", + "\n", + "grad -0.0552\n", + "\n", + "\n", + "\n", + "2691185559008*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185558960->2691185559008*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185559008\n", + "\n", + " \n", + "\n", + "data 0.3051\n", + "\n", + "grad -0.1810\n", + "\n", + "\n", + "\n", + "2691185559008->2691185559200+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185559008*->2691185559008\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185427936\n", + "\n", + " \n", + "\n", + "data 3.0000\n", + "\n", + "grad -0.0004\n", + "\n", + "\n", + "\n", + "2691185427984*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185427936->2691185427984*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185427984\n", + "\n", + " \n", + "\n", + "data 2.1259\n", + "\n", + "grad -0.0006\n", + "\n", + "\n", + "\n", + "2691185428176+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185427984->2691185428176+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185427984*->2691185427984\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185559200\n", + "\n", + " \n", + "\n", + "data -0.3289\n", + "\n", + "grad -0.1810\n", + "\n", + "\n", + "\n", + "2691185559632+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185559200->2691185559632+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185559200+->2691185559200\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185428176\n", + "\n", + " \n", + "\n", + "data 2.6278\n", + "\n", + "grad -0.0006\n", + "\n", + "\n", + "\n", + "2691185428608+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185428176->2691185428608+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185428176+->2691185428176\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185559392\n", + "\n", + " \n", + "\n", + "data -1.0000\n", + "\n", + "grad -0.0339\n", + "\n", + "\n", + "\n", + "2691185559440*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185559392->2691185559440*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185559440\n", + "\n", + " \n", + "\n", + "data -0.1872\n", + "\n", + "grad -0.1810\n", + "\n", + "\n", + "\n", + "2691185559440->2691185559632+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185559440*->2691185559440\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185428368\n", + "\n", + " \n", + "\n", + "data -1.0000\n", + "\n", + "grad 0.0005\n", + "\n", + "\n", + "\n", + "2691185428416*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185428368->2691185428416*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185428416\n", + "\n", + " \n", + "\n", + "data 0.8542\n", + "\n", + "grad -0.0006\n", + "\n", + "\n", + "\n", + "2691185428416->2691185428608+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185428416*->2691185428416\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185068064\n", + "\n", + " \n", + "\n", + "data -0.5322\n", + "\n", + "grad 2.1486\n", + "\n", + "\n", + "\n", + "2691185068064->2691185288880*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185068064->2691185489376*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185068064->2691185427360*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185441952*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185068064->2691185441952*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185559632\n", + "\n", + " \n", + "\n", + "data -0.5161\n", + "\n", + "grad -0.1810\n", + "\n", + "\n", + "\n", + "2691185559728tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185559632->2691185559728tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185559632+->2691185559632\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185428608\n", + "\n", + " \n", + "\n", + "data 3.4820\n", + "\n", + "grad -0.0006\n", + "\n", + "\n", + "\n", + "2691185429040+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185428608->2691185429040+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185428608+->2691185428608\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185559728\n", + "\n", + " \n", + "\n", + "data -0.4747\n", + "\n", + "grad -0.2337\n", + "\n", + "\n", + "\n", + "2691185561168*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185559728->2691185561168*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185562896*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185559728->2691185562896*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185564624*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185559728->2691185564624*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185566352*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185559728->2691185566352*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185559728tanh->2691185559728\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185428800\n", + "\n", + " \n", + "\n", + "data 0.5000\n", + "\n", + "grad -0.0004\n", + "\n", + "\n", + "\n", + "2691185428848*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185428800->2691185428848*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185428848\n", + "\n", + " \n", + "\n", + "data 0.3558\n", + "\n", + "grad -0.0006\n", + "\n", + "\n", + "\n", + "2691185428848->2691185429040+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185428848*->2691185428848\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185560016\n", + "\n", + " \n", + "\n", + "data -0.6210\n", + "\n", + "grad 1.8885\n", + "\n", + "\n", + "\n", + "2691185560208+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185560016->2691185560208+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185560016*->2691185560016\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185429040\n", + "\n", + " \n", + "\n", + "data 3.8377\n", + "\n", + "grad -0.0006\n", + "\n", + "\n", + "\n", + "2691185429136tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185429040->2691185429136tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185429040+->2691185429040\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185560208\n", + "\n", + " \n", + "\n", + "data 0.2016\n", + "\n", + "grad 1.8885\n", + "\n", + "\n", + "\n", + "2691185560592+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185560208->2691185560592+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185560208+->2691185560208\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185429136\n", + "\n", + " \n", + "\n", + "data 0.9991\n", + "\n", + "grad -0.3096\n", + "\n", + "\n", + "\n", + "2691185432784*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185429136->2691185432784*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185434512*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185429136->2691185434512*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185436240*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185429136->2691185436240*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185437968*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185429136->2691185437968*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185429136tanh->2691185429136\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185560400\n", + "\n", + " \n", + "\n", + "data -0.0822\n", + "\n", + "grad 1.8885\n", + "\n", + "\n", + "\n", + "2691185560400->2691185560592+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185560400*->2691185560400\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185429424\n", + "\n", + " \n", + "\n", + "data 3.0000\n", + "\n", + "grad 0.0155\n", + "\n", + "\n", + "\n", + "2691185429472*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185429424->2691185429472*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185429472\n", + "\n", + " \n", + "\n", + "data -0.6380\n", + "\n", + "grad -0.0730\n", + "\n", + "\n", + "\n", + "2691185429664+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185429472->2691185429664+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185429472*->2691185429472\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185560592\n", + "\n", + " \n", + "\n", + "data 0.1194\n", + "\n", + "grad 1.8885\n", + "\n", + "\n", + "\n", + "2691185560976+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185560592->2691185560976+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185560592+->2691185560592\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185429664\n", + "\n", + " \n", + "\n", + "data 0.0264\n", + "\n", + "grad -0.0730\n", + "\n", + "\n", + "\n", + "2691185430096+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185429664->2691185430096+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185429664+->2691185429664\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185560784\n", + "\n", + " \n", + "\n", + "data -0.2859\n", + "\n", + "grad 1.8885\n", + "\n", + "\n", + "\n", + "2691185560784->2691185560976+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185560784*->2691185560784\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185429856\n", + "\n", + " \n", + "\n", + "data -1.0000\n", + "\n", + "grad -0.0157\n", + "\n", + "\n", + "\n", + "2691185429904*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185429856->2691185429904*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185560976\n", + "\n", + " \n", + "\n", + "data -0.1665\n", + "\n", + "grad 1.8885\n", + "\n", + "\n", + "\n", + "2691185561360+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185560976->2691185561360+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185560976+->2691185560976\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185429904\n", + "\n", + " \n", + "\n", + "data -0.2151\n", + "\n", + "grad -0.0730\n", + "\n", + "\n", + "\n", + "2691185429904->2691185430096+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185429904*->2691185429904\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185561168\n", + "\n", + " \n", + "\n", + "data 0.3052\n", + "\n", + "grad 1.8885\n", + "\n", + "\n", + "\n", + "2691185561168->2691185561360+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185561168*->2691185561168\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185430096\n", + "\n", + " \n", + "\n", + "data -0.1887\n", + "\n", + "grad -0.0730\n", + "\n", + "\n", + "\n", + "2691185430528+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185430096->2691185430528+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185430096+->2691185430096\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185561360\n", + "\n", + " \n", + "\n", + "data 0.1387\n", + "\n", + "grad 1.8885\n", + "\n", + "\n", + "\n", + "2691185561456tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185561360->2691185561456tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185561360+->2691185561360\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185430288\n", + "\n", + " \n", + "\n", + "data 0.5000\n", + "\n", + "grad -0.0217\n", + "\n", + "\n", + "\n", + "2691185430336*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185430288->2691185430336*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185430336\n", + "\n", + " \n", + "\n", + "data 0.1485\n", + "\n", + "grad -0.0730\n", + "\n", + "\n", + "\n", + "2691185430336->2691185430528+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185430336*->2691185430336\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185561456\n", + "\n", + " \n", + "\n", + "data 0.1378\n", + "\n", + "grad 1.9250\n", + "\n", + "\n", + "\n", + "2691185566928*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185561456->2691185566928*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185561456tanh->2691185561456\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185430528\n", + "\n", + " \n", + "\n", + "data -0.0401\n", + "\n", + "grad -0.0730\n", + "\n", + "\n", + "\n", + "2691185430624tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185430528->2691185430624tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185430528+->2691185430528\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185430624\n", + "\n", + " \n", + "\n", + "data -0.0401\n", + "\n", + "grad -0.0732\n", + "\n", + "\n", + "\n", + "2691185433168*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185430624->2691185433168*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185434896*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185430624->2691185434896*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185436624*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185430624->2691185436624*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185438352*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185430624->2691185438352*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185430624tanh->2691185430624\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185561744\n", + "\n", + " \n", + "\n", + "data 0.0459\n", + "\n", + "grad -0.0732\n", + "\n", + "\n", + "\n", + "2691185561936+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185561744->2691185561936+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185561744*->2691185561744\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185561936\n", + "\n", + " \n", + "\n", + "data -0.9187\n", + "\n", + "grad -0.0732\n", + "\n", + "\n", + "\n", + "2691185562320+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185561936->2691185562320+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185561936+->2691185561936\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185430912\n", + "\n", + " \n", + "\n", + "data 3.0000\n", + "\n", + "grad 0.0082\n", + "\n", + "\n", + "\n", + "2691185430960*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185430912->2691185430960*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185430960\n", + "\n", + " \n", + "\n", + "data -1.8205\n", + "\n", + "grad -0.0134\n", + "\n", + "\n", + "\n", + "2691185431152+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185430960->2691185431152+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185430960*->2691185430960\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185562128\n", + "\n", + " \n", + "\n", + "data -0.2855\n", + "\n", + "grad -0.0732\n", + "\n", + "\n", + "\n", + "2691185562128->2691185562320+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185562128*->2691185562128\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185431152\n", + "\n", + " \n", + "\n", + "data -1.8477\n", + "\n", + "grad -0.0134\n", + "\n", + "\n", + "\n", + "2691185431584+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185431152->2691185431584+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185431152+->2691185431152\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185562320\n", + "\n", + " \n", + "\n", + "data -1.2042\n", + "\n", + "grad -0.0732\n", + "\n", + "\n", + "\n", + "2691185562704+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185562320->2691185562704+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185562320+->2691185562320\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185431344\n", + "\n", + " \n", + "\n", + "data -1.0000\n", + "\n", + "grad -0.0041\n", + "\n", + "\n", + "\n", + "2691185431392*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185431344->2691185431392*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185431392\n", + "\n", + " \n", + "\n", + "data -0.3051\n", + "\n", + "grad -0.0134\n", + "\n", + "\n", + "\n", + "2691185431392->2691185431584+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185431392*->2691185431392\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185562512\n", + "\n", + " \n", + "\n", + "data 0.3328\n", + "\n", + "grad -0.0732\n", + "\n", + "\n", + "\n", + "2691185562512->2691185562704+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185562512*->2691185562512\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185431584\n", + "\n", + " \n", + "\n", + "data -2.1528\n", + "\n", + "grad -0.0134\n", + "\n", + "\n", + "\n", + "2691185432016+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185431584->2691185432016+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185431584+->2691185431584\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185562704\n", + "\n", + " \n", + "\n", + "data -0.8714\n", + "\n", + "grad -0.0732\n", + "\n", + "\n", + "\n", + "2691185563088+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185562704->2691185563088+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185562704+->2691185562704\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185431776\n", + "\n", + " \n", + "\n", + "data 0.5000\n", + "\n", + "grad -0.0025\n", + "\n", + "\n", + "\n", + "2691185431824*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185431776->2691185431824*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185562896\n", + "\n", + " \n", + "\n", + "data 0.0699\n", + "\n", + "grad -0.0732\n", + "\n", + "\n", + "\n", + "2691185562896->2691185563088+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185562896*->2691185562896\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185431824\n", + "\n", + " \n", + "\n", + "data 0.0936\n", + "\n", + "grad -0.0134\n", + "\n", + "\n", + "\n", + "2691185431824->2691185432016+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185431824*->2691185431824\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185563088\n", + "\n", + " \n", + "\n", + "data -0.8015\n", + "\n", + "grad -0.0732\n", + "\n", + "\n", + "\n", + "2691185563184tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185563088->2691185563184tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185563088+->2691185563088\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185432016\n", + "\n", + " \n", + "\n", + "data -2.0592\n", + "\n", + "grad -0.0134\n", + "\n", + "\n", + "\n", + "2691185432112tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185432016->2691185432112tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185432016+->2691185432016\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185563184\n", + "\n", + " \n", + "\n", + "data -0.6649\n", + "\n", + "grad -0.1312\n", + "\n", + "\n", + "\n", + "2691185567312*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185563184->2691185567312*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185563184tanh->2691185563184\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185432112\n", + "\n", + " \n", + "\n", + "data -0.9680\n", + "\n", + "grad -0.2133\n", + "\n", + "\n", + "\n", + "2691185433552*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185432112->2691185433552*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185435280*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185432112->2691185435280*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185437008*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185432112->2691185437008*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185438736*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185432112->2691185438736*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185432112tanh->2691185432112\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185563472\n", + "\n", + " \n", + "\n", + "data 0.2068\n", + "\n", + "grad 1.3747\n", + "\n", + "\n", + "\n", + "2691185563664+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185563472->2691185563664+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185563472*->2691185563472\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185432400\n", + "\n", + " \n", + "\n", + "data -0.7565\n", + "\n", + "grad -0.2709\n", + "\n", + "\n", + "\n", + "2691185432592+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185432400->2691185432592+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185432400*->2691185432400\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185563664\n", + "\n", + " \n", + "\n", + "data -0.3223\n", + "\n", + "grad 1.3747\n", + "\n", + "\n", + "\n", + "2691185564048+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185563664->2691185564048+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185563664+->2691185563664\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185432592\n", + "\n", + " \n", + "\n", + "data 0.0662\n", + "\n", + "grad -0.2709\n", + "\n", + "\n", + "\n", + "2691185432976+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185432592->2691185432976+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185432592+->2691185432592\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185563856\n", + "\n", + " \n", + "\n", + "data -0.1935\n", + "\n", + "grad 1.3747\n", + "\n", + "\n", + "\n", + "2691185563856->2691185564048+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185563856*->2691185563856\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185432784\n", + "\n", + " \n", + "\n", + "data 0.2409\n", + "\n", + "grad -0.2709\n", + "\n", + "\n", + "\n", + "2691185432784->2691185432976+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185432784*->2691185432784\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185564048\n", + "\n", + " \n", + "\n", + "data -0.5158\n", + "\n", + "grad 1.3747\n", + "\n", + "\n", + "\n", + "2691185564432+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185564048->2691185564432+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185564048+->2691185564048\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185432976\n", + "\n", + " \n", + "\n", + "data 0.3071\n", + "\n", + "grad -0.2709\n", + "\n", + "\n", + "\n", + "2691185433360+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185432976->2691185433360+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185432976+->2691185432976\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185564240\n", + "\n", + " \n", + "\n", + "data 0.2181\n", + "\n", + "grad 1.3747\n", + "\n", + "\n", + "\n", + "2691185564240->2691185564432+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185564240*->2691185564240\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185433168\n", + "\n", + " \n", + "\n", + "data 0.0324\n", + "\n", + "grad -0.2709\n", + "\n", + "\n", + "\n", + "2691185433168->2691185433360+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185433168*->2691185433168\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185564432\n", + "\n", + " \n", + "\n", + "data -0.2977\n", + "\n", + "grad 1.3747\n", + "\n", + "\n", + "\n", + "2691185564816+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185564432->2691185564816+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185564432+->2691185564432\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185433360\n", + "\n", + " \n", + "\n", + "data 0.3395\n", + "\n", + "grad -0.2709\n", + "\n", + "\n", + "\n", + "2691185433744+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185433360->2691185433744+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185433360+->2691185433360\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185564624\n", + "\n", + " \n", + "\n", + "data -0.3400\n", + "\n", + "grad 1.3747\n", + "\n", + "\n", + "\n", + "2691185564624->2691185564816+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185564624*->2691185564624\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185433552\n", + "\n", + " \n", + "\n", + "data 0.6224\n", + "\n", + "grad -0.2709\n", + "\n", + "\n", + "\n", + "2691185433552->2691185433744+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185433552*->2691185433552\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185564816\n", + "\n", + " \n", + "\n", + "data -0.6377\n", + "\n", + "grad 1.3747\n", + "\n", + "\n", + "\n", + "2691185564912tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185564816->2691185564912tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185564816+->2691185564816\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185433744\n", + "\n", + " \n", + "\n", + "data 0.9619\n", + "\n", + "grad -0.2709\n", + "\n", + "\n", + "\n", + "2691185433840tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185433744->2691185433840tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185433744+->2691185433744\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185564912\n", + "\n", + " \n", + "\n", + "data -0.5633\n", + "\n", + "grad 2.0137\n", + "\n", + "\n", + "\n", + "2691185567696*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185564912->2691185567696*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185564912tanh->2691185564912\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185433840\n", + "\n", + " \n", + "\n", + "data 0.7451\n", + "\n", + "grad -0.6091\n", + "\n", + "\n", + "\n", + "2691185439312*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185433840->2691185439312*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185433840tanh->2691185433840\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185073536\n", + "\n", + " \n", + "\n", + "data -0.4817\n", + "\n", + "grad -4.9832\n", + "\n", + "\n", + "\n", + "2691185073536->2691185285616*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185073536->2691185488944*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185073536->2691185426928*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185441520*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185073536->2691185441520*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185073632\n", + "\n", + " \n", + "\n", + "data -2.5625\n", + "\n", + "grad -0.0673\n", + "\n", + "\n", + "\n", + "2691185073632->2691185178032+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185073632*->2691185073632\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185565200\n", + "\n", + " \n", + "\n", + "data -0.2081\n", + "\n", + "grad 0.7534\n", + "\n", + "\n", + "\n", + "2691185565392+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185565200->2691185565392+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185565200*->2691185565200\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185434128\n", + "\n", + " \n", + "\n", + "data 0.0559\n", + "\n", + "grad 0.0415\n", + "\n", + "\n", + "\n", + "2691185434320+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185434128->2691185434320+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185434128*->2691185434128\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185565392\n", + "\n", + " \n", + "\n", + "data -1.1990\n", + "\n", + "grad 0.7534\n", + "\n", + "\n", + "\n", + "2691185565776+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185565392->2691185565776+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185565392+->2691185565392\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185434320\n", + "\n", + " \n", + "\n", + "data -0.9087\n", + "\n", + "grad 0.0415\n", + "\n", + "\n", + "\n", + "2691185434704+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185434320->2691185434704+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185434320+->2691185434320\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185074016\n", + "\n", + " \n", + "\n", + "data 0.2881\n", + "\n", + "grad -3.4843\n", + "\n", + "\n", + "\n", + "2691185074016->2691185286768*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185074016->2691185488512*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185074016->2691185426496*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185441088*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185074016->2691185441088*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185434512\n", + "\n", + " \n", + "\n", + "data 0.8364\n", + "\n", + "grad 0.0415\n", + "\n", + "\n", + "\n", + "2691185434512->2691185434704+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185434512*->2691185434512\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185565584\n", + "\n", + " \n", + "\n", + "data 0.2979\n", + "\n", + "grad 0.7534\n", + "\n", + "\n", + "\n", + "2691185565584->2691185565776+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185565584*->2691185565584\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185565776\n", + "\n", + " \n", + "\n", + "data -0.9011\n", + "\n", + "grad 0.7534\n", + "\n", + "\n", + "\n", + "2691185566160+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185565776->2691185566160+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185565776+->2691185565776\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185434704\n", + "\n", + " \n", + "\n", + "data -0.0723\n", + "\n", + "grad 0.0415\n", + "\n", + "\n", + "\n", + "2691185435088+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185434704->2691185435088+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185434704+->2691185434704\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185565968\n", + "\n", + " \n", + "\n", + "data 0.0324\n", + "\n", + "grad 0.7534\n", + "\n", + "\n", + "\n", + "2691185565968->2691185566160+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185565968*->2691185565968\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185434896\n", + "\n", + " \n", + "\n", + "data -0.0377\n", + "\n", + "grad 0.0415\n", + "\n", + "\n", + "\n", + "2691185434896->2691185435088+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185434896*->2691185434896\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185566160\n", + "\n", + " \n", + "\n", + "data -0.8686\n", + "\n", + "grad 0.7534\n", + "\n", + "\n", + "\n", + "2691185566544+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185566160->2691185566544+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185566160+->2691185566160\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185435088\n", + "\n", + " \n", + "\n", + "data -0.1100\n", + "\n", + "grad 0.0415\n", + "\n", + "\n", + "\n", + "2691185435472+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185435088->2691185435472+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185435088+->2691185435088\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185074784\n", + "\n", + " \n", + "\n", + "data -0.6594\n", + "\n", + "grad 1.2686\n", + "\n", + "\n", + "\n", + "2691185074784->2691185487888*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185074784->2691185294736*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185568080*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185074784->2691185568080*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185440464*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185074784->2691185440464*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185074832\n", + "\n", + " \n", + "\n", + "data -0.9378\n", + "\n", + "grad -3.6621\n", + "\n", + "\n", + "\n", + "2691185074832->2691185486928+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185074832->2691185293776+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185567120+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185074832->2691185567120+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185439504+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185074832->2691185439504+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185566352\n", + "\n", + " \n", + "\n", + "data 0.0093\n", + "\n", + "grad 0.7534\n", + "\n", + "\n", + "\n", + "2691185566352->2691185566544+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185566352*->2691185566352\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185435280\n", + "\n", + " \n", + "\n", + "data 0.1426\n", + "\n", + "grad 0.0415\n", + "\n", + "\n", + "\n", + "2691185435280->2691185435472+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185435280*->2691185435280\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185074928\n", + "\n", + " \n", + "\n", + "data -0.9090\n", + "\n", + "grad 2.7933\n", + "\n", + "\n", + "\n", + "2691185074928->2691185487504*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185074928->2691185294352*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185074928->2691185567696*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185440080*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185074928->2691185440080*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185075024\n", + "\n", + " \n", + "\n", + "data 0.0592\n", + "\n", + "grad 3.4573\n", + "\n", + "\n", + "\n", + "2691185075024->2691185487120*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185075024->2691185293968*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185075024->2691185567312*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185439696*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185075024->2691185439696*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185566544\n", + "\n", + " \n", + "\n", + "data -0.8593\n", + "\n", + "grad 0.7534\n", + "\n", + "\n", + "\n", + "2691185566640tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185566544->2691185566640tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185566544+->2691185566544\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185435472\n", + "\n", + " \n", + "\n", + "data 0.0326\n", + "\n", + "grad 0.0415\n", + "\n", + "\n", + "\n", + "2691185435568tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185435472->2691185435568tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185435472+->2691185435472\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185566640\n", + "\n", + " \n", + "\n", + "data -0.6959\n", + "\n", + "grad 1.4608\n", + "\n", + "\n", + "\n", + "2691185566640->2691185568080*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185566640tanh->2691185566640\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185435568\n", + "\n", + " \n", + "\n", + "data 0.0326\n", + "\n", + "grad 0.0415\n", + "\n", + "\n", + "\n", + "2691185435568->2691185439696*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185435568tanh->2691185435568\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185566928\n", + "\n", + " \n", + "\n", + "data -0.1197\n", + "\n", + "grad -2.2152\n", + "\n", + "\n", + "\n", + "2691185566928->2691185567120+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185566928*->2691185566928\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185435856\n", + "\n", + " \n", + "\n", + "data 0.2519\n", + "\n", + "grad -0.5331\n", + "\n", + "\n", + "\n", + "2691185436048+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185435856->2691185436048+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185435856*->2691185435856\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185567120\n", + "\n", + " \n", + "\n", + "data -1.0575\n", + "\n", + "grad -2.2152\n", + "\n", + "\n", + "\n", + "2691185567504+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185567120->2691185567504+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185567120+->2691185567120\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185436048\n", + "\n", + " \n", + "\n", + "data -0.2772\n", + "\n", + "grad -0.5331\n", + "\n", + "\n", + "\n", + "2691185436432+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185436048->2691185436432+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185436048+->2691185436048\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185567312\n", + "\n", + " \n", + "\n", + "data -0.0394\n", + "\n", + "grad -2.2152\n", + "\n", + "\n", + "\n", + "2691185567312->2691185567504+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185567312*->2691185567312\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185436240\n", + "\n", + " \n", + "\n", + "data 0.5668\n", + "\n", + "grad -0.5331\n", + "\n", + "\n", + "\n", + "2691185436240->2691185436432+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185436240*->2691185436240\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185567504\n", + "\n", + " \n", + "\n", + "data -1.0969\n", + "\n", + "grad -2.2152\n", + "\n", + "\n", + "\n", + "2691185567888+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185567504->2691185567888+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185567504+->2691185567504\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185436432\n", + "\n", + " \n", + "\n", + "data 0.2896\n", + "\n", + "grad -0.5331\n", + "\n", + "\n", + "\n", + "2691185436816+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185436432->2691185436816+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185436432+->2691185436432\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185567696\n", + "\n", + " \n", + "\n", + "data 0.5121\n", + "\n", + "grad -2.2152\n", + "\n", + "\n", + "\n", + "2691185567696->2691185567888+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185567696*->2691185567696\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185436624\n", + "\n", + " \n", + "\n", + "data -0.0247\n", + "\n", + "grad -0.5331\n", + "\n", + "\n", + "\n", + "2691185436624->2691185436816+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185436624*->2691185436624\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185567888\n", + "\n", + " \n", + "\n", + "data -0.5848\n", + "\n", + "grad -2.2152\n", + "\n", + "\n", + "\n", + "2691185568272+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185567888->2691185568272+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185567888+->2691185567888\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185436816\n", + "\n", + " \n", + "\n", + "data 0.2649\n", + "\n", + "grad -0.5331\n", + "\n", + "\n", + "\n", + "2691185437200+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185436816->2691185437200+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185436816+->2691185436816\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076464\n", + "\n", + " \n", + "\n", + "data -0.8690\n", + "\n", + "grad -0.2032\n", + "\n", + "\n", + "\n", + "2691185076464->2691185486736*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076464->2691185293584*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076464->2691185566928*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076464->2691185439312*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076560\n", + "\n", + " \n", + "\n", + "data 0.5674\n", + "\n", + "grad -1.9666\n", + "\n", + "\n", + "\n", + "2691185076560->2691185483664*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076560->2691185290512*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076560->2691185563856*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076560->2691185436240*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185568080\n", + "\n", + " \n", + "\n", + "data 0.4589\n", + "\n", + "grad -2.2152\n", + "\n", + "\n", + "\n", + "2691185568080->2691185568272+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185568080*->2691185568080\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185437008\n", + "\n", + " \n", + "\n", + "data -0.6933\n", + "\n", + "grad -0.5331\n", + "\n", + "\n", + "\n", + "2691185437008->2691185437200+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185437008*->2691185437008\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076608\n", + "\n", + " \n", + "\n", + "data 0.7163\n", + "\n", + "grad -0.6271\n", + "\n", + "\n", + "\n", + "2691185076608->2691185484432*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076608->2691185291280*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076608->2691185564624*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076608->2691185437008*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076656\n", + "\n", + " \n", + "\n", + "data -0.5292\n", + "\n", + "grad 1.6455\n", + "\n", + "\n", + "\n", + "2691185076656->2691185483472+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076656->2691185290320+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076656->2691185563664+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076656->2691185436048+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185568272\n", + "\n", + " \n", + "\n", + "data -0.1259\n", + "\n", + "grad -2.2152\n", + "\n", + "\n", + "\n", + "2691185568368tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185568272->2691185568368tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185568272+->2691185568272\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185437200\n", + "\n", + " \n", + "\n", + "data -0.4284\n", + "\n", + "grad -0.5331\n", + "\n", + "\n", + "\n", + "2691185437296tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185437200->2691185437296tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185437200+->2691185437200\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076800\n", + "\n", + " \n", + "\n", + "data -0.8737\n", + "\n", + "grad -1.5813\n", + "\n", + "\n", + "\n", + "2691185076800->2691185485392*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076800->2691185292240*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076800->2691185565584*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076800->2691185437968*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185568368\n", + "\n", + " \n", + "\n", + "data -0.1253\n", + "\n", + "grad -2.2505\n", + "\n", + "\n", + "\n", + "2691185572688+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185568368->2691185572688+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185568368tanh->2691185568368\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076848\n", + "\n", + " \n", + "\n", + "data -0.0197\n", + "\n", + "grad -1.0262\n", + "\n", + "\n", + "\n", + "2691185076848->2691185486160*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076848->2691185293008*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076848->2691185566352*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076848->2691185438736*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185437296\n", + "\n", + " \n", + "\n", + "data -0.4040\n", + "\n", + "grad -0.6371\n", + "\n", + "\n", + "\n", + "2691185437296->2691185440080*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185437296tanh->2691185437296\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076944\n", + "\n", + " \n", + "\n", + "data 0.0917\n", + "\n", + "grad 1.0143\n", + "\n", + "\n", + "\n", + "2691185076944->2691185485776*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076944->2691185292624*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076944->2691185565968*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076944->2691185438352*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076992\n", + "\n", + " \n", + "\n", + "data -0.2685\n", + "\n", + "grad 1.0651\n", + "\n", + "\n", + "\n", + "2691185076992->2691185485008*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076992->2691185291856*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076992->2691185565200*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185076992->2691185437584*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077040\n", + "\n", + " \n", + "\n", + "data 0.6165\n", + "\n", + "grad 0.8861\n", + "\n", + "\n", + "\n", + "2691185077040->2691185484048*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077040->2691185290896*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077040->2691185564240*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077040->2691185436624*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077088\n", + "\n", + " \n", + "\n", + "data 0.2669\n", + "\n", + "grad 0.9287\n", + "\n", + "\n", + "\n", + "2691185077088->2691185483280*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077088->2691185290128*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077088->2691185563472*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077088->2691185435856*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077136\n", + "\n", + " \n", + "\n", + "data 0.8372\n", + "\n", + "grad 0.1173\n", + "\n", + "\n", + "\n", + "2691185077136->2691185279760*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077136->2691185481936*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077136->2691185562128*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077136->2691185434512*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185437584\n", + "\n", + " \n", + "\n", + "data -0.2535\n", + "\n", + "grad -0.0268\n", + "\n", + "\n", + "\n", + "2691185437776+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185437584->2691185437776+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185437584*->2691185437584\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077184\n", + "\n", + " \n", + "\n", + "data 0.0592\n", + "\n", + "grad -0.0367\n", + "\n", + "\n", + "\n", + "2691185077184->2691185280288*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077184->2691185481552*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077184->2691185561744*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077184->2691185434128*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077280\n", + "\n", + " \n", + "\n", + "data 0.9408\n", + "\n", + "grad -0.0440\n", + "\n", + "\n", + "\n", + "2691185077280->2691185279136*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077280->2691185482320*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077280->2691185562512*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077280->2691185434896*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077328\n", + "\n", + " \n", + "\n", + "data 0.8226\n", + "\n", + "grad 3.4168\n", + "\n", + "\n", + "\n", + "2691185077328->2691185280624+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077328->2691185480016+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077328->2691185560208+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077328->2691185432592+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185437776\n", + "\n", + " \n", + "\n", + "data -1.2444\n", + "\n", + "grad -0.0268\n", + "\n", + "\n", + "\n", + "2691185438160+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185437776->2691185438160+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185437776+->2691185437776\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077424\n", + "\n", + " \n", + "\n", + "data -0.9646\n", + "\n", + "grad -0.0690\n", + "\n", + "\n", + "\n", + "2691185077424->2691185279904+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077424->2691185481744+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077424->2691185561936+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077424->2691185434320+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077472\n", + "\n", + " \n", + "\n", + "data -0.1473\n", + "\n", + "grad 0.0200\n", + "\n", + "\n", + "\n", + "2691185077472->2691185482704*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077472->2691185289552*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077472->2691185562896*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077472->2691185435280*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185437968\n", + "\n", + " \n", + "\n", + "data -0.8728\n", + "\n", + "grad -0.0268\n", + "\n", + "\n", + "\n", + "2691185437968->2691185438160+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185437968*->2691185437968\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077616\n", + "\n", + " \n", + "\n", + "data -0.6430\n", + "\n", + "grad -1.5900\n", + "\n", + "\n", + "\n", + "2691185077616->2691185281056*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077616->2691185480976*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077616->2691185561168*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077616->2691185433552*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185569184\n", + "\n", + " \n", + "\n", + "data 1.7360\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2691185573072+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185569184->2691185573072+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185569184**2\n", + "\n", + "**2\n", + "\n", + "\n", + "\n", + "2691185569184**2->2691185569184\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185438160\n", + "\n", + " \n", + "\n", + "data -2.1172\n", + "\n", + "grad -0.0268\n", + "\n", + "\n", + "\n", + "2691185438544+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185438160->2691185438544+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185438160+->2691185438160\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077760\n", + "\n", + " \n", + "\n", + "data -0.9909\n", + "\n", + "grad 2.1565\n", + "\n", + "\n", + "\n", + "2691185077760->2691185485200+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077760->2691185292048+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077760->2691185565392+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077760->2691185437776+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077808\n", + "\n", + " \n", + "\n", + "data -0.8083\n", + "\n", + "grad 1.5846\n", + "\n", + "\n", + "\n", + "2691185077808->2691185281680*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077808->2691185480592*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077808->2691185560784*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077808->2691185433168*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077856\n", + "\n", + " \n", + "\n", + "data 0.6644\n", + "\n", + "grad -1.3016\n", + "\n", + "\n", + "\n", + "2691185077856->2691185477088+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077856->2691185491680+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185077856->2691185429664+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185180240+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185077856->2691185180240+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185438352\n", + "\n", + " \n", + "\n", + "data -0.0037\n", + "\n", + "grad -0.0268\n", + "\n", + "\n", + "\n", + "2691185438352->2691185438544+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185438352*->2691185438352\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078000\n", + "\n", + " \n", + "\n", + "data 0.2971\n", + "\n", + "grad 1.2196\n", + "\n", + "\n", + "\n", + "2691185078000->2691185477760*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078000->2691185557952*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078000->2691185430336*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179232*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185078000->2691185179232*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078048\n", + "\n", + " \n", + "\n", + "data -0.6068\n", + "\n", + "grad -1.1398\n", + "\n", + "\n", + "\n", + "2691185078048->2691185478384*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078048->2691185558576*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078048->2691185430960*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178512*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185078048->2691185178512*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078096\n", + "\n", + " \n", + "\n", + "data 0.2151\n", + "\n", + "grad -2.4526\n", + "\n", + "\n", + "\n", + "2691185078096->2691185477328*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078096->2691185491920*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078096->2691185429904*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179808*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185078096->2691185179808*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185438544\n", + "\n", + " \n", + "\n", + "data -2.1209\n", + "\n", + "grad -0.0268\n", + "\n", + "\n", + "\n", + "2691185438928+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185438544->2691185438928+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185438544+->2691185438544\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078144\n", + "\n", + " \n", + "\n", + "data 0.1872\n", + "\n", + "grad 0.6108\n", + "\n", + "\n", + "\n", + "2691185078144->2691185479248*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078144->2691185559440*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078144->2691185431824*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177360*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185078144->2691185177360*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078240\n", + "\n", + " \n", + "\n", + "data 0.3051\n", + "\n", + "grad -1.5499\n", + "\n", + "\n", + "\n", + "2691185078240->2691185478816*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078240->2691185559008*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078240->2691185431392*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177936*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185078240->2691185177936*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078288\n", + "\n", + " \n", + "\n", + "data -0.2127\n", + "\n", + "grad -2.1031\n", + "\n", + "\n", + "\n", + "2691185078288->2691185476896*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078288->2691185491488*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078288->2691185429472*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185180384*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185078288->2691185180384*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185438736\n", + "\n", + " \n", + "\n", + "data 0.0190\n", + "\n", + "grad -0.0268\n", + "\n", + "\n", + "\n", + "2691185438736->2691185438928+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185438736*->2691185438736\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078384\n", + "\n", + " \n", + "\n", + "data -0.0272\n", + "\n", + "grad -0.6674\n", + "\n", + "\n", + "\n", + "2691185078384->2691185478576+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078384->2691185558768+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078384->2691185431152+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178272+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185078384->2691185178272+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078480\n", + "\n", + " \n", + "\n", + "data 0.2412\n", + "\n", + "grad -2.7403\n", + "\n", + "\n", + "\n", + "2691185078480->2691185280048*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078480->2691185480208*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078480->2691185560400*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078480->2691185432784*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185438928\n", + "\n", + " \n", + "\n", + "data -2.1018\n", + "\n", + "grad -0.0268\n", + "\n", + "\n", + "\n", + "2691185439024tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185438928->2691185439024tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185438928+->2691185438928\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078528\n", + "\n", + " \n", + "\n", + "data -0.8013\n", + "\n", + "grad 1.9122\n", + "\n", + "\n", + "\n", + "2691185078528->2691185281200*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078528->2691185479824*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078528->2691185560016*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078528->2691185432400*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185439024\n", + "\n", + " \n", + "\n", + "data -0.9706\n", + "\n", + "grad -0.4622\n", + "\n", + "\n", + "\n", + "2691185439024->2691185440464*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185439024tanh->2691185439024\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078672\n", + "\n", + " \n", + "\n", + "data 0.5019\n", + "\n", + "grad 0.3237\n", + "\n", + "\n", + "\n", + "2691185078672->2691185289120+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078672->2691185442768+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078672->2691185490192+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185078672->2691185428176+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185439312\n", + "\n", + " \n", + "\n", + "data -0.6475\n", + "\n", + "grad 0.7009\n", + "\n", + "\n", + "\n", + "2691185439312->2691185439504+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185439312*->2691185439312\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177216\n", + "\n", + " \n", + "\n", + "data -0.5126\n", + "\n", + "grad -0.4547\n", + "\n", + "\n", + "\n", + "2691185177216->2691185287392tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177216+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185177216+->2691185177216\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177264\n", + "\n", + " \n", + "\n", + "data -0.8752\n", + "\n", + "grad -0.2874\n", + "\n", + "\n", + "\n", + "2691185177264->2691185279760*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177264->2691185280048*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177264->2691185290512*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177264->2691185292240*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177264tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185177264tanh->2691185177264\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177312\n", + "\n", + " \n", + "\n", + "data -1.0000\n", + "\n", + "grad -0.0851\n", + "\n", + "\n", + "\n", + "2691185177312->2691185177360*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185439504\n", + "\n", + " \n", + "\n", + "data -1.5853\n", + "\n", + "grad 0.7009\n", + "\n", + "\n", + "\n", + "2691185439888+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185439504->2691185439888+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185439504+->2691185439504\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177360\n", + "\n", + " \n", + "\n", + "data -0.1872\n", + "\n", + "grad -0.4547\n", + "\n", + "\n", + "\n", + "2691185177360->2691185177216+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177360*->2691185177360\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185570768\n", + "\n", + " \n", + "\n", + "data 0.2306\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2691185573264+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185570768->2691185573264+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185570768**2\n", + "\n", + "**2\n", + "\n", + "\n", + "\n", + "2691185570768**2->2691185570768\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185439696\n", + "\n", + " \n", + "\n", + "data 0.0019\n", + "\n", + "grad 0.7009\n", + "\n", + "\n", + "\n", + "2691185439696->2691185439888+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185439696*->2691185439696\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177648\n", + "\n", + " \n", + "\n", + "data -0.7115\n", + "\n", + "grad -0.0673\n", + "\n", + "\n", + "\n", + "2691185179376+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185177648->2691185179376+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177648*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185177648*->2691185177648\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185439888\n", + "\n", + " \n", + "\n", + "data -1.5834\n", + "\n", + "grad 0.7009\n", + "\n", + "\n", + "\n", + "2691185440272+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185439888->2691185440272+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185439888+->2691185439888\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177792\n", + "\n", + " \n", + "\n", + "data -0.3254\n", + "\n", + "grad -0.4547\n", + "\n", + "\n", + "\n", + "2691185177792->2691185177216+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177792+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185177792+->2691185177792\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177888\n", + "\n", + " \n", + "\n", + "data 3.0000\n", + "\n", + "grad -0.1387\n", + "\n", + "\n", + "\n", + "2691185177888->2691185177936*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185440080\n", + "\n", + " \n", + "\n", + "data 0.3673\n", + "\n", + "grad 0.7009\n", + "\n", + "\n", + "\n", + "2691185440080->2691185440272+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185440080*->2691185440080\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177936\n", + "\n", + " \n", + "\n", + "data 0.9154\n", + "\n", + "grad -0.4547\n", + "\n", + "\n", + "\n", + "2691185177936->2691185177792+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185177936*->2691185177936\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178032\n", + "\n", + " \n", + "\n", + "data -0.6434\n", + "\n", + "grad -0.0673\n", + "\n", + "\n", + "\n", + "2691185178032->2691185179376+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178032+->2691185178032\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185440272\n", + "\n", + " \n", + "\n", + "data -1.2161\n", + "\n", + "grad 0.7009\n", + "\n", + "\n", + "\n", + "2691185440656+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185440272->2691185440656+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185440272+->2691185440272\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178272\n", + "\n", + " \n", + "\n", + "data -1.2409\n", + "\n", + "grad -0.4547\n", + "\n", + "\n", + "\n", + "2691185178272->2691185177792+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178272+->2691185178272\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185440464\n", + "\n", + " \n", + "\n", + "data 0.6400\n", + "\n", + "grad 0.7009\n", + "\n", + "\n", + "\n", + "2691185440464->2691185440656+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185440464*->2691185440464\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185571536\n", + "\n", + " \n", + "\n", + "data -1.3176\n", + "\n", + "grad -2.6352\n", + "\n", + "\n", + "\n", + "2691185571536->2691185569184**2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185571536+->2691185571536\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185571680\n", + "\n", + " \n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.9604\n", + "\n", + "\n", + "\n", + "2691185571728+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185571680->2691185571728+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178464\n", + "\n", + " \n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.2759\n", + "\n", + "\n", + "\n", + "2691185178464->2691185178512*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185571728\n", + "\n", + " \n", + "\n", + "data 0.4802\n", + "\n", + "grad 0.9604\n", + "\n", + "\n", + "\n", + "2691185571728->2691185570768**2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185571728+->2691185571728\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185440656\n", + "\n", + " \n", + "\n", + "data -0.5761\n", + "\n", + "grad 0.7009\n", + "\n", + "\n", + "\n", + "2691185440752tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185440656->2691185440752tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185440656+->2691185440656\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178512\n", + "\n", + " \n", + "\n", + "data -1.2136\n", + "\n", + "grad -0.4547\n", + "\n", + "\n", + "\n", + "2691185178512->2691185178272+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178512*->2691185178512\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185440752\n", + "\n", + " \n", + "\n", + "data -0.5198\n", + "\n", + "grad 0.9604\n", + "\n", + "\n", + "\n", + "2691185440752->2691185571728+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185440752tanh->2691185440752\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185571824\n", + "\n", + " \n", + "\n", + "data -1.0000\n", + "\n", + "grad -2.6352\n", + "\n", + "\n", + "\n", + "2691185571824->2691185571536+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178848\n", + "\n", + " \n", + "\n", + "data 0.5279\n", + "\n", + "grad -0.8992\n", + "\n", + "\n", + "\n", + "2691185178848->2691185279136*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178848->2691185281680*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178848->2691185290896*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178848->2691185292624*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185178848tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185178848tanh->2691185178848\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185441040\n", + "\n", + " \n", + "\n", + "data 0.5000\n", + "\n", + "grad 0.0272\n", + "\n", + "\n", + "\n", + "2691185441040->2691185441088*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185441088\n", + "\n", + " \n", + "\n", + "data 0.1441\n", + "\n", + "grad 0.0943\n", + "\n", + "\n", + "\n", + "2691185441280+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185441088->2691185441280+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185441088*->2691185441088\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185572208\n", + "\n", + " \n", + "\n", + "data 1.0000\n", + "\n", + "grad 0.5036\n", + "\n", + "\n", + "\n", + "2691185572208->2691185572256+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185572256\n", + "\n", + " \n", + "\n", + "data 0.2518\n", + "\n", + "grad 0.5036\n", + "\n", + "\n", + "\n", + "2691185572448**2\n", + "\n", + "**2\n", + "\n", + "\n", + "\n", + "2691185572256->2691185572448**2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185572256+->2691185572256\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179088\n", + "\n", + " \n", + "\n", + "data 0.5872\n", + "\n", + "grad -0.6486\n", + "\n", + "\n", + "\n", + "2691185179088->2691185178848tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179088+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185179088+->2691185179088\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185441280\n", + "\n", + " \n", + "\n", + "data 0.8381\n", + "\n", + "grad 0.0943\n", + "\n", + "\n", + "\n", + "2691185441712+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185441280->2691185441712+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185441280+->2691185441280\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185080880\n", + "\n", + " \n", + "\n", + "data 0.7086\n", + "\n", + "grad 0.2875\n", + "\n", + "\n", + "\n", + "2691185080880->2691185283120*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185080880->2691185490000*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185080880->2691185427984*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185442576*\n", + "\n", + "*\n", + "\n", + "\n", + "\n", + "2691185080880->2691185442576*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185080928\n", + "\n", + " \n", + "\n", + "data -0.8542\n", + "\n", + "grad 0.1904\n", + "\n", + "\n", + "\n", + "2691185080928->2691185475840*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185080928->2691185490432*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185080928->2691185428416*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185080928->2691185073632*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179232\n", + "\n", + " \n", + "\n", + "data -0.2971\n", + "\n", + "grad -0.6486\n", + "\n", + "\n", + "\n", + "2691185179232->2691185179088+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179232*->2691185179232\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185572448\n", + "\n", + " \n", + "\n", + "data 0.0634\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2691185573456+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185572448->2691185573456+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185572448**2->2691185572448\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185080976\n", + "\n", + " \n", + "\n", + "data 0.7115\n", + "\n", + "grad -0.4532\n", + "\n", + "\n", + "\n", + "2691185080976->2691185476272*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185080976->2691185490864*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185080976->2691185428848*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185080976->2691185177648*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185441472\n", + "\n", + " \n", + "\n", + "data 1.0000\n", + "\n", + "grad -0.0454\n", + "\n", + "\n", + "\n", + "2691185441472->2691185441520*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179376\n", + "\n", + " \n", + "\n", + "data -1.3549\n", + "\n", + "grad -0.0673\n", + "\n", + "\n", + "\n", + "2691185179376->2691185177264tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179376+->2691185179376\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185441520\n", + "\n", + " \n", + "\n", + "data -0.4817\n", + "\n", + "grad 0.0943\n", + "\n", + "\n", + "\n", + "2691185441520->2691185441712+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185441520*->2691185441520\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185572640\n", + "\n", + " \n", + "\n", + "data -1.0000\n", + "\n", + "grad -2.2505\n", + "\n", + "\n", + "\n", + "2691185572640->2691185572688+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185572688\n", + "\n", + " \n", + "\n", + "data -1.1253\n", + "\n", + "grad -2.2505\n", + "\n", + "\n", + "\n", + "2691185572880**2\n", + "\n", + "**2\n", + "\n", + "\n", + "\n", + "2691185572688->2691185572880**2\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185572688+->2691185572688\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179520\n", + "\n", + " \n", + "\n", + "data -1.0000\n", + "\n", + "grad -0.1927\n", + "\n", + "\n", + "\n", + "2691185179520->2691185179232*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179568\n", + "\n", + " \n", + "\n", + "data -1.0000\n", + "\n", + "grad -0.0479\n", + "\n", + "\n", + "\n", + "2691185179568->2691185177648*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185441712\n", + "\n", + " \n", + "\n", + "data 0.3564\n", + "\n", + "grad 0.0943\n", + "\n", + "\n", + "\n", + "2691185442144+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185441712->2691185442144+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185441712+->2691185441712\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185572880\n", + "\n", + " \n", + "\n", + "data 1.2662\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2691185573648+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185572880->2691185573648+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185572880**2->2691185572880\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179664\n", + "\n", + " \n", + "\n", + "data 0.8843\n", + "\n", + "grad -0.6486\n", + "\n", + "\n", + "\n", + "2691185179664->2691185179088+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179664+\n", + "\n", + "+\n", + "\n", + "\n", + "\n", + "2691185179664+->2691185179664\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185441904\n", + "\n", + " \n", + "\n", + "data 1.0000\n", + "\n", + "grad -0.0502\n", + "\n", + "\n", + "\n", + "2691185441904->2691185441952*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185573024\n", + "\n", + " \n", + "\n", + "data 0.0000\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2691185573024->2691185573072+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179808\n", + "\n", + " \n", + "\n", + "data 0.6452\n", + "\n", + "grad -0.6486\n", + "\n", + "\n", + "\n", + "2691185179808->2691185179664+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185179808*->2691185179808\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185441952\n", + "\n", + " \n", + "\n", + "data -0.5322\n", + "\n", + "grad 0.0943\n", + "\n", + "\n", + "\n", + "2691185441952->2691185442144+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185441952*->2691185441952\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185573072\n", + "\n", + " \n", + "\n", + "data 1.7360\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2691185573072->2691185573264+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185573072+->2691185573072\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185081600\n", + "\n", + " \n", + "\n", + "data 0.6941\n", + "\n", + "grad -1.9462\n", + "\n", + "\n", + "\n", + "2691185081600->2691185285952+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185081600->2691185488704+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185081600->2691185426688+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185081600->2691185441280+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185180000\n", + "\n", + " \n", + "\n", + "data 3.0000\n", + "\n", + "grad -0.1395\n", + "\n", + "\n", + "\n", + "2691185180000->2691185179808*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185442144\n", + "\n", + " \n", + "\n", + "data -0.1758\n", + "\n", + "grad 0.0943\n", + "\n", + "\n", + "\n", + "2691185442240tanh\n", + "\n", + "tanh\n", + "\n", + "\n", + "\n", + "2691185442144->2691185442240tanh\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185442144+->2691185442144\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185573264\n", + "\n", + " \n", + "\n", + "data 1.9666\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2691185573264->2691185573456+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185573264+->2691185573264\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185442240\n", + "\n", + " \n", + "\n", + "data -0.1740\n", + "\n", + "grad 0.0973\n", + "\n", + "\n", + "\n", + "2691185442240->2691185479824*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185442240->2691185481552*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185442240->2691185483280*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185442240->2691185485008*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185442240tanh->2691185442240\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185573456\n", + "\n", + " \n", + "\n", + "data 2.0300\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2691185573456->2691185573648+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185573456+->2691185573456\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185180240\n", + "\n", + " \n", + "\n", + "data 0.2391\n", + "\n", + "grad -0.6486\n", + "\n", + "\n", + "\n", + "2691185180240->2691185179664+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185180240+->2691185180240\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185180384\n", + "\n", + " \n", + "\n", + "data -0.4253\n", + "\n", + "grad -0.6486\n", + "\n", + "\n", + "\n", + "2691185180384->2691185180240+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185180384*->2691185180384\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185442528\n", + "\n", + " \n", + "\n", + "data 0.5000\n", + "\n", + "grad -0.0456\n", + "\n", + "\n", + "\n", + "2691185442528->2691185442576*\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185573648\n", + "\n", + " \n", + "\n", + "data 3.2962\n", + "\n", + "grad 1.0000\n", + "\n", + "\n", + "\n", + "2691185573648+->2691185573648\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185442576\n", + "\n", + " \n", + "\n", + "data 0.3543\n", + "\n", + "grad -0.0643\n", + "\n", + "\n", + "\n", + "2691185442576->2691185442768+\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185442576*->2691185442576\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "2691185180624\n", + "\n", + " \n", + "\n", + "data 2.0000\n", + "\n", + "grad 0.1379\n", + "\n", + "\n", + "\n", + "2691185180624->2691185180384*\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "draw_dot(loss)" + ] + }, + { + "cell_type": "markdown", + "id": "c6cc7b4b", + "metadata": {}, + "source": [ + "## Collecting all the parameters of Neural Network" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "ffbbf5b3", + "metadata": {}, + "outputs": [], + "source": [ + "class Neuron:\n", + " def __init__(self, nin):\n", + " self.w = [Value(random.uniform(-1,1)) for _ in range(nin)] \n", + " self.b = Value(np.random.uniform(-1,1)) \n", + " def __call__(self, x):\n", + " act = sum((wi*xi for wi,xi in zip(self.w, x)), start=self.b) \n", + " out = act.tanh()\n", + " return out\n", + " def parameters(self):\n", + " return self.w + [self.b]\n", + "\n", + "class Layer:\n", + " def __init__(self, nin, nout):\n", + " self.neurons = [Neuron(nin) for _ in range(nout)]\n", + " def __call__(self, x):\n", + " outs = [n(x) for n in self.neurons]\n", + " return outs[0] if len(outs)==1 else outs\n", + " def parameters(self):\n", + " # params = []\n", + " # for neuron in self.neurons:\n", + " # ps = neuron.parameters()\n", + " # params.extend(ps)\n", + " # return params\n", + " return [p for neuron in self.neurons for p in neuron.parameters()]\n", + " \n", + " \n", + "class MLP:\n", + " def __init__(self, nin, nouts):\n", + " sz = [nin] + nouts\n", + " self.layers = [Layer(sz[i], sz[i+1]) for i in range(len(nouts))] \n", + " def __call__(self, x):\n", + " for layer in self.layers:\n", + " x = layer(x)\n", + " return x\n", + " def parameters(self):\n", + " # params = []\n", + " # for layer in self.layers:\n", + " # ps = layer.parameters()\n", + " # params.extend(ps)\n", + " # return params\n", + " return [p for layer in self.layers for p in layer.parameters()]" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "b793130f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Value(data=-0.8636639009265011)" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x = [2.0, 3.0, -1.0]\n", + "n = MLP(3, [4, 4, 1])\n", + "n(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "4cba0c65", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Value(data=0.29894667950375986),\n", + " Value(data=0.7502863736906304),\n", + " Value(data=0.7961693911891201),\n", + " Value(data=0.29832198852716374),\n", + " Value(data=-0.48481874311163753)]" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "n.parameters()[:5]" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "8a444879", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "41" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(n.parameters())" + ] + }, + { + "cell_type": "markdown", + "id": "804fb064", + "metadata": {}, + "source": [ + "---\n" + ] + }, + { + "cell_type": "markdown", + "id": "dd888bd0", + "metadata": {}, + "source": [ + "### Gradient Descent Optimization" + ] + }, + { + "cell_type": "markdown", + "id": "296693e5", + "metadata": {}, + "source": [ + "## Gradient Descent\n", + "\n", + "Gradient Descent is an iterative optimization algorithm used for finding the minimum of a function. It's commonly used in machine learning for training models, particularly in optimization tasks like minimizing the loss function.\n", + "\n", + "### Working Principle:\n", + "\n", + "1. **Initialize Parameters**: Start with an initial guess for the parameters of the model.\n", + "\n", + "2. **Compute Gradient**: Calculate the gradient of the loss function with respect to each parameter. The gradient points in the direction of the steepest increase of the function.\n", + "\n", + "3. **Update Parameters**: Adjust the parameters in the opposite direction of the gradient to minimize the loss function. This step involves subtracting a fraction of the gradient from the current parameter values.\n", + "\n", + "4. **Repeat**: Iterate steps 2 and 3 until convergence criteria are met, such as reaching a specified number of iterations or the change in the loss function becoming sufficiently small.\n", + "\n", + "### Types of Gradient Descent:\n", + "\n", + "- **Batch Gradient Descent**: Computes the gradient of the loss function with respect to the entire dataset.\n", + " \n", + "- **Stochastic Gradient Descent (SGD)**: Computes the gradient of the loss function with respect to a single data point randomly chosen from the dataset.\n", + " \n", + "- **Mini-Batch Gradient Descent**: Computes the gradient of the loss function with respect to a small batch of data points randomly chosen from the dataset.\n", + "\n", + "### Advantages:\n", + "\n", + "- Simplicity and ease of implementation.\n", + "- Ability to handle large datasets efficiently.\n", + "- Convergence to a local minimum, often a global minimum with appropriate learning rate and initialization.\n", + "\n", + "### Limitations:\n", + "\n", + "- Sensitive to learning rate selection.\n", + "- May converge to local minima or saddle points.\n", + "- Not suitable for non-convex or discontinuous loss functions.\n", + "\n", + "Gradient Descent is a fundamental optimization technique widely used in machine learning for training various models, including neural networks.\n" + ] + }, + { + "cell_type": "markdown", + "id": "80b5c421", + "metadata": {}, + "source": [ + "#### Tiny Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "d0e6d9c3", + "metadata": {}, + "outputs": [], + "source": [ + "# (3, [4,4,1]) - 3 inputs (neuron) and 2 layers with 4 neurons and 1 output neuron\n", + "n = MLP(3, [4, 4, 1]) # n = MLP Object " + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "b71eda21", + "metadata": {}, + "outputs": [], + "source": [ + "xs = [\n", + " [2.0, 3.0, -1.0],\n", + " [3.0, -1.0, 0.5],\n", + " [0.5, 1.0, 1.0],\n", + " [1.0, 1.0, -1.0],\n", + "]\n", + "ys = [1.0, -1.0, -1.0, 1.0] # desired targets" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "53e56ed4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ypred: [Value(data=0.4516597802485996), Value(data=0.3173016655858083), Value(data=0.20224839435554107), Value(data=0.3647666579858615)]\n", + "\n", + "loss: Value(data=3.884883275289087)\n" + ] + } + ], + "source": [ + "# forward pass through the network\n", + "ypred = [n(x) for x in xs]\n", + "print(\"ypred: \", ypred)\n", + "\n", + "loss = sum([(yout - ygt)**2 for ygt, yout in zip(ys, ypred)])\n", + "print(\"\\nloss: \", loss)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "cefa0f26", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.0" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# all gradients will be zero since we haven't run backward pass on the network yet\n", + "n.layers[0].neurons[0].w[0].grad" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "b519fc16", + "metadata": {}, + "outputs": [], + "source": [ + "# backward pass through the network\n", + "# here we calculate the gradients \n", + "loss.backward()" + ] + }, + { + "cell_type": "markdown", + "id": "162c5126", + "metadata": {}, + "source": [ + "#### but we need to set all the gradients to zero before running the backward pass from next time onwards \n", + "#### since network will have some gradiets after the forward pass next time while improving the Network\n", + "#### so in that case code will be\n", + "#### firstly setting all the gradients to zero and then running the backward pass\n", + "```python\n", + "for p in n.parameters():\n", + " p.grad = 0.0\n", + "loss.backward()\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "b0c06f88", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-2.5871282735325103" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "n.layers[0].neurons[0].w[0].grad" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "fc36a1d6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-0.2404740221815409" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# before:\n", + "n.layers[0].neurons[0].w[0].data" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "489091fc", + "metadata": {}, + "outputs": [], + "source": [ + "for p in n.parameters():\n", + " p.data += -0.01 * p.grad" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "b0036e1f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-0.2146027394462158" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# after:\n", + "# slightly change in value\n", + "# i.e. it will decrease/increase the data/value according to gradient \n", + "# \"n.layers[0].neurons[0].w[0].grad\" gradient tells whether to increase or decrease\n", + "# the data/value \"n.layers[0].neurons[0].w[0].data\" \n", + "\n", + "# if gradient is negative then data/value should be increase since it tells us that increasing more negative will minimize loss\n", + "# if gradient is positve then data/value should be decrease since it tells us that decreasing more positive will minimize loss\n", + "n.layers[0].neurons[0].w[0].data" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "8f214b5f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ypred: [Value(data=0.40191114315066157), Value(data=0.1981886324920602), Value(data=0.11724150901940607), Value(data=0.3019175129696992)]\n", + "\n", + "loss: Value(data=3.5289140278949116)\n" + ] + } + ], + "source": [ + "ypred = [n(x) for x in xs]\n", + "print(\"ypred: \", ypred)\n", + "\n", + "loss = sum([(yout - ygt)**2 for ygt, yout in zip(ys, ypred)])\n", + "print(\"\\nloss: \", loss)" + ] + }, + { + "cell_type": "markdown", + "id": "23effefd", + "metadata": {}, + "source": [ + "#### Now here above we can see that loss has been decrease by some amount/portion" + ] + }, + { + "cell_type": "markdown", + "id": "41337dfc", + "metadata": {}, + "source": [ + "---\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "1e17c420", + "metadata": {}, + "source": [ + "### Now let's iterate this process manually unless we minimized the loss \n", + "### At each iteration the Neural Network is improving its prediction" + ] + }, + { + "cell_type": "markdown", + "id": "a53f91ea", + "metadata": {}, + "source": [ + "### Step 1:" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "c4c2b84a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ypred: [Value(data=0.40191114315066157), Value(data=0.1981886324920602), Value(data=0.11724150901940607), Value(data=0.3019175129696992)]\n", + "\n", + "loss: Value(data=3.5289140278949116)\n" + ] + } + ], + "source": [ + "# forward pass through the network\n", + "ypred = [n(x) for x in xs]\n", + "print(\"ypred: \", ypred)\n", + "\n", + "loss = sum([(yout - ygt)**2 for ygt, yout in zip(ys, ypred)])\n", + "print(\"\\nloss: \", loss)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "ebe5807b", + "metadata": {}, + "outputs": [], + "source": [ + "# backward pass through the network\n", + "# here we calculate the gradients \n", + "for p in n.parameters():\n", + " p.grad = 0.0\n", + "loss.backward()" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "9660b485", + "metadata": {}, + "outputs": [], + "source": [ + "# step size\n", + "# OR update the whole Network (i.e. parameters/weights)\n", + "for p in n.parameters():\n", + " p.data += -0.01 * p.grad" + ] + }, + { + "cell_type": "markdown", + "id": "22436d5c", + "metadata": {}, + "source": [ + "### Step 2:" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "36e766e2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ypred: [Value(data=0.36547704471656794), Value(data=0.08932538837563099), Value(data=0.043519732840553674), Value(data=0.2522888452992371)]\n", + "\n", + "loss: Value(data=3.2372545862329085)\n" + ] + } + ], + "source": [ + "# forward pass\n", + "ypred = [n(x) for x in xs]\n", + "print(\"ypred: \", ypred)\n", + "\n", + "loss = sum([(yout - ygt)**2 for ygt, yout in zip(ys, ypred)])\n", + "print(\"\\nloss: \", loss)\n", + "\n", + "# backward pass\n", + "for p in n.parameters():\n", + " p.grad = 0.0\n", + "loss.backward()\n", + "\n", + "# step size\n", + "for p in n.parameters():\n", + " p.data += -0.01 * p.grad" + ] + }, + { + "cell_type": "markdown", + "id": "2b9e9850", + "metadata": {}, + "source": [ + "### Step 3:" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "3b6c2eb8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ypred: [Value(data=0.3446934100866417), Value(data=0.0029713328778081267), Value(data=-0.017907936010691267), Value(data=0.219482375469085)]\n", + "\n", + "loss: Value(data=3.009090805712724)\n" + ] + } + ], + "source": [ + "# forward pass\n", + "ypred = [n(x) for x in xs]\n", + "print(\"ypred: \", ypred)\n", + "\n", + "loss = sum([(yout - ygt)**2 for ygt, yout in zip(ys, ypred)])\n", + "print(\"\\nloss: \", loss)\n", + "\n", + "# backward pass\n", + "for p in n.parameters():\n", + " p.grad = 0.0\n", + "loss.backward()\n", + "\n", + "# step size\n", + "for p in n.parameters():\n", + " p.data += -0.01 * p.grad" + ] + }, + { + "cell_type": "markdown", + "id": "38e306ed", + "metadata": {}, + "source": [ + "### Step 4:" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "03af4549", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ypred: [Value(data=0.3377978290655661), Value(data=-0.059963287273116686), Value(data=-0.06857566771955208), Value(data=0.2021915652463017)]\n", + "\n", + "loss: Value(data=2.826230321792867)\n" + ] + } + ], + "source": [ + "# forward pass\n", + "ypred = [n(x) for x in xs]\n", + "print(\"ypred: \", ypred)\n", + "\n", + "loss = sum([(yout - ygt)**2 for ygt, yout in zip(ys, ypred)])\n", + "print(\"\\nloss: \", loss)\n", + "\n", + "# backward pass\n", + "for p in n.parameters():\n", + " p.grad = 0.0\n", + "loss.backward()\n", + "\n", + "# step size\n", + "for p in n.parameters():\n", + " p.data += -0.01 * p.grad" + ] + }, + { + "cell_type": "markdown", + "id": "0296057e", + "metadata": {}, + "source": [ + "### Step 5:" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "25aec66b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ypred: [Value(data=0.3410791983898478), Value(data=-0.10503821382997872), Value(data=-0.11091274450232126), Value(data=0.1965063406425457)]\n", + "\n", + "loss: Value(data=2.6712114300152283)\n" + ] + } + ], + "source": [ + "# forward pass\n", + "ypred = [n(x) for x in xs]\n", + "print(\"ypred: \", ypred)\n", + "\n", + "loss = sum([(yout - ygt)**2 for ygt, yout in zip(ys, ypred)])\n", + "print(\"\\nloss: \", loss)\n", + "\n", + "# backward pass\n", + "for p in n.parameters():\n", + " p.grad = 0.0\n", + "loss.backward()\n", + "\n", + "# step size\n", + "for p in n.parameters():\n", + " p.data += -0.01 * p.grad" + ] + }, + { + "cell_type": "markdown", + "id": "70619c44", + "metadata": {}, + "source": [ + "### Step 6:" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "784c1da9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ypred: [Value(data=0.35104194042032594), Value(data=-0.1382327204635561), Value(data=-0.1471213765714598), Value(data=0.19856637951937364)]\n", + "\n", + "loss: Value(data=2.5334872015111056)\n" + ] + } + ], + "source": [ + "# forward pass\n", + "ypred = [n(x) for x in xs]\n", + "print(\"ypred: \", ypred)\n", + "\n", + "loss = sum([(yout - ygt)**2 for ygt, yout in zip(ys, ypred)])\n", + "print(\"\\nloss: \", loss)\n", + "\n", + "# backward pass\n", + "for p in n.parameters():\n", + " p.grad = 0.0\n", + "loss.backward()\n", + "\n", + "# step size\n", + "for p in n.parameters():\n", + " p.data += -0.01 * p.grad" + ] + }, + { + "cell_type": "markdown", + "id": "aba86c8a", + "metadata": {}, + "source": [ + "### Step 7:" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "c579c277", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ypred: [Value(data=0.36511989888918606), Value(data=-0.16393158133403135), Value(data=-0.1788651496191767), Value(data=0.20551917948008322)]\n", + "\n", + "loss: Value(data=2.407545360161028)\n" + ] + } + ], + "source": [ + "# forward pass\n", + "ypred = [n(x) for x in xs]\n", + "print(\"ypred: \", ypred)\n", + "\n", + "loss = sum([(yout - ygt)**2 for ygt, yout in zip(ys, ypred)])\n", + "print(\"\\nloss: \", loss)\n", + "\n", + "# backward pass\n", + "for p in n.parameters():\n", + " p.grad = 0.0\n", + "loss.backward()\n", + "\n", + "# step size\n", + "for p in n.parameters():\n", + " p.data += -0.01 * p.grad" + ] + }, + { + "cell_type": "markdown", + "id": "27ade47e", + "metadata": {}, + "source": [ + "### Step 8:" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "002fe2cb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ypred: [Value(data=0.38159546496802954), Value(data=-0.1849855647193783), Value(data=-0.20732092749853465), Value(data=0.21548031784171653)]\n", + "\n", + "loss: Value(data=2.290483942339416)\n" + ] + } + ], + "source": [ + "# forward pass\n", + "ypred = [n(x) for x in xs]\n", + "print(\"ypred: \", ypred)\n", + "\n", + "loss = sum([(yout - ygt)**2 for ygt, yout in zip(ys, ypred)])\n", + "print(\"\\nloss: \", loss)\n", + "\n", + "# backward pass\n", + "for p in n.parameters():\n", + " p.grad = 0.0\n", + "loss.backward()\n", + "\n", + "# step size\n", + "for p in n.parameters():\n", + " p.data += -0.01 * p.grad" + ] + }, + { + "cell_type": "markdown", + "id": "a134b3eb", + "metadata": {}, + "source": [ + "---\n", + "### Now we can see that the loss has been minimized significantly.\n", + "### And also we have managed to adjust the parameters/weights of the Network according to the desired targets \n", + "### But this manual optimization is not feasible" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "d5ff16b5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ypred: [Value(data=0.39935283500087), Value(data=-0.20317851067490866), Value(data=-0.2333040312849848), Value(data=0.22725899401243216)]\n", + "\n", + "loss: Value(data=2.180652873450283)\n" + ] + } + ], + "source": [ + "ypred = [n(x) for x in xs]\n", + "print(\"ypred: \", ypred)\n", + "\n", + "loss = sum([(yout - ygt)**2 for ygt, yout in zip(ys, ypred)])\n", + "print(\"\\nloss: \", loss)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "7b32e2b9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Value(data=-0.09236518556674185),\n", + " Value(data=-0.3414250024669295),\n", + " Value(data=0.18102606927642548),\n", + " Value(data=0.7255779324296764),\n", + " Value(data=0.8091903567202767),\n", + " Value(data=-0.1583423233217715),\n", + " Value(data=-0.7120276764370238),\n", + " Value(data=-0.8115113767330411),\n", + " Value(data=0.9069200537619078),\n", + " Value(data=-0.059487012064367094),\n", + " Value(data=-0.18678555857834106),\n", + " Value(data=0.11222485591453606),\n", + " Value(data=0.014594264603496629),\n", + " Value(data=-0.08274185066340684),\n", + " Value(data=-0.2851485138071516),\n", + " Value(data=0.32113783497665965),\n", + " Value(data=-0.10659962199813272),\n", + " Value(data=0.12775313337439115),\n", + " Value(data=0.06672970424986154),\n", + " Value(data=0.08142950571937789),\n", + " Value(data=0.02633750794641075),\n", + " Value(data=-0.8767105754052693),\n", + " Value(data=-0.9509914257546),\n", + " Value(data=-0.829411218216228),\n", + " Value(data=-0.3583653060713451),\n", + " Value(data=0.4675866767034543),\n", + " Value(data=0.8794402547931269),\n", + " Value(data=0.4299015593275032),\n", + " Value(data=0.2713525153189973),\n", + " Value(data=0.13158427214698895),\n", + " Value(data=-0.934767143166212),\n", + " Value(data=-0.09760136692445047),\n", + " Value(data=0.13753281858246388),\n", + " Value(data=0.33462817741775625),\n", + " Value(data=0.43274352042750475),\n", + " Value(data=1.0593158479429214),\n", + " Value(data=0.11554096172817158),\n", + " Value(data=-0.6929840210956373),\n", + " Value(data=-0.8603248239567628),\n", + " Value(data=-0.9933814982781132),\n", + " Value(data=0.33338490247942837)]" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# This is the setting of weights and biases\n", + "n.parameters()" + ] + }, + { + "cell_type": "markdown", + "id": "9262148b", + "metadata": {}, + "source": [ + "---\n", + "---\n", + "---\n", + "---\n", + "---\n" + ] + }, + { + "cell_type": "markdown", + "id": "f3aa5e55", + "metadata": {}, + "source": [ + "## Now let's completely reinitialize the Neural Network" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "bfd671e2", + "metadata": {}, + "outputs": [], + "source": [ + "# (3, [4,4,1]) - 3 inputs (neuron) and 2 layers with 4 neurons and 1 output neuron\n", + "n = MLP(3, [4, 4, 1]) # n = MLP Object " + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "f4f92074", + "metadata": {}, + "outputs": [], + "source": [ + "xs = [\n", + " [2.0, 3.0, -1.0],\n", + " [3.0, -1.0, 0.5],\n", + " [0.5, 1.0, 1.0],\n", + " [1.0, 1.0, -1.0],\n", + "]\n", + "ys = [1.0, -1.0, -1.0, 1.0] # desired targets" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "8aef44db", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 4.764555853833409\n", + "1 4.208004203279781\n", + "2 4.444734773439082\n", + "3 3.1639980533396184\n", + "4 2.7119786064034\n", + "5 2.643238306351483\n", + "6 2.5990393186759033\n", + "7 2.5369293179324357\n", + "8 2.4831310986404302\n", + "9 2.4098796402453515\n", + "10 2.3574589857727597\n", + "11 2.2808966705468237\n", + "12 2.2327457163842626\n", + "13 2.105975483176895\n", + "14 1.9229435436637454\n", + "15 1.2379429233088404\n", + "16 1.5790303907073713\n", + "17 0.3170985421598559\n", + "18 0.16944494036304264\n", + "19 0.1362130266365044\n", + "20 0.11436630982069106\n", + "21 0.09840495528545122\n", + "22 0.08616139123328101\n", + "23 0.0764722193834988\n", + "24 0.0686246490813796\n", + "25 0.062149899162205716\n", + "26 0.056725187660664374\n", + "27 0.052120637599147326\n", + "28 0.048168101795219825\n", + "29 0.04474183070116722\n", + "30 0.04174598838836537\n", + "31 0.03910632769730731\n", + "32 0.03676448927187684\n", + "33 0.03467400788081391\n", + "34 0.032797458919177805\n", + "35 0.031104383660284892\n", + "36 0.02956975700375419\n", + "37 0.028172839839205887\n", + "38 0.026896308435499415\n", + "39 0.025725586240142623\n", + "40 0.024648325515400353\n", + "41 0.023654001229704767\n", + "42 0.02273358998226104\n", + "43 0.021879314000982933\n", + "44 0.021084435413057528\n", + "45 0.02034308969782562\n", + "46 0.01965014993066721\n", + "47 0.019001115410815783\n", + "48 0.018392019739284438\n", + "49 0.017819354517146016\n", + "50 0.017280005669017856\n", + "51 0.016771200032704554\n", + "52 0.01629046034451585\n", + "53 0.015835567127767937\n", + "54 0.015404526286437726\n", + "55 0.014995541436839642\n", + "56 0.01460699019237093\n", + "57 0.014237403760961862\n", + "58 0.01388544933026524\n", + "59 0.013549914808217031\n", + "60 0.01322969556127769\n", + "61 0.012923782853185397\n", + "62 0.012631253736328113\n", + "63 0.012351262188142425\n", + "64 0.012083031318046843\n", + "65 0.011825846497712438\n", + "66 0.011579049290075718\n", + "67 0.011342032071279033\n", + "68 0.011114233255389877\n", + "69 0.010895133044861073\n", + "70 0.010684249640705329\n", + "71 0.010481135855634743\n", + "72 0.010285376081254283\n", + "73 0.010096583567045677\n", + "74 0.009914397974527074\n", + "75 0.009738483174790277\n", + "76 0.009568525261734812\n", + "77 0.009404230756846812\n", + "78 0.00924532498440275\n", + "79 0.009091550598589081\n", + "80 0.008942666246284642\n", + "81 0.008798445351202989\n", + "82 0.008658675006784529\n", + "83 0.008523154966699302\n", + "84 0.008391696723102492\n", + "85 0.008264122663902298\n", + "86 0.008140265301278801\n", + "87 0.00801996656454794\n", + "88 0.007903077151218173\n", + "89 0.007789455930747363\n", + "90 0.0076789693960915405\n", + "91 0.007571491158650222\n", + "92 0.0074669014826686825\n", + "93 0.007365086855558431\n", + "94 0.007265939590956262\n", + "95 0.0071693574616570185\n", + "96 0.007075243359838599\n", + "97 0.006983504982248725\n", + "98 0.006894054538246548\n", + "99 0.006806808478792893\n" + ] + } + ], + "source": [ + "for i in range(100):\n", + " \n", + " # forwarde pass\n", + " ypred = [n(x) for x in xs]\n", + " loss = sum([(yout - ygt)**2 for ygt, yout in zip(ys, ypred)])\n", + " \n", + " # backward pass\n", + " for p in n.parameters():\n", + " p.grad = 0.0\n", + " loss.backward()\n", + " \n", + " # update parameters\n", + " for p in n.parameters():\n", + " p.data += -0.1 * p.grad\n", + " \n", + " print(i, loss.data)" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "7a2e1a54", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Value(data=-0.2516873672789252),\n", + " Value(data=1.2083993015868846),\n", + " Value(data=0.6226714625331227),\n", + " Value(data=0.628338393598678),\n", + " Value(data=-1.10712262084253)]" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "n.parameters()[:5]" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "a8185631", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[1.0, -1.0, -1.0, 1.0]" + ] + }, + "execution_count": 58, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# desired targets\n", + "ys " + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "147db587", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Value(data=0.9633604279751715),\n", + " Value(data=-0.9590703578229453),\n", + " Value(data=-0.9469567325512003),\n", + " Value(data=0.9687665818354176)]" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# yout \n", + "ypred" + ] + }, + { + "cell_type": "markdown", + "id": "4eadd447", + "metadata": {}, + "source": [ + "---\n", + "---\n", + "---\n", + "---\n", + "---" + ] + }, + { + "cell_type": "markdown", + "id": "9cf33194", + "metadata": {}, + "source": [ + "## Now let's completely reinitialize the Neural Network with a \n", + "## New Desired Targets" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "c6b51aaf", + "metadata": {}, + "outputs": [], + "source": [ + "# (3, [4,4,1]) - 3 inputs (neuron) and 2 layers with 4 neurons and 1 output neuron\n", + "n = MLP(3, [4, 4, 1]) # n = MLP Object " + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "6195e95b", + "metadata": {}, + "outputs": [], + "source": [ + "xs = [\n", + " [2.0, 3.0, -1.0],\n", + " [3.0, -1.0, 0.5],\n", + " [0.5, 1.0, 1.0],\n", + " [1.0, 1.0, -1.0],\n", + "]\n", + "ys = [-1.0, 0.0, 0.5, 1.0] # new desired targets" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "ec79e612", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss = 0.00013695535684607436\n" + ] + } + ], + "source": [ + "for i in range(10000):\n", + " \n", + " # forwarde pass\n", + " ypred = [n(x) for x in xs]\n", + " loss = sum([(yout - ygt)**2 for ygt, yout in zip(ys, ypred)])\n", + " \n", + " # backward pass\n", + " for p in n.parameters():\n", + " p.grad = 0.0\n", + " loss.backward()\n", + " \n", + " # update parameters\n", + " for p in n.parameters():\n", + " p.data += -0.05 * p.grad\n", + " \n", + "print(\"loss = \", loss.data)" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "f466b509", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Value(data=0.9678280714134976),\n", + " Value(data=-0.149364541549272),\n", + " Value(data=-0.6775934863304514),\n", + " Value(data=0.7472612050476198),\n", + " Value(data=-0.7504611113587544)]" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "n.parameters()[:5]" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "57a75778", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[-1.0, 0.0, 0.5, 1.0]" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# desired targets\n", + "ys " + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "id": "bc9e9554", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Value(data=-0.9945153877903872),\n", + " Value(data=0.006780575574145105),\n", + " Value(data=0.505320690383607),\n", + " Value(data=0.9942913719265187)]" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# yout \n", + "ypred" + ] + }, + { + "cell_type": "markdown", + "id": "ee8fcd81", + "metadata": {}, + "source": [ + "---" + ] + }, + { + "cell_type": "markdown", + "id": "824aa521", + "metadata": {}, + "source": [ + "### Let's Summarize Everything" + ] + }, + { + "cell_type": "markdown", + "id": "85c34919", + "metadata": {}, + "source": [ + "# Understanding Neural Networks\n", + "\n", + "Neural networks, or neural nets, are mathematical expressions—often simple in the case of a multi-layer perceptron—that take input data along with weights and parameters. \n", + "\n", + "These expressions undergo a series of steps:\n", + "\n", + "1. **Forward Pass**: The input data is processed through the network.\n", + " \n", + "2. **Loss Evaluation**: An evaluation using a loss function is performed. The loss function measures the accuracy of predictions, where lower loss indicates better alignment between predictions and targets. This signifies desirable behavior of the network.\n", + " \n", + "3. **Adjustment of Loss Function**: The loss function is adjusted to align network behavior with desired outcomes for a given problem.\n", + "\n", + "Following the forward pass and loss evaluation, backpropagation is employed to calculate gradients. These gradients inform adjustments to parameters with the goal of locally decreasing the loss. This iterative process is known as gradient descent, where the network follows gradient information to minimize loss.\n", + "\n", + "Ultimately, the loss function is structured such that minimizing loss corresponds to the network performing optimally for the given task.\n" + ] + }, + { + "cell_type": "markdown", + "id": "a6bfe15f", + "metadata": {}, + "source": [ + "---" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lectures/micrograd/Making of Micrograd/public/derivative.png b/lectures/micrograd/Making of Micrograd/public/derivative.png new file mode 100644 index 00000000..b38401cb Binary files /dev/null and b/lectures/micrograd/Making of Micrograd/public/derivative.png differ diff --git a/lectures/micrograd/Making of Micrograd/public/mlp.jpg b/lectures/micrograd/Making of Micrograd/public/mlp.jpg new file mode 100644 index 00000000..70d7780c Binary files /dev/null and b/lectures/micrograd/Making of Micrograd/public/mlp.jpg differ diff --git a/lectures/micrograd/Making of Micrograd/public/neuron_model.jpeg b/lectures/micrograd/Making of Micrograd/public/neuron_model.jpeg new file mode 100644 index 00000000..7943119c Binary files /dev/null and b/lectures/micrograd/Making of Micrograd/public/neuron_model.jpeg differ