|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962 |
- {
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# 线性模型和梯度下降\n",
- "\n",
- "本节我们简单回顾一下线性回归模型,并演示一下如何使用PyTorch来对线性回归模型进行建模和模型参数计算。"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 1. 一元线性回归\n",
- "一元线性模型非常简单,假设我们有变量 $x_i$ 和目标 $y_i$,每个 i 对应于一个数据点,希望建立一个模型\n",
- "\n",
- "$$\n",
- "\\hat{y}_i = w x_i + b\n",
- "$$\n",
- "\n",
- "$\\hat{y}_i$ 是我们预测的结果,希望通过 $\\hat{y}_i$ 来拟合目标 $y_i$,通俗来讲就是找到这个函数拟合 $y_i$ 使得误差最小,即最小化\n",
- "\n",
- "$$\n",
- "\\frac{1}{n} \\sum_{i=1}^n(\\hat{y}_i - y_i)^2\n",
- "$$"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "那么如何最小化这个误差呢?\n",
- "\n",
- "这里需要用到**梯度下降**,这是我们接触到的第一个优化算法,非常简单,但是却非常强大,在深度学习中被大量使用,所以让我们从简单的例子出发了解梯度下降法的原理"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 2. 梯度下降法\n",
- "在梯度下降法中,我们首先要明确梯度的概念,随后我们再了解如何使用梯度进行下降。"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### 2.1 梯度\n",
- "梯度在数学上就是导数,如果是一个多元函数,那么梯度就是偏导数。比如一个函数f(x, y),那么 f 的梯度就是 \n",
- "\n",
- "$$\n",
- "(\\frac{\\partial f}{\\partial x},\\ \\frac{\\partial f}{\\partial y})\n",
- "$$\n",
- "\n",
- "可以称为 grad f(x, y) 或者 $\\nabla f(x, y)$。具体某一点 $(x_0,\\ y_0)$ 的梯度就是 $\\nabla f(x_0,\\ y_0)$。\n",
- "\n",
- "下面这个图片是 $f(x) = x^2$ 这个函数在 x=1 处的梯度\n",
- "\n",
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "梯度有什么意义呢?从几何意义来讲,一个点的梯度值是这个函数变化最快的地方,具体来说,对于函数 f(x, y),在点 $(x_0, y_0)$ 处,沿着梯度 $\\nabla f(x_0,\\ y_0)$ 的方向,函数增加最快,也就是说沿着梯度的方向,我们能够更快地找到函数的极大值点,或者反过来沿着梯度的反方向,我们能够更快地找到函数的最小值点。"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### 2.2 梯度下降法\n",
- "有了对梯度的理解,我们就能了解梯度下降发的原理了。上面我们需要最小化这个误差,也就是需要找到这个误差的最小值点,那么沿着梯度的反方向我们就能够找到这个最小值点。\n",
- "\n",
- "我们可以来看一个直观的解释。比如我们在一座大山上的某处位置,由于我们不知道怎么下山,于是决定走一步算一步,也就是在每走到一个位置的时候,求解当前位置的梯度,沿着梯度的负方向,也就是当前最陡峭的位置向下走一步,然后继续求解当前位置梯度,向这一步所在位置沿着最陡峭最易下山的位置走一步。这样一步步的走下去,一直走到觉得我们已经到了山脚。当然这样走下去,有可能我们不能走到山脚,而是到了某一个局部的山峰低处。\n",
- "\n",
- "类比我们的问题,就是沿着梯度的反方向,我们不断改变 w 和 b 的值,最终找到一组最好的 w 和 b 使得误差最小。\n",
- "\n",
- "在更新的时候,我们需要决定每次更新的幅度,比如在下山的例子中,我们需要每次往下走的那一步的长度,这个长度称为学习率,用 $\\eta$ 表示,这个学习率非常重要,不同的学习率都会导致不同的结果,学习率太小会导致下降非常缓慢,学习率太大又会导致跳动非常明显,可以看看下面的例子\n",
- "\n",
- "\n",
- "\n",
- "可以看到上面的学习率较为合适,而下面的学习率太大,就会导致不断跳动\n",
- "\n",
- "最后我们的更新公式就是\n",
- "\n",
- "$$\n",
- "w := w - \\eta \\frac{\\partial f(w,\\ b)}{\\partial w} \\\\\n",
- "b := b - \\eta \\frac{\\partial f(w,\\ b)}{\\partial b}\n",
- "$$\n",
- "\n",
- "通过不断地迭代更新,最终我们能够找到一组最优的 w 和 b,这就是梯度下降法的原理。\n",
- "\n",
- "最后可以通过这张图形象地说明一下这个方法\n",
- "\n",
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### 2.3 PyTorch实现\n",
- "\n",
- "上面是原理部分,下面通过一个例子来进一步学习线性模型"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "<torch._C.Generator at 0x7f60af667e50>"
- ]
- },
- "execution_count": 1,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "import torch\n",
- "import numpy as np\n",
- "from torch.autograd import Variable\n",
- "\n",
- "torch.manual_seed(2021)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[<matplotlib.lines.Line2D at 0x7f60acfc2910>]"
- ]
- },
- "execution_count": 2,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "<Figure size 432x288 with 1 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "# 生层测试数据\n",
- "x_train = np.random.rand(20, 1)\n",
- "y_train = x_train * 3 + 4 + 3*np.random.rand(20,1)\n",
- "\n",
- "# 画出图像\n",
- "import matplotlib.pyplot as plt\n",
- "%matplotlib inline\n",
- "\n",
- "plt.plot(x_train, y_train, 'bo')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [],
- "source": [
- "# 转换成 Tensor\n",
- "x_train = torch.from_numpy(x_train)\n",
- "y_train = torch.from_numpy(y_train)\n",
- "\n",
- "# 定义参数 w 和 b\n",
- "w = Variable(torch.randn(1), requires_grad=True) # 随机初始化\n",
- "b = Variable(torch.zeros(1), requires_grad=True) # 使用 0 进行初始化"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [],
- "source": [
- "# 构建线性回归模型\n",
- "x_train = Variable(x_train)\n",
- "y_train = Variable(y_train)\n",
- "\n",
- "def linear_model(x):\n",
- " return x * w + b\n",
- "\n",
- "def logistc_regression(x):\n",
- " return torch.sigmoid(x*w+b) "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [],
- "source": [
- "y_ = linear_model(x_train)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "经过上面的步骤我们就定义好了模型,在进行参数更新之前,我们可以先看看模型的输出结果长什么样"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "<matplotlib.legend.Legend at 0x7f60ad93f3d0>"
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWoAAAD4CAYAAADFAawfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAXEUlEQVR4nO3df5BV5X3H8c8XXMRVa8yyzWgIuziTUFdQhNXBZmKoEqTqRB07He0axYlFpVr7I3Z0+CNOlUk700o1E8UdS4ywNkZMHKalraPikCb+WnQ1CSgkuOAiLStaogLlx377x9ldYLnLPXf3nHuec8/7NbOze8+9nPM8e+HDc59fx9xdAIBwjcm6AACAYyOoASBwBDUABI6gBoDAEdQAELjj0jjphAkTvLm5OY1TA0BNWrdu3Qfu3ljquVSCurm5WZ2dnWmcGgBqkpltGe45uj4AIHAENQAEjqAGgMCl0kddyv79+9XT06O9e/dW65I1b/z48Zo4caLq6uqyLgqAFFUtqHt6enTyySerublZZlaty9Ysd9fOnTvV09OjyZMnZ10cACmqWtfH3r171dDQQEgnxMzU0NDAJxQgAB0dUnOzNGZM9L2jI9nzV61FLYmQThi/TyB7HR3SggXS7t3R4y1boseS1NaWzDUYTASAUVi06FBID9i9OzqeFII6pubmZn3wwQdZFwNAYLZurez4SAQb1Gn2+bi7+vr6kjshgMKaNKmy4yMRZFAP9Pls2SK5H+rzGU1Yd3d3a8qUKbr++us1depU3XvvvTrvvPN09tln69vf/vbg66688krNnDlTZ511ltrb2xOoDYBatnixVF9/5LH6+uh4UoIM6rT6fDZt2qSFCxdqyZIl2rZtm1599VV1dXVp3bp1Wrt2rSRp2bJlWrdunTo7O/Xggw9q586do7sogJrW1ia1t0tNTZJZ9L29PbmBRKnKsz7iSqvPp6mpSbNmzdK3vvUtPfvsszr33HMlSZ988ok2bdqkCy+8UA8++KB+8pOfSJLee+89bdq0SQ0NDaO7MICa1taWbDAPFWRQT5oUdXeUOj4aJ554oqSoj/ruu+/WzTfffMTzL774op577jm99NJLqq+v1+zZs5mnDCBzQXZ9pN3nc8kll2jZsmX65JNPJEnbtm3Tjh07tGvXLp166qmqr6/X22+/rZdffjmZCwLAKATZoh74CLFoUdTdMWlSFNJJfbSYO3euNmzYoAsuuECSdNJJJ2nFihWaN2+eli5dqjPPPFNTpkzRrFmzkrkgAIyCuXviJ21tbfWhNw7YsGGDzjzzzMSvVXT8XoHaYGbr3L211HNBdn0AAA4hqIECSXvzIKQjyD5qAMmrxuZBSActaqAgqrF5ENJBUAMFUY3Ng5AOghooiGpsHoR0ENQlPPbYY3r//fcHH990001av379qM/b3d2tJ554ouI/N3/+fK1cuXLU10exVWPzIKQj3KDOcHh6aFA/+uijamlpGfV5RxrUQBKqsXkQ0hFmUKexz6mkFStW6Pzzz9f06dN188036+DBg5o/f76mTp2qadOmacmSJVq5cqU6OzvV1tam6dOna8+ePZo9e7YGFvCcdNJJuvPOO3XWWWdpzpw5evXVVzV79mydccYZWrVqlaQokL/yla9oxowZmjFjhn7+859Lku666y799Kc/1fTp07VkyRIdPHhQd9555+B2q4888oikaC+S2267TVOmTNGcOXO0Y8eOUdUbGNDWJnV3S3190XdCOifcPfGvmTNn+lDr168/6tiwmprco4g+8qupKf45Slz/8ssv93379rm7+6233ur33HOPz5kzZ/A1H330kbu7f/WrX/XXXntt8PjhjyX56tWr3d39yiuv9K997Wu+b98+7+rq8nPOOcfd3T/99FPfs2ePu7tv3LjRB34fa9as8csuu2zwvI888ojfe++97u6+d+9enzlzpm/evNmffvppnzNnjh84cMC3bdvmp5xyij/11FPD1gvFsGJF9E/ALPq+YkXWJUKSJHX6MJka5jzqFIann3/+ea1bt07nnXeeJGnPnj2aN2+eNm/erNtvv12XXXaZ5s6dW/Y848aN07x58yRJ06ZN0/HHH6+6ujpNmzZN3d3dkqT9+/frtttuU1dXl8aOHauNGzeWPNezzz6rt956a7D/edeuXdq0aZPWrl2ra6+9VmPHjtXpp5+uiy66aMT1Rm1gDnSxhdn1kcLwtLvrhhtuUFdXl7q6uvTOO+/ogQce0JtvvqnZs2dr6dKluummm8qep66ubvDu32PGjNHxxx8/+POBAwckSUuWLNHnPvc5vfnmm+rs7NS+ffuGLdN3v/vdwTK9++67sf6zQPEwB7rYwgzqFIanL774Yq1cuXKwv/fDDz/Uli1b1NfXp6uvvlr33XefXn/9dUnSySefrI8//njE19q1a5dOO+00jRkzRsuXL9fBgwdLnveSSy7Rww8/rP3790uSNm7cqE8//VQXXnihnnzySR08eFDbt2/XmjVrRlwW1AbmQBdbmF0fKexz2tLSovvuu09z585VX1+f6urqdP/99+uqq64avNHtd77zHUnRdLhbbrlFJ5xwgl566aWKr7Vw4UJdffXVevzxxzVv3rzBGxacffbZGjt2rM455xzNnz9fd9xxh7q7uzVjxgy5uxobG/XMM8/oqquu0gsvvKCWlhZNmjRpcDtWFFdaN9NAPrDNac7xey2GoX3UUvQhk+l1tYNtToGcYw50sYXZ9QHgKGnfQBXhqmqLOo1uliLj9wkUQ9WCevz48dq5cyfhkhB3186dOzV+/PisiwIgZbG6PszsLyXdJMkl/ULSje6+t5ILTZw4UT09Pert7a28lChp/PjxmjhxYtbFqEkdHendXBmoVNmgNrPPS/pzSS3uvsfMfiTpGkmPVXKhuro6TZ48eUSFBKqJVYAITdyuj+MknWBmx0mql/R+mdcDucUqQISmbFC7+zZJ/yBpq6Ttkna5+7NDX2dmC8ys08w66d5AnrEKEKEpG9RmdqqkKyRNlnS6pBPN7Lqhr3P3dndvdffWxsbG5EsKVAl3QkFo4nR9zJH0rrv3uvt+ST+W9PvpFgvIDndCQWjiBPVWSbPMrN6ibeMulrQh3WIByYt70yBWASI0ZWd9uPsrZrZS0uuSDkh6Q1J72gUDklTpTA5WASIkVduUCchSc3Pp3eeamqJbUgFZY1MmFB4zOZBnBDUKgZkcyDOCGoUQ8kyOuIOcKC6CGoUQ6kyOgUHOLVsk90ODnIQ1DsdgIpAhBjkxgMFEIFAMciIOghrIEIOciIOgBjIU8iAnwkFQAxkKdZATYSGogSoqNRWvrS0aOOzri74T0hiKu5ADVcKdYzBStKhrFIsowsOdYzBSBHUNYhFFmJiKd7SsGxRZXz8ugroG0XILE1PxjpR1gyLr61eCoK5BtNzCVMtT8UbSMs26QZH19StBUNcgWm5hqtWpeCNtmWbdoMj6+pUgqGtQLbfc8q4Wp+KNtGWadYMi6+tXgqCuQbXackOYRtoyzbpBkfX1K0FQ16habLkhTCNtmWbdoMj6+pVgm1MAozJ0IY8UtUxDDb1Qsc0pci0vc12LKk8t07xiCTmCxrLrfGhr4/1IEy1qBC1Pc10Px6cAJIkWNYKWp7muA/gUgKQF1aKmFYKh8jTXdUBePwUgXMEEdZ7W3aN68jTXdUAePwUgbMEENa0QlJLHGQV5/BSAsAUT1LRCMJy8Ld7J46cAhC2YoP7sZ0sfpxWSL4wz5PNTAMIWxKyPjg7pt789+vi4cbRC8oTZDocwrxhJCmIJeXNz9I96qIYG6YMPkisX0jXc+9jUFHVZABhe8EvIh+uH/vDD6pYDo8M4A5COIIKaUfLawPsIpCNWUJvZZ8xspZm9bWYbzOyCJAvBKHlt4H1MH4O1xRS3Rf2ApP9w99+TdI6kDUkWglHy2sD7mC4WhRVX2cFEMztFUpekMzzmyCP7UQPJY7C2to12MHGypF5J3zezN8zsUTM7scRFFphZp5l19vb2jrLIAIZisLa44gT1cZJmSHrY3c+V9Kmku4a+yN3b3b3V3VsbGxsTLiYABmuLK05Q90jqcfdX+h+vVBTcQO7laXCOwdriKhvU7v7fkt4zsyn9hy6WtD7VUgFVkLfBOQZriyvWykQzmy7pUUnjJG2WdKO7fzTc6xlMRB4wOIeQHGswMdZeH+7eJankCYC8YnAOeRHEykQgCwzOIS8IahQWg3PIC4IahcXgHPIiiP2ogaywbzTyIJct6jzNfQWA0cpdi5q7iAAomty1qLlbOYCiyV1QM/cVQNHkLqiZ+wqgaHIX1Mx9BVA0uQtq5r4CKJrczfqQmPsKoFhy16IGgKIhqGNggQ2ALOWy66OaWGADIGu0qMtggQ2ArBHUZbDABkDWCOoyWGADIGsEdRkssAGQNYK6DBbYAMgasz5iYIENgCzRogaAwBHUABA4ghoAAkdQA0DgCGoACBxBDQCBI6gBIHAENQAEjqAGgMAR1AAQOIIaAAJHUANA4GIHtZmNNbM3zOxf0ywQAOBIlbSo75C0Ia2CAABKixXUZjZR0mWSHk23OACAoeK2qP9J0t9I6hvuBWa2wMw6zayzt7c3ibIBABQjqM3sckk73H3dsV7n7u3u3ururY2NjYkVEACKLk6L+suSvm5m3ZJ+KOkiM1uRaqkAAIPKBrW73+3uE929WdI1kl5w9+tSLxkAQBLzqAEgeBXd3NbdX5T0YiolAQCURIsaAAJHUANA4AhqAAgcQQ0AgSOoASBwBDUABI6gBoDAEdQAEDiCGgACR1ADQOAIagAIHEENAIEjqAEgcAQ1AASOoAaAwBHUABA4ghoAAkdQA0DgCGoACBxBDQCBI6gBIHAENQAEjqAGgMAR1AAQOIIaAAJHUANA4AhqAAgcQQ0AgSOoAWC0Ojqk5mZpzJjoe0dHoqc/LtGzAUDRdHRICxZIu3dHj7dsiR5LUltbIpegRQ0Ao7Fo0aGQHrB7d3Q8IQQ1gOJKosti69bKjo8AQQ2gmAa6LLZskdwPdVlUGtaTJlV2fATKBrWZfcHM1pjZejP7lZndkdjVASArSXVZLF4s1dcfeay+PjqekDgt6gOS/trdWyTNkvRnZtaSWAkAIAtJdVm0tUnt7VJTk2QWfW9vT2wgUYox68Pdt0va3v/zx2a2QdLnJa1PrBQAUG2TJkXdHaWOV6qtLdFgHqqiPmoza5Z0rqRXSjy3wMw6zayzt7c3oeIBqGkpzz8+pip0WSQldlCb2UmSnpb0F+7+26HPu3u7u7e6e2tjY2OSZQRQi5IazBupKnRZJCVWUJtZnaKQ7nD3H6dbJAC5M5KWcRXmH5fV1iZ1d0t9fdH3AENaitFHbWYm6Z8lbXD3+9MvEoBcGenKvCrMP64VcVrUX5b0DUkXmVlX/9elKZcLQF6MtGVchfnHtaJsULv7f7m7ufvZ7j69/2t1NQoHIGFpDN6NtGWco8G8rLEyESiKtAbvRtoyztFgXtYIaiBPRtMiTmvwbjQt45wM5mWNoAbyYuFC6RvfGHmLOK3BO1rGqSOogazFaSV3dEhLl0YBfbhKWsRpDt7RMk4VQQ1U09BQXrgwXr/xokVHh/SAuC1iBu9yi6AG0lCqlVxqMG/p0nj9xscK47gtYroocst8uP+lR6G1tdU7OzsTPy+QC0MXgEhRy/WEE6SdO+OdwyzqRhjQ3Fx6AyEzaflywrYGmNk6d28t9RwtaqCUNGZXxA1p6ehWcqluCzPpllsI6QIgqFFscbsokphdMRyzIx+X6jcu1W2xfLn00EOVXQu5RNcHiqOjI2rtbt0atVgvvVT6wQ/id1E0NUUzGsoZrpuioUHas+fo691wg7R69aFyLV5MK7mAjtX1QVCjGEr1G5sNP5OilKH9xpVcq74+ahFLR/5nQSij37GCuuzueUBNKNVvXGkjpZLZFQPXLBXIBDMqRB81wpfERkKV9Bs3NIx+vjELQJAgghphS2ojoeFaw6UG8h54gPnGCAp91AjbcANzcQf2BgzXb8xAHgLBPGpUT9L7HSe1kdBwq/IeeoguCgSPwUQkZ6S3ZDqWSZNKt6hHspFQWxtBjFyiRY3kpLHfMRsJAQQ1EpTGfsdsJAQQ1DUrjXvjlZPWfsdMdUPBEdS1KK1745VDNwWQCoK6FqV1b7xy6KYAUsE86lo0Zkzp5dFx96oAUHXMoy6aNO+NB6DqCOpaRF8xUFMI6lpEXzFQUwjqOLKY6jZaTGkDagZLyMtJY1k0AFSAFnU5WU11A4B+BHU5aSyLBoAK5DOoq9lnzFQ3ABnLX1BXe3k0U90AZCycoO7okCZMiKaTmUU/lwrfavcZM9UNQMZiLSE3s3mSHpA0VtKj7v53x3p9xUvIOzqkG2+U9u8/8vi4cdKyZUeGIsujAdSgUS0hN7Oxkr4n6Q8ltUi61sxaEi3hokVHh7Qk7dt3dEuZPmMABROn6+N8Sb92983uvk/SDyVdkWgpjjWDYuhz9BkDKJg4Qf15Se8d9rin/9gRzGyBmXWaWWdvb29lpThWa3joc/QZAyiYxAYT3b3d3VvdvbWxsbGyP7x4sVRXd/TxceNKt5RZHg2gQOIE9TZJXzjs8cT+Y8lpa5O+/32poeHQsYaGowcSAaCA4uz18ZqkL5rZZEUBfY2kP0m8JG1thDIAlFA2qN39gJndJuk/FU3PW+buv0q9ZAAASTF3z3P31ZJWp1wWAEAJ4axMBACURFADQOAIagAIXKy9Pio+qVmvpC0lnpog6YPEL5gf1L+49S9y3SXqH6f+Te5echFKKkE9HDPrHG7TkSKg/sWtf5HrLlH/0dafrg8ACBxBDQCBq3ZQt1f5eqGh/sVV5LpL1H9U9a9qHzUAoHJ0fQBA4AhqAAhcKkFtZvPM7B0z+7WZ3VXi+ePN7Mn+518xs+Y0ypGVGPX/KzNbb2ZvmdnzZtaURTnTUK7uh73uajNzM6upKVtx6m9mf9z//v/KzJ6odhnTFOPv/iQzW2Nmb/T//b80i3KmwcyWmdkOM/vlMM+bmT3Y/7t5y8xmxD65uyf6pWiHvd9IOkPSOElvSmoZ8pqFkpb2/3yNpCeTLkdWXzHr/weS6vt/vrVW6h+n7v2vO1nSWkkvS2rNutxVfu+/KOkNSaf2P/7drMtd5fq3S7q1/+cWSd1ZlzvB+l8oaYakXw7z/KWS/l2SSZol6ZW4506jRR3nHotXSPpB/88rJV1sZpZCWbJQtv7uvsbdd/c/fFnRzRhqQdz7a94r6e8l7a1m4aogTv3/VNL33P0jSXL3HVUuY5ri1N8l/U7/z6dIer+K5UuVu6+V9OExXnKFpMc98rKkz5jZaXHOnUZQx7nH4uBr3P2ApF2SGlQbYt1j8jDfVPS/bC0oW/f+j3tfcPd/q2bBqiTOe/8lSV8ys5+Z2ctmNq9qpUtfnPrfI+k6M+tRtHXy7dUpWhAqzYZBsfajRjrM7DpJrZK+mnVZqsHMxki6X9L8jIuSpeMUdX/MVvRJaq2ZTXP3/82yUFV0raTH3P0fzewCScvNbKq792VdsJCl0aKOc4/FwdeY2XGKPgLtTKEsWYh1j0kzmyNpkaSvu/v/ValsaStX95MlTZX0opl1K+qnW1VDA4px3vseSavcfb+7vytpo6LgrgVx6v9NST+SJHd/SdJ4RRsWFcGI7z+bRlAP3mPRzMYpGixcNeQ1qyTd0P/zH0l6wft722tA2fqb2bmSHlEU0rXUR3nMurv7Lnef4O7N7t6sqH/+6+7emU1xExfn7/4zilrTMrMJirpCNlexjGmKU/+tki6WJDM7U1FQ91a1lNlZJen6/tkfsyTtcvftsf5kSqOflypqKfxG0qL+Y3+r6B+lFL05T0n6taRXJZ2R9Yhtlev/nKT/kdTV/7Uq6zJXq+5DXvuiamjWR8z33hR1/6yX9AtJ12Rd5irXv0XSzxTNCOmSNDfrMidY93+RtF3SfkWfnL4p6RZJtxz23n+v/3fzi0r+7rOEHAACx8pEAAgcQQ0AgSOoASBwBDUABI6gBoDAEdQAEDiCGgAC9/+bEuVWW4FDeQAAAABJRU5ErkJggg==\n",
- "text/plain": [
- "<Figure size 432x288 with 1 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "plt.plot(x_train.data.numpy(), y_train.data.numpy(), 'bo', label='real')\n",
- "plt.plot(x_train.data.numpy(), y_.data.numpy(), 'ro', label='estimated')\n",
- "plt.legend()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "**思考:红色的点表示预测值,似乎排列成一条直线,请思考一下这些点是否在一条直线上?**"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "这个时候需要计算我们的误差函数,也就是\n",
- "\n",
- "$$\n",
- "E = \\sum_{i=1}^n(\\hat{y}_i - y_i)^2\n",
- "$$"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [],
- "source": [
- "# 计算误差\n",
- "def get_loss(y_, y):\n",
- " return torch.sum((y_ - y) ** 2)\n",
- "\n",
- "loss = get_loss(y_, y_train)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "tensor(687.4893, dtype=torch.float64, grad_fn=<SumBackward0>)\n"
- ]
- }
- ],
- "source": [
- "# 打印一下看看 loss 的大小\n",
- "print(loss)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "定义好了误差函数,接下来我们需要计算 w 和 b 的梯度了,这时得益于 PyTorch 的自动求导,我们不需要手动去算梯度,有兴趣的同学可以手动计算一下,w 和 b 的梯度分别是\n",
- "\n",
- "$$\n",
- "\\frac{\\partial}{\\partial w} = \\frac{2}{n} \\sum_{i=1}^n x_i(w x_i + b - y_i) \\\\\n",
- "\\frac{\\partial}{\\partial b} = \\frac{2}{n} \\sum_{i=1}^n (w x_i + b - y_i)\n",
- "$$"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [],
- "source": [
- "# 自动求导\n",
- "loss.backward()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "tensor([-120.5742])\n",
- "tensor([-231.9290])\n"
- ]
- }
- ],
- "source": [
- "# 查看 w 和 b 的梯度\n",
- "print(w.grad)\n",
- "print(b.grad)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {},
- "outputs": [],
- "source": [
- "# 更新一次参数\n",
- "w.data = w.data - 1e-2 * w.grad.data\n",
- "b.data = b.data - 1e-2 * b.grad.data"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "更新完成参数之后,我们再一次看看模型输出的结果"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "<matplotlib.legend.Legend at 0x7f60ace2d450>"
- ]
- },
- "execution_count": 12,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "<Figure size 432x288 with 1 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "y_ = linear_model(x_train)\n",
- "plt.plot(x_train.data.numpy(), y_train.data.numpy(), 'bo', label='real')\n",
- "plt.plot(x_train.data.numpy(), y_.data.numpy(), 'ro', label='estimated')\n",
- "plt.legend()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "从上面的例子可以看到,更新之后红色的线跑到了蓝色的线下面,没有特别好的拟合蓝色的真实值,所以我们需要在进行几次更新"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "epoch: 19, loss: 18.053107839401285\n",
- "epoch: 39, loss: 16.176534764175827\n",
- "epoch: 59, loss: 15.469259285871882\n",
- "epoch: 79, loss: 15.202689710228258\n",
- "epoch: 99, loss: 15.102220561226387\n"
- ]
- }
- ],
- "source": [
- "for e in range(100): # 进行 100 次更新\n",
- " y_ = linear_model(x_train)\n",
- " loss = get_loss(y_, y_train)\n",
- " \n",
- " w.grad.zero_() # 记得归零梯度\n",
- " b.grad.zero_() # 记得归零梯度\n",
- " loss.backward()\n",
- " \n",
- " w.data = w.data - 1e-2 * w.grad.data # 更新 w\n",
- " b.data = b.data - 1e-2 * b.grad.data # 更新 b \n",
- " if (e + 1) % 20 == 0:\n",
- " print('epoch: {}, loss: {}'.format(e, loss.item()))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "<matplotlib.legend.Legend at 0x7f60acf30b90>"
- ]
- },
- "execution_count": 14,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWoAAAD4CAYAAADFAawfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAXGElEQVR4nO3df5BV5X3H8c93cQEXqXEW4mjI7uJMQkEQhNVgZ0QaEKhmotZOJ84mSmKCSrWmnTijs3/oVJlMZ1qpphlxa4lVVqtidGhjE6piSRMVdw0aAxYMWXTRBlwNVX6EH/vtH3eXH+u97Nm958dz7n2/Zu7s3ruHe5/nXvazz3nO88PcXQCAcNVkXQAAwIkR1AAQOIIaAAJHUANA4AhqAAjcSUk86bhx47ypqSmJpwaAitTZ2fm+u48v9rNEgrqpqUkdHR1JPDUAVCQz217qZ3R9AEDgCGoACBxBDQCBS6SPupiDBw+qu7tb+/fvT+slK97o0aM1YcIE1dbWZl0UAAlKLai7u7s1duxYNTU1yczSetmK5e7q6elRd3e3Jk6cmHVxACQota6P/fv3q76+npCOiZmpvr6eMxQgAO3tUlOTVFNT+NreHu/zp9ailkRIx4z3E8hee7u0ZIm0d2/h/vbthfuS1NISz2twMREAytDaejSk++3dW3g8LgR1RE1NTXr//fezLgaAwLz99tAeH45ggzrJPh93V29vb3xPCKBqNTQM7fHhCDKo+/t8tm+X3I/2+ZQT1l1dXZo0aZKuvvpqTZ06VXfeeafOO+88nXPOObr99tuPHHf55Zdr1qxZOvvss9XW1hZDbQBUsmXLpLq64x+rqys8HpcggzqpPp+tW7dq6dKlWr58uXbs2KENGzZo48aN6uzs1Pr16yVJK1euVGdnpzo6OnTvvfeqp6envBcFUNFaWqS2NqmxUTIrfG1ri+9CopTyqI+okurzaWxs1OzZs/Wd73xHa9eu1bnnnitJ+vjjj7V161bNmTNH9957r5566ilJ0jvvvKOtW7eqvr6+vBcGUNFaWuIN5oGCDOqGhkJ3R7HHyzFmzBhJhT7q2267Tdddd91xP3/hhRf07LPP6sUXX1RdXZ3mzp3LOGUAmQuy6yPpPp+FCxdq5cqV+vjjjyVJO3bs0M6dO7V7926ddtppqqur05tvvqmXXnopnhcEgDIE2aLuP4VobS10dzQ0FEI6rlOLBQsWaPPmzbrgggskSaeccopWrVqlRYsWacWKFZo8ebImTZqk2bNnx/OCAFAGc/fYn7S5udkHbhywefNmTZ48OfbXqna8r0BlMLNOd28u9rMguz4AAEcR1AAQOIIaAAJHUANA4AhqAAgcQQ0AgSOoi3jwwQf17rvvHrn/zW9+U5s2bSr7ebu6uvTII48M+d8tXrxYq1evLvv1AeRTuEGd9N42JzAwqB944AFNmTKl7OcdblADqG5hBnUS65xKWrVqlc4//3zNmDFD1113nQ4fPqzFixdr6tSpmjZtmpYvX67Vq1ero6NDLS0tmjFjhvbt26e5c+eqfwLPKaecoltuuUVnn3225s+frw0bNmju3Lk666yztGbNGkmFQL7wwgs1c+ZMzZw5Uz//+c8lSbfeeqt++tOfasaMGVq+fLkOHz6sW2655chyq/fff7+kwlokN954oyZNmqT58+dr586dZdUbQM65e+y3WbNm+UCbNm36xGMlNTa6FyL6+FtjY/TnKPL6X/rSl/zAgQPu7n7DDTf4HXfc4fPnzz9yzIcffuju7hdddJG/8sorRx4/9r4kf+aZZ9zd/fLLL/eLL77YDxw44Bs3bvTp06e7u/uePXt837597u6+ZcsW738/1q1b55deeumR573//vv9zjvvdHf3/fv3+6xZs3zbtm3+5JNP+vz58/3QoUO+Y8cOP/XUU/2JJ54oWS8A+Sepw0tkaqS1PszsZknfkmSS/snd/yG5Px1KZJ3T5557Tp2dnTrvvPMkSfv27dOiRYu0bds23XTTTbr00ku1YMGCQZ9n5MiRWrRokSRp2rRpGjVqlGprazVt2jR1dXVJkg4ePKgbb7xRGzdu1IgRI7Rly5aiz7V27Vq9/vrrR/qfd+/era1bt2r9+vW66qqrNGLECJ155pn64he/OOx6A8i/QYPazKaqENLnSzog6cdm9u/u/lZipUpgnVN31zXXXKPvfve7xz2+bNky/eQnP9GKFSv0+OOPa+XKlSd8ntra2iO7f9fU1GjUqFFHvj906JAkafny5Tr99NP12muvqbe3V6NHjy5Zpu9973tauHDhcY8/88wzw6ojgMoUpY96sqSX3X2vux+S9F+S/jTRUiWwzum8efO0evXqI/29H3zwgbZv367e3l5deeWVuuuuu/Tqq69KksaOHauPPvpo2K+1e/dunXHGGaqpqdHDDz+sw4cPF33ehQsX6r777tPBgwclSVu2bNGePXs0Z84cPfbYYzp8+LDee+89rVu3bthlAZB/Ubo+3pC0zMzqJe2TdImkjoEHmdkSSUskqaHcFf4TWOd0ypQpuuuuu7RgwQL19vaqtrZWd999t6644oojG932t7YXL16s66+/XieffLJefPHFIb/W0qVLdeWVV+qhhx7SokWLjmxYcM4552jEiBGaPn26Fi9erJtvvlldXV2aOXOm3F3jx4/X008/rSuuuELPP/+8pkyZooaGhiPLsQKoTpGWOTWzayUtlbRH0q8k/d7dv13qeJY5TQ/vK1AZyl7m1N3/2d1nufscSR9KKn51DEDQMpyegDJEHfXxaXffaWYNKvRPs/UJkDP90xP27i3c75+eICW7MSvKF3XCy5NmtknSv0n6C3f/3XBeLEo3C6Lj/cRQtLYeDel+e/cWHkfYIrWo3f3Ccl9o9OjR6unpUX19/ZHhbRg+d1dPT0/JoX/AQAlMT0BKUtvcdsKECeru7tauXbvSesmKN3r0aE2YMCHrYiAnEpiegJSkFtS1tbWaOHFiWi8HYIBly47vo5bKnp6AlIS5KBOA2LW0SG1tUmOjZFb42tbGhcQ8SK1FDSB7LS0Ecx7RogaAwBHUABA4ghoAAkdQA0DgCGoACBxBDQCBI6gBIHAENQAEjqAGgMAR1EBOsOh/9WIKOZADLPpf3WhRAznAov/VjaAGcoBF/6sbQQ3kQKnF/Vn0vzoQ1EAOLFtWWOT/WCz6Xz0IaiAHWPS/ujHqA8gJFv2vXrSoASBwBDUABI6gBoDAEdQAEDiCGgDKlfBCLIz6AIBypLAQCy1qAChHCguxENQAUI4UFmIhqAGgHCksxEJQA0A5UliIhaAGUL3iGK2RwkIsjPoAUJ3iHK2R8EIstKiBItifsArkaNucSEFtZn9lZr8yszfM7FEzG510wYCs9De0tm+X3I82tAjrCpOjbXMGDWoz+4ykv5TU7O5TJY2Q9JWkCwZkJUcNLZQjR9vmRO36OEnSyWZ2kqQ6Se8mVyQgWzlqaKEcOdo2Z9Cgdvcdkv5O0tuS3pO0293XDjzOzJaYWYeZdezatSv+kgIpyVFDC+XI0bY5Ubo+TpN0maSJks6UNMbMvjrwOHdvc/dmd28eP358/CUFUpKjhhbK1dIidXVJvb2FrwGGtBSt62O+pN+4+y53Pyjph5L+KNliAdnJUUMLVSLKOOq3Jc02szpJ+yTNk9SRaKmAjLE/IUISpY/6ZUmrJb0q6Zd9/6Yt4XIBAPpEmpno7rdLuj3hsgAAimBmIoDsMAU0Etb6AJCNFHZGqRS0qAFkgymgkRHUqBqcZQeGKaCREdSoCiy0FCCmgEZGUKMqcJadsOGcrjAFNDKCGlWBs+wEDfd0hSmgkZm7x/6kzc3N3tHB5EWEo6mpkB8DNTYWlnhAGXhzY2Fmne7eXOxntKhRFTjLThCnK4kjqFEVOMtOEBcFE0dQo2rkZEXL/OF0JXEENYDycLqSOKaQAygf68ImihY1UE2YnplLBDWQsdSyk+mZuUVQAxlKNTuZnplbBDWQoVSzk/HOuUVQAxlKNTsZ75xbBDWQoVSzk/HOuUVQAxkacnaWc+WR8c65xThqIEP9GdnaWujuaGgohHTR7Fy6VFqxonDVURre1lWMd84lVs8D8qC9Xfra146G9LFYpa4isHoekHetrcVDWmLURhUgqIGsRel3PlEYM2qj4hHUQJaizngpFcZmjNqoAgQ1kKaBreebb44246XY8BAz6frruThYBRj1AaSlv/XcH8zFtq/qN7CrY0jDQ1BpaFEDSSjW71xsvngpxbo62PmgatGiBuJWrOV87P3BMFsQA9CiBuJWYqWl3poRRQ/ff0o9swVxQrSogbiVGEpnvYe1R3Uao6Mhvkd1um3UPbq3i2BGabSogbiVGEq3XY36ltrUpUb1ytTVd/8fPyCkcWIEdYVix6UMlVhp6e76ZXpULZqoLo1QryaqS4+qhfkqGBRBXYHYcSkGCaxS94V7WlhlFMPj7rHfZs2a5chOY6N7IaKPvzU2Zl2ynFi1yr2u7vg3r66u8HgMT93Y6G5W+BrDU6IMIX0ekjq8RKYO2qI2s0lmtvGY2/+Z2beT/xOC4WLHpSGIOt45pv2xGAp9vCy76PJ05jmkZU7NbISkHZK+4O4lp1WxzGm2mpqKT3pjNcwBBo53lgp9EaXGO5sVEhaxKPX2pzU6MbTfkziXOZ0n6dcnCmlkjx2XSoi6zsaI4uOduepX2nBaxllvip6rM89SfSLFbpJWSrqxxM+WSOqQ1NHQ0JBWtw5KCKnvLQjF+p1PdEuoj7oSDbdL36z4W2+WTrlDu5ajE/RRDyWkR0p6X9Lpgx3LxUQEp9RvZanfVP7SRTbcwMs6KBO8ZjwsJwrqoXR9/ImkV939tzE26IF0RD2f7e8j4qpfZMPtQsi6iy5Pe/0OJaivkvRoUgUBElWqf7medTbKVeqtHaxLP4SgzMvf40hBbWZjJF0s6YfJFgdISKnm2z335OM3NWDltIzzEpRZixTU7r7H3evdfXfSBQISEULzrULx1iZvSOOoo2IcNWLVPwmFnU1QwU40jpplThG2UovwS4Q1qgaLMiFsWc+KAAJAUCNsuZo+BiSDoEbYhjv2C6ggBDXClvWsCCAABDXCxtgvgKBGzBJYYLhdLWpSl2rUqyZ1qV2ENKoLw/MQnwSG0jE6D2DCC+KUwErsoS3uDiQlzo0DgNISGErH6DyAoEacEhhKl9fReVnuBYjKQ1AjPgkMpcvj6Lw8bZqKfCCoEZ8EhtLlcXQes94RNy4mAjGrqSm0pAdiE3OcCBcTgRTltV8d4QoqqLkAg0qQx351hC2YoOYCDCpFHvvVEbZggpoLMDHj9CRT7AWIOAUzhZyJDTFi3jVQUYJpUXMBJkacngAVJZig5gJMjDg9ASpKMEHNBZgYcXoCVJRggrq9vXBm/vbbhTxZtoyQHrYMT0+4hgnEL4iLiVz7iln/m5byXz4+RyAZQUwhZ83hysDnCAxf8FPIufZVGfgcgWQEEdRc+6oMfI5AMoIIaobmVQY+RyAZQQQ1Q/MqA58jkIwgLiYCQLUL/mIiAKA0ghoAAkdQAznCzM/qFCmozexTZrbazN40s81mdkHSBQNwPDbXqF5RW9T3SPqxu/+hpOmSNidXpADRjEEAWL22eg261oeZnSppjqTFkuTuByQdSLZYAWEBCwSCmZ/VK0qLeqKkXZJ+YGa/MLMHzGxMwuUKB80YBIKZn9UrSlCfJGmmpPvc/VxJeyTdOvAgM1tiZh1m1rFr166Yi5khmjEIBDM/q1eUoO6W1O3uL/fdX61CcB/H3dvcvdndm8ePHx9nGbNFMwaBYOZn9Ro0qN39fyW9Y2aT+h6aJ2lToqUKCc0YBITdzatT1I0DbpLUbmYjJW2T9PXkihSYjBbhB4B+rPUBAAFgrQ+gBIbIIw+C2DMRyAJD5JEX+WxR0wxCDBgij7zIX4uaZhBiwhB55EX+WtQ0gxAThsgjL/IX1DSDEBOGyCMvwgnq9nZp3LjClCuzwvfF+p5pBiEmzPRDXoQR1O3t0te/LvX0HH2sp0f6xjc+GdY0gxAjZvohD8II6tZW6eDBTz5+4MAn+55pBgGoMmHMTKypKWxZUYxZobkDABUs/JmJJ+pfpu8ZQJULI6iXLZNqaz/5+MiR9D0DqHphBHVLi/SDH0j19Ucfq6+XVq6k7xlA1QtnZmJLC6EMAEWE0aIGAJREUANA4AhqAAhcLoOaVU4BVJNwLiZGxCqnAKpN7lrUrHIKoNrkLqhZ5RRAtcldULPKKYBqk7ugZpVTANUmd0HNKqcAqk3uRn1IzDYHUF1y16IGgGpDUANA4AhqAAgcQQ0AgSOoASBwBDUABI6gBoDAEdQAEDiCGgACR1ADQOAiTSE3sy5JH0k6LOmQuzcnWSgAwFFDWevjj939/cRKAgAoiq6PCNijEUCWoga1S1prZp1mtqTYAWa2xMw6zKxj165d8ZUwY/17NG7fLrkf3aORsAaQFnP3wQ8y+4y77zCzT0v6T0k3ufv6Usc3Nzd7R0dHjMXMTlNTIZwHamyUurrSLg2ASmVmnaWu/0VqUbv7jr6vOyU9Jen8+IoXNvZoBJC1QYPazMaY2dj+7yUtkPRG0gULBXs0AshalBb16ZL+28xek7RB0o/c/cfJFisc7NEIIGuDDs9z922SpqdQliD1b/nV2lro7mhoKIQ0W4EBSEsu90xMG3s0AsgS46gBIHAENQAEjqAGgMAR1AAQOIIaAAIXaQr5kJ/UbJekIhOvNU5SNa/AR/2rt/7VXHeJ+kepf6O7jy/2g0SCuhQz66jmtaypf/XWv5rrLlH/cutP1wcABI6gBoDApR3UbSm/Xmiof/Wq5rpL1L+s+qfaRw0AGDq6PgAgcAQ1AAQukaA2s0Vm9j9m9paZ3Vrk56PM7LG+n79sZk1JlCMrEer/12a2ycxeN7PnzKwxi3ImYbC6H3PclWbmZlZRQ7ai1N/M/rzv8/+VmT2SdhmTFOH/foOZrTOzX/T9/78ki3ImwcxWmtlOMyu6sYoV3Nv33rxuZjMjP7m7x3qTNELSryWdJWmkpNckTRlwzFJJK/q+/4qkx+IuR1a3iPX/Y0l1fd/fUCn1j1L3vuPGSlov6SVJzVmXO+XP/nOSfiHptL77n8663CnXv03SDX3fT5HUlXW5Y6z/HEkzJb1R4ueXSPoPSSZptqSXoz53Ei3q8yW95e7b3P2ApH+VdNmAYy6T9C9936+WNM/MLIGyZGHQ+rv7Onff23f3JUkTUi5jUqJ89pJ0p6S/lbQ/zcKlIEr9vyXp++7+oXRkH9JKEaX+LukP+r4/VdK7KZYvUV7Y8PuDExxymaSHvOAlSZ8yszOiPHcSQf0ZSe8cc7+777Gix7j7IUm7JdUnUJYsRKn/sa5V4a9sJRi07n2ne5919x+lWbCURPnsPy/p82b2MzN7ycwWpVa65EWp/x2Svmpm3ZKekXRTOkULwlCz4Qh2eMmQmX1VUrOki7IuSxrMrEbS3ZIWZ1yULJ2kQvfHXBXOpNab2TR3/12WhUrRVZIedPe/N7MLJD1sZlPdvTfrgoUsiRb1DkmfPeb+hL7Hih5jZiepcArUk0BZshCl/jKz+ZJaJX3Z3X+fUtmSNljdx0qaKukFM+tSoZ9uTQVdUIzy2XdLWuPuB939N5K2qBDclSBK/a+V9LgkufuLkkarsGBRNYiUDcUkEdSvSPqcmU00s5EqXCxcM+CYNZKu6fv+zyQ973297RVg0Pqb2bmS7lchpCupj/KEdXf33e4+zt2b3L1Jhf75L7t7RzbFjV2U//tPq9CalpmNU6ErZFuKZUxSlPq/LWmeJJnZZBWCeleqpczOGklX943+mC1pt7u/F+lfJnT18xIVWgq/ltTa99jfqPBLKRU+nCckvSVpg6Szsr5im3L9n5X0W0kb+25rsi5zWnUfcOwLqqBRHxE/e1Oh+2eTpF9K+krWZU65/lMk/UyFESEbJS3Iuswx1v1RSe9JOqjCmdO1kq6XdP0xn/33+96bXw7l/z5TyAEgcMxMBIDAEdQAEDiCGgACR1ADQOAIagAIHEENAIEjqAEgcP8PqzUTWzG9JkAAAAAASUVORK5CYII=\n",
- "text/plain": [
- "<Figure size 432x288 with 1 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "y_ = linear_model(x_train)\n",
- "plt.plot(x_train.data.numpy(), y_train.data.numpy(), 'bo', label='real')\n",
- "plt.plot(x_train.data.numpy(), y_.data.numpy(), 'ro', label='estimated')\n",
- "plt.legend()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "经过 100 次更新,我们发现红色的预测结果已经比较好的拟合了蓝色的真实值。\n",
- "\n",
- "现在你已经学会了你的第一个机器学习模型了,再接再厉,完成下面的小练习。"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### 2.4 练习题\n",
- "\n",
- "重启 notebook 运行上面的线性回归模型,但是改变训练次数以及不同的学习率进行尝试得到不同的结果"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 3. 多项式回归模型"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "下面我们更进一步,讲一讲多项式回归。什么是多项式回归呢?非常简单,根据上面的线性回归模型\n",
- "\n",
- "$$\n",
- "\\hat{y} = w x + b\n",
- "$$\n",
- "\n",
- "这里是关于 x 的一个一次多项式,这个模型比较简单,没有办法拟合比较复杂的模型,所以我们可以使用更高次的模型,比如\n",
- "\n",
- "$$\n",
- "\\hat{y} = w_0 + w_1 x + w_2 x^2 + w_3 x^3 + \\cdots\n",
- "$$\n",
- "\n",
- "这样就能够拟合更加复杂的模型,这就是多项式模型,这里使用了 x 的更高次,同理还有多元回归模型,形式也是一样的,只是出了使用 x,还是更多的变量,比如 y、z 等等,同时他们的 loss 函数和简单的线性回归模型是一致的。"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "首先我们可以先定义一个需要拟合的目标函数,这个函数是个三次的多项式"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "y = 0.90 + 0.50 * x + 3.00 * x^2 + 2.40 * x^3\n"
- ]
- }
- ],
- "source": [
- "# 定义一个多变量函数\n",
- "\n",
- "w_target = np.array([0.5, 3, 2.4]) # 定义参数\n",
- "b_target = np.array([0.9]) # 定义参数\n",
- "\n",
- "f_des = 'y = {:.2f} + {:.2f} * x + {:.2f} * x^2 + {:.2f} * x^3'.format(\n",
- " b_target[0], w_target[0], w_target[1], w_target[2]) # 打印出函数的式子\n",
- "\n",
- "print(f_des)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "我们可以先画出这个多项式的图像"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "<matplotlib.legend.Legend at 0x7f60a9e47e10>"
- ]
- },
- "execution_count": 16,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAD7CAYAAACPDORaAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAlIklEQVR4nO3deXxU9b3/8dcnG2FfQkAkQED2TYGwVcuDFheqXjdai61L1YpetbWtt7Xq7bX9aW+1trbaai1Vi1aLIGq1dSlqVVzKLpssBtmSCCQsCQSyznx+f2TgorIlM8mZmbyfj0ceM3PmzPl+zhDeOfOd7/kec3dERCQ5pQRdgIiINB6FvIhIElPIi4gkMYW8iEgSU8iLiCQxhbyISBI77pA3s8fMrNjMVh2yrJOZvWZm+ZHbjpHlZmYPmNl6M1thZiMbo3gRETm6+hzJzwAmf2bZj4E33L0f8EbkMcBXgH6Rn2nAH6IrU0REGsLqczKUmeUC/3D3oZHH64CJ7r7VzLoBb7n7ADP7Y+T+zM+ud7Ttd+7c2XNzcxu2JyIizdSSJUt2uHv24Z5Li3LbXQ8J7m1A18j97kDBIesVRpYdNeRzc3NZvHhxlCWJiDQvZrb5SM/F7ItXr/tIUO85EsxsmpktNrPFJSUlsSpHRESIPuS3R7ppiNwWR5YXAT0OWS8nsuxz3H26u+e5e1529mE/bYiISANFG/IvAldE7l8BvHDI8ssjo2zGAWXH6o8XEZHYO+4+eTObCUwEOptZIXAHcDcw28yuBjYDF0dWfxk4G1gP7AeubGiBNTU1FBYWUllZ2dBNyGdkZmaSk5NDenp60KWISCM77pB390uO8NSkw6zrwA0NLepQhYWFtG3bltzcXMwsFpts1tydnTt3UlhYSO/evYMuR0QaWdyf8VpZWUlWVpYCPkbMjKysLH0yEmkm4j7kAQV8jOn9FGk+EiLkRUSS2f2v57Ngw85G2bZCvgnk5uayY8eOoMsQkTi0oaSc37z+EQs27mqU7Svk68HdCYfDQZcRN3WISPT+Mn8z6anG1DE9jr1yAyjkj2HTpk0MGDCAyy+/nKFDh1JQUMC9997L6NGjGT58OHfcccfBdS+44AJGjRrFkCFDmD59+jG3/eqrrzJy5EhOPvlkJk2qG6T005/+lF/96lcH1xk6dCibNm36XB133nknP/zhDw+uN2PGDG688UYAnnzyScaMGcMpp5zCtddeSygUitXbISIxtK+qljmLCzl7WDe6tM1slDainbumSf3s7x+y+pM9Md3m4BPbccd/DDnqOvn5+Tz++OOMGzeOuXPnkp+fz8KFC3F3zjvvPObNm8eECRN47LHH6NSpExUVFYwePZopU6aQlZV12G2WlJRwzTXXMG/ePHr37s2uXcf+qHZoHSUlJYwfP557770XgFmzZnH77bezZs0aZs2axXvvvUd6ejrXX389Tz31FJdffnn93xwRaVR/W1bE3qpaLh/fq9HaSKiQD0qvXr0YN24cAHPnzmXu3LmMGDECgPLycvLz85kwYQIPPPAAzz//PAAFBQXk5+cfMeTnz5/PhAkTDo5V79SpU73qyM7Opk+fPsyfP59+/fqxdu1aTj31VB588EGWLFnC6NGjAaioqKBLly7RvQEiEnPuzhPvb2bIie0Y2bNjo7WTUCF/rCPuxtK6deuD992dW2+9lWuvvfZT67z11lu8/vrr/Pvf/6ZVq1ZMnDixQWPR09LSPtXffug2Dq0DYOrUqcyePZuBAwdy4YUXYma4O1dccQW/+MUv6t22iDSdBRt3sW77Xn45ZXijDmtWn3w9nXXWWTz22GOUl5cDUFRURHFxMWVlZXTs2JFWrVqxdu1a5s+ff9TtjBs3jnnz5rFx40aAg901ubm5LF26FIClS5cefP5wLrzwQl544QVmzpzJ1KlTAZg0aRJz5syhuLj44HY3bz7iLKQiEpAn/r2J9i3T+Y+TT2zUdhLqSD4enHnmmaxZs4bx48cD0KZNG5588kkmT57Mww8/zKBBgxgwYMDBbpUjyc7OZvr06Vx00UWEw2G6dOnCa6+9xpQpU3jiiScYMmQIY8eOpX///kfcRseOHRk0aBCrV69mzJgxAAwePJi77rqLM888k3A4THp6Og8++CC9ejVen5+I1M/Wsgr++eF2rj6tNy0zUhu1rXpdGaqx5eXl+WcvGrJmzRoGDRoUUEXJS++rSHDum7uO3725nrf/60v0zGoV9fbMbIm75x3uOXXXiIg0oaraEH9duIUvD+gSk4A/FoW8iEgTenXVNnaUV3NZIw6bPFRChHw8dSklA72fIsF5/P1N5Ga1YkK/prkSXtyHfGZmJjt37lQwxciB+eQzMxvn7DoRObLlBaUs3VLKZeNzSUlpmtlg4350TU5ODoWFhegi37Fz4MpQItK0Hnl3I21bpHFxXtP9/4v7kE9PT9cVjEQk4RWVVvDyyq1cdWoubTOb7tKbcd9dIyKSDGa8V3di47dObdqDVoW8iEgj21tZw9MLCzh7WDe6d2jZpG0r5EVEGtmsRQXsrarlmi82fddzTELezL5vZh+a2Sozm2lmmWbW28wWmNl6M5tlZhmxaEtEJJHUhsL8+b1NjMntxPCcDk3eftQhb2bdge8Cee4+FEgFpgL3AL9x977AbuDqaNsSEUk0r364jaLSCr4dwFE8xK67Jg1oaWZpQCtgK/BlYE7k+ceBC2LUlohIQnB3/vTORnKzWjFpUNdAaog65N29CPgVsIW6cC8DlgCl7l4bWa0Q6H6415vZNDNbbGaLNRZeRJLJks27WV5QytWn9Sa1iU5++qxYdNd0BM4HegMnAq2Bycf7enef7u557p6Xnd00p/mKiDSFR97ZSPuW6UwZFdzJh7Horjkd2OjuJe5eAzwHnAp0iHTfAOQARTFoS0QkIWzasY9/rt7GN8f2pFVGcOedxiLktwDjzKyV1V3DahKwGngT+GpknSuAF2LQlohIQvjjvI/JSE3hyiY++emzYtEnv4C6L1iXAisj25wO3AL8wMzWA1nAo9G2JSKSCLaVVTJnSSEX5/Ugu22LQGuJyWcId78DuOMzizcAY2KxfRGRRPKndzYQdpg2oU/QpeiMVxGRWNq1r5q/LtjC+aecSI9OjX/lp2NRyIuIxNCM9zZSWRvi+oknBV0KoJAXEYmZvZU1zHh/E2cNPoG+XdoGXQ6gkBcRiZmnFmxhT2Ut138pPo7iQSEvIhITlTUhHnlnI1/s1zmQiciORCEvIhIDzywuYEd5FddP7Bt0KZ+ikBcRiVJNKMzDb29gZM8OjOvTKehyPkUhLyISpeeWFlJUWsENX+pL3Yn/8UMhLyISheraMA+8sZ7hOe358sAuQZfzOQp5EZEoPLOkgKLSCr5/Rv+4O4oHhbyISINV1Yb4/b/WM6JnByb2j8+p0hXyIiINNGtRAVvLKrn5jAFxeRQPCnkRkQaprAnx4JvrGZPbiVP7ZgVdzhEp5EVEGuCvC7awfU9V3PbFH6CQFxGpp4rqEA+99THj+2Qx/qT4PYoHhbyISL09OX8zO8rrjuLjnUJeRKQe9lXV8vDbH/PFfp0Z0zu+zm49HIW8iEg9PPruRnbuq06Io3hQyIuIHLcd5VX88e2POWtIV0b27Bh0OcdFIS8icpx+90Y+lbVhfjR5YNClHDeFvIjIcdi0Yx9PLdjC10f34KTsNkGXc9xiEvJm1sHM5pjZWjNbY2bjzayTmb1mZvmR28T4bCMichj3zl1HemoK35vUL+hS6iVWR/L3A6+6+0DgZGAN8GPgDXfvB7wReSwiknCWF5Ty0oqtXDOhD13aZQZdTr1EHfJm1h6YADwK4O7V7l4KnA88HlntceCCaNsSEWlq7s4vXllD5zYZTJvQJ+hy6i0WR/K9gRLgz2b2gZk9Ymatga7uvjWyzjag6+FebGbTzGyxmS0uKSmJQTkiIrHz1roS5m/YxXcn9aNNi7Sgy6m3WIR8GjAS+IO7jwD28ZmuGXd3wA/3Ynef7u557p6XnR2fU3WKSPMUCjt3v7KW3KxWXDKmZ9DlNEgsQr4QKHT3BZHHc6gL/e1m1g0gclscg7ZERJrMnCUFrNu+lx+eNZD01MQcjBh11e6+DSgwswGRRZOA1cCLwBWRZVcAL0TblohIU9lTWcO9/1xHXq+OnD3shKDLabBYdTB9B3jKzDKADcCV1P0BmW1mVwObgYtj1JaISKN74PV8du6rZsaVY+J6KuFjiUnIu/syIO8wT02KxfZFRJrS+uJyZry/ia/n9WBo9/ZBlxOVxOxkEhFpJO7O//vHalpmpPJfZw049gvinEJeROQQb6wpZt5HJXzv9P50btMi6HKippAXEYmoqg1x50ur6dulDZeP7xV0OTGhkBcRiXjs3U1s3rmf/zl3cMIOmfys5NgLEZEoFe+p5Pf/yuf0QV2Z0D95TsxUyIuIAHe+tIaakPPf5wwKupSYUsiLSLP31rpi/r78E274Ul9yO7cOupyYUsiLSLNWUR3iJy+sok92a66bmHizTB5L4k2pJiISQ/e/kU/BrgqenjaOFmmpQZcTczqSF5Fma+22PTzyzgYuzsthXJ+soMtpFAp5EWmWwmHn1udW0q5lOrd+Jbm+bD2UQl5EmqW/LtzCB1tK+e9zBtGxdUbQ5TQahbyINDvFeyq559W1nNo3iwtHdA+6nEalkBeRZsXd+e+/raKqNsxdFwxL6GmEj4dCXkSalReWfcLc1dv5rzP70zvJxsQfjkJeRJqN7Xsq+Z8XVjGqV0euPi35xsQfjkJeRJoFd+fHz66gOhTmV187mdSU5O6mOUAhLyLNwjNLCnlzXQm3TB7YLLppDlDIi0jS+6S0gjv/vppxfTpxxfjcoMtpUgp5EUlq7s4tz64g5M69Xz2ZlGbSTXOAQl5EktqTC7bwTv4Objt7ED06tQq6nCYXs5A3s1Qz+8DM/hF53NvMFpjZejObZWbJe0qZiMSlddv2ctc/VjOhfzbfHNsz6HICEcsj+ZuANYc8vgf4jbv3BXYDV8ewLRGRo6qsCfGdmUtpm5nOr792ctKf9HQkMQl5M8sBzgEeiTw24MvAnMgqjwMXxKItEZHjcec/VvPR9nLuu/hkstu2CLqcwMTqSP63wI+AcORxFlDq7rWRx4XAYSeIMLNpZrbYzBaXlJTEqBwRac5eWbmVpxZs4doJfZLqeq0NEXXIm9m5QLG7L2nI6919urvnuXtednbz/scQkegVlVZwy7MrODmnPTefOSDocgIXiytDnQqcZ2ZnA5lAO+B+oIOZpUWO5nOAohi0JSJyRLWhMDfN/ICwwwOXjCAjTQMIo34H3P1Wd89x91xgKvAvd/8m8Cbw1chqVwAvRNuWiMjR/Pb1fBZv3s1dFwylV1bzOav1aBrzz9wtwA/MbD11ffSPNmJbItLMvbZ6O79/cz1fG5XDBUk+R3x9xPRC3u7+FvBW5P4GYEwsty8icjgfl5Tzg1nLGNa9PXdeMDTocuKKOqxEJKGVV9Vy3V+WkJ6WwsOXjSIzPTXokuKKQl5EEpa786M5y/m4pJzfXzKC7h1aBl1S3FHIi0jCmj5vAy+v3MaPvzKQL/TtHHQ5cUkhLyIJ6b31O7jn1bWcM7wb13yxeVzlqSEU8iKScNYXl/OfTy6hb5c2/HLK8GY7L83xUMiLSELZWV7FVTMWkZGWwqNXjKZ1i5gOEkw6endEJGFU1oS45onFbN9TyaxrxzfL+eHrSyEvIgkhHHZufmY5HxSU8tA3RnJKjw5Bl5QQ1F0jIgnhV3PX8dKKrdz6lYF8ZVi3oMtJGAp5EYl7Ty/cwkNvfcw3xvbUSJp6UsiLSFx7ddVWbnt+JRP6Z/Oz84ZoJE09KeRFJG7N+6iE78z8gFN6dODhS0eSnqrIqi+9YyISlxZv2sW0vyymb5e2/PlbY2iVoXEiDaGQF5G48+EnZVw5YxHd2rfkiavG0L5VetAlJSyFvIjElQ0l5Vz+6ELatkjjyW+PbdYX4Y4FhbyIxI0NJeV8408LAPjLt8dqVskYUCeXiMSF/O17+cYjCwiHnSe/PZaTstsEXVJSUMiLSODWbN3DpY8sICXFeHraOPp1bRt0SUlD3TUiEqhVRWVc8qf5pKemMEsBH3M6kheRwHywZTeXP7aQdpnpzLxmHD2zNOFYrEV9JG9mPczsTTNbbWYfmtlNkeWdzOw1M8uP3HaMvlwRSRZvf1TCpY8soFPrDGZfN14B30hi0V1TC9zs7oOBccANZjYY+DHwhrv3A96IPBYRYfaiAq6asYheWa155trxGkXTiKLurnH3rcDWyP29ZrYG6A6cD0yMrPY48BZwS7TtiUjicnd++3o+97+Rz4T+2Tz0zZG00UU/GlVM310zywVGAAuArpE/AADbgK6xbEtEEktNKMxtz63kmSWFfG1UDv970TDNRdMEYhbyZtYGeBb4nrvvOXSmOHd3M/MjvG4aMA2gZ8+esSpHROJI2f4abpy5lHfyd3DTpH587/R+mk2yicTkz6iZpVMX8E+5+3ORxdvNrFvk+W5A8eFe6+7T3T3P3fOys7NjUY6IxJF12/Zy3oPvMn/DTu6ZMozvn9FfAd+EYjG6xoBHgTXuft8hT70IXBG5fwXwQrRtiUhieWnFVi586D32V4d4eto4vj5an9abWiy6a04FLgNWmtmyyLLbgLuB2WZ2NbAZuDgGbYlIAgiFnXv/uY6H3/6YkT078IdLR9G1XWbQZTVLsRhd8y5wpM9ek6LdvogklpK9Vfxg9jLeyd/BN8f25I7/GEJGmr5gDYrGLolIzLy5tpgfzlnO3spa7pkyTN0zcUAhLyJRq6wJcfcra5nx/iYGntCWv14zjv6agyYuKORFJCrrtu3lpqc/YO22vVx5ai63TB5IZnpq0GVJhEJeRBqkJhRm+rwN3P9GPu0y05hx5WgmDugSdFnyGQp5Eam3ZQWl/PjZFazdtpezh53Az84bqsv0xSmFvIgct31Vtfx67kfMeH8jXdpmMv2yUZw55ISgy5KjUMiLyDG5O6+s2sbPX1pDUWkFl43rxY8mD6BtZnrQpckxKORF5KhWFJZy5z9Ws2jTbgae0JY5140nL7dT0GXJcVLIi8hhbS2r4N5X1/HcB0V0bpPBLy4axsV5PUhN0bwziUQhLyKfsqO8iunzNvDEvzcRdvjPiSdx/cST1DWToBTyIgJA8d5Kpr+9gScXbKa6Nsz5p3TnB2f0p0cnXZYvkSnkRZq5T0orePTdjTwVCfcLRnTnxi/1pU92m6BLkxhQyIs0Q+7Oks27+fP7m3h11TYALjilOzd+uS+9O7cOuDqJJYW8SDNSWRPilVVb+fN7m1hRWEa7zDSuPq03l43rpW6ZJKWQF0ly7s6yglKeXVrIi8s+YU9lLSdlt+bOC4YyZWR3WmUoBpKZ/nVFklTBrv38fcUnPLukkI9L9pGZnsJZQ07gq6NyOPWkzqRoKGSzoJAXSRLuTn5xOa+u2sY/P9zGh5/sAWB0bkemTejD2cO6aRhkM6SQF0lg+6pqWbhxF++u38G/1hazccc+AEb27MBtZw9k8pBu9MxSX3tzppAXSSD7q2tZUVjGgg27eG/9DpZu2U1t2MlIS2Fs705cfVpvzhzclS66nqpEKORF4lRNKMzGHftYUVjGB1t288GWUtZt30so7JjBsO7tuWZCH07r25lRvTrqQh1yWAp5kYBV1oTYsms/m3fuZ31xOeu27WHttr18XFJOTcgBaJuZxik9OnDD4L6M6NmBET060KFVRsCVSyJo9JA3s8nA/UAq8Ii7393YbYrEA3dnX3WI3fuqKSmvonhPJdv3VLFtTyXb91RSuLuCzTv3sX1P1aded2L7TAac0JaJA7ow8IS2DDmxHSdlt9FoGGmQRg15M0sFHgTOAAqBRWb2oruvbsx2pensr66lZG8VO8qrKN1fw57KGvZU1LKnou7+vuoQldUhKmrqfiprQlTVhgmFnZqQUxuqux/yuiPWyM1BqSlGih24NVJTjLQUIy01hdQUIz3VSEtJIT3VSE9NIS01cj8lhbTIsvRUiyxPIS3l/7Zx4DYlxTCrayfFDAMcCLvjXhfWYa/rPqkOhamp9YP391fXsr86xP6qEPsi98sqaijdX0NZRfXBI/FDpaUYXdq2oHvHlpzWN5vcrFb0zGpFr6zW9O7cmvYtNQJGYqexj+THAOvdfQOAmT0NnA8o5BNAKOwU7a6gYPd+Cnfvp3B3ReRnP8V7q9ixt4p91aEjvr5leiqtW6TRMiOFzLRUWmakkpmWSpsWaZGA/b8ATjE4cJxqVnfP3Qk5hMNO2L3uj0HYqY3c1oTCVNWEKQ/V1v3BCIepCdUtrwmFqQ051ZHbA8/FyoE/MK0y0miVkRr5qbvfr0sbOrTKoEOrdDq2SqdDywyy27agS7sWdG2XSadWGToqlybT2CHfHSg45HEhMLaR25R6cneKSitYVVTGR9vLWV9cTn5xORtKyqmqDR9cLzXF6NY+k+4dWnJyTgey27agc5sWdG6TQee2LejUKoN2LdNpl5lG28x0MtJSAtyrzztwRF4bPhD8dX8sDiw/cBt2JyVyZG9mWOQIP/3gJ4MUzakuCSPwL17NbBowDaBnz54BV9M8lO6vZvGm3awoLGV5YRkri8rYta/64PM5HVvSt0sbTuubRd8ubejZqTU5HVvSrX0maanxFdz1YWakGqSmpNIi8N98kabR2L/qRUCPQx7nRJYd5O7TgekAeXl5sfs8LQeV7q9mwcZdzN+wk/kbdrF22x7c647M+3Vpw+mDujAspwPDurenf9c2mstEJIk09v/mRUA/M+tNXbhPBb7RyG02e+7O2m17eWPNdt5YW8yyglLcoUVaCnm5HfnB6f0Z2yeLYd3b0zJDY6tFklmjhry715rZjcA/qRtC+Zi7f9iYbTZX4bCzcNMuXl65lTfWFFNUWgHA8Jz23DSpH6f27czwnPa0SFOoizQnjf653N1fBl5u7HaaqzVb9/C3ZUX8fdknfFJWSWZ6Cqf17cyNX+7Llwd2oatObxdp1tT5moDK9tcwZ2khsxcVsG77XtJSjAn9s7nlKwM5Y3BX9amLyEFKgwSysrCMv8zfxIvLP6GyJsyInh248/whnD2sG1ltWgRdnojEIYV8nKsNhXlp5VYee3cjywvLaJWRykUjc7h0bC8Gn9gu6PJEJM4p5ONUVW2IZ5cU8fDbH7Nl135Oym7Nz84bwoUju9NOF34QkeOkkI8z+6pqmblwC396ZwPb91Rxck57bj9nFGcM6qpT4UWk3hTycaImFObpRQXc/3o+O8qr+MJJWdx38Sl84aSsg3O5iIjUl0I+YO7Oq6u2ce8/17Fhxz7G5Hbij5eNZFSvTkGXJiJJQCEfoCWbd3HXS2v4YEsp/bq04ZHL85g0qIuO3EUkZhTyAdi1r5q7X1nD7MWFdG3XgnumDGPKyJyEnvxLROKTQr4JhcPOM0sKuPuVteytrOXaCX347qR+tNaUiCLSSJQuTWTdtr3c/vxKFm/ezejcjtx1wTAGnNA26LJEJMkp5BtZKOz86Z0N3Df3I1q3SOWXU4bz1VE5Gg4pIk1CId+Ituzcz83PLGPRpt2cNaQr/3vhME0/ICJNSiHfCNydWYsKuPMfq0kx476LT+bCEd01akZEmpxCPsbK9tdw8zPLeX3Ndr5wUhb3fu1kundoGXRZItJMKeRjaFVRGf/51BK2lVXyk3MHc+UXctX3LiKBUsjHgLszc2EBP/37h3RuncHsa8czomfHoMsSEVHIR6uiOsTtf1vJc0uL+GK/ztw/dQSdWmcEXZaICKCQj0pRaQVXz1jEuu17uWlSP747qR+p6p4RkTiikG+gFYWlXP34YiqrQzz2rdF8aUCXoEsSEfkchXwDvLpqK9+btYys1i146vqx9O+qM1dFJD5FNSOWmd1rZmvNbIWZPW9mHQ557lYzW29m68zsrKgrjQPuzsNvf8x1Ty5lULd2/O2GUxXwIhLXop328DVgqLsPBz4CbgUws8HAVGAIMBl4yMxSo2wrULWhMLc9v5K7X1nLOcO7MfOacWS31dmrIhLfogp5d5/r7rWRh/OBnMj984Gn3b3K3TcC64Ex0bQVpKraEN+Z+QEzFxZww5dO4ndTR5CZntB/s0SkmYhln/xVwKzI/e7Uhf4BhZFln2Nm04BpAD179oxhObFRUR3i2ieXMO+jEn5y7mCuPq130CWJiBy3Y4a8mb0OnHCYp2539xci69wO1AJP1bcAd58OTAfIy8vz+r6+Me2prOHqGYtYsnk3v5wynItH9wi6JBGRejlmyLv76Ud73sy+BZwLTHL3AyFdBByaiDmRZQljZ3kVV/x5Ieu27eV3l4zknOHdgi5JRKTeoh1dMxn4EXCeu+8/5KkXgalm1sLMegP9gIXRtNWUSvZW8fXp88nfXs70y/MU8CKSsKLtk/890AJ4LTKN7nx3v87dPzSz2cBq6rpxbnD3UJRtNYld+6q59JEFFO2u4PGrxjCuT1bQJYmINFhUIe/ufY/y3M+Bn0ez/aZWVlHDZY8uYNPOffz5W6MV8CKS8KIdJ5809lbWcMVjC8nfXs4fLxvFF/p2DrokEZGoKeSB/dW1XDVjEauKyvj9N0YwUfPQiEiSaPYhX1kT4tuPL2bJ5t3cP3UEZw453GhREZHE1KwnKAuHnZufWc77H+/kvotP1igaEUk6zfpI/n9fXsNLK7Zy29kDuWhkzrFfICKSYJptyD/67kYeeXcj3/pCLtd8sU/Q5YiINIpmGfIvrdjKXS+tZvKQE/jJuYOJjPEXEUk6zS7kF27cxfdnL2NUz478duopulyfiCS1ZhXyG0rK+fbji8jp2JI/XZ6n6YJFJOk1m5DfU1nDNU8sJi01hcevHEPH1hlBlyQi0uiaRciHws73nl7G5p37eeibI+nRqVXQJYmINIlmEfK/nruOf60t5o7zhmg+GhFpVpI+5P++/BMeeutjLhnTk0vHxt+Vp0REGlNSh/yqojJ+OGc5eb068rPzhmiopIg0O0kb8jvLq7j2L0vo2CqDP1w6ioy0pN1VEZEjSsq5a8Jh5/uzl1NSXsWc68aT3bZF0CWJiAQiKQ9vH573MfM+KuEn5w5meE6HoMsREQlM0oX8ok27+PXcjzhneDd90SoizV5ShfyufdV8568fkNOxJXdfNExftIpIs5c0ffLhsPOD2cvYta+a567/Am0z04MuSUQkcElzJP/HeRt4a10JPzl3EEO7tw+6HBGRuBCTkDezm83Mzaxz5LGZ2QNmtt7MVpjZyFi0cySLN+3iV3PXcc6wblw6rldjNiUiklCiDnkz6wGcCWw5ZPFXgH6Rn2nAH6Jt52gy01M5tW9nfjFF/fAiIoeKxZH8b4AfAX7IsvOBJ7zOfKCDmTXaBVSHdm/PE1eNoZ364UVEPiWqkDez84Eid1/+mae6AwWHPC6MLDvcNqaZ2WIzW1xSUhJNOSIi8hnHHF1jZq8DJxzmqduB26jrqmkwd58OTAfIy8vzY6wuIiL1cMyQd/fTD7fczIYBvYHlkX7wHGCpmY0BioAeh6yeE1kmIiJNqMHdNe6+0t27uHuuu+dS1yUz0t23AS8Cl0dG2YwDytx9a2xKFhGR49VYJ0O9DJwNrAf2A1c2UjsiInIUMQv5yNH8gfsO3BCrbYuISMMkzRmvIiLyeQp5EZEkZnU9K/HBzEqAzQ18eWdgRwzLCZL2JT4ly74ky36A9uWAXu6efbgn4irko2Fmi909L+g6YkH7Ep+SZV+SZT9A+3I81F0jIpLEFPIiIkksmUJ+etAFxJD2JT4ly74ky36A9uWYkqZPXkREPi+ZjuRFROQzkirkzezOyJWolpnZXDM7MeiaGsrM7jWztZH9ed7MOgRdU0OZ2dfM7EMzC5tZwo2EMLPJZrYucqWzHwddT0OZ2WNmVmxmq4KuJVpm1sPM3jSz1ZHfrZuCrqkhzCzTzBaa2fLIfvws5m0kU3eNmbVz9z2R+98FBrv7dQGX1SBmdibwL3evNbN7ANz9loDLahAzGwSEgT8C/+XuiwMu6biZWSrwEXAGdZPwLQIucffVgRbWAGY2ASin7oI+Q4OuJxqRixB1c/elZtYWWAJckGj/LlY3hW9rdy83s3TgXeCmyMWWYiKpjuQPBHxEaz59taqE4u5z3b028nA+ddM1JyR3X+Pu64Kuo4HGAOvdfYO7VwNPU3fls4Tj7vOAXUHXEQvuvtXdl0bu7wXWcIQLE8WzyNXzyiMP0yM/Mc2tpAp5ADP7uZkVAN8E/ifoemLkKuCVoItopo77KmcSDDPLBUYACwIupUHMLNXMlgHFwGvuHtP9SLiQN7PXzWzVYX7OB3D32929B/AUcGOw1R7dsfYlss7tQC11+xO3jmdfRGLNzNoAzwLf+8wn+YTh7iF3P4W6T+tjzCymXWmNNZ98oznSlaoO4ynq5rW/oxHLicqx9sXMvgWcC0zyOP/ypB7/LolGVzmLU5E+7GeBp9z9uaDriZa7l5rZm8BkIGZfjifckfzRmFm/Qx6eD6wNqpZomdlk4EfAee6+P+h6mrFFQD8z621mGcBU6q58JgGKfGH5KLDG3e8Lup6GMrPsAyPnzKwldV/wxzS3km10zbPAAOpGcmwGrnP3hDzqMrP1QAtgZ2TR/AQeKXQh8DsgGygFlrn7WYEWVQ9mdjbwWyAVeMzdfx5sRQ1jZjOBidTNdrgduMPdHw20qAYys9OAd4CV1P1/B7jN3V8Orqr6M7PhwOPU/W6lALPd/f/FtI1kCnkREfm0pOquERGRT1PIi4gkMYW8iEgSU8iLiCQxhbyISBJTyIuIJDGFvIhIElPIi4gksf8P49VH+I9HxDQAAAAASUVORK5CYII=\n",
- "text/plain": [
- "<Figure size 432x288 with 1 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "# 画出这个函数的曲线\n",
- "x_sample = np.arange(-3, 3.1, 0.1)\n",
- "y_sample = b_target[0] + w_target[0] * x_sample + w_target[1] * x_sample ** 2 + w_target[2] * x_sample ** 3\n",
- "\n",
- "plt.plot(x_sample, y_sample, label='real curve')\n",
- "plt.legend()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "接着我们可以构建数据集,需要 x 和 y,同时是一个三次多项式,所以我们取了 $x,\\ x^2, x^3$"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 17,
- "metadata": {},
- "outputs": [],
- "source": [
- "# 构建数据 x 和 y\n",
- "# x 是一个如下矩阵 [x, x^2, x^3]\n",
- "# y 是函数的结果 [y]\n",
- "\n",
- "x_train = np.stack([x_sample ** i for i in range(1, 4)], axis=1)\n",
- "x_train = torch.from_numpy(x_train).float() # 转换成 float tensor\n",
- "\n",
- "y_train = torch.from_numpy(y_sample).float().unsqueeze(1) # 转化成 float tensor "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 18,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "torch.Size([61, 3])\n"
- ]
- }
- ],
- "source": [
- "print(x_train.size())"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "接着我们可以定义需要优化的参数,就是前面这个函数里面的 $w_i$"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 20,
- "metadata": {},
- "outputs": [],
- "source": [
- "# 定义参数和模型\n",
- "w = Variable(torch.randn(3, 1), requires_grad=True)\n",
- "b = Variable(torch.zeros(1), requires_grad=True)\n",
- "\n",
- "# 将 x 和 y 转换成 Variable\n",
- "x_train = Variable(x_train)\n",
- "y_train = Variable(y_train)\n",
- "\n",
- "def multi_linear(x):\n",
- " return torch.mm(x, w) + b\n",
- "\n",
- "def get_loss(y_, y):\n",
- " return torch.mean((y_ - y) ** 2)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "我们可以画出没有更新之前的模型和真实的模型之间的对比"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 21,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "<matplotlib.legend.Legend at 0x7f60a9d81f50>"
- ]
- },
- "execution_count": 21,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAD7CAYAAACPDORaAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAAprklEQVR4nO3deXhUVbb38e8iBMI8S6OgwRaRQREJGLQVGhRQEURFaW2cRbr1tlM74tt4Ha4DjiiKKIheuSCDA22LAiqiImrACQEBUSGIEEBBIECG/f6xq0jAAEmqKqeq8vs8z3lODafOWZVh1a599lnbnHOIiEhyqhJ0ACIiEjtK8iIiSUxJXkQkiSnJi4gkMSV5EZEkpiQvIpLESp3kzWycma03s0XFHmtoZrPMbHlo3SD0uJnZSDNbYWZfmdlxsQheRET2rywt+fFAn70euxV4xznXCngndB/gNKBVaBkCPB1ZmCIiUh5WlouhzCwdeMM51z50/1ugu3NurZk1A+Y451qb2TOh2xP33m5/+2/cuLFLT08v3zsREamkFixYsME516Sk56pGuO+mxRL3z0DT0O1DgNXFtssOPbbfJJ+enk5WVlaEIYmIVC5m9uO+novaiVfnvxKUuUaCmQ0xsywzy8rJyYlWOCIiQuRJfl2om4bQen3o8TVAi2LbNQ899jvOuTHOuQznXEaTJiV+2xARkXKKNMlPBy4O3b4YeL3Y4xeFRtlkApsP1B8vIiLRV+o+eTObCHQHGptZNjAcuB+YbGaXAz8C54U2fxM4HVgBbAcuLW+AeXl5ZGdns2PHjvLuQiKQlpZG8+bNSU1NDToUESmHUid559xf9vFUzxK2dcDV5Q2quOzsbOrUqUN6ejpmFo1dSik559i4cSPZ2dm0bNky6HBEpBzi/orXHTt20KhRIyX4AJgZjRo10rcokQQW90keUIIPkH72IoktIZK8iEgyu+sumDs3NvtWki+FkSNH0qZNGy688EKmT5/O/fffD8Brr73G4sWLd283fvx4fvrpp933r7jiij2eFxHZ27JlMHw4vP9+bPYf6RWvlcJTTz3F7Nmzad68OQD9+vUDfJLv27cvbdu2BXySb9++PQcffDAAzz33XDABF5Ofn0/Vqvo1i8Srp56C1FS48srY7F8t+QMYOnQoK1eu5LTTTuPRRx9l/PjxXHPNNcybN4/p06dz0003ceyxx/LAAw+QlZXFhRdeyLHHHktubi7du3ffXaahdu3aDBs2jA4dOpCZmcm6desA+O6778jMzOToo4/mjjvuoHbt2iXG8eKLL3LMMcfQoUMHBg8eDMAll1zC1KlTd28Tfu2cOXM46aST6NevH23btuXWW29l1KhRu7e78847eeihhwAYMWIEnTt35phjjmH48OHR/wGKyD5t3QrPPw8DB8If/hCbYyRWE++66+CLL6K7z2OPhcce2+fTo0eP5q233uK9996jcePGjB8/HoATTjiBfv360bdvX84991wAZsyYwUMPPURGRsbv9rNt2zYyMzO59957ufnmm3n22We54447uPbaa7n22mv5y1/+wujRo0uM4ZtvvuGee+5h3rx5NG7cmE2bNh3wbS1cuJBFixbRsmVLPv/8c6677jquvtqPap08eTJvv/02M2fOZPny5Xz66ac45+jXrx9z587l5JNPPuD+RSRyEybAli1wdVQGnJdMLfkKUq1aNfr27QtAp06d+OGHHwD4+OOPGThwIAAXXHBBia999913GThwII0bNwagYcOGBzxely5ddo9t79ixI+vXr+enn37iyy+/pEGDBrRo0YKZM2cyc+ZMOnbsyHHHHcfSpUtZvnx5pG9VRErBOXjySejYEbp2jd1xEqslv58Wd7xLTU3dPRwxJSWF/Pz8iPdZtWpVCgsLASgsLGTXrl27n6tVq9Ye2w4cOJCpU6fy888/c/755wP+YqfbbruNq666KuJYRKRs5s6FRYtg7FiI5UhlteQjUKdOHX777bd93i+NzMxMpk2bBsCkSZNK3KZHjx5MmTKFjRs3AuzurklPT2fBggUATJ8+nby8vH0e5/zzz2fSpElMnTp19zeH3r17M27cOLZu3QrAmjVrWL9+/T73ISLR8+ST0KABDBoU2+MoyUdg0KBBjBgxgo4dO/Ldd99xySWXMHTo0N0nXkvjscce45FHHuGYY45hxYoV1KtX73fbtGvXjmHDhtGtWzc6dOjADTfcAMCVV17J+++/T4cOHfj4449/13rfex+//fYbhxxyCM2aNQOgV69eXHDBBXTt2pWjjz6ac889t8wfUiJSdtnZ8OqrcPnlULNmbI9VppmhYi0jI8PtPWnIkiVLaNOmTUARxd727dupUaMGZsakSZOYOHEir7/++oFfWIGS/XcgUtH+9S+4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\n",
- "text/plain": [
- "<Figure size 432x288 with 1 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "# 画出更新之前的模型\n",
- "y_pred = multi_linear(x_train)\n",
- "\n",
- "plt.plot(x_train.data.numpy()[:, 0], y_pred.data.numpy(), label='fitting curve', color='r')\n",
- "plt.plot(x_train.data.numpy()[:, 0], y_sample, label='real curve', color='b')\n",
- "plt.legend()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "可以发现,这两条曲线之间存在差异,我们计算一下他们之间的误差"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 22,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "tensor(1144.2655, grad_fn=<MeanBackward0>)\n"
- ]
- }
- ],
- "source": [
- "# 计算误差,这里的误差和一元的线性模型的误差是相同的,前面已经定义过了 get_loss\n",
- "loss = get_loss(y_pred, y_train)\n",
- "print(loss)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 23,
- "metadata": {},
- "outputs": [],
- "source": [
- "# 自动求导\n",
- "loss.backward()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 24,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "tensor([[ -94.7455],\n",
- " [-139.1247],\n",
- " [-629.8584]])\n",
- "tensor([-25.7413])\n"
- ]
- }
- ],
- "source": [
- "# 查看一下 w 和 b 的梯度\n",
- "print(w.grad)\n",
- "print(b.grad)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 25,
- "metadata": {},
- "outputs": [],
- "source": [
- "# 更新一下参数\n",
- "w.data = w.data - 0.001 * w.grad.data\n",
- "b.data = b.data - 0.001 * b.grad.data"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 26,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "<matplotlib.legend.Legend at 0x7f60a9e3fdd0>"
- ]
- },
- "execution_count": 26,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "<Figure size 432x288 with 1 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "# 画出更新一次之后的模型\n",
- "y_pred = multi_linear(x_train)\n",
- "\n",
- "plt.plot(x_train.data.numpy()[:, 0], y_pred.data.numpy(), label='fitting curve', color='r')\n",
- "plt.plot(x_train.data.numpy()[:, 0], y_sample, label='real curve', color='b')\n",
- "plt.legend()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "因为只更新了一次,所以两条曲线之间的差异仍然存在,我们进行 100 次迭代"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 27,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "epoch 20, Loss: 65.56586\n",
- "epoch 40, Loss: 15.41177\n",
- "epoch 60, Loss: 3.70702\n",
- "epoch 80, Loss: 0.97122\n",
- "epoch 100, Loss: 0.32874\n"
- ]
- }
- ],
- "source": [
- "# 进行 100 次参数更新\n",
- "for e in range(100):\n",
- " y_pred = multi_linear(x_train)\n",
- " loss = get_loss(y_pred, y_train)\n",
- " \n",
- " w.grad.data.zero_()\n",
- " b.grad.data.zero_()\n",
- " loss.backward()\n",
- " \n",
- " # 更新参数\n",
- " w.data = w.data - 0.001 * w.grad.data\n",
- " b.data = b.data - 0.001 * b.grad.data\n",
- " if (e + 1) % 20 == 0:\n",
- " print('epoch {}, Loss: {:.5f}'.format(e+1, loss.data.item()))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "可以看到更新完成之后 loss 已经非常小了,我们画出更新之后的曲线对比"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 28,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "<matplotlib.legend.Legend at 0x7f60a9c42290>"
- ]
- },
- "execution_count": 28,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "<Figure size 432x288 with 1 Axes>"
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "# 画出更新之后的结果\n",
- "y_pred = multi_linear(x_train)\n",
- "\n",
- "plt.plot(x_train.data.numpy()[:, 0], y_pred.data.numpy(), label='fitting curve', color='r')\n",
- "plt.plot(x_train.data.numpy()[:, 0], y_sample, label='real curve', color='b')\n",
- "plt.legend()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "可以看到,经过 100 次更新之后,可以看到拟合的线和真实的线已经完全重合了"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "collapsed": true
- },
- "source": [
- "## 4. 练习题\n",
- "\n",
- "上面的例子是一个三次的多项式,尝试使用二次的多项式去拟合它,看看最后能做到多好\n",
- "\n",
- "**提示:参数 `w = torch.randn(2, 1)`,同时重新构建 x 数据集**"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.7.9"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
- }
|