人工智能实战_第二次作业_廖盈嘉
第2次作业:双变量的反向传播计算
项目 | 内容 |
---|---|
这个作业属于哪个课程 | |
这个作业的要求在哪里 | |
我在这个课程的目标是 | 了解单变量和双变量的线性反向传播原理和实际操作、锻炼代码能力 |
这个作业在哪个具体方面帮助我实现目标 | 了解线性反向传播原理、实际动手编程(神经网络基础的模型) |
参考文献 |
作业要求:
- 使用Python实现双变量的反向线性传播
- 通过梯度下降求解参数w和b的最终值
题目函数:
- x=2w+3b
- y=2b+1
- z = x*y
给定初始值b,w,z和目标z_target的值,根据反向传播原理和梯度下降来迭代w,b的值,直到z与目标z_target的误差在允许范围之内
代码
每次迭代中都重新计算Δb,Δw的贡献值
import numpy as np
w = 3
b = 4
z_target = 150
z = 162
cnt = 0
def cal(b,w):
x = (3*b + 2*w)
y = (2*b +1)
z = x*y
delta_b_in = (3*y + 2*x)
delta_w_in = (2*y)
return(x,y,z,delta_b_in,delta_w_in)
while(np.abs(z-z_target)>1e-5):
cnt += 1
x,y,z,delta_b_in,delta_w_in = cal(b,w)
print("cnt=%d, w=%.9f, b=%.9f, z=%.9f" %(cnt, w, b, z))
delta_z = z - z_target
delta_b = delta_z/(2*delta_b_in)
delta_w = delta_z/(2*delta_w_in)
b = b - delta_b
w = w - delta_w
print("delta_z=%.9f, delta_b=%.9f, delta_w=%.9f" %(delta_z, delta_b, delta_w));
print("Done!")
print("Final b=%f"%b)
print("Final w=%f"%w)
运行结果和误差值
cnt=1, w=3.000000000, b=4.000000000, z=162.000000000
delta_z=12.000000000, delta_b=0.095238095, delta_w=0.333333333
cnt=2, w=2.666666667, b=3.904761905, z=150.181405896
delta_z=0.181405896, delta_b=0.001498632, delta_w=0.005148005
cnt=3, w=2.661518662, b=3.903263272, z=150.000044335
delta_z=0.000044335, delta_b=0.000000366, delta_w=0.000001259
cnt=4, w=2.661517403, b=3.903262906, z=150.000000000
delta_z=0.000000000, delta_b=0.000000000, delta_w=0.000000000
Done!
Final b=3.903263
Final w=2.661517
没有在迭代中重新计算Δb,Δw的贡献值(替换以下代码)
delta_b_in = 63
delta_w_in = 18
运行结果和误差值
cnt=1, w=3.000000000, b=4.000000000, z=162.000000000
delta_z=12.000000000, delta_b=0.095238095, delta_w=0.333333333
cnt=2, w=2.666666667, b=3.904761905, z=150.181405896
delta_z=0.181405896, delta_b=0.001439729, delta_w=0.005039053
cnt=3, w=2.661627614, b=3.903322175, z=150.005526140
delta_z=0.005526140, delta_b=0.000043858, delta_w=0.000153504
cnt=4, w=2.661474110, b=3.903278317, z=150.000169643
delta_z=0.000169643, delta_b=0.000001346, delta_w=0.000004712
cnt=5, w=2.661469398, b=3.903276971, z=150.000005209
delta_z=0.000005209, delta_b=0.000000041, delta_w=0.000000145
Done!
Final b=3.903277
Final w=2.661469
总结与分析
当每次迭代中都重新计算Δb,Δw对z的贡献值时,其计算效率明显高于不在迭代中重新计算Δb,Δw对z的贡献值,提高了收敛速度,更快得到真实解。不难发现,b相较于w对z的影响更大,若按Δb,Δw对z的贡献值的比列分配Δz给Δb和Δw,迭代次数可能将会降低,迭代速度会有所提高。