定义
BP算法,误差反向传播(Error Back Propagation, BP)算法。其最常见的应用是在前馈神经网络中。BP算法的基本思想是,神经网络的学习过程由信号的正向传播与误差的反向传播两个过程组成,信号经过逐层计算得到最终层的值,其值与样本目标值有一定的误差。最后一层的误差由前面多层神经网络加权而成,通过将误差进行反向传播来得到每一层的误差,最后通过每层的误差来调整神经网络的权值。由于多层前馈网络的训练经常采用误差反向传播算法,人们也常把将多层前馈网络直接称为BP网络。
问题描述
假设我们有一个固定样本集
{(x(1),y(1)),...,(x(m),y(m))}
,它包含
m
个样例。我们可以用批量梯度下降法来求解神经网络。具体来讲,对于单个样例
这是一个(二分之一的)方差代价函数。给定一个包含 m 个样例的数据集,我们可以定义整体代价函数为:
以上公式中的第一项 J(W,b) 一个均方差项。第二项是一个规则化项(也叫权重衰减项),其目的是减小权重的幅度,防止过度拟合。
权重衰减参数 λ 用于控制公式中两项的相对重要性。在此重申一下这两个复杂函数的含义: J(W,b;x,y) 是针对单个样例计算得到的方差代价函数; J(W,b) 是整体样本代价函数,它包含权重衰减项。
我们的目标是针对参数 W 和
梯度下降及参数更新
梯度下降法中每一次迭代都按照如下公式对参数
W
和
其中 α 是学习速率。其中关键步骤是计算偏导数。我们现在来讲一下反向传播算法,它是计算偏导数的一种有效方法。
我们首先来讲一下如何使用反向传播算法来计算 ∂∂W(l)ijJ(W,b;x,y) 和 ∂∂b(l)iJ(W,b;x,y) ,这两项是单个样例 (x,y) 的代价函数 J(W,b;x,y) 的偏导数。一旦我们求出该偏导数,就可以推导出整体代价函数 J(W,b) 的偏导数:
以上两行公式稍有不同,第一行比第二行多出一项,是因为权重衰减是作用于 W 而不是
BP反向传播
我们定义:
- W(l)ij 第l层到第l+1层的权值,并且是l层的第j个单元到l+1层的第i个单元的权值。
- z(l) 表示 l 层神经元的状态
a(l) 表示 l 层神经元的活性值f() 表示激活函数- b(l) 表示 l−1 到 l 层的偏置
反向传播算法的思路如下:给定一个样例
- 进行前馈传导计算,利用前向传导公式,得到 L2,L3,… 直到输出层 Lnl 的激活值。
- 对于第
nl层
(输出层)的每个输出单元
i
,我们根据以下公式计算残差:
δ(nl)i=∂∂z(nl)i12∥∥y−hW,b(x)∥∥2=−(yi−a(nl)i)⋅f′(z(nl)i)
注:
δ(nl)i=∂∂znliJ(W,b;x,y)=∂∂znli12∥∥y−hW,b(x)∥∥2=∂∂znli12∑j=1Snl(yj−a(nl)j)2=∂∂znli12∑j=1Snl(yj−f(z(nl)j))2=−(yi−f(z(nl)i))⋅f′(z(nl)i)=−(yi−a(nl)i)⋅f′(z(nl)i) - 对
l=nl−1,nl−2,nl−3,…,2
的各个层,第
l
层的第
i 个节点的残差计算方法如下:δ(l)i=⎛⎝∑j=1sl+1W(l)jiδ(l+1)j⎞⎠f′(z(l)i)
注:
δ(nl−1)i=∂∂znl−1iJ(W,b;x,y)=∂∂znl−1i12∥∥y−hW,b(x)∥∥2=∂∂znl−1i12∑j=1Snl(yj−a(nl)j)2=12∑j=1Snl∂∂znl−1i(yj−a(nl)j)2=12∑j=1Snl∂∂znl−1i(yj−f(z(nl)j))2=∑j=1Snl−(yj−f(z(nl)j))⋅∂∂z(nl−1)if(z(nl)j)=∑j=1Snl−(yj−f(z(nl)j))⋅f′(z(nl)j)⋅∂z(nl)j∂z(nl−1)i=∑j=1Snlδ(nl)j⋅∂z(nl)j∂znl−1i=∑j=1Snl⎛⎝δ(nl)j⋅∂∂znl−1i∑k=1Snl−1f(znl−1k)⋅Wnl−1jk⎞⎠=∑j=1Snlδ(nl)j⋅Wnl−1ji⋅f′(znl−1i)=⎛⎝∑j=1SnlWnl−1jiδ(nl)j⎞⎠f′(znl−1i)
[其中最后一步的化简因为是对 znl−1i 求偏导,所有虽然有 ∑Snl−1k=1 等很多个项,当 k不等于i 的情况下,求偏导皆为0]
将上式中的 nl−1 与 nl 的关系替换为 l与l+1 的关系,就可以得到:δ(l)i=⎛⎝∑j=1sl+1W(l)jiδ(l+1)j⎞⎠f′(z(l)i)
以上逐次从后向前求导的过程即为“反向传导”的本意所在。 - 计算我们需要的偏导数,计算方法如下:
∂∂W(l)ijJ(W,b;x,y)∂∂b(l)iJ(W,b;x,y)=a(l)jδ(l+1)i=δ(l+1)i.
[该步推导可见这里]
那么,反向传播算法可表示为以下几个步骤:
进行前馈传导计算,利用前向传导公式,得到
L2,L3,…
直到输出层
Lnl
的激活值。
对输出层(第
nl
层),计算:
对于 \textstyle l = n_l-1, n_l-2, n_l-3, \ldots, 2 的各层,计算:
计算最终需要的偏导数值:
[实现中应注意:在以上的第2步和第3步中,我们需要为每一个 i 值计算其
反向传播表示为一下步骤:
实现批量梯度下降法中的一次迭代:
现在,我们可以重复梯度下降法的迭代步骤来减小代价函数
J(W,b)
的值,进而求解我们的神经网络。