人工智能实战_第二次作业_陈泽寅
第二次作业
题目说明:
项目 | 内容 |
---|---|
课程 | 人工智能实战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
```
---
###比较与分析
* 我们可以看到,上面两种方法都能够在有限次迭代中达到想要的结果,但是第一种明显效果更好,速度也更快,因为神经网络的反馈是实时的,也就是说参数的影响会直接作用于下一轮迭代,这也能使神经网络调整参数的速度更加快。因此我们需要在每次迭代时先更新参数的值,后计算下一轮的数据。\]