【人工智能实战2019-何峥】第2次作业
双变量的反向传播
作业要求
项目 | 内容 |
---|---|
课程 | 人工智能实战2019 |
作业要求 | 完成双变量的反向传播代码,给出相应的结果,进行比较与思考 |
我的课程目标 | 掌握相关知识和技能,获得项目经验 |
本次作业对我的帮助 | 理解神经网络的基本原理 |
作业正文 | 【人工智能实战2019-何峥】第2次作业 |
其他参考文献 | Python-闭包详解 python基础教程 |
作业正文
1. Python实现双变量的反向传播计算
求解偏导数
def getValue(h,m,n):#得到表达式的值
h=h.subs({"w":m,"b":n})
return h
def calDeriva(p):
w=Symbol("w")
b=Symbol("b")
x=2*w+3*b
y=2*b+1
z=x*y
if p == 'W':#求z对w的偏导数
def difV(m,n):
V=getValue(diff(z,w),m,n)
return V
elif p == 'B':#求z对b的偏导数
def difV(m,n):
V=getValue(diff(z,b),m,n)
return V
return difV #返回偏导函数
权重更新的反向传播计算
def analy_1(w,b):
start=time.clock()
x=2*w+3*b
y=2*b+1
z=x*y
deltz=z-150
times=0
while deltz >= 1e-5:
times += 1
deltw = deltz/(2*z_w(w,b))
deltb = deltz/(2*z_b(w,b))
w -= deltw
b -= deltb
x=2*w+3*b
y=2*b+1
z=x*y
deltz=z-150
print('z=',z,'w=',w,'b=',b,'deltz=',deltz,'times=',times)
elapsed = (time.clock() - start)
print("Time used:",elapsed)
无权重更新的反向传播计算
def analy_2(w,b):
start=time.clock()
x=2*w+3*b
y=2*b+1
z=x*y
deltz=z-150
times=0
m=z_w(w,b)
n=z_b(w,b)
while deltz >= 1e-5:
times += 1
deltw = deltz/(2*m)
deltb = deltz/(2*n)
w -= deltw
b -= deltb
x=2*w+3*b
y=2*b+1
z=x*y
deltz=z-150
print('z=',z,'w=',w,'b=',b,'deltz=',deltz,'times=',times)
elapsed = (time.clock() - start)
print("Time used:",elapsed)
from sympy import *
import time
z_w=calDeriva('W')
z_b=calDeriva('B')
analy_1(3.0,4.0)
analy_2(3.0,4.0)
输出结果
权重更新的反向传播计算过程:
z= 150.181405895692 w= 2.66666666666667 b= 3.90476190476190 deltz= 0.181405895691626 times= 1
z= 150.000044335267 w= 2.66151866151866 b= 3.90326327226406 deltz= 4.43352674039943e-5 times= 2
z= 150.000000000003 w= 2.66151740292746 b= 3.90326290576744 deltz= 2.67164068645798e-12 times= 3
Time used: 0.0634633
无权重更新的反向传播计算过程:
z= 150.181405895692 w= 2.66666666666667 b= 3.90476190476190 deltz= 0.181405895691626 times= 1
z= 150.005526139576 w= 2.66162761400857 b= 3.90332217543102 deltz= 0.00552613957617609 times= 2
z= 150.000169643281 w= 2.66147411013145 b= 3.90327831718041 deltz= 0.000169643281225262 times= 3
z= 150.000005208983 w= 2.66146939781808 b= 3.90327697080517 deltz= 5.20898345257592e-6 times= 4
Time used: 0.02040919999999999
2. 思考与比较
- 由于误差函数沿梯度方向变化最快,因此权重更新的计算方式迭代次数更少,拟合精度更优,尽管程序运行时间未必更短;
- 又由于z对b的偏导数恒大于z对w的偏导数,因此w的变化对于z的误差变化影响更大,所以将更多的误差分配至w的拟合速度会更优。
#有权重更新,以b为单变量计算
z= 150.217687074830 w= 3.00000000000000 b= 3.80952380952381 deltz= 0.217687074829911 times= 1
z= 150.000077132029 w= 3.00000000000000 b= 3.80593837535014 deltz= 7.71320292756172e-5 times= 2
z= 150.000000000010 w= 3.00000000000000 b= 3.80593710403933 deltz= 9.72022462519817e-12 times= 3
#有权重更新,以w为单变量计算
z= 150.000000000000 w= 2.33333333333333 b= 4.00000000000000 deltz= 0 times= 1