Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save theptrk/bdeb2ad8afb311c638e4c3e1359dad14 to your computer and use it in GitHub Desktop.

Select an option

Save theptrk/bdeb2ad8afb311c638e4c3e1359dad14 to your computer and use it in GitHub Desktop.
The spelled-out intro to neural networks - Part 1.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"authorship_tag": "ABX9TyNzWmQ/q9rzDagkkRShbcGC",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/theptrk/bdeb2ad8afb311c638e4c3e1359dad14/the-spelled-out-intro-to-neural-networks-part-1.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"source": [
"# The spelled-out intro to neural networks and backpropagation: building micrograd\n",
"\n",
"https://www.youtube.com/watch?v=VMj-3S1tku0"
],
"metadata": {
"id": "psZrGr42YKER"
}
},
{
"cell_type": "code",
"source": [
"import math\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
],
"metadata": {
"id": "4nQNt1OZYPci"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"def f(x):\n",
" return 3*x**2 - 4*x + 5\n",
" # 6x - 4"
],
"metadata": {
"id": "Y6Lz_qVQaAYB"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"f(3.0)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "DIJgNdZxaESQ",
"outputId": "da60ef68-a95e-4663-e968-4d84c0075467"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"20.0"
]
},
"metadata": {},
"execution_count": 16
}
]
},
{
"cell_type": "code",
"source": [
"h = 0.0001\n",
"(f(3.0 + h) - f(3.0)) / h"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "XrqEqypjndiT",
"outputId": "35f11a79-7b50-40f9-bab3-0e8d5b0c6b67"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.0002999999981767587"
]
},
"metadata": {},
"execution_count": 20
}
]
},
{
"cell_type": "code",
"source": [
"xs = np.arange(-5, 5, 0.25)\n",
"xs"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "dUEBVQIPaNNL",
"outputId": "432838b1-fe0d-466a-b4fe-88bc87a96e90"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([-5. , -4.75, -4.5 , -4.25, -4. , -3.75, -3.5 , -3.25, -3. ,\n",
" -2.75, -2.5 , -2.25, -2. , -1.75, -1.5 , -1.25, -1. , -0.75,\n",
" -0.5 , -0.25, 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 ,\n",
" 1.75, 2. , 2.25, 2.5 , 2.75, 3. , 3.25, 3.5 , 3.75,\n",
" 4. , 4.25, 4.5 , 4.75])"
]
},
"metadata": {},
"execution_count": 45
}
]
},
{
"cell_type": "code",
"source": [
"ys = f(xs)\n",
"ys"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "-rOJ8YeoaUcU",
"outputId": "0f73fdf4-9f2d-4fdd-ad44-69d66e1669b4"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([100. , 91.6875, 83.75 , 76.1875, 69. , 62.1875,\n",
" 55.75 , 49.6875, 44. , 38.6875, 33.75 , 29.1875,\n",
" 25. , 21.1875, 17.75 , 14.6875, 12. , 9.6875,\n",
" 7.75 , 6.1875, 5. , 4.1875, 3.75 , 3.6875,\n",
" 4. , 4.6875, 5.75 , 7.1875, 9. , 11.1875,\n",
" 13.75 , 16.6875, 20. , 23.6875, 27.75 , 32.1875,\n",
" 37. , 42.1875, 47.75 , 53.6875])"
]
},
"metadata": {},
"execution_count": 46
}
]
},
{
"cell_type": "code",
"source": [
"f(-5)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "qIpgNpjYbAq4",
"outputId": "9a5f9799-9f56-4cce-e95e-29bb5a86868e"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"100"
]
},
"metadata": {},
"execution_count": 47
}
]
},
{
"cell_type": "code",
"source": [
"f(4.75)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "iiBYoFirbLYC",
"outputId": "cded2f8e-62a3-43ad-d0e9-2f865ad06f3d"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"53.6875"
]
},
"metadata": {},
"execution_count": 48
}
]
},
{
"cell_type": "code",
"source": [
"plt.plot(xs,ys)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 282
},
"id": "6TQHixq7bN4X",
"outputId": "a55293de-6fed-4b15-e668-6bcd6dc42132"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7efdaf901a50>]"
]
},
"metadata": {},
"execution_count": 49
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD4CAYAAAAXUaZHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3dd3jV5f3/8ec7e0EGCTsQIAgyBCSkiBvcVUTqwqo4WtRaV+nX0mWXVauto3XUDVbrwFE3KjLEARhAZiCEHQiQEJIwErLu3x85+KOVEbI+Z7we18VFzuecw+d1rvZ65fY+9+f+mHMOEREJLmFeBxARkeanchcRCUIqdxGRIKRyFxEJQip3EZEgFOF1AIDU1FSXkZHhdQwRkYCyYMGCYudc2sGe84tyz8jIICcnx+sYIiIBxcw2HOo5TcuIiAQhlbuISBBSuYuIBCGVu4hIEFK5i4gEoSOWu5k9Z2bbzWzZAcdSzOwTM1vt+zvZd9zM7O9mlm9mS8zs+JYMLyIiB9eQkftk4Jz/OTYJ+NQ51xv41PcY4Fygt+/PBOCJ5okpIiJH44jl7pz7DCj5n8MXAlN8P08Bxhxw/AVXby6QZGadmivs/1paUMZfpq1E2xaLiPy3xs65d3DOFfp+3gp08P3cBdh0wOsKfMe+w8wmmFmOmeUUFRU1KsSiTTt5YtYacjbsbNT7RUSCVZO/UHX1w+ajHjo7555yzmU557LS0g569ewRXTI0neS4SJ6cvbZR7xcRCVaNLfdt+6dbfH9v9x3fDKQf8LquvmMtIjYqnKtOyGB67jbyt+9qqdOIiAScxpb7O8B438/jgbcPOH61b9XMcKDsgOmbFjH+hO5ER4Tx9GfrWvI0IiIBpSFLIV8GvgL6mFmBmV0P3AecaWargTN8jwE+ANYC+cDTwE9aJPUB2iVEc0lWV95atJnt5ZUtfToRkYBwxF0hnXPjDvHUqIO81gE3NzXU0frRST15ad5GJn+5njvP6dvapxcR8TtBcYVqRmo85/TvyItzN7B7X43XcUREPBcU5Q4w4ZSelFfW8OrXm478YhGRIBc05T6kWzLZGSk89/k6qmvrvI4jIuKpoCl3qB+9by6t4IOlLbpAR0TE7wVVuY/s255eafH8c/ZabUkgIiEtqMo9LMyYcEpPcgvL+Ty/2Os4IiKeCapyBxgzpAtpbaJ56jNtSSAioSvoyj06IpxrRmQwZ3Uxy7eUeR1HRMQTQVfuAFd+rzvxUeE8rdG7iISooCz3xLhILs/uxrtLCtlcWuF1HBGRVheU5Q5w3Uk9AHjuc20oJiKhJ2jLvUtSLKMHdebl+RvZuafK6zgiIq0qaMsd4MZTe7G3qpbnv1zvdRQRkVYV1OXep2MbzurXgclfrNOGYiISUoK63AFuPj2T8soaXpy7wesoIiKtJujLfVB6Eif3TuWZOeuorK71Oo6ISKsI+nIH+MlpmRTv3sdrOdoOWERCQ0iU+/CeKQztnsyTs9dqO2ARCQkhUe5mxk9Pz2RzaQX/WbTZ6zgiIi0uJMod4LQ+afTr1JYnZq2htk7bAYtIcAuZcjczbj49k7XFe5i2bKvXcUREWlTIlDvAOQM60jMtnkdn5utmHiIS1EKq3MPDjJtO7UVuYTkzV233Oo6ISIsJqXKH+pt5dEmK5dEZGr2LSPAKuXKPDA/jhlN7snBjKXPXlngdR0SkRYRcuQNcmpVOakI0j8/K9zqKiEiLCMlyj4kM50cn92DO6mIWbyr1Oo6ISLMLyXIHuHJ4dxJjI/nHjNVeRxERaXYhW+4J0RFcf1IPpuduZ2mBbqQtIsElZMsd4NoTM0iMjeSRT/O8jiIi0qxCutzbxETy45PrR+9LCjT3LiLBI6TLHWD8iAyS4iJ5eLrm3kUkeDSp3M3sDjNbbmbLzOxlM4sxsx5mNs/M8s3sVTOLaq6wLaF+9N6TGSu3841WzohIkGh0uZtZF+BWIMs5NwAIBy4H/gI85JzLBHYC1zdH0Ja0f/T+yHTNvYtIcGjqtEwEEGtmEUAcUAiMBF73PT8FGNPEc7S4hOgIfnxyT2auKmLRxp1exxERabJGl7tzbjPwV2Aj9aVeBiwASp1zNb6XFQBdDvZ+M5tgZjlmllNUVNTYGM1m/IgMkjX3LiJBoinTMsnAhUAPoDMQD5zT0Pc7555yzmU557LS0tIaG6PZJERHMOGUXszOK2KhRu8iEuCaMi1zBrDOOVfknKsG3gROBJJ80zQAXYGAua/d1Sd0JyU+SqN3EQl4TSn3jcBwM4szMwNGASuAmcDFvteMB95uWsTWEx8dwYRTevJZXhELNmj0LiKBqylz7vOo/+J0IbDU9289BfwC+JmZ5QPtgGebIWerufqE7rSLj+JhrZwRkQDWpNUyzrnfOef6OucGOOeucs7tc86tdc5lO+cynXOXOOf2NVfY1hAXFcENp/ZkzupictZrv3cRCUwhf4XqwVw5vDupCZp7F5HApXI/iLioCG44pRef5xfztUbvIhKAVO6HcOXw7qS1ieaBaat0r1URCTgq90OIjQrn1pGZzF9fwqw87y+yEhE5Gir3w7hsWDfSU2J5YNoq6uo0eheRwKFyP4yoiDAmntmHFYXlvL+00Os4IiINpnI/gtGDOtO3Yxv+9vEqqmvrvI4jItIgKvcjCAsz/u/sPqzfsZepOQVexxERaRCVewOM7Nueod2TeeTTPCqra72OIyJyRCr3BjAzfnFOX7aV72PKl+u9jiMickQq9wbK7pHCaX3SeHzWGsoqqr2OIyJyWCr3o/B/Z/ehrKKapz9b63UUEZHDUrkfhf6dE7lgUGee/XwdRbsCaj80EQkxKvej9LMzj6Gqto5HZ2hTMRHxXyr3o9QjNZ7LhqXz7/kb2VSy1+s4IiIHpXJvhFtH9ibMjIc+0Q09RMQ/qdwboWNiDNecmMFb32xm5dZyr+OIiHyHyr2Rbjq1F21jIrnng5VeRxER+Q6VeyMlxUVxy8hMPssrYra2BBYRP6Nyb4KrT8ige7s47nk/l1ptCSwifkTl3gRREWFMOqcvq7bt4rWcTV7HERH5lsq9ic4Z0JFhGcn87eM8du+r8TqOiAigcm8yM+PX3+9H8e59PDl7jddxREQAlXuzGJyexOhBnXl6zloKyyq8jiMionJvLv93dh/qHDzw0Sqvo4iIqNybS3pKHNeemMGbCzezbHOZ13FEJMSp3JvRzadnkhIfxd3vr8A5LY0UEe+o3JtR25hIbj+jN3PXljA9d7vXcUQkhKncm9m47G70TIvn3g9zqa6t8zqOiIQolXsziwwP41fnHsvaoj28PH+j13FEJESp3FvAqGPbc0LPdjz0SR5le3W/VRFpfSr3FmBm/Ob8YymrqOah6drzXURaX5PK3cySzOx1M1tpZrlmdoKZpZjZJ2a22vd3cnOFDST9Oydyxfe68a+5G7Tnu4i0uqaO3B8Bpjnn+gKDgFxgEvCpc6438KnvcUiaeGYf2sRE8Lu3l2tppIi0qkaXu5klAqcAzwI456qcc6XAhcAU38umAGOaGjJQJcdH8X9n92HeuhLeW1LodRwRCSFNGbn3AIqA581skZk9Y2bxQAfn3P4m2wp0ONibzWyCmeWYWU5RUfDe7OLyYd0Y0KUt93yQyx7tGikiraQp5R4BHA884ZwbAuzhf6ZgXP1cxEHnI5xzTznnspxzWWlpaU2I4d/Cw4w/jO5PYVklj83M9zqOiISIppR7AVDgnJvne/w69WW/zcw6Afj+DvlLNYd2T2HskC48M2cd64v3eB1HREJAo8vdObcV2GRmfXyHRgErgHeA8b5j44G3m5QwSEw6ty9REWH88b0VXkcRkRDQ1NUytwAvmdkSYDBwD3AfcKaZrQbO8D0Oee3bxnDrqExmrNzOjJXbvI4jIkEuoilvds59A2Qd5KlRTfl3g9U1I3rw6teb+MO7KxjRK5WYyHCvI4lIkNIVqq0oKiKM34/uz4Yde3n283VexxGRIKZyb2Un907j7P4deHRGPltKdUs+EWkZKncP/Ob7/ahzjj9/kOt1FBEJUip3D6SnxPGT0zJ5f0khs1aF/EpREWkBKneP3HhaT3qmxfPbt5dRUVXrdRwRCTIqd49ER4Rzz0UD2VRSwSOfrvY6jogEGZW7h4b3bMclQ7vyzJy12hZYJMQ453hk+moKy1pmYYXK3WO/Ou9Y2sZG8ss3l1JXp22BRULFmws389D0PKbntsz3bip3jyXHR/Hb849l0cZSXpq3wes4ItIKinfv40/vr2Bo92R+mN2tRc6hcvcDYwZ34cTMdtw/bRXbyiu9jiMiLeyP765g775a7hs7kLAwa5FzqNz9gJnx5zED2Vdbxx/eXe51HBFpQTNWbuOdxVu4+fRMendo02LnUbn7iYzUeG4dmckHS7fyaa42FhMJRrv31fCbt5ZxTIcEbjqtV4ueS+XuRyac0otjOiRw19vLddcmkSD0149WUVheyb1jjyMqomXrV+XuR6IiwrjnooFsLq3g4el5XscRkWa0YMNOpny1nvEnZDC0e3KLn0/l7meyMlIYl92N575Yz7LNZV7HEZFmUFVTx6Q3ltCpbQw/P7vPkd/QDFTufmjSOX1JjoviF28sobq2zus4ItJET8xaw+rtu7n7ogEkRDfpNhoNpnL3Q4lxkdw9pj/Lt5TzxKw1XscRkSZYvW0Xj85czehBnRnZt0OrnVfl7qfOGdCJ0YM6848Zq8kt1NYEIoGors4x6c2lxEdHcNcF/Vr13Cp3P/aH0f1JjI1i4muLNT0jEoBemreBBRt28tvv9yM1IbpVz61y92PJ8VH8+aIBrCgs57GZ+V7HEZGjsKlkL/d9uJKTe6cy9vgurX5+lbufO7t/Ry4c3JlHZ+SzfItWz4gEgro6x8+nLsbMuHfsQMxaZouBw1G5B4DfX9CfpLgofj51CVU1mp4R8XfPfbGOeetKuOuCfnRNjvMkg8o9ACTHR3HPRQPI1fSMiN/L376L+z9axRnHtueSoV09y6FyDxBn9e/ImMGdeWxmvi5uEvFT1bV1/Oy1xcRHhXOPR9Mx+6ncA8jvR/cnOT6Kn09drOkZET/0+Mw1LCko488XDaR9mxhPs6jcA0hSXBT3XjSQlVt38egM3XdVxJ8s21zGP2as5sLBnTlvYCev46jcA80Z/TowdkgXHpu1hqUFmp4R8QeV1bX87LVvaJcQxR9HD/A6DqByD0i/u6A/qQlR3P7qIiqqar2OIxLyHvokj7xtu/nLD44jMS7S6ziAyj0gJcZF8uClg1lbvIc/vb/C6zgiIe3r9SU8NWctV3yvG6f1ae91nG+p3APUiZmpTDi5J/+et5Fpy7Z6HUckJO3ZV8PE1xbTNTmWX593rNdx/ovKPYBNPKsPA7q0ZdKbS9haphtri7S2u9/PZdPOvfztksHEt9JWvg2lcg9gURFhPHL5EPZV1zFx6jfU1TmvI4mEjA+WFvLy/I1MOKUn2T1SvI7zHU0udzMLN7NFZvae73EPM5tnZvlm9qqZRTU9phxKr7QEfndBP77I38HTc9Z6HUckJGwq2csv3ljC4PQkfn5W69xZ6Wg1x8j9NiD3gMd/AR5yzmUCO4Hrm+EcchiXDUvn3AEd+evHq3T1qkgLq66t47ZXFoGDf4wbQmS4f06ANCmVmXUFvg8843tswEjgdd9LpgBjmnIOObL9O8+lJkRz68uL2FtV43UkkaD10Cd5LNxYyj1jB5Ke4s2mYA3R1F85DwN3AvuvhW8HlDrn9rdLAXDQjYzNbIKZ5ZhZTlFRURNjSFJcFA9eOph1O/bwx3e1PFKkJXy+upgnZq9hXHY6Fwzq7HWcw2p0uZvZ+cB259yCxrzfOfeUcy7LOZeVlpbW2BhygBN6teOmU3vxyteb+HBpoddxRIJK0a593PHaN2SmJXDX+f29jnNETRm5nwiMNrP1wCvUT8c8AiSZ2f41QV2BzU1KKEfljjOPYVDXRCa9uZQtpRVexxEJCnV1jolTF1NeUc0/rhhCbFS415GOqNHl7pz7pXOuq3MuA7gcmOGc+yEwE7jY97LxwNtNTikNFhlevzyyts5x878XavdIkWbw9Jy1fJZXxF0X9KNvx7Zex2mQlvia9xfAz8wsn/o5+Gdb4BxyGBmp8dx/8XEs2ljKPR/kHvkNInJI32wq5YGPVnHugI5ckd3N6zgN1iyXVDnnZgGzfD+vBbKb49+VxjtvYCeuP6kHz36+juO7JzPaz7/8EfFH5ZXV3PLyQjq0jeG+scd5evONo+WfCzSlWUw6ty9Z3ZOZ9MYS8rfv8jqOSEBxznHn1CVsKa3k7+OG+M1ujw2lcg9ikeFhPHrF8cRFhXPjiwvZs0/r30Ua6onZa5i2fCu/PLcvQ7snex3nqKncg1zHxBj+fvkQ1hbt5pdvLsU57T8jciSf5RXx149WccGgzlx/Ug+v4zSKyj0EjMhMZeJZfXhn8RZe+GqD13FE/Nqmkr3c+soierdvw19+4O1NrptC5R4ibjq1F6P6tufu91ewcONOr+OI+KWKqlpu+NcC6uocT141lLgo/9rG92io3ENEWJjx4KWD6ZgYw09fWkjJniqvI4n4Feccv35rKblby3nk8iFkpMZ7HalJVO4hJDEukid+OJTiPVXc9soiarX/u8i3XvhqA28u2szto47h9L7+c7u8xlK5h5gBXRL54+j+zFldzL26wEkEqL8P6p/eW8Govu25ZWSm13GaReBOKEmjXZ7djdzCcp75fB29OyRw2bDAuepOpLltK6/kJy8tJD0ljgcvG0xYWGB+gfq/NHIPUb89vx8n907lN/9Zxry1O7yOI+KJqpo6fvJS/TUg/7xyKImxgXWh0uGo3ENUhO8Cp/SUOG58cQEbd+z1OpJIq9r/BeqCDTu5/+Lj6NOxjdeRmpXKPYQlxkby7Phh1Dm4fsrX7Kqs9jqSSKt5fNYapi4o4NZRvTn/uODbe0nlHuJ6pMbzxA+PZ23xHm59WStoJDS8u3gLD3y0igsHd+aOM3p7HadFqNyFEZmp/GF0f2auKtIKGgl6CzbsZOLUxQzLSOYvPwisnR6PhlbLCABXDu/O6m27tIJGgtrGHXuZ8EIOnRJjePKqLGIi/f+OSo2lkbt8SytoJJiV7a3m2snzqalzPH/NMFLio7yO1KJU7vKtiPAwHh1Xv4LmhhcXaA94CRpVNXXc9NICNpbs5cmrhtIzLcHrSC1O5S7/JTEukuevGUZEWBhXPzufwjLdZFsCm3OO3/xnKV+u2cF9Y49jeM92XkdqFSp3+Y7u7eKZfO0wyitruPrZ+ZTu1SZjEriemL2G13IKuHVkJj8Y2tXrOK1G5S4HNaBLIk9dPZQNO/Zy/ZQcKqpqvY4kctReX1DA/dN8Sx7PPMbrOK1K5S6HNKJXKg9fPpiFG3fy038vpLq2zutIIg02bdlW7nx9MSdlpnL/xcG75PFQVO5yWOcN7MQfLxzApyu36zZ9EjA+X13MrS8vYlB6Ek9eNZToiOBd8ngoWucuR3TV8O4U7drH3z9dTWpCNJPO7et1JJFDWrBhJxP+lUPPtHgmX5NNfHRo1lxofmo5anec0Zvi3fv45+w1pCZE8aOTe3odSeQ7cgvLufb5+bRvE80L12eTGBc8uzweLZW7NIiZ8acLB1Cyu4q738+lXUIUFw0JnZUH4v/WF+/hqmfnExcVwb+u/x7t28R4HclTmnOXBgsPMx6+fDAn9GzHxNcW887iLV5HEgGgsKyCHz4zjzrnePFH2aSnxHkdyXMqdzkqMZHhPDM+i6yMFG5/ZRHvquDFYzt27+PKZ+ZRVlHNlGuzyWwfXPuyN5bKXY5afHQEz18zjKzuKdymghcP7dxTxfjn51Ows4Jnx2cxsGui15H8hspdGiU+OoLnr60v+Ntf/Yb3lqjgpXUV797HuKfnkrdtN/+8aijfC5FtBRpK5S6Ntr/gj++WxG2vfMP7Swq9jiQhYnt5JZc/NZf1O/bw7PgsTu/T3utIfkflLk0SHx3B5GuzOb5bEre+skgFLy1uS2kFlz75FVtKK5h8bTYn907zOpJfUrlLk9WP4LMZkq6Cl5a1qWQvlz75FTt2V/Gv67NDZofHxmh0uZtZupnNNLMVZrbczG7zHU8xs0/MbLXv7+Tmiyv+KiE6gsnX/f+C1zJJaW7rivdw2ZNfsauyhpd+/D2Gdk/xOpJfa8rIvQaY6JzrBwwHbjazfsAk4FPnXG/gU99jCQH7C35o92Rue2URk79Y53UkCRL523dx2ZNfUVlTx8s/Hs5xXZO8juT3Gl3uzrlC59xC38+7gFygC3AhMMX3sinAmKaGlMCREB3BC9dlc+axHfj9uyu4f9pKbTYmTZJbWM5lT87FAa9OGE6/zm29jhQQmmXO3cwygCHAPKCDc27/pOtWoMMh3jPBzHLMLKeoqKg5YoifiIkM54krhzIuuxuPz1rDna8voUbbBUsjfJlfzKVPfkVkeBivThhO7w66QKmhmlzuZpYAvAHc7pwrP/A5Vz9kO+iwzTn3lHMuyzmXlZamb7uDTXiYcc9FA7htVG+mLijghn8t0A0/5Ki8saCA8c/Pp1NiDG/8ZERI3Pe0OTWp3M0skvpif8k596bv8DYz6+R7vhOwvWkRJVCZGXeceQx3jxnAzFXb+eEzc9m5R7fsk8NzzvHI9NVMnLqYYRkpTL1xBF2SYr2OFXCaslrGgGeBXOfcgwc89Q4w3vfzeODtxseTYHDl8O48/sPjWbalnEt865NFDqa6to47X1/CQ9PzGHt8FyZfm01ibOhu29sUTRm5nwhcBYw0s298f84D7gPONLPVwBm+xxLizhnQiReuy2ZbWSVjH/+S5VvKvI4kfqa8spprn/+aqQsKuHVUb/52ySCiInQpTmOZP6xkyMrKcjk5OV7HkFaQW1jOdZO/ZufeKu6/eBCjB3X2OpL4gS2lFVw3+Wvyt+/mnrEDuTQr3etIAcHMFjjnsg72nH4tSqs6tlNb3vnpSQzsksitLy/i3g9zqa3zfoAh3lm2uYyLHv+CzTvrtxNQsTcPlbu0urQ20bz0o+FcObwbT85ey7WTv6Zsb7XXscQDr369kbFPfEmYGVNvOoGTeqd6HSloqNzFE1ERYdw9ZiD3jh3IV2uKGf3Y5+Rt2+V1LGklldW13Pn6Yn7xxlKyM1J475aT6NtRFyc1J5W7eGpcdjdemTCcvVW1jHnsC6Yt06ZjwW7jjr2MffxLXssp4JaRmUy5Lpt2CdFexwo6Knfx3NDu9SO3Yzq04cYXF/K3j1dpHj5ITV+xjfP/MYfNpRU8d00WE8/qQ3iYeR0rKKncxS90aBvDqzcM59KsrvxjRj6XP/UVm0r2eh1LmklNbR33T1vJj17IoVu7ON675SRG9j3oziTSTFTu4jeiI8L5yw+O48FLB5FbuIvzHpnDW4sKtPFYgNteXsnVz83n8VlrGJedzus3jiA9Jc7rWEEvwusAIgcyM8Ye35VhGSn87LVvuOPVxcxYWcTdYwboSsUA45zjncVbuOvt5VRW1/LAxcdxiZY5thqVu/il9JQ4XplwAk/Myufh6atZsL6EBy8brDvvBIji3fv4zVvLmLZ8K0O6JfHXSwbRSxt/tSpNy4jfCg8zfjqyN2/cNILoyHDGPT2X+z5cSVWNtg/2Zx8sLeSshz5jxsrtTDq3L6/fOELF7gGN3MXvDUpP4r1bTuLu91fwz9lrmJ1XxJ8vGsDx3XQHR3+yc08Vv317Ge8tKeS4ron87ZJB2n/dQ9pbRgLKx8u3ctfby9laXsm47HTuPLsvyfFRXscKeR8v38qv3lpGWUUVt43qzY2n9iIiXBMDLe1we8to5C4B5az+HRmRmcoj0/N47ov1TFu2lUnn9uWSoemEab10q1tTtJs/v5/LjJXb6depLf+6PptjO+lKU3+gkbsErJVby/nNW8vI2bCT47slcfeYgbq/Zispq6jm75+uZsqX64mNDOeWUZlcM6KHtuhtZYcbuavcJaDV1TneWFjAvR+upHRvFeNHZHDHmcfQNkbLJltCbZ3j5fkbefCTPHbureKyrHQmntWHtDbaPsALmpaRoBUWZlySlc6Z/TrwwEermPzlev6zaDM3nNqLq0/oTlyU/i/eXL7ML+aP761g5dZdZPdI4a7z+zGgS6LXseQQNHKXoLKkoJS/fpzHZ3lFpCZEceOpvbhyeHdiIsO9jhawlhaU8fcZq/lkxTa6Jsfyq/OO5dwBHam/06Z4SdMyEnJy1pfw0PQ8vsjfQfs20dx8eiaXZ6cTHaGSbwjnHPPXlfDozHzmrC6mTUwEN5zSkx+d3FO/KP2Iyl1C1ty1O3jw4zzmry+hU2IMPx2ZycVDu6rkD8E5x6xVRTw2M5+cDTtJTYji+pN6cuXwbrTR9xh+R+UuIc05xxf5O/jbJ6tYtLGUdvFRXDYsnXHZ3bSBlU9tnePDZYU8NnMNuYXldEmK5YZTe3JpVrpG6n5M5S5Cfcl/nl/MlC83MGPlNhxwep/2XDm8G6ce0z4k9xXfVLKXqQsKeGNBAZtLK+iZFs9PTsvkwsGdidRFSH5P5S7yPzaXVvDK/I28PH8Txbv30TU5liu+141Ls9JJDfK7Au2tquGDpVt5fcEm5q4twQxOykzliuxunNW/Y0j+kgtUKneRQ6iqqePjFVt5ce4G5q4tITLcGNErlbP6d+DMYzvQvm2M1xGbhXOOnA07mZqzifeXFLKnqpaMdnFcPLQrY4/vSuekWK8jSiOo3EUaIH/7Ll79ehMfLd/GRt9doIZ0S+Ksfh05q3+HgNvZcOeeKubkFzN7VRFzVhexfdc+4qLC+f7ATlySlc6wjGQtZwxwKneRo+CcI2/bbj5evpWPV2xj6eYyAHqlxXPGsR0Y2j2Zwd2SaN/Gv0b1NbV1LC4oZXZeMbPzilhSUIpzkBgbycm9UxnZtz1n9+9IfLQu7AoWKneRJthcWsH0Fdv4eMVW5q0tocZ38+4uSbEMSk9kcHoSg9OTGdClbatdEVtZXUv+9t3kFpaTW7iLlVvLWba5jPLKGsIMBqcnccoxaZx6TBrHdU3SPHqQUrmLNJOKqlqWbynjm02l3/4p2FkB1N9cpEdqPF2SYumcFLdkKDwAAARQSURBVEPnxFg6JcXSOTGGzkmxdEyMadCyQucc5ZU1lOypomTPPnbsrqJkTxVFu/aRt303KwvLWVu8h1rfL5mYyDD6dGxLv05tOSkzlRMz25EUp22QQ4H2lhFpJrFR4WRlpJCVkfLtsaJd+1i8qZTFBaWs2rqLwrJKlm8po3h31XffHxlORJgREW6Eh4UREWaE739sxu59NezcW0V17cEHXV2TYzm2U1vOHdCRvp3a0rdjG7q3i9fIXL5D5S7SRGltojmjXwfO6Nfhv45XVteytaySLWUVbCmtpLC0gvLKamrqHLV1jupaR21d3bePa+ocCVERpCRE0S4+ihTfn3bx0d8e0wVF0lAqd5EWEhMZTkZqPBmp8V5HkRCkS9BERIKQyl1EJAi1SLmb2TlmtsrM8s1sUkucQ0REDq3Zy93MwoHHgHOBfsA4M+vX3OcREZFDa4mRezaQ75xb65yrAl4BLmyB84iIyCG0RLl3ATYd8LjAd+y/mNkEM8sxs5yioqIWiCEiEro8+0LVOfeUcy7LOZeVlpbmVQwRkaDUEuW+GUg/4HFX3zEREWklzb63jJlFAHnAKOpL/WvgCufc8sO8pwjY0KxBWk8qUOx1CA/oc4eeUP3s/vy5uzvnDjr10exXqDrnaszsp8BHQDjw3OGK3feegJ2XMbOcQ23cE8z0uUNPqH72QP3cLbL9gHPuA+CDlvi3RUTkyHSFqohIEFK5N91TXgfwiD536AnVzx6Qn9svbtYhIiLNSyN3EZEgpHIXEQlCKvdmYmYTzcyZWarXWVqLmT1gZivNbImZvWVmSV5nakmhuNupmaWb2UwzW2Fmy83sNq8ztTYzCzezRWb2ntdZjobKvRmYWTpwFrDR6yyt7BNggHPuOOovXPulx3laTAjvdloDTHTO9QOGAzeHyOc+0G1ArtchjpbKvXk8BNwJhNS30865j51zNb6Hc6nfaiJYheRup865QufcQt/Pu6gvue9sBBiszKwr8H3gGa+zHC2VexOZ2YXAZufcYq+zeOw64EOvQ7SgBu12GszMLAMYAszzNkmrepj6gVud10GOlm6Q3QBmNh3oeJCnfg38ivopmaB0uM/unHvb95pfU/+f7y+1ZjZpPWaWALwB3O6cK/c6T2sws/OB7c65BWZ2mtd5jpbKvQGcc2cc7LiZDQR6AIvNDOqnJRaaWbZzbmsrRmwxh/rs+5nZNcD5wCgX3BdNhOxup2YWSX2xv+Sce9PrPK3oRGC0mZ0HxABtzexF59yVHudqEF3E1IzMbD2Q5Zzz1x3kmpWZnQM8CJzqnAvqO640ZrfTYGD1o5YpQIlz7nav83jFN3L/uXPufK+zNJTm3KUpHgXaAJ+Y2Tdm9k+vA7UU3xfH+3c7zQVeC/Zi9zkRuAoY6fvf+BvfSFb8nEbuIiJBSCN3EZEgpHIXEQlCKncRkSCkchcRCUIqdxGRIKRyFxEJQip3EZEg9P8AHOgo1Uw70q4AAAAASUVORK5CYII=\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"source": [
"class Value: \n",
"\n",
" def __init__(self, data, _children=(), _op='', label=''):\n",
" self.data = data\n",
" self.grad = 0.0\n",
" self._backward = lambda: None\n",
" self._prev = set(_children)\n",
" self._op = _op\n",
" self.label = label\n",
"\n",
" def __repr__(self):\n",
" return f\"Value(data={self.data})\"\n",
"\n",
" def __add__(self, other):\n",
" out = Value(self.data + other.data, (self, other), '+')\n",
"\n",
" def _backward():\n",
" self.grad += 1 * out.grad \n",
" other.grad += 1 * out.grad \n",
" out._backward = _backward\n",
"\n",
" return out\n",
"\n",
" def __mul__(self, other):\n",
" out = Value(self.data * other.data, (self, other), '*')\n",
" \n",
" def _backward():\n",
" self.grad += other.data * out.grad\n",
" other.grad += self.data * out.grad\n",
" out._backward = _backward\n",
"\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",
"\n",
" def _backward():\n",
" self.grad += (1 - t**2) * out.grad \n",
" out._backward = _backward\n",
"\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",
" \n",
" self.grad = 1.0\n",
" for node in reversed(topo):\n",
" node._backward()\n",
" \n",
"\n",
"a = Value(2.0, label='a')\n",
"b = Value(-3.0, label='b')\n",
"c = Value(10.0, 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",
"L\n",
"L.backward()"
],
"metadata": {
"id": "VA3ykAhqbSR8"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"from graphviz import Digraph\n",
"\n",
"def trace(root):\n",
" # builds a set of all nodes and edges in a 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",
" 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 a 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 to the op node of n2\n",
" dot.edge(str(id(n1)), str(id(n2)) + n2._op)\n",
"\n",
" return dot"
],
"metadata": {
"id": "7vyET18YiKPU"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"def lol():\n",
"\n",
" h = 0.0001\n",
"\n",
" a = Value(2.0, label='a')\n",
" b = Value(-3.0, label='b')\n",
" c = Value(10.0, 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+h, label='b')\n",
" c = Value(10.0, 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",
" L2 = L.data\n",
"\n",
" print((L2 - L1)/h)\n",
"\n",
"lol()"
],
"metadata": {
"id": "t8BU0WdjkuQ9",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "be1b867c-89a7-4437-bf64-c8b7b73d1e5d"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"-4.000000000008441\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"L.grad = 1.0\n",
"f.grad = 4.0\n",
"d.grad = -2.0\n",
"\n",
"# c,e is solved by the chain rule!\n",
"\n",
"# dL/dc = dL/dd * dd/dc\n",
"# where dd/dc is summation so its = 1.0\n",
"# c = d.grad * 1.0\n",
"# c = -2.0 * 1.0\n",
"c.grad = -2.0\n",
"e.grad = -2.0\n",
"\n",
"# dL/de = -2.0\n",
"# want: dL/da\n",
"# dL/da = dL/de * de/da = -2.0 * de/da\n",
"\n",
"# e = a * b\n",
"# de/da = b = -3.0\n",
"a.grad = -2.0 * b.data\n",
"b.grad = -2.0 * a.data"
],
"metadata": {
"id": "l0cRGvgamrbM"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"draw_dot(L)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 247
},
"id": "D4qvSQOSkrkD",
"outputId": "8fb7e79a-a4dc-4801-c4d9-f42e4b99b47f"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<graphviz.dot.Digraph at 0x7f9c4bcb7050>"
],
"image/svg+xml": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n -->\n<!-- Title: %3 Pages: 1 -->\n<svg width=\"1201pt\" height=\"154pt\"\n viewBox=\"0.00 0.00 1201.00 154.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 150)\">\n<title>%3</title>\n<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-150 1197,-150 1197,4 -4,4\"/>\n<!-- 140309306125904 -->\n<g id=\"node1\" class=\"node\">\n<title>140309306125904</title>\n<polygon fill=\"none\" stroke=\"#000000\" points=\"664,-54.5 664,-90.5 865,-90.5 865,-54.5 664,-54.5\"/>\n<text text-anchor=\"middle\" x=\"676\" y=\"-68.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">d</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"688,-54.5 688,-90.5 \"/>\n<text text-anchor=\"middle\" x=\"730.5\" y=\"-68.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">data 4.0000</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"773,-54.5 773,-90.5 \"/>\n<text text-anchor=\"middle\" x=\"819\" y=\"-68.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">grad &#45;2.0000</text>\n</g>\n<!-- 140309402803152* -->\n<g id=\"node10\" class=\"node\">\n<title>140309402803152*</title>\n<ellipse fill=\"none\" stroke=\"#000000\" cx=\"928\" cy=\"-99.5\" rx=\"27\" ry=\"18\"/>\n<text text-anchor=\"middle\" x=\"928\" y=\"-95.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">*</text>\n</g>\n<!-- 140309306125904&#45;&gt;140309402803152* -->\n<g id=\"edge9\" class=\"edge\">\n<title>140309306125904&#45;&gt;140309402803152*</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M865.2542,-89.1383C874.5755,-90.6776 883.5479,-92.1593 891.6492,-93.4971\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"891.3169,-96.9896 901.7536,-95.1657 892.4575,-90.0831 891.3169,-96.9896\"/>\n</g>\n<!-- 140309306125904+ -->\n<g id=\"node2\" class=\"node\">\n<title>140309306125904+</title>\n<ellipse fill=\"none\" stroke=\"#000000\" cx=\"601\" cy=\"-72.5\" rx=\"27\" ry=\"18\"/>\n<text text-anchor=\"middle\" x=\"601\" y=\"-68.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">+</text>\n</g>\n<!-- 140309306125904+&#45;&gt;140309306125904 -->\n<g id=\"edge1\" class=\"edge\">\n<title>140309306125904+&#45;&gt;140309306125904</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M628.3662,-72.5C635.8433,-72.5 644.4313,-72.5 653.5802,-72.5\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"653.702,-76.0001 663.702,-72.5 653.7019,-69.0001 653.702,-76.0001\"/>\n</g>\n<!-- 140309506212944 -->\n<g id=\"node3\" class=\"node\">\n<title>140309506212944</title>\n<polygon fill=\"none\" stroke=\"#000000\" points=\"5,-55.5 5,-91.5 200,-91.5 200,-55.5 5,-55.5\"/>\n<text text-anchor=\"middle\" x=\"16.5\" y=\"-69.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">a</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"28,-55.5 28,-91.5 \"/>\n<text text-anchor=\"middle\" x=\"70.5\" y=\"-69.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">data 2.0000</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"113,-55.5 113,-91.5 \"/>\n<text text-anchor=\"middle\" x=\"156.5\" y=\"-69.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">grad 6.0000</text>\n</g>\n<!-- 140309396807440* -->\n<g id=\"node8\" class=\"node\">\n<title>140309396807440*</title>\n<ellipse fill=\"none\" stroke=\"#000000\" cx=\"268\" cy=\"-45.5\" rx=\"27\" ry=\"18\"/>\n<text text-anchor=\"middle\" x=\"268\" y=\"-41.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">*</text>\n</g>\n<!-- 140309506212944&#45;&gt;140309396807440* -->\n<g id=\"edge5\" class=\"edge\">\n<title>140309506212944&#45;&gt;140309396807440*</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M200.2073,-56.9695C211.4112,-55.0739 222.2367,-53.2424 231.825,-51.6202\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"232.4272,-55.0682 241.7032,-49.949 231.2594,-48.1663 232.4272,-55.0682\"/>\n</g>\n<!-- 140309306122448 -->\n<g id=\"node4\" class=\"node\">\n<title>140309306122448</title>\n<polygon fill=\"none\" stroke=\"#000000\" points=\"666,-109.5 666,-145.5 863,-145.5 863,-109.5 666,-109.5\"/>\n<text text-anchor=\"middle\" x=\"676.5\" y=\"-123.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">f</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"687,-109.5 687,-145.5 \"/>\n<text text-anchor=\"middle\" x=\"731.5\" y=\"-123.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">data &#45;2.0000</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"776,-109.5 776,-145.5 \"/>\n<text text-anchor=\"middle\" x=\"819.5\" y=\"-123.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">grad 4.0000</text>\n</g>\n<!-- 140309306122448&#45;&gt;140309402803152* -->\n<g id=\"edge8\" class=\"edge\">\n<title>140309306122448&#45;&gt;140309402803152*</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M863.3805,-110.5663C873.4208,-108.8469 883.1001,-107.1893 891.7753,-105.7036\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"892.5502,-109.1219 901.8159,-103.9841 891.3686,-102.2224 892.5502,-109.1219\"/>\n</g>\n<!-- 140309506212048 -->\n<g id=\"node5\" class=\"node\">\n<title>140309506212048</title>\n<polygon fill=\"none\" stroke=\"#000000\" points=\"0,-.5 0,-36.5 205,-36.5 205,-.5 0,-.5\"/>\n<text text-anchor=\"middle\" x=\"12\" y=\"-14.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">b</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"24,-.5 24,-36.5 \"/>\n<text text-anchor=\"middle\" x=\"68.5\" y=\"-14.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">data &#45;3.0000</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"113,-.5 113,-36.5 \"/>\n<text text-anchor=\"middle\" x=\"159\" y=\"-14.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">grad &#45;4.0000</text>\n</g>\n<!-- 140309506212048&#45;&gt;140309396807440* -->\n<g id=\"edge7\" class=\"edge\">\n<title>140309506212048&#45;&gt;140309396807440*</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M205.4315,-35.2925C214.6641,-36.7987 223.5398,-38.2467 231.5595,-39.555\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"231.1342,-43.0318 241.5673,-41.1877 232.2613,-36.1232 231.1342,-43.0318\"/>\n</g>\n<!-- 140309403504336 -->\n<g id=\"node6\" class=\"node\">\n<title>140309403504336</title>\n<polygon fill=\"none\" stroke=\"#000000\" points=\"331,-82.5 331,-118.5 538,-118.5 538,-82.5 331,-82.5\"/>\n<text text-anchor=\"middle\" x=\"342.5\" y=\"-96.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">c</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"354,-82.5 354,-118.5 \"/>\n<text text-anchor=\"middle\" x=\"400\" y=\"-96.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">data 10.0000</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"446,-82.5 446,-118.5 \"/>\n<text text-anchor=\"middle\" x=\"492\" y=\"-96.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">grad &#45;2.0000</text>\n</g>\n<!-- 140309403504336&#45;&gt;140309306125904+ -->\n<g id=\"edge6\" class=\"edge\">\n<title>140309403504336&#45;&gt;140309306125904+</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M538.0535,-83.0856C547.5392,-81.4904 556.6504,-79.9582 564.8524,-78.5789\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"565.4341,-82.0303 574.7152,-76.9203 564.2732,-75.1272 565.4341,-82.0303\"/>\n</g>\n<!-- 140309396807440 -->\n<g id=\"node7\" class=\"node\">\n<title>140309396807440</title>\n<polygon fill=\"none\" stroke=\"#000000\" points=\"332.5,-27.5 332.5,-63.5 536.5,-63.5 536.5,-27.5 332.5,-27.5\"/>\n<text text-anchor=\"middle\" x=\"344\" y=\"-41.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">e</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"355.5,-27.5 355.5,-63.5 \"/>\n<text text-anchor=\"middle\" x=\"400\" y=\"-41.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">data &#45;6.0000</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"444.5,-27.5 444.5,-63.5 \"/>\n<text text-anchor=\"middle\" x=\"490.5\" y=\"-41.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">grad &#45;2.0000</text>\n</g>\n<!-- 140309396807440&#45;&gt;140309306125904+ -->\n<g id=\"edge4\" class=\"edge\">\n<title>140309396807440&#45;&gt;140309306125904+</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M536.6268,-62.0611C546.5808,-63.6753 556.1548,-65.2278 564.738,-66.6197\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"564.2437,-70.0852 574.675,-68.2311 565.3642,-63.1754 564.2437,-70.0852\"/>\n</g>\n<!-- 140309396807440*&#45;&gt;140309396807440 -->\n<g id=\"edge2\" class=\"edge\">\n<title>140309396807440*&#45;&gt;140309396807440</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M295.1217,-45.5C303.0694,-45.5 312.2947,-45.5 322.1416,-45.5\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"322.1714,-49.0001 332.1714,-45.5 322.1713,-42.0001 322.1714,-49.0001\"/>\n</g>\n<!-- 140309402803152 -->\n<g id=\"node9\" class=\"node\">\n<title>140309402803152</title>\n<polygon fill=\"none\" stroke=\"#000000\" points=\"991,-81.5 991,-117.5 1193,-117.5 1193,-81.5 991,-81.5\"/>\n<text text-anchor=\"middle\" x=\"1004\" y=\"-95.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">L</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"1017,-81.5 1017,-117.5 \"/>\n<text text-anchor=\"middle\" x=\"1061.5\" y=\"-95.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">data &#45;8.0000</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"1106,-81.5 1106,-117.5 \"/>\n<text text-anchor=\"middle\" x=\"1149.5\" y=\"-95.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">grad 1.0000</text>\n</g>\n<!-- 140309402803152*&#45;&gt;140309402803152 -->\n<g id=\"edge3\" class=\"edge\">\n<title>140309402803152*&#45;&gt;140309402803152</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M955.0813,-99.5C962.631,-99.5 971.3302,-99.5 980.608,-99.5\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"980.8754,-103.0001 990.8754,-99.5 980.8754,-96.0001 980.8754,-103.0001\"/>\n</g>\n</g>\n</svg>\n"
},
"metadata": {},
"execution_count": 51
}
]
},
{
"cell_type": "code",
"source": [
"a.data += 0.01 * a.grad\n",
"b.data += 0.01 * b.grad\n",
"c.data += 0.01 * c.grad\n",
"f.data += 0.01 * f.grad\n",
"e = a*b\n",
"d = e+c\n",
"L = d*f\n",
"print(L.data)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "yWWDXJiuxFue",
"outputId": "15bee7dc-1af4-43e0-bcd3-d7e68006036b"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"-7.286496\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"plt.plot(np.arange(-5,5,0.2), np.tanh(np.arange(-5,5,0.2))); \n",
"plt.grid();"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 265
},
"id": "vvAxevYTyIaY",
"outputId": "201bc9c5-0908-414a-8af0-9cc2767ea8fc"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAD4CAYAAADhNOGaAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3deXRc9Xn/8fej3ba828grXsAJtsEsFmYLILM6YXFCgABNYgLEaQ50S9MGSn+kJW1Dmp6StqElLiGQJuCQhWLAwdjGCqRg4wW8yJtsGYxsy5u8yZK1zfP7Y67IICRvM5o7o/t5nTNn7vK9M58vY+bRvd9755q7IyIi0ZUTdgAREQmXCoGISMSpEIiIRJwKgYhIxKkQiIhEXF7YAU7GoEGDfPTo0WHHOGGHDx+mV69eYcdIO/U7WqLab8j8vi9fvnyPuw9uvzwrC8Ho0aNZtmxZ2DFOWHl5OWVlZWHHSDv1O1qi2m/I/L6b2fsdLdehIRGRiFMhEBGJOBUCEZGIUyEQEYk4FQIRkYhLSSEwsyfNbJeZrelkvZnZv5vZJjNbZWbnJaybYWaVwWNGKvKIiMjxS9UewVPAtKOs/zQwLnjMBP4LwMwGAN8GLgCmAN82s/4pyiQiIschJdcRuPvrZjb6KE2mAz/1+G9eLzazfmY2FCgD5rt7LYCZzSdeUJ5NRS4RiQ53p7ElRmNLjObWGE0Jz02tMVpanZZY23PwaI3REnNiMSfm0Orx6daYE3PH25Z5fL0H6x0+nI+/N8Tc2VzVxDo248S3bcvV1gbAP8ybkJ2O23ysITDj4tEMLC5M3X840ndB2XDgg4T56mBZZ8s/xsxmEt+boKSkhPLy8i4J2pXq6uqyMney1O9oOZl+uztHWuFQk3Ow0TnUHH+ua3YaWqChxalvcY60QH1zvG1Tq9MUPDfGoLm13RdoWDauT/lLWsL0kKZtDCtO7fBu1lxZ7O6zgFkApaWlnslX73Um06867Crqd7R01G93Z9ehRt7fW0/1vnqq9zXwQW38uXp/PbsONtLYEuvw9XJzjN5FefQuyqe4MJ++vfIYXphHj4JceuTHH0X5OfTIz6UwP5fCvBwK8nIoyM0hPzc+HX82cnNyyM8xcnOMvNwc8oLp3Bwjx4zcHILn+HxOjpFj8WXxB1jbMwYGFqw34PdvvMFll12GBd/cFrT7cJ625faR+ba2ievSKV2FYBswMmF+RLBsG/HDQ4nLy9OUSUS6QEvMWV9zkLXbD7Jux0HW7ohP76tv/ki7U3oXMqJ/D84d2Z8hfYsY2KuAgcWFDCwuYFCv+HO/nvn0yM8N5cvxZBTmGT0KcsOOccLSVQjmAPeZ2WziA8MH3H2Hmc0D/ilhgPga4IE0ZRKRFIjFnHU1B3mjcg9vVO5mSVU9La++AUBBXg5nDOnNtROHcMaQ3owZXMyI/j0Y3q8HRfnZ94XZXaWkEJjZs8T/sh9kZtXEzwTKB3D3x4G5wGeATUA98JVgXa2ZfQdYGrzUw20DxyKSuQ7UN7Nw/c7gy38Pe+oaAThjSG+uGJnHdRedyfihfRg7qBd5ubpcKdOl6qyh24+x3oF7O1n3JPBkKnKISNdxd1Zs3cfPl2zl5VU7aGyJMbBXAZeOG8Sl4wbzqXGDKOlTFB8jOKfDcz4kQ2XNYLGIhONAfTPPv1PNs29/wIadhyguzOOW0hHcMnkkZw3vS05Odhy/l86pEIhIh/bWNfLogo38clk1jS0xzh7Zj+99/iyunzSMXoX66uhO9GmKyEc0t8b46Vvv84MFG2loauWW0hF88cJRTBzWN+xo0kVUCETkQ+UbdvGdl9ayefdhLvvEYB66fjynn9I77FjSxVQIRISq3XX8w8vreG39LsYM6sWTd5Yy9ZOnZM35+5IcFQKRiHtp1Xa++cuV5Ofk8OBnxjPj4tEU5OmUzyhRIRCJqFjMeXTBRv7jtU2UjurPf/7ReZzSpyjsWBICFQKRCDrc2MI3nnuXeRU7+ULpSL7z2TO1FxBhKgQiEfNBbT1f/ekyNu48xLdvmMCdF4/WWEDEqRCIRMiSqr18/ecraGmN8fRdU7h03OCwI0kGUCEQiYg3Kndz11NLGTmgJ098uZSxg4vDjiQZQoVAJALW7TjI13+2gtMGF/OLr11E3x75YUeSDKLRIZFurubAEb7yk6UUF+bxk6+cryIgH6M9ApFu7NCRZr7y1FLqGlt47msXMbRvj7AjSQZSIRDppppbY9z7zDts3HmIn9x5PhOG9Qk7kmQoHRoS6Ybcnf/3v2t4feNuvvu5s7jsEzo7SDqXkkJgZtPMbIOZbTKz+ztY/6iZvRs8NprZ/oR1rQnr5qQij0jU/Wf5ZmYv/YA/ueJ0bj1/5LE3kEhL+tCQmeUCjwFXA9XAUjOb4+5r29q4+18ktP8T4NyEl2hw93OSzSEicfPX7uT78zZw07nD+cbVnwg7jmSBVOwRTAE2uXuVuzcBs4HpR2l/O/BsCt5XRNo50NDMg8+vZsLQPjzy+Um6YliOi8VvJ5zEC5jdDExz93uC+S8BF7j7fR20HQUsBka4e2uwrAV4F2gBHnH3/+3kfWYCMwFKSkomz549O6ncYairq6O4OHoX8ajf6fPkmkZ+v62Fhy4sYnTf3LS+d5uoft6Q+X2fOnXqcncvbb883WcN3Qb8qq0IBEa5+zYzGwu8Zmar3X1z+w3dfRYwC6C0tNTLysrSEjiVysvLycbcyVK/0+PNzXt4/ZUlfO3ysdz56fFpe9/2ovp5Q/b2PRWHhrYBiaNRI4JlHbmNdoeF3H1b8FwFlPPR8QMROQ5Hmlt54DerGTWwJ39+pcYF5MSkohAsBcaZ2RgzKyD+Zf+xs3/M7AygP/BWwrL+ZlYYTA8CLgHWtt9WRI7u0QUbeX9vPd+96Sx6FIRzSEiyV9KHhty9xczuA+YBucCT7l5hZg8Dy9y9rSjcBsz2jw5KjAd+ZGYx4kXpkcSzjUTk2NZsO8ATb2zhtvNHcvFpg8KOI1koJWME7j4XmNtu2UPt5v+ug+3eBM5KRQaRKGpujfHXv1rFwF4FPPCZ8MYFJLvpJyZEsth/v1HF2h0HefyLk/VjcnLS9BMTIlmqancdP1hQybSJQ5h25pCw40gWUyEQyVL/NHcdhXk5PDx9YthRJMupEIhkoTXbDrBg3S6+eulYTulTFHYcyXIqBCJZ6N8XVtK7KI8ZF48OO4p0AyoEIllm7faDvLp2J3ddMkYDxJISKgQiWeY/Xqukd2Eed10yJuwo0k2oEIhkkfU1B/ntmhruvGQ0fXtqb0BSQ4VAJIv8x2ubKC7M4+5PaW9AUkeFQCRLVO48xNzVO5hx8Sj69SwIO450IyoEIlni31/bRI/8XO7+1Niwo0g3o0IgkgU27arjpVXb+fJFoxnQS3sDkloqBCJZ4IevVVKUl8tXL9XYgKSeCoFIhqvaXcecldv58kWjGFhcGHYc6YZUCEQy3GOLNlOQl8M9l2psQLpGSgqBmU0zsw1mtsnM7u9g/Z1mttvM3g0e9ySsm2FmlcFjRiryiHQXtYebeHHldr5QOpLBvbU3IF0j6fsRmFku8BhwNVANLDWzOR3caewX7n5fu20HAN8GSgEHlgfb7ks2l0h38JsV1TS1xrjjglFhR5FuLBV7BFOATe5e5e5NwGxg+nFuey0w391rgy//+cC0FGQSyXruzjNvb2XyqP58ckjvsONIN5aKQjAc+CBhvjpY1t7nzWyVmf3KzEae4LYikbNkSy1Vuw9z+5RTw44i3Vy6blX5IvCsuzea2deAp4ErTuQFzGwmMBOgpKSE8vLylIfsanV1dVmZO1nq98l5fOUReuZBn/2VlJdvSl2wLhbVzxuyt++pKATbgJEJ8yOCZR9y970Js08A/5ywbVm7bcs7ehN3nwXMAigtLfWysrKOmmW08vJysjF3stTvE1d7uIkV8xdyxwWjuebK7LoDWVQ/b8jevqfi0NBSYJyZjTGzAuA2YE5iAzMbmjB7I7AumJ4HXGNm/c2sP3BNsEwk0n69PD5IrMNCkg5J7xG4e4uZ3Uf8CzwXeNLdK8zsYWCZu88B/tTMbgRagFrgzmDbWjP7DvFiAvCwu9cmm0kkm7k7z2qQWNIoJWME7j4XmNtu2UMJ0w8AD3Sy7ZPAk6nIIdIdLNlSS9Wew/zL1NPDjiIRoSuLRTLMM0u20qcoj+snDT12Y5EUUCEQySC1h5t4ZU0NN503gqL83LDjSESoEIhkEA0SSxhUCEQyhAaJJSwqBCIZYnFVfJD4Du0NSJqpEIhkiGffjg8SX6dBYkkzFQKRDHCgoZlX1tTwuXOHa5BY0k6FQCQDzKuooak1xk3njQg7ikSQCoFIBnhx5XZOHdCTSSP6hh1FIkiFQCRke+oaeXPzXm44eyhmFnYciSAVApGQ/XZNDa0x54azh4UdRSJKhUAkZC+u3M64U4r5ZImuHZBwqBCIhGjHgQaWvlfLDWcP02EhCY0KgUiIXl61A3d0WEhCpUIgEqIXV27nrOF9GTOoV9hRJMJUCERC8v7ew6ysPsANZ+tKYglXSgqBmU0zsw1mtsnM7u9g/TfMbK2ZrTKzhWY2KmFdq5m9GzzmtN9WpLt6adUOAK6bpMNCEq6k71BmZrnAY8DVQDWw1MzmuPvahGbvAKXuXm9mXyd+8/ovBOsa3P2cZHOIZJsXV26ndFR/hvfrEXYUibhU7BFMATa5e5W7NwGzgemJDdx9kbvXB7OLAV1HL5G2cech1tcc0iCxZIRU3LN4OPBBwnw1cMFR2t8N/DZhvsjMlhG/sf0j7v6/HW1kZjOBmQAlJSWUl5cnkzkUdXV1WZk7Wer3x/2msgkD+h6qorz8vXTG6nJR/bwhe/uekpvXHy8z+yJQClyesHiUu28zs7HAa2a22t03t9/W3WcBswBKS0u9rKwsHZFTqry8nGzMnSz1+6Pcnb9f9jsuPr0Pn732wvQH62JR/bwhe/ueikND24CRCfMjgmUfYWZXAQ8CN7p7Y9tyd98WPFcB5cC5KcgkkrEqth9ky57D3KBBYskQqSgES4FxZjbGzAqA24CPnP1jZucCPyJeBHYlLO9vZoXB9CDgEiBxkFmk23lx5XbycoxpZw4JO4oIkIJDQ+7eYmb3AfOAXOBJd68ws4eBZe4+B/g+UAz8MriMfqu73wiMB35kZjHiRemRdmcbiXQrsZjz0qodXPaJwfTrWRB2HBEgRWME7j4XmNtu2UMJ01d1st2bwFmpyCCSDd75YD/b9jfwzWs/EXYUkQ/pymKRNJpXUUN+rnHl+JKwo4h8SIVAJE3cnXkVNVx82iD6FOWHHUfkQyoEImmyvuYQ7++t1yCxZBwVApE0mVdRgxlcpcNCkmFUCETS5JU1NZw/agCDexeGHUXkI1QIRNLg/b2HWV9ziGsmam9AMo8KgUgazKuoAeDaiRofkMyjQiCSBq+sqWHisD6MHNAz7CgiH6NCINLFdh08woqt+5mmvQHJUCoEIl1s3tqdAFyr00YlQ6kQiHSxVytqGDuoF+NOKQ47ikiHVAhEutCB+mbe2ryXayYOIfjBRZGMo0Ig0oUWrt9JS8x1NbFkNBUCkS70ypoahvQpYtLwvmFHEemUCoFIF2lscV6v3M21E0vIydFhIclcKgQiXWT1nlaONMd0EZlkvJQUAjObZmYbzGyTmd3fwfpCM/tFsH6JmY1OWPdAsHyDmV2bijwimWD5rhb69cxnypgBYUcROaqkC4GZ5QKPAZ8GJgC3m9mEds3uBva5++nAo8D3gm0nEL/H8URgGvCfweuJZLWmlhjv7mrlqvEl5OVqx1syWyr+hU4BNrl7lbs3AbOB6e3aTAeeDqZ/BVxp8XPppgOz3b3R3bcAm4LXE8lqi6v20tCCriaWrJCKexYPBz5ImK8GLuisTXCz+wPAwGD54nbbDu/oTcxsJjAToKSkhPLy8hRET6+6urqszJ2sKPb7qYpGCnKc2I61lO9aF3actIri590mW/uekpvXp4O7zwJmAZSWlnpZWVm4gU5CeXk52Zg7WVHrd2vM+ebvF3L2Kc41V04NO07aRe3zTpStfU/FoaFtwMiE+RHBsg7bmFke0BfYe5zbimSVd7buY09dI5NPyZq/syTiUlEIlgLjzGyMmRUQH/yd067NHGBGMH0z8Jq7e7D8tuCsojHAOODtFGQSCc28ihoKcnM4+xSd9yDZIek/WYJj/vcB84Bc4El3rzCzh4Fl7j4H+DHwP2a2CaglXiwI2j0HrAVagHvdvTXZTCJhcXdeqajh4tMH0iOvPuw4IsclJfuu7j4XmNtu2UMJ00eAWzrZ9h+Bf0xFDpGwrdtxiA9qG7i37HSorwo7jshx0QnOIin0SkUNOQZXTdC9iSV7qBCIpNCrFTWUjh7AoOLCsKOIHDcVApEUeW/PYdbXHNJvC0nWUSEQSZF5FTUAXDtRh4Uku6gQiKTIKxU1nDm8DyP69ww7isgJUSEQSYGaA0d4Z+t+/baQZCUVApEUmL+27bCQCoFkHxUCkRR4paKGsYN7cfopxWFHETlhKgQiSdpf38TiqlqunTiE+K+ri2QXFQKRJC1Yt4vWmGt8QLKWCoFIkuZV1DC0bxGTRvQNO4rISVEhEElCfVMLr2/crcNCktVUCESS8LsNu2lsiXGNLiKTLKZCIJKE366poX/PfKaMHhB2FJGTpkIgcpLqm1qYv3Yn084cSl6u/leS7KV/vSIn6bX1u2hobuWGs4eGHUUkKUkVAjMbYGbzzawyeO7fQZtzzOwtM6sws1Vm9oWEdU+Z2RYzezd4nJNMHpF0enHldgb3LuSCMQPDjiKSlGT3CO4HFrr7OGBhMN9ePfBld58ITAN+YGb9Etb/lbufEzzeTTKPSFocPNLMog27ue6soeTm6GwhyW7JFoLpwNPB9NPAZ9s3cPeN7l4ZTG8HdgGDk3xfkVDNr9hJU0uMG88ZFnYUkaSZu5/8xmb73b1fMG3Avrb5TtpPIV4wJrp7zMyeAi4CGgn2KNy9sZNtZwIzAUpKSibPnj37pHOHpa6ujuLi6P0WTXfs978uO8K2uhj/cnmPTq8f6I79Ph5R7Tdkft+nTp263N1LP7bC3Y/6ABYAazp4TAf2t2u77yivMxTYAFzYbpkBhcQLxEPHyuPuTJ482bPRokWLwo4Qiu7W7711jX7aAy/7d+euO2q77tbv4xXVfrtnft+BZd7Bd2resSqIu1/V2Toz22lmQ919h5kNJX7Yp6N2fYCXgQfdfXHCa+8IJhvN7CfAN4+VRyRsr6ypoSXmOltIuo1kxwjmADOC6RnAC+0bmFkB8DzwU3f/Vbt1Q4NnIz6+sCbJPCJdbs7KbYwd3IsJQ/uEHUUkJZItBI8AV5tZJXBVMI+ZlZrZE0GbW4HLgDs7OE3052a2GlgNDAL+Ick8Il1q58EjLNlSyw2Thum3haTbOOahoaNx973AlR0sXwbcE0z/DPhZJ9tfkcz7i6Tby6t24A43nK2zhaT70JXFIifgxVXbmTC0j+5EJt2KCoHIcfqgtp53tu7X3oB0OyoEIsfppVXxk9yun6SzhaR7USEQOU4vrtzOuaf2Y+SAnmFHEUkpFQKR47BpVx1rdxzkhkk6LCTdjwqByHF4adV2zOA6HRaSbkiFQOQY3J0X3t3OBWMGUNKnKOw4IimnQiByDIuratmy5zC3TB4ZdhSRLqFCIHIMz769lT5FeTosJN2WCoHIUdQebuKVNTXcdN4IivJzw44j0iVUCESO4tfLq2lqjXHHBaeGHUWky6gQiHTC3Xn27a2UjurPJ0p6hx1HpMuoEIh0YnFVLVV7DnP7FO0NSPemQiDSCQ0SS1SoEIh0QIPEEiVJFQIzG2Bm882sMnju30m71oSb0sxJWD7GzJaY2SYz+0VwNzOR0LUNEuuwkERBsnsE9wML3X0csDCY70iDu58TPG5MWP494FF3Px3YB9ydZB6RpLUNEk8e1Z9PDtEgsXR/yRaC6cDTwfTTxO87fFyC+xRfAbTdx/iEthfpKku2xAeJ79DegEREsoWgxN13BNM1QEkn7YrMbJmZLTazti/7gcB+d28J5quB4UnmEUnaM0s0SCzRcsx7FpvZAmBIB6seTJxxdzcz7+RlRrn7NjMbC7wW3LD+wIkENbOZwEyAkpISysvLT2TzjFBXV5eVuZOVTf0+1OTMXVVP2cg8Fv/fG0m9Vjb1O5Wi2m/I4r67+0k/gA3A0GB6KLDhOLZ5CrgZMGAPkBcsvwiYdzzvO3nyZM9GixYtCjtCKLKp37N+t9lHfeslX7/jYNKvlU39TqWo9ts98/sOLPMOvlOTPTQ0B5gRTM8AXmjfwMz6m1lhMD0IuARYG4RaFBSFTrcXSRfXILFEVLKF4BHgajOrBK4K5jGzUjN7ImgzHlhmZiuJf/E/4u5rg3XfAr5hZpuIjxn8OMk8Iidt/tqdVO05zJcuHBV2FJG0OuYYwdG4+17gyg6WLwPuCabfBM7qZPsqYEoyGURSwd35t4WVjBrYUzenl8jRlcUiwGvrd1Gx/SD3Tj2dvFz9byHRon/xEnltewMjB/Tgc+fqDGaJHhUCibzyDbtZVX2A+6aeTr72BiSC9K9eIs3d+cHCSob368FN540IO45IKFQIJNJer9zDyg/2c6/2BiTC9C9fIsvd+bcFGxnerwc3T9begESXCoFE1u837WHF1v18vew0CvL0v4JEl/71SyTF9wYqGdq3iFtKtTcg0aZCIJH01ua9LHt/H18vO43CPN2BTKJNhUAi6QcLKynpU8itpSPDjiISOhUCiZzyDbt4e0stf3z5abofsQgqBBIxhxtbePD5NYwd3Ev3IxYJJPWjcyLZ5l9e3cC2/Q0897WLtDcgEtAegUTGO1v38dSb7/HFC09lypgBYccRyRgqBBIJTS0x7v/1aob0KeJb084IO45IRtGhIYmE/yrfzIadh/jxjFJ6F+WHHUckoyS1R2BmA8xsvplVBs/9O2gz1czeTXgcMbPPBuueMrMtCevOSSaPSEcqdx7ih4squeHsYVw5viTsOCIZJ9lDQ/cDC919HLAwmP8Id1/k7ue4+znAFUA98GpCk79qW+/u7yaZR+QjWmPOt369il6FeXz7hglhxxHJSMkWgunA08H008Bnj9H+ZuC37l6f5PuKHJf/ees9Vmzdz0PXT2BQcWHYcUQykrn7yW9stt/d+wXTBuxrm++k/WvAv7r7S8H8U8BFQCPBHoW7N3ay7UxgJkBJScnk2bNnn3TusNTV1VFcXBx2jLQLq997GmI8+PsGxvXP5S8nFxL/J5o++ryjJ9P7PnXq1OXuXtp++TELgZktAIZ0sOpB4OnEL34z2+fuHxsnCNYNBVYBw9y9OWFZDVAAzAI2u/vDx+pMaWmpL1u27FjNMk55eTllZWVhx0i7MPp9uLGFW3/0Fu/tOcy8v7iMEf17pvX9QZ93FGV6382sw0JwzLOG3P2qo7zoTjMb6u47gi/1XUd5qVuB59uKQPDaO4LJRjP7CfDNY+UROZaW1hj3PbOC9TWHeOLLpaEUAZFskuwYwRxgRjA9A3jhKG1vB55NXBAUj7bDSp8F1iSZRyLO3XloTgWLNuzm4ekTmXrGKWFHEsl4yRaCR4CrzawSuCqYx8xKzeyJtkZmNhoYCfyu3fY/N7PVwGpgEPAPSeaRiHv8d1U8s2Qrf3z5afzRBaPCjiOSFZK6oMzd9wJXdrB8GXBPwvx7wPAO2l2RzPuLJJqzcjvfe2U9N5w9jL++9pNhxxHJGvqJCekW3t5SyzefW8n5o/vz/ZsnkZOT3jOERLKZCoFkvc276/jqT5cxYkAP/vvLpfpVUZETpEIgWW3pe7Xc+vhb5OUYT905hX49C8KOJJJ1VAgka/1i6Vbu+O/F9OmRzy++dhGnDtRpoiInQ78+KlmnpTXGP85dx0/+7z0uHTeIH95+Hn176hdFRU6WCoFklQP1zdz37AreqNzDXZeM4W8+cwZ5udqxFUmGCoFkjU276rjn6aVs29/AP39+EreePzLsSCLdggqBZLyGplZ+9PpmHv/dZnoV5PHMVy/k/NG61aRIqqgQSMZyd15atYPvzl3H9gNHuG7SUP72uvEM7dsj7Ggi3YoKgWSkNdsO8PcvVrD0vX1MGNqHR79wDheMHRh2LJFuSYVAMsqGmkP8+PdV/HJ5NQN6FvDdm87i1tKR5OpKYZEuo0IgoWtoauXl1Tt49u2tLH9/HwW5Odx1yRj+9Mpx9O2h00JFupoKgYRmQ80hnn17K79ZUc3BIy2MHdyLv71uPDedN4IBvXSFsEi6qBBI2hw80sxbm/fyRuVu3qjcw/t76ynIzeHTZw3h9imncsGYAWm/naSIqBBIF6o93MTa7Qd5YVMTj61/kxVb99Mac3oW5HLxaQO5+1NjuH7SMP31LxIyFQJJWn1TC9X7GqjcWcfaHQdYt+MQa7cfpObgEQAMOGtEjD++fCyXjhvMeaf2pyBPVwOLZIqkCoGZ3QL8HTAemBLckKajdtOAfwNygSfcve1OZmOA2cBAYDnwJXdvSiaTpE4s5uxvaKb2cCN76prYW9fEnrpGth9ooLq2gep99VTva2Dv4T98ZLk5xumDi7notIFMGNqH8UP7sH/Laq6/5lMh9kREjibZPYI1wE3AjzprYGa5wGPA1UA1sNTM5rj7WuB7wKPuPtvMHgfuBv4ryUzdjrsTc2iNOTGPP1piTkur0xKL0dLqtMac5tYYza3x58aWGM2tMZpagkdrjIamVhqaWznS3EpDUytHWlqpb2rl0JEWDh1ppq6xJZiOz++rb6Y15h/LU5Cbw/D+PRjRvwfXDOvLiGB67KBixpUUf+x+AOXbdNxfJJMle6vKdcCxBvimAJvcvSpoOxuYbmbrgCuAO4J2TxPfu+iyQvDg86tZsqUWiH+5Jvr4191HV7Stb9vuD/Nt6/3D+Q+XJbR1hyONjeT/34JgffzL3T2+ZSzmuBN80fPhF378yz+JTh9FXo7RIz+X3kV59C7Kp7gojwG9Chg1sBfFhXkM7FXAwOICBhYXMqhX/HlArwIG9irQHcBEupF0jBEMBz5ImK8GLiB+OGi/u7ckLP/YfY3bmNlMYCZASUkJ5bNQ1YIAAAQPSURBVOXlJxyksbaJ/jmxP7zmcW7X1q59vbN2ExZMJLZP3KSlR4yC/FYscV3wnBM8mxmGfTifY394mMVvIJFj8UMwOQa5bY8cyDEjLwfyDPJyID8nmM+Jf+kX5kJBLhTmGvnBsj+IAU3BI0EzsA+a9sEO4o8TVVdXd1KfV7ZTv6MnW/t+zEJgZguAIR2setDdX0h9pI65+yxgFkBpaamXlZWd8GucxCYpVV5ezsnkznbqd7REtd+QvX0/ZiFw96uSfI9tQOLvBY8Ilu0F+plZXrBX0LZcRETSKB3n8C0FxpnZGDMrAG4D5nj8APoi4Oag3QwgbXsYIiISl1QhMLPPmVk1cBHwspnNC5YPM7O5AMFf+/cB84B1wHPuXhG8xLeAb5jZJuJjBj9OJo+IiJy4ZM8aeh54voPl24HPJMzPBeZ20K6K+FlFIiISEl3eKSIScSoEIiIRp0IgIhJxKgQiIhFn7X9qIRuY2W7g/bBznIRBwJ6wQ4RA/Y6WqPYbMr/vo9x9cPuFWVkIspWZLXP30rBzpJv6HS1R7Tdkb991aEhEJOJUCEREIk6FIL1mhR0gJOp3tES135ClfdcYgYhIxGmPQEQk4lQIREQiToUgJGb2l2bmZjYo7CzpYGbfN7P1ZrbKzJ43s35hZ+pKZjbNzDaY2SYzuz/sPOlgZiPNbJGZrTWzCjP7s7AzpZOZ5ZrZO2b2UthZTpQKQQjMbCRwDbA17CxpNB84090nARuBB0LO02XMLBd4DPg0MAG43cwmhJsqLVqAv3T3CcCFwL0R6XebPyP+U/tZR4UgHI8Cfw1EZqTe3V9NuD/1YuJ3pOuupgCb3L3K3ZuA2cD0kDN1OXff4e4rgulDxL8UO70PeXdiZiOA64Anws5yMlQI0szMpgPb3H1l2FlCdBfw27BDdKHhwAcJ89VE5AuxjZmNBs4FloSbJG1+QPyPu1jYQU5GUjemkY6Z2QJgSAerHgT+hvhhoW7naP129xeCNg8SP4Tw83Rmk/Qxs2Lg18Cfu/vBsPN0NTO7Htjl7svNrCzsPCdDhaALuPtVHS03s7OAMcBKM4P44ZEVZjbF3WvSGLFLdNbvNmZ2J3A9cKV37wtYtgEjE+ZHBMu6PTPLJ14Efu7uvwk7T5pcAtxoZp8BioA+ZvYzd/9iyLmOmy4oC5GZvQeUunsm/1phSpjZNOBfgcvdfXfYebqSmeURHxC/kngBWArckXCv7m7J4n/dPA3Uuvufh50nDMEewTfd/fqws5wIjRFIuvwQ6A3MN7N3zezxsAN1lWBQ/D5gHvEB0+e6exEIXAJ8Cbgi+IzfDf5KlgynPQIRkYjTHoGISMSpEIiIRJwKgYhIxKkQiIhEnAqBiEjEqRCIiEScCoGISMT9f4wnEA+Ihc5dAAAAAElFTkSuQmCC\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"source": [
"L.tanh()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Zs8t7jPLkOcI",
"outputId": "ad70fbf0-c4d6-4784-d5f1-1a5336b95cb7"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"Value(data=-0.9999997749296758)"
]
},
"metadata": {},
"execution_count": 16
}
]
},
{
"cell_type": "code",
"source": [
"a = Value(3.0, label='a')\n",
"b = a+a; b.label = 'b'\n",
"b.backward()\n",
"draw_dot(b)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 81
},
"id": "lpyFiNvBlhbo",
"outputId": "487f06b2-aca1-4316-d162-1c8af39025d7"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<graphviz.dot.Digraph at 0x7f9c4bcf20d0>"
],
"image/svg+xml": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n -->\n<!-- Title: %3 Pages: 1 -->\n<svg width=\"525pt\" height=\"45pt\"\n viewBox=\"0.00 0.00 525.00 45.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 41)\">\n<title>%3</title>\n<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-41 521,-41 521,4 -4,4\"/>\n<!-- 140309263491216 -->\n<g id=\"node1\" class=\"node\">\n<title>140309263491216</title>\n<polygon fill=\"none\" stroke=\"#000000\" points=\"321,-.5 321,-36.5 517,-36.5 517,-.5 321,-.5\"/>\n<text text-anchor=\"middle\" x=\"333\" y=\"-14.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">b</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"345,-.5 345,-36.5 \"/>\n<text text-anchor=\"middle\" x=\"387.5\" y=\"-14.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">data 6.0000</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"430,-.5 430,-36.5 \"/>\n<text text-anchor=\"middle\" x=\"473.5\" y=\"-14.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">grad 1.0000</text>\n</g>\n<!-- 140309263491216+ -->\n<g id=\"node2\" class=\"node\">\n<title>140309263491216+</title>\n<ellipse fill=\"none\" stroke=\"#000000\" cx=\"258\" cy=\"-18.5\" rx=\"27\" ry=\"18\"/>\n<text text-anchor=\"middle\" x=\"258\" y=\"-14.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">+</text>\n</g>\n<!-- 140309263491216+&#45;&gt;140309263491216 -->\n<g id=\"edge1\" class=\"edge\">\n<title>140309263491216+&#45;&gt;140309263491216</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M285.3115,-18.5C292.8223,-18.5 301.4512,-18.5 310.6318,-18.5\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"310.7835,-22.0001 320.7835,-18.5 310.7835,-15.0001 310.7835,-22.0001\"/>\n</g>\n<!-- 140309263491664 -->\n<g id=\"node3\" class=\"node\">\n<title>140309263491664</title>\n<polygon fill=\"none\" stroke=\"#000000\" points=\"0,-.5 0,-36.5 195,-36.5 195,-.5 0,-.5\"/>\n<text text-anchor=\"middle\" x=\"11.5\" y=\"-14.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">a</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"23,-.5 23,-36.5 \"/>\n<text text-anchor=\"middle\" x=\"65.5\" y=\"-14.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">data 3.0000</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"108,-.5 108,-36.5 \"/>\n<text text-anchor=\"middle\" x=\"151.5\" y=\"-14.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">grad 2.0000</text>\n</g>\n<!-- 140309263491664&#45;&gt;140309263491216+ -->\n<g id=\"edge2\" class=\"edge\">\n<title>140309263491664&#45;&gt;140309263491216+</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M195.0268,-18.5C204.1551,-18.5 212.9704,-18.5 220.9692,-18.5\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"220.9719,-22.0001 230.9718,-18.5 220.9718,-15.0001 220.9719,-22.0001\"/>\n</g>\n</g>\n</svg>\n"
},
"metadata": {},
"execution_count": 52
}
]
},
{
"cell_type": "code",
"source": [
"a = Value(-2.0, label='a')\n",
"b = Value(3.0, label='b')\n",
"d = a*b; d.label = 'd'\n",
"e = a+b; d.label = 'e'\n",
"f = d*e; d.label = 'f'\n",
"\n",
"f.backward()\n",
"\n",
"draw_dot(f)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 175
},
"id": "zKvQupSnyVtA",
"outputId": "fc975fb0-d7b4-4c5c-d833-b0f92cab56d2"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<graphviz.dot.Digraph at 0x7f9c4bcb7210>"
],
"image/svg+xml": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n<!-- Generated by graphviz version 2.40.1 (20161225.0304)\n -->\n<!-- Title: %3 Pages: 1 -->\n<svg width=\"857pt\" height=\"100pt\"\n viewBox=\"0.00 0.00 857.00 100.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 96)\">\n<title>%3</title>\n<polygon fill=\"#ffffff\" stroke=\"transparent\" points=\"-4,4 -4,-96 853,-96 853,4 -4,4\"/>\n<!-- 140309262945872 -->\n<g id=\"node1\" class=\"node\">\n<title>140309262945872</title>\n<polygon fill=\"none\" stroke=\"#000000\" points=\"330,-55.5 330,-91.5 527,-91.5 527,-55.5 330,-55.5\"/>\n<text text-anchor=\"middle\" x=\"340\" y=\"-69.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"350,-55.5 350,-91.5 \"/>\n<text text-anchor=\"middle\" x=\"392.5\" y=\"-69.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">data 1.0000</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"435,-55.5 435,-91.5 \"/>\n<text text-anchor=\"middle\" x=\"481\" y=\"-69.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">grad &#45;6.0000</text>\n</g>\n<!-- 140309262945232* -->\n<g id=\"node8\" class=\"node\">\n<title>140309262945232*</title>\n<ellipse fill=\"none\" stroke=\"#000000\" cx=\"590\" cy=\"-45.5\" rx=\"27\" ry=\"18\"/>\n<text text-anchor=\"middle\" x=\"590\" y=\"-41.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">*</text>\n</g>\n<!-- 140309262945872&#45;&gt;140309262945232* -->\n<g id=\"edge9\" class=\"edge\">\n<title>140309262945872&#45;&gt;140309262945232*</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M527.0974,-56.4057C536.5173,-54.7725 545.5961,-53.1985 553.7856,-51.7787\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"554.387,-55.2267 563.6421,-50.0698 553.1912,-48.3296 554.387,-55.2267\"/>\n</g>\n<!-- 140309262945872+ -->\n<g id=\"node2\" class=\"node\">\n<title>140309262945872+</title>\n<ellipse fill=\"none\" stroke=\"#000000\" cx=\"267\" cy=\"-73.5\" rx=\"27\" ry=\"18\"/>\n<text text-anchor=\"middle\" x=\"267\" y=\"-69.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">+</text>\n</g>\n<!-- 140309262945872+&#45;&gt;140309262945872 -->\n<g id=\"edge1\" class=\"edge\">\n<title>140309262945872+&#45;&gt;140309262945872</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M294.0315,-73.5C301.6149,-73.5 310.3553,-73.5 319.6644,-73.5\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"319.9613,-77.0001 329.9613,-73.5 319.9613,-70.0001 319.9613,-77.0001\"/>\n</g>\n<!-- 140309263252688 -->\n<g id=\"node3\" class=\"node\">\n<title>140309263252688</title>\n<polygon fill=\"none\" stroke=\"#000000\" points=\"1.5,-55.5 1.5,-91.5 202.5,-91.5 202.5,-55.5 1.5,-55.5\"/>\n<text text-anchor=\"middle\" x=\"13.5\" y=\"-69.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">b</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"25.5,-55.5 25.5,-91.5 \"/>\n<text text-anchor=\"middle\" x=\"68\" y=\"-69.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">data 3.0000</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"110.5,-55.5 110.5,-91.5 \"/>\n<text text-anchor=\"middle\" x=\"156.5\" y=\"-69.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">grad &#45;8.0000</text>\n</g>\n<!-- 140309263252688&#45;&gt;140309262945872+ -->\n<g id=\"edge6\" class=\"edge\">\n<title>140309263252688&#45;&gt;140309262945872+</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M202.7342,-73.5C212.2639,-73.5 221.4519,-73.5 229.7544,-73.5\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"229.7565,-77.0001 239.7565,-73.5 229.7565,-70.0001 229.7565,-77.0001\"/>\n</g>\n<!-- 140309263249616* -->\n<g id=\"node5\" class=\"node\">\n<title>140309263249616*</title>\n<ellipse fill=\"none\" stroke=\"#000000\" cx=\"267\" cy=\"-18.5\" rx=\"27\" ry=\"18\"/>\n<text text-anchor=\"middle\" x=\"267\" y=\"-14.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">*</text>\n</g>\n<!-- 140309263252688&#45;&gt;140309263249616* -->\n<g id=\"edge4\" class=\"edge\">\n<title>140309263252688&#45;&gt;140309263249616*</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M175.6935,-55.4949C185.2882,-52.7128 194.9287,-49.6935 204,-46.5 214.609,-42.7651 225.918,-37.9995 235.9838,-33.4631\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"237.5699,-36.586 245.19,-29.225 234.6427,-30.2274 237.5699,-36.586\"/>\n</g>\n<!-- 140309263249616 -->\n<g id=\"node4\" class=\"node\">\n<title>140309263249616</title>\n<polygon fill=\"none\" stroke=\"#000000\" points=\"330,-.5 330,-36.5 527,-36.5 527,-.5 330,-.5\"/>\n<text text-anchor=\"middle\" x=\"340.5\" y=\"-14.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">f</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"351,-.5 351,-36.5 \"/>\n<text text-anchor=\"middle\" x=\"395.5\" y=\"-14.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">data &#45;6.0000</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"440,-.5 440,-36.5 \"/>\n<text text-anchor=\"middle\" x=\"483.5\" y=\"-14.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">grad 1.0000</text>\n</g>\n<!-- 140309263249616&#45;&gt;140309262945232* -->\n<g id=\"edge8\" class=\"edge\">\n<title>140309263249616&#45;&gt;140309262945232*</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M527.0974,-34.9838C536.4127,-36.5411 545.3943,-38.0427 553.5123,-39.3999\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"553.2018,-42.8965 563.6421,-41.0934 554.3562,-35.9923 553.2018,-42.8965\"/>\n</g>\n<!-- 140309263249616*&#45;&gt;140309263249616 -->\n<g id=\"edge2\" class=\"edge\">\n<title>140309263249616*&#45;&gt;140309263249616</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M294.0315,-18.5C301.6149,-18.5 310.3553,-18.5 319.6644,-18.5\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"319.9613,-22.0001 329.9613,-18.5 319.9613,-15.0001 319.9613,-22.0001\"/>\n</g>\n<!-- 140309263252176 -->\n<g id=\"node6\" class=\"node\">\n<title>140309263252176</title>\n<polygon fill=\"none\" stroke=\"#000000\" points=\"0,-.5 0,-36.5 204,-36.5 204,-.5 0,-.5\"/>\n<text text-anchor=\"middle\" x=\"11.5\" y=\"-14.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">a</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"23,-.5 23,-36.5 \"/>\n<text text-anchor=\"middle\" x=\"67.5\" y=\"-14.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">data &#45;2.0000</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"112,-.5 112,-36.5 \"/>\n<text text-anchor=\"middle\" x=\"158\" y=\"-14.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">grad &#45;3.0000</text>\n</g>\n<!-- 140309263252176&#45;&gt;140309262945872+ -->\n<g id=\"edge7\" class=\"edge\">\n<title>140309263252176&#45;&gt;140309262945872+</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M172.6226,-36.5301C183.2123,-39.6243 193.9462,-42.9843 204,-46.5 214.4701,-50.1613 225.6678,-54.7359 235.6752,-59.0733\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"234.2811,-62.2836 244.8427,-63.1216 237.1088,-55.8802 234.2811,-62.2836\"/>\n</g>\n<!-- 140309263252176&#45;&gt;140309263249616* -->\n<g id=\"edge5\" class=\"edge\">\n<title>140309263252176&#45;&gt;140309263249616*</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M204.1499,-18.5C213.1243,-18.5 221.7693,-18.5 229.6257,-18.5\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"229.8071,-22.0001 239.8071,-18.5 229.807,-15.0001 229.8071,-22.0001\"/>\n</g>\n<!-- 140309262945232 -->\n<g id=\"node7\" class=\"node\">\n<title>140309262945232</title>\n<polygon fill=\"none\" stroke=\"#000000\" points=\"653,-27.5 653,-63.5 849,-63.5 849,-27.5 653,-27.5\"/>\n<text text-anchor=\"middle\" x=\"663\" y=\"-41.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\"> </text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"673,-27.5 673,-63.5 \"/>\n<text text-anchor=\"middle\" x=\"717.5\" y=\"-41.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">data &#45;6.0000</text>\n<polyline fill=\"none\" stroke=\"#000000\" points=\"762,-27.5 762,-63.5 \"/>\n<text text-anchor=\"middle\" x=\"805.5\" y=\"-41.8\" font-family=\"Times,serif\" font-size=\"14.00\" fill=\"#000000\">grad 1.0000</text>\n</g>\n<!-- 140309262945232*&#45;&gt;140309262945232 -->\n<g id=\"edge3\" class=\"edge\">\n<title>140309262945232*&#45;&gt;140309262945232</title>\n<path fill=\"none\" stroke=\"#000000\" d=\"M617.3115,-45.5C624.8223,-45.5 633.4512,-45.5 642.6318,-45.5\"/>\n<polygon fill=\"#000000\" stroke=\"#000000\" points=\"642.7835,-49.0001 652.7835,-45.5 642.7835,-42.0001 642.7835,-49.0001\"/>\n</g>\n</g>\n</svg>\n"
},
"metadata": {},
"execution_count": 54
}
]
},
{
"cell_type": "code",
"source": [
"class Neuron:\n",
" \n",
" def __init__(self, nin):\n",
" self.w = [Value(random.uniform(-1,1)) for _ in range(nin)]\n",
" self.b = Value(random.uniform(-1,1))\n",
" \n",
" def __call__(self, x):\n",
" # w * x + b\n",
" act = sum((wi*xi for wi, xi in zip(self.w, x)), self.b)\n",
" out = act.tanh()\n",
" return out\n",
" \n",
" def parameters(self):\n",
" return self.w + [self.b]"
],
"metadata": {
"id": "X9W1tzjKyrnD"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"x = [2.0, 3.0]\n",
"n = Neuron(2)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 329
},
"id": "wvWq8RJOxige",
"outputId": "9994e426-e467-4f83-ead2-2ee2ea9df1e5"
},
"execution_count": null,
"outputs": [
{
"output_type": "error",
"ename": "NameError",
"evalue": "ignored",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-5-dba6f26906f6>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m2.0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3.0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mNeuron\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m<ipython-input-3-1c32feb1c296>\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, nin)\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnin\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mw\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mValue\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0muniform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0m_\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnin\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mValue\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0muniform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m<ipython-input-3-1c32feb1c296>\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__init__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnin\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mw\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mValue\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0muniform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0m_\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnin\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mValue\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0muniform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mNameError\u001b[0m: name 'Value' is not defined"
]
}
]
},
{
"cell_type": "code",
"source": [],
"metadata": {
"id": "n_5ZMyvMxlbt"
},
"execution_count": null,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment