人工智能实战2019

项目 内容
课程 人工智能实战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("
")

    print("
done!
")
    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)
  • 由公式也可以分析得出,如果神经元激活值很低,或者神经元已经接近饱和,则权重会学习效率缓慢
原文地址:https://www.cnblogs.com/wangshihong/p/10541530.html