代码改变世界

第二次作业:双变量的反向传播

2019-03-13 16:19  Jackxu121ux  阅读(415)  评论(0)    收藏  举报

1.作业要求

  • 根据课堂内容(线性反向传播)完成双变量的反向传播代码
  • 给出相应的结果和误差
  • 给出自己的比较和思考
项目 内容
这个作业属于哪个课程 人工智能实战
我在这个课程的目标是 将人工智能技术与本专业知识联系
这个作业在哪个具体方面帮助我实现目标 通过代码实现加深对梯度下降的反向传播理解
作业正文 链接

2.题目

\(x=2 * w+3 * b\)
\(y=2 * b+1\)
\(z=x * y\)

给定所有初始值\(z_{\text{target}}\)和目标\(z\)的值,根据反向传播原理来更新
\(w,b\)的值,直到\(z\)与目标\(z_{\text{target}}\)的误差在允许范围之内

3.代码

def calculate(w,b):
    x=2*w+3*b
    y=2*b+1
    z=x*y
    Dw=2*y            # Z对w的偏导
    Db=3*y+2*x        # Z对b的偏导
    return(x,y,z,Dw,Db)  

def iteration(zt,w,b):     #zt为z的目标值
    x,y,z,Dw,Db=calculate(w,b)
    deltaz=z-zt            #deltaz为z的差值
    print('当前b的值=',b)
    print('当前w的值=',w)
    print('当前的误差=',deltaz)
    print('')      
    deltazw=deltaz/2       #deltazw为z的差值对w的作用量
    deltazb=deltaz/2       #deltazb为z的差值对b的作用量
    deltaw=-deltazw/Dw     #deltaw为w的变化值
    deltab=-deltazb/Db     #deltab为b的变化值
    w=w+deltaw
    b=b+deltab 
    if deltaz>1e-5:
       iteration(zt,w,b)
    else:
       return
#初始化
w=3.0
b=4.0
zt=150
iteration(zt,w,b)

4.运行结果

当前b的值= 4.0
当前w的值= 3.0
当前的误差= 12.0

当前b的值= 3.9047619047619047
当前w的值= 2.6666666666666665
当前的误差= 0.18140589569162557

当前b的值= 3.903263272264059
当前w的值= 2.661518661518661
当前的误差= 4.4335267403994294e-05

当前b的值= 3.9032629057674404
当前w的值= 2.661517402927456
当前的误差= 2.6716406864579767e-12

5.比较和思考

  • 较单变量的反向传播,双变量的方式有效的提高了收敛速度;这个梯度下降的迭代方式与我之前的牛顿迭代法有类似的地方;不过这种算法拓展到了双变量的情况;更具有普遍性。