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

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神经元、无激活函数)

bsf算法python bp算法python_算法

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