作业二:双变量的反向传播 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}\)的误差。梯度和学习速率的概念似乎更为合适。