神经网络与BP算法推导

来源:互联网 发布:路易斯威廉姆斯数据 编辑:程序博客网 时间:2024/03/28 18:23

导言

神经网络是深度学习基础,BP算法是神经网络训练中最基础的算法。因此,对神经网络结构和BP算法进行梳理是理解深度学习的有效方法。参考资料UFLDL,BP推导,神经网络教材。

神经网络结构

典型网络为浅层网络,一般2~4层。其结构如下图所示:
fig1 NN Structure

假设神经网络有L层,第1层为输入层,最后一层(第L层)为输出层,中间23L1为隐层。每层有Sl,l=1,2,......L个节点,+1节点用来表示偏置(bias);b(l)i表示第l层的+1节点与第l+1层的第i个节点连接上的权(偏置)。每一层的节点与上一层连接(不一定全连接),连接权重W(l)ij表示层l上的节点j同层l+1的节点i之间的权重。训练集包含K组输入和输出样本,{(x1,y1),(x2,y2),,(xK,yK)}。其中(xk,yk),k=1,2,3,,K为向量组:

xk={x1,x2,,xi,,xm}

yk={y1,y2,,yj,,yn}

z表示对上一层输出的权重和汇集结果,由网络结构可以知输入层到第一个隐层:
z(2)1z(2)2z(2)3z(2)S2=W(1)11x1+W(1)12x2++W(1)1mxm+b(1)1=W(1)21x1+W(1)22x2++W(1)2mxm+b(1)2=W(1)31x1+W(1)32x2++W(1)3mxm+b(1)3==W(1)S21x1+W(1)S22x2++W(1)S2mxm+b(1)S2

在之后各层的算法类似,只是将输入换做层l的输出即可。我们用h表示加权和z经过非线性激活函数得到输出 h(l)i=f(z(l)i)f为sigmoid函数或者tanh(双正切)函数。
z(l+1)1z(l+1)2z(l+1)3z(l+1)Sl+1=W(l)11h(l)1+W(l)12h(l)2++W(l)1Slh(l)Sl+b(l)1=W(l)21h(l)1+W(l)22h(l)2++W(l)2Slh(l)Sl+b(l)2=W(l)31h(l)1+W(l)32h(l)2++W(l)3Slh(l)Sl+b(l)3==W(l)Sl+11h(l)1+W(l)Sl+12h(l)2++W(l)Sl+1Slh(l)Sl+b(l)Sl+1(1)

我们令 h(1)i=xi,i=1,2,,S1; h(L)i=f(z(L)i) 就可以将所有的层统一成如下形式:
h(l+1)1h(l+1)2h(l+1)3h(l+1)Sl+1=f(W(l)11h(l)1+W(l)12h(l)2++W(l)1Slh(l)Sl+b(l)1)=f(W(l)21h(l)1+W(l)22h(l)2++W(l)2Slh(l)Sl+b(l)2)=f(W(l)31h(l)1+W(l)32h(l)2++W(l)3Slh(l)Sl+b(l)3)==f(W(l)Sl+11h(l)1+W(l)Sl+12h(l)2++W(l)Sl+1Slh(l)Sl+b(l)Sl+1)(2)

上述公式中l=1,2,,L1,每一层的输出值也可以写为向量形式:
h(l)={h(l)1,h(l)2,,h(l)Sl}

则公式(2)改写为矩阵向量形式,该公式用于前向传播:
z(l+1)h(l+1)=W(l)h(l)+b(l)=f(z(l+1))

其中,每个节点有如下形式:
z(l+1)ih(l+1)i=j=1SlW(l)ijh(l)j+b(l)i=f(z(l+1)i)

神经网络激活函数

激活函数是非线性函数,常用的有两种:sigmoid函数和tanh函数,其导数形式简单。

sigmoid:f(x)tanh:f(x)=11+ex=1ex1+ex

sigmod函数的图像如下图所示,它的变化范围为(0, 1),其导数为f'=f(1f)
这里写图片描述
tanh函数的图像如下图所示,它的变化范围为(-1, 1),其导数为f'=1f2
这里写图片描述

BP算法推导

训练的损失函数采用的是均方差最小化为指标,因此其损失函数为:

J(W,d;x,y)=12||hWb(x)y||2

真正训练时往往采用分批次(in batches)学习(批量随机梯度下降法),假设样本集中每次取T个样本进行训练,则整体的损失函数为:
J(W,b)=[1Tt=1TJ(W,b;xt,yt)]+λ2l=1L1j=1Sli=1Sl+1(W(l)ij)2=[1Tt=1B(12||hWb(xt)yt||2)]+λ2l=1L1j=1Sli=1Sl+1(W(l)ij)2

以上公式中J(W,b)的第一项是均方差项(T个样本的均值);第二项是一个规则化项(也叫权重衰减项 weight decay),其目的是减小权重的幅度,防止过度拟合。

梯度更新规则

随机梯度下降法每次迭代将对权重和偏置进行更新,更新规则如下:

W(l)ijb(l)i=W(l)ijαW(l)ijJ(W,b)=b(l)iαb(l)iJ(W,b)

其中α为学习率(learning rate),关键步骤是计算偏导数。我们对W(l)ijb(l)i计算偏导数如下:
W(l)ijJ(W,b)b(l)iJ(W,b)=1Tt=1TW(l)ijJ(W,b;xt,yt)+λW(l)ij=1Tt=1Tb(l)iJ(W,b;xt,yt)

