1. 基于矩阵计算网络输出
首先给出网络中权重的清晰定义。使用表示从
层的
个神经元到
层的
个神经元的链接上的权重。如下图所示,给出了第2个隐藏层的第4个神经元到第3个隐藏层的第2个神经元的链接上的权重。
对网络偏差和**值也使用类似的表示。显式地,使用
这样一来,
我们引入向量化函数来按照矩阵形式重写上述公式,由于我们对权值矩阵
利用上述方程计算
2. 关于代价函数的两个假设
反向传播的目标是计算代价函数 分别关于 和 的偏导数和
。为了让反向传播可行,我们需要做出关于代价函数的两个主要假设。这里以二次代价函数为例。
其中n是训练样本的总数;求和是在所有的训练样本x上进行的;y=y(x)是对应的目标输出;L表示网络的层数;
第一个假设就是代价函数可以被写成一个在每个训练样本x上的代价函数
第二个假设就是代价可以写成神经网络输出的函数:
例如,二次代价函数满足这个要求,因为对于一个单独的训练样本 其二次代价函数可以写作:
这是输出的**值的函数。当然,这个代价函数同样还依赖于目标输出。输入的训练样本x是固定的,所以输出同样是一个固定的参数。所以说,并不是可以随意改变权重和偏差的,也就是说,这不是神经网络学习的对象。所以,将
3. 反向传播的四个基本方程
1)Hadamard 乘积
反向传播基于一种叫做Hadamard 乘积的矩阵运算实现。特别地,假设s和t是两个同样维度的向量。那么我们使用来表示按元素的乘积。所以
的元素就是
。给个例子,
2)四个基本方程
反向传播其实是对权重和偏差变化影响代价函数过程的理解。 最终极的含义其实就是计算偏导数
为了理解误差是如何定义的,假设在神经网络上有一个小精灵:
这个小精灵在
按照上面描述,我们定义
这里不加证明地给出反向传播的四个基本方程:
通过观察四个基本方程,可以得出以下结论:
(1)观察方程BP1,这里
回忆sigmoid函数,当函数值接近1或0时,
(2)观察方程BP2,其中
通过组合BP1和BP2,我们可以计算任何层的误差了。首先使用BP1计算
(3)观察方程BP4,来自很低的**值神经元的权重学习同样会非常缓慢。
4. 反向传播算法
4.1 算法流程
反向传播方程给出了一种计算代价函数梯度的方法。 让我们显式地用算法描述出来:
1. 输入x:为输入层设置对应的**值。
2. 前向传播:对每个l = 2, 3, …, L计算相应的和
3. 输出层误差:计算向量
4. 反向误差传播:对每个l = L-1, L-2, …, 2,计算
5. 输出:代价函数的梯度由和
4.2 反向传播快速的原因
如果仅仅把代价看作权重的函数即C=C(w),则计算某个权值关于C的导数:
其中
然后,遗憾的是,当你实现了之后,运行起来这样的方法非常缓慢。为了理解原因,假设我们有1,000,000个权重。对每个不同的权重
4.3 反向传播大视野
回顾反向传播算法,可以发现关于代价函数梯度的计算均是基于链式法则进行的。假设某个做一点小小的变动
:
那么这个改变逐渐向后面网络层产生影响,最终到达输出层,影响代价函数:
所以代价函数
同时
继而影响到下一层的**值的变化,即
则综合前一层变化
最终,对于代价函数变化
对路径中所有可能的中间神经元选择进行求和。则有
而这个公式告诉我们的是:两个神经元之间的连接其实是关联于一个变化率因子,这仅仅是一个神经元的**值相对于其他神经元的**值的偏导数。从第一个权重到第一个神经元的变化率因子是
观察发现,可以将反向传播想象成一种计算所有可能的路径变化率的求和的方式。或者,换句话说,反向传播就是一种巧妙地追踪权重(和偏差)微小变化的传播,抵达输出层影响代价函数的技术。