关于反向传播,我非常推荐下面的一个在线书籍,其给出了非常详实、生动且易于理解的反向传播算法以及相关公式的推导,公式不繁杂是一大特点,Neural Networks and Deep Learning。本文将对其讲解给以归纳和总结,其中有些个人的见解,通篇将使用下图所示神经网络。
一、符号假设
损失函数为
第
层的第
个神经元表示为
第
层的第
个神经元的偏置为
,输入层无偏置
第
层的第
个神经元与第
层的第
个神经元之间的的权重为
,
第
层的第
个神经元的激活值为
第
层的第
个神经元的输入值为
,其中
表示第
层的神经元数量
二、什么是误差
BP算法的全称是误差反向传播算法 ,本节来说下什么是误差,并结合下图来理解误差。
现在,如果 的输入发生变化,
的变化为
假设 的变化较小。如果偏导项较大,且与
的符号相反,损失就会降低;反之,如果偏导项接近于零,那么无论
变化多大,损失的变动都不会很明显。那么,我们可以认为
的变化量由
来决定。
越大,
下降的空间就越大;反之,
下降的空间就越小。因此,
便可以用来度量学习误差。
三、单样本误差计算
本节假定神经网络的输入仅有一个样本,后面会对多个样本下的误差计算进行推导。用 表示
的误差。稍后会发现,对误差的计算将关系到对权重和偏置的偏导计算。假定损失函数为均方误差,那么输出层的误差为:
其中, 是输出层的激活向量,
是样本标签向量。单个神经元的误差为:
误差反向传播体现在相邻层的误差存在依赖:
为了更加直观的理解上式,不妨来看一下其非向量表达形式
第一项是第 层各个神经元的学习误差的加权,第二项是激活函数对
的偏导,表示激活值的变化率。其表达的直观意义是什么那? 结合下图和自己的理解来浅谈一下。
聚焦 ,第二层每个神经元的误差和第一层每个神经元是存在关系的,如
的误差的 20% 由
导致,50% 由
所致, 30% 由
所致,而这些值恰是连接
的权重值。那么在反向计算误差时,很自然的第二层每个神经元会将对应的误差值成比例的推向前一层。现在
接收了第 二层各个神经元推过来的误差,同时误差被
进行了制约。如果
大于 1,误差会放大,学习能力被放大,反之,学习能力开始缩水,慢慢的会死掉。如何制约学习能力,也就是激活函数的选择,这是一个超参数的选择问题。
三、偏置和权重的导数
通过链式求导能计算出 相对每个权重的导数
以及 相对每个偏置的导数
但是,这样做的时间复杂度是相当高的,详见上文在线文档中的分析。实际上,通过借助误差的计算便可完成对权重和偏置的导数表达。关于偏置的导数,其表达如下
很棒,我们得到 立马得到上式,链式推导如下
权重的导数也有类似的表示如下
链式推导如下
四、多样本误差计算
前向和反向传播的计算一般是基于mini-batch进行的,在这种情况下,导数的计算可以充分利用矩阵计算上的效率优势。令 表示
在
上的误差,令
表示
带来的损失,
表示
在
上的激活输出。每个mini-batch里面含有
个样本,激活函数为Relu。
首先给出输出层误差 的表示:
任意中间层的误差 表示为:
任意层权重的导数表示为: