项目 | 内容 |
---|---|
课程 | 人工智能实战2019 |
作业要求 | 第2次作业 |
课程目标 | 学习人工智能基础知识 |
本次作业对我的帮助 | 学习神经网络基础知识,练习反向传播算法 |
理论课程 | 线性反向传播 |
1. 双变量反向传播算法(更新权重)
1.1 Python代码
def target_function(w,b):
x=2*w+3*b
y=2*b+1
z=x*y
return x,y,z
def calculate_wb_factor(x,y):
factor_b = 3*y+2*x
factor_w = 2*y
return factor_b, factor_w
def double_variable_update(w,b,t):
error = 1e-5
while(True):
x,y,z = target_function(w,b)
delta_z = z - t
print("w=%f,b=%f,z=%f,delta_z=%f"%(w,b,z,delta_z))
if abs(delta_z) < error:
break
factor_b, factor_w = calculate_wb_factor(x,y)
delta_b=(delta_z*factor_b/(factor_b+factor_w))/factor_b
delta_w=(delta_z*factor_w/(factor_b+factor_w))/factor_w
b = b - delta_b
w = w - delta_w
print("\n")
print("\ndone!\n")
print("w=%f,b=%f,z=%f,delta_z=%f"%(w,b,z,delta_z))
if __name__=='__main__':
w=3
b=4
t=150
double_variable_update(w,b,t)
1.2 运行结果
w=3.000000,b=4.000000,z=162.000000,delta_z=12.000000
w=2.851852,b=3.851852,z=150.219479,delta_z=0.219479
w=2.849039,b=3.849039,z=150.000079,delta_z=0.000079
w=2.849038,b=3.849038,z=150.000000,delta_z=0.000000
done!
w=2.849038,b=3.849038,z=150.000000,delta_z=0.000000
1.3 思考与比较
- 此题中,梯度下降的学习率或步长为1
- 由于w和b对于输出z产生影响不等,应按其权重分配误差
- 此题没有使用激活函数,否则需要在链式求导中考虑激活函数的求导(基本数学导数公式)
2. 反向传播算法的四个基本方程 -- 整理自《神经网络与深度学习》
这些方程给我们一种计算误差\(\delta^l\)和代价函数梯度的方法,以下是简单分析:
- 输出层误差的方程(BP1):
- 可以用矩阵形式重写方程,以便于使用像Numpy这样的矩阵库进行运算
- 使用下一层的误差\(\delta^{l+1}\)来表示当前层的误差\(\delta^l\)(BP2):
- 这会让误差通过l层的激活函数反向传递回来并给出第l层的带权输入的误差\(\delta\)
- 通过组合BP1和BP2,我们可以计算任意层的误差\(\delta^l\)
- 代价函数关于网络中任意偏置的改变率(BP3)
- 代价函数关于任何一个权重的改变率(BP4)
- 由公式也可以分析得出,如果神经元激活值很低,或者神经元已经接近饱和,则权重会学习效率缓慢