零基础入门深度学习(二):神经网络和反向传播算法

  接下来,我们将要介绍神经网络的训练算法:反向传播算法。

  反向传播算法(Back Propagation)

  我们首先直观的介绍反向传播算法,最后再来介绍这个算法的推导。当然读者也可以完全跳过推导部分,因为即使不知道如何推导,也不影响你写出来一个神经网络的训练代码。事实上,现在神经网络成熟的开源实现多如牛毛,除了练手之外,你可能都没有机会需要去写一个神经网络。

  我们以监督学习为例来解释反向传播算法。在《零基础入门深度学习(2) - 线性单元和梯度下降》一文中我们介绍了什么是监督学习,如果忘记了可以再看一下。另外,我们设神经元的激活函数f为sigmoid函数(不同激活函数的计算公式不同,详情见反向传播算法的推导一节)。

  我们假设每个训练样本为(x,t),其中向量x是训练样本的特征,而t是样本的目标值。

  首先,我们根据上一节介绍的算法,用样本的特征x,计算出神经网络中每个隐藏层节点的输出ai,以及输出层每个节点的输出yi。

  然后,我们按照下面的方法计算出每个节点的误差项:

  对于输出层节点,

  其中,等号左边是节点的误差项,Yi是节点i的输出值,ti是样本对应于节点i 的目标值。举个例子,根据上图,对于输出层节点8来说,它的输出值是y1,而样本的目标值是t1,带入上面的公式得到节点8的误差项应该是:

  对于隐藏层节点,

  其中,ai是节点i的输出值,Wki是节点到它的下一层节点k的连接的权重,是节点i的下一层节点k的误差项。例如,对于隐藏层节点4来说,计算方法如下:

  最后,更新每个连接上的权值:

  类似的,权重的更新方法如下:

  偏置项的输入值永远为1。例如,节点4的偏置项应该按照下面的方法计算:

  我们已经介绍了神经网络每个节点误差项的计算和权重更新方法。显然,计算一个节点的误差项,需要先计算每个与其相连的下一层节点的误差项。这就要求误差项的计算顺序必须是从输出层开始,然后反向依次计算每个隐藏层的误差项,直到与输入层相连的那个隐藏层。这就是反向传播算法的名字的含义。当所有节点的误差项计算完毕后,我们就可以根据式5来更新所有的权重。

  以上就是基本的反向传播算法,并不是很复杂,您弄清楚了么?

  反向传播算法的推导

  反向传播算法其实就是链式求导法则的应用。然而,这个如此简单且显而易见的方法,却是在Roseblatt提出感知器算法将近30年之后才被发明和普及的。对此,Bengio这样回应道:

  很多看似显而易见的想法只有在事后才变得显而易见。

  接下来,我们用链式求导法则来推导反向传播算法,也就是上一小节的式3、式4、式5。

  前方高能预警——接下来是数学公式重灾区,读者可以酌情阅读,不必强求。

  按照机器学习的通用套路,我们先确定神经网络的目标函数,然后用随机梯度下降优化算法去求目标函数最小值时的参数值。