@songying
2018-11-08T11:03:37.000000Z
字数 2939
阅读 1111
deep-learning
如果不了解前向传播的话,可以参见:深度学习之从感知机进化到神经网络。
简单来说,前向传播就是从输入到输出的计算过程,而反向传播是从输出到输入的更新权重过程。但从数学推导上来讲,反向传播远远要比前向传播复杂的多。反向传播算法在神经网络的训练中占据着举足轻重的作用,而对于不同的神经网络模型又衍生出诸多变体,我们没有必要深究每一个变体的内部机制,因为如TensorFlow这种工具已经将细节封装,我们要掌握的是一种思想。就像一句话所说的那样:弱者重术,强者重道。
我们知道,神经网络与普通的机器学习方法一样都需要一个叫目标函数或损失函数的东西来评价模型,按照一般机器学习的套路,我们先确定神经网络的目标函数,然后再用随机梯度下降算法去求当目标函数最小时的参数的值。引申到深度学习中,思路是一样的,而这些参数就是权重W。用下图来说的话,就是求 等这些权重的值。
那么如何求呢?我们还是要首先确定目标函数,最常用就是误差平方和了:
现在,我们的目标改为如何求 \frac{\partial{E_d}}{\partial{net_j}} 了,这个式子的求取我们要分为输出层和隐藏层两种情况。
对于输出层而言,从上面的式子中,我们知道 E_d 首先是输出值y_j 的函数,而net_j 表示输出节点j的输入值,如节点8,那么相关的两个公式有:
那么我们最终可以得出:
那么我们最终可以得出:
首先,我们的目标还是要计算 \frac{\partial{E_d}}{\partial{net_j}} ,net_j 表示节点j的加权输入, 如节点4,我们先来看看节点4是如何影响E_d 的。很容易,我们发现节点4是通过影响节点8,9 的加权输入来影响E_d ,我们就说节点8,9是节点4 的下游节点,我们得出结论,net_j 只能通过影响下游节点 Downstream(j) 来影响 E_d 。
我们假设,net_j 是节点j的输入,net_k 是节点 j 的下游节点的输入,E_d 是 net_k 的函数,并且,注意一点,一个节点有一个或多个下游节点,那么我们有: