介绍BP法之前,我们先了解一下神经网络的概念。

神经网络是我们借助生物的神经网而抽象出来的一种数学模型。

我们知道生物的神经网是由神经元作为单元而构成的。那我们的神经网络也是有神经元的抽象而构成的。

生物神经元有如下特点

1.神经元对于其他多个神经元传递过来的信号,如果他们不超过某个固定的值(阈值),则神经元不做出任何反应。

2.对于其他多个神经元传递过来的信号,如果他们的和超过某个固定大小的值(阈值),则神经元做出反应(称为点火),向另外的神经元传递固定强度的信号。

3.对于其他多个神经元传递过来的信号中,每个信号所占的权重不一样,这可以理解成y=w1x1+w2x2+…+b的w即权重不一样。其实这样我们抽象的一个参数也能找到现实世界所对应的物理意义

现在我们定义神经元,在生物的角度上来说就是分化,数学上就是神经元的子集。

1.输入层神经元,这类神经元只能接受一个参数,并原封不动的向下一次输出

2.接受多个输入,并且有激活函数,输入变量经过激活函数判断阈值,来确定是否输出。

然后我们把神经元连接成网络状。这就是我们的神经网络

BP神经网络模型的R实现 bp神经网络法_激活函数


我们的输入层采用第一种神经元,他的任务就是与采集样本的数据,并输入的神经网络中

隐藏层,并不像看起来那么简单,在这里面处理的就是复杂的逻辑,隐藏层里面可以有卷积神经网络等等。

输出层,根据隐藏层的反馈,来确定判断结果

激活函数,最初我们采用的阶跃函数,但是我们知道,神经网络的计算,通常是用梯度下降法来确定参数的,但是梯度下降的话,避免不了和求导打交道,所以阶跃函数的越变点不可导这个就很烦人了。所以激活函数现场通常采用sigmoid函数和Relu函数


普及完基本概念,我们就拿一个例子来引出BP法反向误差传递法


反向误差传递的思路也很简单,根据名字我们可以猜到,他的大概意思的传递误差来修正我们的参数,怎么传递,向那传递?当然是反向传递,何解?

来看我们的网络

输出层—》隐藏层—》输出层

我们在哪得到的误差,肯定是你计算完成之后,然后算平方和误差对吧?

然后反向传递

输出层—》隐藏层—》输出层

|——|

这样我们的误差传递到隐层了

所以我们得定义一个变量,用来干这件事情,我们娶个名子叫神经单元误差用δ表示

定义如下

δ jl= ∂z jl/∂J(θ)(l=2,3,…)

δ表示 神经单元的加权输入z给平方误差带来的变化率,如果神经网络符合数据,根据最小值条件,变化率应该为0.换言之如果神经网络符合数据,根据最小值条件,δ=0。那么我们可以认为δ表示与符合数据这种理想状态的偏差,这个偏差表示为误差。

∂w jil∂J(θ)=δ jla il−1(l=2,3,…)

所以我么要做的就是

计算δ–》根据上式计算计算平方和误差c的偏导–》对于全体数据将上式相加,计算c的梯度

BP神经网络模型的R实现 bp神经网络法_BP神经网络模型的R实现_02


我们根据上面的神经单元误差知道

BP神经网络模型的R实现 bp神经网络法_BP神经网络模型的R实现_03


现在我们求出δ

根据上面2式有

BP神经网络模型的R实现 bp神经网络法_数据_04


我们将其一般化,就是写成通用的公式

BP神经网络模型的R实现 bp神经网络法_数据_05


然后带入loss函数计算

BP神经网络模型的R实现 bp神经网络法_tensorflow_06


我们假设激活函数为sigmoid函数,则带入计算

BP神经网络模型的R实现 bp神经网络法_数据_07