基础

神经网络的表示

在基于梯度的优化方法中, 我们提到一个具有 nl+1 层的神经网络可以一般表示为 y′=f(W,b,X)=fnl(Wnl,bnl,fnl−1(Wnl−1,bnl−1,...f1(W1,b1,X)...)),神经网络的训练就是调整 W,b 使得 L(y,f(W,X,b)) 最小。
需要注意的是,当神经网络从第0层,即输入层为第0层与输入层为第1层开始的表述可能由稍许不同。本博文以输入层为第1层,输入层与下一层之间的权值与偏置值记为 W1,b1

链式法则

链式法则(chain rule)是求复合函数导数的一个法则。假设f,g为两个关于x的可导函数,则复合函数 y=f(g(x)) 的导数为 dydx=dfdgdgdx=f′(g(x))g′(x)。

求解 L(y,f(W,X,b))

首先损失函数 L 是关于 W,b 的函数,由基于梯度的优化方法,我们可以知道可以根据梯度来0更新搜索最优值。而 L 是一个复合函数,因此我们可以采用链式法则来迭代调整每一层网络的权值与偏置值。假如我们采用梯度下降的方法来调整 nl 层,则有:


∂L∂Wnl=∂L∂fnl∂fnl∂Wnl



Wnli+1=Wnli−ϵ∂L∂Wnl


如此我们可以迭代更新每次的

Wi,bi。

神经网络的前馈算法

我们知道在神经网络中上一层的输出时下一层的输入,假设第 j 层输出为 aj , 则第 j+1 层的输出为 aj+1=fj(Wjaj+bj),其中 fj 为激活函数,当我们令 zj+1=Wjaj+bj 时,我们就可以得到如下算法:
1. 令 j=1 ,aj=a1=X
2. 计算 zj+1=Wjaj+bj
3. 计算 aj+1=fj(zj+1)
4. 重复步骤2-3,直到输出层 y′=anl+1=fnl(znl+1)=fnl(Wnlanl+bnl)

BP算法

第nl

我们知道 nl+1 层的输出为 y′=anl+1=fnl(znl+1),znl+1=Wnlanl+bnl,则损失函数为 L(y,fnl(Wnlanl+bnl))。则
对 Wnl 更新


∂L∂Wnl=∂L∂fnl∂fnl∂Wnl=∂L∂fnlanl



Wnli+1=Wnli−ϵ∂L∂Wnl



bnl 更新



∂L∂bnl=∂L∂fnl∂fnl∂bnl=∂L∂fnl



bnli+1=bnli−ϵ∂L∂Wnl

第 nl−1

此时 L=L(y,fnl(Wnlfnl−1(Wnl−1anl−1+bnl−1)+bnl)),则对 nl−1 层更新为:
对 Wnl−1 更新


∂L∂Wnl−1=∂L∂fnl∂fnl∂fnl−1∂fnl−1∂Wnl−1=∂L∂fnlWnlanl−1



Wnli+1=Wnli−ϵ∂L∂Wnl−1



bnl−1 更新



∂L∂bnl−1=∂L∂fnl∂fnl∂fnl−1∂fnl−1∂bnl−1=∂L∂fnlWnl



bnli+1=bnli−ϵ∂L∂bnl−1

综合

明显第 j(j≠nl) 层来说,更新与第 n−1 层类似。观察上述等式,我们知道每层对权值的导数十分相似,都是一个项乘以上一层的输出,即当前层的输入,我们将该项称为“error term” δj。
则第 nl 层:


δnl=∂L∂fnl



Wnli+1=Wnli−ϵδnlanl



bnli+1=bnli−ϵδnl



j(j≠nl) 层:



δj=δj+1Wj+1



Wji+1=Wji−ϵδjaj



bji+1=bji−ϵδj

伪代码

  1. 计算第 nl 层的 error term: δnl=∂L∂fnl
  2. 计算第 j(j=nl−1,nl−2,…,1) 层 error term: δj=δj+1Wj+1
  3. 更新第 j+1 层的权值与偏置值:
    Wj+1i+1=Wj+1i−ϵδj+1aj+1
    bj+1i+1=bj+1i−ϵδj+1
  4. 重复步骤2-3,知道 $j=1,同理更新第1层权值与偏置值