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

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

0. 索引

项目 内容
这个作业属于的课程 人工智能实战2019(北京航空航天大学)
这个作业的要求 第二次作业 - 双变量的反向传播
我在这个课程的目标是 学习算法,积累项目经验,锻炼coding能力
这个作业在哪个具体方面帮助我实现目标 了解神经网络反向传播原理,代码实现
作业正文 见下文
其他参考文献

1. 作业要求

  • 根据课堂内容(线性反向传播)完成双变量的反向传播代码
  • 给出相应的结果和误差
  • 给出自己的比较和思考

2. 题目:

\(x = 2 * w + 3 * b\)
\(y = 2 * b + 1\)
\(z = x * y\)
给定所有初始值和目标\(z\)的值,根据反向传播原理来更新 \(w,b\) 的值,直到\(z\)与目标的误差在允许范围之内。

3. 代码

class bp_with_double_parameters():
    def __init__(self):
        self.w, self.b, self.x, self.y, self.z, self.z_target = 3, 4, 18, 9, 162, 150

    def backprop(self):
        eps = 10**(-5)
        cnt = 0
        error = self.z - self.z_target
        while abs(error) > eps:
            print("iteration:" , cnt, "w:%.10f" % self.w, "b:%.10f" % self.b, "z:%.10f" % self.z, "error:%.10f" % error)
            self.back_and_forward(error)
            error = self.z - self.z_target
            cnt += 1
        print("iteration:" , cnt, "w:%.10f" % self.w, "b:%.10f" % self.b, "z:%.10f" % self.z, "error:%.10f" % error)
        print("final w: %-10f" % self.w, "final b: %-10f" % self.b)
         
    def back_and_forward(self, error):
        partial_w = self.y * 2
        partial_b = 3 * self.y + 2 * self.x
        d_w, d_b = error / (2 * partial_w), error / (2 * partial_b)
        self.w -= d_w
        self.b -= d_b
        self.x = 2 * self.w + 3 * self.b
        self.y = 2 * self.b + 1
        self.z = self.x * self.y

4. 运行结果及误差

 iteration: 0 w:3.0000000000 b:4.0000000000 z:162.0000000000 error:12.0000000000

 iteration: 1 w:2.6666666667 b:3.9047619048 z:150.1814058957 error:0.1814058957

 iteration: 2 w:2.6615186615 b:3.9032632723 z:150.0000443353 error:0.0000443353

 iteration: 3 w:2.6615174029 b:3.9032629058 z:150.0000000000 error:0.0000000000

 final w: 2.661517 final b: 3.903263

5. 比较和思考

  • 与单变量相比较,本次实现建立在“不妨把这个误差的一半算在\(w\)账上,另外一半算在\(b\)的账上”假设上。而\(w,b\)的地位并不相等,对误差的贡献也不一样。如果变量增多,更没有理由要求每个变量都均摊 \(\frac{1}{n}\)的误差。梯度和学习速率的概念似乎更为合适。
posted @ 2019-03-12 23:46  知也遇兮  阅读(277)  评论(0编辑  收藏  举报