在阅读反向传播方法的时候,看到了这篇通过示例给出反向传播的博文A Step by Step Backpropagation Example,在这篇博文中,作者通过一个简单的示例,给出了反向传播的过程的过程,非常的清晰,遂结合自己的理解翻译之,希望对反向传播方法有所理解的朋友有些许帮助。
背景
反向传播在神经网络的训练过程中虽然用得如此之多,但是在网上还很少有通过具体的实例来解释反向传播怎么工作的博文。所以在这篇文章中,我会尝试用一个具体的例子来解释反向传播过程,这样有需要的朋友就可以通过自己的计算过程来判断自己对于反向理解的过程是否到位。
你可以在我的Gihub上找个我写的反向传播的Python实现代码。
概览
在这篇博文中,我们会使用有2个输入单元的神经网络,2个隐层神经元以及2个输出神经元。此外,隐层和输出神经元会包含一个偏置,下面是基本的网络结构:
为了便于后面说明的说明,我们对该网络设置一些初始的权重、偏置以及输入和输出:
反向传播的目标是对权重进行优化,使得神经网络能够学习到从任意的输入到输出的准确映射。
在这篇博文中,我们仅使用一个简单的训练集,即输入为0.05和0.10,我们希望网络的输出为0.01和0.99(即输入的样本是两个: (0.05, 0.99), (0.10, 0.99))。
前向传播
首先来看看对于给定的初始化权重和偏置,网络对于输入0.05和0.10的输出是啥。我们将输入输进网络中。
我们先计算从全部网络的输入到隐层的每一个神经元,激活函数采用logistic函数,对于从隐层到输出层,我们重复这一过程。
全部的网络输入也被称为网络的输入Derivation of Backpropagation
下面是对于 h1 全部网络输入的输入计算过程:
(译者注:类比到CNN网络里,这个过程就是卷积过程,得到特征响应图)
然后我们将其输入到激活函数中,得到输出 h1 :
(译者注:类比到CNN网络里,这个过程特征响应图经过激活函数运算的过程)
对于 h2 通过上面相同的过程,我们可以得到:
对于输入层神经元,将隐层的输出作为输入(译者注:在CNN中,还需要经过池化后才能作为下一层的输入,至于为啥需要池化,这里译者不就解释了),重复上面相同的过程,我们可以得到:
同样的,重复上面相同的过程,可以得到 O2 :
计算总误差
现在对于输出的每一个神经元,使用平方误差函数求和来计算总的误差:
output就是我们的预测label,而target就是groundtruth。 12 使得我们在求骗到的时候可以消去2,不影响模型参数的结果求解。
对于第一个神经元的输出 O1 真实值是0.01,而网络的输出是0.75136507, 因而第一个神经元的输出误差为:
重复上面过程,可以得到第二个神经元的输出 O2 为:
所以整个神经网络的误差求和为:
反向传播
反向传播的目标是:通过更新网络中的每一个权重,使得最终的输出接近于groundtruth,这样就得到整个网络的误差作为一个整体进行了最小化。
输出层
先来考察 w5 ,我们想知道对于 w5 的改变可以多大程度上影响总的误差,也就是 ∂Etotal∂w5 。
通过使用链式法则,可以得到:
为了更直观的表述上面链式法则的过程,对其进行可视化:
我们对上面使用链式法则得到的每一项分别进行计算。首先,整体误差关于各个神经元的输出改变了?