前向传播算法(Forward propagation)与反向传播算法(Back propagation,BP算法)的区别

版权声明:站在巨人的肩膀上学习。 https://blog.csdn.net/zgcr654321/article/details/83444120

前向传播算法:

举一个例子:

假设节点i,j,k,…等一些结点与本层节点w有连接,如何计算节点w的值?

通过上一层的i,j,k等结点以及对应的连接权值进行加权和运算,最终结果再加上一个偏置项,最后在通过一个非线性函数(即激活函数),如ReLu,sigmoid等函数,最后得到的结果就是本层结点w的输出。 

其过程可以用如下公式表示:

其中,上标1和2代表层数,星号表示卷积,b表示偏置项bias,σ表示激活函数。

通过这种方法一层层的运算,可以得到最终输出层结果。

反向传播算法:

举一个例子:


 前向传播最终得到的结果最终总是有误差的,我们可以使用梯度下降方法来减小误差。

设最终总误差为E,那么E对于输出结点yl的偏导数是yl - tl,其中tl是真实值,∂yl/∂zl指上面提到的激活函数,zl是上面提到的加权和,那么这一层的E对zl的偏导数为

同理,下一层也是这么计算,只是∂E/∂yk的计算方法改变了。

我们一直反向传播到输入层,最后有

然后我们调整这些过程中的权值,再不断进行前向传播和反向传播的过程,最终得到一个比较好的结果。

前向传播和反向传播的应用举例:

我们先构建一个简单的网络层:

第一层是输入层,包含两个神经元i1,i2,和截距项b1;

第二层是隐含层,包含两个神经元h1,h2和截距项b2;

第三层是输出o1,o2。

每条线上标的wi是层与层之间连接的权重,激活函数我们默认为sigmoid函数。

初始权重:w1=0.15,w2=0.20,w3=0.25,w4=0.30,w5=0.40,w6=0.45,w7=0.50,w8=0.55

输入层给定的输入为0.05与0.10,我们希望神经网络输出层的输出是0.01与0.99 。

前向传播时的情况:

计算神经元h1的输入值:

经过激活函数sigmoid处理后,神经元h1的输出:

同样的方法,我们可以得到神经元h2的输出为:

对输出层神经元重复这个过程,使用隐藏层神经元的输出作为输入。

则O1的输出为:

同理,O2的输出为:

计算误差:

设误差公式为:

已知O1的原始输出为0.01,而神经网络的输出为0.75136507,则其误差为:

同理可得,O2的误差为:

故总的误差为:

反向传播时的情况:

以权重参数w5为例,如果我们想知道w5对整体误差产生了多少影响,可以用整体误差Etotal对w5求偏导数(使用链式法则):

下图可以更直观的看清楚误差是怎样反向传播的:

现在我们来分别计算中每一项的值:

这一步实际上就是对sigmod函数的求导。

将三者值相乘,可得:

这样我们就计算出了整体误差E(total)对w5的偏导数值。

我们用表示输出层误差

故整体误差E(total)对w5的偏导公式可以写成

如果输出层误差计为负的话,也可以写成

下面我们来更新w5的值,取学习速率为0.5,则

同理,可更新w6,w7,w8:

隐藏层->隐藏层的权值更新:

上面计算总误差对w5的偏导时,是从out(o1)->net(o1)->w5,但在隐含层之间的权值更新时,是out(h1)->net(h1)->w1,而out(h1)会接受E(o1)和E(o2)两个地方传来的误差,所以这个地方E(o1)对out(h1)的偏导数和E(o2)对out(h1)的偏导数都要计算。

如图所示:

计算

同理可得

两者相加可得

计算

计算

三者相乘得

 为简化公式,我们用sigma(h1)表示隐含层单元h1的误差:

最后更新w1的权值:

同理,更新w2,w3,w4的权值:

这样误差的一次反向传播法完成了,我们将所有权值更新了一遍,然后就可以用更新的权值再重新计算,不停地迭代。

如这个例子中第一次迭代之后,总误差E(total)由0.298371109下降至0.291027924。迭代10000次后,总误差为0.000035085,输出为[0.015912196,0.984065734](原输入为[0.01,0.99]),证明效果还是不错的。

猜你喜欢

转载自blog.csdn.net/zgcr654321/article/details/83444120
今日推荐