【人工智能实战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
posted @ 2019-03-16 13:44  He-z  阅读(252)  评论(0编辑  收藏  举报