BP算法与python代码实现

反向传播算法是神经网络训练参数与权重的方法之一。该方法与梯度下降算法相结合,对网络中所有权重以及偏置计算损失函数的梯度,并利用梯度值来更新权值与偏置,实现损失函数的最小化。

1、前向传播

前向传播指的是输入的数据在神经网络中,逐层向前传输,一直到输出层为止。

2、反向传播(Back Propagation)

在网络的训练过程中经过前向传播后得到的最终结果跟训练样本的真实值总是存在一定误差,由这个误差定义损失函数,通常为输出误差平方和的1/2,如果只有一个输出,即为输出误差平方的1/2。为最小化损失函数,从后往前,依次求损失函数对各个权重与偏置的偏导,由此更新权重与偏置。

3、 链式法则

反向传播算法是利用链式法则进行梯度求解及权重更新。对于复杂的复合函数,我们将其拆分为一系列的加减乘除或指数,对数,三角函数等初等函数,通过链式法则完成复合函数的求导。

4、 反向传播算法流程

0)初始化权重与偏置(非凸函数,不同的初始化值可能出现局部最优解);

1)输入前向传播,计算模型输出;

2)计算损失Loss(模型输出与期望输出差的平方的1/2),若Loss小于阈值,结束,输出模型,否则继续3);

3)计算损失函数对权重与偏置的偏导数;

4)更新权重与偏置,重返1)。

5、示例

NN如图,输入层+隐藏层(2神经元、sigmodi激活函数)+输出层(1神经元、无激活函数)

5.0 期望模型

输入:

x1=0.02

x2=0.03

输出:

y=7

 5.1 初始化

初始化权重:

w1=w2=w3=w4=w5=w6=0.2

初始化偏置:

b1=b2=0.5

学习率:

lr=0.001        

5.2 前向传播

    neth1=w1*x1+w2*x2+b1   #hidden层节点1的输入和
    neth2=w3*x1+w4*x2+b1  #hidden层节点2的输入和
    outh1=1/(1+math.exp(-neth1))   #hidden层节点1的输出,过激活函数
    outh2=1/(1+math.exp(-neth2))   #hidden层节点2的输出,过激活函数
    neto=w5*outh1+w6*outh2+b2  #输出层,节点的输入和
    out=neto#输出层无激活函数   #输出层 输出

5.3 计算损失

     Loss=1/2*(y-out)**2#(重复5.2,5.3,5.4,5.5直至Loss足够小或迭代足够次数)

5.4 计算偏导数

    #偏导数 dLoss_dout代表dLoss/dout
    dLoss_dout=-(y-out)
    dout_dneto=1
    dneto_dw5=outh1
    dneto_dw6=outh2
    dneto_douth1=w5
    dneto_douth2=w6
    dneto_db2=1
    douth1_dneth1=outh1*(1-outh1)
    douth2_dneth2=outh2*(1-outh2)
    dneth1_dw1=x1
    dneth1_dw2=x2
    dneth2_dw3=x1
    dneth2_dw4=x2
    dneth1_db1=dneth2_db1=1
    
    #偏导数-链式法则
    dLoss_dw1=dLoss_dout*dout_dneto*dneto_douth1*douth1_dneth1*dneth1_dw1
    dLoss_dw2=dLoss_dout*dout_dneto*dneto_douth1*douth1_dneth1*dneth1_dw2
    dLoss_dw3=dLoss_dout*dout_dneto*dneto_douth2*douth2_dneth2*dneth2_dw3
    dLoss_dw4=dLoss_dout*dout_dneto*dneto_douth2*douth2_dneth2*dneth2_dw4
    dLoss_dw5=dLoss_dout*dout_dneto*dneto_dw5
    dLoss_dw6=dLoss_dout*dout_dneto*dneto_dw6
    dLoss_db1=dLoss_dout*dout_dneto*dneto_douth1*douth1_dneth1*\
                dneth1_db1+dLoss_dout*dout_dneto*dneto_douth1*douth2_dneth2*dneth2_db1
    dLoss_db2=dLoss_dout*dout_dneto
 

5.4 更新权值与偏置

    w1=w1-lr*dLoss_dw1
    w2=w2-lr*dLoss_dw2
    w3=w3-lr*dLoss_dw3
    w4=w4-lr*dLoss_dw4
    w5=w5-lr*dLoss_dw5
    w6=w6-lr*dLoss_dw6
    b1=b1-lr*dLoss_db1
    b2=b2-lr*dLoss_db2

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITLiu_JH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值