欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

深度解析神经网络的正向传播与反向传播过程(一步步详解)

最编程 2024-07-24 22:41:57
...

详解神经网络的前向传播和反向传播

本篇博客是对Michael Nielsen所著的《Neural Network and Deep Learning》第2章内容的解读,有兴趣的朋友可以直接阅读原文Neural Network and Deep Learning

对神经网络有些了解的人可能都知道,神经网络其实就是一个输入 X X 到输出Y的映射函数: f(X)=Y f ( X ) = Y ,函数的系数就是我们所要训练的网络参数 W W ,只要函数系数确定下来,对于任何输入xi我们就能得到一个与之对应的输出 yi y i ,至于 yi y i 是否符合我们预期,这就属于如何提高模型性能方面的问题了,本文不做讨论。

那么问题来了,现在我们手中只有训练集的输入 X X 和输出Y,我们应该如何调整网络参数 W W 使网络实际的输出f(X)=Y^与训练集的 Y Y 尽可能接近?

在开始正式讲解之前,让我们先对反向传播过程有一个直观上的印象。反向传播算法的核心是代价函数C对网络中参数(各层的权重 w w 和偏置b)的偏导表达式 Cw ∂ C ∂ w Cb ∂ C ∂ b 。这些表达式描述了代价函数值 C C 随权重w或偏置 b b 变化而变化的程度。到这里,BP算法的思路就很容易理解了:如果当前代价函数值距离预期值较远,那么我们通过调整w b b 的值使新的代价函数值更接近预期值(和预期值相差越大,则w b b 调整的幅度就越大)。一直重复该过程,直到最终的代价函数值在误差范围内,则算法停止。

BP算法可以告诉我们神经网络在每次迭代中,网络的参数是如何变化的,理解这个过程对于我们分析网络性能或优化过程是非常有帮助的,所以还是尽可能搞透这个点。我也是之前大致看过,然后发现看一些进阶知识还是需要BP的推导过程作为支撑,所以才重新整理出这么一篇博客。

前向传播过程

在开始反向传播之前,先提一下前向传播过程,即网络如何根据输入X得到输出 Y Y 的。这个很容易理解,粗略看一下即可,这里主要是为了统一后面的符号表达。

wjkl为第 l1 l − 1 层第 k k 个神经元到第l层第 j j 个神经元的权重,bjl为第 l l 层第j个神经元的偏置, alj a j l 为第 l l 层第j个神经元的激活值(激活函数的输出)。不难看出, alj a j l 的值取决于上一层神经元的激活:

alj=σ(kwljkal1k+blj)(1) (1) a j l = σ ( ∑ k