由上式可知,需要求单个样本的偏导数,带入求批量的偏导,然后使用更新公式进行权重的更新,下面求单个样本的偏导:

  1. 样本向量x(t)输入经过前向传播传到输出层,得到输出向量,其每个节点的计算如式(3)所示h(L)=hWb(xt)={h(L)1,h(L)2,,h(L)SL},SL=n为输出层节点个数

    h(L)i=f(z(L)(i))=f(W(L1)i1h(L1)1+W(L1)i2h(L1)2++W(L1)iSL1h(L1)SL1+b(L1)i)(3)=fj=1SL1WL1ijhL1j+b(L1)i

  2. 对于输出层L,每个节点h(L)i与样本t的标签之第i个分量yti进行比较。带入单个样本的损失函数中得:

    J(W,d;xt,yt)=12||hWb(xt)yt||2=12i=1SL(h(L)iyti)2=12i=1SL(f(z(L)(i))yti)2=12i=1SLfj=1SL1WL1ijhL1j+b(L1)iyti2(4)

  3. 对网络的输出层L,根据链式求导法则,对公式(4)求偏导,得到公式(5)
    W(L1)ijJ(W,b;xt,yt)=122(f(z(L)(i))yti)f(z(L)(i))W(L1)ij=(f(z(L)(i))yti)f(u)|u=z(L)(i)z(L)(i)W(L1)ij=(f(z(L)(i))yti)f(u)|u=z(L)(i)hL1j=(h(L)iyti)f(u)|u=z(L)(i)hL1j(5)

b(L1)iJ(W,b;xt,yt)=122(f(z(L)(i))yti)f(z(L)(i))b(L1)i=(f(z(L)(i))yti)f(u)|u=z(L)(i)z(L)(i)b(L1)i=(f(z(L)(i))yti)f(u)|u=z(L)(i)1=(h(L)iyti)f(u)|u=z(L)(i)(6)

δLi=(h(L)iyti)f(u)|u=z(L)(i)表示第L层中节点i的残差,则公式(5)(6)可以写做:
W(L1)ijJ(W,b;xt,yt)b(L1)iJ(W,b;xt,yt)=δLihL1j=δLi

4. 对于隐藏层L1,根据前向传播法则展开至W(L2)ij同样按链式法则求导,可得式(7),(8)
12||hWb(xt)yt||2=12k=1SL(h(L)kytk)2=12k=1SL(f(z(L)(k))ytk)2=12k=1SLfi=1SL1W(L1)kih(L1)i+b(L1)kytk2=12k=1SLfi=1SL1W(L1)kif(z(L1)i)+b(L1)kytk2=12k=1SLfi=1SL1W(L1)kifj=1SL2W(L2)ijh(L2)j+b(L2)i+b(L1)kytk2

J(W,b;xt,yt)W(L2)ij=W(L2)ij(12||hWb(xt)yt||2)=W(L2)ij12k=1SL(h(L)kytk)2=W(L2)ij12k=1SL(f(z(L)(k))ytk)2=k=1SL(h(L)kytk)f(u)|u=z(L)(k)(z(L)(k))W(L2)ij=k=1SLδLkW(L2)iji=1SL1W(L1)kih(L1)i+b(L1)k(7)=k=1SLδLkW(L1)ki(h(L1)i)W(L2)ij=k=1SLδLkW(L1)kiW(L2)ijf(z(L1)i)=k=1SLδLkW(L1)kiW(L2)ijfj=1SL2W(L2)ijh(L2)j+b(L2)i=k=1SLδLkW(L1)kif(v)|v=z(L1)ih(L2)j

J(W,b;xt,yt)b(L2)i=b(L2)i(12||hWb(xt)yt||2)=b(L2)i12k=1SL(h(L)kytk)2=b(L2)i12k=1SL(f(z(L)(k))ytk)2=k=1SL(h(L)kytk)f(u)|u=z(L)(k)(z(L)(k))b(L2)i=k=1SLδLkb(L2)ii=1SL1W(L1)kih(L1)i+b(L1)k=k=1SLδLkW(L1)ki(h(L1)i)b(L2)i=k=1SLδLkW(L1)kib(L2)if(z(L1)i)=k=1SLδLkW(L1)kib(L2)ifj=1SL2W(L2)ijh(L2)j+b(L2)i=k=1SLδLkW(L1)kif(v)|v=z(L1)i1(8)

令:
δ(L1)i=k=1SLδLkW(L1)kif(v)|v=z(l)i

可以看出残差δ(L1)i相当于残差δLk反向传播一层后乘以非线性激活函数在L1层该节点的导数值,故(7)(8)式可改写为:

J(W,b;xt,yt)W(L2)ijJ(W,b;xt,yt)b(L2)i=δ(L1)ih(L2)j=δ(L1)i

  1. 同理可得其他隐层的递推公式,对任意隐层l=1,2,3,,L1,单样本损失函数对权重和偏置的偏导的计算公式如(9),其中残差从输出层反向传播到层l
    J(W,b;xt,yt)W(l)ijJ(W,b;xt,yt)b(l)i=δ(l+1)ih(l)j=δ(l+1)i(9)

    其中:
    δ(l)i=k=1Sl+1δl+1kW(l)kif(v)|v=z(l)i

BP算法的批量更新步骤如下:

  1. 对所有的层1lL1W(l)b(l)初始化为0,用以记录批量累计误差;
  2. for t = 1: T
    每个样本正向计算各层输出
    使用反向传播算法,计算各层神经元权值和偏置的梯度矩阵W(l)(t)b(l)(t)
    累积误差:
    W(l)b(l)+=W(l)(t)+=b(l)(t)

    end for
  3. 更新权重与偏置
    W(l)b(l)=W(l)+1TW(l)+λW(l)=b(l)+1Tb(l)
1 0