基础
神经网络的表示
在基于梯度的优化方法中, 我们提到一个具有 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
伪代码
- 计算第 nl 层的 error term: δnl=∂L∂fnl
- 计算第 j(j=nl−1,nl−2,…,1) 层 error term: δj=δj+1Wj+1
- 更新第 j+1 层的权值与偏置值:
Wj+1i+1=Wj+1i−ϵδj+1aj+1
bj+1i+1=bj+1i−ϵδj+1 - 重复步骤2-3,知道 $j=1,同理更新第1层权值与偏置值