人工智能实战_第二次作业_陈泽寅

第二次作业


题目说明:

项目 内容
课程 人工智能实战2019
作业要求 作业
我在这个课程的目标是 了解人工智能理论,提升coding能力
这个作业在哪个具体方面帮助我实现目标 通过学习神经网络反向传播算法更好地巩固自己的AI基础

作业要求、

  • 实现双变量的反向线性传播
  • 通过梯度下降求解参数\(\omega\)\(b\)的最终值

解题思路

\[\frac{\partial{z}}{\partial{b}}=\frac{\partial{z}}{\partial{x}} \cdot \frac{\partial{x}}{\partial{b}}+\frac{\partial{z}}{\partial{y}}\cdot\frac{\partial{y}}{\partial{b}}=y \cdot 3+x \cdot 2=3y+2x $$\]

\frac{\partial{z}}{\partial{w}}=\frac{\partial{z}}{\partial{x}} \cdot \frac{\partial{x}}{\partial{w}}+\frac{\partial{z}}{\partial{y}}\cdot\frac{\partial{y}}{\partial{w}}=y \cdot 2+x \cdot 0 = 2y

\[所以,在每次迭代中,要重新计算下面两个值: \]

\Delta b=\frac{\Delta z}{3y+2x}

\[\]

\Delta w=\frac{\Delta z}{2y}

\[但是由于$ \Delta b$和$\Delta\omega$都对$\Delta z$造成一半的影响,因此我们这里的公式应该改成 \]

\Delta b=\frac{\Delta z /2}{3y+2x}

\[\]

\Delta w=\frac{\Delta z /2}{2y}

\[ 然后每次更新$b$和$\omega,z$的值,循环迭代,直到$z -150\leq 10^-5$ ### 代码实现(每次均更新$\Delta b$和$\Delta \omega$) ``` # -*-coding:utf-8-*- from numpy import * target = 150.0 w = 3.0 b = 4.0 z = 162 min = 1e-5; print(z) iter_count = 0 while ((abs(150 - z)) > min): iter_count +=1 x = 2 * w + 3 * b y = 2 * b + 1 z = x * y delta_b = ((z - 150) / ((2 * x + 3 * y)*2)) delta_w = ((z - 150) / ((2 * y)*2)) w = w - delta_w b = b - delta_b print("loop: %d, w = %.8f, b = %.8f, z = %.8f, error = %.8f"%(iter_count,w,b,z,abs(150-z))); print("final result:loop = %d, w = %.8f, b = %.8f,z = %.8f,error = %.8f"%(iter_count,w,b,z,abs(z-150))); ``` ###运行结果 ``` loop: 1, w = 2.66666667, b = 3.90476190, z = 162.00000000, error = 12.00000000 loop: 2, w = 2.66151866, b = 3.90326327, z = 150.18140590, error = 0.18140590 loop: 3, w = 2.66151740, b = 3.90326291, z = 150.00004434, error = 0.00004434 loop: 4, w = 2.66151740, b = 3.90326291, z = 150.00000000, error = 0.00000000 final result:loop = 4, w = 2.66151740, b = 3.90326291,z = 150.00000000,error = 0.00000000 ``` ###当我们在反向传播过程中认为$\Delta b$和$\Delta \omega$的值保持不变 ``` delta_b = ((z - 150) / ((63)*2)) delta_w = ((z - 150) / ((18)*2)) ``` ###运行结果 ``` loop: 1, w = 2.66666667, b = 3.90476190, z = 162.00000000, error = 12.00000000 loop: 2, w = 2.66162761, b = 3.90332218, z = 150.18140590, error = 0.18140590 loop: 3, w = 2.66147411, b = 3.90327832, z = 150.00552614, error = 0.00552614 loop: 4, w = 2.66146940, b = 3.90327697, z = 150.00016964, error = 0.00016964 loop: 5, w = 2.66146925, b = 3.90327693, z = 150.00000521, error = 0.00000521 final result:loop = 5, w = 2.66146925, b = 3.90327693,z = 150.00000521,error = 0.00000521 ``` --- ###比较与分析 * 我们可以看到,上面两种方法都能够在有限次迭代中达到想要的结果,但是第一种明显效果更好,速度也更快,因为神经网络的反馈是实时的,也就是说参数的影响会直接作用于下一轮迭代,这也能使神经网络调整参数的速度更加快。因此我们需要在每次迭代时先更新参数的值,后计算下一轮的数据。\]

posted @ 2019-03-12 18:07  愤怒的大猪蹄  阅读(225)  评论(0编辑  收藏  举报