本文适用于已经对感知机、神经网络有初步了解,但上手比较困难,愿意推导公式,更深入了解神经网络的朋友。
引言
前馈神经网络是所有神经网络中最简单,也是最有效的一种。从单个神经元的角度看,不过就是设计权值与偏置的简单感知机运算。但到底网络是如何实现的?特别是back propagation的原理?我相信刚刚入门的很多朋友与我一样有很多疑惑,但又不想总是调包,那么我们就慢慢推导公式吧。
需要准备
- 良好的线性代数知识,特别是矩阵的运算。
- 微积分知识,特别是偏导和链式公式的应用。
- 基本的python技巧。
符号说明
wljk w j k l :表示从 (l−1) ( l − 1 ) 层的第 k k 个神经元到第 层的第 j j 个神经元的连接上的权重。虽然从直观上不太好理解为什么要这样表示(通常应该表示为 ),但请先接受这种写法。可以对相邻两层的所有权重用矩阵的形式表示为 wl w l 。
σ σ :表示激活函数,本文都使用Sigmoid function。
blj b j l :表示第 l l 层 神经元的偏置,可以对同一层的神经元表示为 bl b l ,记为偏置向量。
alj a j l :表示第 l l 层
神经元的激活值,可以对同一层的神经元表示为 al a l ,记为激活向量。
由BP神经网络的定义可得: al=σ(wlal−1+bl) a l = σ ( w l a l − 1 + b l ) 。
zl z l :表示带权输入, zl=wlal−1+blal=σ(zl) z l = w l a l − 1 + b l a l = σ ( z l ) 。
C C :表示代价函数,定义为 ,其中 y(x) y ( x ) 表示每个样本的真实输出, L L 表示神经网络的总层数。
代价函数
BP神经网络的向前传播很简单,就使用之前提到的矩阵形式就可以计算,当我们初始化所有权重和偏置时,得到的结果输出与目标输出肯定有较大差距,我们使用代价函数来度量这种差距。定义如下:
那么,当输入和输出固定时, C C 就是关于 的函数,我们需要对其进行求偏导,以此来更新代价函数。
我们需要对代价函数进行如下定义(假设):
- 代价函数可以写成一个在每个训练样本 x x 上的代价函数 的均值 C=1n∑xCx C = 1 n ∑ x C x 。
- 将 C C 仅看成输出激活值 的函数。
以下公式,不加说明, C C 都指特定的 。
反向传播的四个方程
反向传播其实就是对权重和偏置变化影响函数过程的理解。最终就是需要计算 ∂C∂wljk和∂C∂blj ∂ C ∂ w j k l 和 ∂ C ∂ b j l 。
我们首先定义一个中间量 δlj=∂C∂zlj δ j l = ∂ C ∂ z j l ,表示为第 l层第j l 层 第 j 个神经元的误差,然后将 δlj δ j l 关联到